diff --git a/BUILD.gn b/BUILD.gn index 32902c0b..0a7527e 100644 --- a/BUILD.gn +++ b/BUILD.gn
@@ -259,10 +259,6 @@ "//fuchsia_web:gn_all", "//tools/fuchsia/size_tests:fuchsia_sizes", - # Ensure this target, used by cipd, is built in all configurations. - # TODO(crbug.com/1265618): Remove this once it has a natural dependency. - "//media/cdm/library_cdm/clear_key_cdm", - # Ensure this target continues to build. "//chromecast/bindings:bindings_manager_fuchsia", ]
diff --git a/DEPS b/DEPS index ecb4e18..a49e01f 100644 --- a/DEPS +++ b/DEPS
@@ -297,15 +297,15 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': '88d90928a76f91472d26cb3b2da3dd404ecf7115', + 'skia_revision': 'd04b56eca130c63da312a9b7ec8d40094564f428', # 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': '8e78df1eec463194449a74c4a34f4eceecaa138d', + 'v8_revision': '2da5616653aad70f55fb8d785fae65114b91cc5f', # 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': '0b7e347a60ddfed8a4e77f2779d071f64cd9605a', + 'angle_revision': '00a9787e3242a31ec224f97995cc6216f87c7b6b', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -313,7 +313,7 @@ # 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': '62dc3b7237a462197befabe4ac56c1c1611780e5', + 'pdfium_revision': '7b3ff81d69fcc8e91b4eb6c8869939d41d289eee', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling BoringSSL # and whatever else without interference from each other. @@ -324,7 +324,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Fuchsia sdk # and whatever else without interference from each other. - 'fuchsia_version': 'version:9.20220802.3.1', + 'fuchsia_version': 'version:9.20220803.1.1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling google-toolbox-for-mac # and whatever else without interference from each other. @@ -344,7 +344,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling NaCl # and whatever else without interference from each other. - 'nacl_revision': '1d34ecb7cdd1e5b295ac107107abc09b22e866d8', + 'nacl_revision': 'c026741a37cc99c0f1748714b2c6ef38a5597f1c', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. @@ -368,7 +368,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': '7f8536d0bbce1a7b63c5091f2baecaee56687a2f', + 'catapult_revision': '47a2365de2ea5e4d233f5fdb4db2e2501edfe94f', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -376,7 +376,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling devtools-frontend # and whatever else without interference from each other. - 'devtools_frontend_revision': '5dc24542f6ff222f655d88200a903a5cb8378bc6', + 'devtools_frontend_revision': 'fea1410f6ab4c4fa2451941e16ffd0d4f8746f00', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libprotobuf-mutator # and whatever else without interference from each other. @@ -412,7 +412,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': '6f8d945dd6ce5d786530c1b2b8bdb2140616cbed', + 'dawn_revision': '3c797eba3b555405f9b16ad5bc0a17a2c28c223c', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -440,7 +440,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling nearby # and whatever else without interference from each other. - 'nearby_revision': '0d4964da7babe0a0ae01cd4950c5215dbd7dd8d1', + 'nearby_revision': 'a732616a979b6761100dd53949eed4fc4070a93f', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling securemessage # and whatever else without interference from each other. @@ -460,7 +460,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. - 'libunwind_revision': '012c3438e0795fa6ad1626f1f5e1c0ab577b91f6', + 'libunwind_revision': 'c5d3129a8b4fd25e0ff8e37dd937830db846c44e', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -483,7 +483,7 @@ 'libcxx_revision': 'e3598c2dc07b5a5320fd3fedb8a4afaa95f09142', # GN CIPD package version. - 'gn_version': 'git_revision:9ef321772ecc161937db69acb346397e0ccc484d', + 'gn_version': 'git_revision:c8c63300ac8ecb66d8126af5407257209ae59044', } # Only these hosts are allowed for dependencies in this DEPS file. @@ -862,7 +862,7 @@ 'packages': [ { 'package': 'chromium/rts/model/linux-amd64', - 'version': 'as8-WwWhhU8-MZx0i9B-KEOE6qoNtklS3UM5gkGUzIAC', + 'version': 'Vqb_w6bs_f3h4FzuNZAI2gBGdUZnnlPImIgtxQjCJlwC', }, ], 'dep_type': 'cipd', @@ -873,7 +873,7 @@ 'packages': [ { 'package': 'chromium/rts/model/mac-amd64', - 'version': 'DBavMVRx23NR7uCwvVp5jMhaKBacIG5bTNzi4eV1juQC', + 'version': '6icXykpJfu_jnJHIAoAEjzE8GjNrMMAby4NAqRIS0A8C', }, ], 'dep_type': 'cipd', @@ -884,7 +884,7 @@ 'packages': [ { 'package': 'chromium/rts/model/windows-amd64', - 'version': 'ucXcQPrX4wDIZVHsHrnoJDbavPZhoTcX8ZM4bVciwW4C', + 'version': 'Ngz0cH1Z5mUfpP6bQ1wNaL2vo0WXmdvuRBIrgw8ZN5UC', }, ], 'dep_type': 'cipd', @@ -1007,7 +1007,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_build_tools/lint', - 'version': 'INnGGTfg5gGJutJiBtWI6-QwusHDDnKvZzI53Q3UiecC', + 'version': 'nklp_LHwFqk9tuQm1yHGBy2W16YMz_R7Q7vcnZZnF78C', }, ], 'condition': 'checkout_android', @@ -1156,7 +1156,7 @@ # Tools used when building Chrome for Chrome OS. This affects both the Simple # Chrome workflow, as well as the chromeos-chrome ebuild. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'd391be8a4325cc57f37dc77c6c24248b409af0f4', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '6c79d3da0da8f66c31b6a5ae20374b2af03c63a5', 'condition': 'checkout_chromeos', }, @@ -1556,7 +1556,7 @@ Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + 'fac04ceb3e966f613ed17e98178e9d690280bba6', 'src/third_party/openscreen/src': - Var('chromium_git') + '/openscreen' + '@' + '1c8b6f256f032c93611712bb1c9ba3e6a511e960', + Var('chromium_git') + '/openscreen' + '@' + '4f5574bdd3efa1641a5aab8ef55972cf14e87b56', 'src/third_party/openxr/src': { 'url': Var('chromium_git') + '/external/github.com/KhronosGroup/OpenXR-SDK' + '@' + 'bf21ccb1007bb531b45d9978919a56ea5059c245', @@ -1573,7 +1573,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'ce19ce7576b6563e5344885ab151cad5089da9e7', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '470bc189f52bdbd4900e67dacb8e7bad1bac5fe1', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1613,7 +1613,7 @@ 'packages': [ { 'package': 'chromium/third_party/r8', - 'version': 'fyrZX7YFSdaFh8Uqs1iTtsYtS8351A4ndoz7WiIIrDgC', + 'version': '8RiUzjctgueOdfuqGNeXwdR_7AGlMwPM9A01M3uKD88C', }, ], 'condition': 'checkout_android', @@ -1732,7 +1732,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '94fd83896c67bb1a995337c501bbed02bd63361f', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '2189415be3747e45d09eeed72a1c96ee066d3789', + Var('webrtc_git') + '/src.git' + '@' + '70ed471836560569467e00b0c23c5ff56f007137', 'src/third_party/libgifcodec': Var('skia_git') + '/libgifcodec' + '@'+ Var('libgifcodec_revision'), @@ -1805,7 +1805,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@861ce8cae3001c04dddbd738017bd63813420f21', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@9c58769d85bdcec073e175c98708c92ceb9492eb', 'condition': 'checkout_src_internal', }, @@ -1835,7 +1835,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': '1pnKTN657Ssn-miDFzA1W7pMXuTroUpqKFGw2oShTrMC', + 'version': '9N-G9hCCYtnfw5ebK3nEQkoHqnItAtjAtyj2pOCKJ1kC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -1846,7 +1846,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/media_app/app', - 'version': 'pGfZwUD7R0xpwgfDWKat7tEqV1y19uulGcf60FiAQ-4C', + 'version': 's0beaGjQZ6FLAKh64OjJHlTIMTgy5IfMGuB2D2uacMYC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/ash/ambient/backdrop/ambient_backend_controller_impl.cc b/ash/ambient/backdrop/ambient_backend_controller_impl.cc index 7faa8a73..78077c30 100644 --- a/ash/ambient/backdrop/ambient_backend_controller_impl.cc +++ b/ash/ambient/backdrop/ambient_backend_controller_impl.cc
@@ -723,7 +723,7 @@ std::vector<GURL> preview_urls; for (const std::string& preview_url : get_google_photos_albums_preview_response.preview_url()) { - preview_urls.push_back(GURL(preview_url)); + preview_urls.emplace_back(preview_url); } std::move(callback).Run(preview_urls); }
diff --git a/ash/ambient/ui/ambient_animation_player.cc b/ash/ambient/ui/ambient_animation_player.cc index dbd1983..4f93d99c 100644 --- a/ash/ambient/ui/ambient_animation_player.cc +++ b/ash/ambient/ui/ambient_animation_player.cc
@@ -73,7 +73,8 @@ animated_image_view_->Play(lottie::Animation::PlaybackConfig( {{base::TimeDelta(), animation->GetAnimationDuration()}, {cycle_restart_timestamp_, animation->GetAnimationDuration()}}, - lottie::Animation::Style::kLoop)); + /*initial_offset=*/base::TimeDelta(), + /*initial_completed_cycles=*/0, lottie::Animation::Style::kLoop)); } AmbientAnimationPlayer::~AmbientAnimationPlayer() {
diff --git a/ash/app_list/views/apps_grid_view.cc b/ash/app_list/views/apps_grid_view.cc index 0dc48cf..a96abb65 100644 --- a/ash/app_list/views/apps_grid_view.cc +++ b/ash/app_list/views/apps_grid_view.cc
@@ -1144,7 +1144,7 @@ const bool is_syncing = model_ && model_->status() == AppListModelStatus::kStatusSyncing; const bool should_animate_placeholder_swap = - ash::features::IsLauncherPulsingBlocksRefreshEnabled() && + ash::features::IsProductivityLauncherEnabled() && pulsing_blocks_model_.view_size() > 0 && is_syncing && placeholder_in_view_index;
diff --git a/ash/app_list/views/productivity_launcher_search_view.cc b/ash/app_list/views/productivity_launcher_search_view.cc index 48c4ead..d24242d5 100644 --- a/ash/app_list/views/productivity_launcher_search_view.cc +++ b/ash/app_list/views/productivity_launcher_search_view.cc
@@ -174,7 +174,8 @@ } SearchResultBaseView* first_result_view = nullptr; - std::vector<std::string> search_result_ids; + std::vector<SearchResultContainerView::SearchResultAimationMetadata> + search_result_metadata; // If the user cleared the search box text, skip animating the views. The // visible views will animate out and the whole search page will be hidden. @@ -195,19 +196,24 @@ } for (SearchResultContainerView* view : result_container_views_) { - view->AppendShownResultIds(&search_result_ids); + view->AppendShownResultMetadata(&search_result_metadata); } - int num_matching_leading_results = 0; - for (size_t i = 0; - i < std::min(search_result_ids.size(), last_result_ids_.size()); i++) { - if (search_result_ids[i] != last_result_ids_[i]) + int first_animated_result_view_index = 0; + for (size_t i = 0; i < std::min(search_result_metadata.size(), + last_result_metadata_.size()); + ++i) { + const bool matching_result_id = search_result_metadata[i].result_id == + last_result_metadata_[i].result_id; + const bool skip_animations = search_result_metadata[i].skip_animations && + last_result_metadata_[i].skip_animations; + if (!skip_animations && !matching_result_id) break; - num_matching_leading_results += 1; + first_animated_result_view_index += 1; } aggregate_animation_info.first_animated_result_view_index = - num_matching_leading_results; + first_animated_result_view_index; for (SearchResultContainerView* view : result_container_views_) { absl::optional<AnimationInfo> container_animation_info = @@ -236,7 +242,7 @@ Layout(); last_search_result_count_ = result_count; - last_result_ids_.swap(search_result_ids); + last_result_metadata_.swap(search_result_metadata); ScheduleResultsChangedA11yNotification();
diff --git a/ash/app_list/views/productivity_launcher_search_view.h b/ash/app_list/views/productivity_launcher_search_view.h index 4943a03..ecad3cb 100644 --- a/ash/app_list/views/productivity_launcher_search_view.h +++ b/ash/app_list/views/productivity_launcher_search_view.h
@@ -129,8 +129,9 @@ // views hierarchy. Used by result_selection_controller_. std::vector<SearchResultContainerView*> result_container_views_; - // Cache of the last shown search results IDs. - std::vector<std::string> last_result_ids_; + // Cache of the last shown search results' animation metadata. + std::vector<SearchResultContainerView::SearchResultAimationMetadata> + last_result_metadata_; // Handles search result selection. std::unique_ptr<ResultSelectionController> result_selection_controller_;
diff --git a/ash/app_list/views/pulsing_block_view.cc b/ash/app_list/views/pulsing_block_view.cc index 410807d..0a055034 100644 --- a/ash/app_list/views/pulsing_block_view.cc +++ b/ash/app_list/views/pulsing_block_view.cc
@@ -78,7 +78,7 @@ PulsingBlockView::PulsingBlockView(const gfx::Size& size, base::TimeDelta animation_delay) : block_size_(size) { - if (ash::features::IsLauncherPulsingBlocksRefreshEnabled()) { + if (ash::features::IsProductivityLauncherEnabled()) { views::BoxLayout* layout_manager = SetLayoutManager(std::make_unique<views::BoxLayout>( views::BoxLayout::Orientation::kHorizontal)); @@ -135,7 +135,7 @@ } void PulsingBlockView::OnStartDelayTimer() { - if (!ash::features::IsLauncherPulsingBlocksRefreshEnabled()) { + if (!ash::features::IsProductivityLauncherEnabled()) { SchedulePulsingAnimation(layer()); return; } @@ -148,7 +148,7 @@ void PulsingBlockView::OnThemeChanged() { views::View::OnThemeChanged(); - if (!ash::features::IsLauncherPulsingBlocksRefreshEnabled()) + if (!ash::features::IsProductivityLauncherEnabled()) return; if (background_color_view_) { @@ -160,7 +160,7 @@ } void PulsingBlockView::OnPaint(gfx::Canvas* canvas) { - if (ash::features::IsLauncherPulsingBlocksRefreshEnabled()) { + if (ash::features::IsProductivityLauncherEnabled()) { views::View::OnPaint(canvas); return; } @@ -170,10 +170,9 @@ } bool PulsingBlockView::IsAnimating() { - views::View* animating_view = - ash::features::IsLauncherPulsingBlocksRefreshEnabled() - ? background_color_view_ - : this; + views::View* animating_view = ash::features::IsProductivityLauncherEnabled() + ? background_color_view_ + : this; return animating_view->layer() ? animating_view->layer()->GetAnimator()->is_animating() : false;
diff --git a/ash/app_list/views/search_result_container_view.cc b/ash/app_list/views/search_result_container_view.cc index 4d991cb..f7ad79e 100644 --- a/ash/app_list/views/search_result_container_view.cc +++ b/ash/app_list/views/search_result_container_view.cc
@@ -41,8 +41,8 @@ return absl::nullopt; } -void SearchResultContainerView::AppendShownResultIds( - std::vector<std::string>* result_ids) { +void SearchResultContainerView::AppendShownResultMetadata( + std::vector<SearchResultAimationMetadata>* result_metadata_) { NOTREACHED(); }
diff --git a/ash/app_list/views/search_result_container_view.h b/ash/app_list/views/search_result_container_view.h index f8bd15f..64a8c71 100644 --- a/ash/app_list/views/search_result_container_view.h +++ b/ash/app_list/views/search_result_container_view.h
@@ -78,6 +78,16 @@ bool use_short_animations = false; }; + // Information needed to determine if a search result shuold have an updated + // animation. + struct SearchResultAimationMetadata { + // The ID of the search result. + std::string result_id; + + // Whether animations should be skipped for this search result. + bool skip_animations = false; + }; + // Schedules animations for result list updates. Expected to be implemented // for search result containers that animate result updates. // `aggregate_animation_info` The aggregated animation information for all @@ -88,8 +98,9 @@ const ResultsAnimationInfo& aggregate_animation_info); // Appends search result IDs of the search results shown by the container - // view into 'result_ids_'. - virtual void AppendShownResultIds(std::vector<std::string>* result_ids); + // view into 'result_ids_' + virtual void AppendShownResultMetadata( + std::vector<SearchResultAimationMetadata>* result_metadata_); // Returns whether the container view has any animating child views. virtual bool HasAnimatingChildView();
diff --git a/ash/app_list/views/search_result_list_view.cc b/ash/app_list/views/search_result_list_view.cc index cf18bae4..c75c8d4 100644 --- a/ash/app_list/views/search_result_list_view.cc +++ b/ash/app_list/views/search_result_list_view.cc
@@ -351,13 +351,16 @@ return current_animation_info; } -void SearchResultListView::AppendShownResultIds( - std::vector<std::string>* result_ids) { +void SearchResultListView::AppendShownResultMetadata( + std::vector<SearchResultAimationMetadata>* result_metadata_) { for (size_t i = 0; i < search_result_views_.size(); ++i) { SearchResultView* result_view = GetResultViewAt(i); if (i >= num_results_ || !result_view->result()) return; - result_ids->push_back(result_view->result()->id()); + SearchResultAimationMetadata metadata; + metadata.result_id = result_view->result()->id(); + metadata.skip_animations = result_view->result()->skip_update_animation(); + result_metadata_->push_back(std::move(metadata)); } }
diff --git a/ash/app_list/views/search_result_list_view.h b/ash/app_list/views/search_result_list_view.h index 1e4f27f2..6452bcd 100644 --- a/ash/app_list/views/search_result_list_view.h +++ b/ash/app_list/views/search_result_list_view.h
@@ -106,7 +106,8 @@ SearchResultView* GetResultViewAt(size_t index) override; absl::optional<ResultsAnimationInfo> ScheduleResultAnimations( const ResultsAnimationInfo& aggregate_animation_info) override; - void AppendShownResultIds(std::vector<std::string>* result_ids) override; + void AppendShownResultMetadata( + std::vector<SearchResultAimationMetadata>* result_metadata_) override; bool HasAnimatingChildView() override; // Fades the view in and animates a vertical transform based on the view's
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd index 495fea1..2151519 100644 --- a/ash/ash_strings.grd +++ b/ash/ash_strings.grd
@@ -1954,7 +1954,7 @@ Saved desk, <ph name="SAVE_AND_RECALL_DESK_NAME">$1</ph> </message> <message name="IDS_ASH_DESKS_TEMPLATES_LIBRARY_SAVED_DESK_GRID_ITEM_EXTRA_ACCESSIBLE_DESCRIPTION" desc="The extra accessible description of saved desk grid item"> - Press Ctrl+W to close + Press Ctrl+W to delete </message> <!-- Virtual Desks -->
diff --git a/ash/ash_strings_grd/IDS_ASH_DESKS_TEMPLATES_LIBRARY_SAVED_DESK_GRID_ITEM_EXTRA_ACCESSIBLE_DESCRIPTION.png.sha1 b/ash/ash_strings_grd/IDS_ASH_DESKS_TEMPLATES_LIBRARY_SAVED_DESK_GRID_ITEM_EXTRA_ACCESSIBLE_DESCRIPTION.png.sha1 index 644fd0d..e925af4b 100644 --- a/ash/ash_strings_grd/IDS_ASH_DESKS_TEMPLATES_LIBRARY_SAVED_DESK_GRID_ITEM_EXTRA_ACCESSIBLE_DESCRIPTION.png.sha1 +++ b/ash/ash_strings_grd/IDS_ASH_DESKS_TEMPLATES_LIBRARY_SAVED_DESK_GRID_ITEM_EXTRA_ACCESSIBLE_DESCRIPTION.png.sha1
@@ -1 +1 @@ -221ae7039a68577a32f0ed4c733d142de65cafa8 \ No newline at end of file +ef8612c5a2223535f2ff564156c760f6b07e64e4 \ No newline at end of file
diff --git a/ash/components/arc/net/arc_net_host_impl.cc b/ash/components/arc/net/arc_net_host_impl.cc index 9e065b30..f0d7eaf 100644 --- a/ash/components/arc/net/arc_net_host_impl.cc +++ b/ash/components/arc/net/arc_net_host_impl.cc
@@ -148,28 +148,21 @@ return ""; } -arc::mojom::SecurityType TranslateWiFiSecurity(const std::string& type) { - if (type == shill::kSecurityNone) +arc::mojom::SecurityType TranslateWiFiSecurity( + const std::string& security_class) { + if (security_class == shill::kSecurityClassNone) return arc::mojom::SecurityType::NONE; - if (type == shill::kSecurityWep) + if (security_class == shill::kSecurityClassWep) return arc::mojom::SecurityType::WEP_PSK; - if (type == shill::kSecurityPsk) + if (security_class == shill::kSecurityClassPsk) return arc::mojom::SecurityType::WPA_PSK; - if (type == shill::kSecurityWpa) - return arc::mojom::SecurityType::WPA_PSK; - - if (type == shill::kSecurity8021x) + if (security_class == shill::kSecurityClass8021x) return arc::mojom::SecurityType::WPA_EAP; - // Robust Security Network does not appear to be defined in Android. - // Approximate it with WPA_EAP - if (type == shill::kSecurityRsn) - return arc::mojom::SecurityType::WPA_EAP; - - NET_LOG(ERROR) << "Unknown WiFi security type " << type; + NET_LOG(ERROR) << "Unknown WiFi security class " << security_class; return arc::mojom::SecurityType::NONE; }
diff --git a/ash/components/hid_detection/hid_detection_utils.cc b/ash/components/hid_detection/hid_detection_utils.cc index f7c2907..94e4f33 100644 --- a/ash/components/hid_detection/hid_detection_utils.cc +++ b/ash/components/hid_detection/hid_detection_utils.cc
@@ -107,4 +107,9 @@ success); } +void RecordInitialHidsMissing(const HidsMissing& hids_missing) { + base::UmaHistogramEnumeration("OOBE.HidDetectionScreen.InitialHidsMissing", + hids_missing); +} + } // namespace ash::hid_detection
diff --git a/ash/components/hid_detection/hid_detection_utils.h b/ash/components/hid_detection/hid_detection_utils.h index dd11fbb1..60a6eba 100644 --- a/ash/components/hid_detection/hid_detection_utils.h +++ b/ash/components/hid_detection/hid_detection_utils.h
@@ -25,6 +25,17 @@ kMaxValue = kUnknownPointer }; +// This enum is tied directly to the HidsMissing UMA enum defined in +// //tools/metrics/histograms/enums.xml, and should always reflect it (do not +// change one without changing the other). +enum class HidsMissing { + kNone = 0, + kPointer = 1, + kKeyboard = 2, + kPointerAndKeyboard = 3, + kMaxValue = kPointerAndKeyboard +}; + // Returns true if |device| is a HID with pointing capabilities (i.e. a mouse or // touchpad). bool IsDevicePointer(const device::mojom::InputDeviceInfo& device); @@ -49,6 +60,9 @@ void RecordBluetoothPairingResult(bool success, base::TimeDelta pairing_duration); +// Record each HID that is missing when the HID detection screen is shown. +void RecordInitialHidsMissing(const HidsMissing& hids_missing); + } // namespace ash::hid_detection #endif // ASH_COMPONENTS_HID_DETECTION_HID_DETECTION_UTILS_H_
diff --git a/ash/components/tether/wifi_hotspot_connector.cc b/ash/components/tether/wifi_hotspot_connector.cc index 32037d3..649b7da 100644 --- a/ash/components/tether/wifi_hotspot_connector.cc +++ b/ash/components/tether/wifi_hotspot_connector.cc
@@ -274,10 +274,10 @@ if (password.empty()) { properties.SetKey(shill::kSecurityClassProperty, - base::Value(shill::kSecurityNone)); + base::Value(shill::kSecurityClassNone)); } else { properties.SetKey(shill::kSecurityClassProperty, - base::Value(shill::kSecurityPsk)); + base::Value(shill::kSecurityClassPsk)); properties.SetKey(shill::kPassphraseProperty, base::Value(password)); }
diff --git a/ash/components/tether/wifi_hotspot_connector_unittest.cc b/ash/components/tether/wifi_hotspot_connector_unittest.cc index d809c1c..0c0300b4 100644 --- a/ash/components/tether/wifi_hotspot_connector_unittest.cc +++ b/ash/components/tether/wifi_hotspot_connector_unittest.cc
@@ -116,13 +116,13 @@ bool ok = VerifyBaseConfiguration(shill_properties, expected_ssid, out_guid); std::string actual_security_class = GetSecurityClass(shill_properties); - if (actual_security_class != shill::kSecurityPsk) { - ADD_FAILURE() << "Expected security class '" << shill::kSecurityPsk + if (actual_security_class != shill::kSecurityClassPsk) { + ADD_FAILURE() << "Expected security class '" << shill::kSecurityClassPsk << "' but had '" << actual_security_class; ok = false; } std::string actual_passphrase = GetPassphrase(shill_properties); - if (actual_security_class != shill::kSecurityPsk) { + if (actual_security_class != shill::kSecurityClassPsk) { ADD_FAILURE() << "Expected passphrase '" << expected_passphrase << "' but had '" << actual_passphrase; ok = false;
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc index 34d2b39..a41dbfed 100644 --- a/ash/constants/ash_features.cc +++ b/ash/constants/ash_features.cc
@@ -928,6 +928,10 @@ // Enables Jelly features. const base::Feature kJelly{"Jelly", base::FEATURE_DISABLED_BY_DEFAULT}; +// Enables IME button in the floating accessibility menu for the Kiosk session. +const base::Feature kKioskEnableImeButton{"KioskEnableImeButton", + base::FEATURE_DISABLED_BY_DEFAULT}; + // Enables to use lacros-chrome as the only web browser on ChromeOS. // This works only when both LacrosSupport and LacrosPrimary below are enabled. // NOTE: Use crosapi::browser_util::IsAshWebBrowserEnabled() instead of checking @@ -997,11 +1001,6 @@ const base::Feature kLauncherNudgeSessionReset{ "LauncherNudgeSessionReset", base::FEATURE_DISABLED_BY_DEFAULT}; -// If enabled, the new launcher pulsing blocks UI will show while syncing apps. -const base::Feature kLauncherPulsingBlocksRefresh( - "LauncherPulsingBlocksRefresh", - base::FEATURE_ENABLED_BY_DEFAULT); - // Enables new flow for license packaged devices with enterprise license. const base::Feature kLicensePackagedOobeFlow{"LicensePackagedOobeFlow", base::FEATURE_ENABLED_BY_DEFAULT}; @@ -2063,11 +2062,6 @@ base::FeatureList::IsEnabled(kLauncherNudgeSessionReset); } -bool IsLauncherPulsingBlocksRefreshEnabled() { - return IsProductivityLauncherEnabled() && - base::FeatureList::IsEnabled(kLauncherPulsingBlocksRefresh); -} - bool IsLicensePackagedOobeFlowEnabled() { return base::FeatureList::IsEnabled(kLicensePackagedOobeFlow); }
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h index 53cfdc0..81a18bc 100644 --- a/ash/constants/ash_features.h +++ b/ash/constants/ash_features.h
@@ -384,6 +384,8 @@ extern const base::Feature kImprovedLoginErrorHandling; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kInstantTethering; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kJelly; +COMPONENT_EXPORT(ASH_CONSTANTS) +extern const base::Feature kKioskEnableImeButton; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kLacrosOnly; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kLacrosPrimary; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kLacrosSupport; @@ -406,8 +408,6 @@ COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kLauncherNudgeSessionReset; COMPONENT_EXPORT(ASH_CONSTANTS) -extern const base::Feature kLauncherPulsingBlocksRefresh; -COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kLicensePackagedOobeFlow; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kLockScreenHideSensitiveNotificationsSupport; @@ -763,7 +763,6 @@ COMPONENT_EXPORT(ASH_CONSTANTS) bool IsLauncherHideContinueSectionEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsLauncherNudgeShortIntervalEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsLauncherNudgeSessionResetEnabled(); -COMPONENT_EXPORT(ASH_CONSTANTS) bool IsLauncherPulsingBlocksRefreshEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsLicensePackagedOobeFlowEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsLockScreenHideSensitiveNotificationsSupported();
diff --git a/ash/public/cpp/in_session_auth_dialog_controller.h b/ash/public/cpp/in_session_auth_dialog_controller.h index c43f6bc7..c4b90059 100644 --- a/ash/public/cpp/in_session_auth_dialog_controller.h +++ b/ash/public/cpp/in_session_auth_dialog_controller.h
@@ -40,9 +40,6 @@ // Summons a native UI dialog that authenticates the user, providing a // token, timeout and status in return. // `reason`: Indicates security context. - // `prompt`: UI customization, the string shown to the user (e.g, in - // the context of password manager: "please authenticate to see - // saved passwords"). virtual void ShowAuthDialog(Reason reason, OnAuthComplete on_auth_complete) = 0;
diff --git a/ash/shortcut_viewer/BUILD.gn b/ash/shortcut_viewer/BUILD.gn index 9a7bdc36..fd98cd3 100644 --- a/ash/shortcut_viewer/BUILD.gn +++ b/ash/shortcut_viewer/BUILD.gn
@@ -40,6 +40,7 @@ "//ui/accessibility", "//ui/aura", "//ui/chromeos/events", + "//ui/chromeos/styles:cros_tokens_color_mappings", "//ui/events:events_base", "//ui/events/devices", "//ui/events/ozone/layout",
diff --git a/ash/shortcut_viewer/views/keyboard_shortcut_view.cc b/ash/shortcut_viewer/views/keyboard_shortcut_view.cc index 53b3a3b4..6f9a8a3 100644 --- a/ash/shortcut_viewer/views/keyboard_shortcut_view.cc +++ b/ash/shortcut_viewer/views/keyboard_shortcut_view.cc
@@ -43,6 +43,7 @@ #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h" #include "ui/chromeos/events/keyboard_layout_util.h" +#include "ui/chromeos/styles/cros_tokens_color_mappings.h" #include "ui/events/event_constants.h" #include "ui/events/types/event_type.h" #include "ui/gfx/paint_vector_icon.h" @@ -152,7 +153,7 @@ class ShortcutsListScrollView : public views::ScrollView { public: - ShortcutsListScrollView() : color_provider_(ash::AshColorProvider::Get()) { + ShortcutsListScrollView() { GetViewAccessibility().OverrideRole(ax::mojom::Role::kScrollView); } @@ -170,15 +171,12 @@ void OnThemeChanged() override { views::ScrollView::OnThemeChanged(); - SetBackgroundColor(color_provider_->GetBackgroundColorInMode( - /*use_dark_color=*/ash::DarkLightModeControllerImpl::Get() - ->IsDarkModeEnabled())); + SetBackgroundColor(ash::features::IsDarkLightModeEnabled() + ? GetColorProvider()->GetColor(cros_tokens::kBgColor) + : SK_ColorWHITE); } void OnBlur() override { SetHasFocusIndicator(false); } - - private: - ash::AshColorProvider* const color_provider_; }; std::unique_ptr<ShortcutsListScrollView> CreateScrollView( @@ -425,13 +423,10 @@ KeyboardShortcutView::KeyboardShortcutView() { DCHECK_EQ(g_ksv_view, nullptr); g_ksv_view = this; - color_provider_ = ash::AshColorProvider::Get(); SetCanMinimize(true); SetShowTitle(false); - // Default background is transparent. - UpdateBackgroundColor(); InitViews(); } @@ -696,10 +691,10 @@ } void KeyboardShortcutView::UpdateBackgroundColor() { - const SkColor background_color = color_provider_->GetBackgroundColorInMode( - /*use_dark_color=*/ash::features::IsDarkLightModeEnabled() && - ash::DarkLightModeControllerImpl::Get()->IsDarkModeEnabled()); - + const SkColor background_color = + ash::features::IsDarkLightModeEnabled() + ? GetColorProvider()->GetColor(cros_tokens::kBgColor) + : SK_ColorWHITE; SetBackground(views::CreateSolidBackground(background_color)); } @@ -707,9 +702,10 @@ aura::Window* window = g_ksv_view->GetWidget()->GetNativeWindow(); window->SetProperty(chromeos::kTrackDefaultFrameColors, /*value=*/false); - const SkColor background_color = color_provider_->GetBackgroundColorInMode( - /*use_dark_color=*/ash::features::IsDarkLightModeEnabled() && - ash::DarkLightModeControllerImpl::Get()->IsDarkModeEnabled()); + const SkColor background_color = + ash::features::IsDarkLightModeEnabled() + ? GetColorProvider()->GetColor(cros_tokens::kBgColor) + : SK_ColorWHITE; window->SetProperty(chromeos::kFrameActiveColorKey, background_color); window->SetProperty(chromeos::kFrameInactiveColorKey, background_color); }
diff --git a/ash/shortcut_viewer/views/keyboard_shortcut_view.h b/ash/shortcut_viewer/views/keyboard_shortcut_view.h index 93d6e2b5..81d14d69 100644 --- a/ash/shortcut_viewer/views/keyboard_shortcut_view.h +++ b/ash/shortcut_viewer/views/keyboard_shortcut_view.h
@@ -10,7 +10,6 @@ #include <vector> #include "ash/search_box/search_box_view_delegate.h" -#include "ash/style/ash_color_provider.h" #include "base/timer/timer.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/views/widget/widget_delegate.h" @@ -141,8 +140,6 @@ // initialization of background panes in the following frame. bool did_first_paint_ = false; - ash::AshColorProvider* color_provider_; - base::WeakPtrFactory<KeyboardShortcutView> weak_factory_{this}; };
diff --git a/ash/strings/ash_strings_bs.xtb b/ash/strings/ash_strings_bs.xtb index b3d8b37a..62651fc 100644 --- a/ash/strings/ash_strings_bs.xtb +++ b/ash/strings/ash_strings_bs.xtb
@@ -759,6 +759,16 @@ <translation id="5393156353051693207">Dodirnite i zadržite bilo gdje da promijenite redoslijed aplikacija</translation> <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" /> prekriva aplikaciju <ph name="IN_PLACE_APP" />. Pustite da kreirate folder.</translation> <translation id="5397578532367286026">Upravitelj (<ph name="MANAGER_EMAIL" />) može pregledavati upotrebu i povijest tog korisnika na web-lokaciji chrome.com.</translation> +<translation id="5399673806694250334">Traka statusa, vrijeme <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">Brze postavke, pritisnite tipku za pretraživanje i strelicu ulijevo da pristupite centru za obavještenja.</translation> <translation id="5426063383988017631">Meni postavki je zatvoren</translation> <translation id="5428899915242071344">Započni odabir</translation> @@ -897,6 +907,7 @@ <translation id="619279033188484792">Pregledajte nedavne fotografije, medije i obavještenja telefona na uređaju <ph name="DEVICE_TYPE" /></translation> <translation id="619335566042889110">Potpuno napuni sada</translation> <translation id="6193431488227440296">Dev</translation> +<translation id="6210042900243040400">Povežite uređaj <ph name="NAME" /> koji je prethodno spremljen na e-adresu <ph name="EMAIL" /></translation> <translation id="6220928844947387476">Sada istovremeno možete snimati sebe i svoj ekran</translation> <translation id="622484624075952240">Dolje</translation> <translation id="6231419273573514727">Performanse perifernog uređaja su možda ograničene</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb index 70af5e8..f9b5743 100644 --- a/ash/strings/ash_strings_ca.xtb +++ b/ash/strings/ash_strings_ca.xtb
@@ -759,6 +759,16 @@ <translation id="5393156353051693207">Mantén premut qualsevol lloc per tornar a ordenar les aplicacions</translation> <translation id="5395308026110844773">L'aplicació <ph name="DRAGGED_APP_NAME" /> és a sobre de l'aplicació <ph name="IN_PLACE_APP" />. Deixa-la anar per crear una carpeta.</translation> <translation id="5397578532367286026">El gestor (<ph name="MANAGER_EMAIL" />) pot revisar l'ús i l'historial d'aquest usuari a chrome.com.</translation> +<translation id="5399673806694250334">Safata d'estat, hora <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" />, + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">Configuració ràpida, prem cerca+fletxa esquerra per accedir al centre de notificacions.</translation> <translation id="5426063383988017631">El menú de configuració s'ha tancat</translation> <translation id="5428899915242071344">Comença a seleccionar</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb index fa4f6bd..81869ad9 100644 --- a/ash/strings/ash_strings_da.xtb +++ b/ash/strings/ash_strings_da.xtb
@@ -897,6 +897,7 @@ <translation id="619279033188484792">Se de seneste billeder, mediefiler og notifikationer fra din telefon på din <ph name="DEVICE_TYPE" /></translation> <translation id="619335566042889110">Oplad helt nu</translation> <translation id="6193431488227440296">Udv</translation> +<translation id="6210042900243040400">Opret forbindelse til <ph name="NAME" />, der tidligere blev gemt på <ph name="EMAIL" /></translation> <translation id="6220928844947387476">Du kan nu optage dig selv og din skærm på samme tid</translation> <translation id="622484624075952240">Ned</translation> <translation id="6231419273573514727">Din eksterne enheds ydeevne kan være begrænset</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb index b0d858c..27117a5 100644 --- a/ash/strings/ash_strings_en-GB.xtb +++ b/ash/strings/ash_strings_en-GB.xtb
@@ -759,6 +759,16 @@ <translation id="5393156353051693207">Touch & hold anywhere to reorder your apps</translation> <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" /> on top of <ph name="IN_PLACE_APP" />, release to create folder.</translation> <translation id="5397578532367286026">Usage and history of this user can be reviewed by the manager (<ph name="MANAGER_EMAIL" />) on chrome.com.</translation> +<translation id="5399673806694250334">Status tray, time <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">Quick Settings: press search + left to access the notification centre.</translation> <translation id="5426063383988017631">Settings menu closed</translation> <translation id="5428899915242071344">Start selecting</translation>
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb index 0222376..f69453a 100644 --- a/ash/strings/ash_strings_es-419.xtb +++ b/ash/strings/ash_strings_es-419.xtb
@@ -534,7 +534,7 @@ <translation id="4115378294792113321">Magenta</translation> <translation id="412298498316631026">ventana</translation> <translation id="4123259114412175274">Para desbloquear tu Chromebook, asegúrate de que la conexión Bluetooth del teléfono esté activada</translation> -<translation id="4125970834901680537">No es posible transmitir apps en el modo tablet. Vuelve a intentarlo en el modo laptop.</translation> +<translation id="4125970834901680537">No se puede transmitir apps en el modo tablet. Inténtalo en el modo laptop.</translation> <translation id="4129129681837227511">Para ver notificaciones en la pantalla bloqueada, desbloquéala para cambiar la configuración</translation> <translation id="4136724716305260864">Activada hasta el amanecer</translation> <translation id="4146833061457621061">Reproducir música</translation>
diff --git a/ash/strings/ash_strings_fr-CA.xtb b/ash/strings/ash_strings_fr-CA.xtb index 97d2b83..78c77f6 100644 --- a/ash/strings/ash_strings_fr-CA.xtb +++ b/ash/strings/ash_strings_fr-CA.xtb
@@ -897,6 +897,7 @@ <translation id="619279033188484792">Affichez les notifications, les photos et les fichiers multimédias récents de votre téléphone sur votre <ph name="DEVICE_TYPE" /></translation> <translation id="619335566042889110">Recharger complètement maintenant</translation> <translation id="6193431488227440296">Développeur</translation> +<translation id="6210042900243040400">Connectez <ph name="NAME" /> précédemment enregistré dans <ph name="EMAIL" /></translation> <translation id="6220928844947387476">Vous pouvez maintenant vous enregistrer en même temps que votre écran</translation> <translation id="622484624075952240">Bas</translation> <translation id="6231419273573514727">Les performances du périphérique peuvent être limitées</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb index 26d470f..32711bf 100644 --- a/ash/strings/ash_strings_hi.xtb +++ b/ash/strings/ash_strings_hi.xtb
@@ -436,7 +436,7 @@ <translation id="3554637740840164787"><ph name="ITEM_TITLE" /> को पिन किया गया</translation> <translation id="3563775809269155755">हॉटस्पॉट चालू करें</translation> <translation id="3566240529365775567">इसे अभी खोला गया था</translation> -<translation id="3571734092741541777">सेट करें</translation> +<translation id="3571734092741541777">सेट अप करें</translation> <translation id="3573179567135747900">"<ph name="FROM_LOCALE" />" में फिर से बदलें (फिर से आरंभ करने की आवश्यकता है)</translation> <translation id="3576141592585647168">समय क्षेत्र बदलें</translation> <translation id="3577473026931028326">कोई गड़बड़ी हुई. फिर से कोशिश करें.</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb index 5697aea..7c73444 100644 --- a/ash/strings/ash_strings_hr.xtb +++ b/ash/strings/ash_strings_hr.xtb
@@ -759,6 +759,16 @@ <translation id="5393156353051693207">Dodirnite i držite bilo gdje da biste promijenili redoslijed svojih aplikacija</translation> <translation id="5395308026110844773">Aplikacija <ph name="DRAGGED_APP_NAME" /> povučena je iznad aplikacije <ph name="IN_PLACE_APP" />. Pustite je da biste izradili mapu.</translation> <translation id="5397578532367286026">Upravitelj (<ph name="MANAGER_EMAIL" />) može pregledavati upotrebu i povijest tog korisnika na web-lokaciji chrome.com.</translation> +<translation id="5399673806694250334">Traka statusa, vrijeme <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">Brze postavke, pritisnite tipku za pretraživanje i strelicu lijevo da biste otvorili centar obavijesti.</translation> <translation id="5426063383988017631">Izbornik postavki je zatvoren</translation> <translation id="5428899915242071344">Započni s odabirom</translation> @@ -897,6 +907,7 @@ <translation id="619279033188484792">Pregledajte nedavne fotografije, medije i obavijesti telefona na uređaju <ph name="DEVICE_TYPE" />.</translation> <translation id="619335566042889110">Odmah napunite do kraja</translation> <translation id="6193431488227440296">Razvoj</translation> +<translation id="6210042900243040400">Povežite uređaj <ph name="NAME" /> koji je prethodno spremljen na e-adresu <ph name="EMAIL" /></translation> <translation id="6220928844947387476">Sad možete snimiti sebe i zaslon istovremeno.</translation> <translation id="622484624075952240">Dolje</translation> <translation id="6231419273573514727">Rad perifernih uređaja može biti ograničen</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb index fd79b9b..9c0f000 100644 --- a/ash/strings/ash_strings_hu.xtb +++ b/ash/strings/ash_strings_hu.xtb
@@ -898,6 +898,7 @@ <translation id="619279033188484792">A telefonján található friss fotók, média és értesítések megtekintése <ph name="DEVICE_TYPE" /> eszközén</translation> <translation id="619335566042889110">Töltés a teljes akkumulátorszint eléréséig most</translation> <translation id="6193431488227440296">Fejlesztői</translation> +<translation id="6210042900243040400">A(z) <ph name="EMAIL" /> fiókhoz korábban mentett <ph name="NAME" /> csatlakoztatása</translation> <translation id="6220928844947387476">Mostantól egyszerre veheti fel magát és képernyőjét</translation> <translation id="622484624075952240">Le</translation> <translation id="6231419273573514727">Korlátozott lehet a perifériás teljesítmény</translation>
diff --git a/ash/strings/ash_strings_is.xtb b/ash/strings/ash_strings_is.xtb index a83a0270a..53ded547 100644 --- a/ash/strings/ash_strings_is.xtb +++ b/ash/strings/ash_strings_is.xtb
@@ -707,7 +707,7 @@ <translation id="5071064518267176975">Forrit vill nota hljóðnemann</translation> <translation id="5078796286268621944">Rangt PIN-númer</translation> <translation id="5083553833479578423">Opnaðu fyrir fleiri eiginleika hjálparans.</translation> -<translation id="509790653408515442">Um leið og þú streymir forrit símans birtast forritin hér</translation> +<translation id="509790653408515442">Um leið og þú streymir forritum símans birtast þau hér</translation> <translation id="5098537242461068432">Skrifborð og gluggar opnaðir aftur</translation> <translation id="5107522548814527560">Vefur</translation> <translation id="5117590920725113268">Sýna næsta mánuð</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb index 465e7a6..bb21454 100644 --- a/ash/strings/ash_strings_it.xtb +++ b/ash/strings/ash_strings_it.xtb
@@ -891,7 +891,7 @@ <translation id="6154006699632741460">Periferica non supportata</translation> <translation id="6156262341071374681">Espandi per vedere tutte le app</translation> <translation id="615957422585914272">Mostra tastiera sullo schermo</translation> -<translation id="6165508094623778733">Ulteriori informazioni</translation> +<translation id="6165508094623778733">Scopri di più</translation> <translation id="6166852626429024716">Cerca sul dispositivo, nelle app, nelle impostazioni e sul Web.</translation> <translation id="6179832488876878285">Puoi bloccare qui i tuoi file importanti. Apri l'app File per iniziare.</translation> <translation id="6182592640011875895">Apri scrivania</translation> @@ -1278,7 +1278,7 @@ <translation id="8433977262951327081">La scorciatoia per mostrare il fumetto del menu di opzioni di immissione nella barra delle app è cambiata. Utilizza <ph name="NEW_SHORTCUT" /> invece di <ph name="OLD_SHORTCUT" />.</translation> <translation id="8443879455002739353">"Copia"</translation> <translation id="8444246603146515890">Scrivania <ph name="DESK_TITILE" /> attivata</translation> -<translation id="8446884382197647889">Ulteriori informazioni</translation> +<translation id="8446884382197647889">Scopri di più</translation> <translation id="8456543082656546101"><ph name="SHORTCUT_KEY_NAME" /> + V</translation> <translation id="8462305545768648477">Chiudi Seleziona per ascoltare</translation> <translation id="847056008324733326">Impostazioni scala di visualizzazione</translation>
diff --git a/ash/strings/ash_strings_ka.xtb b/ash/strings/ash_strings_ka.xtb index 5527167..e4687024 100644 --- a/ash/strings/ash_strings_ka.xtb +++ b/ash/strings/ash_strings_ka.xtb
@@ -897,6 +897,7 @@ <translation id="619279033188484792">ნახეთ თქვენი ტელეფონის ბოლოდროინდელი ფოტოები, მედიაფაილები და შეტყობინებები თქვენს <ph name="DEVICE_TYPE" />-ზე</translation> <translation id="619335566042889110">სრულად დატენა ახლავე</translation> <translation id="6193431488227440296">Dev</translation> +<translation id="6210042900243040400">დააკავშირეთ <ph name="NAME" />, რომლებიც ადრე შენახული იყო <ph name="EMAIL" />-ში</translation> <translation id="6220928844947387476">ახლა თქვენი თავის და ეკრანის ჩაწერა ერთდროულად შეგიძლიათ</translation> <translation id="622484624075952240">ქვემოთ</translation> <translation id="6231419273573514727">შესაძლოა, პერიფერიული მოწყობილობების წარმადობა შეზღუდული იყოს</translation>
diff --git a/ash/strings/ash_strings_lo.xtb b/ash/strings/ash_strings_lo.xtb index 89a47eec..6345250 100644 --- a/ash/strings/ash_strings_lo.xtb +++ b/ash/strings/ash_strings_lo.xtb
@@ -897,6 +897,7 @@ <translation id="619279033188484792">ເບິ່ງຮູບພາບ, ມີເດຍ ແລະ ການແຈ້ງເຕືອນຫຼ້າສຸດຂອງໂທລະສັບທ່ານຢູ່ <ph name="DEVICE_TYPE" /> ຂອງທ່ານ</translation> <translation id="619335566042889110">ສາກໃຫ້ເຕັມຕອນນີ້</translation> <translation id="6193431488227440296">Dev</translation> +<translation id="6210042900243040400">ເຊື່ອມຕໍ່ <ph name="NAME" /> ທີ່ບັນທຶກໄວ້ກ່ອນໜ້ານີ້ໃສ່ <ph name="EMAIL" /></translation> <translation id="6220928844947387476">ຕອນນີ້ທ່ານສາມາດບັນທຶກຕົວທ່ານເອງ ແລະ ໜ້າຈໍຂອງທ່ານພ້ອມກັນໄດ້ແລ້ວ</translation> <translation id="622484624075952240">ລົງ</translation> <translation id="6231419273573514727">ປະສິດທິພາບອຸປະກອນຕໍ່ພ່ວງອາດຖືກຈຳກັດໄວ້</translation>
diff --git a/ash/strings/ash_strings_mk.xtb b/ash/strings/ash_strings_mk.xtb index ad7274f3..6c3b875 100644 --- a/ash/strings/ash_strings_mk.xtb +++ b/ash/strings/ash_strings_mk.xtb
@@ -760,6 +760,16 @@ <translation id="5393156353051693207">Допрете и задржете каде било за да ги преуредите апликациите</translation> <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" /> врз <ph name="IN_PLACE_APP" />, пуштете за да се создаде папка.</translation> <translation id="5397578532367286026">Користењето и историјата на овој корисник може да ги прегледува управникот (<ph name="MANAGER_EMAIL" />) на chrome.com.</translation> +<translation id="5399673806694250334">Фиока за статусот, време <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">Брзи поставки, Притиснете „Пребарување + лево“ за да пристапите до центарот за известувања.</translation> <translation id="5426063383988017631">Менито со поставки е затворено</translation> <translation id="5428899915242071344">Започнете со избирање</translation> @@ -898,6 +908,7 @@ <translation id="619279033188484792">Прегледувајте ги неодамнешните фотографии, аудиовизуелни содржини и известувања од телефонот на вашиот <ph name="DEVICE_TYPE" /></translation> <translation id="619335566042889110">Целосно наполни сега</translation> <translation id="6193431488227440296">Dev</translation> +<translation id="6210042900243040400">Поврзете го уредот (<ph name="NAME" />) претходно зачуван на <ph name="EMAIL" /></translation> <translation id="6220928844947387476">Сега можете истовремено да се снимате себеси и екранот</translation> <translation id="622484624075952240">Долу</translation> <translation id="6231419273573514727">Перформансите на периферните уреди може да бидат ограничени</translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb index ae54aa7..2671b72 100644 --- a/ash/strings/ash_strings_ms.xtb +++ b/ash/strings/ash_strings_ms.xtb
@@ -898,6 +898,7 @@ <translation id="619279033188484792">Lihat foto, media dan pemberitahuan baru-baru ini telefon anda pada <ph name="DEVICE_TYPE" /> anda</translation> <translation id="619335566042889110">Caskan penuh sekarang</translation> <translation id="6193431488227440296">Pembangun</translation> +<translation id="6210042900243040400">Sambungkan <ph name="NAME" /> yang disimpan sebelum ini di <ph name="EMAIL" /></translation> <translation id="6220928844947387476">Kini anda boleh merakam diri anda dan skrin anda secara serentak</translation> <translation id="622484624075952240">Bawah</translation> <translation id="6231419273573514727">Prestasi peranti persisian mungkin terhad</translation>
diff --git a/ash/strings/ash_strings_my.xtb b/ash/strings/ash_strings_my.xtb index 193524c..38d1772 100644 --- a/ash/strings/ash_strings_my.xtb +++ b/ash/strings/ash_strings_my.xtb
@@ -897,6 +897,7 @@ <translation id="619279033188484792">သင့်ဖုန်း၏ မကြာသေးမီက ဓာတ်ပုံ၊ မီဒီယာနှင့် အကြောင်းကြားချက်များကို သင့် <ph name="DEVICE_TYPE" /> တွင် ကြည့်နိုင်သည်</translation> <translation id="619335566042889110">ယခုအားအပြည့်သွင်းရန်</translation> <translation id="6193431488227440296">Dev</translation> +<translation id="6210042900243040400">ယခင်က <ph name="EMAIL" /> သို့ သိမ်းထားသော <ph name="NAME" /> သို့ ချိတ်ဆက်ပါ</translation> <translation id="6220928844947387476">သင့်စခရင်နှင့် သင့်ကို တစ်ချိန်တည်း ယခု မှတ်တမ်းတင်နိုင်ပါပြီ</translation> <translation id="622484624075952240">အောက်သို့</translation> <translation id="6231419273573514727">ချိတ်ဆက်ပစ္စည်း စွမ်းဆောင်ရည်ကို ကန့်သတ်ထားနိုင်သည်</translation>
diff --git a/ash/strings/ash_strings_pa.xtb b/ash/strings/ash_strings_pa.xtb index 346404b..d38825f 100644 --- a/ash/strings/ash_strings_pa.xtb +++ b/ash/strings/ash_strings_pa.xtb
@@ -760,6 +760,16 @@ <translation id="5393156353051693207">ਆਪਣੀਆਂ ਐਪਾਂ ਨੂੰ ਮੁੜ-ਕ੍ਰਮਬੱਧ ਕਰਨ ਲਈ ਕਿਤੇ ਵੀ ਸਪਰਸ਼ ਕਰ ਕੇ ਰੱਖੋ</translation> <translation id="5395308026110844773"><ph name="IN_PLACE_APP" /> ਦੇ ਉੱਪਰ <ph name="DRAGGED_APP_NAME" />, ਫੋਲਡਰ ਬਣਾਉਣ ਲਈ ਛੱਡੋ।</translation> <translation id="5397578532367286026">ਇਸ ਵਰਤੋਂਕਾਰ ਦੀ ਵਰਤੋਂ ਅਤੇ ਇਤਿਹਾਸ ਦੀ ਸਮੀਖਿਆ ਪ੍ਰਬੰਧਕ (<ph name="MANAGER_EMAIL" />) ਵੱਲੋਂ chrome.com 'ਤੇ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ।</translation> +<translation id="5399673806694250334">ਸਥਿਤੀ ਟ੍ਰੇਅ, ਸਮਾਂ <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">ਤਤਕਾਲ ਸੈਟਿੰਗਾਂ, ਸੂਚਨਾ ਕੇਂਦਰ 'ਤੇ ਜਾਣ ਲਈ search + left ਦਬਾਓ।</translation> <translation id="5426063383988017631">ਸੈਟਿੰਗ ਮੀਨੂ ਨੂੰ ਬੰਦ ਕੀਤਾ ਗਿਆ</translation> <translation id="5428899915242071344">ਚੁਣਨਾ ਸ਼ੁਰੂ ਕਰੋ</translation> @@ -898,6 +908,7 @@ <translation id="619279033188484792">ਆਪਣੇ <ph name="DEVICE_TYPE" /> 'ਤੇ ਆਪਣੇ ਫ਼ੋਨ ਦੀਆਂ ਹਾਲੀਆ ਫ਼ੋਟੋਆਂ, ਮੀਡੀਆ ਅਤੇ ਸੂਚਨਾਵਾਂ ਦੇਖੋ</translation> <translation id="619335566042889110">ਹੁਣ ਪੂਰੀ ਤਰ੍ਹਾਂ ਚਾਰਜ ਕਰੋ</translation> <translation id="6193431488227440296">Dev</translation> +<translation id="6210042900243040400"><ph name="EMAIL" /> ਵਿੱਚ ਪਹਿਲਾਂ ਤੋਂ ਰੱਖਿਅਤ ਕੀਤੇ <ph name="NAME" /> ਨੂੰ ਕਨੈਕਟ ਕਰੋ</translation> <translation id="6220928844947387476">ਤੁਸੀਂ ਹੁਣ ਖੁਦ ਨੂੰ ਅਤੇ ਆਪਣੀ ਸਕ੍ਰੀਨ ਨੂੰ ਇੱਕੋ ਸਮੇਂ ਰਿਕਾਰਡ ਕਰ ਸਕਦੇ ਹੋ</translation> <translation id="622484624075952240">ਹੇਠਾਂ</translation> <translation id="6231419273573514727">ਪੈਰੀਫੈਰਲ ਕਾਰਗੁਜ਼ਾਰੀ ਸੀਮਤ ਹੋ ਸਕਦੀ ਹੈ</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb index 73c86689..4522310 100644 --- a/ash/strings/ash_strings_pl.xtb +++ b/ash/strings/ash_strings_pl.xtb
@@ -533,7 +533,7 @@ <translation id="4115378294792113321">Magenta</translation> <translation id="412298498316631026">okno</translation> <translation id="4123259114412175274">Aby odblokować Chromebooka, sprawdź, czy na telefonie jest włączony Bluetooth</translation> -<translation id="4125970834901680537">W trybie tabletu nie można przesyłać strumieniowo aplikacji. Spróbuj ponownie w trybie laptopa.</translation> +<translation id="4125970834901680537">W trybie tabletu nie można strumieniować aplikacji. Spróbuj ponownie w trybie laptopa.</translation> <translation id="4129129681837227511">Aby wyświetlać powiadomienia na ekranie blokady, odblokuj ekran i zmień ustawienie</translation> <translation id="4136724716305260864">Włączone do wschodu słońca</translation> <translation id="4146833061457621061">Włącz muzykę</translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb index 3eb1c78..e26588f 100644 --- a/ash/strings/ash_strings_pt-PT.xtb +++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -759,6 +759,16 @@ <translation id="5393156353051693207">Toque sem soltar em qualquer local para reordenar as suas apps</translation> <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" /> sobre <ph name="IN_PLACE_APP" />, solte para criar uma pasta.</translation> <translation id="5397578532367286026">A utilização e o histórico deste utilizador podem ser consultados pelo gestor (<ph name="MANAGER_EMAIL" />) em chrome.com.</translation> +<translation id="5399673806694250334">Tabuleiro do estado, hora <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">Nas Definições rápidas, prima Pesquisa + seta para a esquerda para aceder ao centro de notificações.</translation> <translation id="5426063383988017631">Menu de definições fechado</translation> <translation id="5428899915242071344">Iniciar seleção</translation> @@ -897,6 +907,7 @@ <translation id="619279033188484792">Veja as fotos, os conteúdos multimédia e as notificações recentes do telemóvel no dispositivo <ph name="DEVICE_TYPE" /></translation> <translation id="619335566042889110">Carregar totalmente agora</translation> <translation id="6193431488227440296">Programação</translation> +<translation id="6210042900243040400">Ligue o dispositivo <ph name="NAME" /> guardado anteriormente em <ph name="EMAIL" /></translation> <translation id="6220928844947387476">Agora, pode gravar-se a si e ao ecrã em simultâneo</translation> <translation id="622484624075952240">Para baixo</translation> <translation id="6231419273573514727">O desempenho do periférico pode estar limitado</translation>
diff --git a/ash/strings/ash_strings_sr-Latn.xtb b/ash/strings/ash_strings_sr-Latn.xtb index 6a341431..b3b99ce5 100644 --- a/ash/strings/ash_strings_sr-Latn.xtb +++ b/ash/strings/ash_strings_sr-Latn.xtb
@@ -533,7 +533,8 @@ <translation id="4115378294792113321">Ciklama</translation> <translation id="412298498316631026">prozor</translation> <translation id="4123259114412175274">Da biste otključali Chromebook, uverite se da je Bluetooth na telefonu uključen</translation> -<translation id="4125970834901680537">Ne možete da strimujete aplikacije u režimu tableta. Probajte ponovo u režimu laptopa.</translation> +<translation id="4125970834901680537">Ne možete da strimujete aplikacije u režimu tableta. +Probajte ponovo u režimu laptopa.</translation> <translation id="4129129681837227511">Da biste videli obaveštenja na zaključanom ekranu, otključajte ga kako biste promenili podešavanje</translation> <translation id="4136724716305260864">Uključeno do svitanja</translation> <translation id="4146833061457621061">Pusti muziku</translation> @@ -551,7 +552,7 @@ <translation id="4215497585250573029">Podešavanja VPN-a</translation> <translation id="4217571870635786043">Diktiranje</translation> <translation id="4221957499226645091"><ph name="APP_NAME" />, instalirana aplikacija, pauzirana</translation> -<translation id="423685346499232137">Trenutno ne možete da kopirate ili nalepite sadržaj</translation> +<translation id="423685346499232137">Trenutno ne možete da kopirate ni nalepite sadržaj</translation> <translation id="4239069858505860023">GPRS</translation> <translation id="4242533952199664413">Otvori podešavanja</translation> <translation id="4247123849143712100">Ažuriraj i isključi</translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb index 6063e13..fb1b1d0 100644 --- a/ash/strings/ash_strings_sr.xtb +++ b/ash/strings/ash_strings_sr.xtb
@@ -533,7 +533,8 @@ <translation id="4115378294792113321">Циклама</translation> <translation id="412298498316631026">прозор</translation> <translation id="4123259114412175274">Да бисте откључали Chromebook, уверите се да је Bluetooth на телефону укључен</translation> -<translation id="4125970834901680537">Не можете да стримујете апликације у режиму таблета. Пробајте поново у режиму лаптопа.</translation> +<translation id="4125970834901680537">Не можете да стримујете апликације у режиму таблета. +Пробајте поново у режиму лаптопа.</translation> <translation id="4129129681837227511">Да бисте видели обавештења на закључаном екрану, откључајте га како бисте променили подешавање</translation> <translation id="4136724716305260864">Укључено до свитања</translation> <translation id="4146833061457621061">Пусти музику</translation> @@ -551,7 +552,7 @@ <translation id="4215497585250573029">Подешавања VPN-а</translation> <translation id="4217571870635786043">Диктирање</translation> <translation id="4221957499226645091"><ph name="APP_NAME" />, инсталирана апликација, паузирана</translation> -<translation id="423685346499232137">Тренутно не можете да копирате или налепите садржај</translation> +<translation id="423685346499232137">Тренутно не можете да копирате ни налепите садржај</translation> <translation id="4239069858505860023">GPRS</translation> <translation id="4242533952199664413">Отвори подешавања</translation> <translation id="4247123849143712100">Ажурирај и искључи</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb index fb76b469..9a85809 100644 --- a/ash/strings/ash_strings_te.xtb +++ b/ash/strings/ash_strings_te.xtb
@@ -760,6 +760,16 @@ <translation id="5393156353051693207">మీ యాప్ల క్రమాన్ని మార్చడానికి ఎక్కడైనా తాకి, నొక్కి ఉంచండి</translation> <translation id="5395308026110844773"><ph name="IN_PLACE_APP" />పై భాగాన <ph name="DRAGGED_APP_NAME" /> ఉంది, ఫోల్డర్ క్రియేట్ చేయడానికి రిలీజ్ చేయండి.</translation> <translation id="5397578532367286026">ఈ వినియోగదారు యొక్క వినియోగం మరియు చరిత్రను chrome.comలో నిర్వాహకుడు (<ph name="MANAGER_EMAIL" />) సమీక్షించవచ్చు.</translation> +<translation id="5399673806694250334">స్టేటస్ ట్రే, సమయం <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">త్వరిత సెట్టింగ్లు, నోటిఫికేషన్ సెంటర్ను యాక్సెస్ చేయడానికి శోధన + ఎడమకు నొక్కండి.</translation> <translation id="5426063383988017631">సెట్టింగ్ల మెనూ మూసివేయబడింది</translation> <translation id="5428899915242071344">ఎంచుకోవడం ప్రారంభించు</translation> @@ -898,6 +908,7 @@ <translation id="619279033188484792">మీ ఫోన్లోని తాజా ఫోటోలు, మీడియా, మీ <ph name="DEVICE_TYPE" />లోని నోటిఫికేషన్లను చూడండి</translation> <translation id="619335566042889110">ఇప్పుడు పూర్తిగా ఛార్జ్ అయింది</translation> <translation id="6193431488227440296">డెవలపర్</translation> +<translation id="6210042900243040400"><ph name="EMAIL" /> ఈమెయిల్కు మునుపు సేవ్ చేయబడిన <ph name="NAME" />కు కనెక్ట్ చేయండి</translation> <translation id="6220928844947387476">ఇప్పుడు మీరు మిమ్మల్ని, మీ స్క్రీన్ను ఒకే సమయంలో రికార్డ్ చేయవచ్చు</translation> <translation id="622484624075952240">Down</translation> <translation id="6231419273573514727">పెరిఫెరల్ పనితీరు పరిమితంగా ఉండవచ్చు</translation>
diff --git a/ash/strings/ash_strings_uz.xtb b/ash/strings/ash_strings_uz.xtb index c3366db..724ff75 100644 --- a/ash/strings/ash_strings_uz.xtb +++ b/ash/strings/ash_strings_uz.xtb
@@ -759,6 +759,16 @@ <translation id="5393156353051693207">Ilovalarni qayta saralash uchun istalgan joyni bosib turing</translation> <translation id="5395308026110844773">Jild yaratish uchun <ph name="DRAGGED_APP_NAME" /> ilovaisini <ph name="IN_PLACE_APP" /> ustiga sudrang.</translation> <translation id="5397578532367286026">Boshqaruvchi (<ph name="MANAGER_EMAIL" />) bu foydalanuvchining brauzerdagi ish tarixini chrome.com saytida ko‘rishi mumkin.</translation> +<translation id="5399673806694250334">Holat qatori, vaqt: <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">Tezkor sozlamalar, Bildirishnomalar markazini ochish uchun “Qidiruv + Chapga strelka” tugmalarini bosing.</translation> <translation id="5426063383988017631">Sozlamalar menyusi yopildi</translation> <translation id="5428899915242071344">Matnni tanlashni boshlash</translation> @@ -897,6 +907,7 @@ <translation id="619279033188484792">Telefoningizdagi oxirgi rasmlar, media va bildirishnomalarni <ph name="DEVICE_TYPE" /> qurilmasida koʻring</translation> <translation id="619335566042889110">Toʻliq quvvatlang</translation> <translation id="6193431488227440296">Dev</translation> +<translation id="6210042900243040400"><ph name="NAME" /> qurilmasini oldin saqlangan <ph name="EMAIL" /> hisobiga ulang</translation> <translation id="6220928844947387476">Endi siz bir vaqtda ekran va veb kamera tasvirlarini yozib olishingiz mumkin.</translation> <translation id="622484624075952240">Pastga</translation> <translation id="6231419273573514727">Tashqi qurilmalar samaradorligi cheklanishi mumkin</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb index ae9d5fd..bcf6155 100644 --- a/ash/strings/ash_strings_vi.xtb +++ b/ash/strings/ash_strings_vi.xtb
@@ -707,7 +707,7 @@ <translation id="5071064518267176975">Một ứng dụng muốn dùng micrô</translation> <translation id="5078796286268621944">Mã PIN không chính xác</translation> <translation id="5083553833479578423">Mở khóa các tính năng khác của Trợ lý.</translation> -<translation id="509790653408515442">Khi bạn phát trực tuyến các ứng dụng trên điện thoại, những ứng dụng đó sẽ xuất hiện ở đây</translation> +<translation id="509790653408515442">Khi bạn truyền trực tuyến các ứng dụng trên điện thoại, những ứng dụng đó sẽ xuất hiện ở đây</translation> <translation id="5098537242461068432">Đã mở lại không gian làm việc và cửa sổ</translation> <translation id="5107522548814527560">Web</translation> <translation id="5117590920725113268">Hiển thị tháng tiếp theo</translation> @@ -897,6 +897,7 @@ <translation id="619279033188484792">Xem thông báo, nội dung phương tiện và ảnh mới đây của điện thoại trên <ph name="DEVICE_TYPE" /></translation> <translation id="619335566042889110">Sạc đầy ngay</translation> <translation id="6193431488227440296">Kênh nhà phát triển</translation> +<translation id="6210042900243040400">Kết nối <ph name="NAME" /> (trước đó đã được lưu vào <ph name="EMAIL" />)</translation> <translation id="6220928844947387476">Giờ đây bạn có thể ghi hình đồng thời cả chính mình và màn hình</translation> <translation id="622484624075952240">Xuống</translation> <translation id="6231419273573514727">Hiệu suất của thiết bị ngoại vi có thể bị hạn chế</translation>
diff --git a/ash/strings/ash_strings_zh-HK.xtb b/ash/strings/ash_strings_zh-HK.xtb index b00a0f8..3dfa9c6 100644 --- a/ash/strings/ash_strings_zh-HK.xtb +++ b/ash/strings/ash_strings_zh-HK.xtb
@@ -758,6 +758,16 @@ <translation id="5393156353051693207">輕觸並按住任何位置即可將應用程式重新排序</translation> <translation id="5395308026110844773">「<ph name="DRAGGED_APP_NAME" />」宜家拉咗去「<ph name="IN_PLACE_APP" />」上面,放開滑鼠就可以建立資料夾。</translation> <translation id="5397578532367286026">管理員 (<ph name="MANAGER_EMAIL" />) 可以在 chrome.com 瞭解這位使用者的使用情況和記錄。</translation> +<translation id="5399673806694250334">狀態列,時間 <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">快速設定,㩒一下搜尋鍵 + 向左鍵就可以存取通知中心。</translation> <translation id="5426063383988017631">閂咗設定選單</translation> <translation id="5428899915242071344">開始選取</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb index 28b8a05..30b5dc1 100644 --- a/ash/strings/ash_strings_zh-TW.xtb +++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -759,6 +759,16 @@ <translation id="5393156353051693207">按住任一處即可將應用程式重新排序</translation> <translation id="5395308026110844773">「<ph name="DRAGGED_APP_NAME" />」已拖曳到「<ph name="IN_PLACE_APP" />」上方,放開滑鼠即可建立資料夾。</translation> <translation id="5397578532367286026">管理員 (<ph name="MANAGER_EMAIL" />) 可以在 chrome.com 瞭解這名使用者的使用情形和記錄。</translation> +<translation id="5399673806694250334">狀態匣,時間 <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">快速設定,按下搜尋鍵 + 向左鍵即可存取通知中心。</translation> <translation id="5426063383988017631">已關閉設定選單</translation> <translation id="5428899915242071344">開始選取</translation>
diff --git a/ash/style/ash_color_mixer.cc b/ash/style/ash_color_mixer.cc index 6f86a82..86a5e56 100644 --- a/ash/style/ash_color_mixer.cc +++ b/ash/style/ash_color_mixer.cc
@@ -109,12 +109,8 @@ mixer[kColorAshSeparatorColor] = use_dark_color ? ui::ColorTransform(SkColorSetA(SK_ColorWHITE, 0x24)) : ui::ColorTransform(SkColorSetA(SK_ColorBLACK, 0x24)); - mixer[kColorAshTextColorPrimary] = - use_dark_color ? ui::ColorTransform(gfx::kGoogleGrey200) - : ui::ColorTransform(gfx::kGoogleGrey900); - mixer[kColorAshTextColorSecondary] = - use_dark_color ? ui::ColorTransform(gfx::kGoogleGrey400) - : ui::ColorTransform(gfx::kGoogleGrey700); + mixer[kColorAshTextColorPrimary] = {cros_tokens::kColorPrimary}; + mixer[kColorAshTextColorSecondary] = {cros_tokens::kColorSecondary}; mixer[kColorAshTextColorAlert] = use_dark_color ? ui::ColorTransform(gfx::kGoogleRed300) : ui::ColorTransform(gfx::kGoogleRed600); @@ -135,9 +131,8 @@ use_dark_color ? ui::ColorTransform(gfx::kGoogleGrey100) : ui::ColorTransform(gfx::kGoogleGrey800); mixer[kColorAshButtonLabelColor] = {kColorAshTextColorPrimary}; - mixer[kColorAshButtonLabelColorPrimary] = - use_dark_color ? ui::ColorTransform(gfx::kGoogleGrey900) - : ui::ColorTransform(gfx::kGoogleGrey200); + mixer[kColorAshButtonLabelColorPrimary] = { + cros_tokens::kColorPrimaryInverted}; mixer[kColorAshInvertedTextColorPrimary] = {kColorAshButtonLabelColorPrimary}; mixer[kColorAshInvertedButtonLabelColor] = {kColorAshButtonLabelColorPrimary}; mixer[kColorAshButtonLabelColorBlue] = {kColorAshTextColorURL}; @@ -345,7 +340,10 @@ void AddCrosStylesColorMixer(ui::ColorProvider* provider, const ui::ColorProviderManager::Key& key) { ui::ColorMixer& mixer = provider->AddMixer(); - bool dark_mode = key.color_mode == ui::ColorProviderManager::ColorMode::kDark; + bool dark_mode = + features::IsDarkLightModeEnabled() + ? key.color_mode == ui::ColorProviderManager::ColorMode::kDark + : DarkLightModeControllerImpl::Get()->IsDarkModeEnabled(); if (ash::features::IsJellyEnabled()) { AddRefPalette(mixer, key); } else { @@ -372,13 +370,13 @@ cros_tokens::kColorProminentDark}; mixer[ui::kColorAshActionLabelFocusRingError] = {gfx::kGoogleRed300}; mixer[ui::kColorAshActionLabelFocusRingHover] = - ui::SetAlpha(gfx::kGoogleGrey200, 0x60); + ui::SetAlpha(cros_tokens::kColorPrimaryDark, 0x60); mixer[ui::kColorAshAppListFocusRingNoKeyboard] = {SK_AlphaTRANSPARENT}; mixer[ui::kColorAshAppListSeparatorLight] = { ui::kColorAshSystemUIMenuSeparator}; mixer[ui::kColorAshAppListSeparator] = - ui::SetAlpha(gfx::kGoogleGrey900, 0x24); + ui::SetAlpha(cros_tokens::kColorPrimaryLight, 0x24); mixer[ui::kColorAshArcInputMenuSeparator] = {SK_ColorGRAY}; mixer[ui::kColorAshEditFinishFocusRing] = {cros_tokens::kColorProminentDark}; mixer[ui::kColorAshIconInOobe] = {kIconColorInOobe};
diff --git a/ash/system/accessibility/floating_accessibility_view.cc b/ash/system/accessibility/floating_accessibility_view.cc index 35d0ee40..12c66ed 100644 --- a/ash/system/accessibility/floating_accessibility_view.cc +++ b/ash/system/accessibility/floating_accessibility_view.cc
@@ -91,6 +91,10 @@ } } +bool IsKioskImeButtonEnabled() { + return base::FeatureList::IsEnabled(features::kKioskEnableImeButton); +} + } // namespace FloatingAccessibilityBubbleView::FloatingAccessibilityBubbleView( @@ -153,7 +157,9 @@ kAutoclickPositionBottomLeftIcon, IDS_ASH_AUTOCLICK_OPTION_CHANGE_POSITION, /*flip_for_rtl*/ false, kPanelPositionButtonSize, false, /* is_a11y_togglable */ false)); - + if (IsKioskImeButtonEnabled()) { + // TODO(b/240928038): Add logic in following CLs. + } AddChildView(std::move(feature_buttons_container)); AddChildView(std::move(tray_button_container)); AddChildView(CreateSeparator());
diff --git a/ash/wallpaper/wallpaper_controller_impl.cc b/ash/wallpaper/wallpaper_controller_impl.cc index 08ab9be..e77db89 100644 --- a/ash/wallpaper/wallpaper_controller_impl.cc +++ b/ash/wallpaper/wallpaper_controller_impl.cc
@@ -573,6 +573,24 @@ return user_session->user_info.type; } +// Returns the WallpaperCalculatedColors from `pref_manager`, if it exists, +// using the location from `info`. +absl::optional<WallpaperCalculatedColors> GetCachedCalculatedColors( + const WallpaperPrefManager& pref_manager, + const WallpaperInfo& info) { + base::StringPiece location = info.location; + absl::optional<std::vector<SkColor>> cached_colors = + pref_manager.GetCachedProminentColors(location); + absl::optional<SkColor> cached_k_mean_color = + pref_manager.GetCachedKMeanColor(location); + if (cached_colors.has_value() && cached_k_mean_color.has_value()) { + return WallpaperCalculatedColors(cached_colors.value(), + cached_k_mean_color.value()); + } + + return absl::nullopt; +} + // Gets |account_id|'s custom wallpaper at |wallpaper_path|. Falls back to the // original custom wallpaper. Verifies that the returned path exists. If a valid // path cannot be found, returns an empty FilePath. Must run on wallpaper @@ -737,7 +755,9 @@ SkColor WallpaperControllerImpl::GetProminentColor( ColorProfile color_profile) const { ColorProfileType type = GetColorProfileType(color_profile); - return calculated_colors_.prominent_colors[static_cast<int>(type)]; + size_t index = static_cast<size_t>(type); + DCHECK_LT(index, calculated_colors_.prominent_colors.size()); + return calculated_colors_.prominent_colors[index]; } SkColor WallpaperControllerImpl::GetKMeanColor() const { @@ -1726,6 +1746,9 @@ WallpaperCalculatedColors wallpaper_calculated_colors = color_calculator_->get_calculated_colors(); color_calculator_.reset(); + + const AccountId account_id = GetActiveAccountId(); + // Use |WallpaperInfo::location| as the key for storing |prominent_colors_| in // the |kWallpaperColors| pref. // TODO(crbug.com/787134): The |prominent_colors_| of wallpapers with empty @@ -1733,8 +1756,8 @@ // TODO(skau): This does not guarantee that the current wallpaper is the same // wallpaper for which the colors were calculated. pref_manager_->CacheProminentColors( - GetActiveAccountId(), wallpaper_calculated_colors.prominent_colors); - pref_manager_->CacheKMeanColor(GetActiveAccountId(), + account_id, wallpaper_calculated_colors.prominent_colors); + pref_manager_->CacheKMeanColor(account_id, wallpaper_calculated_colors.k_mean_color); SetCalculatedColors(wallpaper_calculated_colors); } @@ -2703,18 +2726,11 @@ color_calculator_.reset(); } - if (GetActiveUserSession()) { - // The cache is only available if we have an active session. - // Fetch the color cache if it exists. - absl::optional<std::vector<SkColor>> cached_colors = - pref_manager_->GetCachedProminentColors(GetActiveAccountId()); - absl::optional<SkColor> cached_k_mean_color = - pref_manager_->GetCachedKMeanColor(GetActiveAccountId()); - if (cached_colors.has_value() && cached_k_mean_color.has_value()) { - SetCalculatedColors(WallpaperCalculatedColors( - cached_colors.value(), cached_k_mean_color.value())); - return; - } + absl::optional<WallpaperCalculatedColors> colors = GetCachedCalculatedColors( + *pref_manager_, current_wallpaper_->wallpaper_info()); + if (colors) { + SetCalculatedColors(std::move(*colors)); + return; } // Color calculation is only allowed during an active session for performance
diff --git a/ash/wallpaper/wallpaper_controller_impl.h b/ash/wallpaper/wallpaper_controller_impl.h index 66694dc..719ee97 100644 --- a/ash/wallpaper/wallpaper_controller_impl.h +++ b/ash/wallpaper/wallpaper_controller_impl.h
@@ -627,11 +627,6 @@ // system state (e.g. wallpaper image, SessionState, etc.). bool ShouldCalculateColors() const; - // Gets prominent color cache from the local state pref service. Returns an - // empty value if the cache is not available. - absl::optional<std::vector<SkColor>> GetCachedColors( - const std::string& current_location) const; - // The callback when decoding of the always-on-top wallpaper completes. void OnAlwaysOnTopWallpaperDecoded(const WallpaperInfo& info, const gfx::ImageSkia& image);
diff --git a/ash/wallpaper/wallpaper_controller_unittest.cc b/ash/wallpaper/wallpaper_controller_unittest.cc index 7fc155f..7fbb4a6 100644 --- a/ash/wallpaper/wallpaper_controller_unittest.cc +++ b/ash/wallpaper/wallpaper_controller_unittest.cc
@@ -67,6 +67,7 @@ #include "ui/display/screen.h" #include "ui/gfx/canvas.h" #include "ui/gfx/codec/jpeg_codec.h" +#include "ui/gfx/color_analysis.h" #include "ui/views/view_tracker.h" #include "ui/views/widget/widget.h" @@ -472,10 +473,9 @@ base::Time::Now().LocalMidnight()); } - // Saves images with different resolution to corresponding paths and saves - // wallpaper info to local state, so that subsequent calls of |ShowWallpaper| - // can retrieve the images and info. - void CreateAndSaveWallpapers(const AccountId& account_id) { + // Saves wallpaper images in the appropriate location for |account_id| and + // returns the relative path of the file. + base::FilePath PrecacheWallpapers(const AccountId& account_id) { std::string wallpaper_files_id = GetDummyFileId(account_id); std::string file_name = GetDummyFileName(account_id); @@ -488,19 +488,23 @@ // Saves the small/large resolution wallpapers to small/large custom // wallpaper paths. - ASSERT_TRUE(WriteJPEGFile(small_wallpaper_path, kSmallWallpaperMaxWidth, - kSmallWallpaperMaxHeight, - kSmallCustomWallpaperColor)); - ASSERT_TRUE(WriteJPEGFile(large_wallpaper_path, kLargeWallpaperMaxWidth, - kLargeWallpaperMaxHeight, - kLargeCustomWallpaperColor)); + CHECK(WriteJPEGFile(small_wallpaper_path, kSmallWallpaperMaxWidth, + kSmallWallpaperMaxHeight, kSmallCustomWallpaperColor)); + CHECK(WriteJPEGFile(large_wallpaper_path, kLargeWallpaperMaxWidth, + kLargeWallpaperMaxHeight, kLargeCustomWallpaperColor)); - std::string relative_path = - base::FilePath(wallpaper_files_id).Append(file_name).value(); + return base::FilePath(wallpaper_files_id).Append(file_name); + } + + // Saves images with different resolution to corresponding paths and saves + // wallpaper info to local state, so that subsequent calls of |ShowWallpaper| + // can retrieve the images and info. + void CreateAndSaveWallpapers(const AccountId& account_id) { + base::FilePath relative_path = PrecacheWallpapers(account_id); // Saves wallpaper info to local state for user. - WallpaperInfo info = {relative_path, WALLPAPER_LAYOUT_CENTER_CROPPED, - WallpaperType::kCustomized, - base::Time::Now().LocalMidnight()}; + WallpaperInfo info = { + relative_path.value(), WALLPAPER_LAYOUT_CENTER_CROPPED, + WallpaperType::kCustomized, base::Time::Now().LocalMidnight()}; ASSERT_TRUE(pref_manager_->SetUserWallpaperInfo(account_id, info)); } @@ -995,6 +999,92 @@ EXPECT_EQ(1, observer.colors_changed_count()); } +TEST_F(WallpaperControllerTest, ProminentColor_CachedColorsAvailableAtLogin) { + SetBypassDecode(); + // Cache some wallpapers and store that in the local prefs. Otherwise, we + // can't cache colors. + base::FilePath relative_path = PrecacheWallpapers(account_id_1); + WallpaperInfo info = InfoWithType(WallpaperType::kCustomized); + info.location = relative_path.value(); + ASSERT_TRUE(pref_manager_->SetLocalWallpaperInfo(account_id_1, info)); + + // Store colors in local prefs simulating cache behavior. + const std::vector<SkColor> prominent_colors = {SK_ColorGREEN, SK_ColorRED, + SK_ColorBLUE, SK_ColorWHITE, + SK_ColorWHITE, SK_ColorWHITE}; + pref_manager_->CacheProminentColors(account_id_1, prominent_colors); + const SkColor k_means_color = SK_ColorLTGRAY; + pref_manager_->CacheKMeanColor(account_id_1, k_means_color); + + // Reset to login screen. + GetSessionControllerClient()->RequestSignOut(); + + TestWallpaperControllerObserver observer(controller_); + ASSERT_EQ(0, observer.colors_changed_count()); + + // Show user wallpaper in login screen. We are *not* logged in yet. + controller_->ShowUserWallpaper(account_id_1, + user_manager::UserType::USER_TYPE_REGULAR); + task_environment()->RunUntilIdle(); + + // Showing a user wallpaper should cause the cached colors to be fetched and + // reported. + EXPECT_EQ(1, observer.colors_changed_count()); + + // DARK_VIBRANT happens to be prominent color 0. + EXPECT_EQ(SK_ColorGREEN, controller_->GetProminentColor( + {color_utils::LumaRange::DARK, + color_utils::SaturationRange::VIBRANT})); + EXPECT_EQ(k_means_color, controller_->GetKMeanColor()); +} + +TEST_F(WallpaperControllerTest, ProminentColor_ClearedBetweenUsers) { + SetBypassDecode(); + // Setup prominent colors for account 1. + base::FilePath relative_path = PrecacheWallpapers(account_id_1); + WallpaperInfo info = InfoWithType(WallpaperType::kCustomized); + info.location = relative_path.value(); + ASSERT_TRUE(pref_manager_->SetLocalWallpaperInfo(account_id_1, info)); + + const std::vector<SkColor> prominent_colors = {SK_ColorGREEN, SK_ColorRED, + SK_ColorBLUE, SK_ColorWHITE, + SK_ColorWHITE, SK_ColorWHITE}; + pref_manager_->CacheProminentColors(account_id_1, prominent_colors); + const SkColor k_means_color = SK_ColorLTGRAY; + pref_manager_->CacheKMeanColor(account_id_1, k_means_color); + + // Set a wallpaper for account 2. + WallpaperInfo info2 = InfoWithType(WallpaperType::kDefault); + ASSERT_TRUE(pref_manager_->SetLocalWallpaperInfo(account_id_2, info2)); + + // Reset to login screen. + GetSessionControllerClient()->RequestSignOut(); + + TestWallpaperControllerObserver observer(controller_); + + // Show wallpaper for account 1. + controller_->ShowUserWallpaper(account_id_1, + user_manager::UserType::USER_TYPE_REGULAR); + task_environment()->RunUntilIdle(); + + // Verify that we can retrieve the prominent color. + EXPECT_EQ(SK_ColorGREEN, controller_->GetProminentColor( + {color_utils::LumaRange::DARK, + color_utils::SaturationRange::VIBRANT})); + + // Show wallpaper for account 2. + controller_->ShowUserWallpaper(account_id_2, + user_manager::UserType::USER_TYPE_REGULAR); + task_environment()->RunUntilIdle(); + // Since account 2 has not cached colors, the prominent color should be + // invalid. + EXPECT_EQ( + kInvalidWallpaperColor, + controller_->GetProminentColor({color_utils::LumaRange::DARK, + color_utils::SaturationRange::VIBRANT})); + EXPECT_EQ(2, observer.colors_changed_count()); +} + TEST_F(WallpaperControllerTest, SetOnlineWallpaperFromDataSavesFile) { SetBypassDecode(); gfx::ImageSkia image = CreateImage(640, 480, kWallpaperColor);
diff --git a/ash/wallpaper/wallpaper_pref_manager.cc b/ash/wallpaper/wallpaper_pref_manager.cc index 4df9425..9a2ef87 100644 --- a/ash/wallpaper/wallpaper_pref_manager.cc +++ b/ash/wallpaper/wallpaper_pref_manager.cc
@@ -386,18 +386,13 @@ } absl::optional<std::vector<SkColor>> GetCachedProminentColors( - const AccountId& account_id) const override { - WallpaperInfo info; - if (!GetLocalWallpaperInfo(account_id, &info)) - return absl::nullopt; - + const base::StringPiece location) const override { // TODO(crbug.com/787134): When we can handle blank keys, remove this. - if (info.location.empty()) + if (location.empty()) return absl::nullopt; const base::Value::List* prominent_colors = - local_state_->GetValueDict(prefs::kWallpaperColors) - .FindList(info.location); + local_state_->GetValueDict(prefs::kWallpaperColors).FindList(location); if (!prominent_colors) return absl::nullopt; @@ -430,18 +425,14 @@ } absl::optional<SkColor> GetCachedKMeanColor( - const AccountId& account_id) const override { - WallpaperInfo info; - if (!GetLocalWallpaperInfo(account_id, &info)) - return absl::nullopt; - + const base::StringPiece location) const override { // TODO(crbug.com/787134): When we can handle blank keys, remove this. - if (info.location.empty()) + if (location.empty()) return absl::nullopt; const base::Value::Dict& k_mean_colors = local_state_->GetValueDict(prefs::kWallpaperMeanColors); - auto* k_mean_color_value = k_mean_colors.Find(info.location); + auto* k_mean_color_value = k_mean_colors.Find(location); if (!k_mean_color_value) return absl::nullopt; return static_cast<SkColor>(k_mean_color_value->GetDouble());
diff --git a/ash/wallpaper/wallpaper_pref_manager.h b/ash/wallpaper/wallpaper_pref_manager.h index 1d907e77..b4abfae 100644 --- a/ash/wallpaper/wallpaper_pref_manager.h +++ b/ash/wallpaper/wallpaper_pref_manager.h
@@ -17,6 +17,7 @@ #include "base/memory/weak_ptr.h" #include "base/observer_list.h" #include "base/observer_list_types.h" +#include "base/strings/string_piece.h" #include "base/time/time.h" #include "base/timer/wall_clock_timer.h" #include "components/account_id/account_id.h" @@ -111,14 +112,17 @@ virtual void RemoveProminentColors(const AccountId& account_id) = 0; + // Returns the cached prominent colors for a wallpaper with `location` if + // present. virtual absl::optional<std::vector<SkColor>> GetCachedProminentColors( - const AccountId& account_id) const = 0; + const base::StringPiece location) const = 0; virtual void CacheKMeanColor(const AccountId& account_id, SkColor k_mean_color) = 0; + // Returns the cached KMeans color value for the wallpaper at `location`. virtual absl::optional<SkColor> GetCachedKMeanColor( - const AccountId& account_id) const = 0; + const base::StringPiece location) const = 0; virtual void RemoveKMeanColor(const AccountId& account_id) = 0;
diff --git a/ash/wallpaper/wallpaper_pref_manager_unittest.cc b/ash/wallpaper/wallpaper_pref_manager_unittest.cc index b9e9e10f..4915739b 100644 --- a/ash/wallpaper/wallpaper_pref_manager_unittest.cc +++ b/ash/wallpaper/wallpaper_pref_manager_unittest.cc
@@ -355,5 +355,38 @@ Lt(base::Hours(22) + base::Minutes(1)))); } +TEST_F(WallpaperPrefManagerTest, CacheProminentColors) { + profile_helper_->RegisterPrefsForAccount(account_id_1); + + WallpaperInfo info = InfoWithType(WallpaperType::kCustomized); + + const char location[] = "/test/location"; + info.location = location; + + EXPECT_TRUE(pref_manager_->SetUserWallpaperInfo(account_id_1, info)); + + const std::vector<SkColor> expected_colors = { + SK_ColorGREEN, SK_ColorGREEN, SK_ColorGREEN, + SkColorSetRGB(0xAB, 0xBC, 0xEF)}; + + pref_manager_->CacheProminentColors(account_id_1, expected_colors); + EXPECT_EQ(expected_colors, + *pref_manager_->GetCachedProminentColors(location)); +} + +TEST_F(WallpaperPrefManagerTest, CacheKMeansColor) { + profile_helper_->RegisterPrefsForAccount(account_id_1); + + WallpaperInfo info = InfoWithType(WallpaperType::kCustomized); + const char location[] = "/test/location"; + info.location = location; + EXPECT_TRUE(pref_manager_->SetUserWallpaperInfo(account_id_1, info)); + + const SkColor expected_color = SkColorSetRGB(0xAB, 0xBC, 0xEF); + + pref_manager_->CacheKMeanColor(account_id_1, expected_color); + EXPECT_EQ(expected_color, *pref_manager_->GetCachedKMeanColor(location)); +} + } // namespace } // namespace ash
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_af.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_af.xtb index 1770486..b9bf5b1 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_af.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_af.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Skandeer strepieskode</translation> <translation id="3892148308691398805">Kopieer teks</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Laai tans dokumentskanderingkenmerk af</translation> <translation id="4118525110028899586">Onderbreek opname</translation> <translation id="4121305183798804752">Dokument bespeur</translation> <translation id="414641094616694804">Hierdie kamera kan nie resolusie verander nie</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Jou kamera is tans nie beskikbaar nie. Kyk asseblief of die kamera behoorlik gekoppel is.</translation> <translation id="5163387177077603948">Beweeg tans na regs</translation> -<translation id="520537883758714667">Dokumentskandering is nou beskikbaar</translation> <translation id="5235304959032763950">16 tot 9</translation> <translation id="5266635337630551423">Dokument se hoek links bo</translation> <translation id="5317780077021120954">Berg</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_am.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_am.xtb index 845debc..a3bc215 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_am.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_am.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">የአሞሌ ኮድ ይቃኙ</translation> <translation id="3892148308691398805">ጽሑፍ ቅዳ</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> ሜፒ</translation> -<translation id="4096701159033358951">የሰነድ መቃኘት ባህሪን በማውረድ ላይ</translation> <translation id="4118525110028899586">ቀረጻን ለአፍታ አቁም</translation> <translation id="4121305183798804752">ሰነድ ተገኝቷል</translation> <translation id="414641094616694804">ይህ ካሜራ ጥራትን መቀየር አይችልም</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">የእርስዎ ካሜራ በአሁኑ ጊዜ አይገኝም። ካሜራው በትክክል ተገናኝቶ ከሆነ እባክዎ ይፈትሹ።</translation> <translation id="5163387177077603948">ወደ ቀኝ አቅጣጫ በመንቀሳቀስ ላይ</translation> -<translation id="520537883758714667">የሰነድ ቅኝት አሁን ይገኛል</translation> <translation id="5235304959032763950">16 ለ9</translation> <translation id="5266635337630551423">የሰነድ ከላይ-ግራ ጥግ</translation> <translation id="5317780077021120954">አስቀምጥ</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ar.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ar.xtb index 426a4d7..a439f47 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ar.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ar.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">مسح الرمز الشريطي ضوئيًا</translation> <translation id="3892148308691398805">نسخ النص</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> ميغا بكسل</translation> -<translation id="4096701159033358951">جارٍ تنزيل ميزة المسح الضوئي للمستندات</translation> <translation id="4118525110028899586">إيقاف التسجيل مؤقتًا</translation> <translation id="4121305183798804752">تم رصد مستند.</translation> <translation id="414641094616694804">لا يمكن تغيير درجة الدقة في هذه الكاميرا.</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">الكاميرا غير مُتاحة حاليًا. يُرجى التحقُّق من اتصال الكاميرا بشكلٍ صحيح.</translation> <translation id="5163387177077603948">جارٍ نقل زاوية المستند في اتجاه اليمين</translation> -<translation id="520537883758714667">تتوفّر الآن ميزة مسح المستندات ضوئيًا.</translation> <translation id="5235304959032763950">16 إلى 9</translation> <translation id="5266635337630551423">الزاوية العلوية اليسرى للمستند</translation> <translation id="5317780077021120954">حفظ</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_as.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_as.xtb index 823e29fd..e3e7124 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_as.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_as.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">বাৰক’ড স্কেন কৰক</translation> <translation id="3892148308691398805">পাঠৰ প্ৰতিলিপি কৰক</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> মেগাপিক্সেল</translation> -<translation id="4096701159033358951">নথি স্কেন কৰাৰ সুবিধাটো ডাউনল’ড কৰি থকা হৈছে</translation> <translation id="4118525110028899586">ৰেকৰ্ডিং পজ কৰক</translation> <translation id="4121305183798804752">নথিখন চিনাক্ত কৰা হৈছে</translation> <translation id="414641094616694804">এই কেমেৰাটোৱে ৰিজ’লিউশ্বন সলনি কৰিব নোৱাৰে</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">আপোনাৰ কেমেৰা বৰ্তমান উপলব্ধ নহয়। অনুগ্ৰহ কৰি কেমেৰাটো সঠিক ধৰণে সংযুক্ত হৈ আছেনে নাই পৰীক্ষা কৰক।</translation> <translation id="5163387177077603948">সোঁফাললৈ গতি কৰি আছে</translation> -<translation id="520537883758714667">এতিয়া নথি স্কেন কৰাৰ সুবিধাটো উপলব্ধ</translation> <translation id="5235304959032763950">১৬:৯</translation> <translation id="5266635337630551423">নথিৰ একেবাৰে ওপৰৰ বাওঁফালৰ চুক</translation> <translation id="5317780077021120954">ছেভ কৰক</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_az.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_az.xtb index 8d79cf5..9cce9db 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_az.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_az.xtb
@@ -70,7 +70,6 @@ <translation id="3838931309141338733">Barkodu skan edin</translation> <translation id="3892148308691398805">Mətni kopyalayın</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Sənəd skanlama funksiyası endirilir</translation> <translation id="4118525110028899586">Səsi yazmağa fasilə verin</translation> <translation id="4121305183798804752">Sənəd aşkar edilib</translation> <translation id="414641094616694804">Bu kamera ayırdetmə dəqiqliyini dəyişə bilmir</translation> @@ -92,7 +91,6 @@ <translation id="5057360777601936059">Kamera hazırda əlçatan deyil. Kameranın düzgün qoşulub-qoşulmadığını yoxlayın.</translation> <translation id="5163387177077603948">Sağ tərəfə daşınır</translation> -<translation id="520537883758714667">Sənəd skanlama əlçatan deyil</translation> <translation id="5235304959032763950">16-9</translation> <translation id="5266635337630551423">Sənədin yuxarı sol küncü</translation> <translation id="5317780077021120954">Yadda saxlayın</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_be.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_be.xtb index 6cbaf39..7b866a89 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_be.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_be.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Сканіраваць штрыхкод</translation> <translation id="3892148308691398805">Скапіраваць тэкст</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> Мпікс</translation> -<translation id="4096701159033358951">Ідзе спампоўванне функцыі для сканіравання дакументаў</translation> <translation id="4118525110028899586">Прыпыніць запіс</translation> <translation id="4121305183798804752">Выяўлены дакумент</translation> <translation id="414641094616694804">Гэта камера не можа змяняць раздзяляльнасць</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Камера недаступная. Праверце правільнасць яе падключэння.</translation> <translation id="5163387177077603948">Перамяшчаецца ўправа</translation> -<translation id="520537883758714667">Функцыя сканіравання дакументаў даступная</translation> <translation id="5235304959032763950">16 на 9</translation> <translation id="5266635337630551423">Левы верхні вугал дакумента</translation> <translation id="5317780077021120954">Захаваць</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_bg.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_bg.xtb index b857413..bd7635f 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_bg.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_bg.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Сканиране на баркод</translation> <translation id="3892148308691398805">Копиране на текста</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> мегапиксела</translation> -<translation id="4096701159033358951">Функцията за сканиране на документи се изтегля</translation> <translation id="4118525110028899586">Пауза на записа</translation> <translation id="4121305183798804752">Открит е документ</translation> <translation id="414641094616694804">Разделителната способност на тази камера не може да се променя</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Понастоящем няма достъп до камерата ви. Моля, проверете дали камерата е свързана правилно.</translation> <translation id="5163387177077603948">Премества се надясно</translation> -<translation id="520537883758714667">Функцията за сканиране на документи вече е налице</translation> <translation id="5235304959032763950">16:9</translation> <translation id="5266635337630551423">Горен ляв ъгъл на документа</translation> <translation id="5317780077021120954">Запазване</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_bn.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_bn.xtb index f89b0c5..99a7ae61 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_bn.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_bn.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">বারকোড স্ক্যান করুন</translation> <translation id="3892148308691398805">টেক্সট কপি করুন</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> এমপি</translation> -<translation id="4096701159033358951">ডকুমেন্ট স্ক্যান করার ফিচার ডাউনলোড হচ্ছে</translation> <translation id="4118525110028899586">রেকর্ডিং পজ করুন</translation> <translation id="4121305183798804752">ডকুমেন্ট শনাক্ত হয়েছে</translation> <translation id="414641094616694804">এই ক্যামেরা রেজোলিউশন পরিবর্তন করতে পারে না</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">আপনার ক্যামেরা বর্তমানে উপলভ্য নেই। ক্যামেরা ঠিকভাবে কানেক্ট করা আছে কিনা দেখুন।</translation> <translation id="5163387177077603948">ডানদিকে সরানো হচ্ছে</translation> -<translation id="520537883758714667">এখন ডকুমেন্ট স্ক্যান করা উপলভ্য</translation> <translation id="5235304959032763950">১৬ থেকে ৯</translation> <translation id="5266635337630551423">উপরে-বাঁদিকের কোণার ডকুমেন্ট</translation> <translation id="5317780077021120954">সেভ করুন</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_bs.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_bs.xtb index c87cae6..d4cb1856 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_bs.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_bs.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Skeniraj bar kôd</translation> <translation id="3892148308691398805">Kopiraj tekst</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Preuzimanje funkcije za skeniranje dokumenata</translation> <translation id="4118525110028899586">Pauziraj snimanje</translation> <translation id="4121305183798804752">Otkriven je dokument</translation> <translation id="414641094616694804">Nije moguće promijeniti rezoluciju ove kamere</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Kamera je trenutno nedostupna. Provjerite je li kamera pravilno povezana.</translation> <translation id="5163387177077603948">Pomjeranje udesno</translation> -<translation id="520537883758714667">Skeniranje dokumenta je sada dostupno</translation> <translation id="5235304959032763950">16 naprema 9</translation> <translation id="5266635337630551423">Gornji lijevi ugao dokumenta</translation> <translation id="5317780077021120954">Sačuvaj</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ca.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ca.xtb index 5c96b6821..29ac095 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ca.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ca.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Escaneja el codi de barres</translation> <translation id="3892148308691398805">Copia el text</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> Mpx</translation> -<translation id="4096701159033358951">S'està baixant la funció d'escaneig de documents</translation> <translation id="4118525110028899586">Posa en pausa la gravació</translation> <translation id="4121305183798804752">S'ha detectat un document</translation> <translation id="414641094616694804">Aquesta càmera no pot canviar la resolució</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">La càmera no està disponible en aquest moment. Comprova que estigui ben connectada.</translation> <translation id="5163387177077603948">S'està movent cap a la dreta</translation> -<translation id="520537883758714667">L'escaneig de documents ja està disponible</translation> <translation id="5235304959032763950">16:9</translation> <translation id="5266635337630551423">Extrem superior esquerre del document</translation> <translation id="5317780077021120954">Desa</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_cs.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_cs.xtb index 84720a9c..70f4f6f 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_cs.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_cs.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Skenovat čárový kód</translation> <translation id="3892148308691398805">Kopírovat text</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> Mpx</translation> -<translation id="4096701159033358951">Stahování funkce skenování dokumentů</translation> <translation id="4118525110028899586">Pozastavit nahrávání</translation> <translation id="4121305183798804752">Byl zjištěn dokument</translation> <translation id="414641094616694804">Rozlišení této kamery nelze změnit</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Fotoaparát momentálně není dostupný. Zkontrolujte, zda je fotoaparát správně připojen.</translation> <translation id="5163387177077603948">Pohyb doprava</translation> -<translation id="520537883758714667">Nově je k dispozici skenování dokumentů</translation> <translation id="5235304959032763950">16 : 9</translation> <translation id="5266635337630551423">Levý horní roh dokumentu</translation> <translation id="5317780077021120954">Uložit</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_cy.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_cy.xtb index 02373bc..802f3ac 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_cy.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_cy.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Sganio cod bar</translation> <translation id="3892148308691398805">Copïo'r testun</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Wrthi'n lawrlwytho'r nodwedd sganio dogfennau</translation> <translation id="4118525110028899586">Seibio recordio</translation> <translation id="4121305183798804752">Mae dogfen wedi'i chanfod</translation> <translation id="414641094616694804">Ni all y camera hwn newid cydraniad</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Nid yw'ch camera ar gael ar hyn o bryd. Gwiriwch a yw'r camera wedi'i gysylltu'n iawn.</translation> <translation id="5163387177077603948">Yn symud i'r cyfeiriad de</translation> -<translation id="520537883758714667">Mae sganio dogfennau bellach ar gael</translation> <translation id="5235304959032763950">16 i 9</translation> <translation id="5266635337630551423">Cornel chwith uchaf y ddogfen</translation> <translation id="5317780077021120954">Cadw</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_da.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_da.xtb index 5007d7c..0e2fefaaa 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_da.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_da.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Scan stregkode</translation> <translation id="3892148308691398805">Kopiér tekst</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Downloader funktionen til dokumentscanning</translation> <translation id="4118525110028899586">Sæt optagelsen på pause</translation> <translation id="4121305183798804752">Et dokument blev registreret</translation> <translation id="414641094616694804">Dette kamera kan ikke ændre opløsning</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Dit kamera er ikke tilgængeligt lige nu. Tjek, om kameraet er tilsluttet korrekt.</translation> <translation id="5163387177077603948">Flyttes mod højre</translation> -<translation id="520537883758714667">Det er nu muligt at scanne dokumenter</translation> <translation id="5235304959032763950">16 til 9</translation> <translation id="5266635337630551423">Dokumentets øverste venstre hjørne</translation> <translation id="5317780077021120954">Gem</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_de.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_de.xtb index 6adec809..ccfaafa4 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_de.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_de.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Barcode scannen</translation> <translation id="3892148308691398805">Text kopieren</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Funktion zum Scannen von Dokumenten wird heruntergeladen</translation> <translation id="4118525110028899586">Aufnahme pausieren</translation> <translation id="4121305183798804752">Dokument erkannt</translation> <translation id="414641094616694804">Diese Kamera kann die Auflösung nicht ändern</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Deine Kamera ist zurzeit nicht verfügbar. Bitte überprüfe, ob die Kamera richtig verbunden ist.</translation> <translation id="5163387177077603948">Wird nach rechts verschoben</translation> -<translation id="520537883758714667">Scannen von Dokumenten jetzt verfügbar</translation> <translation id="5235304959032763950">16 zu 9</translation> <translation id="5266635337630551423">Linke obere Ecke des Dokuments</translation> <translation id="5317780077021120954">Speichern</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_el.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_el.xtb index 4f4a2828..80d2c94 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_el.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_el.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Σάρωση γραμμωτού κώδικα</translation> <translation id="3892148308691398805">Αντιγραφή κειμένου</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Λήψη λειτουργίας σάρωσης εγγράφων</translation> <translation id="4118525110028899586">Παύση εγγραφής</translation> <translation id="4121305183798804752">Εντοπίστηκε έγγραφο.</translation> <translation id="414641094616694804">Δεν είναι δυνατή η αλλαγή ανάλυσης αυτής της κάμερας</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Η κάμερά σας δεν είναι διαθέσιμη προς το παρόν. Ελέγξτε εάν η κάμερα έχει συνδεθεί σωστά.</translation> <translation id="5163387177077603948">Μετακινείται με κατεύθυνση προς τα δεξιά</translation> -<translation id="520537883758714667">Η σάρωση εγγράφων είναι πλέον διαθέσιμη</translation> <translation id="5235304959032763950">16 προς 9</translation> <translation id="5266635337630551423">Επάνω αριστερή γωνία του εγγράφου</translation> <translation id="5317780077021120954">Αποθήκευση</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_en-GB.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_en-GB.xtb index b997283ab..016a54cc 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_en-GB.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_en-GB.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Scan barcode</translation> <translation id="3892148308691398805">Copy text</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Downloading document scanning feature</translation> <translation id="4118525110028899586">Pause recording</translation> <translation id="4121305183798804752">Document detected</translation> <translation id="414641094616694804">This camera cannot change resolution</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Your camera is currently unavailable. Please check if the camera is properly connected.</translation> <translation id="5163387177077603948">Moving in right direction</translation> -<translation id="520537883758714667">Document scanning now available</translation> <translation id="5235304959032763950">16 to 9</translation> <translation id="5266635337630551423">Document top-left corner</translation> <translation id="5317780077021120954">Save</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_es-419.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_es-419.xtb index 1edeb5a..e478110 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_es-419.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_es-419.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Escanear el código de barras</translation> <translation id="3892148308691398805">Copiar texto</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Descargando la función para escanear documentos</translation> <translation id="4118525110028899586">Pausar la grabación</translation> <translation id="4121305183798804752">Se detectó un documento</translation> <translation id="414641094616694804">No se puede modificar la resolución de la cámara</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">La cámara no está disponible en este momento. Asegúrate de que esté conectada de forma correcta.</translation> <translation id="5163387177077603948">Se está moviendo hacia la derecha</translation> -<translation id="520537883758714667">La función para escanear documentos ya está disponible.</translation> <translation id="5235304959032763950">16:9</translation> <translation id="5266635337630551423">Esquina superior izquierda del documento</translation> <translation id="5317780077021120954">Guardar</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_es.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_es.xtb index 5eb20d9..95b85e4 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_es.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_es.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Escanear código de barras</translation> <translation id="3892148308691398805">Copiar texto</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Descargando función de escanear documentos</translation> <translation id="4118525110028899586">Pausar grabación</translation> <translation id="4121305183798804752">Documento detectado</translation> <translation id="414641094616694804">Esta cámara no puede cambiar de resolución</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Tu cámara no está disponible en este momento. Comprueba si está conectada correctamente.</translation> <translation id="5163387177077603948">Moviendo hacia la derecha</translation> -<translation id="520537883758714667">La función para escanear documentos ya está disponible</translation> <translation id="5235304959032763950">16 a 9</translation> <translation id="5266635337630551423">Esquina superior izquierda del documento</translation> <translation id="5317780077021120954">Guardar</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_et.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_et.xtb index 928c37e3..5a99895 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_et.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_et.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Skannige ribakood</translation> <translation id="3892148308691398805">Kopeeri tekst</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Dokumentide skannimise funktsiooni allalaadimine</translation> <translation id="4118525110028899586">Peata salvestamine</translation> <translation id="4121305183798804752">Tuvastati dokument</translation> <translation id="414641094616694804">See kaamera ei saa eraldusvõimet muuta</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Teie kaamera pole praegu saadaval. Kontrollige, kas kaamera on korralikult ühendatud.</translation> <translation id="5163387177077603948">Liigub paremale</translation> -<translation id="520537883758714667">Dokumendiskannimine on nüüd saadaval</translation> <translation id="5235304959032763950">16 : 9</translation> <translation id="5266635337630551423">Dokumendi vasak ülanurk</translation> <translation id="5317780077021120954">Salvesta</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_eu.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_eu.xtb index a3494a1..831799e 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_eu.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_eu.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Eskaneatu barra-kodea</translation> <translation id="3892148308691398805">Kopiatu testua</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Dokumentuak eskaneatzeko eginbidea deskargatzen</translation> <translation id="4118525110028899586">Pausatu grabaketa</translation> <translation id="4121305183798804752">Hauteman egin da dokumentua</translation> <translation id="414641094616694804">Kamerak ezin du aldatu bereizmena</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Kamera ez dago erabilgarri une honetan. Egiaztatu kamera ongi konektatuta dagoela.</translation> <translation id="5163387177077603948">Eskuinera mugitzen ari da</translation> -<translation id="520537883758714667">Dokumentuak eskaneatzeko eginbidea eskuragarri dago</translation> <translation id="5235304959032763950">16:9</translation> <translation id="5266635337630551423">Dokumentuaren goiko ezkerraldeko ertza</translation> <translation id="5317780077021120954">Gorde</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_fa.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_fa.xtb index 6b67dc0..172495a 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_fa.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_fa.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">اسکن بارکد</translation> <translation id="3892148308691398805">کپی کردن نوشتار</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> مگاپیکسل</translation> -<translation id="4096701159033358951">درحال بارگیری ویژگی اسکن کردن سند</translation> <translation id="4118525110028899586">توقف موقت ضبط</translation> <translation id="4121305183798804752">سند شناسایی شد</translation> <translation id="414641094616694804">نمیتوان وضوح این دوربین را تغییر داد</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">درحالحاضر دوربینتان دردسترس نیست. مطمئن شوید دوربین درست وصل شده باشد.</translation> <translation id="5163387177077603948">درحال انتقال بهسمت راست</translation> -<translation id="520537883758714667">اسکن سند اکنون دردسترس است</translation> <translation id="5235304959032763950">۱۶ به ۹</translation> <translation id="5266635337630551423">گوشه بالا سمت چپ سند</translation> <translation id="5317780077021120954">ذخیره</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_fi.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_fi.xtb index e07d8a8b..14bb029 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_fi.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_fi.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Skannaa viivakoodi</translation> <translation id="3892148308691398805">Kopioi teksti</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> Mpx</translation> -<translation id="4096701159033358951">Ladataan dokumenttien skannausominaisuutta</translation> <translation id="4118525110028899586">Keskeytä tallennus</translation> <translation id="4121305183798804752">Dokumentti havaittiin</translation> <translation id="414641094616694804">Kamera ei voi muuttaa resoluutiota</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Kamerasi ei ole käytettävissä tällä hetkellä. Tarkista, onko kamera yhdistetty oikein.</translation> <translation id="5163387177077603948">Siirretään oikealle</translation> -<translation id="520537883758714667">Dokumenttien skannaus on nyt saatavilla</translation> <translation id="5235304959032763950">Kuvasuhde 16:9</translation> <translation id="5266635337630551423">Dokumentin vasen yläkulma</translation> <translation id="5317780077021120954">Tallenna</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_fil.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_fil.xtb index be4dffc..18eb535 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_fil.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_fil.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">I-scan ang barcode</translation> <translation id="3892148308691398805">Kopyahin ang text</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Dina-download ang feature na pag-scan ng dokumento</translation> <translation id="4118525110028899586">I-pause ang pag-record</translation> <translation id="4121305183798804752">Na-detect ang dokumento</translation> <translation id="414641094616694804">Hindi puwedeng baguhin ng camera na ito ang resolution</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Kasalukuyang hindi available ang iyong camera. Pakitingnan kung maayos na nakakonekta ang camera.</translation> <translation id="5163387177077603948">Gumagalaw pakanan</translation> -<translation id="520537883758714667">Available na ang pag-scan ng dokumento</translation> <translation id="5235304959032763950">16:9</translation> <translation id="5266635337630551423">Kaliwang sulok sa itaas ng dokumento</translation> <translation id="5317780077021120954">I-save</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_fr-CA.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_fr-CA.xtb index 0c94eff..c81cb681 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_fr-CA.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_fr-CA.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Numériser le code-barres</translation> <translation id="3892148308691398805">Copier le texte</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> Mpx</translation> -<translation id="4096701159033358951">Téléchargement de la fonctionnalité de numérisation de documents en cours…</translation> <translation id="4118525110028899586">Interrompre l'enregistrement</translation> <translation id="4121305183798804752">Document détecté</translation> <translation id="414641094616694804">La résolution de cette caméra n'est pas modifiable</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Votre appareil photo n'est pas accessible pour le moment. Veuillez vérifier si l'appareil photo est connecté correctement.</translation> <translation id="5163387177077603948">Déplacement vers la droite</translation> -<translation id="520537883758714667">Numérisation de documents désormais disponible</translation> <translation id="5235304959032763950">16 sur 9</translation> <translation id="5266635337630551423">Coin supérieur gauche du document</translation> <translation id="5317780077021120954">Enregistrer</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_fr.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_fr.xtb index 0c2278e..4c9f6c29 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_fr.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_fr.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Lire le code-barres</translation> <translation id="3892148308691398805">Copier le texte</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> Mpx</translation> -<translation id="4096701159033358951">Téléchargement de la fonctionnalité de numérisation de documents</translation> <translation id="4118525110028899586">Suspendre l'enregistrement</translation> <translation id="4121305183798804752">Document détecté</translation> <translation id="414641094616694804">Impossible de modifier la résolution de cet appareil photo</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Votre appareil photo est actuellement indisponible. Vérifiez qu'il est bien connecté.</translation> <translation id="5163387177077603948">Déplacement vers la droite</translation> -<translation id="520537883758714667">Numérisation de documents désormais disponible</translation> <translation id="5235304959032763950">Seize neuvièmes</translation> <translation id="5266635337630551423">Angle supérieur gauche du document</translation> <translation id="5317780077021120954">Enregistrer</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_gl.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_gl.xtb index ffaa83f9..026325fa 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_gl.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_gl.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Escanear código de barras</translation> <translation id="3892148308691398805">Copiar texto</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> Mpx</translation> -<translation id="4096701159033358951">Descargando función de análise de documentos</translation> <translation id="4118525110028899586">Pór gravación en pausa</translation> <translation id="4121305183798804752">Detectouse un documento</translation> <translation id="414641094616694804">Esta cámara non pode cambiar a resolución</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">A cámara non está dispoñible nestes momentos. Comproba se está conectada correctamente.</translation> <translation id="5163387177077603948">Desprazándose cara á dereita</translation> -<translation id="520537883758714667">O escaneado de documentos xa está dispoñible</translation> <translation id="5235304959032763950">16 a 9</translation> <translation id="5266635337630551423">Esquina superior esquerda do documento</translation> <translation id="5317780077021120954">Gardar</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_gu.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_gu.xtb index 81b9da6..a6aa197 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_gu.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_gu.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">બારકોડ સ્કૅન કરો</translation> <translation id="3892148308691398805">ટેક્સ્ટ કૉપિ કરો</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">દસ્તાવેજ સ્કૅનિંગ સુવિધા ડાઉનલોડ કરી રહ્યાં છીએ</translation> <translation id="4118525110028899586">રેકોર્ડિંગ થોભાવો</translation> <translation id="4121305183798804752">દસ્તાવેજની ભાળ મળી</translation> <translation id="414641094616694804">આ કૅમેરા રિઝોલ્યુશનમાં ફેરફાર કરી શકતો નથી</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">તમારો કૅમેરા હાલમાં ઉપલબ્ધ નથી. કૃપા કરીને તપાસો કે કૅમેરા યોગ્ય રીતે કનેક્ટ થયેલો છે.</translation> <translation id="5163387177077603948">જમણી દિશામાં ખસેડી રહ્યાં છીએ</translation> -<translation id="520537883758714667">દસ્તાવેજ સ્કૅન કરવાની સુવિધા હવે ઉપલબ્ધ છે</translation> <translation id="5235304959032763950">16 જેમ 9</translation> <translation id="5266635337630551423">દસ્તાવેજનો સૌથી ઉપરનો ડાબો ખૂણો</translation> <translation id="5317780077021120954">સાચવો</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_hi.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_hi.xtb index 7658708a..331ebd8 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_hi.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_hi.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">बारकोड स्कैन करें</translation> <translation id="3892148308691398805">टेक्स्ट कॉपी करें</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> एमपी</translation> -<translation id="4096701159033358951">दस्तावेज़ स्कैन करने की सुविधा डाउनलोड हो रही है</translation> <translation id="4118525110028899586">रिकॉर्डिंग रोकें</translation> <translation id="4121305183798804752">दस्तावेज़ मिल गया है</translation> <translation id="414641094616694804">कैमरे का रिज़ॉल्यूशन नहीं बदला जा सकता</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">फ़िलहाल आपका कैमरा उपलब्ध नहीं है. कृपया देखें कि कैमरा ठीक तरह से कनेक्ट है या नहीं.</translation> <translation id="5163387177077603948">दाईं ओर जा रहा है</translation> -<translation id="520537883758714667">दस्तावेज़ को स्कैन करने की सुविधा अब उपलब्ध है</translation> <translation id="5235304959032763950">16:9</translation> <translation id="5266635337630551423">दस्तावेज़ का सबसे ऊपर वाला बायां कोना</translation> <translation id="5317780077021120954">सेव करें</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_hr.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_hr.xtb index 22f45ec6..e3dec67 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_hr.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_hr.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Skenirajte crtični kôd</translation> <translation id="3892148308691398805">Kopiranje teksta</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Preuzimanje značajke skeniranja dokumenata</translation> <translation id="4118525110028899586">Pauziraj snimanje</translation> <translation id="4121305183798804752">Otkriven je dokument</translation> <translation id="414641094616694804">Za ovu se kameru ne može promijeniti razlučivost</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Vaš fotoaparat trenutačno nije dostupan. Provjerite je li fotoaparat pravilno povezan.</translation> <translation id="5163387177077603948">Kreće se udesno</translation> -<translation id="520537883758714667">Sad je dostupno skeniranje dokumenata</translation> <translation id="5235304959032763950">16 naprema 9</translation> <translation id="5266635337630551423">Gornji lijevi kut dokumenta</translation> <translation id="5317780077021120954">Spremi</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_hu.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_hu.xtb index 0ed5ec8..040e57a 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_hu.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_hu.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Vonalkód beolvasása</translation> <translation id="3892148308691398805">Szöveg másolása</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Dokumentumbeolvasási funkció letöltése</translation> <translation id="4118525110028899586">Felvétel szüneteltetése</translation> <translation id="4121305183798804752">Dokumentum észlelve</translation> <translation id="414641094616694804">A kamera felbontását nem lehet módosítani</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">A kamera jelenleg nem használható. Ellenőrizze, hogy a kamera megfelelően van-e csatlakoztatva.</translation> <translation id="5163387177077603948">Mozgatás jobb oldali irányba</translation> -<translation id="520537883758714667">A dokumentumbeolvasás már használható</translation> <translation id="5235304959032763950">16:9</translation> <translation id="5266635337630551423">Dokumentum bal felső sarka</translation> <translation id="5317780077021120954">Mentés</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_hy.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_hy.xtb index ae4b5c6..4538e895 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_hy.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_hy.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Սկանավորել գծակոդը</translation> <translation id="3892148308691398805">Պատճենել տեքստը</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> ՄՊ</translation> -<translation id="4096701159033358951">Փաստաթղթերի սկանավորման գործառույթի ներբեռնում</translation> <translation id="4118525110028899586">Դադարեցնել տեսագրումը</translation> <translation id="4121305183798804752">Փաստաթուղթը ջնջված է</translation> <translation id="414641094616694804">Այս տեսախցիկի լուծաչափը հնարավոր չէ փոխել</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Ձեր տեսախցիկն այս պահին հասանելի չէ: Ստուգեք՝ արդյոք տեսախցիկը ճիշտ է միացված:</translation> <translation id="5163387177077603948">Տեղափոխվում է աջ</translation> -<translation id="520537883758714667">Փաստաթղթերի սկանավորումն արդեն հասանելի է</translation> <translation id="5235304959032763950">16:9</translation> <translation id="5266635337630551423">Փաստաթղթի վերևի ձախ անկյուն</translation> <translation id="5317780077021120954">Պահել</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_id.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_id.xtb index a98772b..b49ca412 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_id.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_id.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Pindai kode batang</translation> <translation id="3892148308691398805">Salin teks</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Mendownload fitur pemindaian dokumen</translation> <translation id="4118525110028899586">Jeda rekaman</translation> <translation id="4121305183798804752">Dokumen terdeteksi</translation> <translation id="414641094616694804">Kamera ini tidak dapat mengubah resolusi</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Kamera tidak tersedia untuk saat ini. Periksa apakah kamera terhubung dengan benar.</translation> <translation id="5163387177077603948">Berpindah ke arah kanan</translation> -<translation id="520537883758714667">Pemindaian dokumen kini tersedia</translation> <translation id="5235304959032763950">16 banding 9</translation> <translation id="5266635337630551423">Pojok kiri atas dokumen</translation> <translation id="5317780077021120954">Simpan</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_is.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_is.xtb index 28c09890..36ad84e 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_is.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_is.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Skanna strikamerki</translation> <translation id="3892148308691398805">Afrita texta</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Sækir eiginleika til að skanna skjöl</translation> <translation id="4118525110028899586">Gera hlé á upptöku</translation> <translation id="4121305183798804752">Skjal greindist</translation> <translation id="414641094616694804">Myndavélin getur ekki breytt upplausn</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Ekki er hægt að nota myndavélina eins og er. Athugaðu hvort myndavélin er rétt tengd.</translation> <translation id="5163387177077603948">Færist til hægri</translation> -<translation id="520537883758714667">Nú er skjalaskönnun í boði</translation> <translation id="5235304959032763950">16 á móti 9</translation> <translation id="5266635337630551423">Efra, vinstra horn skjals</translation> <translation id="5317780077021120954">Vista</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_it.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_it.xtb index fbaac23f..cc42fe7 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_it.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_it.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Scansiona il codice a barre</translation> <translation id="3892148308691398805">Copia testo</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Download funzionalità di scansione documenti in corso…</translation> <translation id="4118525110028899586">Metti in pausa la registrazione</translation> <translation id="4121305183798804752">Documento rilevato</translation> <translation id="414641094616694804">Non è possibile modificare la risoluzione di questa fotocamera</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">La tua fotocamera non è attualmente disponibile. Controlla se la fotocamera è collegata correttamente.</translation> <translation id="5163387177077603948">Spostamento a destra</translation> -<translation id="520537883758714667">Ora è disponibile la scansione di documenti</translation> <translation id="5235304959032763950">16 su 9</translation> <translation id="5266635337630551423">Angolo superiore sinistro del documento</translation> <translation id="5317780077021120954">Salva</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_iw.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_iw.xtb index 851e425..7e6c4dd 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_iw.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_iw.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">סריקת ברקוד</translation> <translation id="3892148308691398805">העתקת הטקסט</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">מתבצעת הורדה של תכונה לסריקת מסמכים</translation> <translation id="4118525110028899586">השהיית ההקלטה</translation> <translation id="4121305183798804752">זוהה מסמך</translation> <translation id="414641094616694804">המצלמה הזו לא יכולה לשנות את הרזולוציה</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">המצלמה אינה זמינה כרגע. יש לבדוק אם המצלמה מחוברת כראוי.</translation> <translation id="5163387177077603948">מתבצעת תזוזה לימין</translation> -<translation id="520537883758714667">התכונה 'סריקת מסמכים' זמינה עכשיו</translation> <translation id="5235304959032763950">16 על 9</translation> <translation id="5266635337630551423">הפינה הימנית העליונה במסמך</translation> <translation id="5317780077021120954">שמירה</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ja.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ja.xtb index ee2f66a1..315ad1ed 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ja.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ja.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">バーコード スキャン</translation> <translation id="3892148308691398805">テキストをコピー</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">ドキュメント スキャンの機能をダウンロードしています</translation> <translation id="4118525110028899586">録画を一時停止</translation> <translation id="4121305183798804752">ドキュメントを検出しました</translation> <translation id="414641094616694804">このカメラでは解像度を変更できません</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">カメラを使用できません。 カメラが正しく接続されているかご確認ください。</translation> <translation id="5163387177077603948">右側に移動しています</translation> -<translation id="520537883758714667">ドキュメント スキャンをご利用いただけるようになりました</translation> <translation id="5235304959032763950">16 対 9</translation> <translation id="5266635337630551423">ドキュメントの左上の角</translation> <translation id="5317780077021120954">保存</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ka.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ka.xtb index 7aa2c90..1a09d5e4 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ka.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ka.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">შტრიხკოდის სკანირება</translation> <translation id="3892148308691398805">ტექსტის კოპირება</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> მპ</translation> -<translation id="4096701159033358951">მიმდინარეობს დოკუმენტების სკანირების ფუნქციის ჩამოტვირთვა</translation> <translation id="4118525110028899586">ჩაწერის დაპაუზება</translation> <translation id="4121305183798804752">დოკუმენტი აღმოჩენილია</translation> <translation id="414641094616694804">ამ კამერის გარჩევადობა ვერ შეიცვლება</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">თქვენი კამერა ამჟამად მიუწვდომელია. შეამოწმეთ, რომ კამერა სწორად არის დაკავშირებული.</translation> <translation id="5163387177077603948">გადატანა ხდება მარჯვენა მიმართულებით</translation> -<translation id="520537883758714667">ამიერიდან ხელმისაწვდომია დოკუმენტების სკანირების ფუნქცია</translation> <translation id="5235304959032763950">თექვსმეტი ცხრაზე</translation> <translation id="5266635337630551423">დოკუმენტის ზედა მარცხენა კუთხე</translation> <translation id="5317780077021120954">შენახვა</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_kk.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_kk.xtb index 9b50520..3ffbd9a 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_kk.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_kk.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Сканерлеу штрих коды</translation> <translation id="3892148308691398805">Мәтінді көшіру</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> мегапиксель</translation> -<translation id="4096701159033358951">Құжат сканерлеу функциясы жүктеп алынуда</translation> <translation id="4118525110028899586">Жазуды кідірту</translation> <translation id="4121305183798804752">Құжат анықталды</translation> <translation id="414641094616694804">Бұл камера ажыратымдылықты өзгерте алмайды.</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Камераңыз әзірге қолжетімді емес. Камераның дұрыс жалғанғанын тексеріңіз.</translation> <translation id="5163387177077603948">Оңға қарай жылжыту</translation> -<translation id="520537883758714667">Енді кұжатты сканерлеуге болады.</translation> <translation id="5235304959032763950">16:9</translation> <translation id="5266635337630551423">Құжаттың жоғарғы сол жақ бұрышы</translation> <translation id="5317780077021120954">Сақтау</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_km.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_km.xtb index 1429b88e..1d873b6 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_km.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_km.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">ស្កេនបារកូដ</translation> <translation id="3892148308691398805">ចម្លងអត្ថបទ</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">កំពុងទាញយកមុខងារស្កេនឯកសារ</translation> <translation id="4118525110028899586">ផ្អាកការថត</translation> <translation id="4121305183798804752">បានរកឃើញឯកសារ</translation> <translation id="414641094616694804">កាមេរ៉ានេះមិនអាចប្ដូរកម្រិតគុណភាពបានទេ</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">កាមេរ៉ារបស់អ្នកមិនអាចប្រើបានទេនៅពេលនេះ។ សូមពិនិត្យមើលថាតើកាមេរ៉ាត្រូវបានភ្ជាប់ត្រឹមត្រូវឬអត់។</translation> <translation id="5163387177077603948">កំពុងផ្លាស់ទីក្នុងទិសដៅខាងស្ដាំ</translation> -<translation id="520537883758714667">ឥឡូវនេះ មានមុខងារស្កេនឯកសារហើយ</translation> <translation id="5235304959032763950">16:9</translation> <translation id="5266635337630551423">ជ្រុងខាងលើផ្នែកខាងឆ្វេងនៃឯកសារ</translation> <translation id="5317780077021120954">រក្សាទុក</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_kn.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_kn.xtb index 15f09da..baf452c 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_kn.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_kn.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">ಬಾರ್ಕೋಡ್ ಸ್ಕ್ಯಾನ್ ಮಾಡಿ</translation> <translation id="3892148308691398805">ಪಠ್ಯ ನಕಲಿಸಿ</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">ಡಾಕ್ಯುಮೆಂಟ್ ಸ್ಕ್ಯಾನಿಂಗ್ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation> <translation id="4118525110028899586">ರೆಕಾರ್ಡಿಂಗ್ ವಿರಾಮಗೊಳಿಸಿ</translation> <translation id="4121305183798804752">ಡಾಕ್ಯುಮೆಂಟ್ ಅನ್ನು ಪತ್ತೆಹಚ್ಚಲಾಗಿದೆ</translation> <translation id="414641094616694804">ಈ ಕ್ಯಾಮರಾ ರೆಸಲ್ಯೂಷನ್ ಅನ್ನು ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಪ್ರಸ್ತುತ ಲಭ್ಯವಿಲ್ಲ. ಕ್ಯಾಮರಾ ಸರಿಯಾಗಿ ಸಂಪರ್ಕಗೊಂಡಿದೆಯೇ ಎಂಬುದನ್ನು ಪರೀಕ್ಷಿಸಿ.</translation> <translation id="5163387177077603948">ಬಲ ದಿಕ್ಕಿನಲ್ಲಿ ಚಲಿಸುತ್ತಿದೆ</translation> -<translation id="520537883758714667">ಡಾಕ್ಯುಮೆಂಟ್ ಸ್ಕ್ಯಾನಿಂಗ್ ಈಗ ಲಭ್ಯವಿದೆ</translation> <translation id="5235304959032763950">16 ರಿಂದ 9</translation> <translation id="5266635337630551423">ಡಾಕ್ಯುಮೆಂಟ್ ಮೇಲಿನ ಎಡ ಮೂಲೆ</translation> <translation id="5317780077021120954">ಉಳಿಸು</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ko.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ko.xtb index cf9e9e7f..785a90b 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ko.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ko.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">바코드 스캔</translation> <translation id="3892148308691398805">텍스트 복사</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" />MP</translation> -<translation id="4096701159033358951">문서 스캔 기능 다운로드 중</translation> <translation id="4118525110028899586">녹화 일시중지</translation> <translation id="4121305183798804752">문서 삭제됨</translation> <translation id="414641094616694804">이 카메라는 해상도를 변경할 수 없습니다.</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">현재 카메라를 사용할 수 없습니다. 카메라가 제대로 연결되어 있는지 확인하세요.</translation> <translation id="5163387177077603948">오른쪽으로 이동</translation> -<translation id="520537883758714667">이제 문서를 스캔할 수 있습니다.</translation> <translation id="5235304959032763950">16:9</translation> <translation id="5266635337630551423">문서 왼쪽 상단</translation> <translation id="5317780077021120954">저장</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ky.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ky.xtb index e74f8f6..412586f9 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ky.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ky.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Штрихкодду скандоо</translation> <translation id="3892148308691398805">Текстти көчүрүү</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> Мпикс.</translation> -<translation id="4096701159033358951">Документти скандоо функциясы жүктөлүп алынууда</translation> <translation id="4118525110028899586">Видео жаздырууну тындыруу</translation> <translation id="4121305183798804752">Документ аныкталды</translation> <translation id="414641094616694804">Камеранын резолюциясын өзгөртүүгө болбойт</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Камераңыз учурда жеткиликсиз. Камера туура туташканын текшериңиз.</translation> <translation id="5163387177077603948">Оң жакка жылууда</translation> -<translation id="520537883758714667">Документти скандоо эми жеткиликтүү</translation> <translation id="5235304959032763950">16–9</translation> <translation id="5266635337630551423">Документтин жогорку сол бурчу</translation> <translation id="5317780077021120954">Сактоо</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_lo.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_lo.xtb index b2d2a1b5..94821e46 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_lo.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_lo.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">ສະແກນບາໂຄດ</translation> <translation id="3892148308691398805">ສຳເນົາຂໍ້ຄວາມ</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">ກຳລັງດາວໂຫຼດຄຸນສົມບັດການສະແກນເອກະສານ</translation> <translation id="4118525110028899586">ຢຸດການບັນທຶກໄວ້ຊົ່ວຄາວ</translation> <translation id="4121305183798804752">ກວດພົບເອກະສານ</translation> <translation id="414641094616694804">ກ້ອງຖ່າຍຮູບນີ້ບໍ່ສາມາດປ່ຽນຄວາມລະອຽດໄດ້</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">ກ້ອງຖ່າຍຮູບຂອງທ່ານບໍ່ສາມາດໃຊ້ໄດ້ໃນຂະນະນີ້. ກະລຸນາກວດເບິ່ງວ່າໄດ້ເຊື່ອມຕໍ່ກ້ອງຖ່າຍຮູບຢ່າງຖືກຕ້ອງຫຼືບໍ່.</translation> <translation id="5163387177077603948">ກຳລັງຍ້າຍໄປທາງຂວາ</translation> -<translation id="520537883758714667">ຕອນນີ້ສາມາດສະແກນເອກະສານໄດ້ແລ້ວ</translation> <translation id="5235304959032763950">16 ຕໍ່ 9</translation> <translation id="5266635337630551423">ມຸມຊ້າຍເທິງຂອງເອກະສານ</translation> <translation id="5317780077021120954">ບັນທຶກ</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_lt.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_lt.xtb index f479e79..a5fc454 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_lt.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_lt.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Nuskaityti brūkšninį kodą</translation> <translation id="3892148308691398805">Kopijuoti tekstą</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Atsisiunčiama dokumentų nuskaitymo funkcija</translation> <translation id="4118525110028899586">Pristabdyti įrašymą</translation> <translation id="4121305183798804752">Aptiktas dokumentas</translation> <translation id="414641094616694804">Negalima pakeisti šio fotoaparato skyros</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Fotoaparatas šiuo metu nepasiekiamas. Patikrinkite, ar fotoaparatas tinkamai prijungtas.</translation> <translation id="5163387177077603948">Perkeliama dešinėn</translation> -<translation id="520537883758714667">Dabar galima nuskaityti dokumentus</translation> <translation id="5235304959032763950">16 ir 9</translation> <translation id="5266635337630551423">Viršutinis kairysis dokumento kampas</translation> <translation id="5317780077021120954">Išsaugoti</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_lv.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_lv.xtb index 71fe1c91..e0ac8b8 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_lv.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_lv.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Skenēt svītrkodu</translation> <translation id="3892148308691398805">Kopēt tekstu</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Notiek dokumentu skenēšanas funkcijas lejupielāde…</translation> <translation id="4118525110028899586">Pārtraukt ierakstīšanu</translation> <translation id="4121305183798804752">Konstatēts dokuments</translation> <translation id="414641094616694804">Šai kamerai nevar mainīt izšķirtspēju</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Kamera šobrīd nav pieejama. Lūdzu, pārbaudiet, vai kamera ir pareizi pievienota.</translation> <translation id="5163387177077603948">Pārvietojas pa labi</translation> -<translation id="520537883758714667">Tagad ir pieejama dokumentu skenēšana</translation> <translation id="5235304959032763950">16 pret 9</translation> <translation id="5266635337630551423">Dokumenta augšējais kreisais stūris</translation> <translation id="5317780077021120954">Saglabāt</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_mk.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_mk.xtb index 3d7f66b..47a77b09 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_mk.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_mk.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Скенирајте го бар-кодот</translation> <translation id="3892148308691398805">Копирај текст</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Се презема функција за скенирање документи</translation> <translation id="4118525110028899586">Паузирај го снимањето</translation> <translation id="4121305183798804752">Откриен е документ</translation> <translation id="414641094616694804">Камерава не може да ја промени резолуцијата</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Камерата е недостапна во моментов. Проверете дали камерата е правилно поврзана.</translation> <translation id="5163387177077603948">Се преместува надесно</translation> -<translation id="520537883758714667">Отсега е достапно скенирање документи</translation> <translation id="5235304959032763950">16 на 9</translation> <translation id="5266635337630551423">Горен лев агол на документот</translation> <translation id="5317780077021120954">Зачувај</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ml.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ml.xtb index 7b7028e1..a106c04 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ml.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ml.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">ബാർകോഡ് സ്കാൻ ചെയ്യുക</translation> <translation id="3892148308691398805">ടെക്സ്റ്റ് പകർത്തുക</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">ഡോക്യുമെന്റ് സ്കാൻ ചെയ്യൽ ഫീച്ചർ ഡൗൺലോഡ് ചെയ്യുന്നു</translation> <translation id="4118525110028899586">റെക്കോർഡ് ചെയ്യൽ തൽക്കാലം നിർത്തുക</translation> <translation id="4121305183798804752">ഡോക്യുമെന്റ് കണ്ടെത്തി</translation> <translation id="414641094616694804">ഈ ക്യാമറയ്ക്ക് റെസല്യൂഷൻ മാറ്റാനാകില്ല</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">നിങ്ങളുടെ ക്യാമറ നിലവിൽ ലഭ്യമല്ല. ക്യാമറ ശരിയായി കണക്റ്റ് ചെയ്തിട്ടുണ്ടോയെന്ന് പരിശോധിക്കുക.</translation> <translation id="5163387177077603948">വലത് ദിശയിൽ നീങ്ങുന്നു</translation> -<translation id="520537883758714667">ഡോക്യുമെന്റ് സ്കാൻ ചെയ്യൽ ഇപ്പോൾ ലഭ്യമാണ്</translation> <translation id="5235304959032763950">16 അനുപാതം 9</translation> <translation id="5266635337630551423">ഡോക്യുമെന്റിന്റെ മുകൾ ഭാഗത്തെ ഇടത് മൂല</translation> <translation id="5317780077021120954">സംരക്ഷിക്കുക</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_mn.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_mn.xtb index 159ce4e..04a6c4c 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_mn.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_mn.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Баркодыг скан хийх</translation> <translation id="3892148308691398805">Текстийг хуулах</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MП</translation> -<translation id="4096701159033358951">Документ скан хийх онцлогийг татаж байна</translation> <translation id="4118525110028899586">Бичлэгийг түр зогсоох</translation> <translation id="4121305183798804752">Документ илэрлээ</translation> <translation id="414641094616694804">Энэ камерын нягтралыг өөрчлөх боломжгүй</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Tаны камер одоогоор боломжгүй байна. Камераа зөв залгасан эсэхээ шалгана уу.</translation> <translation id="5163387177077603948">Баруун тийш зөөж байна</translation> -<translation id="520537883758714667">Одоо документ скан хийх боломжтой боллоо</translation> <translation id="5235304959032763950">16-г харьцах нь 9</translation> <translation id="5266635337630551423">Документын зүүн дээд булан</translation> <translation id="5317780077021120954">Хадгалах</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_mr.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_mr.xtb index a8fe1c6..5ef091a 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_mr.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_mr.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">बारकोड स्कॅन करा</translation> <translation id="3892148308691398805">मजकूर कॉपी करा</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">दस्तऐवज स्कॅन करण्यासंबंधित वैशिष्ट्य डाउनलोड करत आहे</translation> <translation id="4118525110028899586">रेकॉर्डिंग थांबवा</translation> <translation id="4121305183798804752">दस्तऐवज डिटेक्ट केले</translation> <translation id="414641094616694804">हा कॅमेरा रेझोल्यूशन बदलू शकत नाही</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">तुमचा कॅमेरा सध्या उपलब्ध नाही. कॅमेरा योग्य प्रकारे कनेक्ट केला आहे का ते तपासा.</translation> <translation id="5163387177077603948">उजव्या दिशेने हलत आहे</translation> -<translation id="520537883758714667">दस्तऐवज स्कॅन करणे आता उपलब्ध आहे</translation> <translation id="5235304959032763950">सोळास नऊ</translation> <translation id="5266635337630551423">दस्तऐवजाचा सर्वात वरील डावीकडील कोपरा</translation> <translation id="5317780077021120954">सेव्ह करा</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ms.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ms.xtb index 076e7212..83cdc00 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ms.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ms.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Imbas kod bar</translation> <translation id="3892148308691398805">Salin teks</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Memuat turun ciri pengimbasan dokumen</translation> <translation id="4118525110028899586">Jeda rakaman</translation> <translation id="4121305183798804752">Dokumen dikesan</translation> <translation id="414641094616694804">Kamera ini tidak boleh menukar peleraian</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Kamera anda tidak tersedia pada masa ini. Sila periksa sama ada kamera telah disambungkan dengan betul.</translation> <translation id="5163387177077603948">Bergerak ke arah kanan</translation> -<translation id="520537883758714667">Kini pengimbasan dokumen tersedia</translation> <translation id="5235304959032763950">16 nisbah 9</translation> <translation id="5266635337630551423">Penjuru kiri sebelah atas dokumen</translation> <translation id="5317780077021120954">Simpan</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_my.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_my.xtb index df5e19fbc..143556b 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_my.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_my.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">ဘားကုဒ်ကို စကင်ဖတ်ရန်</translation> <translation id="3892148308691398805">စာသား မိတ္တူကူးရန်</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">မှတ်တမ်းစကင်ဖတ်ခြင်း အင်္ဂါရပ်ကို ဒေါင်းလုဒ်လုပ်နေသည်</translation> <translation id="4118525110028899586">ရိုက်ကူးမှု ခဏရပ်ရန်</translation> <translation id="4121305183798804752">စာရွက်စာတမ်းကို တွေ့ထားသည်</translation> <translation id="414641094616694804">ဤကင်မရာတွင် ပုံရိပ်ပြတ်သားကိန်းကို မပြောင်းနိုင်ပါ</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">သင့်ကင်မရာကို လောလောဆယ်မရနိုင်ပါ။ ကင်မရာကို စနစ်တကျ ချိတ်ဆက်ထားခြင်းရှိမရှိ စစ်ပါ။</translation> <translation id="5163387177077603948">ဦးတည်ချက်အမှန်အတိုင်း ရွေ့နေသည်</translation> -<translation id="520537883758714667">မှတ်တမ်းဖိုင်ကို ယခု စကင်ဖတ်နိုင်ပါပြီ</translation> <translation id="5235304959032763950">၁၆x၉</translation> <translation id="5266635337630551423">မှတ်တမ်း၏ ဘယ်ဘက်ထောင့်ထိပ်</translation> <translation id="5317780077021120954">သိမ်းရန်</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ne.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ne.xtb index fd0952bd..f8ce0dcf 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ne.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ne.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">बारकोड स्क्यान गर्नुहोस्</translation> <translation id="3892148308691398805">पाठ कपी गर्नुहोस्</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> मेगापिक्सेल</translation> -<translation id="4096701159033358951">कागजात स्क्यान गर्ने सुविधा डाउनलोड गरिँदै छ</translation> <translation id="4118525110028899586">रेकर्डिङ पज गर्नुहोस्</translation> <translation id="4121305183798804752">कागजात भेटियो</translation> <translation id="414641094616694804">यो क्यामेरामा रिजोल्युसन बदल्न मिल्दैन</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">तपाईंको क्यामेरा हाल उपलब्ध छैन। कृपया क्यामेरा राम्ररी जडान गरिएको छ कि छैन भनी जाँच गर्नुहोस्।</translation> <translation id="5163387177077603948">दायाँतिर सारिँदै छ</translation> -<translation id="520537883758714667">तपाईं अब डकुमेन्ट स्क्यान गर्न सक्नुहुन्छ</translation> <translation id="5235304959032763950">१६ बाई ९</translation> <translation id="5266635337630551423">कागजातको सिरानको बायाँ कुना</translation> <translation id="5317780077021120954">बचत गर्नुहोस्</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_nl.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_nl.xtb index 80bfc31c..5d6a334c 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_nl.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_nl.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Streepjescode scannen</translation> <translation id="3892148308691398805">Tekst kopiëren</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Documentscanfunctie downloaden</translation> <translation id="4118525110028899586">Opname onderbreken</translation> <translation id="4121305183798804752">Document waargenomen</translation> <translation id="414641094616694804">Deze camera kan de resolutie niet wijzigen</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Je camera is momenteel niet beschikbaar. Controleer of de camera correct is aangesloten.</translation> <translation id="5163387177077603948">Beweegt naar rechts</translation> -<translation id="520537883758714667">Documenten scannen is nu beschikbaar</translation> <translation id="5235304959032763950">16 bij 9</translation> <translation id="5266635337630551423">Linkerbovenhoek van document</translation> <translation id="5317780077021120954">Opslaan</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_no.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_no.xtb index 6ecf8f6..873dc56 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_no.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_no.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Skann strekkoden</translation> <translation id="3892148308691398805">Kopiér teksten</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Laster ned funksjonen for dokumentskanning</translation> <translation id="4118525110028899586">Sett opptaket på pause</translation> <translation id="4121305183798804752">Et dokument er oppdaget</translation> <translation id="414641094616694804">Dette kameraet kan ikke endre oppløsning</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Kameraet er ikke tilgjengelig akkurat nå. Sjekk om kameraet er koblet til riktig.</translation> <translation id="5163387177077603948">Beveger seg mot høyre</translation> -<translation id="520537883758714667">Dokumentskanning er nå tilgjengelig</translation> <translation id="5235304959032763950">16 til 9</translation> <translation id="5266635337630551423">Dokumentets øvre venstre hjørne</translation> <translation id="5317780077021120954">Lagre</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_or.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_or.xtb index e647a7e9..2b78901 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_or.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_or.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">ବାରକୋଡ୍ ସ୍କାନ୍ କରନ୍ତୁ</translation> <translation id="3892148308691398805">ଟେକ୍ସଟ୍ କପି କରନ୍ତୁ</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">ଡକ୍ୟୁମେଣ୍ଟ ସ୍କାନିଂ ଫିଚର ଡାଉନଲୋଡ ହେଉଛି</translation> <translation id="4118525110028899586">ରେକର୍ଡିଂ ବିରତ କରନ୍ତୁ</translation> <translation id="4121305183798804752">ଡକ୍ୟୁମେଣ୍ଟ ଚିହ୍ନଟ କରାଯାଇଛି</translation> <translation id="414641094616694804">ଏହି କ୍ୟାମେରା ରିଜୋଲ୍ୟୁସନ ବଦଳାଇପାରିବ ନାହିଁ</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">ସମ୍ପ୍ରତି, ଆପଣଙ୍କର କ୍ୟାମେରା ଉପଲବ୍ଧ ନାହିଁ। କ୍ୟାମେରା ଠିକ୍ ଭାବରେ ସଂଯୁକ୍ତ ଅଛି କି ନାହିଁ ଦୟାକରି ଯାଞ୍ଚ କରନ୍ତୁ।</translation> <translation id="5163387177077603948">ଡାହାଣ ପଟକୁ ମୁଭ ହେଉଛି</translation> -<translation id="520537883758714667">ଡକ୍ୟୁମେଣ୍ଟ ସ୍କାନ୍ କରିବା ସୁବିଧା ବର୍ତ୍ତମାନ ଉପଲବ୍ଧ ଅଛି</translation> <translation id="5235304959032763950">16 ରୁ 9</translation> <translation id="5266635337630551423">ଡକ୍ୟୁମେଣ୍ଟର ଶୀର୍ଷ-ବାମ ପଟ କୋଣ</translation> <translation id="5317780077021120954">ସଞ୍ଚୟ</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_pa.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_pa.xtb index 8beaed17..0b6dc262 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_pa.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_pa.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">ਬਾਰਕੋਡ ਸਕੈਨ ਕਰੋ</translation> <translation id="3892148308691398805">ਲਿਖਤ ਕਾਪੀ ਕਰੋ</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">ਦਸਤਾਵੇਜ਼ ਸਕੈਨ ਕਰਨ ਦੀ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation> <translation id="4118525110028899586">ਰਿਕਾਰਡਿੰਗ ਰੋਕੋ</translation> <translation id="4121305183798804752">ਦਸਤਾਵੇਜ਼ ਦਾ ਪਤਾ ਲੱਗਿਆ</translation> <translation id="414641094616694804">ਇਹ ਕੈਮਰਾ ਰੈਜ਼ੋਲਿਊਸ਼ਨ ਨਹੀਂ ਬਦਲ ਸਕਦਾ</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">ਤੁਹਾਡਾ ਕੈਮਰਾ ਇਸ ਵੇਲੇ ਉਪਲਬਧ ਨਹੀਂ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਕੈਮਰੇ ਦੇ ਸਹੀ ਤਰੀਕੇ ਨਾਲ ਕਨੈਕਟ ਹੋਣ ਦੀ ਜਾਂਚ ਕਰੋ।</translation> <translation id="5163387177077603948">ਇਹ ਸੱਜੇ ਪਾਸੇ ਵੱਲ ਜਾ ਰਿਹਾ ਹੈ</translation> -<translation id="520537883758714667">ਦਸਤਾਵੇਜ਼ ਸਕੈਨਿੰਗ ਵਿਸ਼ੇਸ਼ਤਾ ਹੁਣ ਉਪਲਬਧ ਹੈ</translation> <translation id="5235304959032763950">16 ਤੋਂ 9</translation> <translation id="5266635337630551423">ਦਸਤਾਵੇਜ਼ ਦਾ ਉੱਪਰਲਾ-ਖੱਬਾ ਕੋਨਾ</translation> <translation id="5317780077021120954">ਰੱਖਿਅਤ ਕਰੋ</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb index c59d4f8e..9035e6ff 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Zeskanuj kod kreskowy</translation> <translation id="3892148308691398805">Kopiuj tekst</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> Mpix</translation> -<translation id="4096701159033358951">Pobieram funkcję skanowania dokumentów</translation> <translation id="4118525110028899586">Wstrzymaj nagrywanie</translation> <translation id="4121305183798804752">Wykryto dokument</translation> <translation id="414641094616694804">Ta kamera nie umożliwia zmiany rozdzielczości</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Aparat jest obecnie niedostępny. Sprawdź, czy jest prawidłowo podłączony.</translation> <translation id="5163387177077603948">Przesuwam w prawo</translation> -<translation id="520537883758714667">Skanowanie dokumentów jest teraz dostępne</translation> <translation id="5235304959032763950">16 na 9</translation> <translation id="5266635337630551423">Lewy górny róg dokumentu</translation> <translation id="5317780077021120954">Zapisz</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb index a35b8782..1f5a7a4 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Ler código de barras</translation> <translation id="3892148308691398805">Copiar texto</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Fazendo o download do recurso de digitalização de documentos</translation> <translation id="4118525110028899586">Pausar gravação</translation> <translation id="4121305183798804752">Documento detectado</translation> <translation id="414641094616694804">Esta câmera não pode mudar de resolução</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Sua câmera está indisponível no momento. Verifique se ela está conectada corretamente.</translation> <translation id="5163387177077603948">Movendo para a direita</translation> -<translation id="520537883758714667">A digitalização de documentos está disponível</translation> <translation id="5235304959032763950">16 por 9</translation> <translation id="5266635337630551423">Canto superior esquerdo do documento</translation> <translation id="5317780077021120954">Salvar</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb index b0be3d7..a7d959c 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Ler código de barras</translation> <translation id="3892148308691398805">Copiar texto</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">A transferir a funcionalidade de digitalização de documentos</translation> <translation id="4118525110028899586">Interromper gravação</translation> <translation id="4121305183798804752">Documento detetado</translation> <translation id="414641094616694804">Não é possível alterar a resolução desta câmara</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">De momento, a câmara não está disponível. Verifique se a câmara está ligada corretamente.</translation> <translation id="5163387177077603948">A mover para a direita</translation> -<translation id="520537883758714667">A digitalização de documentos já está disponível</translation> <translation id="5235304959032763950">16 por 9</translation> <translation id="5266635337630551423">Canto superior esquerdo do documento</translation> <translation id="5317780077021120954">Guardar</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ro.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ro.xtb index e13b69f..e919bb9 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ro.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ro.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Scanează codul de bare</translation> <translation id="3892148308691398805">Copiază textul</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Se descarcă funcția de scanare a documentelor</translation> <translation id="4118525110028899586">Întrerupe înregistrarea</translation> <translation id="4121305183798804752">S-a detectat un document</translation> <translation id="414641094616694804">Rezoluția acestei camere foto nu poate fi schimbată</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Camera foto este indisponibilă. Verifică dacă ai conectat corect camera foto.</translation> <translation id="5163387177077603948">Se deplasează în direcția corespunzătoare</translation> -<translation id="520537883758714667">Scanarea documentelor este acum disponibilă</translation> <translation id="5235304959032763950">16:9</translation> <translation id="5266635337630551423">Colțul din stânga sus al documentului</translation> <translation id="5317780077021120954">Salvează</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ru.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ru.xtb index c2a4117..3b86863 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ru.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ru.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Сканировать штрихкод</translation> <translation id="3892148308691398805">Копировать текст</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> Mпкс</translation> -<translation id="4096701159033358951">Скачивание функции для сканирования документов.</translation> <translation id="4118525110028899586">Приостановить запись</translation> <translation id="4121305183798804752">Обнаружен документ</translation> <translation id="414641094616694804">Разрешение этой камеры нельзя изменить</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Камера недоступна. Проверьте, правильно ли подключена камера.</translation> <translation id="5163387177077603948">Перемещение вправо</translation> -<translation id="520537883758714667">Доступно сканирование документов.</translation> <translation id="5235304959032763950">16 на 9</translation> <translation id="5266635337630551423">Левый верхний угол документа</translation> <translation id="5317780077021120954">Сохранить</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_si.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_si.xtb index 7cda938..b047a830 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_si.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_si.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">තීරු කේතය ස්කෑන් කරන්න</translation> <translation id="3892148308691398805">පෙළ පිටපත් කරන්න</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">ලේඛන ස්කෑන් කිරීමේ විශේෂාංගය බාගැනීම</translation> <translation id="4118525110028899586">පටිගත කිරීම විරාම කරන්න</translation> <translation id="4121305183798804752">ලේඛනය අනාවරණය කර ගන්නා ලදි</translation> <translation id="414641094616694804">මෙම කැමරාවට විභේදනය වෙනස් කළ නොහැකිය</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">ඔබේ කැමරාව දැනට නොලැබේ. කැමරාව නිසියාකාරව සම්බන්ධ වී ඇති දැයි පරීක්ෂා කරන්න.</translation> <translation id="5163387177077603948">දකුණු දිශාවට ගෙන යමින්</translation> -<translation id="520537883758714667">ලේඛන ස්කෑන් කිරීම දැන් ලබා ගත හැකිය</translation> <translation id="5235304959032763950">16ට 9</translation> <translation id="5266635337630551423">ලේඛනය ඉහළ වම් කෙළවර</translation> <translation id="5317780077021120954">සුරකින්න</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sk.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sk.xtb index 20aff6c..45f57195 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sk.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sk.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Skenovať čiarový kód</translation> <translation id="3892148308691398805">Kopírovať text</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> Mpx</translation> -<translation id="4096701159033358951">Sťahuje sa funkcia na kontrolu dokumentov</translation> <translation id="4118525110028899586">Pozastaviť nahrávanie</translation> <translation id="4121305183798804752">Bol rozpoznaný dokument</translation> <translation id="414641094616694804">Rozlíšenie tejto kamery sa nedá zmeniť</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Fotoaparát je momentálne nedostupný. Skontrolujte, či je správne pripojený.</translation> <translation id="5163387177077603948">Presúvate doprava</translation> -<translation id="520537883758714667">Skenovanie dokumentov je teraz k dispozícii</translation> <translation id="5235304959032763950">16 ku 9</translation> <translation id="5266635337630551423">Ľavý horný roh dokumentu</translation> <translation id="5317780077021120954">Uložiť</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sl.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sl.xtb index 82ea6e7..72dfc55 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sl.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sl.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Optično branje črtne kode</translation> <translation id="3892148308691398805">Kopiraj besedilo</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> mio. slikovnih pik</translation> -<translation id="4096701159033358951">Prenos funkcije optičnega branja dokumentov</translation> <translation id="4118525110028899586">Začasna zaustavitev snemanja</translation> <translation id="4121305183798804752">Dokument je zaznan</translation> <translation id="414641094616694804">Za ta fotoaparat ni mogoče spremeniti ločljivosti</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Fotoaparat trenutno ni na voljo. Preverite, ali je fotoaparat ustrezno povezan.</translation> <translation id="5163387177077603948">Premikanje proti desni</translation> -<translation id="520537883758714667">Optično branje dokumentov je zdaj na voljo</translation> <translation id="5235304959032763950">16 : 9</translation> <translation id="5266635337630551423">Zgornji levi kot dokumenta</translation> <translation id="5317780077021120954">Shrani</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sq.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sq.xtb index 4fa6933..30e69ef7 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sq.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sq.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Skano bardkodin</translation> <translation id="3892148308691398805">Kopjo tekstin</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Veçoria e skanimit të dokumenteve po shkarkohet</translation> <translation id="4118525110028899586">Vendose në pauzë regjistrimin</translation> <translation id="4121305183798804752">U zbulua një dokument</translation> <translation id="414641094616694804">Kjo kamerë nuk mund ta ndryshojë rezolucionin</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Kamera jote nuk ofrohet aktualisht. Kontrollo nëse kamera është lidhur si duhet.</translation> <translation id="5163387177077603948">Po zhvendoset djathtas</translation> -<translation id="520537883758714667">Skanimi i dokumenteve ofrohet tani</translation> <translation id="5235304959032763950">16 me 9</translation> <translation id="5266635337630551423">Këndi lart majtas i dokumentit</translation> <translation id="5317780077021120954">Ruaj</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb index f68193b6..55eec514f 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Skeniraj bar-kod</translation> <translation id="3892148308691398805">Kopiraj tekst</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Preuzima se funkcija skeniranja dokumenata</translation> <translation id="4118525110028899586">Pauziraj snimanje</translation> <translation id="4121305183798804752">Dokument je otkriven</translation> <translation id="414641094616694804">Ova kamera ne može da promeni rezoluciju</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Kamera trenutno nije dostupna. Proverite da li je kamera ispravno povezana.</translation> <translation id="5163387177077603948">Kreće se udesno</translation> -<translation id="520537883758714667">Sada je dostupno skeniranje dokumenata</translation> <translation id="5235304959032763950">16 prema 9</translation> <translation id="5266635337630551423">Gornji levi ugao dokumenta</translation> <translation id="5317780077021120954">Sačuvaj</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sr.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sr.xtb index fbb3778..e6d65d0 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sr.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sr.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Скенирај бар-код</translation> <translation id="3892148308691398805">Копирај текст</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Преузима се функција скенирања докумената</translation> <translation id="4118525110028899586">Паузирај снимање</translation> <translation id="4121305183798804752">Документ је откривен</translation> <translation id="414641094616694804">Ова камера не може да промени резолуцију</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Камера тренутно није доступна. Проверите да ли је камера исправно повезана.</translation> <translation id="5163387177077603948">Креће се удесно</translation> -<translation id="520537883758714667">Сада је доступно скенирање докумената</translation> <translation id="5235304959032763950">16 према 9</translation> <translation id="5266635337630551423">Горњи леви угао документа</translation> <translation id="5317780077021120954">Сачувај</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sv.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sv.xtb index 473c1c49..d2e255a7 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sv.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sv.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Läs av streckkod</translation> <translation id="3892148308691398805">Kopiera text</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Laddar ned funktionen för dokumentskanning</translation> <translation id="4118525110028899586">Pausa inspelning</translation> <translation id="4121305183798804752">Ett dokument identifierades</translation> <translation id="414641094616694804">Det går inte att ändra upplösning för den här kameran</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Kameran är inte tillgänglig. Kontrollera kameraanslutningen.</translation> <translation id="5163387177077603948">Flyttas åt höger</translation> -<translation id="520537883758714667">Dokumentskanning är nu tillgängligt</translation> <translation id="5235304959032763950">16 till 9</translation> <translation id="5266635337630551423">Övre vänstra hörnet på dokumentet</translation> <translation id="5317780077021120954">Spara</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sw.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sw.xtb index 1137b23..bd0aba1 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sw.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sw.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Changanua msimbo wa mistari</translation> <translation id="3892148308691398805">Nakili maandishi</translation> <translation id="4061162772429051350">MP <ph name="MAGAPIXELS_AMOUNT" /></translation> -<translation id="4096701159033358951">Inapakua kipengele cha kuchanganua hati</translation> <translation id="4118525110028899586">Sitisha kurekodi</translation> <translation id="4121305183798804752">Hati imetambuliwa</translation> <translation id="414641094616694804">Kamera hii haiwezi kubadilisha ubora</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Kamera yako haipatikani kwa sasa. Tafadhali hakikisha kuwa umeunganisha kamera vizuri.</translation> <translation id="5163387177077603948">Inasogezwa upande wa kulia</translation> -<translation id="520537883758714667">Kipengele cha kuchanganua hati sasa kinapatikana</translation> <translation id="5235304959032763950">16 kwa 9</translation> <translation id="5266635337630551423">Pembe ya juu kushoto ya hati</translation> <translation id="5317780077021120954">Hifadhi</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ta.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ta.xtb index 7fa5664..f29da57 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ta.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ta.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">பார்கோடை ஸ்கேன் செய்</translation> <translation id="3892148308691398805">உரையை நகலெடு</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> மெ.பி.</translation> -<translation id="4096701159033358951">ஆவணத்தை ஸ்கேன் செய்யும் அம்சம் பதிவிறக்கப்படுகிறது</translation> <translation id="4118525110028899586">ரெக்கார்டிங்கை இடைநிறுத்து</translation> <translation id="4121305183798804752">ஆவணம் கண்டறியப்பட்டது</translation> <translation id="414641094616694804">இந்தக் கேமராவில் தெளிவுத்திறனை மாற்ற முடியாது</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">உங்கள் கேமரா தற்போது கிடைக்கவில்லை. கேமரா சரியாக இணைக்கப்பட்டுள்ளதா எனப் பார்க்கவும்.</translation> <translation id="5163387177077603948">வலதுபுறம் நகர்கிறது</translation> -<translation id="520537883758714667">இப்போது ஆவணத்தை ஸ்கேன் செய்யலாம்</translation> <translation id="5235304959032763950">16:9</translation> <translation id="5266635337630551423">ஆவணத்தின் மேல் இடது மூலை</translation> <translation id="5317780077021120954">சேமி</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_te.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_te.xtb index 259bcfc..252fdc4 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_te.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_te.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">బార్కోడ్ను స్కాన్ చేయండి</translation> <translation id="3892148308691398805">టెక్స్ట్ను కాపీ చేయి</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">డాక్యుమెంట్ స్కానింగ్ ఫీచర్ డౌన్లోడ్ అవుతోంది</translation> <translation id="4118525110028899586">రికార్డింగ్ను పాజ్ చేయి</translation> <translation id="4121305183798804752">డాక్యుమెంట్ గుర్తించబడింది</translation> <translation id="414641094616694804">ఈ కెమెరా రిజల్యూషన్ను మార్చలేదు</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">మీ కెమెరా ప్రస్తుతం అందుబాటులో లేదు. కెమెరా సరిగ్గా కనెక్ట్ అయ్యిందో లేదో, దయచేసి సరిచూడండి.</translation> <translation id="5163387177077603948">కుడి వైపునకు కదులుతోంది</translation> -<translation id="520537883758714667">డాక్యుమెంట్ స్కానింగ్ ఇప్పుడు అందుబాటులో ఉంది</translation> <translation id="5235304959032763950">16:9</translation> <translation id="5266635337630551423">డాక్యుమెంట్ ఎగువ ఎడమ మూలన</translation> <translation id="5317780077021120954">సేవ్ చేయండి</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_th.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_th.xtb index 08f6692..e3569f14 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_th.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_th.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">สแกนบาร์โค้ด</translation> <translation id="3892148308691398805">คัดลอกข้อความ</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> ล้านพิกเซล</translation> -<translation id="4096701159033358951">กำลังดาวน์โหลดฟีเจอร์การสแกนเอกสาร</translation> <translation id="4118525110028899586">หยุดบันทึกชั่วคราว</translation> <translation id="4121305183798804752">ตรวจพบเอกสาร</translation> <translation id="414641094616694804">เปลี่ยนความละเอียดของกล้องนี้ไม่ได้</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">ขณะนี้กล้องไม่พร้อมใช้งาน โปรดตรวจสอบว่ากล้องเชื่อมต่ออย่างถูกต้อง</translation> <translation id="5163387177077603948">ย้ายไปทางด้านขวา</translation> -<translation id="520537883758714667">การสแกนเอกสารพร้อมใช้งานแล้ว</translation> <translation id="5235304959032763950">16 ต่อ 9</translation> <translation id="5266635337630551423">มุมซ้ายบนของเอกสาร</translation> <translation id="5317780077021120954">บันทึก</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_tr.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_tr.xtb index deff29c..e949690 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_tr.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_tr.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Barkodu tara</translation> <translation id="3892148308691398805">Metni kopyala</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Doküman tarama özelliği indiriliyor</translation> <translation id="4118525110028899586">Kaydı duraklat</translation> <translation id="4121305183798804752">Doküman algılandı</translation> <translation id="414641094616694804">Bu kamera, çözünürlüğü değiştiremez</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Kameranız şu anda kullanılamıyor. Lütfen kameranın düzgün bir şekilde bağlanıp bağlanmadığını kontrol edin.</translation> <translation id="5163387177077603948">Sağa doğru hareket ediyor</translation> -<translation id="520537883758714667">Doküman tarama artık kullanılabilir</translation> <translation id="5235304959032763950">16'ya 9</translation> <translation id="5266635337630551423">Dokümanın sol üst köşesi</translation> <translation id="5317780077021120954">Kaydet</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_uk.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_uk.xtb index 0ba1e83..a662433 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_uk.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_uk.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Сканувати штрих-код</translation> <translation id="3892148308691398805">Копіювати текст</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> Мп</translation> -<translation id="4096701159033358951">Завантаження функції сканування документів</translation> <translation id="4118525110028899586">Призупинити запис</translation> <translation id="4121305183798804752">Виявлено документ</translation> <translation id="414641094616694804">Для цієї камери не можна змінити роздільну здатність</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Камера зараз недоступна. Перевірте, чи правильно її під’єднано.</translation> <translation id="5163387177077603948">Переміщення вправо</translation> -<translation id="520537883758714667">Тепер доступне сканування документів</translation> <translation id="5235304959032763950">16:9</translation> <translation id="5266635337630551423">Верхній лівий кут документа</translation> <translation id="5317780077021120954">Зберегти</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ur.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ur.xtb index cd4c07a..2e66459 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ur.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ur.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">بارکوڈ اسکین کریں</translation> <translation id="3892148308691398805">ٹیکسٹ کاپی کریں</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">دستاویز اسکیننگ کی خصوصیت ڈاؤن لوڈ ہو رہی ہے</translation> <translation id="4118525110028899586">ریکارڈنگ موقوف کریں</translation> <translation id="4121305183798804752">دستاویز کا پتہ چلا</translation> <translation id="414641094616694804">یہ کیمرا ریزولوشن تبدیل نہیں کر سکتا</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">آپ کا کیمرا فی الحال دستیاب نہیں ہے۔ چیک کریں کہ کیمرا ٹھیک سے منسلک ہے۔</translation> <translation id="5163387177077603948">صحیح سمت میں جا رہا ہے</translation> -<translation id="520537883758714667">دستاویز کو اسکین کرنے کی خصوصیت اب دستیاب ہے</translation> <translation id="5235304959032763950">16 سے 9</translation> <translation id="5266635337630551423">دستاویز کا اوپری بایاں کونا</translation> <translation id="5317780077021120954">محفوظ کریں</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_uz.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_uz.xtb index 70f96ff..6af25c8 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_uz.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_uz.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Shtrix-kodni skanerlash</translation> <translation id="3892148308691398805">Matnni nusxalash</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Hujjatni skanerlash funksiyasi yuklab olinmoqda</translation> <translation id="4118525110028899586">Pauza qilish</translation> <translation id="4121305183798804752">Hujjat aniqlandi</translation> <translation id="414641094616694804">Bu kamera piksellar sigʻimi oʻzgarmaydi</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Kamera hozirda ishlamayapti. Kamera bexato ulanganini tekshiring.</translation> <translation id="5163387177077603948">Oʻngga surish</translation> -<translation id="520537883758714667">Endi hujjatlarni skanerlash mumkin</translation> <translation id="5235304959032763950">16:9</translation> <translation id="5266635337630551423">Hujjatning yuqori chap burchagi</translation> <translation id="5317780077021120954">Saqlash</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_vi.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_vi.xtb index 0ad63a0..0732bccc 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_vi.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_vi.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Quét mã vạch</translation> <translation id="3892148308691398805">Sao chép văn bản</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Đang tải tính năng quét tài liệu xuống</translation> <translation id="4118525110028899586">Tạm dừng quay</translation> <translation id="4121305183798804752">Đã phát hiện tài liệu</translation> <translation id="414641094616694804">Máy ảnh này không thể thay đổi độ phân giải</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Máy ảnh của bạn hiện chưa sẵn sàng. Vui lòng kiểm tra xem máy ảnh có được kết nối đúng cách không.</translation> <translation id="5163387177077603948">Đang di chuyển theo hướng sang phải</translation> -<translation id="520537883758714667">Tính năng quét tài liệu hiện có sẵn</translation> <translation id="5235304959032763950">16:9</translation> <translation id="5266635337630551423">Góc trên cùng bên trái của tài liệu</translation> <translation id="5317780077021120954">Lưu</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-CN.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-CN.xtb index 728d1f44..0205b2e4 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-CN.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-CN.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">扫描条形码</translation> <translation id="3892148308691398805">复制文字</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">正在下载文件扫描功能</translation> <translation id="4118525110028899586">暂停录制</translation> <translation id="4121305183798804752">检测到文件</translation> <translation id="414641094616694804">此相机无法更改分辨率</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">您的摄像头目前不可用。 请检查此摄像头是否连接正确。</translation> <translation id="5163387177077603948">正在向右移动</translation> -<translation id="520537883758714667">文件扫描功能现已推出</translation> <translation id="5235304959032763950">16:9</translation> <translation id="5266635337630551423">文件左上角</translation> <translation id="5317780077021120954">保存</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb index 4c872e6..e7933f5 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">掃描條碼</translation> <translation id="3892148308691398805">複製文字</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> 百萬像素</translation> -<translation id="4096701159033358951">正在下載文件掃瞄功能</translation> <translation id="4118525110028899586">暫停錄影</translation> <translation id="4121305183798804752">偵測到文件</translation> <translation id="414641094616694804">此相機無法變更解像度</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">您的相機目前無法使用。 請檢查相機是否正確連接。</translation> <translation id="5163387177077603948">向右移</translation> -<translation id="520537883758714667">文件掃瞄功能現已推出</translation> <translation id="5235304959032763950">16:9</translation> <translation id="5266635337630551423">文件左上角</translation> <translation id="5317780077021120954">儲存</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb index be6c0b70..0c839bc 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">掃描條碼</translation> <translation id="3892148308691398805">複製文字</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> 百萬像素</translation> -<translation id="4096701159033358951">正在下載文件掃描功能</translation> <translation id="4118525110028899586">暫停錄影</translation> <translation id="4121305183798804752">偵測到文件</translation> <translation id="414641094616694804">這部攝影機無法變更解析度</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">目前無法使用相機。 請檢查相機是否已正確連接。</translation> <translation id="5163387177077603948">向右移動</translation> -<translation id="520537883758714667">文件掃描功能現已推出</translation> <translation id="5235304959032763950">16:9</translation> <translation id="5266635337630551423">文件左上角</translation> <translation id="5317780077021120954">儲存</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_zu.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_zu.xtb index 8668809..4b66d3c 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_zu.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_zu.xtb
@@ -72,7 +72,6 @@ <translation id="3838931309141338733">Skena ibhakhodi</translation> <translation id="3892148308691398805">Kopisha umbhalo</translation> <translation id="4061162772429051350"><ph name="MAGAPIXELS_AMOUNT" /> MP</translation> -<translation id="4096701159033358951">Idawuniloda isakhi sokuskena amadokhumenti</translation> <translation id="4118525110028899586">Misa okwesikhashana ukurekhoda</translation> <translation id="4121305183798804752">Idokhumenti itholiwe</translation> <translation id="414641094616694804">Le khamera ayikwazi ukushintsha ukucaca</translation> @@ -94,7 +93,6 @@ <translation id="5057360777601936059">Ikhamera yakho manje ayitholakali. Hlola uma ngabe ikhamera ixhumeke kahle yini.</translation> <translation id="5163387177077603948">Ihambela ngasohlangothini lwesokudla</translation> -<translation id="520537883758714667">Ukuskena idokhumenti manje sekuyatholakala</translation> <translation id="5235304959032763950">16 kuya ku-9</translation> <translation id="5266635337630551423">Idokhumenti ekhoneni eliphezulu kwesobunxele</translation> <translation id="5317780077021120954">Londoloza</translation>
diff --git a/ash/webui/connectivity_diagnostics/connectivity_diagnostics_ui.cc b/ash/webui/connectivity_diagnostics/connectivity_diagnostics_ui.cc index 354dc05e..65887d4 100644 --- a/ash/webui/connectivity_diagnostics/connectivity_diagnostics_ui.cc +++ b/ash/webui/connectivity_diagnostics/connectivity_diagnostics_ui.cc
@@ -80,8 +80,7 @@ response.Append(base::Value(show_feedback_button_)); AllowJavascript(); - ResolveJavascriptCallback(base::Value(callback_id), - base::Value(std::move(response))); + ResolveJavascriptCallback(base::Value(callback_id), response); } ConnectivityDiagnosticsUI::SendFeedbackReportCallback
diff --git a/ash/webui/diagnostics_ui/backend/network_health_provider_unittest.cc b/ash/webui/diagnostics_ui/backend/network_health_provider_unittest.cc index 61e25de..6b15afc 100644 --- a/ash/webui/diagnostics_ui/backend/network_health_provider_unittest.cc +++ b/ash/webui/diagnostics_ui/backend/network_health_provider_unittest.cc
@@ -876,7 +876,7 @@ // Enable security as WEP_8021x. mojom::SecurityType security_2 = mojom::SecurityType::kWep8021x; - SetWifiSecurity(shill::kSecurityWep, shill::kKeyManagementIEEE8021X); + SetWifiSecurity(shill::kSecurityClassWep, shill::kKeyManagementIEEE8021X); EXPECT_EQ(observer.GetLatestState()->type_properties->get_wifi()->security, security_2); @@ -1256,31 +1256,31 @@ mojom::SecurityType::kNone); // Enable security as WEP_8021x. - SetWifiSecurity(shill::kSecurityWep, shill::kKeyManagementIEEE8021X); + SetWifiSecurity(shill::kSecurityClassWep, shill::kKeyManagementIEEE8021X); EXPECT_EQ(observer.GetLatestState()->type_properties->get_wifi()->security, mojom::SecurityType::kWep8021x); ExpectStateObserverFired(observer, &state_call_count); // Enable security as WEP_PSK. - SetWifiSecurity(shill::kSecurityWep, std::string()); + SetWifiSecurity(shill::kSecurityClassWep, std::string()); EXPECT_EQ(observer.GetLatestState()->type_properties->get_wifi()->security, mojom::SecurityType::kWepPsk); ExpectStateObserverFired(observer, &state_call_count); // Enable security as WPA_EAP. - SetWifiSecurity(shill::kSecurity8021x); + SetWifiSecurity(shill::kSecurityClass8021x); EXPECT_EQ(observer.GetLatestState()->type_properties->get_wifi()->security, mojom::SecurityType::kWpaEap); ExpectStateObserverFired(observer, &state_call_count); // Enable security as WPA_PSK. - SetWifiSecurity(shill::kSecurityPsk); + SetWifiSecurity(shill::kSecurityClassPsk); EXPECT_EQ(observer.GetLatestState()->type_properties->get_wifi()->security, mojom::SecurityType::kWpaPsk); ExpectStateObserverFired(observer, &state_call_count); // Enable security as NONE. - SetWifiSecurity(shill::kSecurityNone); + SetWifiSecurity(shill::kSecurityClassNone); EXPECT_EQ(observer.GetLatestState()->type_properties->get_wifi()->security, mojom::SecurityType::kNone); ExpectStateObserverFired(observer, &state_call_count);
diff --git a/ash/webui/personalization_app/mojom/personalization_app.mojom b/ash/webui/personalization_app/mojom/personalization_app.mojom index 2740b31..a887c91 100644 --- a/ash/webui/personalization_app/mojom/personalization_app.mojom +++ b/ash/webui/personalization_app/mojom/personalization_app.mojom
@@ -529,6 +529,9 @@ // Record that the user viewed the Ambient mode page. SetPageViewed(); + + // Request updated Ambient mode settings and albums. + FetchSettingsAndAlbums(); }; // The supported preset colors for keyboard backlight.
diff --git a/ash/webui/personalization_app/resources/css/common.css b/ash/webui/personalization_app/resources/css/common.css index 7fc2e53..1e5a980 100644 --- a/ash/webui/personalization_app/resources/css/common.css +++ b/ash/webui/personalization_app/resources/css/common.css
@@ -363,3 +363,7 @@ display: flex; font: var(--cros-body-2-font); } + +:host-context([dir=rtl]) iron-icon[icon='cr:chevron-right'] { + transform: scaleX(-1); +}
diff --git a/ash/webui/personalization_app/resources/js/ambient/albums_subpage_element.ts b/ash/webui/personalization_app/resources/js/ambient/albums_subpage_element.ts index c428fd1..ed737c3 100644 --- a/ash/webui/personalization_app/resources/js/ambient/albums_subpage_element.ts +++ b/ash/webui/personalization_app/resources/js/ambient/albums_subpage_element.ts
@@ -78,6 +78,7 @@ this.watch<AlbumsSubpage['ambientModeEnabled_']>( 'ambientModeEnabled_', state => state.ambient.ambientModeEnabled); this.updateFromStore(); + getAmbientProvider().fetchSettingsAndAlbums(); } private shouldShowContent_(): boolean {
diff --git a/ash/webui/personalization_app/resources/js/ambient/ambient_observer.ts b/ash/webui/personalization_app/resources/js/ambient/ambient_observer.ts index 0733bdd3a..e724750 100644 --- a/ash/webui/personalization_app/resources/js/ambient/ambient_observer.ts +++ b/ash/webui/personalization_app/resources/js/ambient/ambient_observer.ts
@@ -9,8 +9,9 @@ import {setAlbumsAction, setAmbientModeEnabledAction, setAnimationThemeAction, setGooglePhotosAlbumsPreviewsAction, setTemperatureUnitAction, setTopicSourceAction} from './ambient_actions.js'; import {getAmbientProvider} from './ambient_interface_provider.js'; +import {isRecentHighlightsAlbum} from './utils.js'; -/** @fileoverview listens for updates on color mode changes. */ +/** @fileoverview listens for updates on ambient mode changes. */ let instance: AmbientObserver|null = null; @@ -31,8 +32,13 @@ } } - private receiver_: AmbientObserverReceiver = - this.initReceiver_(getAmbientProvider()); + private receiver_: AmbientObserverReceiver; + + constructor() { + const provider = getAmbientProvider(); + this.receiver_ = this.initReceiver_(provider); + provider.fetchSettingsAndAlbums(); + } private initReceiver_(ambientProvider: AmbientProviderInterface): AmbientObserverReceiver { @@ -63,6 +69,21 @@ onAlbumsChanged(albums: AmbientModeAlbum[]) { const store = PersonalizationStore.getInstance(); + + // Prevent recent highlights album from constantly changing preview image + // when albums are refreshed during a single session. + const oldRecentHighlightsAlbum = + (store.data.ambient.albums || + []).find(album => isRecentHighlightsAlbum(album)); + if (oldRecentHighlightsAlbum) { + const newRecentHighlightsAlbum = + albums.find(album => isRecentHighlightsAlbum(album)); + if (newRecentHighlightsAlbum) { + // Edit by reference. + newRecentHighlightsAlbum.url = oldRecentHighlightsAlbum.url; + } + } + store.dispatch(setAlbumsAction(albums)); }
diff --git a/ash/webui/personalization_app/resources/js/ambient/ambient_subpage_element.ts b/ash/webui/personalization_app/resources/js/ambient/ambient_subpage_element.ts index 23bacc22..fa4de4ef 100644 --- a/ash/webui/personalization_app/resources/js/ambient/ambient_subpage_element.ts +++ b/ash/webui/personalization_app/resources/js/ambient/ambient_subpage_element.ts
@@ -77,6 +77,10 @@ private temperatureUnit_: TemperatureUnit|null = null; private topicSource_: TopicSource|null = null; + // Refetch albums if the user is currently viewing ambient subpage, focuses + // another window, and then re-focuses personalization app. + private onFocus_ = () => getAmbientProvider().fetchSettingsAndAlbums(); + override ready() { // Pre-scroll to prevent visual jank when focusing the toggle row. window.scrollTo(0, 0); @@ -111,6 +115,13 @@ this.updateFromStore(); getAmbientProvider().setPageViewed(); + + window.addEventListener('focus', this.onFocus_); + } + + override disconnectedCallback() { + super.disconnectedCallback(); + window.removeEventListener('focus', this.onFocus_); } private onClickAmbientModeButton_(event: Event) {
diff --git a/ash/webui/personalization_app/resources/js/ambient/topic_source_item_element.html b/ash/webui/personalization_app/resources/js/ambient/topic_source_item_element.html index 33f04c4..0c75cd1a 100644 --- a/ash/webui/personalization_app/resources/js/ambient/topic_source_item_element.html +++ b/ash/webui/personalization_app/resources/js/ambient/topic_source_item_element.html
@@ -1,4 +1,4 @@ -<style include="cr-shared-style cr-radio-button-style"> +<style include="common cr-shared-style cr-radio-button-style"> #container { align-items: center; display: flex;
diff --git a/ash/webui/personalization_app/resources/js/personalization_app.ts b/ash/webui/personalization_app/resources/js/personalization_app.ts index 4f449f7..c936604 100644 --- a/ash/webui/personalization_app/resources/js/personalization_app.ts +++ b/ash/webui/personalization_app/resources/js/personalization_app.ts
@@ -65,7 +65,7 @@ export {setKeyboardBacklightProviderForTesting} from './keyboard_backlight/keyboard_backlight_interface_provider.js'; export {KeyboardBacklightObserver} from './keyboard_backlight/keyboard_backlight_observer.js'; export {Actions, DismissErrorAction, dismissErrorAction, PersonalizationActionName, SetErrorAction} from './personalization_actions.js'; -export {AmbientModeAlbum, AmbientObserverInterface, AmbientObserverRemote, AmbientProviderInterface, AnimationTheme, BacklightColor, CurrentWallpaper, DefaultUserImage, FetchGooglePhotosAlbumsResponse, FetchGooglePhotosPhotosResponse, GooglePhotosAlbum, GooglePhotosEnablementState, GooglePhotosPhoto, KeyboardBacklightObserverInterface, KeyboardBacklightObserverRemote, KeyboardBacklightProviderInterface, OnlineImageType, TemperatureUnit, ThemeObserverInterface, ThemeObserverRemote, ThemeProviderInterface, TopicSource, UserImage, UserImageObserverInterface, UserImageObserverRemote, UserInfo, UserProviderInterface, WallpaperCollection, WallpaperImage, WallpaperLayout, WallpaperObserverInterface, WallpaperObserverRemote, WallpaperProviderInterface, WallpaperType} from './personalization_app.mojom-webui.js'; +export * from './personalization_app.mojom-webui.js'; export {PersonalizationBreadcrumb} from './personalization_breadcrumb_element.js'; export {PersonalizationMain} from './personalization_main_element.js'; export {reduce} from './personalization_reducers.js';
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/utils.ts b/ash/webui/personalization_app/resources/js/wallpaper/utils.ts index 81a60199..041be2af 100644 --- a/ash/webui/personalization_app/resources/js/wallpaper/utils.ts +++ b/ash/webui/personalization_app/resources/js/wallpaper/utils.ts
@@ -90,24 +90,6 @@ } } -/** - * Wallpaper images sometimes have a resolution suffix appended to the end of - * the image. This is typically to fetch a high resolution image to show as the - * user's wallpaper. We do not want the full resolution here, so remove the - * suffix to get a 512x512 preview. - * TODO(b/186807814) support different resolution parameters here. - */ -export function removeHighResolutionSuffix(url: string): string { - return url.replace(/=w\d+$/, ''); -} - -/** - * Returns whether the given URL starts with http:// or https://. - */ -export function hasHttpScheme(url: string): boolean { - return url.startsWith('http://') || url.startsWith('https://'); -} - /** Returns a css variable to control the animation delay. */ export function getLoadingPlaceholderAnimationDelay(index: number): string { return `--animation-delay: ${index * 83}ms;`;
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_actions.ts b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_actions.ts index 05ccae8..b3a7770 100644 --- a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_actions.ts +++ b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_actions.ts
@@ -447,6 +447,9 @@ */ export function setSelectedImageAction(image: CurrentWallpaper| null): SetSelectedImageAction { + assert( + image === null || image.url.url.startsWith('data:image/png;base64'), + 'only data urls are supported'); return { image, name: WallpaperActionName.SET_SELECTED_IMAGE,
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_preview_element.html b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_preview_element.html index fe95043..dfe4c88a 100644 --- a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_preview_element.html +++ b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_preview_element.html
@@ -83,14 +83,14 @@ <div id="imageContainer" class="photo-images-container clickable" on-click="onClickWallpaper_" on-keypress="onClickWallpaper_"> <div class="photo-images-border"></div> - <img src$="[[getImageSrc_(image_)]]" + <img src$="[[image_.url.url]]" alt$="[[getImageAltDescription_(image_)]]"> </div> </template> <template is="dom-if" if="[[isPolicyControlled_(image_)]]"> <div id="imageContainer" class="photo-images-container"> <div class="photo-images-border"></div> - <img src$="[[getImageSrc_(image_)]]" + <img src$="[[image_.url.url]]" aria-description="$i18n{managedSetting}" alt$="[[getImageAltDescription_(image_)]]"> </div>
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_preview_element.ts b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_preview_element.ts index e023412..6968848 100644 --- a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_preview_element.ts +++ b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_preview_element.ts
@@ -21,7 +21,7 @@ import {WithPersonalizationStore} from '../personalization_store.js'; import {isNonEmptyArray} from '../utils.js'; -import {getLocalStorageAttribution, hasHttpScheme, removeHighResolutionSuffix} from './utils.js'; +import {getLocalStorageAttribution} from './utils.js'; import {WallpaperObserver} from './wallpaper_observer.js'; import {getTemplate} from './wallpaper_preview_element.html.js'; @@ -40,9 +40,7 @@ type: Object, value: null, }, - imageLoading_: { - type: Boolean, - }, + imageLoading_: Boolean, }; } @@ -69,20 +67,6 @@ PersonalizationRouter.instance().goToRoute(Paths.COLLECTIONS); } - /** - * Return a chrome://image or data:// url to load the image safely. Returns - * empty string in case |image| is null or invalid. - */ - private getImageSrc_(image: CurrentWallpaper|null): string { - if (image && image.url) { - if (hasHttpScheme(image.url.url)) { - return `chrome://image?${removeHighResolutionSuffix(image.url.url)}`; - } - return image.url.url; - } - return ''; - } - private getImageAltDescription_(image: CurrentWallpaper|null): string { if (!image) { return `${this.i18n('currentlySet')} ${
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_selected_element.html b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_selected_element.html index dee2383..957e6ae 100644 --- a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_selected_element.html +++ b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_selected_element.html
@@ -71,7 +71,7 @@ <template is="dom-if" if="[[showImage_]]"> <div id="imageContainer" class="preview-image-container"> <div class="preview-image-border"></div> - <img class="preview-image" src$="[[getImageSrc_(image_)]]" aria-hidden="true"> + <img class="preview-image" src$="[[image_.url.url]]" aria-hidden="true"> </div> <h2 id="textContainer" class="preview-text-container" aria-live="polite" aria-label$="[[getAriaLabel_(image_, dailyRefreshState_)]]"> <span id="currentlySet" aria-hidden="true">$i18n{currentlySet}</span>
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_selected_element.ts b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_selected_element.ts index 64e44f4f..1d5757cb 100644 --- a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_selected_element.ts +++ b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_selected_element.ts
@@ -21,7 +21,7 @@ import {WithPersonalizationStore} from '../personalization_store.js'; import {isNonEmptyArray} from '../utils.js'; -import {getLocalStorageAttribution, getWallpaperLayoutEnum, hasHttpScheme, removeHighResolutionSuffix} from './utils.js'; +import {getLocalStorageAttribution, getWallpaperLayoutEnum} from './utils.js'; import {getDailyRefreshState, selectGooglePhotosAlbum, setCurrentWallpaperLayout, setDailyRefreshCollectionId, updateDailyRefreshWallpaper} from './wallpaper_controller.js'; import {getWallpaperProvider} from './wallpaper_interface_provider.js'; import {WallpaperObserver} from './wallpaper_observer.js'; @@ -179,21 +179,6 @@ getDailyRefreshState(getWallpaperProvider(), this.getStore()); } - - /** - * Return a chrome://image or data:// url to load the image safely. Returns - * empty string in case |image| is null or invalid. - */ - private getImageSrc_(image: CurrentWallpaper|null): string { - if (image && image.url) { - if (hasHttpScheme(image.url.url)) { - return `chrome://image?${removeHighResolutionSuffix(image.url.url)}`; - } - return image.url.url; - } - return ''; - } - private computeShowImage_(image: CurrentWallpaper|null, loading: boolean): boolean { // Specifically check === false to avoid undefined case while component is
diff --git a/ash/webui/personalization_app/test/fake_personalization_app_ambient_provider.h b/ash/webui/personalization_app/test/fake_personalization_app_ambient_provider.h index d7b774a..319030ee 100644 --- a/ash/webui/personalization_app/test/fake_personalization_app_ambient_provider.h +++ b/ash/webui/personalization_app/test/fake_personalization_app_ambient_provider.h
@@ -53,6 +53,7 @@ ash::AmbientModeTopicSource topic_source, bool selected) override {} void SetPageViewed() override {} + void FetchSettingsAndAlbums() override {} private: mojo::Receiver<ash::personalization_app::mojom::AmbientProvider>
diff --git a/ash/webui/personalization_app/test/personalization_app_mojom_banned_browsertest_fixture.cc b/ash/webui/personalization_app/test/personalization_app_mojom_banned_browsertest_fixture.cc index 136d5097..6f716225 100644 --- a/ash/webui/personalization_app/test/personalization_app_mojom_banned_browsertest_fixture.cc +++ b/ash/webui/personalization_app/test/personalization_app_mojom_banned_browsertest_fixture.cc
@@ -55,6 +55,7 @@ bool selected), (override)); MOCK_METHOD(void, SetPageViewed, (), (override)); + MOCK_METHOD(void, FetchSettingsAndAlbums, (), (override)); }; class MockPersonalizationAppKeyboardBacklightProvider
diff --git a/ash/webui/projector_app/projector_message_handler.cc b/ash/webui/projector_app/projector_message_handler.cc index 4252a66..5eb34661 100644 --- a/ash/webui/projector_app/projector_message_handler.cc +++ b/ash/webui/projector_app/projector_message_handler.cc
@@ -11,6 +11,7 @@ #include "ash/public/cpp/projector/projector_controller.h" #include "ash/public/cpp/projector/projector_new_screencast_precondition.h" #include "ash/webui/projector_app/projector_app_client.h" +#include "ash/webui/projector_app/projector_screencast.h" #include "ash/webui/projector_app/projector_xhr_sender.h" #include "base/bind.h" #include "base/check.h" @@ -58,10 +59,10 @@ base::Value value; }; -base::Value AccessTokenInfoToValue(const signin::AccessTokenInfo& info) { - base::Value value(base::Value::Type::DICTIONARY); - value.SetKey(kToken, base::Value(info.token)); - value.SetKey(kExpirationTime, base::TimeToValue(info.expiration_time)); +base::Value::Dict AccessTokenInfoToValue(const signin::AccessTokenInfo& info) { + base::Value::Dict value; + value.Set(kToken, info.token); + value.Set(kExpirationTime, base::TimeToValue(info.expiration_time)); return value; } @@ -76,13 +77,14 @@ } } -base::Value ScreencastListToValue(const PendingScreencastSet& screencasts) { +base::Value::List ScreencastListToValue( + const PendingScreencastSet& screencasts) { base::Value::List value; value.reserve(screencasts.size()); for (const auto& item : screencasts) value.Append(item.ToValue()); - return base::Value(std::move(value)); + return value; } bool IsUserPrefSupported(const std::string& pref) { @@ -146,11 +148,10 @@ return IsValidPrefValueArg(*out); } -base::Value CreateRejectMessageForArgs(const base::Value& value) { - base::Value rejected_response(base::Value::Type::DICTIONARY); - rejected_response.SetKey(kRejectedRequestMessageKey, - base::Value(kRejectedRequestMessage)); - rejected_response.SetKey(kRejectedRequestArgsKey, value.Clone()); +base::Value::Dict CreateRejectMessageForArgs(const base::Value& value) { + base::Value::Dict rejected_response; + rejected_response.Set(kRejectedRequestMessageKey, kRejectedRequestMessage); + rejected_response.Set(kRejectedRequestArgsKey, value.Clone()); return rejected_response; } @@ -222,6 +223,9 @@ "openFeedbackDialog", base::BindRepeating(&ProjectorMessageHandler::OpenFeedbackDialog, base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "getVideo", base::BindRepeating(&ProjectorMessageHandler::GetVideo, + base::Unretained(this))); } void ProjectorMessageHandler::OnScreencastsPendingStatusChanged( @@ -275,7 +279,7 @@ response.Append(std::move(account_info)); } - ResolveJavascriptCallback(args[0], base::Value(std::move(response))); + ResolveJavascriptCallback(args[0], response); } void ProjectorMessageHandler::GetNewScreencastPrecondition( @@ -285,10 +289,9 @@ // Check that there is only one argument which is the callback id. DCHECK_EQ(args.size(), 1u); - ResolveJavascriptCallback(args[0], - base::Value(ProjectorController::Get() - ->GetNewScreencastPrecondition() - .ToValue())); + ResolveJavascriptCallback( + args[0], + ProjectorController::Get()->GetNewScreencastPrecondition().ToValue()); } void ProjectorMessageHandler::StartProjectorSession( @@ -435,19 +438,19 @@ const signin::AccessTokenInfo& info) { AllowJavascript(); - base::Value response(base::Value::Type::DICTIONARY); - response.SetKey(kUserEmail, base::Value(email)); + base::Value::Dict response; + response.Set(kUserEmail, base::Value(email)); if (error.state() != GoogleServiceAuthError::State::NONE) { - response.SetKey(kOAuthTokenInfo, base::Value()); - response.SetKey(kError, base::Value(ProjectorErrorToString( - ProjectorError::kTokenFetchFailure))); + response.Set(kOAuthTokenInfo, base::Value()); + response.Set(kError, base::Value(ProjectorErrorToString( + ProjectorError::kTokenFetchFailure))); } else { - response.SetKey(kError, - base::Value(ProjectorErrorToString(ProjectorError::kNone))); - response.SetKey(kOAuthTokenInfo, AccessTokenInfoToValue(info)); + response.Set(kError, + base::Value(ProjectorErrorToString(ProjectorError::kNone))); + response.Set(kOAuthTokenInfo, AccessTokenInfoToValue(info)); } - ResolveJavascriptCallback(base::Value(js_callback_id), std::move(response)); + ResolveJavascriptCallback(base::Value(js_callback_id), response); } void ProjectorMessageHandler::OnXhrRequestCompleted( @@ -457,12 +460,12 @@ const std::string& error) { AllowJavascript(); - base::Value response(base::Value::Type::DICTIONARY); - response.SetBoolKey(kXhrSuccess, success); - response.SetStringKey(kXhrResponseBody, response_body); - response.SetStringKey(kXhrError, error); + base::Value::Dict response; + response.Set(kXhrSuccess, success); + response.Set(kXhrResponseBody, response_body); + response.Set(kXhrError, error); - ResolveJavascriptCallback(base::Value(js_callback_id), std::move(response)); + ResolveJavascriptCallback(base::Value(js_callback_id), response); } void ProjectorMessageHandler::GetPendingScreencasts( @@ -477,4 +480,19 @@ ScreencastListToValue(pending_screencasts)); } +void ProjectorMessageHandler::GetVideo(const base::Value::List& args) { + AllowJavascript(); + // Two arguments. The first is callback id, and the second is the list + // containing the item id and resource key. + DCHECK_EQ(args.size(), 2u); + const auto& func_args = args[1].GetList(); + DCHECK_EQ(func_args.size(), 2u); + + // TODO(b/237089852): Create a launch event with the file. + ProjectorScreencastVideo video; + video.file_id = func_args[0].GetString(); + + ResolveJavascriptCallback(args[0], video.ToValue()); +} + } // namespace ash
diff --git a/ash/webui/projector_app/projector_message_handler.h b/ash/webui/projector_app/projector_message_handler.h index 37a35207..044fa97 100644 --- a/ash/webui/projector_app/projector_message_handler.h +++ b/ash/webui/projector_app/projector_message_handler.h
@@ -120,6 +120,10 @@ // upload or failed to upload. void GetPendingScreencasts(const base::Value::List& args); + // Requested by the Projector SWA to fetch a single video from DriveFS with + // the Drive item id specified by `args`. + void GetVideo(const base::Value::List& args); + ProjectorOAuthTokenFetcher oauth_token_fetcher_; std::unique_ptr<ProjectorXhrSender> xhr_sender_;
diff --git a/ash/webui/projector_app/projector_screencast.cc b/ash/webui/projector_app/projector_screencast.cc index 4c2c45b..38ae4c7 100644 --- a/ash/webui/projector_app/projector_screencast.cc +++ b/ash/webui/projector_app/projector_screencast.cc
@@ -4,15 +4,13 @@ #include "ash/webui/projector_app/projector_screencast.h" -#include "base/values.h" - namespace ash { -base::Value ProjectorScreencastVideo::ToValue() const { +base::Value::Dict ProjectorScreencastVideo::ToValue() const { base::Value::Dict dict; dict.Set("srcUrl", src_url); dict.Set("fileId", file_id); - return base::Value(std::move(dict)); + return dict; } ProjectorScreencast::ProjectorScreencast() = default; @@ -24,14 +22,14 @@ ProjectorScreencast::~ProjectorScreencast() = default; -base::Value ProjectorScreencast::ToValue() const { +base::Value::Dict ProjectorScreencast::ToValue() const { base::Value::Dict dict; dict.Set("containerFolderId", container_folder_id); dict.Set("name", name); dict.Set("metadataFileId", metadata_file_id); dict.Set("video", video.ToValue()); - return base::Value(std::move(dict)); + return dict; } } // namespace ash
diff --git a/ash/webui/projector_app/projector_screencast.h b/ash/webui/projector_app/projector_screencast.h index 755cbc0..fad42fd 100644 --- a/ash/webui/projector_app/projector_screencast.h +++ b/ash/webui/projector_app/projector_screencast.h
@@ -7,16 +7,14 @@ #include <string> -namespace base { -class Value; -} // namespace base +#include "base/values.h" namespace ash { // The video object for screencast. struct ProjectorScreencastVideo { - base::Value ToValue() const; - // TODO(b/236857019): Add thumbnail link and video file id. + base::Value::Dict ToValue() const; + // TODO(b/236857019): Add thumbnail link and duration millis. std::string src_url; std::string file_id; }; @@ -28,7 +26,7 @@ ProjectorScreencast& operator=(const ProjectorScreencast&); ~ProjectorScreencast(); - base::Value ToValue() const; + base::Value::Dict ToValue() const; // Only available for screencasts located in DriveFs. std::string container_folder_id;
diff --git a/ash/webui/projector_app/resources/app/trusted/trusted_app_comm_factory.js b/ash/webui/projector_app/resources/app/trusted/trusted_app_comm_factory.js index 25dc734c..cd0daea5 100644 --- a/ash/webui/projector_app/resources/app/trusted/trusted_app_comm_factory.js +++ b/ash/webui/projector_app/resources/app/trusted/trusted_app_comm_factory.js
@@ -131,6 +131,12 @@ this.registerMethod('openFeedbackDialog', (args) => { return this.browserProxy_.openFeedbackDialog(); }); + this.registerMethod('getVideo', (args) => { + if (!args || args.length != 2) { + return Promise.reject('Incorrect args for getVideo'); + } + return this.browserProxy_.getVideo(args[0], args[1]); + }); } }
diff --git a/ash/webui/projector_app/resources/app/untrusted/untrusted_app_comm_factory.js b/ash/webui/projector_app/resources/app/untrusted/untrusted_app_comm_factory.js index 0aaf12a..09a978e 100644 --- a/ash/webui/projector_app/resources/app/untrusted/untrusted_app_comm_factory.js +++ b/ash/webui/projector_app/resources/app/untrusted/untrusted_app_comm_factory.js
@@ -179,6 +179,19 @@ return AppUntrustedCommFactory.getPostMessageAPIClient().callApiFn( 'openFeedbackDialog', []); }, + + /** + * Gets information about the specified video from DriveFS. + * @param {string} videoFileId The Drive item id of the video file. + * @param {string|undefined} resourceKey The Drive item resource key. + * TODO(b/237089852): Wire up the resource key once DriveFS has support. + * @return {!Promise<!projectorApp.Video>} + */ + getVideo(videoFileId, resourceKey) { + return AppUntrustedCommFactory.getPostMessageAPIClient().callApiFn( + 'getVideo', [videoFileId, resourceKey]); + // TODO(b/237089852): Wait for the launch event and generate the object URL. + }, }; /**
diff --git a/ash/webui/projector_app/resources/communication/projector_app.externs.js b/ash/webui/projector_app/resources/communication/projector_app.externs.js index e84acf1e..6ee57a0 100644 --- a/ash/webui/projector_app/resources/communication/projector_app.externs.js +++ b/ash/webui/projector_app/resources/communication/projector_app.externs.js
@@ -236,6 +236,31 @@ projectorApp.NewScreencastPreconditionState.prototype.reasons; /** + * Structure for Screencast video object. + * @record + * @struct + */ +projectorApp.Video = function() {}; + +/** + * Duration of the video in milliseconds. + * @type {string|undefined} + */ +projectorApp.Video.prototype.durationMillis; + +/** + * The local source url of screencast video. + * @type {string|undefined} + */ +projectorApp.Video.prototype.srcUrl; + +/** + * Drive item id of the video file. + * @type {string|undefined} + */ +projectorApp.Video.prototype.fileId; + +/** * The delegate interface that the Projector app can use to make requests to * chrome. * @record @@ -343,6 +368,15 @@ projectorApp.ClientDelegate.prototype.openFeedbackDialog = function() {}; /** + * Gets information about the specified video from DriveFS. + * @param {string} videoFileId The Drive item id of the video file. + * @param {string|undefined} resourceKey The Drive item resource key. + * @return {!Promise<!projectorApp.Video>} + */ +projectorApp.ClientDelegate.prototype.getVideo = function( + videoFileId, resourceKey) {}; + +/** * The client Api for interacting with the Projector app instance. * @record * @struct
diff --git a/ash/webui/projector_app/resources/communication/projector_browser_proxy.js b/ash/webui/projector_app/resources/communication/projector_browser_proxy.js index f0bcac5d..95566ae 100644 --- a/ash/webui/projector_app/resources/communication/projector_browser_proxy.js +++ b/ash/webui/projector_app/resources/communication/projector_browser_proxy.js
@@ -108,6 +108,14 @@ * @return {!Promise} */ openFeedbackDialog() {} + + /** + * Gets information about the specified video from DriveFS. + * @param {string} videoFileId The Drive item id of the video file. + * @param {string|undefined} resourceKey The Drive item resource key. + * @return {!Promise<!projectorApp.Video>} + */ + getVideo(videoFileId, resourceKey) {} } /** @@ -174,6 +182,10 @@ openFeedbackDialog() { return sendWithPromise('openFeedbackDialog'); } + /** @override */ + getVideo(videoFileId, resourceKey) { + return sendWithPromise('getVideo', [videoFileId, resourceKey]); + } } addSingletonGetter(ProjectorBrowserProxyImpl);
diff --git a/ash/webui/projector_app/test/projector_message_handler_unittest.cc b/ash/webui/projector_app/test/projector_message_handler_unittest.cc index 225fe509..2fd24a6 100644 --- a/ash/webui/projector_app/test/projector_message_handler_unittest.cc +++ b/ash/webui/projector_app/test/projector_message_handler_unittest.cc
@@ -21,6 +21,8 @@ namespace { const char kTestUserEmail[] = "testuser1@gmail.com"; +const char kVideoFileId[] = "video_file_id"; +const char kResourceKey[] = "resource_key"; const char kTestXhrUrl[] = "https://www.googleapis.com/drive/v3/files/fileID"; const char kTestXhrUnsupportedUrl[] = "https://www.example.com"; @@ -46,6 +48,7 @@ const char kOnSodaInstallProgressUpdated[] = "onSodaInstallProgressUpdated"; const char kOnSodaInstalled[] = "onSodaInstalled"; const char kOnSodaInstallError[] = "onSodaInstallError"; +const char kGetVideoCallback[] = "getVideoCallback"; const char kShouldDownloadSodaCallback[] = "shouldDownloadSodaCallbck"; const char kInstallSodaCallback[] = "installSodaCallback"; @@ -562,6 +565,31 @@ EXPECT_EQ(*(rejected_args->FindPath(kRejectedRequestArgsKey)), func_args); } +TEST_F(ProjectorMessageHandlerUnitTest, GetVideo) { + base::ListValue list_args; + list_args.Append(kGetVideoCallback); + base::ListValue args; + args.Append(kVideoFileId); + args.Append(kResourceKey); + list_args.Append(std::move(args)); + + web_ui().HandleReceivedMessage("getVideo", &list_args); + + // We expect that there was only one callback to the WebUI. + EXPECT_EQ(web_ui().call_data().size(), 1u); + + const content::TestWebUI::CallData& call_data = FetchCallData(0); + EXPECT_EQ(call_data.function_name(), kWebUIResponse); + EXPECT_EQ(call_data.arg1()->GetString(), kGetVideoCallback); + + // Expect the callback to be successful. + EXPECT_TRUE(call_data.arg2()->GetBool()); + ASSERT_TRUE(call_data.arg3()->is_dict()); + const base::Value::Dict& dict = call_data.arg3()->GetDict(); + + EXPECT_EQ(*dict.FindString("fileId"), kVideoFileId); +} + class ProjectorStorageDirNameValidationTest : public ::testing::WithParamInterface< ::testing::tuple<::std::string, bool>>,
diff --git a/ash/webui/scanning/scanning_handler.cc b/ash/webui/scanning/scanning_handler.cc index 7a672ce..7651f67 100644 --- a/ash/webui/scanning/scanning_handler.cc +++ b/ash/webui/scanning/scanning_handler.cc
@@ -108,12 +108,12 @@ CreateSelectedPathValue(base::FilePath())); } -base::Value ScanningHandler::CreateSelectedPathValue( +base::Value::Dict ScanningHandler::CreateSelectedPathValue( const base::FilePath& path) { - base::Value selected_path(base::Value::Type::DICTIONARY); - selected_path.SetStringKey(kFilePath, path.value()); - selected_path.SetStringKey(kBaseName, - scanning_app_delegate_->GetBaseNameFromPath(path)); + base::Value::Dict selected_path; + selected_path.Set(kFilePath, path.value()); + selected_path.Set(kBaseName, + scanning_app_delegate_->GetBaseNameFromPath(path)); return selected_path; }
diff --git a/ash/webui/scanning/scanning_handler.h b/ash/webui/scanning/scanning_handler.h index 57890b0..f6af034 100644 --- a/ash/webui/scanning/scanning_handler.h +++ b/ash/webui/scanning/scanning_handler.h
@@ -51,7 +51,7 @@ // Uses the full filepath and the base directory (lowest level directory in // the filepath, used to display in the UI) to create a Value object to return // to the Scanning UI. - base::Value CreateSelectedPathValue(const base::FilePath& path); + base::Value::Dict CreateSelectedPathValue(const base::FilePath& path); // Adds to map of string IDs for pluralization. void AddStringToPluralMap(const std::string& name, int id);
diff --git a/ash/webui/shimless_rma/backend/shimless_rma_service.cc b/ash/webui/shimless_rma/backend/shimless_rma_service.cc index 239aa535..039fda04 100644 --- a/ash/webui/shimless_rma/backend/shimless_rma_service.cc +++ b/ash/webui/shimless_rma/backend/shimless_rma_service.cc
@@ -25,6 +25,7 @@ #include "chromeos/ash/components/dbus/rmad/rmad_client.h" #include "chromeos/ash/components/network/network_state.h" #include "chromeos/ash/components/network/network_state_handler.h" +#include "chromeos/ash/components/network/network_type_pattern.h" #include "chromeos/dbus/power/power_manager_client.h" #include "chromeos/services/network_config/in_process_instance.h" #include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h" @@ -204,6 +205,16 @@ rmad::WelcomeState::RMAD_CHOICE_FINALIZE_REPAIR); if (!HaveAllowedNetworkConnection()) { + // Enable WiFi on the device. + chromeos::NetworkStateHandler* network_state_handler = + chromeos::NetworkHandler::Get()->network_state_handler(); + if (!network_state_handler->IsTechnologyEnabled( + chromeos::NetworkTypePattern::WiFi())) { + network_state_handler->SetTechnologyEnabled( + chromeos::NetworkTypePattern::WiFi(), /*enabled=*/true, + network_handler::ErrorCallback()); + } + user_has_seen_network_page_ = true; mojo_state_ = mojom::State::kConfigureNetwork; std::move(callback).Run(
diff --git a/ash/webui/shimless_rma/backend/shimless_rma_service_unittest.cc b/ash/webui/shimless_rma/backend/shimless_rma_service_unittest.cc index 94e59275..ec201be 100644 --- a/ash/webui/shimless_rma/backend/shimless_rma_service_unittest.cc +++ b/ash/webui/shimless_rma/backend/shimless_rma_service_unittest.cc
@@ -887,6 +887,45 @@ run_loop.Run(); } +// Navigating to the SelectNetwork page should enable WiFi if it's currently +// disabled. +TEST_F(ShimlessRmaServiceTest, SelectNetworkTurnsOnWiFi) { + const std::vector<rmad::GetStateReply> fake_states = { + CreateStateReply(rmad::RmadState::kWelcome, rmad::RMAD_ERROR_OK), + CreateStateReply(rmad::RmadState::kComponentsRepair, + rmad::RMAD_ERROR_OK)}; + fake_rmad_client_()->SetFakeStateReplies(std::move(fake_states)); + + base::RunLoop run_loop; + + // Simulate disabling WiFi. + network_state_handler()->SetTechnologyEnabled( + chromeos::NetworkTypePattern::WiFi(), /*enabled=*/false, + network_handler::ErrorCallback()); + EXPECT_FALSE(network_state_handler()->IsTechnologyEnabled( + chromeos::NetworkTypePattern::WiFi())); + + // Initialize current state. + shimless_rma_provider_->GetCurrentState( + base::BindLambdaForTesting([&](mojom::StateResultPtr state_result_ptr) { + EXPECT_EQ(state_result_ptr->state, mojom::State::kWelcomeScreen); + EXPECT_EQ(state_result_ptr->error, rmad::RmadErrorCode::RMAD_ERROR_OK); + })); + run_loop.RunUntilIdle(); + + // No network should direct user to the NetworkPage. + shimless_rma_provider_->BeginFinalization( + base::BindLambdaForTesting([&](mojom::StateResultPtr state_result_ptr) { + EXPECT_EQ(state_result_ptr->state, mojom::State::kConfigureNetwork); + EXPECT_EQ(state_result_ptr->error, rmad::RmadErrorCode::RMAD_ERROR_OK); + })); + run_loop.RunUntilIdle(); + + // After transitioning to the select network page, WiFi should be enabled. + EXPECT_TRUE(network_state_handler()->IsTechnologyEnabled( + chromeos::NetworkTypePattern::WiFi())); +} + TEST_F(ShimlessRmaServiceTest, GetCurrentState) { std::vector<rmad::GetStateReply> fake_states; fake_states.push_back(CreateStateReply(rmad::RmadState::kDeviceDestination,
diff --git a/ash/webui/shimless_rma/resources/fake_data.js b/ash/webui/shimless_rma/resources/fake_data.js index a91f84be..4ebc492 100644 --- a/ash/webui/shimless_rma/resources/fake_data.js +++ b/ash/webui/shimless_rma/resources/fake_data.js
@@ -177,11 +177,6 @@ /** @type {!Array<!Component>} */ export const fakeComponentsForRepairStateTest = [ { - component: ComponentType.kAudioCodec, - state: ComponentRepairStatus.kMissing, - identifier: 'Audio_XYZ', - }, - { component: ComponentType.kCamera, state: ComponentRepairStatus.kOriginal, identifier: 'Camera_XYZ_1', @@ -196,31 +191,6 @@ state: ComponentRepairStatus.kReplaced, identifier: 'Touchpad_XYZ_2', }, - { - component: ComponentType.kStorage, - state: ComponentRepairStatus.kMissing, - identifier: 'Storage_XYZ', - }, - { - component: ComponentType.kVpdCached, - state: ComponentRepairStatus.kMissing, - identifier: 'VpdCached_XYZ', - }, - { - component: ComponentType.kNetwork, - state: ComponentRepairStatus.kOriginal, - identifier: 'Network_XYZ', - }, - { - component: ComponentType.kCamera, - state: ComponentRepairStatus.kOriginal, - identifier: 'Camera_XYZ_2', - }, - { - component: ComponentType.kTouchsreen, - state: ComponentRepairStatus.kMissing, - identifier: 'Touchscreen_XYZ', - }, ]; /** @type {!Array<!CalibrationComponentStatus>} */
diff --git a/ash/webui/shimless_rma/resources/onboarding_select_components_page.html b/ash/webui/shimless_rma/resources/onboarding_select_components_page.html index dcb7bc3..3fcba02 100644 --- a/ash/webui/shimless_rma/resources/onboarding_select_components_page.html +++ b/ash/webui/shimless_rma/resources/onboarding_select_components_page.html
@@ -12,10 +12,9 @@ </div> <div slot="right-pane"> <div class="scroll-container"> - <div id="componentList" class="component-grid repair"> + <div class="component-grid repair"> <template is="dom-repeat" items="{{componentCheckboxes_}}" as="component"> <repair-component-chip id="[[component.id]]" - unique-id="[[component.uniqueId]]" checked="{{component.checked}}" disabled$="[[isComponentDisabled_(component.disabled, allButtonsDisabled)]]"
diff --git a/ash/webui/shimless_rma/resources/onboarding_select_components_page.js b/ash/webui/shimless_rma/resources/onboarding_select_components_page.js index 71ac9cb3f..684f8cb 100644 --- a/ash/webui/shimless_rma/resources/onboarding_select_components_page.js +++ b/ash/webui/shimless_rma/resources/onboarding_select_components_page.js
@@ -9,7 +9,7 @@ import {assert} from 'chrome://resources/js/assert.m.js'; import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/js/i18n_behavior.m.js'; -import {afterNextRender, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {ComponentTypeToId} from './data.js'; import {getShimlessRmaService} from './mojo_interface_provider.js'; @@ -19,7 +19,6 @@ /** * @typedef {{ * component: !ComponentType, - * uniqueId: number, * id: string, * identifier: string, * name: string, @@ -35,8 +34,6 @@ * that were replaced during repair. */ -const NUM_COLUMNS = 2; - /** * @constructor * @extends {PolymerElement} @@ -72,16 +69,6 @@ /** @private {string} */ reworkFlowLinkText_: {type: String, value: ''}, - - /** - * The index into componentCheckboxes_ for keyboard navigation between - * components. - * @private - */ - focusedComponentIndex_: { - type: Number, - value: -1, - }, }; } @@ -93,70 +80,6 @@ super(); /** @private {ShimlessRmaServiceInterface} */ this.shimlessRmaService_ = getShimlessRmaService(); - - /** - * Handles keyboard navigation over the list of components. - * @private {?Function} - */ - this.HandleKeyDownEvent = (event) => { - if (event.key !== 'ArrowRight' && event.key !== 'ArrowDown' && - event.key !== 'ArrowLeft' && event.key !== 'ArrowUp') { - return; - } - - // If there are no selectable components, do nothing. - if (this.focusedComponentIndex_ === -1) { - return; - } - - // Don't use keyboard navigation if the user tabbed out of the - // component list. - if (!this.shadowRoot.activeElement || - this.shadowRoot.activeElement.tagName !== 'REPAIR-COMPONENT-CHIP') { - return; - } - - if (event.key === 'ArrowRight' || event.key === 'ArrowDown') { - // The Down button should send you down the column, so we go forward - // by two components, which is the size of the row. - let step = 1; - if (event.key === 'ArrowDown') { - step = NUM_COLUMNS; - } - - let newIndex = this.focusedComponentIndex_ + step; - // Keep skipping disabled components until we encounter one that is - // not disabled. - while (newIndex < this.componentCheckboxes_.length && - this.componentCheckboxes_[newIndex].disabled) { - newIndex += step; - } - // Check that we haven't ended up outside of the array before - // applying the changes. - if (newIndex < this.componentCheckboxes_.length) { - this.focusedComponentIndex_ = newIndex; - } - } - - // The left and up arrows work similarly to down and right, but go - // backwards. - if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') { - let step = 1; - if (event.key === 'ArrowUp') { - step = NUM_COLUMNS; - } - - let newIndex = this.focusedComponentIndex_ - step; - while (newIndex >= 0 && this.componentCheckboxes_[newIndex].disabled) { - newIndex -= step; - } - if (newIndex >= 0) { - this.focusedComponentIndex_ = newIndex; - } - } - - this.focusOnCurrentComponent_(); - }; } /** @override */ @@ -166,28 +89,6 @@ this.getComponents_(); enableNextButton(this); - - - // Whenever we tab into the list of components, we need to focus on the one - // we were focused on, when we tabbed out. - const componentList = this.shadowRoot.querySelector('#componentList'); - componentList.addEventListener('focusin', (event) => { - this.focusOnCurrentComponent_(); - }); - - // When a component is clicked, it should come into focus. - componentList.addEventListener('click', (event) => { - const clickedComponentIndex = this.componentCheckboxes_.findIndex( - component => component.uniqueId === event.target.uniqueId); - - if (clickedComponentIndex !== -1 && - !this.componentCheckboxes_[clickedComponentIndex].disabled) { - this.focusedComponentIndex_ = clickedComponentIndex; - } - - this.focusOnCurrentComponent_(); - }); - // Hide the gradient when the list is scrolled to the end. this.shadowRoot.querySelector('.scroll-container') .addEventListener('scroll', (event) => { @@ -210,11 +111,10 @@ return; } - this.componentCheckboxes_ = result.components.map((item, index) => { + this.componentCheckboxes_ = result.components.map(item => { assert(item.component); return { component: item.component, - uniqueId: index, id: ComponentTypeToId[item.component], identifier: item.identifier, name: this.i18n(ComponentTypeToId[item.component]), @@ -222,40 +122,9 @@ disabled: item.state === ComponentRepairStatus.kMissing, }; }); - - // Focus on the first clickable component at the beginning. - this.focusedComponentIndex_ = - this.componentCheckboxes_.findIndex(component => !component.disabled); - afterNextRender(this, () => { - this.focusOnCurrentComponent_(); - }); }); } - /** @override */ - connectedCallback() { - super.connectedCallback(); - window.addEventListener('keydown', this.HandleKeyDownEvent); - } - - /** @override */ - disconnectedCallback() { - super.disconnectedCallback(); - window.removeEventListener('keydown', this.HandleKeyDownEvent); - } - - /** - * Make the page focus on the component at focusedComponentIndex_. - * @private - */ - focusOnCurrentComponent_() { - if (this.focusedComponentIndex_ != -1) { - const componentChip = this.shadowRoot.querySelector(`[unique-id="${ - this.componentCheckboxes_[this.focusedComponentIndex_].uniqueId}"]`); - componentChip.shadowRoot.querySelector('#componentButton').focus(); - } - } - /** * @return {!Array<!Component>} * @private
diff --git a/ash/webui/shimless_rma/resources/repair_component_chip.js b/ash/webui/shimless_rma/resources/repair_component_chip.js index 2dd1776..ccc422c 100644 --- a/ash/webui/shimless_rma/resources/repair_component_chip.js +++ b/ash/webui/shimless_rma/resources/repair_component_chip.js
@@ -60,13 +60,6 @@ /** @type {string} */ componentIdentifier: {type: String, value: ''}, - /** @type {number} */ - uniqueId: { - reflectToAttribute: true, - type: Number, - value: '', - }, - /** @type {boolean} */ isFirstClickableComponent: { type: Boolean,
diff --git a/ash/webui/shimless_rma/resources/shimless_rma_shared_css.html b/ash/webui/shimless_rma/resources/shimless_rma_shared_css.html index 5674521..37553f75 100644 --- a/ash/webui/shimless_rma/resources/shimless_rma_shared_css.html +++ b/ash/webui/shimless_rma/resources/shimless_rma_shared_css.html
@@ -145,11 +145,6 @@ width: 100%; } - /** - * NOTE: If you change the number of columns, don't forget to update the - * NUM_COLUMNS constant in the keyboard navigation code. Otherwise the down - * and up arrows won't work as expected. - */ .component-grid.repair { grid-template-columns: auto auto; }
diff --git a/ash/wm/desks/desks_bar_view.cc b/ash/wm/desks/desks_bar_view.cc index 0be2b22..e7eeda4e9 100644 --- a/ash/wm/desks/desks_bar_view.cc +++ b/ash/wm/desks/desks_bar_view.cc
@@ -821,7 +821,13 @@ mini_views_.begin(), mini_views_.end(), [desk](DeskMiniView* mini_view) { return desk == mini_view->desk(); }); - DCHECK(iter != mini_views_.end()); + // There are cases where a desk may be removed before the `desks_bar_view` + // finishes initializing (i.e. removed on a separate root window before the + // overview starting animation completes). In those cases, that mini_view + // would not exist and the bar view will already be in the correct state so we + // do not need to update the UI (https://crbug.com/1346154). + if (iter == mini_views_.end()) + return; // Let the highlight controller know the view is destroying before it is // removed from the collection because it needs to know the index of the mini
diff --git a/ash/wm/desks/desks_unittests.cc b/ash/wm/desks/desks_unittests.cc index 113fd92..dfb0503 100644 --- a/ash/wm/desks/desks_unittests.cc +++ b/ash/wm/desks/desks_unittests.cc
@@ -2171,6 +2171,86 @@ EXPECT_TRUE(base::Contains(desk_2->windows(), win.get())); } +// DesksBarVisibilityObserver waits for the Desks Bar on the observed root +// window to become visible. +class DesksBarVisibilityObserver : public aura::WindowObserver { + public: + explicit DesksBarVisibilityObserver(aura::Window* root_window) + : root_window_(root_window) { + root_window_->AddObserver(this); + } + DesksBarVisibilityObserver(const DesksBarVisibilityObserver&) = delete; + DesksBarVisibilityObserver& operator=(const DesksBarVisibilityObserver&) = + delete; + ~DesksBarVisibilityObserver() override { + DCHECK(root_window_); + root_window_->RemoveObserver(this); + } + + void Wait() { run_loop_.Run(); } + + void OnWindowVisibilityChanged(aura::Window* window, bool visible) override { + if (visible && window->GetId() == kShellWindowId_DesksBarWindow) + run_loop_.Quit(); + } + + private: + base::RunLoop run_loop_; + raw_ptr<aura::Window> root_window_; +}; + +// Tests that closing a desk while in overview before the overview starting +// animation finishes on a second display does not cause a crash. Regression +// test for https://crbug.com/1346154. +TEST_F(DesksWithMultiDisplayOverview, CloseDeskBeforeAnimationFinishes) { + // We need a non-zero duration to ensure we can close the desk before the + // animation completes. + ui::ScopedAnimationDurationScaleMode animation_scale( + ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION); + + // Create a maximized window on Desk 1. This means that when entering + // overview, we skip the wallpaper animation for Desk 1, so that the + // desks_bar_view for RootWindow-0 will initialize before RootWindow-1. + auto win0 = CreateAppWindow(gfx::Rect(0, 0, 250, 100)); + const WMEvent toggle_maximize_event(WM_EVENT_TOGGLE_MAXIMIZE); + WindowState::Get(win0.get())->OnWMEvent(&toggle_maximize_event); + ASSERT_TRUE(WindowState::Get(win0.get())->IsMaximized()); + + EnterOverview(); + auto* overview_controller = Shell::Get()->overview_controller(); + ASSERT_TRUE(overview_controller->InOverviewSession()); + + // Check that the desk bar on our first root window has finished initializing, + // while the second desk bar hasn't been initialized yet since the enter + // animation hasn't finished for the second root window. + auto root_windows = Shell::GetAllRootWindows(); + ASSERT_EQ(2u, root_windows.size()); + const auto* desks_bar_view_1 = + GetOverviewGridForRoot(root_windows[0])->desks_bar_view(); + ASSERT_EQ(2u, desks_bar_view_1->mini_views().size()); + ASSERT_EQ(nullptr, GetOverviewGridForRoot(root_windows[1])->desks_bar_view()); + + // Close the first desk. Previously, this would result in a crash since the + // desk is deleted before `desks_bar_view_2` is initialized, resulting in the + // `desk_1_mini_view` not being created for `desks_bar_view_2`. When + // `OnDeskRemoved` is then called for the second desk bar, we now return early + // if that miniview can't be found. + // To prevent flakiness in this test, we wait until `desks_bar_view_2` is + // initialized and shown before we check the state. + DesksBarVisibilityObserver desks_bar_2_observer(root_windows[1]); + auto* desk_1_mini_view = desks_bar_view_1->mini_views()[0]; + CloseDeskFromMiniView(desk_1_mini_view, GetEventGenerator()); + desks_bar_2_observer.Wait(); + + // Verify that we are still in overview mode and that both desks bars are in + // the zero state. + ASSERT_TRUE(overview_controller->InOverviewSession()); + ASSERT_TRUE(desks_bar_view_1->IsZeroState()); + const auto* desks_bar_view_2 = + GetOverviewGridForRoot(root_windows[1])->desks_bar_view(); + ASSERT_TRUE(desks_bar_view_2->IsZeroState()); +} + namespace { PrefService* GetPrimaryUserPrefService() {
diff --git a/base/BUILD.gn b/base/BUILD.gn index d88d946..d92045b 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -621,6 +621,7 @@ "sequence_checker_impl.h", "sequence_token.cc", "sequence_token.h", + "state_transitions.h", "stl_util.h", "strings/abseil_string_conversions.cc", "strings/abseil_string_conversions.h", @@ -3223,6 +3224,7 @@ "security_unittest.cc", "sequence_checker_unittest.cc", "sequence_token_unittest.cc", + "state_transitions_unittest.cc", "stl_util_unittest.cc", "strings/abseil_string_conversions_unittest.cc", "strings/abseil_string_number_conversions_unittest.cc",
diff --git a/content/common/state_transitions.h b/base/state_transitions.h similarity index 91% rename from content/common/state_transitions.h rename to base/state_transitions.h index 25c16c4..8361968 100644 --- a/content/common/state_transitions.h +++ b/base/state_transitions.h
@@ -2,17 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CONTENT_COMMON_STATE_TRANSITIONS_H_ -#define CONTENT_COMMON_STATE_TRANSITIONS_H_ +#ifndef BASE_STATE_TRANSITIONS_H_ +#define BASE_STATE_TRANSITIONS_H_ #include <vector> #include "base/check_op.h" #include "base/containers/contains.h" #include "base/no_destructor.h" -#include "content/common/content_export.h" -namespace content { +namespace base { // This class represents a set of state transitions where each state is a value // that supports copy, << and == (e.g. an enum element). It's intended to be @@ -37,7 +36,7 @@ // In foo.cc // --------- // #include "base/no_destructor.h" -// #include "content/common/state_transitions.h" +// #include "base/state_transitions.h" // // std::ostream& operator<<(std::ostream& o, const State& s) { // return o << static_cast<int>(s); @@ -96,6 +95,6 @@ DCHECK((transitions)->IsTransitionValid((old_state), (new_state))) \ << "Invalid transition: " << old_state << " -> " << new_state -} // namespace content +} // namespace base -#endif // CONTENT_COMMON_STATE_TRANSITIONS_H_ +#endif // BASE_STATE_TRANSITIONS_H_
diff --git a/content/common/state_transitions_unittest.cc b/base/state_transitions_unittest.cc similarity index 97% rename from content/common/state_transitions_unittest.cc rename to base/state_transitions_unittest.cc index 6f5f21b..4292638 100644 --- a/content/common/state_transitions_unittest.cc +++ b/base/state_transitions_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "content/common/state_transitions.h" +#include "base/state_transitions.h" #include <ostream> #include <string> @@ -12,7 +12,7 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -namespace content { +namespace base { enum class State { kState1 = 0, kState2, kState3, kState4 }; @@ -97,4 +97,4 @@ ASSERT_FALSE(transitions.IsTransitionValid("foo", "bar")); } -} // namespace content +} // namespace base
diff --git a/base/task/sequence_manager/timing_wheel.h b/base/task/sequence_manager/timing_wheel.h index d31b966..89ef355 100644 --- a/base/task/sequence_manager/timing_wheel.h +++ b/base/task/sequence_manager/timing_wheel.h
@@ -5,6 +5,7 @@ #ifndef BASE_TASK_SEQUENCE_MANAGER_TIMING_WHEEL_H_ #define BASE_TASK_SEQUENCE_MANAGER_TIMING_WHEEL_H_ +#include <algorithm> #include <array> #include <limits> #include <memory>
diff --git a/build/android/pylib/local/device/local_device_instrumentation_test_run.py b/build/android/pylib/local/device/local_device_instrumentation_test_run.py index 36633a5..d85618a6 100644 --- a/build/android/pylib/local/device/local_device_instrumentation_test_run.py +++ b/build/android/pylib/local/device/local_device_instrumentation_test_run.py
@@ -1262,6 +1262,24 @@ has_batch_limit = self._test_instance.test_launcher_batch_limit is not None return is_tryjob and has_filter and has_batch_limit + def _IsFlakeEndorserRun(self): + """Checks whether this test run is part of the flake endorser. + + Returns: + True iff this is being run on a trybot and the current step is part of the + flake endorser. + """ + is_tryjob = self._test_instance.skia_gold_properties.IsTryjobRun() + # Flake endorser shards automatically pass in --gtest_repeat, + # --gtest_filter, and --test-launcher-retry-limit. This is similar to retry + # without patch steps, but does NOT include --test-launcher-batch-limit. + # Additionally, flake endorser shards are run with many more retries than + # the usual 3. + has_filter = bool(self._test_instance.test_filter) + has_batch_limit = self._test_instance.test_launcher_batch_limit is not None + many_retries = self._env.max_tries > 3 + return is_tryjob and has_filter and not has_batch_limit and many_retries + def _ProcessSkiaGoldRenderTestResults(self, device, results): gold_dir = posixpath.join(self._render_tests_device_output_dir, _DEVICE_GOLD_DIR) @@ -1339,6 +1357,16 @@ gold_session = self._skia_gold_session_manager.GetSkiaGoldSession( keys_input=json_path) + # Both retry without patch steps and flake endorser runs run into an + # issue where they can clobber untriaged results we care about with + # previously triaged (usually good) results. So, run those in dryrun + # mode. In the case of a flake endorser run, we want to re-run the + # comparison without dryrun if the dryrun fails so that the image that + # needs triaging is uploaded. + should_force_dryrun = (self._IsRetryWithoutPatch() + or self._IsFlakeEndorserRun()) + should_redo_on_failed_dryrun = self._IsFlakeEndorserRun() + try: status, error = gold_session.RunComparison( name=render_name, @@ -1346,11 +1374,23 @@ output_manager=self._env.output_manager, use_luci=use_luci, optional_keys=optional_dict, - force_dryrun=self._IsRetryWithoutPatch()) + force_dryrun=should_force_dryrun) except Exception as e: # pylint: disable=broad-except + error = e + if should_redo_on_failed_dryrun: + try: + status, error = gold_session.RunComparison( + name=render_name, + png_file=image_path, + output_manager=self._env.output_manager, + use_luci=use_luci, + optional_keys=optional_dict, + force_dryrun=False) + except Exception as inner_e: # pylint: disable=broad-except + error = inner_e _FailTestIfNecessary(results, full_test_name) _AppendToLog(results, full_test_name, - 'Skia Gold comparison raised exception: %s' % e) + 'Skia Gold comparison raised exception: %s' % error) continue if not status:
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni index 730bfbd..294beb6 100644 --- a/build/config/android/internal_rules.gni +++ b/build/config/android/internal_rules.gni
@@ -733,8 +733,8 @@ executable = "//testing/test_env.py" - if (defined(android_test_runner_script)) { - _runner_script = android_test_runner_script + if (defined(invoker.android_test_runner_script)) { + _runner_script = invoker.android_test_runner_script } else { _runner_script = "//build/android/test_runner.py" }
diff --git a/build/config/chromeos/rules.gni b/build/config/chromeos/rules.gni index 35c906d..07c05a18 100644 --- a/build/config/chromeos/rules.gni +++ b/build/config/chromeos/rules.gni
@@ -480,6 +480,7 @@ # Needed for various SDK components used below. "//build/cros_cache/chrome-sdk/misc/", "//build/cros_cache/chrome-sdk/symlinks/", + "//chrome/VERSION", # The LKGM file controls what version of the VM image to download. Add it # as data here so that changes to it will trigger analyze.
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index 37b87c2..5c9f5d4 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn
@@ -1530,9 +1530,6 @@ # TODO(https://crbug.com/1300731) Clean up and enable. "-Wno-unqualified-std-cast-call", - # TODO(crbug.com/1343303) Evaluate and possibly enable. - "-Wno-array-parameter", - # TODO(crbug.com/1343975) Evaluate and possibly enable. "-Wno-deprecated-builtins", ]
diff --git a/cc/paint/paint_shader.cc b/cc/paint/paint_shader.cc index dc267315..c96bf1c 100644 --- a/cc/paint/paint_shader.cc +++ b/cc/paint/paint_shader.cc
@@ -410,28 +410,25 @@ base::OptionalOrNullptr(local_matrix_)); } case Type::kRadialGradient: - // TODO(crbug/1308932): Remove this helper vector colors and make all - // SkColor4f. return SkGradientShader::MakeRadial( - center_, start_radius_, colors.data(), + center_, start_radius_, colors_.data(), + nullptr /*sk_sp<SkColorSpace>*/, positions_.empty() ? nullptr : positions_.data(), - static_cast<int>(colors.size()), tx_, flags_, + static_cast<int>(colors_.size()), tx_, flags_, base::OptionalOrNullptr(local_matrix_)); case Type::kTwoPointConicalGradient: - // TODO(crbug/1308932): Remove this helper vector colors and make all - // SkColor4f. return SkGradientShader::MakeTwoPointConical( - start_point_, start_radius_, end_point_, end_radius_, colors.data(), + start_point_, start_radius_, end_point_, end_radius_, colors_.data(), + nullptr /*sk_sp<SkColorSpace>*/, positions_.empty() ? nullptr : positions_.data(), - static_cast<int>(colors.size()), tx_, flags_, + static_cast<int>(colors_.size()), tx_, flags_, base::OptionalOrNullptr(local_matrix_)); case Type::kSweepGradient: - // TODO(crbug/1308932): Remove this helper vector colors and make all - // SkColor4f. return SkGradientShader::MakeSweep( - center_.x(), center_.y(), colors.data(), + center_.x(), center_.y(), colors_.data(), + nullptr /*sk_sp<SkColorSpace>*/, positions_.empty() ? nullptr : positions_.data(), - static_cast<int>(colors.size()), tx_, start_degrees_, end_degrees_, + static_cast<int>(colors_.size()), tx_, start_degrees_, end_degrees_, flags_, base::OptionalOrNullptr(local_matrix_)); case Type::kImage: if (sk_cached_image_) {
diff --git a/cc/trees/property_tree_builder_unittest.cc b/cc/trees/property_tree_builder_unittest.cc index fe8ecc92..a5e1770 100644 --- a/cc/trees/property_tree_builder_unittest.cc +++ b/cc/trees/property_tree_builder_unittest.cc
@@ -807,7 +807,7 @@ EXPECT_EQ(gfx::RectF(10, 10, 300, 200), layer_impl1->draw_properties().mask_filter_info.bounds()); // |angle| is updated by the scale transform. - EXPECT_EQ(33, layer_impl1->draw_properties() + EXPECT_EQ(34, layer_impl1->draw_properties() .mask_filter_info.gradient_mask() ->angle()); EXPECT_EQ(gradient_mask.steps(), layer_impl1->draw_properties() @@ -879,7 +879,7 @@ render_surface_impl1->mask_filter_info().bounds()); // |angle| is updated by the scale transform. EXPECT_EQ( - 33, render_surface_impl1->mask_filter_info().gradient_mask()->angle()); + 34, render_surface_impl1->mask_filter_info().gradient_mask()->angle()); EXPECT_EQ( gradient_mask.steps(), render_surface_impl1->mask_filter_info().gradient_mask()->steps()); @@ -981,7 +981,7 @@ EXPECT_EQ(gfx::RectF(30, 10, 300, 150), draw_properties2.mask_filter_info.bounds()); // |angle| is updated by the scale transform. - EXPECT_EQ(26, draw_properties2.mask_filter_info.gradient_mask()->angle()); + EXPECT_EQ(27, draw_properties2.mask_filter_info.gradient_mask()->angle()); EXPECT_EQ(gradient_mask2.steps(), draw_properties2.mask_filter_info.gradient_mask()->steps()); }
diff --git a/chrome/VERSION b/chrome/VERSION index 7389ee9..a98f709 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=106 MINOR=0 -BUILD=5217 +BUILD=5218 PATCH=0
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni index a7bf57b..09b1169 100644 --- a/chrome/android/chrome_java_sources.gni +++ b/chrome/android/chrome_java_sources.gni
@@ -83,8 +83,9 @@ "java/src/org/chromium/chrome/browser/app/download/home/PrefetchEnabledSupplier.java", "java/src/org/chromium/chrome/browser/app/feature_guide/notifications/FeatureNotificationGuideDelegate.java", "java/src/org/chromium/chrome/browser/app/feed/FeedActionDelegateImpl.java", + "java/src/org/chromium/chrome/browser/app/feed/FeedServiceDependencyProviderFactoryImpl.java", + "java/src/org/chromium/chrome/browser/app/feed/FeedServiceUtilImpl.java", "java/src/org/chromium/chrome/browser/app/feed/NavigationRecorder.java", - "java/src/org/chromium/chrome/browser/app/feed/ProcessScopeDependencyProviderFactory.java", "java/src/org/chromium/chrome/browser/app/feed/feedmanagement/FeedManagementActivity.java", "java/src/org/chromium/chrome/browser/app/feed/followmanagement/FollowManagementActivity.java", "java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java", @@ -736,6 +737,7 @@ "java/src/org/chromium/chrome/browser/messages/ChromeMessageAutodismissDurationProvider.java", "java/src/org/chromium/chrome/browser/messages/ChromeMessageQueueMediator.java", "java/src/org/chromium/chrome/browser/messages/MessageContainerCoordinator.java", + "java/src/org/chromium/chrome/browser/messages/MessageContainerObserver.java", "java/src/org/chromium/chrome/browser/metrics/ActivityTabStartupMetricsTracker.java", "java/src/org/chromium/chrome/browser/metrics/AndroidSessionDurationsServiceState.java", "java/src/org/chromium/chrome/browser/metrics/LaunchMetrics.java",
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantQrCodeIntegrationTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantQrCodeIntegrationTest.java index 4cce1b4..2f7a848 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantQrCodeIntegrationTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantQrCodeIntegrationTest.java
@@ -6,6 +6,10 @@ import static androidx.test.espresso.Espresso.onView; import static androidx.test.espresso.action.ViewActions.click; +import static androidx.test.espresso.intent.Intents.intended; +import static androidx.test.espresso.intent.Intents.intending; +import static androidx.test.espresso.intent.matcher.IntentMatchers.hasAction; +import static androidx.test.espresso.intent.matcher.IntentMatchers.isInternal; import static androidx.test.espresso.matcher.ViewMatchers.assertThat; import static androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed; import static androidx.test.espresso.matcher.ViewMatchers.withContentDescription; @@ -13,12 +17,20 @@ import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.iterableWithSize; +import static org.hamcrest.Matchers.not; import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.startAutofillAssistant; import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.waitUntilViewMatchesCondition; +import android.app.Activity; +import android.app.Instrumentation.ActivityResult; +import android.content.Intent; + +import androidx.test.espresso.intent.Intents; import androidx.test.filters.MediumTest; +import org.junit.After; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.RuleChain; @@ -34,6 +46,7 @@ import org.chromium.chrome.browser.autofill_assistant.proto.PromptProto; import org.chromium.chrome.browser.autofill_assistant.proto.PromptQrCodeScanProto; import org.chromium.chrome.browser.autofill_assistant.proto.PromptQrCodeScanProto.CameraScanUiStrings; +import org.chromium.chrome.browser.autofill_assistant.proto.PromptQrCodeScanProto.ImagePickerUiStrings; import org.chromium.chrome.browser.autofill_assistant.proto.SupportedScriptProto; import org.chromium.chrome.browser.autofill_assistant.proto.SupportedScriptProto.PresentationProto; import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule; @@ -54,6 +67,19 @@ private final CustomTabActivityTestRule mTestRule = new CustomTabActivityTestRule(); + @Before + public void setUp() { + // Initializes Intents and begins recording intents. Must be called prior to triggering + // any actions that send out intents which need to be verified or stubbed. + Intents.init(); + } + + @After + public void tearDown() { + // Clears Intents state. + Intents.release(); + } + @Rule public final TestRule mRulesChain = RuleChain.outerRule(mTestRule).around( new AutofillAssistantCustomTabTestRule(mTestRule, TEST_PAGE)); @@ -109,6 +135,44 @@ List<ProcessedActionProto> processedActions = testService.getProcessedActions(); assertThat(processedActions, iterableWithSize(1)); assertThat(processedActions.get(0).getStatus(), - is(ProcessedActionStatusProto.OTHER_ACTION_STATUS)); + is(ProcessedActionStatusProto.QR_CODE_SCAN_CANCELLED)); + } + + @Test + @MediumTest + public void testImagePickerCreatesActionPickIntent() throws Exception { + // Stub all external intents. By default Espresso does not stub any Intent. Note that in + // this case, all external calls will be blocked. + intending(not(isInternal())).respondWith(new ActivityResult(Activity.RESULT_OK, null)); + + ArrayList<ActionProto> list = new ArrayList<>(); + ImagePickerUiStrings imagePickerUiStrings = + ImagePickerUiStrings.newBuilder() + .setTitleText("Scan QR Code") + .setPermissionText("Please provide permissions to access images") + .setPermissionButtonText("Continue") + .setOpenSettingsText("Please enable media permissions in device settings") + .setOpenSettingsButtonText("Open Settings") + .build(); + list.add(ActionProto.newBuilder() + .setPromptQrCodeScan( + PromptQrCodeScanProto.newBuilder() + .setUseGallery(true) + .setOutputClientMemoryKey("output_client_memory_key") + .setImagePickerUiStrings(imagePickerUiStrings)) + .build()); + AutofillAssistantTestScript script = new AutofillAssistantTestScript( + SupportedScriptProto.newBuilder() + .setPath(TEST_PAGE) + .setPresentation(PresentationProto.newBuilder().setAutostart(true)) + .build(), + list); + + AutofillAssistantTestService testService = + new AutofillAssistantTestService(Collections.singletonList(script)); + startAutofillAssistant(mTestRule.getActivity(), testService); + + // Verify that an ACTION_PICK intent is started. + intended(hasAction(Intent.ACTION_PICK)); } }
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurface.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurface.java index 178bef17..2b34399 100644 --- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurface.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurface.java
@@ -41,9 +41,17 @@ void onHide(); /** + * Called before start surface starts hiding. + */ + void beforeHideTabSwitcherView(); + + /** * An observer that is notified when the start surface internal state, excluding * the states notified in {@link TabSwitcherViewObserver}, is changed. */ + // TODO(crbug.com/1315679): Replace this observer with LayoutStateObserver after the {@link + // ChromeFeatureList.START_SURFACE_REFACTOR} is enabled by default. + @Deprecated interface StateObserver { /** * Called when the internal state is changed.
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java index e22acfbf..bbc29f1 100644 --- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java
@@ -460,6 +460,11 @@ } @Override + public void beforeHideTabSwitcherView() { + mStartSurfaceMediator.beforeHideTabSwitcherView(); + } + + @Override public void showOverview(boolean animate) { mStartSurfaceMediator.showOverview(animate); }
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java index df45bb3..c26b445 100644 --- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
@@ -596,6 +596,10 @@ mController.hideTabSwitcherView(animate); } + public void beforeHideTabSwitcherView() { + mController.prepareHideTabSwitcherView(); + } + void showOverview(boolean animate) { // TODO(crbug.com/982018): Animate the bottom bar together with the Tab Grid view. if (mPropertyModel != null) {
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceState.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceState.java index 3a143929..8b00783 100644 --- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceState.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceState.java
@@ -17,6 +17,9 @@ StartSurfaceState.SHOWING_TABSWITCHER, StartSurfaceState.SHOWING_START, StartSurfaceState.SHOWING_HOMEPAGE, StartSurfaceState.SHOWING_PREVIOUS}) @Retention(RetentionPolicy.SOURCE) +// TODO(https://crbug.com/1315679): Replace this with {@link LayoutType} after the {@link +// ChromeFeatureList.START_SURFACE_REFACTOR} is enabled by default. +@Deprecated public @interface StartSurfaceState { int NOT_SHOWN = 0;
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayout.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayout.java index 0b53caa..3da589c 100644 --- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayout.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayout.java
@@ -71,8 +71,9 @@ // Duration of the transition animation public static final long ZOOMING_DURATION = 300; - private static final int TRANSLATE_DURATION_MS = 450; + private static final int TRANSLATE_DURATION_MS = 400; private static final int BACKGROUND_FADING_DURATION_MS = 150; + private static final int SCRIM_FADE_DURATION_MS = 450; private static final String TRACE_SHOW_TAB_SWITCHER = "StartSurfaceLayout.Show.TabSwitcher"; private static final String TRACE_HIDE_TAB_SWITCHER = "StartSurfaceLayout.Hide.TabSwitcher"; @@ -81,7 +82,7 @@ // The transition animation from a tab to the tab switcher. private AnimatorSet mTabToSwitcherAnimation; - private boolean mIsAnimating; + private boolean mIsAnimatingHide; private TabListSceneLayer mSceneLayer; private final StartSurface mStartSurface; @@ -297,7 +298,7 @@ private void hideBrowserScrim() { if (mScrimCoordinator == null || !mScrimCoordinator.isShowingScrim()) return; - mScrimCoordinator.hideScrim(true); + mScrimCoordinator.hideScrim(true, SCRIM_FADE_DURATION_MS); } @Override @@ -361,7 +362,7 @@ updateCacheVisibleIds(new LinkedList<>(Arrays.asList(sourceTabId))); - mIsAnimating = true; + mIsAnimatingHide = true; if (TabUiFeatureUtilities.isTabletGridTabSwitcherPolishEnabled(getContext())) { translateDown(); } else { @@ -659,6 +660,7 @@ mTabToSwitcherAnimation.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { + mStartSurface.beforeHideTabSwitcherView(); mStartSurface.setSnackbarParentView(null); } @@ -727,7 +729,7 @@ } else { getGridTabListDelegate().postHiding(); } - mIsAnimating = false; + mIsAnimatingHide = false; doneHiding(); } @@ -814,7 +816,7 @@ @Override public boolean onUpdateAnimation(long time, boolean jumpToEnd) { - return mTabToSwitcherAnimation == null && !mIsAnimating; + return mTabToSwitcherAnimation == null && !mIsAnimatingHide; } @Override
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherMediator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherMediator.java index ede799a..b345814 100644 --- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherMediator.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherMediator.java
@@ -182,6 +182,9 @@ } @Override + public void prepareHideTabSwitcherView() {} + + @Override public void hideTabSwitcherView(boolean animate) { mShouldIgnoreNextSelect = false; mTabModelSelector.getTabModelFilterProvider().removeTabModelFilterObserver(
diff --git a/chrome/android/features/tab_ui/BUILD.gn b/chrome/android/features/tab_ui/BUILD.gn index 4a0ec24..26b9cb62 100644 --- a/chrome/android/features/tab_ui/BUILD.gn +++ b/chrome/android/features/tab_ui/BUILD.gn
@@ -146,7 +146,9 @@ "java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorAction.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorActionProperties.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorActionProvider.java", + "java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCloseAction.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCoordinator.java", + "java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorGroupAction.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorLayout.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorLayoutBinder.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMediator.java", @@ -155,6 +157,7 @@ "java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenuItem.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorProperties.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorToolbar.java", + "java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorUngroupAction.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabStripViewBinder.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabSuggestionMessageCardViewModel.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabSuggestionMessageService.java",
diff --git a/chrome/android/features/tab_ui/java/res/values/ids.xml b/chrome/android/features/tab_ui/java/res/values/ids.xml index f3c4353f..ca515b6 100644 --- a/chrome/android/features/tab_ui/java/res/values/ids.xml +++ b/chrome/android/features/tab_ui/java/res/values/ids.xml
@@ -12,4 +12,9 @@ <item type="id" name="move_tab_right" /> <item type="id" name="move_tab_up" /> <item type="id" name="move_tab_down" /> + + <!-- Tab selection editor menu items--> + <item type="id" name="tab_selection_editor_close_menu_item" /> + <item type="id" name="tab_selection_editor_group_menu_item" /> + <item type="id" name="tab_selection_editor_ungroup_menu_item" /> </resources>
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogView.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogView.java index 24bd0103..d019ed9b 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogView.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogView.java
@@ -39,6 +39,8 @@ import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator; import org.chromium.components.browser_ui.widget.scrim.ScrimProperties; import org.chromium.ui.KeyboardVisibilityDelegate; +import org.chromium.ui.base.DeviceFormFactor; +import org.chromium.ui.base.ViewUtils; import org.chromium.ui.interpolators.BakedBezierInterpolator; import org.chromium.ui.modelutil.PropertyModel; @@ -55,6 +57,9 @@ private static final int DIALOG_UNGROUP_ALPHA_ANIMATION_DURATION = 200; private static final int DIALOG_ALPHA_ANIMATION_DURATION = 150; private static final int CARD_FADE_ANIMATION_DURATION = 50; + private static final int Y_TRANSLATE_DURATION_MS = 400; + private static final int SCRIM_FADE_DURATION_MS = 450; + private static Callback<RectF> sSourceRectCallbackForTesting; @IntDef({UngroupBarStatus.SHOW, UngroupBarStatus.HIDE, UngroupBarStatus.HOVERED}) @@ -96,6 +101,7 @@ private Animator mCurrentUngroupBarAnimator; private AnimatorSet mBasicFadeInAnimation; private AnimatorSet mBasicFadeOutAnimation; + private ObjectAnimator mYTranslateAnimation; private ObjectAnimator mUngroupBarShow; private ObjectAnimator mUngroupBarHide; private AnimatorSet mShowDialogAnimation; @@ -205,9 +211,20 @@ mBasicFadeOutAnimation.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { - // Restore the original card. - if (mItemView == null) return; - mItemView.setAlpha(1f); + updateItemViewAlpha(); + } + }); + + final int screenHeightPx = ViewUtils.dpToPx( + getContext(), getContext().getResources().getConfiguration().screenHeightDp); + mYTranslateAnimation = ObjectAnimator.ofFloat(mDialogContainerView, View.TRANSLATION_Y, + mDialogContainerView.getY(), screenHeightPx); + mYTranslateAnimation.setInterpolator(Interpolators.EMPHASIZED_ACCELERATE); + mYTranslateAnimation.setDuration(Y_TRANSLATE_DURATION_MS); + mYTranslateAnimation.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + updateItemViewAlpha(); } }); @@ -275,6 +292,12 @@ }); } + private void updateItemViewAlpha() { + // Restore the original card. + if (mItemView == null) return; + mItemView.setAlpha(1f); + } + private void clearBackgroundViewAccessibilityImportance() { assert mAccessibilityImportanceMap.size() == 0; @@ -319,7 +342,10 @@ mShowDialogAnimation.addListener(mShowDialogAnimationListener); mHideDialogAnimation = new AnimatorSet(); - mHideDialogAnimation.play(mBasicFadeOutAnimation); + Animator hideAnimator = TabUiFeatureUtilities.isTabletTabGroupsEnabled(getContext()) + ? mYTranslateAnimation + : mBasicFadeOutAnimation; + mHideDialogAnimation.play(hideAnimator); mHideDialogAnimation.removeAllListeners(); mHideDialogAnimation.addListener(mHideDialogAnimationListener); return; @@ -747,7 +773,11 @@ } mCurrentDialogAnimator = mHideDialogAnimation; if (mScrimCoordinator.isShowingScrim()) { - mScrimCoordinator.hideScrim(true); + if (DeviceFormFactor.isNonMultiDisplayContextOnTablet(mContext)) { + mScrimCoordinator.hideScrim(true, SCRIM_FADE_DURATION_MS); + } else { + mScrimCoordinator.hideScrim(true); + } } mHideDialogAnimation.start(); }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorAction.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorAction.java index c3a457e..d30d156 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorAction.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorAction.java
@@ -20,7 +20,6 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; -import java.util.Collection; import java.util.List; /** @@ -91,7 +90,7 @@ private ObserverList<ActionObserver> mObsevers = new ObserverList<>(); private PropertyModel mModel; - private TabModelSelector mTabModelSelector; + protected TabModelSelector mTabModelSelector; private SelectionDelegate<Integer> mSelectionDelegate; public TabSelectionEditorAction(int menuItemId, @ShowMode int showMode, @@ -157,10 +156,7 @@ * @return whether an action was taken. */ public boolean performAction() { - assert mTabModelSelector != null; - assert mSelectionDelegate != null; - List<Tab> tabs = - getTabsFromSelection(mSelectionDelegate.getSelectedItems(), mTabModelSelector); + List<Tab> tabs = getTabsFromSelection(); for (ActionObserver obs : mObsevers) { obs.preProcessSelectedTabs(tabs); @@ -182,11 +178,21 @@ return mModel; } - private static List<Tab> getTabsFromSelection( - Collection<Integer> tabIds, TabModelSelector tabModelSelector) { + protected void setEnabledAndItemCount(boolean enabled, int itemCount) { + mModel.set(TabSelectionEditorActionProperties.ENABLED, enabled); + mModel.set(TabSelectionEditorActionProperties.ITEM_COUNT, itemCount); + } + + protected List<Tab> getTabsFromSelection() { + assert mTabModelSelector != null; + assert mSelectionDelegate != null; + List<Tab> selectedTabs = new ArrayList<>(); - for (int tabId : tabIds) { - selectedTabs.add(TabModelUtils.getTabById(tabModelSelector.getCurrentModel(), tabId)); + for (int tabId : mSelectionDelegate.getSelectedItems()) { + Tab tab = TabModelUtils.getTabById(mTabModelSelector.getCurrentModel(), tabId); + if (tab == null) continue; + + selectedTabs.add(tab); } return selectedTabs; }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCloseAction.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCloseAction.java new file mode 100644 index 0000000..d4ada534 --- /dev/null +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCloseAction.java
@@ -0,0 +1,50 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.tasks.tab_management; + +import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.tab_ui.R; + +import java.util.List; + +/** + * Close action for the {@link TabSelectionEditorMenu}. + */ +public class TabSelectionEditorCloseAction extends TabSelectionEditorAction { + /** + * Create an action for closing tabs. + * @param showMode whether to show an action view. + * @param buttonType the type of the action view. + * @param iconPosition the position of the icon in the action view. + */ + public static TabSelectionEditorAction createAction( + @ShowMode int showMode, @ButtonType int buttonType, @IconPosition int iconPosition) { + // TODO(ckitagawa): Load drawable and pass to constructor. + return new TabSelectionEditorCloseAction(showMode, buttonType, iconPosition); + } + + private TabSelectionEditorCloseAction( + @ShowMode int showMode, @ButtonType int buttonType, @IconPosition int iconPosition) { + super(R.id.tab_selection_editor_close_menu_item, showMode, buttonType, iconPosition, + R.string.tab_suggestion_close_tab_action_button, + R.plurals.accessibility_tab_suggestion_close_tab_action_button, null); + } + + @Override + public void onSelectionStateChanged(List<Integer> tabIds) { + setEnabledAndItemCount(!tabIds.isEmpty(), tabIds.size()); + } + + @Override + public boolean performAction() { + super.performAction(); + List<Tab> tabs = getTabsFromSelection(); + + assert !tabs.isEmpty() : "Close action should not be enabled for no tabs."; + + mTabModelSelector.getCurrentModel().closeMultipleTabs(tabs, true); + return true; + } +}
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorGroupAction.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorGroupAction.java new file mode 100644 index 0000000..6f367fe --- /dev/null +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorGroupAction.java
@@ -0,0 +1,75 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.tasks.tab_management; + +import org.chromium.base.metrics.RecordUserAction; +import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tabmodel.TabModel; +import org.chromium.chrome.browser.tabmodel.TabModelSelector; +import org.chromium.chrome.browser.tabmodel.TabModelUtils; +import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter; +import org.chromium.chrome.tab_ui.R; + +import java.util.List; + +/** + * Group action for the {@link TabSelectionEditorMenu}. + */ +public class TabSelectionEditorGroupAction extends TabSelectionEditorAction { + /** + * Create an action for grouping tabs. + * @param showMode whether to show an action view. + * @param buttonType the type of the action view. + * @param iconPosition the position of the icon in the action view. + */ + public static TabSelectionEditorAction createAction( + @ShowMode int showMode, @ButtonType int buttonType, @IconPosition int iconPosition) { + // TODO(ckitagawa): Load drawable and pass to constructor. + return new TabSelectionEditorGroupAction(showMode, buttonType, iconPosition); + } + + private TabSelectionEditorGroupAction( + @ShowMode int showMode, @ButtonType int buttonType, @IconPosition int iconPosition) { + super(R.id.tab_selection_editor_group_menu_item, showMode, buttonType, iconPosition, + R.string.tab_selection_editor_group, + R.plurals.accessibility_tab_selection_editor_group_button, null); + } + + @Override + public void onSelectionStateChanged(List<Integer> tabIds) { + assert mTabModelSelector.getTabModelFilterProvider().getCurrentTabModelFilter() + instanceof TabGroupModelFilter; + + setEnabledAndItemCount(tabIds.size() > 1, tabIds.size()); + } + + @Override + public boolean performAction() { + super.performAction(); + assert mTabModelSelector.getTabModelFilterProvider().getCurrentTabModelFilter() + instanceof TabGroupModelFilter; + List<Tab> tabs = getTabsFromSelection(); + + Tab destinationTab = getDestinationTab(tabs, mTabModelSelector); + TabGroupModelFilter tabGroupModelFilter = + (TabGroupModelFilter) mTabModelSelector.getTabModelFilterProvider() + .getCurrentTabModelFilter(); + tabGroupModelFilter.mergeListOfTabsToGroup(tabs, destinationTab, false, true); + + RecordUserAction.record("TabMultiSelect.Done"); + RecordUserAction.record("TabGroup.Created.TabMultiSelect"); + return true; + } + + private Tab getDestinationTab(List<Tab> tabs, TabModelSelector tabModelSelector) { + int greatestIndex = TabModel.INVALID_TAB_INDEX; + for (int i = 0; i < tabs.size(); i++) { + final int index = TabModelUtils.getTabIndexById( + tabModelSelector.getCurrentModel(), tabs.get(i).getId()); + greatestIndex = Math.max(index, greatestIndex); + } + return tabModelSelector.getCurrentModel().getTabAt(greatestIndex); + } +}
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorUngroupAction.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorUngroupAction.java new file mode 100644 index 0000000..3e0d544c --- /dev/null +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorUngroupAction.java
@@ -0,0 +1,61 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.tasks.tab_management; + +import org.chromium.base.metrics.RecordUserAction; +import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter; +import org.chromium.chrome.tab_ui.R; + +import java.util.List; + +/** + * Ungroup action for the {@link TabSelectionEditorMenu}. + */ +public class TabSelectionEditorUngroupAction extends TabSelectionEditorAction { + /** + * Create an action for ungrouping tabs. + * @param showMode whether to show an action view. + * @param buttonType the type of the action view. + * @param iconPosition the position of the icon in the action view. + */ + public static TabSelectionEditorAction createAction( + @ShowMode int showMode, @ButtonType int buttonType, @IconPosition int iconPosition) { + // TODO(ckitagawa): Load drawable and pass to constructor. + return new TabSelectionEditorUngroupAction(showMode, buttonType, iconPosition); + } + + private TabSelectionEditorUngroupAction( + @ShowMode int showMode, @ButtonType int buttonType, @IconPosition int iconPosition) { + super(R.id.tab_selection_editor_ungroup_menu_item, showMode, buttonType, iconPosition, + R.string.tab_grid_dialog_selection_mode_remove, + R.plurals.accessibility_tab_selection_dialog_remove_button, null); + } + + @Override + public void onSelectionStateChanged(List<Integer> tabIds) { + assert mTabModelSelector.getTabModelFilterProvider().getCurrentTabModelFilter() + instanceof TabGroupModelFilter; + + setEnabledAndItemCount(!tabIds.isEmpty(), tabIds.size()); + } + + @Override + public boolean performAction() { + super.performAction(); + assert mTabModelSelector.getTabModelFilterProvider().getCurrentTabModelFilter() + instanceof TabGroupModelFilter; + List<Tab> tabs = getTabsFromSelection(); + + TabGroupModelFilter filter = + (TabGroupModelFilter) mTabModelSelector.getTabModelFilterProvider() + .getCurrentTabModelFilter(); + for (Tab tab : tabs) { + filter.moveTabOutOfGroup(tab.getId()); + } + RecordUserAction.record("TabGridDialog.RemoveFromGroup.TabMultiSelect"); + return true; + } +}
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcher.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcher.java index 0736bb0..f31a4dc 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcher.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcher.java
@@ -102,6 +102,11 @@ void removeTabSwitcherViewObserver(TabSwitcherViewObserver listener); /** + * Before tab switcher starts hiding. + */ + void prepareHideTabSwitcherView(); + + /** * Hide the tab switcher view. * @param animate Whether we should animate while hiding. */
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherBackPressHandler.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherBackPressHandler.java index fd426d65..6544a50 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherBackPressHandler.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherBackPressHandler.java
@@ -24,16 +24,19 @@ private final OneshotSupplier<LayoutStateProvider> mLayoutStateProviderSupplier; private final OneshotSupplier<StartSurface> mStartSurfaceSupplier; private final Runnable mShowBrowsing; + private final boolean mIsStartSurfaceRefactorEnabled; private final ObservableSupplierImpl<Boolean> mBackPressChangedSupplier = new ObservableSupplierImpl<>(); public TabSwitcherBackPressHandler( OneshotSupplier<LayoutStateProvider> layoutStateProviderSupplier, - OneshotSupplier<StartSurface> startSurfaceSupplier, Runnable showBrowsing) { + OneshotSupplier<StartSurface> startSurfaceSupplier, Runnable showBrowsing, + boolean isStartSurfaceRefactorEnabled) { layoutStateProviderSupplier.onAvailable(this::onLayoutStateProviderAvailable); startSurfaceSupplier.onAvailable(this::onStartSurfaceAvailable); mLayoutStateProviderSupplier = layoutStateProviderSupplier; mStartSurfaceSupplier = startSurfaceSupplier; mShowBrowsing = showBrowsing; + mIsStartSurfaceRefactorEnabled = isStartSurfaceRefactorEnabled; onBackPressChanged(); } @@ -73,21 +76,28 @@ } private void onStartSurfaceAvailable(StartSurface startSurface) { + if (mIsStartSurfaceRefactorEnabled) return; + // TODO(crbug.com/1315679): Remove |mStartSurfaceSupplier| and + // StartSurfaceStateChangeObserver when refactor flag is enabled by default. startSurface.addStateChangeObserver(this); onBackPressChanged(); } private void onBackPressChanged() { LayoutStateProvider provider = mLayoutStateProviderSupplier.get(); - boolean isOverviewVisible = - provider != null && provider.isLayoutVisible(LayoutType.TAB_SWITCHER); + boolean isOverviewVisible = provider != null + && (provider.isLayoutVisible(LayoutType.TAB_SWITCHER) + || provider.isLayoutVisible(LayoutType.START_SURFACE)); if (!isOverviewVisible) { mBackPressChangedSupplier.set(false); return; } StartSurface startSurface = mStartSurfaceSupplier.get(); - boolean isStartSurfaceShownTabSwitcher = startSurface == null - || startSurface.getStartSurfaceState() == StartSurfaceState.SHOWN_TABSWITCHER; + boolean isStartSurfaceShownTabSwitcher = mIsStartSurfaceRefactorEnabled + ? provider.isLayoutVisible(LayoutType.TAB_SWITCHER) + : startSurface == null + || startSurface.getStartSurfaceState() + == StartSurfaceState.SHOWN_TABSWITCHER; mBackPressChangedSupplier.set(isStartSurfaceShownTabSwitcher); } }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherLayout.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherLayout.java index 9b932c7..b662199 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherLayout.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherLayout.java
@@ -69,6 +69,7 @@ public static final long ZOOMING_DURATION = 300; private static final int TRANSLATE_DURATION_MS = 450; private static final int BACKGROUND_FADING_DURATION_MS = 150; + private static final int SCRIM_FADE_DURATION_MS = 450; private static final String TRACE_SHOW_TAB_SWITCHER = "TabSwitcherLayout.Show.TabSwitcher"; private static final String TRACE_HIDE_TAB_SWITCHER = "TabSwitcherLayout.Hide.TabSwitcher"; @@ -77,7 +78,7 @@ // The transition animation from a tab to the tab switcher. private AnimatorSet mTabToSwitcherAnimation; - private boolean mIsAnimating; + private boolean mIsAnimatingHide; private TabListSceneLayer mSceneLayer; private final TabSwitcher mTabSwitcher; @@ -253,7 +254,7 @@ private void hideBrowserScrim() { if (mScrimCoordinator == null || !mScrimCoordinator.isShowingScrim()) return; - mScrimCoordinator.hideScrim(true); + mScrimCoordinator.hideScrim(true, SCRIM_FADE_DURATION_MS); } @Override @@ -297,7 +298,7 @@ updateCacheVisibleIds(new LinkedList<>(Arrays.asList(sourceTabId))); - mIsAnimating = true; + mIsAnimatingHide = true; if (TabUiFeatureUtilities.isTabletGridTabSwitcherPolishEnabled(getContext())) { translateDown(); } else { @@ -560,6 +561,7 @@ mTabToSwitcherAnimation.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { + mController.prepareHideTabSwitcherView(); mController.setSnackbarParentView(null); } @@ -587,7 +589,7 @@ private void postHiding() { mGridTabListDelegate.postHiding(); - mIsAnimating = false; + mIsAnimatingHide = false; doneHiding(); } @@ -664,7 +666,7 @@ @Override public boolean onUpdateAnimation(long time, boolean jumpToEnd) { - return mTabToSwitcherAnimation == null && !mIsAnimating; + return mTabToSwitcherAnimation == null && !mIsAnimatingHide; } @Override
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java index 3b59af7..7e271d6 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java
@@ -522,7 +522,8 @@ private void updateTopControlsProperties() { // If the Start surface is enabled, it will handle the margins and positioning of the tab // switcher. So, we shouldn't do it here. - if (ReturnToChromeUtil.isStartSurfaceEnabled(mContext)) { + if (ReturnToChromeUtil.isStartSurfaceEnabled(mContext) + && !ReturnToChromeUtil.isTabSwitcherOnlyRefactorEnabled(mContext)) { mContainerViewModel.set(TOP_MARGIN, 0); mContainerViewModel.set(SHADOW_TOP_OFFSET, 0); return; @@ -639,6 +640,15 @@ } @Override + public void prepareHideTabSwitcherView() { + if (mTabGridDialogController != null) { + // Don't wait until switcher container view hides. + // Hide dialog before GTS hides. + mTabGridDialogController.hideDialog(false); + } + } + + @Override public void hideTabSwitcherView(boolean animate) { if (!animate) mContainerViewModel.set(ANIMATE_VISIBILITY_CHANGES, false); setVisibility(false);
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCloseActionUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCloseActionUnitTest.java new file mode 100644 index 0000000..39c8ff5 --- /dev/null +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCloseActionUnitTest.java
@@ -0,0 +1,126 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.tasks.tab_management; + +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import androidx.test.filters.SmallTest; + +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.test.util.CallbackHelper; +import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tabmodel.TabModelSelector; +import org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorAction.ActionObserver; +import org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorAction.ButtonType; +import org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorAction.IconPosition; +import org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorAction.ShowMode; +import org.chromium.chrome.tab_ui.R; +import org.chromium.chrome.test.util.browser.tabmodel.MockTabModel; +import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelegate; + +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + +/** + * Unit tests for {@link TabSelectionEditorCloseAction}. + */ +@RunWith(BaseRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class TabSelectionEditorCloseActionUnitTest { + @Mock + private TabModelSelector mTabModelSelector; + @Mock + private SelectionDelegate<Integer> mSelectionDelegate; + private MockTabModel mTabModel; + private TabSelectionEditorAction mAction; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mAction = TabSelectionEditorCloseAction.createAction( + ShowMode.MENU_ONLY, ButtonType.TEXT, IconPosition.START); + mTabModel = spy(new MockTabModel(false, null)); + when(mTabModelSelector.getCurrentModel()).thenReturn(mTabModel); + mAction.configure(mTabModelSelector, mSelectionDelegate); + } + + @Test + @SmallTest + public void testInherentActionProperties() { + Assert.assertEquals(R.id.tab_selection_editor_close_menu_item, + mAction.getPropertyModel().get(TabSelectionEditorActionProperties.MENU_ITEM_ID)); + Assert.assertEquals(R.string.tab_suggestion_close_tab_action_button, + mAction.getPropertyModel().get( + TabSelectionEditorActionProperties.TITLE_RESOURCE_ID)); + Assert.assertEquals(R.plurals.accessibility_tab_suggestion_close_tab_action_button, + mAction.getPropertyModel() + .get(TabSelectionEditorActionProperties.CONTENT_DESCRIPTION_RESOURCE_ID) + .intValue()); + Assert.assertNull(mAction.getPropertyModel().get(TabSelectionEditorActionProperties.ICON)); + } + + @Test + @SmallTest + public void testCloseActionNoTabs() { + mAction.onSelectionStateChanged(new ArrayList<Integer>()); + Assert.assertEquals( + false, mAction.getPropertyModel().get(TabSelectionEditorActionProperties.ENABLED)); + Assert.assertEquals( + 0, mAction.getPropertyModel().get(TabSelectionEditorActionProperties.ITEM_COUNT)); + } + + @Test + @SmallTest + public void testCloseActionWithTabs() throws Exception { + List<Integer> tabIds = new ArrayList<>(); + tabIds.add(5); + tabIds.add(3); + tabIds.add(7); + List<Tab> tabs = new ArrayList<>(); + for (int id : tabIds) { + tabs.add(mTabModel.addTab(id)); + } + Set<Integer> tabIdsSet = new LinkedHashSet<>(tabIds); + when(mSelectionDelegate.getSelectedItems()).thenReturn(tabIdsSet); + + mAction.onSelectionStateChanged(tabIds); + Assert.assertEquals( + true, mAction.getPropertyModel().get(TabSelectionEditorActionProperties.ENABLED)); + Assert.assertEquals( + 3, mAction.getPropertyModel().get(TabSelectionEditorActionProperties.ITEM_COUNT)); + + final CallbackHelper helper = new CallbackHelper(); + ActionObserver observer = new ActionObserver() { + @Override + public void preProcessSelectedTabs(List<Tab> tabs) { + helper.notifyCalled(); + } + }; + mAction.addActionObserver(observer); + + Assert.assertTrue(mAction.performAction()); + verify(mTabModel).closeMultipleTabs(tabs, true); + + helper.waitForFirst(); + mAction.removeActionObserver(observer); + + Assert.assertTrue(mAction.performAction()); + verify(mTabModel, times(2)).closeMultipleTabs(tabs, true); + Assert.assertEquals(1, helper.getCallCount()); + } +}
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorGroupActionUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorGroupActionUnitTest.java new file mode 100644 index 0000000..2ea9545a --- /dev/null +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorGroupActionUnitTest.java
@@ -0,0 +1,146 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.tasks.tab_management; + +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import androidx.test.filters.SmallTest; + +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.test.util.CallbackHelper; +import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tabmodel.TabModelFilterProvider; +import org.chromium.chrome.browser.tabmodel.TabModelSelector; +import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter; +import org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorAction.ActionObserver; +import org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorAction.ButtonType; +import org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorAction.IconPosition; +import org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorAction.ShowMode; +import org.chromium.chrome.tab_ui.R; +import org.chromium.chrome.test.util.browser.tabmodel.MockTabModel; +import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelegate; + +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + +/** + * Unit tests for {@link TabSelectionEditorGroupAction}. + */ +@RunWith(BaseRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class TabSelectionEditorGroupActionUnitTest { + @Mock + private TabModelSelector mTabModelSelector; + @Mock + private SelectionDelegate<Integer> mSelectionDelegate; + @Mock + private TabModelFilterProvider mTabModelFilterProvider; + @Mock + private TabGroupModelFilter mGroupFilter; + private MockTabModel mTabModel; + private TabSelectionEditorAction mAction; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mAction = TabSelectionEditorGroupAction.createAction( + ShowMode.MENU_ONLY, ButtonType.TEXT, IconPosition.START); + mTabModel = spy(new MockTabModel(false, null)); + when(mTabModelFilterProvider.getCurrentTabModelFilter()).thenReturn(mGroupFilter); + when(mTabModelSelector.getTabModelFilterProvider()).thenReturn(mTabModelFilterProvider); + when(mTabModelSelector.getCurrentModel()).thenReturn(mTabModel); + mAction.configure(mTabModelSelector, mSelectionDelegate); + } + + @Test + @SmallTest + public void testInherentActionProperties() { + Assert.assertEquals(R.id.tab_selection_editor_group_menu_item, + mAction.getPropertyModel().get(TabSelectionEditorActionProperties.MENU_ITEM_ID)); + Assert.assertEquals(R.string.tab_selection_editor_group, + mAction.getPropertyModel().get( + TabSelectionEditorActionProperties.TITLE_RESOURCE_ID)); + Assert.assertEquals(R.plurals.accessibility_tab_selection_editor_group_button, + mAction.getPropertyModel() + .get(TabSelectionEditorActionProperties.CONTENT_DESCRIPTION_RESOURCE_ID) + .intValue()); + Assert.assertNull(mAction.getPropertyModel().get(TabSelectionEditorActionProperties.ICON)); + } + + @Test + @SmallTest + public void testGroupActionDisabled() { + List<Integer> tabIds = new ArrayList<>(); + mAction.onSelectionStateChanged(tabIds); + Assert.assertEquals( + false, mAction.getPropertyModel().get(TabSelectionEditorActionProperties.ENABLED)); + Assert.assertEquals( + 0, mAction.getPropertyModel().get(TabSelectionEditorActionProperties.ITEM_COUNT)); + + tabIds.add(1); + mAction.onSelectionStateChanged(tabIds); + Assert.assertEquals( + false, mAction.getPropertyModel().get(TabSelectionEditorActionProperties.ENABLED)); + Assert.assertEquals( + 1, mAction.getPropertyModel().get(TabSelectionEditorActionProperties.ITEM_COUNT)); + } + + @Test + @SmallTest + public void testGroupActionWithTabs() throws Exception { + List<Integer> tabIds = new ArrayList<>(); + tabIds.add(5); + tabIds.add(3); + tabIds.add(7); + List<Tab> tabs = new ArrayList<>(); + for (int id : tabIds) { + tabs.add(mTabModel.addTab(id)); + } + Set<Integer> tabIdsSet = new LinkedHashSet<>(tabIds); + when(mSelectionDelegate.getSelectedItems()).thenReturn(tabIdsSet); + + mAction.onSelectionStateChanged(tabIds); + Assert.assertEquals( + true, mAction.getPropertyModel().get(TabSelectionEditorActionProperties.ENABLED)); + Assert.assertEquals( + 3, mAction.getPropertyModel().get(TabSelectionEditorActionProperties.ITEM_COUNT)); + + final CallbackHelper helper = new CallbackHelper(); + ActionObserver observer = new ActionObserver() { + @Override + public void preProcessSelectedTabs(List<Tab> tabs) { + helper.notifyCalled(); + } + }; + mAction.addActionObserver(observer); + + Assert.assertTrue(mAction.performAction()); + for (int id : tabIds) { + verify(mGroupFilter).mergeListOfTabsToGroup(tabs, tabs.get(2), false, true); + } + + helper.waitForFirst(); + mAction.removeActionObserver(observer); + + Assert.assertTrue(mAction.performAction()); + for (int id : tabIds) { + verify(mGroupFilter, times(2)).mergeListOfTabsToGroup(tabs, tabs.get(2), false, true); + } + Assert.assertEquals(1, helper.getCallCount()); + } +}
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorUngroupActionUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorUngroupActionUnitTest.java new file mode 100644 index 0000000..ad3ef37 --- /dev/null +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorUngroupActionUnitTest.java
@@ -0,0 +1,138 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.tasks.tab_management; + +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import androidx.test.filters.SmallTest; + +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.test.util.CallbackHelper; +import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tabmodel.TabModelFilterProvider; +import org.chromium.chrome.browser.tabmodel.TabModelSelector; +import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter; +import org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorAction.ActionObserver; +import org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorAction.ButtonType; +import org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorAction.IconPosition; +import org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorAction.ShowMode; +import org.chromium.chrome.tab_ui.R; +import org.chromium.chrome.test.util.browser.tabmodel.MockTabModel; +import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelegate; + +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + +/** + * Unit tests for {@link TabSelectionEditorUngroupAction}. + */ +@RunWith(BaseRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class TabSelectionEditorUngroupActionUnitTest { + @Mock + private TabModelSelector mTabModelSelector; + @Mock + private SelectionDelegate<Integer> mSelectionDelegate; + @Mock + private TabModelFilterProvider mTabModelFilterProvider; + @Mock + private TabGroupModelFilter mGroupFilter; + private MockTabModel mTabModel; + private TabSelectionEditorAction mAction; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mAction = TabSelectionEditorUngroupAction.createAction( + ShowMode.MENU_ONLY, ButtonType.TEXT, IconPosition.START); + mTabModel = spy(new MockTabModel(false, null)); + when(mTabModelFilterProvider.getCurrentTabModelFilter()).thenReturn(mGroupFilter); + when(mTabModelSelector.getTabModelFilterProvider()).thenReturn(mTabModelFilterProvider); + when(mTabModelSelector.getCurrentModel()).thenReturn(mTabModel); + mAction.configure(mTabModelSelector, mSelectionDelegate); + } + + @Test + @SmallTest + public void testInherentActionProperties() { + Assert.assertEquals(R.id.tab_selection_editor_ungroup_menu_item, + mAction.getPropertyModel().get(TabSelectionEditorActionProperties.MENU_ITEM_ID)); + Assert.assertEquals(R.string.tab_grid_dialog_selection_mode_remove, + mAction.getPropertyModel().get( + TabSelectionEditorActionProperties.TITLE_RESOURCE_ID)); + Assert.assertEquals(R.plurals.accessibility_tab_selection_dialog_remove_button, + mAction.getPropertyModel() + .get(TabSelectionEditorActionProperties.CONTENT_DESCRIPTION_RESOURCE_ID) + .intValue()); + Assert.assertNull(mAction.getPropertyModel().get(TabSelectionEditorActionProperties.ICON)); + } + + @Test + @SmallTest + public void testUngroupActionDisabled() { + List<Integer> tabIds = new ArrayList<>(); + mAction.onSelectionStateChanged(tabIds); + Assert.assertEquals( + false, mAction.getPropertyModel().get(TabSelectionEditorActionProperties.ENABLED)); + Assert.assertEquals( + 0, mAction.getPropertyModel().get(TabSelectionEditorActionProperties.ITEM_COUNT)); + } + + @Test + @SmallTest + public void testUngroupActionWithTabs() throws Exception { + List<Integer> tabIds = new ArrayList<>(); + tabIds.add(5); + tabIds.add(3); + tabIds.add(7); + for (int id : tabIds) { + mTabModel.addTab(id); + } + Set<Integer> tabIdsSet = new LinkedHashSet<>(tabIds); + when(mSelectionDelegate.getSelectedItems()).thenReturn(tabIdsSet); + + mAction.onSelectionStateChanged(tabIds); + Assert.assertEquals( + true, mAction.getPropertyModel().get(TabSelectionEditorActionProperties.ENABLED)); + Assert.assertEquals( + 3, mAction.getPropertyModel().get(TabSelectionEditorActionProperties.ITEM_COUNT)); + + final CallbackHelper helper = new CallbackHelper(); + ActionObserver observer = new ActionObserver() { + @Override + public void preProcessSelectedTabs(List<Tab> tabs) { + helper.notifyCalled(); + } + }; + mAction.addActionObserver(observer); + + Assert.assertTrue(mAction.performAction()); + for (int id : tabIds) { + verify(mGroupFilter).moveTabOutOfGroup(id); + } + + helper.waitForFirst(); + mAction.removeActionObserver(observer); + + Assert.assertTrue(mAction.performAction()); + for (int id : tabIds) { + verify(mGroupFilter, times(2)).moveTabOutOfGroup(id); + } + Assert.assertEquals(1, helper.getCallCount()); + } +}
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java index d64fb3be..821daa3 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java
@@ -21,6 +21,7 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import android.content.Context; @@ -347,6 +348,19 @@ } @Test + public void beforeHideTabSwitcherView_NullController() { + mMediator.prepareHideTabSwitcherView(); + verifyZeroInteractions(mTabGridDialogController); + } + + @Test + public void beforeHideTabSwitcherView_WithController() { + mMediator.setTabGridDialogController(mTabGridDialogController); + mMediator.prepareHideTabSwitcherView(); + verify(mTabGridDialogController).hideDialog(eq(false)); + } + + @Test public void startedShowingPropagatesToObservers() { initAndAssertAllProperties(); mModel.get(TabListContainerProperties.VISIBILITY_LISTENER).startedShowing(true);
diff --git a/chrome/android/features/tab_ui/tab_management_java_sources.gni b/chrome/android/features/tab_ui/tab_management_java_sources.gni index 2ead27d..634ded8 100644 --- a/chrome/android/features/tab_ui/tab_management_java_sources.gni +++ b/chrome/android/features/tab_ui/tab_management_java_sources.gni
@@ -61,6 +61,9 @@ "//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediatorUnitTest.java", "//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java", "//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorActionProviderUnitTest.java", + "//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCloseActionUnitTest.java", + "//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorGroupActionUnitTest.java", + "//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorUngroupActionUnitTest.java", "//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSuggestionMessageServiceUnitTest.java", "//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCustomViewManagerUnitTest.java", "//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java",
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java index cf514f9..7db688f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -2365,7 +2365,9 @@ if (mTabSwitcherBackPressHandler == null && !isTablet()) { mTabSwitcherBackPressHandler = new TabSwitcherBackPressHandler( mLayoutStateProviderSupplier, mStartSurfaceSupplier, - () -> mLayoutManager.showLayout(LayoutType.BROWSING, true)); + () + -> mLayoutManager.showLayout(LayoutType.BROWSING, true), + ReturnToChromeUtil.isTabSwitcherOnlyRefactorEnabled(this)); mBackPressManager.addHandler( mTabSwitcherBackPressHandler, BackPressHandler.Type.TAB_SWITCHER_TO_BROWSING); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java index e07b7a4..34c8c467 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
@@ -212,7 +212,8 @@ layoutStateProvider -> { mLayoutStateProvider = layoutStateProvider; })); } - if (startSurfaceSupplier != null) { + if (!ReturnToChromeUtil.isTabSwitcherOnlyRefactorEnabled(mContext) + && startSurfaceSupplier != null) { mStartSurfaceSupplier = startSurfaceSupplier; startSurfaceSupplier.onAvailable(mCallbackController.makeCancelable((startSurface) -> { mStartSurfaceState = startSurface.getStartSurfaceState(); @@ -220,6 +221,9 @@ assert ReturnToChromeUtil.isStartSurfaceEnabled(mContext); mStartSurfaceState = newState; }; + // TODO(https://crbug.com/1315679): Remove |mStartSurfaceSupplier|, + // |mStartSurfaceState| and |mStartSurfaceStateObserver| after the refactor is + // enabled by default. startSurface.addStateChangeObserver(mStartSurfaceStateObserver); })); } @@ -309,6 +313,11 @@ */ @VisibleForTesting boolean isInStartSurfaceHomepage() { + if (ReturnToChromeUtil.isTabSwitcherOnlyRefactorEnabled(mContext)) { + return mLayoutStateProvider != null + && mLayoutStateProvider.isLayoutVisible(LayoutType.START_SURFACE); + } + return mStartSurfaceSupplier != null && mStartSurfaceSupplier.get() != null && mStartSurfaceState == StartSurfaceState.SHOWN_HOMEPAGE; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/feed/FeedServiceDependencyProviderFactoryImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/app/feed/FeedServiceDependencyProviderFactoryImpl.java new file mode 100644 index 0000000..30bc428a --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/feed/FeedServiceDependencyProviderFactoryImpl.java
@@ -0,0 +1,40 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.app.feed; + +import org.chromium.base.annotations.UsedByReflection; +import org.chromium.chrome.GoogleAPIKeys; +import org.chromium.chrome.browser.feed.FeedProcessScopeDependencyProvider; +import org.chromium.chrome.browser.feed.FeedServiceDependencyProviderFactory; +import org.chromium.chrome.browser.feed.FeedServiceUtil; +import org.chromium.chrome.browser.privacy.settings.PrivacyPreferencesManagerImpl; + +/** + * Implements the provider factory. + */ +@UsedByReflection("FeedServiceBridge") +public class FeedServiceDependencyProviderFactoryImpl + implements FeedServiceDependencyProviderFactory { + private static FeedServiceDependencyProviderFactory sInstance; + + @UsedByReflection("FeedServiceBridge") + public static FeedServiceDependencyProviderFactory getInstance() { + if (sInstance == null) { + sInstance = new FeedServiceDependencyProviderFactoryImpl(); + } + return sInstance; + } + + @Override + public FeedProcessScopeDependencyProvider createProcessScopeDependencyProvider() { + return new FeedProcessScopeDependencyProvider( + GoogleAPIKeys.GOOGLE_API_KEY, PrivacyPreferencesManagerImpl.getInstance()); + } + + @Override + public FeedServiceUtil createFeedServiceUtil() { + return new FeedServiceUtilImpl(); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/feed/FeedServiceUtilImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/app/feed/FeedServiceUtilImpl.java new file mode 100644 index 0000000..acc6660 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/feed/FeedServiceUtilImpl.java
@@ -0,0 +1,27 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.app.feed; + +import org.chromium.base.ContextUtils; +import org.chromium.chrome.browser.feed.FeedServiceUtil; +import org.chromium.chrome.browser.feed.TabGroupEnabledState; +import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities; + +/** + * Implements some utilities used for the feed service. + */ +public class FeedServiceUtilImpl implements FeedServiceUtil { + @Override + public @TabGroupEnabledState int getTabGroupEnabledState() { + if (TabUiFeatureUtilities.isTabGroupsAndroidEnabled(ContextUtils.getApplicationContext())) { + if (TabUiFeatureUtilities.ENABLE_TAB_GROUP_AUTO_CREATION.getValue()) { + return TabGroupEnabledState.REPLACED; + } else { + return TabGroupEnabledState.BOTH; + } + } + return TabGroupEnabledState.NONE; + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/feed/ProcessScopeDependencyProviderFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/app/feed/ProcessScopeDependencyProviderFactory.java deleted file mode 100644 index db513512..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/feed/ProcessScopeDependencyProviderFactory.java +++ /dev/null
@@ -1,25 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.chrome.browser.app.feed; - -import org.chromium.base.annotations.UsedByReflection; -import org.chromium.chrome.GoogleAPIKeys; -import org.chromium.chrome.browser.feed.FeedProcessScopeDependencyProvider; -import org.chromium.chrome.browser.privacy.settings.PrivacyPreferencesManagerImpl; - -/** - * Creates a ProcessScopeDependencyProvider. - * - * Note that because ProcessScopeDependencyProvider is sometimes needed in response to a Native - * call, we use this through reflection rather than simply injecting an instance. - */ -@UsedByReflection("FeedServiceBridge") -public class ProcessScopeDependencyProviderFactory { - @UsedByReflection("FeedServiceBridge") - public static FeedProcessScopeDependencyProvider create() { - return new FeedProcessScopeDependencyProvider( - GoogleAPIKeys.GOOGLE_API_KEY, PrivacyPreferencesManagerImpl.getInstance()); - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategy.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategy.java index 08dec2f..addb071 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategy.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategy.java
@@ -130,6 +130,7 @@ private View mToolbarCoordinator; private int mToolbarColor; private Runnable mPositionUpdater; + private boolean mStopShowingSpinner; // Runnable finishing the activity after the exit animation. Non-null when PCCT is closing. @Nullable @@ -203,6 +204,7 @@ onMoveStart(); mOffsetY = mActivity.getWindow().getAttributes().y - y; mLastPosY = y; + mStopShowingSpinner = false; } else { mVelocityTracker.addMovement(event); updateWindowPos((int) (y + mOffsetY)); @@ -253,7 +255,7 @@ int currentY = mActivity.getWindow().getAttributes().y; int finalY = currentY + flingDistance; int topY = getFullyExpandedYCoordinateWithAdjustment(); - int initialY = mDisplayHeight - mInitialHeight; + int initialY = initialY(); int bottomY = mDisplayHeight - mNavbarHeight; int start = 0; @@ -386,6 +388,10 @@ updateNavbarVisibility(true); } + private int initialY() { + return mDisplayHeight - mInitialHeight; + } + private @Px int getNavbarHeight() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { return mActivity.getWindowManager() @@ -588,7 +594,8 @@ private void updateWindowPos(@Px int y) { // Do not allow the Window to go above the minimum threshold capped by the status // bar and (optionally) the 90%-height adjustment. - y = MathUtils.clamp(y, getFullyExpandedYCoordinateWithAdjustment(), mMaxHeight); + int topY = getFullyExpandedYCoordinateWithAdjustment(); + y = MathUtils.clamp(y, topY, mMaxHeight); WindowManager.LayoutParams attributes = mActivity.getWindow().getAttributes(); if (attributes.y == y) return; @@ -596,18 +603,34 @@ mActivity.getWindow().setAttributes(attributes); if (mFinishRunnable != null) return; + // Starting dragging from INITIAL_HEIGHT state, we can hide the spinner if the tab: + // 1) reaches full height + // 2) is dragged below the initial height + if (mStatus == HeightStatus.INITIAL_HEIGHT && (y <= topY || y > initialY()) + && isSpinnerVisible()) { + hideSpinnerView(); + if (y <= topY) { + // Once reaching full-height, tab can hide the spinner permanently till + // the finger is lifted. Keep it hidden. + mStopShowingSpinner = true; + return; + } + } // Show the spinner lazily, only when the tab is dragged _up_, which requires showing // more area than initial state. - if (mStatus != HeightStatus.TRANSITION - && (mSpinnerView == null || mSpinnerView.getVisibility() != View.VISIBLE) + if (!mStopShowingSpinner && mStatus != HeightStatus.TRANSITION && !isSpinnerVisible() && y < mDraggingStartY) { showSpinnerView(); } - if (mSpinnerView != null) { + if (isSpinnerVisible()) { centerSpinnerVertically((ViewGroup.LayoutParams) mSpinnerView.getLayoutParams()); } } + private boolean isSpinnerVisible() { + return mSpinnerView != null && mSpinnerView.getVisibility() == View.VISIBLE; + } + private void onMoveStart() { mDraggingStartY = mActivity.getWindow().getAttributes().y; updateNavbarVisibility(false); @@ -618,17 +641,21 @@ mFinishRunnable.run(); return; } + hideSpinnerView(); + updateNavbarVisibility(true); + } + + private void hideSpinnerView() { setContentsHeight(); // TODO(crbug.com/1328555): Look into observing a view resize event to ensure the fade // animation can always cover the transition artifact. - if (mSpinnerView != null && mSpinnerView.getVisibility() == View.VISIBLE) { + if (isSpinnerVisible()) { mSpinnerView.animate() .alpha(0f) .setDuration(SPINNER_FADEOUT_DURATION_MS) .setListener(mSpinnerFadeoutAnimatorListener); } - updateNavbarVisibility(true); } private void showSpinnerView() { @@ -842,7 +869,9 @@ return getStatusBarHeight(); } - private @Px int getFullyExpandedYCoordinateWithAdjustment() { + @VisibleForTesting + @Px + int getFullyExpandedYCoordinateWithAdjustment() { // Adding |mFullyExpandedAdjustmentHeight| to the y coordinate because the // coordinates system's origin is at the top left and y is growing in downward, larger y // means smaller height of the bottom sheet CCT.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/identity_disc/IdentityDiscController.java b/chrome/android/java/src/org/chromium/chrome/browser/identity_disc/IdentityDiscController.java index 3193e8de..0250f12 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/identity_disc/IdentityDiscController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/identity_disc/IdentityDiscController.java
@@ -16,6 +16,7 @@ import org.chromium.base.supplier.ObservableSupplier; import org.chromium.chrome.R; import org.chromium.chrome.browser.feature_engagement.TrackerFactory; +import org.chromium.chrome.browser.layouts.LayoutType; import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; import org.chromium.chrome.browser.lifecycle.NativeInitObserver; import org.chromium.chrome.browser.ntp.NewTabPage; @@ -25,6 +26,7 @@ import org.chromium.chrome.browser.signin.services.IdentityServicesProvider; import org.chromium.chrome.browser.signin.services.ProfileDataCache; import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tasks.ReturnToChromeUtil; import org.chromium.chrome.browser.toolbar.ButtonData; import org.chromium.chrome.browser.toolbar.ButtonData.ButtonSpec; import org.chromium.chrome.browser.toolbar.ButtonDataImpl; @@ -151,8 +153,14 @@ return mButtonData; } - public ButtonData getForStartSurface(@StartSurfaceState int overviewModeState) { - if (overviewModeState != StartSurfaceState.SHOWN_HOMEPAGE) { + public ButtonData getForStartSurface( + @StartSurfaceState int overviewModeState, @LayoutType int layoutType) { + if (ReturnToChromeUtil.isTabSwitcherOnlyRefactorEnabled(mContext)) { + if (layoutType != LayoutType.START_SURFACE) { + mButtonData.setCanShow(false); + return mButtonData; + } + } else if (overviewModeState != StartSurfaceState.SHOWN_HOMEPAGE) { mButtonData.setCanShow(false); return mButtonData; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/messages/MessageContainerCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/messages/MessageContainerCoordinator.java index d40afd7..98a7c9f5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/messages/MessageContainerCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/messages/MessageContainerCoordinator.java
@@ -10,6 +10,7 @@ import androidx.annotation.NonNull; import androidx.coordinatorlayout.widget.CoordinatorLayout; +import org.chromium.base.ObserverList; import org.chromium.chrome.R; import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; import org.chromium.chrome.browser.flags.ChromeFeatureList; @@ -24,6 +25,9 @@ private MessageContainer mContainer; private BrowserControlsManager mControlsManager; + /** The list of observers for the message container. */ + private final ObserverList<MessageContainerObserver> mObservers = new ObserverList<>(); + public MessageContainerCoordinator( @NonNull MessageContainer container, @NonNull BrowserControlsManager controlsManager) { mContainer = container; @@ -35,6 +39,7 @@ mControlsManager.removeObserver(this); mContainer = null; mControlsManager = null; + mObservers.clear(); } private void updateMargins() { @@ -52,10 +57,12 @@ protected void showMessageContainer() { mContainer.setVisibility(View.VISIBLE); updateMargins(); + for (MessageContainerObserver o : mObservers) o.onShowMessageContainer(); } protected void hideMessageContainer() { mContainer.setVisibility(View.GONE); + for (MessageContainerObserver o : mObservers) o.onHideMessageContainer(); } /** @@ -85,6 +92,22 @@ updateMargins(); } + /** + * Adds an observer. + * @param observer The observer to add. + */ + public void addObserver(MessageContainerObserver observer) { + mObservers.addObserver(observer); + } + + /** + * Removes an observer. + * @param observer The observer to remove. + */ + public void removeObserver(MessageContainerObserver observer) { + mObservers.removeObserver(observer); + } + /** @return Offset of the message container from the top of the screen. */ private int getContainerTopOffset() { if (mControlsManager.getContentOffset() == 0) return 0;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/messages/MessageContainerObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/messages/MessageContainerObserver.java new file mode 100644 index 0000000..500b9ef --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/messages/MessageContainerObserver.java
@@ -0,0 +1,20 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.messages; + +/** + * An interface for notifications about the state of the message container + */ +public interface MessageContainerObserver { + /** + * A notification that the message container has been shown + */ + void onShowMessageContainer(); + + /** + * A notification that the message container has been hidden + */ + void onHideMessageContainer(); +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettings.java index 0fe9e6ac..1688b64 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettings.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettings.java
@@ -120,12 +120,6 @@ private String mSearchQuery; private Preference mLinkPref; - private ChromeSwitchPreference mSavePasswordsSwitch; - private ChromeSwitchPreference mAutoSignInSwitch; - private ChromeBasePreference mCheckPasswords; - private ChromeBasePreference mTrustedVaultBanner; - private TextMessagePreference mEmptyView; - private boolean mSearchRecorded; private Menu mMenu; private @Nullable PasswordCheck mPasswordCheck; @@ -174,7 +168,6 @@ if (savedInstanceState.containsKey(SAVED_STATE_SEARCH_QUERY)) { mSearchQuery = savedInstanceState.getString(SAVED_STATE_SEARCH_QUERY); - mSearchRecorded = mSearchQuery != null; // We record a search when a query is set. } } @@ -261,13 +254,13 @@ * Empty screen message when no passwords or exceptions are stored. */ private void displayEmptyScreenMessage() { - mEmptyView = new TextMessagePreference(getStyledContext(), null); - mEmptyView.setSummary(R.string.saved_passwords_none_text); - mEmptyView.setKey(PREF_KEY_SAVED_PASSWORDS_NO_TEXT); - mEmptyView.setOrder(ORDER_SAVED_PASSWORDS_NO_TEXT); - mEmptyView.setDividerAllowedAbove(false); - mEmptyView.setDividerAllowedBelow(false); - getPreferenceScreen().addPreference(mEmptyView); + TextMessagePreference emptyView = new TextMessagePreference(getStyledContext(), null); + emptyView.setSummary(R.string.saved_passwords_none_text); + emptyView.setKey(PREF_KEY_SAVED_PASSWORDS_NO_TEXT); + emptyView.setOrder(ORDER_SAVED_PASSWORDS_NO_TEXT); + emptyView.setDividerAllowedAbove(false); + emptyView.setDividerAllowedBelow(false); + getPreferenceScreen().addPreference(emptyView); } /** @@ -511,80 +504,82 @@ } private void createSavePasswordsSwitch() { - mSavePasswordsSwitch = new ChromeSwitchPreference(getStyledContext(), null); - mSavePasswordsSwitch.setKey(PREF_SAVE_PASSWORDS_SWITCH); - mSavePasswordsSwitch.setTitle(R.string.password_settings_save_passwords); - mSavePasswordsSwitch.setOrder(ORDER_SWITCH); - mSavePasswordsSwitch.setSummaryOn(R.string.text_on); - mSavePasswordsSwitch.setSummaryOff(R.string.text_off); - mSavePasswordsSwitch.setOnPreferenceChangeListener((preference, newValue) -> { + ChromeSwitchPreference savePasswordsSwitch = + new ChromeSwitchPreference(getStyledContext(), null); + savePasswordsSwitch.setKey(PREF_SAVE_PASSWORDS_SWITCH); + savePasswordsSwitch.setTitle(R.string.password_settings_save_passwords); + savePasswordsSwitch.setOrder(ORDER_SWITCH); + savePasswordsSwitch.setSummaryOn(R.string.text_on); + savePasswordsSwitch.setSummaryOff(R.string.text_off); + savePasswordsSwitch.setOnPreferenceChangeListener((preference, newValue) -> { getPrefService().setBoolean(Pref.CREDENTIALS_ENABLE_SERVICE, (boolean) newValue); RecordHistogram.recordBooleanHistogram( "PasswordManager.Settings.ToggleOfferToSavePasswords", (boolean) newValue); if ((boolean) newValue) PasswordManagerHelper.resetUpmUnenrollment(); return true; }); - mSavePasswordsSwitch.setManagedPreferenceDelegate( + savePasswordsSwitch.setManagedPreferenceDelegate( (ChromeManagedPreferenceDelegate) preference -> getPrefService().isManagedPreference(Pref.CREDENTIALS_ENABLE_SERVICE)); try (StrictModeContext ignored = StrictModeContext.allowDiskReads()) { - getPreferenceScreen().addPreference(mSavePasswordsSwitch); + getPreferenceScreen().addPreference(savePasswordsSwitch); } // Note: setting the switch state before the preference is added to the screen results in // some odd behavior where the switch state doesn't always match the internal enabled state // (e.g. the switch will say "On" when save passwords is really turned off), so // .setChecked() should be called after .addPreference() - mSavePasswordsSwitch.setChecked( + savePasswordsSwitch.setChecked( getPrefService().getBoolean(Pref.CREDENTIALS_ENABLE_SERVICE)); } private void createAutoSignInCheckbox() { - mAutoSignInSwitch = new ChromeSwitchPreference(getStyledContext(), null); - mAutoSignInSwitch.setKey(PREF_AUTOSIGNIN_SWITCH); - mAutoSignInSwitch.setTitle(R.string.passwords_auto_signin_title); - mAutoSignInSwitch.setOrder(ORDER_AUTO_SIGNIN_CHECKBOX); - mAutoSignInSwitch.setSummary(R.string.passwords_auto_signin_description); - mAutoSignInSwitch.setOnPreferenceChangeListener((preference, newValue) -> { + ChromeSwitchPreference autoSignInSwitch = + new ChromeSwitchPreference(getStyledContext(), null); + autoSignInSwitch.setKey(PREF_AUTOSIGNIN_SWITCH); + autoSignInSwitch.setTitle(R.string.passwords_auto_signin_title); + autoSignInSwitch.setOrder(ORDER_AUTO_SIGNIN_CHECKBOX); + autoSignInSwitch.setSummary(R.string.passwords_auto_signin_description); + autoSignInSwitch.setOnPreferenceChangeListener((preference, newValue) -> { getPrefService().setBoolean(Pref.CREDENTIALS_ENABLE_AUTOSIGNIN, (boolean) newValue); RecordHistogram.recordBooleanHistogram( "PasswordManager.Settings.ToggleAutoSignIn", (boolean) newValue); return true; }); - mAutoSignInSwitch.setManagedPreferenceDelegate((ChromeManagedPreferenceDelegate) preference + autoSignInSwitch.setManagedPreferenceDelegate((ChromeManagedPreferenceDelegate) preference -> getPrefService().isManagedPreference(Pref.CREDENTIALS_ENABLE_AUTOSIGNIN)); - getPreferenceScreen().addPreference(mAutoSignInSwitch); - mAutoSignInSwitch.setChecked( + getPreferenceScreen().addPreference(autoSignInSwitch); + autoSignInSwitch.setChecked( getPrefService().getBoolean(Pref.CREDENTIALS_ENABLE_AUTOSIGNIN)); } private void createCheckPasswords() { - mCheckPasswords = new ChromeBasePreference(getStyledContext()); - mCheckPasswords.setKey(PREF_CHECK_PASSWORDS); - mCheckPasswords.setTitle(R.string.passwords_check_title); - mCheckPasswords.setOrder(ORDER_CHECK_PASSWORDS); - mCheckPasswords.setSummary(R.string.passwords_check_description); + ChromeBasePreference checkPasswords = new ChromeBasePreference(getStyledContext()); + checkPasswords.setKey(PREF_CHECK_PASSWORDS); + checkPasswords.setTitle(R.string.passwords_check_title); + checkPasswords.setOrder(ORDER_CHECK_PASSWORDS); + checkPasswords.setSummary(R.string.passwords_check_description); // Add a listener which launches a settings page for the leak password check - mCheckPasswords.setOnPreferenceClickListener(preference -> { + checkPasswords.setOnPreferenceClickListener(preference -> { PasswordCheck passwordCheck = PasswordCheckFactory.getOrCreate(new SettingsLauncherImpl()); passwordCheck.showUi(getStyledContext(), PasswordCheckReferrer.PASSWORD_SETTINGS); // Return true to notify the click was handled. return true; }); - getPreferenceScreen().addPreference(mCheckPasswords); + getPreferenceScreen().addPreference(checkPasswords); } private void createTrustedVaultBanner( @StringRes int subLabel, Preference.OnPreferenceClickListener listener) { - mTrustedVaultBanner = new ChromeBasePreference(getStyledContext()); - mTrustedVaultBanner.setKey(PREF_TRUSTED_VAULT_BANNER); - mTrustedVaultBanner.setTitle(R.string.android_trusted_vault_banner_label); - mTrustedVaultBanner.setOrder(ORDER_TRUSTED_VAULT_BANNER); - mTrustedVaultBanner.setSummary(subLabel); - mTrustedVaultBanner.setOnPreferenceClickListener(listener); - getPreferenceScreen().addPreference(mTrustedVaultBanner); + ChromeBasePreference trustedVaultBanner = new ChromeBasePreference(getStyledContext()); + trustedVaultBanner.setKey(PREF_TRUSTED_VAULT_BANNER); + trustedVaultBanner.setTitle(R.string.android_trusted_vault_banner_label); + trustedVaultBanner.setOrder(ORDER_TRUSTED_VAULT_BANNER); + trustedVaultBanner.setSummary(subLabel); + trustedVaultBanner.setOnPreferenceClickListener(listener); + getPreferenceScreen().addPreference(trustedVaultBanner); } private void displayManageAccountLink() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java b/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java index 4ffc5fcd..c7e036c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java
@@ -914,8 +914,7 @@ */ public static boolean isTabSwitcherOnlyRefactorEnabled(Context context) { return ChromeFeatureList.sStartSurfaceRefactor.isEnabled() - && TabUiFeatureUtilities.isGridTabSwitcherEnabled(context) - && !isStartSurfaceEnabled(context); + && TabUiFeatureUtilities.isGridTabSwitcherEnabled(context); } @VisibleForTesting
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java index 35108626..04341cf 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
@@ -226,6 +226,7 @@ private @StartSurfaceState int mStartSurfaceState = StartSurfaceState.NOT_SHOWN; private boolean mIsStartSurfaceEnabled; + private final boolean mIsStartSurfaceRefactorEnabled; private LayoutStateProvider mLayoutStateProvider; private LayoutStateProvider.LayoutStateObserver mLayoutStateObserver; @@ -516,6 +517,8 @@ mActivityTabProvider = tabProvider; mIsStartSurfaceEnabled = ReturnToChromeUtil.isStartSurfaceEnabled(mActivity); + mIsStartSurfaceRefactorEnabled = + ReturnToChromeUtil.isTabSwitcherOnlyRefactorEnabled(mActivity); // clang-format off mToolbarTabController = new ToolbarTabControllerImpl(mLocationBarModel::getTab, @@ -962,12 +965,17 @@ startSurfaceSupplier.onAvailable(mCallbackController.makeCancelable((startSurface) -> { mStartSurface = startSurface; - mStartSurfaceStateObserver = (newState, shouldShowToolbar) -> { - assert ReturnToChromeUtil.isStartSurfaceEnabled(mActivity); - mStartSurfaceState = newState; - mToolbar.updateStartSurfaceToolbarState(newState, shouldShowToolbar); - }; - mStartSurface.addStateChangeObserver(mStartSurfaceStateObserver); + if (!mIsStartSurfaceRefactorEnabled) { + mStartSurfaceStateObserver = (newState, shouldShowToolbar) -> { + assert ReturnToChromeUtil.isStartSurfaceEnabled(mActivity); + mStartSurfaceState = newState; + mToolbar.updateStartSurfaceToolbarState(newState, shouldShowToolbar, null); + }; + // TODO(https://crbug.com/1315679): Remove |mStartSurfaceSupplier|, + // |mStartSurfaceState| and |mStartSurfaceStateObserver| after the refactor is + // enabled by default. + mStartSurface.addStateChangeObserver(mStartSurfaceStateObserver); + } mStartSurfaceHeaderOffsetChangeListener = (appbarLayout, verticalOffset) -> { mToolbar.onStartSurfaceHeaderOffsetChanged(verticalOffset); @@ -994,6 +1002,12 @@ * @param showToolbar Whether the toolbar should be shown. */ private void updateForLayout(@LayoutType int layoutType, boolean showToolbar) { + if (mIsStartSurfaceRefactorEnabled) { + mToolbar.updateStartSurfaceToolbarState(null, + layoutType == LayoutType.TAB_SWITCHER + || (layoutType == LayoutType.START_SURFACE && !isUrlBarFocused()), + layoutType); + } if (layoutType == LayoutType.TAB_SWITCHER) { mLocationBarModel.setIsShowingTabSwitcher(true); mToolbar.setTabSwitcherMode(true, showToolbar, false); @@ -1033,7 +1047,9 @@ } else { client.run(); } - }, () -> identityDiscController.getForStartSurface(mStartSurfaceState), + }, () -> identityDiscController.getForStartSurface(mStartSurfaceState, + mLayoutStateProvider == null ? LayoutType.NONE + : mLayoutStateProvider.getActiveLayoutType()), mCompositorViewHolder::getResourceManager, mIsProgressBarVisibleSupplier, IncognitoUtils::isIncognitoModeEnabled, isGridTabSwitcherEnabled, isTabletGtsPolishEnabled, isTabToGtsAnimationEnabled, @@ -1041,7 +1057,7 @@ HistoryManagerUtils::showHistoryManager, PartnerBrowserCustomizations.getInstance()::isHomepageProviderAvailableAndEnabled, DownloadUtils::downloadOfflinePage, initializeWithIncognitoColors, profileSupplier, - logoClickedCallback); + logoClickedCallback, mIsStartSurfaceRefactorEnabled); // clang-format on mHomepageStateListener = () -> { Boolean wasHomepageEnabled = mHomepageEnabledSupplier.get(); @@ -1126,10 +1142,14 @@ // Without this check, ToolbarPhone#computeVisualState may return // VisualState.NEW_TAB_NORMAL even if it's in start surface homepage, which leads // ToolbarPhone#getToolbarColorForVisualState to return transparent color. - if (ReturnToChromeUtil.isStartSurfaceEnabled(mActivity) + if (mIsStartSurfaceRefactorEnabled && mLayoutStateProvider != null + && mLayoutStateProvider.getActiveLayoutType() == LayoutType.START_SURFACE) { + return false; + } else if (ReturnToChromeUtil.isStartSurfaceEnabled(mActivity) && mStartSurfaceState == StartSurfaceState.SHOWN_HOMEPAGE) { return false; } + NewTabPage ntp = getNewTabPageForCurrentTab(); return ntp != null && ntp.isLocationBarShownInNTP(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/BottomSheetManager.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/BottomSheetManager.java index 302ca63..a8e76b4a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/BottomSheetManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/BottomSheetManager.java
@@ -15,6 +15,9 @@ import org.chromium.chrome.browser.browser_controls.BrowserControlsVisibilityManager; import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel; import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager; +import org.chromium.chrome.browser.layouts.LayoutStateProvider; +import org.chromium.chrome.browser.layouts.LayoutStateProvider.LayoutStateObserver; +import org.chromium.chrome.browser.layouts.LayoutType; import org.chromium.chrome.browser.lifecycle.DestroyObserver; import org.chromium.chrome.browser.tab.EmptyTabObserver; import org.chromium.chrome.browser.tab.Tab; @@ -63,6 +66,10 @@ private final OneshotSupplier<StartSurface> mStartSurfaceSupplier; private StateObserver mStartSurfaceStateObserver; + private final boolean mIsStartSurfaceRefactorEnabled; + private final OneshotSupplier<LayoutStateProvider> mLayoutStateProviderSupplier; + private LayoutStateProvider.LayoutStateObserver mLayoutStateObserver; + /** A browser controls manager for polling browser controls offsets. */ private BrowserControlsVisibilityManager mBrowserControlsVisibilityManager; @@ -119,7 +126,9 @@ TabObscuringHandler obscuringDelegate, ObservableSupplier<Boolean> omniboxFocusStateSupplier, Supplier<OverlayPanelManager> overlayManager, - OneshotSupplier<StartSurface> startSurfaceSupplier) { + OneshotSupplier<StartSurface> startSurfaceSupplier, + OneshotSupplier<LayoutStateProvider> layoutStateProviderSupplier, + boolean isStartSurfaceRefactorEnabled) { mSheetController = controller; mTabProvider = tabProvider; mBrowserControlsVisibilityManager = controlsVisibilityManager; @@ -129,10 +138,20 @@ mTabObscuringToken = TokenHolder.INVALID_TOKEN; mOmniboxFocusStateSupplier = omniboxFocusStateSupplier; mOverlayPanelManager = overlayManager; - mStartSurfaceSupplier = startSurfaceSupplier; mCallbackController = new CallbackController(); - mStartSurfaceSupplier.onAvailable( - mCallbackController.makeCancelable(this::addStartSurfaceStateObserver)); + mIsStartSurfaceRefactorEnabled = isStartSurfaceRefactorEnabled; + + // TODO(https://crbug.com/1315679): Remove |mStartSurfaceSupplier|, |mStartSurfaceState| and + // |mStartSurfaceStateObserver| after the refactor is enabled by default. + mStartSurfaceSupplier = startSurfaceSupplier; + if (!mIsStartSurfaceRefactorEnabled) { + mStartSurfaceSupplier.onAvailable( + mCallbackController.makeCancelable(this::addStartSurfaceStateObserver)); + } + + mLayoutStateProviderSupplier = layoutStateProviderSupplier; + mLayoutStateProviderSupplier.onAvailable( + mCallbackController.makeCancelable(this::addLayoutStateObserver)); mSheetController.addObserver(this); mSheetController.setAccessibilityUtil(ChromeAccessibilityUtil.get()); @@ -211,7 +230,10 @@ updateSuppressionForTabSwitcher(tab, mStartSurfaceSupplier.get() == null ? null - : mStartSurfaceSupplier.get().getStartSurfaceState()); + : mStartSurfaceSupplier.get().getStartSurfaceState(), + mLayoutStateProviderSupplier.get() == null + ? null + : mLayoutStateProviderSupplier.get().getActiveLayoutType()); if (tab == null) return; @@ -231,11 +253,13 @@ * @param tab The current tab. It might be null when the Start surface or the Tab switcher is * showing. * @param startSurfaceState The current state surface state when the Start surface is enabled, - * null otherwise. + * null otherwise. It's also null when the refactor is enabled. + * @param layoutType The current layout type, currently only used when the refactor is enabled. */ - private void updateSuppressionForTabSwitcher( - @Nullable Tab tab, @Nullable @StartSurfaceState Integer startSurfaceState) { - if (shouldSuppressForTabSwitcher(tab, startSurfaceState)) { + private void updateSuppressionForTabSwitcher(@Nullable Tab tab, + @Nullable @StartSurfaceState Integer startSurfaceState, + @Nullable @LayoutType Integer layoutType) { + if (shouldSuppressForTabSwitcher(tab, startSurfaceState, layoutType)) { if (mTabSwitcherToken == 0) { mTabSwitcherToken = mSheetController.suppressSheet(StateChangeReason.COMPOSITED_UI); } @@ -251,13 +275,21 @@ } } - private boolean shouldSuppressForTabSwitcher( - Tab tab, @StartSurfaceState Integer startSurfaceState) { + private boolean shouldSuppressForTabSwitcher(Tab tab, + @StartSurfaceState Integer startSurfaceState, + @Nullable @LayoutType Integer layoutType) { StartSurface startSurface = mStartSurfaceSupplier.get(); - if (tab == null && startSurface == null) return true; - /** When the Start surface is enabled, the {@link startSurfaceState} isn't null. */ - if (startSurfaceState != null) { + if (mIsStartSurfaceRefactorEnabled) { + if (layoutType == null) return tab == null; + if (layoutType == LayoutType.START_SURFACE) { + return false; + } else if (layoutType == LayoutType.TAB_SWITCHER) { + // If startSurface is not null, start surface is enabled. + return startSurface != null; + } + } else { + if (startSurface == null) return tab == null; if (startSurfaceState == StartSurfaceState.SHOWING_HOMEPAGE || startSurfaceState == StartSurfaceState.SHOWN_HOMEPAGE) { return false; @@ -266,7 +298,6 @@ return true; } } - return tab == null; } @@ -280,17 +311,32 @@ assert startSurfaceState == startSurface.getStartSurfaceState(); mStartSurfaceState = startSurfaceState; - updateSuppressionForTabSwitcher(mTabProvider.get(), startSurfaceState); + updateSuppressionForTabSwitcher(mTabProvider.get(), startSurfaceState, null); if (startSurfaceState == StartSurfaceState.SHOWN_HOMEPAGE) { mSheetController.clearRequestsAndHide(); } } }; - startSurface.addStateChangeObserver(mStartSurfaceStateObserver); } + private void addLayoutStateObserver(LayoutStateProvider layoutStateProvider) { + mLayoutStateObserver = new LayoutStateObserver() { + private @LayoutType int mLayoutType; + @Override + public void onFinishedShowing(int layoutType) { + if (mLayoutType == layoutType) return; + + mLayoutType = layoutType; + updateSuppressionForTabSwitcher(mTabProvider.get(), null, mLayoutType); + if (mLayoutType == LayoutType.START_SURFACE) { + mSheetController.clearRequestsAndHide(); + } + } + }; + } + @Override public void onSheetOpened(int reason) { if (mBrowserControlsVisibilityManager.getBrowserVisibilityDelegate() != null) { @@ -398,5 +444,8 @@ if (mStartSurfaceSupplier.get() != null) { mStartSurfaceSupplier.get().removeStateChangeObserver(mStartSurfaceStateObserver); } + if (mLayoutStateProviderSupplier.get() != null) { + mLayoutStateProviderSupplier.get().removeObserver(mLayoutStateObserver); + } } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java index 0f3791ef..894e919 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java
@@ -109,6 +109,7 @@ import org.chromium.chrome.browser.tab.TabLaunchType; import org.chromium.chrome.browser.tabmodel.TabCreatorManager; import org.chromium.chrome.browser.tabmodel.TabModelSelector; +import org.chromium.chrome.browser.tasks.ReturnToChromeUtil; import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher; import org.chromium.chrome.browser.theme.TopUiThemeColorProvider; import org.chromium.chrome.browser.toolbar.ButtonDataProvider; @@ -1363,7 +1364,9 @@ mBottomSheetManager = new BottomSheetManager(mBottomSheetController, mActivityTabProvider, mBrowserControlsManager, mModalDialogManagerSupplier, this::getBottomSheetSnackbarManager, mTabObscuringHandlerSupplier.get(), - mOmniboxFocusStateSupplier, panelManagerSupplier, mStartSurfaceSupplier); + mOmniboxFocusStateSupplier, panelManagerSupplier, mStartSurfaceSupplier, + mLayoutStateProviderOneShotSupplier, + ReturnToChromeUtil.isTabSwitcherOnlyRefactorEnabled(mActivity)); // TODO(crbug.com/1279941): Consider moving handler registration to feature code. if (BackPressManager.isEnabled()) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/CouponPersistedTabDataTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/CouponPersistedTabDataTest.java index d2d156bff..071cadf01 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/CouponPersistedTabDataTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/CouponPersistedTabDataTest.java
@@ -140,7 +140,7 @@ new CouponPersistedTabData.Coupon(SERIALIZE_DESERIALIZE_NAME, SERIALIZE_DESERIALIZE_CODE, SERIALIZE_DESERIALIZE_CURRENCY_CODE, SERIALIZE_DESERIALIZE_DISCOUNT_UNITS, SERIALIZE_DESERIALIZE_DISCOUNT_TYPE)); - ByteBuffer serialized = couponPersistedTabData.getSerializeSupplier().get(); + ByteBuffer serialized = couponPersistedTabData.getSerializer().get(); CouponPersistedTabData deserialized = new CouponPersistedTabData(tab); Assert.assertTrue(deserialized.deserialize(serialized)); Assert.assertEquals(SERIALIZE_DESERIALIZE_NAME, deserialized.getCoupon().couponName); @@ -168,7 +168,7 @@ public void testSerializeDeserializeNoRemainingBytes() { Tab tab = new MockTab(1, false); CouponPersistedTabData couponPersistedTabData = new CouponPersistedTabData(tab, null); - ByteBuffer serialized = couponPersistedTabData.getSerializeSupplier().get(); + ByteBuffer serialized = couponPersistedTabData.getSerializer().get(); CouponPersistedTabData deserialized = new CouponPersistedTabData(tab); Assert.assertFalse(serialized.hasRemaining()); Assert.assertFalse(deserialized.deserialize(serialized));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabDataTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabDataTest.java index 9df8eb8..bc8595d 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabDataTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabDataTest.java
@@ -4,6 +4,9 @@ package org.chromium.chrome.browser.tab.state; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; @@ -20,6 +23,8 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.mockito.Spy; import org.chromium.base.Callback; import org.chromium.base.StrictModeContext; @@ -94,6 +99,7 @@ private static final WebContentsState WEB_CONTENTS_STATE_B = new WebContentsState(ByteBuffer.allocateDirect(WEB_CONTENTS_STATE_B_BYTES.length)); private static final String EXPECTED_TITLE = "My_title"; + private static final String MOCK_DATA_ID = "mock-id"; static { WEB_CONTENTS_STATE.buffer().put(WEB_CONTENTS_STATE_BYTES); @@ -111,6 +117,9 @@ @Mock private CriticalPersistedTabData mUnused2; + @Spy + private MockPersistedTabDataStorage mMockPersistedTabDataStorageSpy; + private static Tab mockTab(int id, boolean isEncrypted) { Tab tab = MockTab.createAndInitialize(id, isEncrypted); tab.setIsTabSaveEnabled(true); @@ -119,6 +128,7 @@ @Before public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); PersistedTabDataConfiguration.setUseTestConfig(true); mStorage = (MockPersistedTabDataStorage) PersistedTabDataConfiguration.getTestConfig() .getStorage(); @@ -244,6 +254,7 @@ for (boolean canGoForward : new boolean[] {false, true}) { CriticalPersistedTabData spyCriticalPersistedTabData = prepareCPTDShouldTabSave(canGoBack, canGoForward); + spyCriticalPersistedTabData.setShouldSave(); spyCriticalPersistedTabData.setUrl(new GURL(UrlConstants.NTP_URL)); Assert.assertEquals( canGoBack || canGoForward, spyCriticalPersistedTabData.shouldSave()); @@ -272,6 +283,7 @@ CriticalPersistedTabData spyCriticalPersistedTabData = prepareCPTDShouldTabSave(false, false); spyCriticalPersistedTabData.setUrl(new GURL("https://www.google.com")); + spyCriticalPersistedTabData.setShouldSave(); Assert.assertTrue(spyCriticalPersistedTabData.shouldSave()); } } @@ -293,7 +305,9 @@ CriticalPersistedTabData criticalPersistedTabData = new CriticalPersistedTabData(tab, "", "", PARENT_ID, ROOT_ID, TIMESTAMP, WEB_CONTENTS_STATE, CONTENT_STATE_VERSION, OPENER_APP_ID, THEME_COLOR, LAUNCH_TYPE_AT_CREATION, USER_AGENT_A); - ByteBuffer serialized = criticalPersistedTabData.getSerializeSupplier().get(); + Serializer<ByteBuffer> serializer = criticalPersistedTabData.getSerializer(); + serializer.preSerialize(); + ByteBuffer serialized = serializer.get(); PersistedTabDataConfiguration config = PersistedTabDataConfiguration.get( ShoppingPersistedTabData.class, tab.isIncognito()); CriticalPersistedTabData deserialized = @@ -332,7 +346,9 @@ FilePersistedTabDataStorage persistedTabDataStorage = new FilePersistedTabDataStorage(); persistedTabDataStorage.save(tab.getId(), config.getId(), () -> { - return criticalPersistedTabData.getSerializeSupplier().get(); + Serializer<ByteBuffer> serializer = criticalPersistedTabData.getSerializer(); + serializer.preSerialize(); + return serializer.get(); }, semaphore::release); } }); @@ -362,7 +378,9 @@ CriticalPersistedTabData criticalPersistedTabData = new CriticalPersistedTabData(tab, "", "", PARENT_ID, ROOT_ID, TIMESTAMP, WEB_CONTENTS_STATE, CONTENT_STATE_VERSION, null, THEME_COLOR, LAUNCH_TYPE_AT_CREATION, USER_AGENT_A); - ByteBuffer serialized = criticalPersistedTabData.getSerializeSupplier().get(); + Serializer<ByteBuffer> serializer = criticalPersistedTabData.getSerializer(); + serializer.preSerialize(); + ByteBuffer serialized = serializer.get(); PersistedTabDataConfiguration config = PersistedTabDataConfiguration.get( ShoppingPersistedTabData.class, tab.isIncognito()); CriticalPersistedTabData deserialized = @@ -694,6 +712,45 @@ Assert.assertEquals(0, criticalPersistedTabData.getWebContentsState().buffer().limit()); } + @UiThreadTest + @SmallTest + @Test + public void testExternalShouldSave() { + try (StrictModeContext ignored = StrictModeContext.allowAllThreadPolicies()) { + MockPersistedTabDataStorage storage = new MockPersistedTabDataStorage(); + MockPersistedTabDataStorage spyStorage = spy(storage); + TabImpl tab = new MockTab(1, false); + CriticalPersistedTabData criticalPersistedTabData = + new CriticalPersistedTabData(tab, spyStorage, MOCK_DATA_ID); + criticalPersistedTabData.setUrl(URL_A); + tab = MockTab.initializeWithCriticalPersistedTabData(tab, criticalPersistedTabData); + tab.registerTabSaving(); + tab.setIsTabSaveEnabled(true); + + // shouldSave flag not yet set, so save shouldn't go through + criticalPersistedTabData.save(); + verify(spyStorage, times(0)) + .save(anyInt(), anyString(), any(Serializer.class), any(Callback.class)); + + // shouldSave set, so save should go through + criticalPersistedTabData.setShouldSave(); + criticalPersistedTabData.save(); + verify(spyStorage, times(1)) + .save(anyInt(), anyString(), any(Serializer.class), any(Callback.class)); + + // shouldSave reset after recent save, so save shouldn't go through + criticalPersistedTabData.save(); + verify(spyStorage, times(1)) + .save(anyInt(), anyString(), any(Serializer.class), any(Callback.class)); + + // shouldSave set again so save should go through + criticalPersistedTabData.setShouldSave(); + criticalPersistedTabData.save(); + verify(spyStorage, times(2)) + .save(anyInt(), anyString(), any(Serializer.class), any(Callback.class)); + } + } + private static final ByteBuffer getFlatBufferWithNoWebContentsState() { FlatBufferBuilder fbb = new FlatBufferBuilder(); int oaid = fbb.createString(OPENER_APP_ID);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/PersistedTabDataTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/PersistedTabDataTest.java index 5caa77c2..23a1aff 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/PersistedTabDataTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/PersistedTabDataTest.java
@@ -18,7 +18,6 @@ import org.chromium.base.ThreadUtils; import org.chromium.base.supplier.ObservableSupplierImpl; -import org.chromium.base.supplier.Supplier; import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.base.test.UiThreadTest; import org.chromium.base.test.util.Batch; @@ -137,7 +136,7 @@ } @Override - public Supplier<ByteBuffer> getSerializeSupplier() { + public Serializer<ByteBuffer> getSerializer() { // Verify anything before the supplier is called on the UI thread ThreadUtils.assertOnUiThread(); return () -> { @@ -146,7 +145,7 @@ // {@link CriticalPersistedTabData} may unnecessarily consume // the UI thread and cause jank. ThreadUtils.assertOnBackgroundThread(); - return super.getSerializeSupplier().get(); + return super.getSerializer().get(); }; } } @@ -156,9 +155,9 @@ super(tab, 0 /** unused in OutOfMemoryMockPersistedTabData */); } @Override - public Supplier<ByteBuffer> getSerializeSupplier() { + public Serializer<ByteBuffer> getSerializer() { return () -> { - // OutOfMemoryError thrown on getSerializeSupplier.get(); + // OutOfMemoryError thrown on getSerializer.get(); throw new OutOfMemoryError("Out of memory error"); }; } @@ -169,8 +168,8 @@ super(tab, 0 /** unused in OutOfMemoryMockPersistedTabData */); } @Override - public Supplier<ByteBuffer> getSerializeSupplier() { - // OutOfMemoryError thrown on getSerializeSupplier + public Serializer<ByteBuffer> getSerializer() { + // OutOfMemoryError thrown on getSerializer throw new OutOfMemoryError("Out of memory error"); } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabDataTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabDataTest.java index f623602..91c5955c 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabDataTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabDataTest.java
@@ -116,7 +116,7 @@ shoppingPersistedTabData.setCurrencyCode( ShoppingPersistedTabDataTestUtils.GREAT_BRITAIN_CURRENCY_CODE); shoppingPersistedTabData.setPriceDropGurl(new GURL("https://www.google.com")); - ByteBuffer serialized = shoppingPersistedTabData.getSerializeSupplier().get(); + ByteBuffer serialized = shoppingPersistedTabData.getSerializer().get(); ShoppingPersistedTabData deserialized = new ShoppingPersistedTabData(tab); deserialized.deserialize(serialized); Assert.assertEquals( @@ -155,7 +155,7 @@ shoppingPersistedTabData.setPreviousPriceMicros(containsPriceDrop ? 30_000_000L : ShoppingPersistedTabData.NO_PRICE_KNOWN); - ByteBuffer serialized = shoppingPersistedTabData.getSerializeSupplier().get(); + ByteBuffer serialized = shoppingPersistedTabData.getSerializer().get(); ShoppingPersistedTabData deserialized = new ShoppingPersistedTabData(tab); deserialized.deserialize(serialized); MetricsResult metricsResult = deserialized.getPriceDropMetricsLoggerForTesting() @@ -689,7 +689,7 @@ ShoppingPersistedTabDataTestUtils.IS_INCOGNITO); ShoppingPersistedTabData shoppingPersistedTabData = new ShoppingPersistedTabData(tab); shoppingPersistedTabData.setPriceMicros(42_000_000L, null); - ByteBuffer serialized = shoppingPersistedTabData.getSerializeSupplier().get(); + ByteBuffer serialized = shoppingPersistedTabData.getSerializer().get(); PersistedTabDataConfiguration config = PersistedTabDataConfiguration.get( ShoppingPersistedTabData.class, tab.isIncognito()); ShoppingPersistedTabData deserialized = @@ -709,7 +709,7 @@ supplier.set(true); shoppingPersistedTabData.registerIsTabSaveEnabledSupplier(supplier); shoppingPersistedTabData.setMainOfferId(ShoppingPersistedTabDataTestUtils.FAKE_OFFER_ID); - ByteBuffer serialized = shoppingPersistedTabData.getSerializeSupplier().get(); + ByteBuffer serialized = shoppingPersistedTabData.getSerializer().get(); ShoppingPersistedTabData deserialized = new ShoppingPersistedTabData(tab); deserialized.deserialize(serialized); Assert.assertEquals(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/StorePersistedTabDataTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/StorePersistedTabDataTest.java index 248fc15..2956366 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/StorePersistedTabDataTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/StorePersistedTabDataTest.java
@@ -292,7 +292,7 @@ StorePersistedTabData storePersistedTabData = new StorePersistedTabData(tab, new StorePersistedTabData.StoreHours( SERIALIZE_DESERIALIZE_OPENING_TIME, SERIALIZE_DESERIALIZE_CLOSING_TIME)); - ByteBuffer serialized = storePersistedTabData.getSerializeSupplier().get(); + ByteBuffer serialized = storePersistedTabData.getSerializer().get(); StorePersistedTabData deserialized = new StorePersistedTabData(tab); deserialized.deserialize(serialized); Assert.assertEquals(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java index fe87a9b..badb732 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java
@@ -1043,6 +1043,7 @@ TestThreadUtils.runOnUiThreadBlocking(() -> { for (Tab tab : restoredTabs) { ((TabImpl) tab).registerTabSaving(); + CriticalPersistedTabData.from(tab).setShouldSave(); } }); return Pair.create(store, restoredTabs);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreUnitTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreUnitTest.java index 93bc2aa..af031a5 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreUnitTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreUnitTest.java
@@ -123,6 +123,7 @@ @Test @SmallTest + @UiThreadTest @Feature("TabPersistentStore") public void testNtpSaveBehavior() { when(mNormalTabModel.index()).thenReturn(TabList.INVALID_TAB_INDEX);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategyTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategyTest.java index 1034ada..835e369d 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategyTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategyTest.java
@@ -14,11 +14,12 @@ import static org.mockito.ArgumentMatchers.anyObject; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.times; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.robolectric.Shadows.shadowOf; +import android.animation.Animator.AnimatorListener; import android.app.Activity; import android.content.res.Configuration; import android.content.res.Resources; @@ -288,6 +289,17 @@ event(SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, 1500))); } + private void disableSpinnerAnimation() { + // Disable animation for the mock spinner view. + doAnswer(invocation -> { + AnimatorListener listener = invocation.getArgument(0); + listener.onAnimationEnd(null); + return mViewAnimator; + }) + .when(mViewAnimator) + .setListener(any(AnimatorListener.class)); + } + @Test public void moveFromTop() { // Drag to the top @@ -393,7 +405,7 @@ strategy.onConfigurationChanged(mConfiguration); assertEquals(0, strategy.getNavbarHeightForTesting()); - verify(mNavbar, times(1)).setVisibility(View.GONE); + verify(mNavbar).setVisibility(View.GONE); } @Test @@ -466,7 +478,7 @@ actionMove(handleStrategy, timestamp, 1450); // Verify the spinner is visible. - verify(mSpinnerView, times(1)).setVisibility(View.VISIBLE); + verify(mSpinnerView).setVisibility(View.VISIBLE); when(mSpinnerView.getVisibility()).thenReturn(View.VISIBLE); clearInvocations(mSpinnerView); @@ -481,7 +493,74 @@ actionMove(handleStrategy, timestamp, 650); // Verify the spinner remained invisible. - verify(mSpinnerView, times(0)).setVisibility(anyInt()); + verify(mSpinnerView, never()).setVisibility(anyInt()); + } + + @Test + public void hideSpinnerWhenReachingFullHeight() { + disableSpinnerAnimation(); + PartialCustomTabHeightStrategy strategy = createPcctAtHeight(500); + + verify(mWindow).addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL); + verify(mWindow).clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); + + assertEquals(1, mAttributeResults.size()); + assertEquals(MAX_INIT_POS, mAttributeResults.get(0).y); + + when(mSpinnerView.getVisibility()).thenReturn(View.GONE); + + PartialCustomTabHandleStrategy handleStrategy = + strategy.new PartialCustomTabHandleStrategy(null); + + long timestamp = SystemClock.uptimeMillis(); + actionDown(handleStrategy, timestamp, 1500); + actionMove(handleStrategy, timestamp, 1450); + + // Verify the spinner is visible. + verify(mSpinnerView).setVisibility(View.VISIBLE); + when(mSpinnerView.getVisibility()).thenReturn(View.VISIBLE); + clearInvocations(mSpinnerView); + + // Verify the spinner remains invisible after the tab reaches the top. + int topY = strategy.getFullyExpandedYCoordinateWithAdjustment(); + actionMove(handleStrategy, timestamp, topY); + verify(mSpinnerView).setVisibility(View.GONE); + clearInvocations(mSpinnerView); + + actionMove(handleStrategy, timestamp, topY + 200); + verify(mSpinnerView, never()).setVisibility(anyInt()); + } + + @Test + public void hideSpinnerWhenDraggingDown() { + disableSpinnerAnimation(); + PartialCustomTabHeightStrategy strategy = createPcctAtHeight(500); + + verify(mWindow).addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL); + verify(mWindow).clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); + + assertEquals(1, mAttributeResults.size()); + assertEquals(MAX_INIT_POS, mAttributeResults.get(0).y); + + when(mSpinnerView.getVisibility()).thenReturn(View.GONE); + + PartialCustomTabHandleStrategy handleStrategy = + strategy.new PartialCustomTabHandleStrategy(null); + + long timestamp = SystemClock.uptimeMillis(); + actionDown(handleStrategy, timestamp, 1500); + actionMove(handleStrategy, timestamp, 1450); + + // Verify the spinner is visible. + verify(mSpinnerView).setVisibility(View.VISIBLE); + when(mSpinnerView.getVisibility()).thenReturn(View.VISIBLE); + clearInvocations(mSpinnerView); + + // Drag below the initial height. + actionMove(handleStrategy, timestamp, MAX_INIT_POS + 100); + + // Verify the spinner goes invisible. + verify(mSpinnerView).setVisibility(View.GONE); } private void verifyWindowFlagsSet() {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediatorUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediatorUnitTest.java index 316401b..8c2a904 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediatorUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediatorUnitTest.java
@@ -52,6 +52,7 @@ import org.chromium.chrome.browser.feature_engagement.TrackerFactory; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.identity_disc.IdentityDiscController; +import org.chromium.chrome.browser.layouts.LayoutType; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; import org.chromium.chrome.browser.tab.Tab; @@ -145,10 +146,11 @@ doReturn(mButtonData) .when(mIdentityDiscController) - .getForStartSurface(StartSurfaceState.SHOWN_HOMEPAGE); + .getForStartSurface(StartSurfaceState.SHOWN_HOMEPAGE, LayoutType.START_SURFACE); doReturn(disabledButtonData) .when(mIdentityDiscController) - .getForStartSurface(not(eq(StartSurfaceState.SHOWN_HOMEPAGE))); + .getForStartSurface(not(eq(StartSurfaceState.SHOWN_HOMEPAGE)), + not(eq(LayoutType.START_SURFACE))); mMockConstantState = mock(Drawable.ConstantState.class); doReturn(mMockConstantState).when(mDrawable).getConstantState(); @@ -182,7 +184,8 @@ assertFalse(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE)); assertTrue(mPropertyModel.get(IS_VISIBLE)); - mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); + mMediator.onStartSurfaceStateChanged( + StartSurfaceState.SHOWN_HOMEPAGE, true, LayoutType.START_SURFACE); assertTrue(mPropertyModel.get(LOGO_IS_VISIBLE)); assertFalse(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE)); assertFalse(mPropertyModel.get(IDENTITY_DISC_AT_START)); @@ -192,7 +195,8 @@ assertTrue(mPropertyModel.get(IS_VISIBLE)); doReturn(1).when(mIncognitoTabModel).getCount(); - mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); + mMediator.onStartSurfaceStateChanged( + StartSurfaceState.SHOWN_HOMEPAGE, true, LayoutType.START_SURFACE); assertTrue(mPropertyModel.get(LOGO_IS_VISIBLE)); assertFalse(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE)); assertFalse(mPropertyModel.get(IDENTITY_DISC_AT_START)); @@ -215,7 +219,8 @@ assertFalse(mPropertyModel.get(NEW_TAB_VIEW_TEXT_IS_VISIBLE)); assertTrue(mPropertyModel.get(IS_VISIBLE)); - mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_TABSWITCHER, true); + mMediator.onStartSurfaceStateChanged( + StartSurfaceState.SHOWN_TABSWITCHER, true, LayoutType.TAB_SWITCHER); assertFalse(mPropertyModel.get(LOGO_IS_VISIBLE)); assertFalse(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE)); assertFalse(mPropertyModel.get(IDENTITY_DISC_AT_START)); @@ -228,7 +233,8 @@ assertFalse(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE)); doReturn(1).when(mIncognitoTabModel).getCount(); - mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_TABSWITCHER, true); + mMediator.onStartSurfaceStateChanged( + StartSurfaceState.SHOWN_TABSWITCHER, true, LayoutType.TAB_SWITCHER); assertFalse(mPropertyModel.get(LOGO_IS_VISIBLE)); assertFalse(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE)); assertFalse(mPropertyModel.get(IDENTITY_DISC_AT_START)); @@ -244,7 +250,8 @@ mButtonData.setCanShow(true); mMediator.updateIdentityDisc(mButtonData); - mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); + mMediator.onStartSurfaceStateChanged( + StartSurfaceState.SHOWN_HOMEPAGE, true, LayoutType.START_SURFACE); assertTrue(mPropertyModel.get(LOGO_IS_VISIBLE)); assertTrue(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE)); assertFalse(mPropertyModel.get(IDENTITY_DISC_AT_START)); @@ -252,7 +259,8 @@ assertFalse(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE)); assertTrue(mPropertyModel.get(IS_VISIBLE)); - mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_TABSWITCHER, true); + mMediator.onStartSurfaceStateChanged( + StartSurfaceState.SHOWN_TABSWITCHER, true, LayoutType.TAB_SWITCHER); assertFalse(mPropertyModel.get(LOGO_IS_VISIBLE)); assertFalse(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE)); assertFalse(mPropertyModel.get(IDENTITY_DISC_AT_START)); @@ -261,7 +269,8 @@ assertTrue(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE)); assertTrue(mPropertyModel.get(IS_VISIBLE)); - mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); + mMediator.onStartSurfaceStateChanged( + StartSurfaceState.SHOWN_HOMEPAGE, true, LayoutType.START_SURFACE); assertTrue(mPropertyModel.get(LOGO_IS_VISIBLE)); assertTrue(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE)); assertFalse(mPropertyModel.get(IDENTITY_DISC_AT_START)); @@ -275,13 +284,15 @@ createMediator(true); doReturn(0).when(mIncognitoTabModel).getCount(); - mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_TABSWITCHER, true); + mMediator.onStartSurfaceStateChanged( + StartSurfaceState.SHOWN_TABSWITCHER, true, LayoutType.TAB_SWITCHER); assertFalse(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE)); assertTrue(mPropertyModel.get(NEW_TAB_VIEW_IS_VISIBLE)); assertTrue(mPropertyModel.get(NEW_TAB_VIEW_TEXT_IS_VISIBLE)); doReturn(1).when(mIncognitoTabModel).getCount(); - mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_TABSWITCHER, true); + mMediator.onStartSurfaceStateChanged( + StartSurfaceState.SHOWN_TABSWITCHER, true, LayoutType.TAB_SWITCHER); assertTrue(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE)); assertTrue(mPropertyModel.get(NEW_TAB_VIEW_IS_VISIBLE)); assertFalse(mPropertyModel.get(NEW_TAB_VIEW_TEXT_IS_VISIBLE)); @@ -290,7 +301,8 @@ @Test public void testIncognitoTabModelObserverUpdatesIncognitoToggle() { createMediator(true); - mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_TABSWITCHER, true); + mMediator.onStartSurfaceStateChanged( + StartSurfaceState.SHOWN_TABSWITCHER, true, LayoutType.TAB_SWITCHER); doReturn(0).when(mIncognitoTabModel).getCount(); mIncognitoTabModelObserver.getValue().didBecomeEmpty(); @@ -308,10 +320,12 @@ createMediator(false); assertFalse(mPropertyModel.get(BUTTONS_CLICKABLE)); - mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_TABSWITCHER, true); + mMediator.onStartSurfaceStateChanged( + StartSurfaceState.SHOWN_TABSWITCHER, true, LayoutType.TAB_SWITCHER); assertTrue(mPropertyModel.get(BUTTONS_CLICKABLE)); - mMediator.onStartSurfaceStateChanged(StartSurfaceState.NOT_SHOWN, false); + mMediator.onStartSurfaceStateChanged( + StartSurfaceState.NOT_SHOWN, false, LayoutType.BROWSING); assertFalse(mPropertyModel.get(BUTTONS_CLICKABLE)); } @@ -319,7 +333,8 @@ public void enableDisableSearchEngineHaveLogo() { createMediator(false); when(mTemplateUrlService.doesDefaultSearchEngineHaveLogo()).thenReturn(true); - mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); + mMediator.onStartSurfaceStateChanged( + StartSurfaceState.SHOWN_HOMEPAGE, true, LayoutType.START_SURFACE); // If default search engine doesn't have logo, logo shouldn't be visible. when(mTemplateUrlService.doesDefaultSearchEngineHaveLogo()).thenReturn(false); @@ -337,7 +352,8 @@ createMediator(false); assertFalse(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE)); - mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); + mMediator.onStartSurfaceStateChanged( + StartSurfaceState.SHOWN_HOMEPAGE, true, LayoutType.START_SURFACE); assertFalse(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE)); mButtonData.setButtonSpec(new ButtonSpec(mDrawable, mOnClickListener, @@ -371,7 +387,8 @@ createMediator(false); assertFalse(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE)); - mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); + mMediator.onStartSurfaceStateChanged( + StartSurfaceState.SHOWN_HOMEPAGE, true, LayoutType.START_SURFACE); assertFalse(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE)); mButtonData.setCanShow(true); @@ -389,7 +406,8 @@ createMediator(false); assertFalse(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE)); - mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); + mMediator.onStartSurfaceStateChanged( + StartSurfaceState.SHOWN_HOMEPAGE, true, LayoutType.START_SURFACE); mButtonData.setCanShow(true); IPHCommandBuilder iphCommandBuilder = new IPHCommandBuilder(mMockResources, "IdentityDisc", 0, 0) @@ -411,7 +429,8 @@ createMediator(false); assertFalse(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE)); - mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); + mMediator.onStartSurfaceStateChanged( + StartSurfaceState.SHOWN_HOMEPAGE, true, LayoutType.START_SURFACE); assertFalse(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE)); mButtonData.setCanShow(true); @@ -435,7 +454,8 @@ ChromeAccessibilityUtil.get().setAccessibilityEnabledForTesting(true); createMediator(false, true, true); - mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); + mMediator.onStartSurfaceStateChanged( + StartSurfaceState.SHOWN_HOMEPAGE, true, LayoutType.START_SURFACE); // When accessibility is turned on and TAB_GROUPS_CONTINUATION_ANDROID is enabled, new tab // button shouldn't show on homepage. assertFalse(mPropertyModel.get(NEW_TAB_VIEW_IS_VISIBLE)); @@ -446,7 +466,8 @@ ChromeAccessibilityUtil.get().setAccessibilityEnabledForTesting(true); createMediator(false, true, false); - mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); + mMediator.onStartSurfaceStateChanged( + StartSurfaceState.SHOWN_HOMEPAGE, true, LayoutType.START_SURFACE); // When accessibility is turned on and TAB_GROUPS_CONTINUATION_ANDROID is disabled, new tab // button should show on homepage. @@ -456,7 +477,8 @@ @Test public void hideRealSearchBoxWhenStartSurfaceToolbarIsOnScreenTop() { createMediator(false); - mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); + mMediator.onStartSurfaceStateChanged( + StartSurfaceState.SHOWN_HOMEPAGE, true, LayoutType.START_SURFACE); int toolbarHeight = 10; assertEquals(0.0, mPropertyModel.get(TRANSLATION_Y), 0.0); @@ -480,9 +502,13 @@ hideIncognitoSwitchWhenNoTabs, mMenuButtonCoordinator, mIdentityDiscStateSupplier, () -> mIdentityDiscController.getForStartSurface( - mMediator.getOverviewModeStateForTesting()), + mMediator.getOverviewModeStateForTesting(), + mMediator.getLayoutTypeForTesting()), shouldShowTabSwitcherButtonOnHomepage, isTabGroupsAndroidContinuationEnabled, - () -> false, /*profileSupplier=*/null, /*logoClickedCallback=*/null); + () + -> false, + /*profileSupplier=*/null, /*logoClickedCallback=*/null, + /*isRefactorEnabled=*/false); mMediator.setTabModelSelector(mTabModelSelector); verify(mTabModelSelector).addObserver(mTabModelSelectorObserver.capture());
diff --git a/chrome/app/os_settings_strings.grdp b/chrome/app/os_settings_strings.grdp index dac01fd..8ec5afd6 100644 --- a/chrome/app/os_settings_strings.grdp +++ b/chrome/app/os_settings_strings.grdp
@@ -210,6 +210,12 @@ <message name="IDS_SETTINGS_UPGRADE_UP_TO_DATE" desc="Status label: Already up to date (ChromiumOS/ChromeOS)"> Your <ph name="DEVICE_TYPE">$1<ex>Chromebook</ex></ph> is up to date </message> + <message name="IDS_SETTINGS_UPGRADE_NOT_UP_TO_DATE" desc="Status label: Not up to date (ChromiumOS/ChromeOS)"> + Your device is not up to date + </message> + <message name="IDS_SETTINGS_ABOUT_PAGE_DEFERRED_UPDATE_DESCRIPTION" desc="Text of the deferred update description."> + Your device may no longer work properly and may experience security and performance issues. + </message> <message name="IDS_SETTINGS_ABOUT_PAGE_MANAGED_END_OF_LIFE_SUBTITLE" desc="Subtitle used for End of Life section on the Additional details subpage of the ABout page for managed users."> Updates are managed by your administrator </message>
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_ABOUT_PAGE_DEFERRED_UPDATE_DESCRIPTION.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_ABOUT_PAGE_DEFERRED_UPDATE_DESCRIPTION.png.sha1 new file mode 100644 index 0000000..8cadd9e6 --- /dev/null +++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_ABOUT_PAGE_DEFERRED_UPDATE_DESCRIPTION.png.sha1
@@ -0,0 +1 @@ +3def21d396fdbc1c81bc597a22c3682b8f4b1624 \ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_UPGRADE_NOT_UP_TO_DATE.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_UPGRADE_NOT_UP_TO_DATE.png.sha1 new file mode 100644 index 0000000..8cadd9e6 --- /dev/null +++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_UPGRADE_NOT_UP_TO_DATE.png.sha1
@@ -0,0 +1 @@ +3def21d396fdbc1c81bc597a22c3682b8f4b1624 \ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index bca1d7a3..0800df4d 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -898,6 +898,7 @@ <translation id="1829129547161959350">بطريق</translation> <translation id="1829192082282182671">ت&صغير</translation> <translation id="1830550083491357902">لم يتم تسجيل الدخول</translation> +<translation id="1831848493690504725">لا يمكننا التواصل مع Google من خلال الشبكة المتصلة. يُرجى تجربة شبكة مختلفة أو التحقُّق من إعدادات الشبكة أو إعدادات الخادم الوكيل (في حال استخدام خادم وكيل).</translation> <translation id="1832459821645506983">نعم، أوافق</translation> <translation id="1832511806131704864">تم تحديث تغيير الهاتف</translation> <translation id="1832848789136765277">لضمان إمكانية الوصول دائمًا إلى البيانات التي تتم مزامنتها، عليك إثبات هويتك.</translation> @@ -1012,7 +1013,7 @@ <translation id="1936157145127842922">عرض في المجلد</translation> <translation id="1936931585862840749">استخدِم رقمًا للإشارة إلى عدد النُسخ المطلوب طباعتها (من 1 إلى <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">يتعذّر استيراد نوع بنية الحاوية <ph name="ARCHITECTURE_CONTAINER" /> باستخدام هذا الجهاز الذي يمثل <ph name="ARCHITECTURE_DEVICE" />.يمكنك محاولة استعادة هذه الحاوية على جهاز مختلف، أو يمكنك الوصول إلى الملفات داخل صورة الحاوية هذه عن طريق فتح تطبيق "الملفات".</translation> -<translation id="1938320257168860255">حدث خطأ. يجب أن يكون هاتفك قريبًا وغير مُقفَل وأنّ يكون البلوتوث وشبكة Wi-Fi مفعَّلَين.</translation> +<translation id="1938320257168860255">حدث خطأ. يجب أن يكون هاتفك قريبًا وغير مُقفَل وأن يكون البلوتوث وشبكة Wi-Fi مفعَّلَين.</translation> <translation id="1938351510777341717">مفتاح Command الخارجي</translation> <translation id="1940546824932169984">الأجهزة المتصلة</translation> <translation id="1941410638996203291">وقت البدء: <ph name="TIME" /></translation> @@ -1100,7 +1101,7 @@ <translation id="2030455719695904263">لوحة اللمس</translation> <translation id="2031639749079821948">تم حفظ كلمة المرور في حسابك على Google.</translation> <translation id="2031914984822377766">يمكنك إضافة <ph name="LINK_BEGIN" />اللغات المفضَّلة التي تريد عرض المواقع الإلكترونية<ph name="LINK_END" /> بها. سيتم استخدام اللغة الواردة في أعلى القائمة لترجمة المواقع الإلكترونية إلى تلك اللغة.</translation> -<translation id="2033758234986231162">لا يمكن مواصلة الاتصال بهاتفك. يجب أن يكون هاتفك قريبًا وغير مُقفَل وأنّ يكون البلوتوث وشبكة Wi-Fi مفعَّلَين.</translation> +<translation id="2033758234986231162">لا يمكن مواصلة الاتصال بهاتفك. يجب أن يكون هاتفك قريبًا وغير مُقفَل وأن يكون البلوتوث وشبكة Wi-Fi مفعَّلين.</translation> <translation id="2034346955588403444">إضافة شبكة WiFi أخرى</translation> <translation id="203574396658008164">تفعيل تدوين الملاحظات من شاشة القفل</translation> <translation id="2037445849770872822">تم إعداد الإشراف من أجل حساب Google هذا. ولإعداد المزيد من أدوات الرقابة الأبوية، يُرجى اختيار "مواصلة". @@ -4737,6 +4738,7 @@ <translation id="5533001281916885985">يريد <ph name="SITE_NAME" /></translation> <translation id="5534304873398226603">إلغاء صورة أو فيديو</translation> <translation id="5537725057119320332">بث</translation> +<translation id="5539070192556911367">لا يمكن التواصل مع Google</translation> <translation id="5539221284352502426">رفض الخادم كلمة المرور التي أدخلتَها. وتتضمن الأسباب المحتملة ما يلي: كلمة المرور قصيرة جدًا. يجب أن تتضمن كلمة المرور أرقامًا أو رموزًا. يجب أن تكون كلمة المرور مختلفة عن كلمات المرور السابقة.</translation> <translation id="5541694225089836610">تم إيقاف الإجراء من قِبل المشرف.</translation> <translation id="5542132724887566711">الملف التعريفي</translation> @@ -4800,6 +4802,7 @@ <translation id="5585912436068747822">تعذّر إتمام عملية التنسيق</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">جارٍ تحميل التطبيقات...</translation> +<translation id="5590418976913374224">تشغيل صوت عند بدء تشغيل الجهاز</translation> <translation id="5592595402373377407">لم تتوفر بيانات كافية بعد.</translation> <translation id="5595307023264033512">إجمالي مساحة التخزين التي تستخدمها المواقع الإلكترونية: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">تعديل العنوان</translation> @@ -5347,7 +5350,7 @@ <translation id="6129953537138746214">مسافة</translation> <translation id="6130692320435119637">إضافة شبكة Wi-Fi</translation> <translation id="6130887916931372608">مفتاح لوحة المفاتيح</translation> -<translation id="6135823405800500595">يجب أن يكون هاتفك قريبًا وغير مُقفَل وأنّ يكون البلوتوث وشبكة Wi-Fi مفعَّلَين.</translation> +<translation id="6135823405800500595">يجب أن يكون هاتفك قريبًا وغير مُقفَل وأن يكون البلوتوث وشبكة Wi-Fi مفعَّلَين.</translation> <translation id="6136114942382973861">إغلاق شريط عمليات التنزيل</translation> <translation id="6136287496450963112">مفتاح الأمان غير محمي برقم تعريف شخصي. لإدارة بصمات الإصبع، يجب إنشاء رقم تعريف شخصي.</translation> <translation id="6138680304137685902">توقيع X9.62 ECDSA باستخدام SHA-384</translation> @@ -6352,6 +6355,7 @@ <translation id="7102687220333134671">تم تفعيل التحديثات التلقائية</translation> <translation id="7102832101143475489">انتهت مهلة الطلب</translation> <translation id="710640343305609397">فتح إعدادات الشبكة</translation> +<translation id="7107609441453408294">تشغيل الصوت نفسه من خلال جميع مكبِّرات الصوت</translation> <translation id="7108338896283013870">إخفاء</translation> <translation id="7108668606237948702">إدخال</translation> <translation id="7108933416628942903">قفل الآن</translation> @@ -6583,6 +6587,7 @@ <translation id="7364745943115323529">إرسال...</translation> <translation id="7364796246159120393">اختيار ملفّ</translation> <translation id="7365076891350562061">حجم الشاشة</translation> +<translation id="7365995455115045224">تم تثبيت علامة التبويب "<ph name="WINDOW_TITLE" />"</translation> <translation id="7366316827772164604">جارٍ البحث عن أجهزة قريبة...</translation> <translation id="7366415735885268578">إضافة موقع إلكتروني</translation> <translation id="7366909168761621528">بيانات التصفح</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb index 39ecf6a..4bb8be66 100644 --- a/chrome/app/resources/generated_resources_as.xtb +++ b/chrome/app/resources/generated_resources_as.xtb
@@ -904,6 +904,7 @@ <translation id="1829129547161959350">পেংগুইন</translation> <translation id="1829192082282182671">জুম &আউট কৰক</translation> <translation id="1830550083491357902">ছাইন ইন কৰা নাই</translation> +<translation id="1831848493690504725">সংযুক্ত নেটৱৰ্কটোৰ জৰিয়তে আমি Google এক্সেছ কৰিব নোৱাৰোঁ। এটা বেলেগ নেটৱৰ্ক বাছনি কৰি চাওক অথবা আপোনাৰ নেটৱৰ্কৰ ছেটিং অথবা প্ৰক্সি ছেটিং পৰীক্ষা কৰক (যদি আপুনি কোনো প্ৰক্সি ব্যৱহাৰ কৰি আছে)।</translation> <translation id="1832459821645506983">হয়, মই সন্মত</translation> <translation id="1832511806131704864">ফ’ন সলনি কৰাটো আপডে’ট কৰা হ’ল</translation> <translation id="1832848789136765277">আপোনাৰ ছিংক ডেটা সদায়ে এক্সেছ কৰিব পৰাটো নিশ্চিত কৰিবলৈ, এইগৰাকী আপুনিয়েই বুলি সত্যাপন কৰক</translation> @@ -2206,6 +2207,7 @@ <translation id="3021065318976393105">বেটাৰীত থকাৰ সময়ত</translation> <translation id="3021066826692793094">পখিলা</translation> <translation id="3021678814754966447">&ফ্ৰে’মৰ উৎস চাওক</translation> +<translation id="3022361196600037287">এই Chromebookটোৰ পৰা <ph name="DEVICE" /> আঁতৰোৱা হ’ব আৰু <ph name="PRIMARY_EMAIL" />ত ছেভ কৰা নহ’ব।</translation> <translation id="3022978424994383087">কি ক'লে বুজি নাপালোঁ।</translation> <translation id="3023464535986383522">কথা ক'বলৈ বাছনি কৰক</translation> <translation id="3024374909719388945">২৪ ঘণ্টীয়া ঘড়ীৰ ফর্মেট ব্যৱহাৰ কৰক</translation> @@ -3744,6 +3746,7 @@ <translation id="4535127706710932914">ডিফ’ল্ট প্ৰ’ফাইল</translation> <translation id="4535767533210902251">ফিংগাৰপ্ৰিণ্ট ছেন্সৰটো আপোনাৰ কীব’ৰ্ডৰ একেবাৰে ওপৰৰ সোঁফালৰ কী-ত আছে। যিকোনো এটা আঙুলিৰে এইটো লাহেকৈ স্পর্শ কৰক।</translation> <translation id="4536140153723794651">যিকোনো সময়তে কুকিসমূহ ব্যৱহাৰ কৰিব পৰা ছাইটসমূহ</translation> +<translation id="4536769240747010177">টেডাৰিং ক্ষমতা:</translation> <translation id="4538417792467843292">শব্দ মচক</translation> <translation id="4538792345715658285">এণ্টাৰপ্ৰাইজৰ নীতিয়ে ইনষ্টল কৰিছে।</translation> <translation id="4541123282641193691">আপোনাৰ একাউণ্টটো সত্যাপন কৰিব পৰা নগ’ল। অনুগ্ৰহ কৰি পুনৰ চেষ্টা কৰক অথবা আপোনাৰ Chromebook ৰিষ্টাৰ্ট কৰক।</translation> @@ -3771,6 +3774,7 @@ <translation id="4561893854334016293">শেহতীয়াকৈ সলনি কৰা কোনো অনুমতি নাই</translation> <translation id="4562155214028662640">ফিংগাৰপ্ৰিণ্ট যোগ কৰক</translation> <translation id="4563210852471260509">আৰম্ভণিৰ ইনপুটৰ ভাষা হৈছে চীনা</translation> +<translation id="4563382028841851106">একাউণ্টৰ পৰা আঁতৰাওক</translation> <translation id="4563880231729913339">আঙুলি ৩</translation> <translation id="4564245002465020751">আপোনাৰ ফ’নত ছেট আপ কৰা কৰাৰ প্ৰক্ৰিয়াটো সম্পূৰ্ণ কৰক</translation> <translation id="4565377596337484307">পাছৱৰ্ড লুকুৱাওক</translation> @@ -4747,6 +4751,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" />এ কৰিব বিচাৰে</translation> <translation id="5534304873398226603">ফট’ বা ভিডিঅ’ অগ্ৰাহ্য কৰক</translation> <translation id="5537725057119320332">কাষ্ট কৰক</translation> +<translation id="5539070192556911367">Google এক্সেছ কৰিব পৰা নাই</translation> <translation id="5539221284352502426">আপুনি দিয়া পাছৱর্ডটো ছার্ভাৰে অগ্ৰাহ্য কৰিছে। সম্ভাব্য কাৰণ: পাছৱৰ্ডটো যথেষ্ট চুটি। পাছৱর্ডটোত সংখ্যা বা চিহ্ন অন্তর্ভুক্ত হ'ব লাগিব। পাছৱর্ডটো পূর্বৱর্তী পাছৱর্ডসমূহতকৈ পৃথক হ'ব লাগিব।</translation> <translation id="5541694225089836610">আপোনাৰ প্ৰশাসকে এই কার্যটো অক্ষম কৰিছে</translation> <translation id="5542132724887566711">প্ৰ’ফাইল</translation> @@ -4810,6 +4815,7 @@ <translation id="5585912436068747822">ফৰ্মেট কৰিব পৰা নগ’ল</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">এপ্ ল’ড কৰি থকা হৈছে...</translation> +<translation id="5590418976913374224">ডিভাইচ ষ্টাৰ্টআপ হওঁতে ধ্বনি প্লে’ কৰক</translation> <translation id="5592595402373377407">এতিয়ালৈকে পৰ্যাপ্ত ডেটা উপলব্ধ হোৱা নাই।</translation> <translation id="5595307023264033512">ছাইটসমূহে ব্যৱহাৰ কৰা মুঠ ষ্ট’ৰেজ: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">ঠিকনা সম্পাদনা কৰক</translation> @@ -6189,6 +6195,10 @@ <translation id="6943939122536910181"><ph name="DEVICE" />ৰ পৰা সংযোগ বিচ্ছিন্ন কৰা হৈছে</translation> <translation id="6945221475159498467">বাছনি কৰক</translation> <translation id="694592694773692225">এই পৃষ্ঠাটোত ৰিডাইৰেক্টৰ সুবিধা অৱৰোধ কৰা আছে।</translation> +<translation id="6947015141909171112">Searchত কৰা ৰন্ধনবিধি সম্পৰ্কীয় কাৰ্যকলাপৰ ওপৰত ভিত্তি কৰি আপুনি ৰন্ধনবিধি দেখা পাই আছে। + <ph name="BREAK" /> + <ph name="BREAK" /> + আপুনি কাৰ্ড মেনুৰ পৰা ছেটিং পৰিচালনা কৰিব পাৰে অথবা Chrome কাষ্টমাইজ কৰকত অধিক বিকল্প চাব পাৰে।</translation> <translation id="6949434160682548041">পাছৱর্ড (ঐচ্ছিক)</translation> <translation id="6950627417367801484">এপসমূহ পুনঃস্থাপন কৰক</translation> <translation id="6952242901357037157">আপুনি ইয়াত নিজৰ <ph name="BEGIN_LINK" />Google একাউণ্ট<ph name="END_LINK" />ৰ পৰা পাছৱৰ্ডসমূহো দেখুৱাব পাৰে</translation> @@ -6356,6 +6366,7 @@ <translation id="7102687220333134671">স্বয়ংক্ৰিয়ভাৱে হোৱা আপডে’টৰ সুবিধাটো অন কৰা হ’ল</translation> <translation id="7102832101143475489">অনুৰোধটোৰ সময় উকলিল</translation> <translation id="710640343305609397">নেটৱৰ্ক ছেটিংসমূহ খোলক</translation> +<translation id="7107609441453408294">একেটা অডিঅ’ আটাইবোৰ স্পীকাৰতে প্লে’ কৰক</translation> <translation id="7108338896283013870">লুকুৱাওক</translation> <translation id="7108668606237948702">দিয়ক</translation> <translation id="7108933416628942903">এতিয়াই লক কৰক</translation> @@ -6586,6 +6597,7 @@ <translation id="7364745943115323529">কাষ্ট কৰক...</translation> <translation id="7364796246159120393">ফাইল বাছনি কৰক</translation> <translation id="7365076891350562061">মনিটৰৰ আকাৰ</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" /> - পিন কৰা হৈছে</translation> <translation id="7366316827772164604">নিকটৱৰ্তী ডিভাইচৰ বাবে স্কেন কৰি থকা হৈছে...</translation> <translation id="7366415735885268578">এটা ছাইট যোগ দিয়ক</translation> <translation id="7366909168761621528">ব্ৰাউজিং ডেটা</translation> @@ -6982,6 +6994,7 @@ <translation id="7737115349420013392">"<ph name="DEVICE_NAME" />"ৰ সৈতে পেয়াৰ কৰি থকা হৈছে …</translation> <translation id="7737846262459425222">আপুনি ছেটিং > Google Assistant > স্ক্ৰীনৰ প্ৰসংগলৈ গৈ যিকোনো সময়তে এইটো সলনি কৰিব পাৰে।</translation> <translation id="7737948071472253612">আপোনাৰ কেমেৰা ব্যৱহাৰ কৰাৰ অনুমতি নাই</translation> +<translation id="77381465218432215">উচ্চাৰণ চিহ্ন আৰু বিশেষ বৰ্ণ দেখুৱাওক</translation> <translation id="7740996059027112821">মান্য</translation> <translation id="7741307896921365578">আপোনাৰ পঢ়াৰ সূচী আৰু বুকমাৰ্কসমূহ এক্সেছ কৰাৰ এটা উপযোগী আৰু অবিৰত উপায়ৰ বাবে ব্ৰাউজাৰ স্তৰৰ ছাইডৰ পেনেল সক্ষম কৰে।</translation> <translation id="7742558784808143689"><ph name="SITE_NAME" /> আৰু ইয়াৰ অন্তৰ্গত আটাইবোৰ ছাইটৰ আৰু ইনষ্টল কৰি থোৱা এপ্সমূহৰ বাবে ছাইটৰ ডেটা আৰু অনুমতিসমূহ মচিবনে?</translation> @@ -7770,6 +7783,7 @@ <translation id="8486666913807228950">কাৰণ: ওলোটা নিয়মটো <ph name="REVERT_RULE" /> "জোৰ কৰি খোলক" সূচীখনত পোৱা গৈছে।</translation> <translation id="848666842773560761">এটা এপে কেমেৰাটো এক্সেছ কৰিবলৈ চেষ্টা কৰি আছে। এক্সেছৰ অনুমতি দিবলৈ কেমেৰাৰ গোপনীয়তাৰ ছুইচটো অফ কৰক।</translation> <translation id="8487678622945914333">জুম ইন কৰক</translation> +<translation id="8487699605742506766">হটস্পট</translation> <translation id="8489156414266187072">ব্যক্তিগত পৰামৰ্শসমূহ কেৱল আপোনাৰ একাউণ্টত দেখুওৱা হয়</translation> <translation id="8490896350101740396">তলৰ কিঅ’স্ক এপসমূহ "<ph name="UPDATED_APPS" />" আপডে’ট কৰা হৈছে। আপডে’টৰ প্ৰক্ৰিয়া সম্পূর্ণ কৰিবলৈ ডিভাইচটো ৰিবুট কৰক।</translation> <translation id="8492685019009920170">আপোনাৰ আঙুলিৰে ফিংগাৰপ্ৰিণ্ট ছেন্সৰটো স্পৰ্শ কৰক। আপোনাৰ ফিংগাৰপ্ৰিণ্টৰ ডেটা সুৰক্ষিতভাৱে ষ্ট’ৰ কৰা হয় আৰু সেইখিনি সদায় আপোনাৰ <ph name="DEVICE_TYPE" />ত থাকে।</translation> @@ -8264,6 +8278,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" আৰু অন্য ১টা টেব}one{"<ph name="TAB_TITLE" />" আৰু অন্য #টা টেব}other{"<ph name="TAB_TITLE" />" আৰু অন্য #টা টেব}}</translation> <translation id="8977811652087512276">অশুদ্ধ পাছৱৰ্ড বা ব্যৱহাৰৰ অযোগ্য ফাইল</translation> <translation id="8978154919215542464">সকলো ডেটা ছিংক কৰি থকা হৈছে</translation> +<translation id="8978670037548431647">টেডাৰিঙৰ ক্ষমতা ৰিফ্ৰেশ্ব কৰক</translation> <translation id="897939795688207351"><ph name="ORIGIN" />ত</translation> <translation id="8980345560318123814">মতামতৰ ৰিপ’ৰ্টসমূহ</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> - ক্ৰেশ্ব হ’ল</translation> @@ -8528,6 +8543,7 @@ <translation id="935854577147268200">স্মাৰ্ট লকৰ বাবে ব্যৱহৃত ফ’ন সলনি কৰা হ’ল। স্মাৰ্ট লক আপডে’ট কৰিবলৈ নিজৰ পাছৱৰ্ড দিয়ক। আগলৈ আপোনাৰ ফ’নটোৱে আপোনাৰ <ph name="DEVICE_TYPE" /> আনলক কৰিব। আপুনি ছেটিংসমূহ-লৈ গৈ স্মাৰ্ট লক অফ কৰিব পাৰে</translation> <translation id="936646668635477464">কেমেৰা আৰু মাইক্ৰ’ফ’ন</translation> <translation id="936801553271523408">ছিষ্টেমৰ ডায়েগন’ষ্টিক ডেটা</translation> +<translation id="937053962468712792"><ph name="PRIMARY_EMAIL" />ৰ পৰা <ph name="DEVICE" /> আঁতৰাবনে?</translation> <translation id="93766956588638423">এক্সটেনশ্বন মেৰামতি কৰক</translation> <translation id="938568644810664664">“Hey Google, এইটো কি গান?” অথবা “Hey Google, মোৰ স্ক্ৰীনত কি ওলাই আছে?” বুলি সুধি চাওক</translation> <translation id="938623846785894166">অসাধাৰণ ফাইল</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index e106e2b..122f16a 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -902,6 +902,7 @@ <translation id="1829129547161959350">Пингвин</translation> <translation id="1829192082282182671">&Намаляване</translation> <translation id="1830550083491357902">Не сте в профила си</translation> +<translation id="1831848493690504725">Не можем да установим връзка с Google чрез свързаната мрежа. Изберете друга мрежа или проверете настройките за мрежата или за прокси сървъра (ако използвате такъв).</translation> <translation id="1832459821645506983">Да, ще участвам</translation> <translation id="1832511806131704864">Промяната на телефона е актуализирана</translation> <translation id="1832848789136765277">Потвърдете, че сте вие, за да имате постоянен достъп до синхронизираните си данни</translation> @@ -4747,6 +4748,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> иска да</translation> <translation id="5534304873398226603">Отхвърляне на снимката или видеоклипа</translation> <translation id="5537725057119320332">Предаване</translation> +<translation id="5539070192556911367">Няма връзка с Google</translation> <translation id="5539221284352502426">Въведената от вас парола бе отхвърлена от сървъра. Ето някои от възможните причини: паролата е твърде кратка; необходимо е да съдържа цифри или символи; трябва да е различна от предишните пароли.</translation> <translation id="5541694225089836610">Действието е деактивирано от администратора ви</translation> <translation id="5542132724887566711">Потребителски профил</translation> @@ -4810,6 +4812,7 @@ <translation id="5585912436068747822">Форматирането не бе успешно</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Приложенията се зареждат...</translation> +<translation id="5590418976913374224">Възпроизвеждане на звук при стартиране на устройството</translation> <translation id="5592595402373377407">Още не са налице достатъчно данни.</translation> <translation id="5595307023264033512">Общо хранилище, използвано от сайтовете: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">Редактиране на адреса</translation> @@ -6355,6 +6358,7 @@ <translation id="7102687220333134671">Автоматичните актуализации са включени</translation> <translation id="7102832101143475489">Времето за изчакване на заявката изтече</translation> <translation id="710640343305609397">Отваряне на настройките за мрежата</translation> +<translation id="7107609441453408294">Възпроизвеждане на един и същ звук през всички високоговорители</translation> <translation id="7108338896283013870">Скриване</translation> <translation id="7108668606237948702">enter</translation> <translation id="7108933416628942903">Заключване сега</translation> @@ -6585,6 +6589,7 @@ <translation id="7364745943115323529">Предаване...</translation> <translation id="7364796246159120393">Избор на файл</translation> <translation id="7365076891350562061">Размер на елементите на монитора</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" /> – Фиксирано</translation> <translation id="7366316827772164604">Сканира се за устройства в близост...</translation> <translation id="7366415735885268578">Добавяне на сайт</translation> <translation id="7366909168761621528">Данни за сърфирането</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index feabf9d..0a715eb 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -907,6 +907,7 @@ <translation id="1829129547161959350">পেঙ্গুইন</translation> <translation id="1829192082282182671">ছোট করুন</translation> <translation id="1830550083491357902">প্রবেশ করেননি</translation> +<translation id="1831848493690504725">আমরা কানেক্ট করা নেটওয়ার্কের মাধ্যমে Google-এ সাথে কানেক্ট করতে পারিনি। অন্য নেটওয়ার্ক বেছে নিন বা আপনার নেটওয়ার্ক সেটিংস বা প্রক্সি সেটিংস চেক করুন (যদি আপনি একটি প্রক্সি ব্যবহার করেন)।</translation> <translation id="1832459821645506983">হ্যাঁ, আমি রাজি</translation> <translation id="1832511806131704864">ফোন পরিবর্তন আপডেট হয়েছে</translation> <translation id="1832848789136765277">আপনার সিঙ্ক করা ডেটা সবসময় যাতে অ্যাক্সেস করতে পারেন তা নিশ্চিত করতে, নিজের পরিচয় যাচাই করুন</translation> @@ -4755,6 +4756,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> চায়</translation> <translation id="5534304873398226603">ফটো ভিডিও বাতিল করুন</translation> <translation id="5537725057119320332">কাস্ট করুন</translation> +<translation id="5539070192556911367">Google-এ কানেক্ট করা যাচ্ছে না</translation> <translation id="5539221284352502426">আপনার দেওয়া পাসওয়ার্ডটি সার্ভার থেকে প্রত্যাখ্যান করা হয়েছে। সম্ভাব্য কারণ: পাসওয়ার্ডটি অনেক ছোট। পাসওয়ার্ডে অক্ষর বা সিম্বল থাকতে হবে। এই পাসওয়ার্ডটি আগের পাসওয়ার্ডগুলি থেকে অবশ্যই আলাদা হবে।</translation> <translation id="5541694225089836610">আপনার অ্যাডমিনিস্ট্রেটর এই সুবিধাটি বন্ধ করে দিয়েছে</translation> <translation id="5542132724887566711">প্রোফাইল</translation> @@ -4818,6 +4820,7 @@ <translation id="5585912436068747822">ফরম্যাটিং ব্যর্থ হয়েছে</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">অ্যাপ্লিকেশানগুলি লোড হচ্ছে...</translation> +<translation id="5590418976913374224">ডিভাইস চালু করার সময় সাউন্ড প্লে করুন</translation> <translation id="5592595402373377407">এখনও যথেষ্ট ডেটা উপলব্ধ নেই৷</translation> <translation id="5595307023264033512">সাইটগুলি মোট যতটা স্টোরেজ ব্যবহার করেছে: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">ঠিকানা সম্পাদনা করুন</translation> @@ -6370,6 +6373,7 @@ <translation id="7102687220333134671">অটোমেটিক আপডেট চালু করা হয়েছে</translation> <translation id="7102832101143475489">অনুরোধের সময় শেষ হয়ে গেছে</translation> <translation id="710640343305609397">নেটওয়ার্ক সেটিংস খুলুন</translation> +<translation id="7107609441453408294">সব স্পিকারে একই অডিও প্লে করুন</translation> <translation id="7108338896283013870">লুকান</translation> <translation id="7108668606237948702">লিখুন</translation> <translation id="7108933416628942903">এখনই লক করুন</translation> @@ -6600,6 +6604,7 @@ <translation id="7364745943115323529">কাস্ট করুন...</translation> <translation id="7364796246159120393">ফাইল বেছে নিন</translation> <translation id="7365076891350562061">মনিটরের সাইজ</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" /> - পিন করা হয়েছে</translation> <translation id="7366316827772164604">আশেপাশের ডিভাইস খুঁজতে স্ক্যান করা হচ্ছে…</translation> <translation id="7366415735885268578">একটি সাইট যোগ করুন</translation> <translation id="7366909168761621528">ব্রাউজিং ডেটা</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index aa53d08..2e4a364c 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Koristiti vaš mikrofon i kameru</translation> <translation id="1005333234656240382">Omogućiti otklanjanje grešaka putem ADB-a?</translation> <translation id="1006873397406093306">Ovo proširenje može čitati i mijenjati vaše podatke na web-lokacijama. Možete upravljati time kojim web-lokacijama proširenje može pristupiti.</translation> +<translation id="1007057452468855774">Uključi Trgovinu Google Play</translation> <translation id="1008186147501209563">Izvezi oznake</translation> <translation id="1008557486741366299">Ne sada</translation> <translation id="1009476156254802388">Lokacija za: <ph name="WEB_DRIVE" /></translation> <translation id="1009663062402466586">Kontrole igre su sada dostupne</translation> <translation id="1010498023906173788">Ova kartica je povezana na serijski priključak.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Stranica ne reagira}one{Stranice ne reagiraju}few{Stranice ne reagiraju}other{Stranice ne reagiraju}}</translation> +<translation id="1011003645819296594">Spremljeni uređaji</translation> <translation id="1011355516189274711">Jačina zvuka pretvaranja teksta u govor</translation> <translation id="1012794136286421601">Vaši fajlovi na Dokumentima, Tabelama, Slides prezentacijama i Crtežima se trenutno sinhroniziraju. Otvorite aplikaciju Google Disk da im pristupite bez obzira jeste li na mreži ili ne.</translation> <translation id="1012876632442809908">USB-C uređaj (prednji priključak)</translation> @@ -496,6 +498,7 @@ <translation id="1470350905258700113">Koristi ovaj uređaj</translation> <translation id="1470946456740188591">Da uključite ili isključite navigaciju kursorom, koristite prečicu Ctrl+Search+7</translation> <translation id="1472675084647422956">Prikaži više</translation> +<translation id="1473223074251193484">Postavite konfiguraciju modemskog povezivanja</translation> <translation id="1474785664565228650">Da promijenite postavku mikrofona, potrebno je ponovo pokrenuti Parallels Desktop. Ponovo pokrenite Parallels Desktop da nastavite.</translation> <translation id="1474893630593443211">Više kontrole nad oglasima koji vam se prikazuju</translation> <translation id="1475502736924165259">U arhivi imate certifikate koji ne odgovaraju nijednoj od ostalih kategorija</translation> @@ -1124,6 +1127,7 @@ <translation id="2044014337866019681">Provjerite potvrđujete li račun <ph name="ACCOUNT" /> radi otključavanja sesije.</translation> <translation id="204497730941176055">Naziv šablona za Microsoftovu potvrdu</translation> <translation id="2045117674524495717">Pomoćnik za prečice na tastaturi</translation> +<translation id="2045211794962848221">Više vam se neće prikazivati ta određena poruka</translation> <translation id="2045969484888636535">Nastavi blokirati kolačiće</translation> <translation id="204622017488417136">Vaš uređaj će se vratiti na prethodno instaliranu verziju Chromea. Uklonit će se računi svih korisnika. Ovu radnju nije moguće opozvati.</translation> <translation id="2046702855113914483">Ramen</translation> @@ -3813,6 +3817,7 @@ <translation id="4594577641390224176">Tražite stranicu s informacijama o sistemu? Posjetite</translation> <translation id="4595560905247879544">Aplikacije i ekstenzije može promijeniti samo upravitelj (<ph name="CUSTODIAN_NAME" />).</translation> <translation id="4596295440756783523">U fajlu imate potvrde koje identificiraju ove servere</translation> +<translation id="4598345735110653698">Upravljaj pristupnim ključevima</translation> <translation id="4598556348158889687">Upravljanje pohranom</translation> <translation id="4598776695426288251">WiFi mreža je dostupna putem više uređaja</translation> <translation id="4601426376352205922">Označi kao nepročitano</translation> @@ -4038,6 +4043,7 @@ <translation id="4823894915586516138">Ovaj PIN ili lozinka štiti vaše podatke na ovom uređaju (<ph name="DEVICE_TYPE" />), također sve informacije kojima pristupate pomoću telefona</translation> <translation id="4824037980212326045">Izrada sigurnosnih kopija i vraćanje na Linuxu</translation> <translation id="4824958205181053313">Otkazati sinhroniziranje?</translation> +<translation id="4825532258163983651">Nije moguće izbrisati pristupni ključ</translation> <translation id="4827675678516992122">Povezivanje nije uspjelo</translation> <translation id="4827784381479890589">Poboljšana provjera pravopisa u pregledniku Chrome (tekst se šalje Googleu radi pravopisnih prijedloga)</translation> <translation id="4827904420700932487">Kreiraj QR kôd za ovu sliku</translation> @@ -4300,6 +4306,7 @@ <translation id="5087249366037322692">Dodala treća strana</translation> <translation id="5087580092889165836">Dodaj karticu</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 sa RSA šifriranjem</translation> +<translation id="5089763948477033443">Ručica za promjenu veličine bočne ploče</translation> <translation id="5090637338841444533">Nije dozvoljeno praćenje položaja vaše kamere</translation> <translation id="5093569275467863761">Keširana verzija cijele stranice anonimnog načina rada za podokvir: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">Možete otvoriti i uređivati podržane fajlove pomoću ove aplikaciju u aplikaciji Files ili u drugim aplikacijama. Da kontrolirate koji fajlovi zadano otvaraju ovu aplikaciju, <ph name="BEGIN_LINK" />saznajte kako postaviti zadane aplikacije na svom uređaju<ph name="END_LINK" />.</translation> @@ -4465,6 +4472,7 @@ <translation id="5258992782919386492">Instaliraj na ovom uređaju</translation> <translation id="5260334392110301220">Pametni navodnici</translation> <translation id="5260508466980570042">Žao nam je, ne možemo potvrditi vašu adresu e-pošte ili lozinku. Pokušajte ponovo.</translation> +<translation id="5260958083445173099">Web-lokacije će prikazivati sadržaj na vašim preferiranim jezicima kad je to moguće.</translation> <translation id="5261683757250193089">Otvori u Web trgovini</translation> <translation id="5262178194499261222">Ukloni lozinku</translation> <translation id="5262784498883614021">Automatski se poveži s mrežom</translation> @@ -4505,6 +4513,7 @@ <translation id="5294097441441645251">Mora početi malim slovom ili donjom crtom</translation> <translation id="5294618183559481278">Vaš uređaj <ph name="DEVICE_TYPE" /> koristi ugrađeni senzor da otkrije osobe koje se nalaze ispred njega. Svi podaci se odmah obrađuju na uređaju, a zatim se brišu. Podaci senzora se nikada ne šalju Googleu. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Slušajte govorne povratne informacije da možete koristiti uređaj bez gledanja u ekran. Povratne informacije na Braillevom pismu su dostupne s povezanim uređajem.</translation> +<translation id="5297005732522718715">Osvježi konfiguraciju modemskog povezivanja</translation> <translation id="5297082477358294722">Lozinka je sačuvana. Prikažite i upravljajte lozinkama koje čuva <ph name="SAVED_PASSWORDS_STORE" />.</translation> <translation id="5297946558563358707">Kad netko drugi pogleda vaš ekran, u donjem desnom uglu ekrana prikazat će se ikona oka za zaštitu privatnosti</translation> <translation id="5298219193514155779">Temu je stvorio autor</translation> @@ -4675,11 +4684,13 @@ <translation id="5466374726908360271">Za&lijepi i pretraži pojam “<ph name="SEARCH_TERMS" />”</translation> <translation id="5467207440419968613">Blokirano: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation> <translation id="5468173180030470402">Traženje dijeljenja fajlova</translation> +<translation id="5468330507528805311">Status modemskog povezivanja:</translation> <translation id="5468881191994555667">Odabir fajla</translation> <translation id="5469852975082458401">Možete navigirati stranicama pomoću kursora za tekst. Pritisnite F7 da isključite.</translation> <translation id="5470735824776589490">Prije vraćanja na zadane vrijednosti pomoću Powerwasha potrebno je ponovo pokrenuti uređaj. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Zdravo! Ja sam vaš glas za pretvaranje teksta u govor.</translation> <translation id="5472627187093107397">Sačuvaj lozinke za ovu web lokaciju</translation> +<translation id="5473062644742711742">Pronađite više alata za pristupačnost u Chrome web-trgovini</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">Ako nastavite, slažete se da ovaj uređaj može također automatski preuzimati i instalirati ažuriranja i aplikacije od Googlea, mobilnog operatera vašeg djeteta i proizvođača ovog uređaja, uz mogući prijenos podataka na mobilnoj mreži. Moguće je da neke od tih aplikacija nude kupovinu unutar aplikacija.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{PIN mora sadržavati najmanje jedan znak.}one{PIN mora sadržavati najmanje # znak.}few{PIN mora sadržavati najmanje # znaka.}other{PIN mora sadržavati najmanje # znakova.}}</translation> @@ -4951,6 +4962,7 @@ <translation id="5734362860645681824">Komunikacije</translation> <translation id="5734697361979786483">Dodajte dijeljenje fajlova</translation> <translation id="5736796278325406685">Unesite važeće korisničko ime</translation> +<translation id="5738093759615225354">Taj pristupni kôd potreban je za prijavu na računalo</translation> <translation id="5739017626473506901">Prijavite se da <ph name="USER_NAME" /> primi pomoć pri dodavanju školskog računa</translation> <translation id="5739235828260127894">Čeka se potvrda. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Vrlo velik</translation> @@ -5112,6 +5124,7 @@ <translation id="589541317545606110">Pretražite stranicu pomoću usluge <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">Nemoj dozvoliti</translation> <translation id="5900186025777217044">Pametno zaključavanje je promijenjeno</translation> +<translation id="5900243355162006650">Konfiguracija modemskog povezivanja:</translation> <translation id="5900302528761731119">Fotografija Google profila</translation> <translation id="590036993063074298">Detalji o kvalitetu preslikavanja</translation> <translation id="5901069264981746702">Vaši podaci otiska prsta su sigurno pohranjeni i nikada ne napuštaju uređaj <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> @@ -5415,6 +5428,7 @@ <translation id="6196640612572343990">Blokiraj kolačiće trećih strana</translation> <translation id="6196854373336333322">Ekstenzija "<ph name="EXTENSION_NAME" />" je preuzela kontrolu nad postavkama vašeg proksi servera, što znači da može promijeniti, prekinuti ili prisluškivati sve što radite na mreži. Ako niste sigurni zašto je došlo do ove promjene, vjerovatno je i ne želite.</translation> <translation id="6197128521826316819">Kreiraj QR kôd za ovu stranicu</translation> +<translation id="6197223946499512637">Ti su pristupni ključevi pohranjeni u sustavu Windows Hello na ovom računalu. Ne spremaju se na vaš Google račun.</translation> <translation id="6198252989419008588">Promijeni PIN</translation> <translation id="6200047250927636406">Odbaci fajl</translation> <translation id="6200151268994853226">Upravljajte ekstenzijom</translation> @@ -5712,6 +5726,7 @@ <translation id="6482559668224714696">Povećalo za cijeli ekran</translation> <translation id="6483485061007832714">Otvorite preuzimanje</translation> <translation id="6483805311199035658">Otvara se <ph name="FILE" />...</translation> +<translation id="6486301003991593638">Za upravljanje pristupnim ključevima upotrijebite noviju verziju Windowsa</translation> <translation id="6488384360522318064">Odaberite jezik</translation> <translation id="648927581764831596">Nema dostupnih</translation> <translation id="6490471652906364588">USB-C uređaj (desni priključak)</translation> @@ -6302,6 +6317,7 @@ <translation id="7029307918966275733">Crostini nije instaliran. Instalirajte Crostini da vidite zahvale.</translation> <translation id="7029809446516969842">Lozinke</translation> <translation id="7030304022046916278">Šalje URL-ove Sigurnom pregledanju na provjeru</translation> +<translation id="7030695672997239647">Kliknite karticu desnom tipkom i odaberite Dodaj karticu u grupu, a zatim odaberite Nova grupa</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> – serijski priključak je povezan</translation> <translation id="7033616203784997570">Unos može sadržavati najviše 62 znaka</translation> <translation id="7034692021407794547">Administrator s privilegijama upravljanja naplatom najprije mora prihvatiti Uslove korištenja usluge hardvera za Google Meet u odjeljku hardver za Google Meet administratorske konzole.</translation> @@ -7404,6 +7420,7 @@ <translation id="8101987792947961127">Powerwash je obavezan prilikom sljedećeg pokretanja</translation> <translation id="81020759409809034">Lokalna lokacija</translation> <translation id="8102139037507939978">Uklonite informacije koje mogu poslužiti za ličnu identifikaciju iz fajla system_logs.txt.</translation> +<translation id="810362914482827094">Pretraživanje pristupnih ključeva</translation> <translation id="8104088837833760645">Preuzmi eSIM profil</translation> <translation id="8105368624971345109">Isključi</translation> <translation id="8107015733319732394">Instaliranje Google Play trgovine na vašem uređaju <ph name="DEVICE_TYPE" />. To može potrajati nekoliko minuta.</translation> @@ -7851,6 +7868,7 @@ <translation id="8557022314818157177">Nastavite dodirivati sigurnosni ključ dok se otisak prsta ne snimi</translation> <translation id="8557180006508471423">Uključite "Google Chrome" u uslugama lokacije na Mac računaru</translation> <translation id="8557856025359704738">Sljedeće preuzimanje je dana <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">Pristupni ključevi</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Otvori sve u &novom prozoru}=1{Otvori u &novom prozoru}one{Otvori sve ({COUNT}) u &novom prozoru}few{Otvori sve ({COUNT}) u &novom prozoru}other{Otvori sve ({COUNT}) u &novom prozoru}}</translation> <translation id="8561206103590473338">Slon</translation> <translation id="8561565784790166472">Budite oprezni</translation> @@ -7977,6 +7995,7 @@ <translation id="8677212948402625567">Suzi sve...</translation> <translation id="867767487203716855">Sljedeće ažuriranje</translation> <translation id="8677859815076891398">Nema albuma. Kreirajte album u <ph name="LINK_BEGIN" />Google Fotografijama<ph name="LINK_END" />.</translation> +<translation id="8678378565142776698">Ponovo pokrenite i primajte automatska ažuriranja</translation> <translation id="8678538439778360739">Podaci su šifrirani pristupnim izrazom za sinhronizaciju dana <ph name="TIME" />. To ne obuhvata načine plaćanja i adrese iz Google Paya.</translation> <translation id="8678582529642151449">Kartice se ne smanjuju</translation> <translation id="8678933587484842200">Kako želite da se ova aplikacija pokreće?</translation> @@ -8225,6 +8244,7 @@ <translation id="8910987510378294980">Skrivanje liste uređaja</translation> <translation id="8912362522468806198">Google račun</translation> <translation id="8912810933860534797">Omogući automatsko skeniranje</translation> +<translation id="8915307125957890427">Kliknite karticu desnom tipkom i odaberite Dodaj karticu u grupu, a zatim odaberite Nova grupa</translation> <translation id="8915370057835397490">Učitavanje prijedloga</translation> <translation id="8916476537757519021">Podokvir anonimnog načina: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138">Uređaj <ph name="DEVICE_TYPE" /> koji koristi <ph name="GIVEN_NAME" /></translation> @@ -8299,6 +8319,7 @@ <translation id="8986362086234534611">Zaboravi</translation> <translation id="8986494364107987395">Automatski šaljite statistiku korištenja i izvještaje o padovima aplikacije Googleu</translation> <translation id="8987927404178983737">Mjesec</translation> +<translation id="8989359959810288806">Osvježi status modemskog povezivanja</translation> <translation id="8991520179165052608">Web lokacija može koristiti vaš mikrofon</translation> <translation id="899384117894244799">Ukloni korisnika s ograničenjem</translation> <translation id="899403249577094719">Osnovni URL Netscape certifikata</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index b136e3d..b86bd51 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -895,6 +895,7 @@ <translation id="1829129547161959350">Pingüí</translation> <translation id="1829192082282182671">&Redueix</translation> <translation id="1830550083491357902">Sessió no iniciada</translation> +<translation id="1831848493690504725">No podem accedir a Google a través de la xarxa connectada. Prova de triar una altra xarxa o comprova la configuració de la xarxa o la configuració del servidor intermediari (si en fas servir un).</translation> <translation id="1832459821645506983">Sí, ho accepto</translation> <translation id="1832511806131704864">Canvi de telèfon actualitzat</translation> <translation id="1832848789136765277">Per assegurar-te de poder accedir a les dades sincronitzades en qualsevol moment, verifica la teva identitat</translation> @@ -2193,6 +2194,7 @@ <translation id="3021065318976393105">Mentre utilitza la bateria</translation> <translation id="3021066826692793094">Papallona</translation> <translation id="3021678814754966447">&Visualitza l'origen del marc</translation> +<translation id="3022361196600037287"><ph name="DEVICE" /> se suprimirà d'aquest Chromebook i no es desarà a <ph name="PRIMARY_EMAIL" />.</translation> <translation id="3022978424994383087">No t'he entès.</translation> <translation id="3023464535986383522">Escolta la selecció</translation> <translation id="3024374909719388945">Utilitza el rellotge de 24 hores</translation> @@ -3730,6 +3732,7 @@ <translation id="4535127706710932914">Perfil predeterminat</translation> <translation id="4535767533210902251">El sensor d'empremtes digitals és la tecla de la part superior dreta del teclat. Toca-la lleugerament amb un dit.</translation> <translation id="4536140153723794651">Llocs web que sempre poden fer servir galetes</translation> +<translation id="4536769240747010177">Capacitats de la compartició de xarxa:</translation> <translation id="4538417792467843292">Suprimeix la paraula</translation> <translation id="4538792345715658285">Instal·lat per una política empresarial</translation> <translation id="4541123282641193691">No s'ha pogut verificar el teu compte. Torna-ho a provar o reinicia el Chromebook.</translation> @@ -3757,6 +3760,7 @@ <translation id="4561893854334016293">No s'ha canviat cap permís recentment</translation> <translation id="4562155214028662640">Afegeix una empremta digital</translation> <translation id="4563210852471260509">L'idioma inicial d'entrada és el xinès</translation> +<translation id="4563382028841851106">Suprimeix del compte</translation> <translation id="4563880231729913339">Dit 3</translation> <translation id="4564245002465020751">Finalitza la configuració al telèfon</translation> <translation id="4565377596337484307">Oculta la contrasenya</translation> @@ -4661,6 +4665,7 @@ <translation id="5470735824776589490">Cal reiniciar el dispositiu per poder restablir-lo amb Powerwash. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Hola! Soc la teva veu per a la conversió de text a parla.</translation> <translation id="5472627187093107397">Desa les contrasenyes d'aquest lloc web</translation> +<translation id="5473062644742711742">Troba més eines d'accessibilitat a Chrome Web Store</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">En continuar, acceptes que aquest dispositiu també pugui baixar i instal·lar automàticament actualitzacions i aplicacions de Google, de l'operador de telefonia mòbil i del fabricant del dispositiu del teu fill o filla, i que és possible que ho faci utilitzant dades mòbils. Pot ser que algunes d'aquestes aplicacions ofereixin compres des de l'aplicació.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{El PIN ha de tenir almenys 1 caràcter}other{El PIN ha de tenir almenys # caràcters}}</translation> @@ -4734,6 +4739,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> vol</translation> <translation id="5534304873398226603">Descarta la foto o el vídeo</translation> <translation id="5537725057119320332">Emet</translation> +<translation id="5539070192556911367">No es pot accedir a Google</translation> <translation id="5539221284352502426">El servidor ha rebutjat la contrasenya que has introduït. Els motius poden ser els següents: la contrasenya és massa curta, la contrasenya ha d'incloure números o símbols, o la contrasenya no es pot haver utilitzat anteriorment.</translation> <translation id="5541694225089836610">L'administrador ha desactivat l'acció</translation> <translation id="5542132724887566711">Perfil</translation> @@ -4797,6 +4803,7 @@ <translation id="5585912436068747822">La formatació ha fallat</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">S'estan carregant les aplicacions...</translation> +<translation id="5590418976913374224">Reprodueix un so en iniciar el dispositiu</translation> <translation id="5592595402373377407">Encara no hi ha prou dades disponibles.</translation> <translation id="5595307023264033512">Emmagatzematge total utilitzat pels llocs web: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">Edita l'adreça</translation> @@ -6172,6 +6179,10 @@ <translation id="6943939122536910181">S'ha desconnectat del dispositiu <ph name="DEVICE" /></translation> <translation id="6945221475159498467">Selecciona</translation> <translation id="694592694773692225">S'ha bloquejat la redirecció en aquesta pàgina.</translation> +<translation id="6947015141909171112">Veus receptes en funció de la teva activitat de cerca recent sobre receptes. + <ph name="BREAK" /> + <ph name="BREAK" /> + Pots gestionar la configuració des del menú de la targeta o veure més opcions a Personalitza Chrome.</translation> <translation id="6949434160682548041">Contrasenya (opcional)</translation> <translation id="6950627417367801484">Restaura les aplicacions</translation> <translation id="6952242901357037157">També pots fer que es mostrin aquí les contrasenyes del teu <ph name="BEGIN_LINK" />Compte de Google<ph name="END_LINK" /></translation> @@ -6339,6 +6350,7 @@ <translation id="7102687220333134671">Les actualitzacions automàtiques estan activades</translation> <translation id="7102832101143475489">S'ha esgotat el temps d'espera de la sol·licitud</translation> <translation id="710640343305609397">Obre la configuració de la xarxa</translation> +<translation id="7107609441453408294">Reprodueix el mateix àudio en tots els altaveus</translation> <translation id="7108338896283013870">Amaga</translation> <translation id="7108668606237948702">retorn</translation> <translation id="7108933416628942903">Bloqueja ara</translation> @@ -6569,6 +6581,7 @@ <translation id="7364745943115323529">Emet…</translation> <translation id="7364796246159120393">Tria un fitxer</translation> <translation id="7365076891350562061">Mida del monitor</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" />: fixada</translation> <translation id="7366316827772164604">S'estan cercant dispositius propers...</translation> <translation id="7366415735885268578">Afegeix un lloc</translation> <translation id="7366909168761621528">Dades de navegació</translation> @@ -6965,6 +6978,7 @@ <translation id="7737115349420013392">S'està vinculant amb "<ph name="DEVICE_NAME" />"...</translation> <translation id="7737846262459425222">Pots canviar aquesta opció en qualsevol moment a Configuració > Assistent de Google > Context de la pantalla.</translation> <translation id="7737948071472253612">Sense permís per utilitzar la càmera</translation> +<translation id="77381465218432215">Mostra marques d'èmfasi i caràcters especials</translation> <translation id="7740996059027112821">Estàndard</translation> <translation id="7741307896921365578">Activa un panell lateral al navegador per tenir una forma útil i permanent d'accedir a la llista de lectura i a les adreces d'interès.</translation> <translation id="7742558784808143689">Vols esborrar les dades i els permisos del lloc web <ph name="SITE_NAME" />, tots els llocs web que conté i les aplicacions instal·lades?</translation> @@ -7756,6 +7770,7 @@ <translation id="8486666913807228950">Motiu: s'ha trobat la regla invertida <ph name="REVERT_RULE" /> a la llista "Força l'obertura a".</translation> <translation id="848666842773560761">Una aplicació està provant d'accedir a la càmera. Desactiva l'interruptor de privadesa de la càmera per permetre-hi l'accés.</translation> <translation id="8487678622945914333">Amplia</translation> +<translation id="8487699605742506766">Punt d'accés Wi‑Fi</translation> <translation id="8489156414266187072">Els suggeriments personals només es mostren al teu compte</translation> <translation id="8490896350101740396">S'han actualitzat les aplicacions de Quiosc següents: <ph name="UPDATED_APPS" />. Reinicieu el dispositiu per completar el procés d'actualització.</translation> <translation id="8492685019009920170">Toca el sensor d'empremtes digitals amb el dit. Les teves dades s'emmagatzemen de manera segura i no surten mai del teu <ph name="DEVICE_TYPE" />.</translation> @@ -8249,6 +8264,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" i 1 pestanya més}other{"<ph name="TAB_TITLE" />" i # pestanyes més}}</translation> <translation id="8977811652087512276">Contrasenya incorrecta o fitxer malmès</translation> <translation id="8978154919215542464">Activat: se sincronitza tot</translation> +<translation id="8978670037548431647">Actualitza les capacitats de la compartició de xarxa</translation> <translation id="897939795688207351">A <ph name="ORIGIN" /></translation> <translation id="8980345560318123814">Informes de suggeriments</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" />: ha fallat</translation> @@ -8513,6 +8529,7 @@ <translation id="935854577147268200">El telèfon Smart Lock ha canviat. Introdueix la contrasenya per actualitzar Smart Lock. La propera vegada, <ph name="DEVICE_TYPE" /> es desbloquejarà amb el telèfon. Pots desactivar Smart Lock a Configuració.</translation> <translation id="936646668635477464">Càmera i micròfon</translation> <translation id="936801553271523408">Dades de diagnòstic del sistema</translation> +<translation id="937053962468712792">Vols suprimir <ph name="DEVICE" /> de <ph name="PRIMARY_EMAIL" />?</translation> <translation id="93766956588638423">Repara l'extensió</translation> <translation id="938568644810664664">Prova de dir: "Hey Google, quina cançó és aquesta?" o "Hey Google, què hi ha a la pantalla?"</translation> <translation id="938623846785894166">Fitxer poc habitual</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index e0f64d0..292fd50 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -897,6 +897,7 @@ <translation id="1829129547161959350">Tučňák</translation> <translation id="1829192082282182671">&Oddálit</translation> <translation id="1830550083491357902">Nejste přihlášeni</translation> +<translation id="1831848493690504725">Nelze se spojit s Googlem prostřednictvím připojené sítě. Zkuste vybrat jinou síť nebo zkontrolovat nastavení sítě či proxy serveru (pokud ho používáte).</translation> <translation id="1832459821645506983">Ano, souhlasím</translation> <translation id="1832511806131704864">Změna telefonu aktualizována</translation> <translation id="1832848789136765277">Aby bylo zajištěno, že budete mít vždy přístup k synchronizovaným datům, ověřte svou totožnost</translation> @@ -2195,6 +2196,7 @@ <translation id="3021065318976393105">Při provozu na baterii</translation> <translation id="3021066826692793094">Motýl</translation> <translation id="3021678814754966447">Zobrazit zdrojo&vý kód rámce</translation> +<translation id="3022361196600037287">Zařízení <ph name="DEVICE" /> bude z tohoto Chromebooku odebráno a nebude uloženo do účtu <ph name="PRIMARY_EMAIL" />.</translation> <translation id="3022978424994383087">Nerozumím.</translation> <translation id="3023464535986383522">Poslech vybraného textu</translation> <translation id="3024374909719388945">Použít hodiny s formátem 24 h</translation> @@ -3732,6 +3734,7 @@ <translation id="4535127706710932914">Výchozí profil</translation> <translation id="4535767533210902251">Snímač otisků prstů je klávesa v pravém horním rohu klávesnice. Zlehka se ho dotkněte jakýmkoli prstem.</translation> <translation id="4536140153723794651">Weby, které mohou vždy používat soubory cookie</translation> +<translation id="4536769240747010177">Možnosti sdílení datového připojení:</translation> <translation id="4538417792467843292">Smazat slovo</translation> <translation id="4538792345715658285">Nainstalováno podnikovými zásadami.</translation> <translation id="4541123282641193691">Účet se nepodařilo ověřit. Zkuste to znovu nebo Chromebook restartujte.</translation> @@ -3759,6 +3762,7 @@ <translation id="4561893854334016293">Žádná nedávno změněná oprávnění</translation> <translation id="4562155214028662640">Přidat otisk prstu</translation> <translation id="4563210852471260509">Výchozí jazyk zadávání je čínština</translation> +<translation id="4563382028841851106">Odebrat z účtu</translation> <translation id="4563880231729913339">Prst 3</translation> <translation id="4564245002465020751">Dokončete nastavení na telefonu</translation> <translation id="4565377596337484307">Skrýt heslo</translation> @@ -4735,6 +4739,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> vyžaduje</translation> <translation id="5534304873398226603">Zahodit fotku nebo video</translation> <translation id="5537725057119320332">Odeslat</translation> +<translation id="5539070192556911367">Nepodařilo se připojit ke Googlu</translation> <translation id="5539221284352502426">Zadané heslo bylo serverem odmítnuto. Možné příčiny: Heslo je příliš krátké. Heslo musí obsahovat číslice nebo symboly. Heslo se musí lišit od předchozích hesel.</translation> <translation id="5541694225089836610">Administrátor akci zakázal</translation> <translation id="5542132724887566711">Profil</translation> @@ -4798,6 +4803,7 @@ <translation id="5585912436068747822">Formátování se nezdařilo</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Načítání aplikací...</translation> +<translation id="5590418976913374224">Přehrát zvuk při spuštění zařízení</translation> <translation id="5592595402373377407">Zatím není k dispozici dostatek dat.</translation> <translation id="5595307023264033512">Celkové úložiště využité weby: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">Upravit adresu</translation> @@ -6176,6 +6182,10 @@ <translation id="6943939122536910181">Odpojeno od zařízení <ph name="DEVICE" /></translation> <translation id="6945221475159498467">Vybrat</translation> <translation id="694592694773692225">Na této stránce bylo zablokováno přesměrování.</translation> +<translation id="6947015141909171112">Zobrazují se vám recepty na základě nedávné aktivity ve vyhledávání receptů. + <ph name="BREAK" /> + <ph name="BREAK" /> + Nastavení můžete spravovat v nabídce karty. Další možnosti zobrazíte v sekci Přizpůsobit Chrome.</translation> <translation id="6949434160682548041">Heslo (nepovinné)</translation> <translation id="6950627417367801484">Obnovit aplikace</translation> <translation id="6952242901357037157">Můžete zde zobrazit také hesla z <ph name="BEGIN_LINK" />účtu Google<ph name="END_LINK" /></translation> @@ -6343,6 +6353,7 @@ <translation id="7102687220333134671">Automatické aktualizace jsou zapnuté</translation> <translation id="7102832101143475489">Časový limit požadavku vypršel</translation> <translation id="710640343305609397">Otevřít nastavení sítě</translation> +<translation id="7107609441453408294">Přehrávat stejný zvuk ve všech reproduktorech</translation> <translation id="7108338896283013870">Skrýt</translation> <translation id="7108668606237948702">enter</translation> <translation id="7108933416628942903">Uzamknout</translation> @@ -6573,6 +6584,7 @@ <translation id="7364745943115323529">Odeslat…</translation> <translation id="7364796246159120393">Vybrat soubor</translation> <translation id="7365076891350562061">Velikost monitoru</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" /> – připnuto</translation> <translation id="7366316827772164604">Vyhledávání zařízení v okolí…</translation> <translation id="7366415735885268578">Přidání webu</translation> <translation id="7366909168761621528">Údaje o prohlížení</translation> @@ -6969,6 +6981,7 @@ <translation id="7737115349420013392">Párování se zařízením <ph name="DEVICE_NAME" />…</translation> <translation id="7737846262459425222">Toto chování můžete kdykoliv změnit v sekci Nastavení > Asistent Google > Kontext obrazovky.</translation> <translation id="7737948071472253612">Zákaz používat kameru</translation> +<translation id="77381465218432215">Zobrazit diakritiku a speciální znaky</translation> <translation id="7740996059027112821">Standardně</translation> <translation id="7741307896921365578">Aktivuje boční panel prohlížeče, který umožňuje snadný a trvalý přístup k seznamu četby a záložkám.</translation> <translation id="7742558784808143689">Vymazat data a oprávnění webu <ph name="SITE_NAME" />, všech jeho podřízených webů a nainstalovaných aplikací?</translation> @@ -7758,6 +7771,7 @@ <translation id="8486666913807228950">Důvod: V seznamu Vynutit otevření v bylo nalezeno převrácené pravidlo <ph name="REVERT_RULE" />.</translation> <translation id="848666842773560761">Aplikace se pokouší použít kameru. Pokud chcete povolit přístup, vypněte ochranu soukromí kamery.</translation> <translation id="8487678622945914333">Přiblížit</translation> +<translation id="8487699605742506766">Hotspot</translation> <translation id="8489156414266187072">Osobní návrhy jsou zobrazovány jen ve vašem účtu</translation> <translation id="8490896350101740396">Byly aktualizovány následující terminálové aplikace: <ph name="UPDATED_APPS" />. Chcete-li proces aktualizace dokončit, restartujte zařízení.</translation> <translation id="8492685019009920170">Dotkněte se prstem snímače otisků prstů. Vaše data jsou bezpečně uložena a nikdy neopouští <ph name="DEVICE_TYPE" />.</translation> @@ -8253,6 +8267,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{„<ph name="TAB_TITLE" />“}=1{„<ph name="TAB_TITLE" />“ a 1 další karta}few{„<ph name="TAB_TITLE" />“ a # další karty}many{„<ph name="TAB_TITLE" />“ a # další karty}other{„<ph name="TAB_TITLE" />“ a # dalších karet}}</translation> <translation id="8977811652087512276">Nesprávné heslo nebo poškozený soubor</translation> <translation id="8978154919215542464">Zapnuto – synchronizovat vše</translation> +<translation id="8978670037548431647">Obnovit možnosti sdílení datového připojení</translation> <translation id="897939795688207351">V doméně <ph name="ORIGIN" /></translation> <translation id="8980345560318123814">Zprávy zpětné vazby</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> – selhalo</translation> @@ -8517,6 +8532,7 @@ <translation id="935854577147268200">Telefon pro Smart Lock se změnil. Chcete-li funkci Smart Lock aktualizovat, zadejte heslo. Příště váš telefon zařízení <ph name="DEVICE_TYPE" /> odemkne. Funkci Smart Lock můžete vypnout v Nastavení.</translation> <translation id="936646668635477464">Kamera a mikrofon</translation> <translation id="936801553271523408">Diagnostická data o systému</translation> +<translation id="937053962468712792">Odebrat zařízení <ph name="DEVICE" /> z účtu <ph name="PRIMARY_EMAIL" />?</translation> <translation id="93766956588638423">Opravit rozšíření</translation> <translation id="938568644810664664">Zkuste „Ok Google, co je tohle za skladbu?“ nebo „Ok Google, co je na obrazovce?“</translation> <translation id="938623846785894166">Neobvyklý soubor</translation>
diff --git a/chrome/app/resources/generated_resources_cy.xtb b/chrome/app/resources/generated_resources_cy.xtb index 928c3ee..38dcc4f 100644 --- a/chrome/app/resources/generated_resources_cy.xtb +++ b/chrome/app/resources/generated_resources_cy.xtb
@@ -909,6 +909,7 @@ <translation id="1829129547161959350">Pengwyn</translation> <translation id="1829192082282182671">Pellhau&</translation> <translation id="1830550083491357902">Heb fewngofnodi</translation> +<translation id="1831848493690504725">Ni allwn gyrraedd Google drwy'r rhwydwaith cysylltiedig. Rhowch gynnig ar ddewis rhwydwaith gwahanol neu wirio eich gosodiadau rhwydwaith neu osodiadau dirprwy (os ydych yn defnyddio dirprwy).</translation> <translation id="1832459821645506983">Iawn, rwy'n cydsynio</translation> <translation id="1832511806131704864">Newid ffôn wedi'i ddiweddaru</translation> <translation id="1832848789136765277">I wneud yn siŵr eich bod bob amser yn gallu cael mynediad at eich data cysoni, cadarnhewch mai chi sydd yno</translation> @@ -2211,6 +2212,7 @@ <translation id="3021065318976393105">Wrth ddefnyddio'r batri</translation> <translation id="3021066826692793094">Pili-pala</translation> <translation id="3021678814754966447">&Gweld Ffynhonnell Ffrâm</translation> +<translation id="3022361196600037287">Bydd <ph name="DEVICE" /> yn cael ei dynnu o'r Chromebook hwn ac ni fydd yn cael ei gadw i <ph name="PRIMARY_EMAIL" />.</translation> <translation id="3022978424994383087">Heb ei ddal.</translation> <translation id="3023464535986383522">Dewis i siarad</translation> <translation id="3024374909719388945">Defnyddio cloc 24 awr</translation> @@ -3750,6 +3752,7 @@ <translation id="4535127706710932914">Proffil Diofyn</translation> <translation id="4535767533210902251">Y synhwyrydd olion bysedd yw'r fysell dde uchaf ar eich bysellfwrdd. Cyffyrddwch â hi'n ysgafn ag unrhyw fys.</translation> <translation id="4536140153723794651">Gwefannau a all ddefnyddio cwcis bob amser</translation> +<translation id="4536769240747010177">Galluoedd Rhannu Cysylltiad:</translation> <translation id="4538417792467843292">Dileu gair</translation> <translation id="4538792345715658285">Wedi'i osod gan bolisi sefydliad.</translation> <translation id="4541123282641193691">Methu â dilysu'ch cyfrif. Rhowch gynnig arall arni neu ailgychwynnwch eich Chromebook.</translation> @@ -3777,6 +3780,7 @@ <translation id="4561893854334016293">Dim caniatadau sydd wedi newid yn ddiweddar</translation> <translation id="4562155214028662640">Ychwanegu Olion Bysedd</translation> <translation id="4563210852471260509">Yr iaith mewnbwn gychwynnol yw Tsieinëeg</translation> +<translation id="4563382028841851106">Tynnu o'r cyfrif</translation> <translation id="4563880231729913339">Bys 3</translation> <translation id="4564245002465020751">Gorffenwch osod ar eich ffôn</translation> <translation id="4565377596337484307">Cuddio'r cyfrinair</translation> @@ -4753,6 +4757,7 @@ <translation id="5533001281916885985">Mae <ph name="SITE_NAME" /> eisiau</translation> <translation id="5534304873398226603">Cael gwared ar lun neu fideo</translation> <translation id="5537725057119320332">Castio</translation> +<translation id="5539070192556911367">Methu â chyrraedd Google</translation> <translation id="5539221284352502426">Gwrthodwyd y cyfrinair a nodoch gan y gweinydd. Mae rhesymau posib yn cynnwys: Mae'r cyfrinair yn rhy fyr. Rhaid i'r cyfrinair gynnwys rhifau neu symbolau. Rhaid i'r cyfrinair fod yn wahanol i gyfrineiriau blaenorol.</translation> <translation id="5541694225089836610">Mae'r weithred hon wedi'i hanalluogi gan eich gweinyddwr</translation> <translation id="5542132724887566711">Proffil</translation> @@ -4816,6 +4821,7 @@ <translation id="5585912436068747822">Wedi methu â fformatio</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Wrthi'n llwytho apiau...</translation> +<translation id="5590418976913374224">Chwarae sain wrth gychwyn dyfais</translation> <translation id="5592595402373377407">Dim digon o ddata ar gael eto.</translation> <translation id="5595307023264033512">Cyfanswm y storfa a ddefnyddir gan wefannau: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">Golygu cyfeiriad</translation> @@ -6201,6 +6207,10 @@ <translation id="6943939122536910181">Wedi datgysylltu o <ph name="DEVICE" /></translation> <translation id="6945221475159498467">Dewis</translation> <translation id="694592694773692225">Mae ailgyfeirio wedi'i rwystro ar y dudalen hon.</translation> +<translation id="6947015141909171112">Rydych yn gweld ryseitiau yn seiliedig ar eich Gweithgarwch chwilio diweddar ar gyfer ryseitiau. + <ph name="BREAK" /> + <ph name="BREAK" /> + Gallwch reoli gosodiadau o'r ddewislen cardiau neu weld rhagor o ddewisiadau yn Personoleiddio Chrome.</translation> <translation id="6949434160682548041">Cyfrinair (dewisol)</translation> <translation id="6950627417367801484">Adfer apiau</translation> <translation id="6952242901357037157">Gallwch hefyd ddangos cyfrineiriau o'ch <ph name="BEGIN_LINK" />Cyfrif Google<ph name="END_LINK" /> yma</translation> @@ -6368,6 +6378,7 @@ <translation id="7102687220333134671">Mae diweddariadau awtomatig wedi'u troi ymlaen</translation> <translation id="7102832101143475489">Mae'r cais wedi darfod</translation> <translation id="710640343305609397">Agor y gosodiadau rhwydwaith</translation> +<translation id="7107609441453408294">Chwarae'r un sain drwy'r holl seinyddion</translation> <translation id="7108338896283013870">Cuddio</translation> <translation id="7108668606237948702">rhowch yr allwedd</translation> <translation id="7108933416628942903">Cloi nawr</translation> @@ -6598,6 +6609,7 @@ <translation id="7364745943115323529">Castio...</translation> <translation id="7364796246159120393">Dewis Ffeil</translation> <translation id="7365076891350562061">Maint y monitor</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" /> - Piniwyd</translation> <translation id="7366316827772164604">Wrthi'n chwilio am ddyfeisiau gerllaw…</translation> <translation id="7366415735885268578">Ychwanegu gwefan</translation> <translation id="7366909168761621528">Data pori</translation> @@ -6994,6 +7006,7 @@ <translation id="7737115349420013392">Wrthi'n paru â "<ph name="DEVICE_NAME" />" ...</translation> <translation id="7737846262459425222">Gallwch newid hyn ar unrhyw adeg yn y Gosodiadau > Google Assistant > Cyd-destun sgrîn.</translation> <translation id="7737948071472253612">Dim caniatâd i ddefnyddio'ch camera</translation> +<translation id="77381465218432215">Dangos acenion a nodau arbennig</translation> <translation id="7740996059027112821">Safonol</translation> <translation id="7741307896921365578">Yn galluogi panel ochr ar lefel porwr am ffordd ddefnyddiol a pharhaus i gael mynediad at eich Rhestr Ddarllen a Nodau Tudalen.</translation> <translation id="7742558784808143689">Clirio data a chaniatadau ar gyfer <ph name="SITE_NAME" /> a'r holl wefannau oddi tani ac apiau sydd wedi'u gosod?</translation> @@ -7783,6 +7796,7 @@ <translation id="8486666913807228950">Rheswm: Canfuwyd y rheol wrthdro <ph name="REVERT_RULE" /> yn y rhestr "Gorfodi i agor yn".</translation> <translation id="848666842773560761">Mae ap yn ceisio cael mynediad at y camera. Diffodd y switsh preifatrwydd camera i ganiatáu mynediad.</translation> <translation id="8487678622945914333">Chwyddo</translation> +<translation id="8487699605742506766">Poethfan</translation> <translation id="8489156414266187072">Dim ond ar eich cyfrif y dangosir awgrymiadau personol</translation> <translation id="8490896350101740396">Mae'r apiau Kiosk canlynol "<ph name="UPDATED_APPS" />" wedi'u diweddaru. Ailgychwynnwch y ddyfais i gwblhau'r broses ddiweddaru.</translation> <translation id="8492685019009920170">Cyffyrddwch y synhwyrydd olion bysell gyda'ch bys. Mae eich data wedi'u storio yn ddiogel a byth yn gadael eich <ph name="DEVICE_TYPE" />.</translation> @@ -8280,6 +8294,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" ac 1 tab arall}two{"<ph name="TAB_TITLE" />" a # dab arall}few{"<ph name="TAB_TITLE" />" a # thab arall}many{"<ph name="TAB_TITLE" />" a # thab arall}other{"<ph name="TAB_TITLE" />" a # tab arall}}</translation> <translation id="8977811652087512276">Cyfrinair anghywir neu ffeil lygredig</translation> <translation id="8978154919215542464">Ymlaen - cysoni popeth</translation> +<translation id="8978670037548431647">Ail-lwytho Galluoedd Rhannu Cysylltiad</translation> <translation id="897939795688207351">Ymlaen <ph name="ORIGIN" /></translation> <translation id="8980345560318123814">Adroddiadau adborth</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> - Wedi torri</translation> @@ -8544,6 +8559,7 @@ <translation id="935854577147268200">Cafodd y ffôn Smart Lock ei newid. Rhowch eich cyfrinair i ddiweddaru Smart Lock. Y tro nesaf, bydd eich ffôn yn datgloi'ch <ph name="DEVICE_TYPE" />. Gallwch ddiffodd Smart Lock yn y gosodiadau</translation> <translation id="936646668635477464">Camera a meicroffon</translation> <translation id="936801553271523408">Data diagnosteg system</translation> +<translation id="937053962468712792">Tynnu <ph name="DEVICE" /> o <ph name="PRIMARY_EMAIL" />?</translation> <translation id="93766956588638423">Trwsio'r estyniad</translation> <translation id="938568644810664664">Rhowch gynnig ar "Hei Google, pa gân yw hon?" neu "Hei Google, beth sydd ar fy sgrîn?"</translation> <translation id="938623846785894166">Ffeil anghyffredin</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index ee60dd9..1b30e9f6 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Bruge din mikrofon og dit kamera</translation> <translation id="1005333234656240382">Vil du aktivere ADB-fejlretning?</translation> <translation id="1006873397406093306">Denne udvidelse kan læse og ændre dine data på websites. Du kan styre, hvilke websites udvidelsen kan få adgang til.</translation> +<translation id="1007057452468855774">Aktivér Google Play Butik</translation> <translation id="1008186147501209563">Eksportér bogmærker</translation> <translation id="1008557486741366299">Ikke nu</translation> <translation id="1009476156254802388"><ph name="WEB_DRIVE" />-placering</translation> <translation id="1009663062402466586">Spilindstillinger er nu tilgængelige</translation> <translation id="1010498023906173788">Denne fane er tilsluttet en serieport.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Siden svarer ikke}one{Siderne svarer ikke}other{Siderne svarer ikke}}</translation> +<translation id="1011003645819296594">Gemte enheder</translation> <translation id="1011355516189274711">Lydstyrke ved oplæsning</translation> <translation id="1012794136286421601">Dine filer i Docs, Sheets, Slides og Tegninger synkroniseres. Åbn appen Google Drev for at få adgang til dem online eller offline.</translation> <translation id="1012876632442809908">USB-C-enhed (port foran)</translation> @@ -495,6 +497,7 @@ <translation id="1470350905258700113">Brug denne enhed</translation> <translation id="1470946456740188591">Brug genvejen Ctrl+søgetasten+7 for at aktivere eller deaktivere tastenavigation</translation> <translation id="1472675084647422956">Vis mere</translation> +<translation id="1473223074251193484">Angiv konfiguration af netdeling</translation> <translation id="1474785664565228650">Ændringen af mikrofonindstillingen kræver, at Parallels Desktop genstartes. Genstart Parallels Desktop for at fortsætte.</translation> <translation id="1474893630593443211">Mere kontrol over de annoncer, du får vist</translation> <translation id="1475502736924165259">Du har lagrede certifikater, som ikke passer i nogen af de andre kategorier</translation> @@ -907,6 +910,7 @@ <translation id="1829129547161959350">Pingvin</translation> <translation id="1829192082282182671">Zoom &ud</translation> <translation id="1830550083491357902">Ikke logget ind</translation> +<translation id="1831848493690504725">Vi kan ikke få forbindelse til Google via det forbundne netværk. Prøv at vælge et andet netværk eller tjekke dine netværksindstillinger eller proxyindstillinger (hvis du bruger en proxy).</translation> <translation id="1832459821645506983">Ja tak</translation> <translation id="1832511806131704864">Telefonændring opdateret</translation> <translation id="1832848789136765277">Bekræft din identitet for at sikre, at du altid har adgang til dine synkroniserede data</translation> @@ -1125,6 +1129,7 @@ <translation id="2044014337866019681">Sørg for, at du bekræfter <ph name="ACCOUNT" /> for at låse sessionen op.</translation> <translation id="204497730941176055">Navn på skabelon til Microsoft-certifikat</translation> <translation id="2045117674524495717">Hjælp til tastaturgenveje</translation> +<translation id="2045211794962848221">Du får ikke vist denne specifikke meddelelse igen</translation> <translation id="2045969484888636535">Fortsæt med at blokere cookies</translation> <translation id="204622017488417136">Enheden nulstilles til sin forrige installerede version af Chrome. Alle brugerkonti og lokale data fjernes. Du kan ikke fortryde denne handling.</translation> <translation id="2046702855113914483">Ramen</translation> @@ -3814,6 +3819,7 @@ <translation id="4594577641390224176">Leder du efter siden Om for systemet? Gå til</translation> <translation id="4595560905247879544">Apps og udvidelser kan kun ændres af administratoren (<ph name="CUSTODIAN_NAME" />).</translation> <translation id="4596295440756783523">Du har lagrede certifikater, som identificerer følgende servere:</translation> +<translation id="4598345735110653698">Administrer adgangskoder</translation> <translation id="4598556348158889687">Administration af lagerplads</translation> <translation id="4598776695426288251">Wi-Fi er tilgængelig via flere enheder</translation> <translation id="4601426376352205922">Markér som ulæst</translation> @@ -4039,6 +4045,7 @@ <translation id="4823894915586516138">Denne pinkode eller adgangskode beskytter dine data på denne <ph name="DEVICE_TYPE" />, herunder de oplysninger, du tilgår via din telefon</translation> <translation id="4824037980212326045">Backup og gendannelse i Linux</translation> <translation id="4824958205181053313">Vil du annullere synkroniseringen?</translation> +<translation id="4825532258163983651">Adgangskoden kan ikke slettes</translation> <translation id="4827675678516992122">Der kunne ikke oprettes forbindelse</translation> <translation id="4827784381479890589">Forbedret stavekontrol i Chrome-browseren (teksten sendes til Google for at generere staveforslag)</translation> <translation id="4827904420700932487">Opret en QR-kode for dette billede</translation> @@ -4301,6 +4308,7 @@ <translation id="5087249366037322692">Tilføjet af en tredjepart</translation> <translation id="5087580092889165836">Tilføj kort</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 med RSA-kryptering</translation> +<translation id="5089763948477033443">Sidepanelets tilpasningshåndtag</translation> <translation id="5090637338841444533">Har ikke tilladelse til at spore din kameraposition</translation> <translation id="5093569275467863761">Inkognito-underramme i back/forward-cache: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">Du kan åbne og redigere understøttede filer med denne app via appen Filer eller andre apps. Hvis du vil styre, hvilke filer der som standard skal åbnes i denne app, kan du <ph name="BEGIN_LINK" />se, hvordan du angiver standardapps på din enhed<ph name="END_LINK" />.</translation> @@ -4466,6 +4474,7 @@ <translation id="5258992782919386492">Installer på denne enhed</translation> <translation id="5260334392110301220">Smarte citationstegn</translation> <translation id="5260508466980570042">Din mail eller adgangskode blev ikke bekræftet. Prøv igen.</translation> +<translation id="5260958083445173099">Websites viser indhold på dine foretrukne sprog, hvis det er muligt</translation> <translation id="5261683757250193089">Åbn i Webshop</translation> <translation id="5262178194499261222">Fjern adgangskode</translation> <translation id="5262784498883614021">Opret automatisk forbindelse til netværket</translation> @@ -4506,6 +4515,7 @@ <translation id="5294097441441645251">Skal starte med et lille bogstav eller en understregning</translation> <translation id="5294618183559481278">Din <ph name="DEVICE_TYPE" /> bruger en indbygget sensor til at registrere, om der er nogen foran din enhed. Alle dataene behandles øjeblikkeligt på din enhed og slettes derefter. Sensordata sendes aldrig til Google. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Hør talefeedback, så du kan bruge din enhed uden at kigge på skærmen. Braillefeedback er tilgængelig med en forbundet enhed.</translation> +<translation id="5297005732522718715">Opdater konfiguration af netdeling</translation> <translation id="5297082477358294722">Adgangskoden blev gemt. Se og administrer gemte adgangskoder på din <ph name="SAVED_PASSWORDS_STORE" />.</translation> <translation id="5297946558563358707">Vis øjeikonet for privatliv nederst til højre på din skærm, når en anden person kigger på din skærm</translation> <translation id="5298219193514155779">Tema oprettet af</translation> @@ -4676,6 +4686,7 @@ <translation id="5466374726908360271">Ind&sæt, og søg efter "<ph name="SEARCH_TERMS" />"</translation> <translation id="5467207440419968613">Adgangen til <ph name="PERMISSION_1" /> og <ph name="PERMISSION_2" /> blev blokeret</translation> <translation id="5468173180030470402">Søger efter fildelinger</translation> +<translation id="5468330507528805311">Status for netdeling:</translation> <translation id="5468881191994555667">Vælg fil</translation> <translation id="5469852975082458401">Du kan navigere på sider med en tekstmarkør. Tryk på F7, eller deaktiver.</translation> <translation id="5470735824776589490">Enheden skal genstartes, før den kan nulstilles med Powerwash. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation> @@ -4754,6 +4765,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> vil gerne</translation> <translation id="5534304873398226603">Slet billede eller video</translation> <translation id="5537725057119320332">Cast</translation> +<translation id="5539070192556911367">Kan ikke få forbindelse til Google</translation> <translation id="5539221284352502426">Den angivne adgangskode blev afvist af serveren. Mulige årsager: Adgangskoden er for kort. Adgangskoden skal indeholde tal eller symboler. Adgangskoden skal være forskellig fra tidligere adgangskoder.</translation> <translation id="5541694225089836610">Handlingen er deaktiveret af din administrator</translation> <translation id="5542132724887566711">Profil</translation> @@ -4817,6 +4829,7 @@ <translation id="5585912436068747822">Formatering mislykkedes</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Indlæser apps...</translation> +<translation id="5590418976913374224">Afspil lyd ved opstart af enheden</translation> <translation id="5592595402373377407">Der er ikke nok data til rådighed endnu.</translation> <translation id="5595307023264033512">Samlet lagerplads, der anvendes af websites: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">Rediger adresse</translation> @@ -4950,6 +4963,7 @@ <translation id="5734362860645681824">Kommunikation</translation> <translation id="5734697361979786483">Tilføj fildeling</translation> <translation id="5736796278325406685">Angiv et gyldigt brugernavn</translation> +<translation id="5738093759615225354">Du skal bruge denne adgangskode for at logge ind på din computer</translation> <translation id="5739017626473506901">Log ind for at hjælpe <ph name="USER_NAME" /> med at tilføje en skolekonto</translation> <translation id="5739235828260127894">Venter på bekræftelse. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Meget stor</translation> @@ -5111,6 +5125,7 @@ <translation id="589541317545606110">Søg på siden med <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">Tillad ikke</translation> <translation id="5900186025777217044">Smart Lock er blevet ændret</translation> +<translation id="5900243355162006650">Konfiguration af netdeling:</translation> <translation id="5900302528761731119">Google-profilbillede</translation> <translation id="590036993063074298">Oplysninger om spejlingskvaliteten</translation> <translation id="5901069264981746702">Dine fingeraftryksdata gemmes sikkert og forlader aldrig din <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation> @@ -5414,6 +5429,7 @@ <translation id="6196640612572343990">Bloker cookies fra tredjeparter</translation> <translation id="6196854373336333322">Udvidelsen <ph name="EXTENSION_NAME" /> har taget kontrol over dine proxyindstillinger, hvilket betyder, at den kan ændre, ødelægge eller aflytte alt, hvad du foretager dig på nettet. Hvis du ikke er sikker på, hvorfor denne ændring er sket, er den sandsynligvis uønsket.</translation> <translation id="6197128521826316819">Opret en QR-kode for denne side</translation> +<translation id="6197223946499512637">Disse adgangskoder gemmes i Windows Hello på denne computer. De gemmes ikke på din Google-konto.</translation> <translation id="6198252989419008588">Skift pinkode</translation> <translation id="6200047250927636406">Kassér fil</translation> <translation id="6200151268994853226">Administrer udvidelse</translation> @@ -5711,6 +5727,7 @@ <translation id="6482559668224714696">Forstørrelse af fuld skærm</translation> <translation id="6483485061007832714">Åbn download</translation> <translation id="6483805311199035658">Åbner <ph name="FILE" />...</translation> +<translation id="6486301003991593638">Hvis du vil administrere adgangskoder, skal du bruge en nyere version af Windows</translation> <translation id="6488384360522318064">Vælg sprog</translation> <translation id="648927581764831596">Ingen tilgængelig</translation> <translation id="6490471652906364588">USB-C-enhed (højre port)</translation> @@ -6299,6 +6316,7 @@ <translation id="7029307918966275733">Crostini er ikke installeret. Installer Crostini for at se krediteringer.</translation> <translation id="7029809446516969842">Adgangskoder</translation> <translation id="7030304022046916278">Webadresser sendes til tjek i Beskyttet browsing</translation> +<translation id="7030695672997239647">Højreklik på en fane, vælg "Føj fane til gruppe", og vælg derefter "Ny gruppe"</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> – tilsluttet en serieport</translation> <translation id="7033616203784997570">Du må maks. angive 62 tegn</translation> <translation id="7034692021407794547">En administrator med rettigheden Faktureringsadministration skal først acceptere servicevilkårene for Google Meet-hardware under sektionen for Google Meet-hardware i Administrationskonsol.</translation> @@ -6367,6 +6385,7 @@ <translation id="7102687220333134671">Automatiske opdateringer er slået til</translation> <translation id="7102832101143475489">Der opstod timeout for anmodningen</translation> <translation id="710640343305609397">Åbn netværksindstillingerne</translation> +<translation id="7107609441453408294">Afspil den samme lyd via alle højttalere</translation> <translation id="7108338896283013870">Skjul</translation> <translation id="7108668606237948702">enter</translation> <translation id="7108933416628942903">Lås nu</translation> @@ -6597,6 +6616,7 @@ <translation id="7364745943115323529">Cast...</translation> <translation id="7364796246159120393">Vælg fil</translation> <translation id="7365076891350562061">Skærmstørrelse</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" /> – fastgjort</translation> <translation id="7366316827772164604">Søger efter enheder i nærheden...</translation> <translation id="7366415735885268578">Tilføj et website</translation> <translation id="7366909168761621528">Browserdata</translation> @@ -7398,6 +7418,7 @@ <translation id="8101987792947961127">Powerwash er påkrævet ved næste genstart</translation> <translation id="81020759409809034">Lokal placering</translation> <translation id="8102139037507939978">Fjern personhenførbare oplysninger fra system_logs.txt.</translation> +<translation id="810362914482827094">Søg efter adgangskoder</translation> <translation id="8104088837833760645">Download eSIM-profilen</translation> <translation id="8105368624971345109">Deaktiver</translation> <translation id="8107015733319732394">Google Play Butik installeres på din <ph name="DEVICE_TYPE" />. Det kan tage nogle minutter.</translation> @@ -7845,6 +7866,7 @@ <translation id="8557022314818157177">Bliv ved med at røre din sikkerhedsnøgle, indtil dit fingeraftryk er registreret</translation> <translation id="8557180006508471423">Aktivér "Google Chrome" i Lokationstjenester på din Mac</translation> <translation id="8557856025359704738">Næste download finder sted <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">Adgangskoder</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Åbn alle i &nyt vindue}=1{Åbn i &nyt vindue}one{Åbn ({COUNT}) i &nyt vindue}other{Åbn alle ({COUNT}) i &nyt vindue}}</translation> <translation id="8561206103590473338">Elefant</translation> <translation id="8561565784790166472">Vær forsigtig, hvis du fortsætter</translation> @@ -7971,6 +7993,7 @@ <translation id="8677212948402625567">Skjul alle...</translation> <translation id="867767487203716855">Næste opdatering</translation> <translation id="8677859815076891398">Der er ingen album. Opret et album i <ph name="LINK_BEGIN" />Google Fotos<ph name="LINK_END" />.</translation> +<translation id="8678378565142776698">Genstart, og få automatiske opdateringer</translation> <translation id="8678538439778360739">Dataene blev krypteret med din adgangssætning til synkronisering <ph name="TIME" />. Dette omfatter ikke betalingsmetoder og adresser fra Google Pay.</translation> <translation id="8678582529642151449">Faner formindskes ikke</translation> <translation id="8678933587484842200">Hvordan vil du starte denne app?</translation> @@ -8219,6 +8242,7 @@ <translation id="8910987510378294980">Skjul liste over enheder</translation> <translation id="8912362522468806198">Google-konto</translation> <translation id="8912810933860534797">Aktivér automatisk scanning</translation> +<translation id="8915307125957890427">Højreklik på en fane, vælg "Føj fane til gruppe", og vælg derefter "Ny gruppe"</translation> <translation id="8915370057835397490">Indlæser forslag</translation> <translation id="8916476537757519021">Underramme for inkognitotilstand: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> tilhørende <ph name="GIVEN_NAME" /></translation> @@ -8293,6 +8317,7 @@ <translation id="8986362086234534611">Glem</translation> <translation id="8986494364107987395">Send automatisk brugsstatistikker og nedbrudsrapporter til Google</translation> <translation id="8987927404178983737">Måned</translation> +<translation id="8989359959810288806">Opdater status for netdeling</translation> <translation id="8991520179165052608">Websitet kan anvende din mikrofon</translation> <translation id="899384117894244799">Fjern begrænset bruger</translation> <translation id="899403249577094719">Webadresse for Netscape-certifikatbase</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index e5d17524..3721a72 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -892,6 +892,7 @@ <translation id="1829129547161959350">Pinguin</translation> <translation id="1829192082282182671">Ver&kleinern</translation> <translation id="1830550083491357902">Nicht angemeldet</translation> +<translation id="1831848493690504725">Wir können Google über das verbundene Netzwerk nicht erreichen. Versuche es mit einem anderen Netzwerk oder überprüfe dein Netzwerk- oder Proxyeinstellungen (falls du einen Proxy verwendest).</translation> <translation id="1832459821645506983">Ok</translation> <translation id="1832511806131704864">Änderung übernommen</translation> <translation id="1832848789136765277">Bestätige deine Identität, damit du jederzeit auf deine synchronisierten Daten zugreifen kannst</translation> @@ -4731,6 +4732,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> möchte:</translation> <translation id="5534304873398226603">Foto oder Video verwerfen</translation> <translation id="5537725057119320332">Streamen</translation> +<translation id="5539070192556911367">Keine Verbindung mit Google möglich</translation> <translation id="5539221284352502426">Das eingegebene Passwort wurde vom Server zurückgewiesen. Mögliche Ursachen: Das Passwort ist zu kurz. Das Passwort muss Zahlen oder Symbole enthalten. Das Passwort muss sich von vorherigen Passwörtern unterscheiden.</translation> <translation id="5541694225089836610">Die Aktion wurde von deinem Administrator deaktiviert</translation> <translation id="5542132724887566711">Profil</translation> @@ -4794,6 +4796,7 @@ <translation id="5585912436068747822">Fehler bei der Formatierung</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Apps werden geladen...</translation> +<translation id="5590418976913374224">Ton beim Gerätestart abspielen</translation> <translation id="5592595402373377407">Noch nicht genügend Daten vorhanden</translation> <translation id="5595307023264033512">Von Websites belegter Speicherplatz insgesamt: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">Adresse bearbeiten</translation> @@ -6335,6 +6338,7 @@ <translation id="7102687220333134671">Automatische Updates sind aktiviert</translation> <translation id="7102832101143475489">Zeitüberschreitung bei der Anfrage</translation> <translation id="710640343305609397">Netzwerkeinstellungen öffnen</translation> +<translation id="7107609441453408294">Dieselben Audioinhalte über alle Lautsprecher wiedergeben</translation> <translation id="7108338896283013870">Ausblenden</translation> <translation id="7108668606237948702">Eingabe</translation> <translation id="7108933416628942903">Jetzt sperren</translation> @@ -6565,6 +6569,7 @@ <translation id="7364745943115323529">Streamen...</translation> <translation id="7364796246159120393">Datei auswählen</translation> <translation id="7365076891350562061">Monitorgröße</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" /> – angepinnt</translation> <translation id="7366316827772164604">Geräte in der Nähe werden gesucht…</translation> <translation id="7366415735885268578">Website hinzufügen</translation> <translation id="7366909168761621528">Browserdaten</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index 2333ef7..05c679a 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -2209,6 +2209,7 @@ <translation id="3021065318976393105">Κατά τη χρήση μπαταρίας</translation> <translation id="3021066826692793094">Πεταλούδα</translation> <translation id="3021678814754966447">&Προβολή Πηγαίου Κώδικα Πλαισίου</translation> +<translation id="3022361196600037287">Η συσκευή <ph name="DEVICE" /> θα καταργηθεί από αυτό το Chromebook και δεν θα αποθηκευτεί στον λογαριασμό <ph name="PRIMARY_EMAIL" />.</translation> <translation id="3022978424994383087">Δεν έγινε κατανοητό.</translation> <translation id="3023464535986383522">Επιλέξτε για αυτόματη ανάγνωση</translation> <translation id="3024374909719388945">Χρήση ρολογιού 24 ωρών</translation> @@ -3748,6 +3749,7 @@ <translation id="4535127706710932914">Προεπιλεγμένο προφίλ</translation> <translation id="4535767533210902251">Ο αισθητήρας δακτυλικών αποτυπωμάτων είναι το επάνω δεξιά πλήκτρο του πληκτρολογίου σας. Αγγίξτε το ελαφρώς με οποιοδήποτε δάκτυλο.</translation> <translation id="4536140153723794651">Ιστότοποι που μπορούν να χρησιμοποιούν πάντα cookie</translation> +<translation id="4536769240747010177">Δυνατότητες σύνδεσης:</translation> <translation id="4538417792467843292">Διαγραφή λέξης</translation> <translation id="4538792345715658285">Εγκαταστάθηκε από την εταιρική πολιτική.</translation> <translation id="4541123282641193691">Δεν ήταν δυνατή η επαλήθευση του λογαριασμού σας. Δοκιμάστε ξανά ή επανεκκινήστε το Chromebook.</translation> @@ -3775,6 +3777,7 @@ <translation id="4561893854334016293">Δεν υπάρχουν άδειες που άλλαξαν πρόσφατα.</translation> <translation id="4562155214028662640">Προσθήκη δακτυλικού αποτυπώματος</translation> <translation id="4563210852471260509">Η αρχική γλώσσα εισόδου είναι τα Κινέζικα</translation> +<translation id="4563382028841851106">Κατάργηση από τον λογαριασμό</translation> <translation id="4563880231729913339">Δάκτυλο 3</translation> <translation id="4564245002465020751">Ολοκληρώστε τη ρύθμιση στο τηλέφωνό σας</translation> <translation id="4565377596337484307">Απόκρυψη κωδικού πρόσβασης</translation> @@ -6194,6 +6197,10 @@ <translation id="6943939122536910181">Αποσυνδέθηκε από <ph name="DEVICE" /></translation> <translation id="6945221475159498467">Επιλογή</translation> <translation id="694592694773692225">Η ανακατεύθυνση έχει αποκλειστεί σε αυτήν τη σελίδα.</translation> +<translation id="6947015141909171112">Βλέπετε συνταγές με βάση την πρόσφατη δραστηριότητα αναζήτησής σας για συνταγές. + <ph name="BREAK" /> + <ph name="BREAK" /> + Μπορείτε να διαχειριστείτε τις ρυθμίσεις από το μενού κάρτας ή να δείτε περισσότερες επιλογές στην ενότητα Προσαρμογή του Chrome.</translation> <translation id="6949434160682548041">Κωδικός πρόσβασης (προαιρετικά)</translation> <translation id="6950627417367801484">Επαναφορά εφαρμογών</translation> <translation id="6952242901357037157">Μπορείτε επίσης να εμφανίσετε τους κωδικούς πρόσβασης από τον <ph name="BEGIN_LINK" />Λογαριασμό σας Google<ph name="END_LINK" /> εδώ.</translation> @@ -6989,6 +6996,7 @@ <translation id="7737115349420013392">Σύζευξη με "<ph name="DEVICE_NAME" />" …</translation> <translation id="7737846262459425222">Μπορείτε να αλλάξετε αυτήν τη ρύθμιση ανά πάσα στιγμή στις Ρυθμίσεις > Βοηθός Google > Περιβάλλον οθόνης.</translation> <translation id="7737948071472253612">Δεν επιτρέπεται να χρησιμοποιούν την κάμερά σας</translation> +<translation id="77381465218432215">Εμφάνιση τόνων και ειδικών χαρακτήρων</translation> <translation id="7740996059027112821">Τυπική</translation> <translation id="7741307896921365578">Ενεργοποιεί ένα πλαϊνό πλαίσιο σε επίπεδο προγράμματος περιήγησης για έναν χρήσιμο και σταθερό τρόπο πρόσβασης στη Λίστα ανάγνωσης και τους Σελιδοδείκτες σας.</translation> <translation id="7742558784808143689">Διαγραφή δεδομένων ιστοτόπου και αδειών για τον ιστότοπο <ph name="SITE_NAME" />, όλους τους ιστοτόπους που περιλαμβάνονται σε αυτόν και τις εγκατεστημένες εφαρμογές;</translation> @@ -7779,6 +7787,7 @@ <translation id="8486666913807228950">Λόγος: Ο αντεστραμμένος κανόνας <ph name="REVERT_RULE" /> βρέθηκε στη λίστα Επιβολή ανοίγματος σε.</translation> <translation id="848666842773560761">Μια εφαρμογή προσπαθεί να αποκτήσει πρόσβαση στην κάμερα. Απενεργοποιήστε τον διακόπτη απορρήτου της κάμερας, για να επιτρέψετε την πρόσβαση.</translation> <translation id="8487678622945914333">Μεγέθυνση</translation> +<translation id="8487699605742506766">Σημείο πρόσβασης Wi-Fi</translation> <translation id="8489156414266187072">Οι προσωπικές προτάσεις εμφανίζονται μόνο στον λογαριασμό σας.</translation> <translation id="8490896350101740396">Έχουν ενεργοποιηθεί οι παρακάτω εφαρμογές kiosk "<ph name="UPDATED_APPS" />". Επανεκκινήστε τη συσκευή για να ολοκληρωθεί η διαδικασία ενημέρωσης.</translation> <translation id="8492685019009920170">Αγγίξτε τον αισθητήρα δακτυλικών αποτυπωμάτων με το δάχτυλό σας. Τα δεδομένα σας αποθηκεύονται με ασφάλεια και παραμένουν πάντα στη συσκευή <ph name="DEVICE_TYPE" />.</translation> @@ -8270,6 +8279,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" και μία ακόμη καρτέλα}other{"<ph name="TAB_TITLE" />" και # ακόμη καρτέλες}}</translation> <translation id="8977811652087512276">Εσφαλμένος κωδικός πρόσβασης ή κατεστραμμένο αρχείο</translation> <translation id="8978154919215542464">Ενεργό - συγχρονισμός όλων</translation> +<translation id="8978670037548431647">Ανανέωση δυνατοτήτων σύνδεσης</translation> <translation id="897939795688207351">Ενεργό <ph name="ORIGIN" /></translation> <translation id="8980345560318123814">Αναφορές σχολίων</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> - Παρουσίασε σφάλμα</translation> @@ -8534,6 +8544,7 @@ <translation id="935854577147268200">Το τηλέφωνο στο οποίο χρησιμοποιείται το Smart Lock άλλαξε. Καταχωρίστε τον κωδικό πρόσβασης, για να ενημερώσετε το Smart Lock. Την επόμενη φορά, το τηλέφωνό σας θα ξεκλειδώσει τη συσκευή <ph name="DEVICE_TYPE" />. Μπορείτε να απενεργοποιήσετε το Smart Lock στις Ρυθμίσεις.</translation> <translation id="936646668635477464">Κάμερα και μικρόφωνο</translation> <translation id="936801553271523408">Διαγνωστικά δεδομένα συστήματος</translation> +<translation id="937053962468712792">Κατάργηση <ph name="DEVICE" /> από το <ph name="PRIMARY_EMAIL" />;</translation> <translation id="93766956588638423">Επιδιόρθωση επέκτασης</translation> <translation id="938568644810664664">Δοκιμάστε να πείτε "Ok Google, ποιο τραγούδι είναι αυτό;" ή "Ok Google, τι εμφανίζεται στην οθόνη μου;".</translation> <translation id="938623846785894166">Μη συνηθισμένο αρχείο</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index fcdd0952..e7861727 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -4691,6 +4691,7 @@ <translation id="5470735824776589490">A restart is required before your device can be reset with Powerwash. <ph name="LINK_BEGIN" />Learn more<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Hi there! I'm your text-to-speech voice.</translation> <translation id="5472627187093107397">Save passwords for this site</translation> +<translation id="5473062644742711742">Find more accessibility tools in the Chrome Web Store</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">By continuing, you agree that this device may also automatically download and install updates and apps from Google, your child's operator and this device's manufacturer, possibly using mobile data. Some of these apps may offer in-app purchases.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{PIN must be at least one character}other{PIN must be at least # characters}}</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index 4f15167..9ba5665 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -895,6 +895,7 @@ <translation id="1829129547161959350">Pingüino</translation> <translation id="1829192082282182671">&Reducir zoom</translation> <translation id="1830550083491357902">No has iniciado sesión.</translation> +<translation id="1831848493690504725">No podemos acceder a Google a través de la red conectada. Prueba a seleccionar otra red o comprueba la configuración de red. Si estás usando un proxy, comprueba su configuración.</translation> <translation id="1832459821645506983">Sí, acepto</translation> <translation id="1832511806131704864">Cambio de teléfono actualizado</translation> <translation id="1832848789136765277">Verifica tu identidad para asegurarte de que siempre puedas acceder a tus datos sincronizados</translation> @@ -4734,6 +4735,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> quiere</translation> <translation id="5534304873398226603">Descartar foto o vídeo</translation> <translation id="5537725057119320332">Enviar</translation> +<translation id="5539070192556911367">No se puede acceder a Google</translation> <translation id="5539221284352502426">El servidor ha rechazado la contraseña que has introducido. Puede deberse a alguna de estas causas: la contraseña es demasiado corta. La contraseña debe contener números o símbolos. La contraseña debe ser diferente a las contraseñas anteriores.</translation> <translation id="5541694225089836610">Tu administrador ha inhabilitado esta acción</translation> <translation id="5542132724887566711">Perfil</translation> @@ -4797,6 +4799,7 @@ <translation id="5585912436068747822">Error de formato</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Cargando aplicaciones...</translation> +<translation id="5590418976913374224">Reproducir sonido al iniciar el dispositivo</translation> <translation id="5592595402373377407">Todavía no hay suficientes datos disponibles.</translation> <translation id="5595307023264033512">Almacenamiento total usado por sitios: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">Editar dirección</translation> @@ -6341,6 +6344,7 @@ <translation id="7102687220333134671">Las actualizaciones automáticas están activadas</translation> <translation id="7102832101143475489">Se ha agotado el tiempo de espera de la solicitud</translation> <translation id="710640343305609397">Abrir configuración de red</translation> +<translation id="7107609441453408294">Reproduce el mismo audio en todos los altavoces</translation> <translation id="7108338896283013870">Ocultar</translation> <translation id="7108668606237948702">intro</translation> <translation id="7108933416628942903">Bloquear ahora</translation> @@ -6571,6 +6575,7 @@ <translation id="7364745943115323529">Enviar...</translation> <translation id="7364796246159120393">Seleccionar archivo</translation> <translation id="7365076891350562061">Tamaño del monitor</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" />: fijado</translation> <translation id="7366316827772164604">Buscando dispositivos cercanos...</translation> <translation id="7366415735885268578">Añadir un sitio</translation> <translation id="7366909168761621528">Datos de navegación</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 134be4b..4fea3b52 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -898,6 +898,7 @@ <translation id="1829129547161959350">Pingviin</translation> <translation id="1829192082282182671">&Vähenda</translation> <translation id="1830550083491357902">Pole sisse logitud</translation> +<translation id="1831848493690504725">Me ei saa Google'iga ühendatud võrgu kaudu ühendust. Valige teine võrk või kontrollige oma võrgu või puhverserveri seadeid (kui kasutate puhverserverit).</translation> <translation id="1832459821645506983">Jah, sobib</translation> <translation id="1832511806131704864">Telefoni muutmist värskendati</translation> <translation id="1832848789136765277">Selleks, et pääseksite alati oma sünkroonitud andmetele juurde, kinnitage oma isik</translation> @@ -2199,6 +2200,7 @@ <translation id="3021065318976393105">Aku kasutamisel</translation> <translation id="3021066826692793094">Liblikas</translation> <translation id="3021678814754966447">&Vaata raami allikat</translation> +<translation id="3022361196600037287"><ph name="DEVICE" /> eemaldatakse sellest Chromebookist ja seda ei salvestata kontole <ph name="PRIMARY_EMAIL" />.</translation> <translation id="3022978424994383087">Ei saanud aru.</translation> <translation id="3023464535986383522">Vali ja kuula</translation> <translation id="3024374909719388945">Kasuta 24 h kella</translation> @@ -3737,6 +3739,7 @@ <translation id="4535127706710932914">Vaikeprofiil</translation> <translation id="4535767533210902251">Sõrmejäljeandur on teie klaviatuuri paremal ülal olev klahv. Puudutage seda õrnalt mis tahes sõrmega.</translation> <translation id="4536140153723794651">Saidid, mis tohivad alati küpsisefaile kasutada</translation> +<translation id="4536769240747010177">Jagamise võimalused:</translation> <translation id="4538417792467843292">Kustutab sõna</translation> <translation id="4538792345715658285">Installitud ettevõtte reegli alusel.</translation> <translation id="4541123282641193691">Teie kontot ei õnnestunud kinnitada. Proovige uuesti või taaskäivitage oma Chromebook.</translation> @@ -3764,6 +3767,7 @@ <translation id="4561893854334016293">Hiljuti muudetud lube pole</translation> <translation id="4562155214028662640">Lisa sõrmejälg</translation> <translation id="4563210852471260509">Esialgne sisestuskeel on hiina keel</translation> +<translation id="4563382028841851106">Eemalda kontolt</translation> <translation id="4563880231729913339">3. sõrm</translation> <translation id="4564245002465020751">Viige seadistamine oma telefonis lõpule</translation> <translation id="4565377596337484307">Peida parool</translation> @@ -4740,6 +4744,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> soovib</translation> <translation id="5534304873398226603">Eemalda foto või video</translation> <translation id="5537725057119320332">Ülekanne</translation> +<translation id="5539070192556911367">Google'iga ei saa ühendust</translation> <translation id="5539221284352502426">Server lükkas sisestatud parooli tagasi. Võimalikud põhjused on järgmised. Parool on liiga lühike. Parool peab sisaldama numbreid või sümboleid. Parool peab erinema eelmistest paroolidest.</translation> <translation id="5541694225089836610">Administraator on selle toimingu keelanud</translation> <translation id="5542132724887566711">Profiil</translation> @@ -4803,6 +4808,7 @@ <translation id="5585912436068747822">Vormindamine ebaõnnestus</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Rakenduste laadimine …</translation> +<translation id="5590418976913374224">Esita seadme käivitamisel heli</translation> <translation id="5592595402373377407">Praegu pole veel saadaval piisavalt andmeid.</translation> <translation id="5595307023264033512">Saitide kasutatav salvestusruum kokku: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">Muuda aadressi</translation> @@ -6180,6 +6186,10 @@ <translation id="6943939122536910181">Ühendus seadmega <ph name="DEVICE" /> on katkestatud</translation> <translation id="6945221475159498467">Vali</translation> <translation id="694592694773692225">Ümbersuunamine on sellel lehel blokeeritud.</translation> +<translation id="6947015141909171112">Näete retsepte, mis põhinevad teie hiljutistel retseptide otsingutel. + <ph name="BREAK" /> + <ph name="BREAK" /> + Saate seadeid kohandada kaardimenüüs või näha rohkem valikuid jaotises Chrome'i kohandamine.</translation> <translation id="6949434160682548041">Parool (valikuline)</translation> <translation id="6950627417367801484">Rakenduste taastamine</translation> <translation id="6952242901357037157">Saate siin kuvada ka oma <ph name="BEGIN_LINK" />Google'i kontol<ph name="END_LINK" /> olevad paroolid</translation> @@ -6347,6 +6357,7 @@ <translation id="7102687220333134671">Automaatsed värskendused on sisse lülitatud</translation> <translation id="7102832101143475489">Taotlus aegus</translation> <translation id="710640343305609397">Ava võrguseaded</translation> +<translation id="7107609441453408294">Esita sama heli kõigist kõlaritest</translation> <translation id="7108338896283013870">Peida</translation> <translation id="7108668606237948702">sisestusklahv</translation> <translation id="7108933416628942903">Lukusta kohe</translation> @@ -6577,6 +6588,7 @@ <translation id="7364745943115323529">Ülekanne ...</translation> <translation id="7364796246159120393">Vali fail</translation> <translation id="7365076891350562061">Ekraani suurus</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" /> – kinnitatud</translation> <translation id="7366316827772164604">Läheduses olevate seadmete otsimine …</translation> <translation id="7366415735885268578">Saidi lisamine</translation> <translation id="7366909168761621528">Sirvimisandmed</translation> @@ -6973,6 +6985,7 @@ <translation id="7737115349420013392">Sidumine seadmega „<ph name="DEVICE_NAME" />” …</translation> <translation id="7737846262459425222">Saate seda alati muuta menüüs Seaded > Google'i assistent > Ekraanikuva kontekst.</translation> <translation id="7737948071472253612">Pole lubatud kasutada teie kaamerat</translation> +<translation id="77381465218432215">Kuva rõhu- ja erimärgid</translation> <translation id="7740996059027112821">Tavapärane</translation> <translation id="7741307896921365578">Lubab brauseri tasemel külgpaneeli, mis pakub kasuliku ja püsiva juurdepääsu teie lugemisloendile ning järjehoidjatele.</translation> <translation id="7742558784808143689">Kas kustutada saidi <ph name="SITE_NAME" />, kõigi selle alamsaitide ning installitud rakenduste andmed ja load?</translation> @@ -7763,6 +7776,7 @@ <translation id="8486666913807228950">Põhjus: vastupidine reegel <ph name="REVERT_RULE" /> leiti loendist „Sundavamine brauseris“.</translation> <translation id="848666842773560761">Rakendus üritab kaamerale juurde pääseda. Juurdepääsu lubamiseks lülitage kaamera privaatsuse lüliti välja.</translation> <translation id="8487678622945914333">Suurenda</translation> +<translation id="8487699605742506766">Kuumkoht</translation> <translation id="8489156414266187072">Personaalsed soovitused kuvatakse ainult teie kontol</translation> <translation id="8490896350101740396">Järgmiseid kioski rakendusi „<ph name="UPDATED_APPS" />” värskendati. Värskendamisprotsessi lõpetamiseks taaskäivitage seade.</translation> <translation id="8492685019009920170">Puudutage oma sõrmega sõrmejäljeandurit. Teie andmed talletatakse turvaliselt ja neid ei edastata seadmest <ph name="DEVICE_TYPE" /> väljapoole.</translation> @@ -8256,6 +8270,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{„<ph name="TAB_TITLE" />”}=1{„<ph name="TAB_TITLE" />” ja veel 1 vaheleht}other{„<ph name="TAB_TITLE" />” ja veel # vahelehte}}</translation> <translation id="8977811652087512276">Sobimatu parool või rikutud fail</translation> <translation id="8978154919215542464">Sees – sünkrooni kõik</translation> +<translation id="8978670037548431647">Värskenda jagamise võimalusi</translation> <translation id="897939795688207351">Saidil <ph name="ORIGIN" /></translation> <translation id="8980345560318123814">Tagasiside aruanded</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> – jooksis kokku</translation> @@ -8520,6 +8535,7 @@ <translation id="935854577147268200">Smart Locki telefoni muudeti. Funktsiooni Smart Lock värskendamiseks sisestage oma parool. Järgmisel korral avab seadme <ph name="DEVICE_TYPE" /> teie telefon. Funktsiooni Smart Lock saab välja lülitada menüüs Seaded.</translation> <translation id="936646668635477464">Kaamera ja mikrofon</translation> <translation id="936801553271523408">Süsteemidiagnostika andmed</translation> +<translation id="937053962468712792">Kas eemaldada seade <ph name="DEVICE" /> kontolt <ph name="PRIMARY_EMAIL" />?</translation> <translation id="93766956588638423">Laiendi parandamine</translation> <translation id="938568644810664664">Proovige küsida „Ok Google, mis laul see on?“ või „Ok Google, mis mu ekraanil on kuvatud?“</translation> <translation id="938623846785894166">Ebatavaline fail</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb index 594350f..b3580a21 100644 --- a/chrome/app/resources/generated_resources_eu.xtb +++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -2194,6 +2194,7 @@ <translation id="3021065318976393105">Kargatzen ari ez denean</translation> <translation id="3021066826692793094">Tximeleta</translation> <translation id="3021678814754966447">&Ikusi markoaren iturburua</translation> +<translation id="3022361196600037287"><ph name="DEVICE" /> Chromebook-etik kenduko da eta ez da gordeko <ph name="PRIMARY_EMAIL" /> kontuan.</translation> <translation id="3022978424994383087">Ez dut ulertu.</translation> <translation id="3023464535986383522">Hautatu ozen irakurtzeko</translation> <translation id="3024374909719388945">Erabili 24 orduko erlojua</translation> @@ -3313,7 +3314,7 @@ <translation id="4114524937989710624">Google Drive-n egindako azken jardueretara erraz itzul zaitezen ari zara ikusten iradokitako fitxategiak. <ph name="BREAK" /> <ph name="BREAK" /> - Ezarpenak kudeatzeko, joan txartelaren menura edo ikusi aukera gehiago "Pertsonalizatu Chrome" atalean.</translation> + Ezarpenak kudeatzeko, joan txartelaren menura edo ikusi aukera gehiago Pertsonalizatu Chrome atalean.</translation> <translation id="4115002065223188701">Sarea ez dago eskuragarri</translation> <translation id="4115378294792113321">Magenta</translation> <translation id="4116704186509653070">Ireki berriro</translation> @@ -3732,6 +3733,7 @@ <translation id="4535127706710932914">Profil lehenetsia</translation> <translation id="4535767533210902251">Teklatuaren goialdean eskuinetara dagoen tekla da hatz-marken sentsorea. Uki ezazu edozein hatzekin leuntasunez.</translation> <translation id="4536140153723794651">Webguneek beti erabil ditzakete cookieak</translation> +<translation id="4536769240747010177">Konexioa partekatzeko aukeraren gaitasunak:</translation> <translation id="4538417792467843292">Ezabatu hitza</translation> <translation id="4538792345715658285">Enpresaren gidalerroen arabera instalatuta.</translation> <translation id="4541123282641193691">Ezin izan da egiaztatu kontua. Saiatu berriro edo berrabiarazi Chromebook-a.</translation> @@ -3759,6 +3761,7 @@ <translation id="4561893854334016293">Ez dago duela gutxi aldatutako baimenik</translation> <translation id="4562155214028662640">Gehitu hatz-marka</translation> <translation id="4563210852471260509">Hasierako idazteko hizkuntza txinera da</translation> +<translation id="4563382028841851106">Kendu kontutik</translation> <translation id="4563880231729913339">3. hatz-marka</translation> <translation id="4564245002465020751">Amaitu telefonoa konfiguratzen</translation> <translation id="4565377596337484307">Ezkutatu pasahitza</translation> @@ -3855,7 +3858,7 @@ <translation id="465406513924180949">Sareko erosketa-saskietan utzitako produktuetara erraz itzul zaitezen ari zara ikusten saskiak. <ph name="BREAK" /> <ph name="BREAK" /> - Ezarpenak kudeatzeko, joan txartelaren menura edo ikusi aukera gehiago "Pertsonalizatu Chrome" atalean.</translation> + Ezarpenak kudeatzeko, joan txartelaren menura edo ikusi aukera gehiago Pertsonalizatu Chrome atalean.</translation> <translation id="4654236001025007561">Partekatu fitxategiak inguruan dituzun Chromebook-ekin eta Android-eko gailuekin</translation> <translation id="4657914796247705218">TrackPoint-aren abiadura</translation> <translation id="4658285806588491142">Mantendu pantaila pribatu</translation> @@ -5326,7 +5329,7 @@ <translation id="6120707837086723438">Bilaketa zerbitzuan errezeten inguruan egindako azken jardueretan oinarrituta ari zara ikusten iradokitako errezetak. <ph name="BREAK" /> <ph name="BREAK" /> - Ezarpenak kudeatzeko, joan txartelaren menura edo ikusi aukera gehiago "Pertsonalizatu Chrome" atalean.</translation> + Ezarpenak kudeatzeko, joan txartelaren menura edo ikusi aukera gehiago Pertsonalizatu Chrome atalean.</translation> <translation id="6121773125605585883">Ikusi <ph name="USERNAME" /> erabiltzailearen <ph name="WEBSITE" /> webguneko pasahitza</translation> <translation id="6122081475643980456">Luzapen bat kontrolatzen ari da Interneteko konexioa</translation> <translation id="6122093587541546701">Helbide elektronikoa (aukerakoa):</translation> @@ -6174,6 +6177,10 @@ <translation id="6943939122536910181"><ph name="DEVICE" /> gailutik deskonektatuta</translation> <translation id="6945221475159498467">Hautatu</translation> <translation id="694592694773692225">Blokeatu egin da birbideratzeko ekintza orri honetan.</translation> +<translation id="6947015141909171112">Bilaketa zerbitzuan errezeten inguruan egindako azken jardueretan oinarrituta ari zara ikusten errezetak. + <ph name="BREAK" /> + <ph name="BREAK" /> + Ezarpenak kudeatzeko, joan txartelaren menura edo ikusi aukera gehiago Pertsonalizatu Chrome atalean.</translation> <translation id="6949434160682548041">Pasahitza (aukerakoa)</translation> <translation id="6950627417367801484">Leheneratu aplikazioak</translation> <translation id="6952242901357037157"><ph name="BEGIN_LINK" />Google-ko kontuko<ph name="END_LINK" /> pasahitzak ere erakuts ditzakezu hemen</translation> @@ -6969,6 +6976,7 @@ <translation id="7737115349420013392">"<ph name="DEVICE_NAME" />" gailuarekin parekatzen…</translation> <translation id="7737846262459425222">Aukera hori aldatzeko, joan Ezarpenak > Google-ren Laguntzailea > Pantailaren testuingurua atalera.</translation> <translation id="7737948071472253612">Ezin dute erabili kamera</translation> +<translation id="77381465218432215">Erakutsi azentu-markak eta karaktere bereziak</translation> <translation id="7740996059027112821">Estandarra</translation> <translation id="7741307896921365578">Alboko panel bat gaitzen du arakatzailean, irakurketa-zerrenda eta laster-markak eskura izan ditzazun beti.</translation> <translation id="7742558784808143689"><ph name="SITE_NAME" /> webguneko, haren mende dauden webgune guztietako eta harekin erlazionatuta instalatu dituzun aplikazioetako datuak eta baimenak garbitu nahi dituzu?</translation> @@ -6982,7 +6990,7 @@ <translation id="7746739418892731373">Google Argazkiak zerbitzu liburutegiko argazki eta bideo nabarmenak ari zara ikusten. Eduki nabarmentzat jotzen dena kontrolatzeko, joan <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" /> helbidera. <ph name="BREAK" /> <ph name="BREAK" /> - Txartel honen ezarpenak kudeatzeko, joan txartelaren menura edo ikusi aukera gehiago "Pertsonalizatu Chrome" atalean.</translation> + Txartel honen ezarpenak kudeatzeko, joan txartelaren menura edo ikusi aukera gehiago Pertsonalizatu Chrome atalean.</translation> <translation id="7750228210027921155">Pantaila txiki gainjarria</translation> <translation id="7751260505918304024">Erakutsi guztiak</translation> <translation id="7751619076382363711">Ez duzu kendu webgunerik</translation> @@ -7757,6 +7765,7 @@ <translation id="8486666913807228950">Arrazoia: <ph name="REVERT_RULE" /> alderantzizko araua "Behartu hemen irekitzera:" zerrendan aurkitu da.</translation> <translation id="848666842773560761">Aplikazio bat kamera atzitu nahian dabil. Baimena emateko, desaktibatu kameraren pribatutasun-etengailua.</translation> <translation id="8487678622945914333">Handitu</translation> +<translation id="8487699605742506766">Wifi-gunea</translation> <translation id="8489156414266187072">Iradokizun pertsonalak zure kontuan soilik agertzen dira</translation> <translation id="8490896350101740396">"<ph name="UPDATED_APPS" />" kiosko-aplikazioak eguneratu egin dira. Berrabiarazi gailua eguneratze-prozesua osatzeko.</translation> <translation id="8492685019009920170">Ukitu hatz-marken sentsorea hatzarekin. Zure datuak modu seguruan gordeko dira eta ez dira inoiz aterako <ph name="DEVICE_TYPE" /> gailutik.</translation> @@ -8250,6 +8259,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" eta beste fitxa bat}other{"<ph name="TAB_TITLE" />" eta beste # fitxa}}</translation> <translation id="8977811652087512276">Pasahitza okerra da edo fitxategia hondatuta dago</translation> <translation id="8978154919215542464">Aktibatuta: sinkronizatu guztia</translation> +<translation id="8978670037548431647">Freskatu konexioa partekatzeko aukeraren gaitasunak</translation> <translation id="897939795688207351"><ph name="ORIGIN" /> webgunean</translation> <translation id="8980345560318123814">Oharren txostenak</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> - Huts eginda</translation> @@ -8514,6 +8524,7 @@ <translation id="935854577147268200">Aldatu da Smart Lock telefonoa. Smart Lock eguneratzeko, idatzi pasahitza. Hurrengoan, telefonoak desblokeatuko du <ph name="DEVICE_TYPE" /> gailua. Smart Lock desaktibatzeko, joan ezarpenetara.</translation> <translation id="936646668635477464">Kamera eta mikrofonoa</translation> <translation id="936801553271523408">Sistemaren diagnostikoaren datuak</translation> +<translation id="937053962468712792"><ph name="DEVICE" /> <ph name="PRIMARY_EMAIL" /> kontutik kendu nahi duzu?</translation> <translation id="93766956588638423">Konpondu luzapena</translation> <translation id="938568644810664664">Galdetu "Hey Google, zer abesti da hau?" edo "Hey Google, zer dago pantailan?"</translation> <translation id="938623846785894166">Ezohiko fitxategia</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index d1d4bc1..19ba2f9 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -2206,6 +2206,7 @@ <translation id="3021065318976393105">هنگام استفاده از باتری</translation> <translation id="3021066826692793094">پروانه</translation> <translation id="3021678814754966447">&نمای منبع قاب</translation> +<translation id="3022361196600037287"><ph name="DEVICE" /> از این Chromebook برداشته خواهد شد و در <ph name="PRIMARY_EMAIL" /> ذخیره نخواهد شد.</translation> <translation id="3022978424994383087">متوجه نشدم.</translation> <translation id="3023464535986383522">انتخاب برای شنیدن</translation> <translation id="3024374909719388945">استفاده از ساعت ۲۴ ساعته</translation> @@ -3745,6 +3746,7 @@ <translation id="4535127706710932914">نمایه پیشفرض</translation> <translation id="4535767533210902251">حسگر اثر انگشت، بالاترین کلید سمت چپ در صفحهکلید است. با یکی از انگشتهایتان آن را بهآرامی لمس کنید.</translation> <translation id="4536140153723794651">سایتهایی که همیشه میتوانند از کوکیها استفاده کنند</translation> +<translation id="4536769240747010177">قابلیتهای اشتراکگذاری اینترنت:</translation> <translation id="4538417792467843292">حذف کلمه</translation> <translation id="4538792345715658285">نصب شده توسط خطمشی سازمانی.</translation> <translation id="4541123282641193691">حسابتان تأیید نشد. لطفاً دوباره امتحان کنید یا Chromebook خود را بازراهاندازی کنید.</translation> @@ -3772,8 +3774,9 @@ <translation id="4561893854334016293">هیچ اجازهای را اخیراً تغییر ندادهاید</translation> <translation id="4562155214028662640">افزودن اثر انگشت</translation> <translation id="4563210852471260509">زبان ورودی اولیه چینی است</translation> +<translation id="4563382028841851106">برداشتن از حساب</translation> <translation id="4563880231729913339">انگشت ۳</translation> -<translation id="4564245002465020751">درحال تکمیل راهاندازی تلفن</translation> +<translation id="4564245002465020751">راهاندازی را در تلفن کامل کنید</translation> <translation id="4565377596337484307">عدم نمایش گذرواژه</translation> <translation id="4565917129334815774">ذخیره گزارشهای سیستم</translation> <translation id="4566170377336116390">اگر بعداز ثبتنام تصمیمتان عوض شد، باید دستگاه را بازنشانی کارخانهای (Powerwash) کنید.</translation> @@ -4048,7 +4051,7 @@ <translation id="4837165100461973682">مجدد بار کردن صفحه برای اعمال تغییرات</translation> <translation id="4837926214103741331">مجاز به استفاده از این دستگاه نیستید. لطفاً برای دریافت اجازه ورود به سیستم با مالک دستگاه تماس بگیرید.</translation> <translation id="4837952862063191349">برای باز کردن قفل و بازیابی دادههای محلیتان، لطفاً گذرواژه <ph name="DEVICE_TYPE" /> قدیمیتان را وارد کنید.</translation> -<translation id="4838170306476614339">مشاهده عکسها، رسانه، و اعلانهای تلفن</translation> +<translation id="4838170306476614339">مشاهده کردن عکسها، رسانه، و اعلانهای تلفن شما</translation> <translation id="4838836835474292213">دسترسی برای خواندن محتوای بریدهدان مجاز شد</translation> <translation id="4838907349371614303">گذرواژه بهروزرسانی شد</translation> <translation id="4839303808932127586">ذ&خیره فایل ویدیوی بهعنوان...</translation> @@ -4166,7 +4169,7 @@ <translation id="4941074198479265146">سایتها معمولاً برای ارائه ویژگیهای مربوط به ایجاد و ویرایش موسیقی به دستگاههای MIDI متصل میشوند</translation> <translation id="4941246025622441835">هنگام ثبتنام دستگاه برای مدیریت سازمانی، از این درخواست دستگاه استفاده کنید:</translation> <translation id="4941627891654116707">اندازه قلم</translation> -<translation id="4941963255146903244">مشاهده عکسها، رسانه، و برنامههای تلفن</translation> +<translation id="4941963255146903244">مشاهده کردن عکسها، رسانه، و برنامههای تلفن شما</translation> <translation id="494286511941020793">راهنمای پیکربندی پراکسی</translation> <translation id="4943368462779413526">فوتبال</translation> <translation id="4943691134276646401">«<ph name="CHROME_EXTENSION_NAME" />» میخواهد به یک درگاه سریالی متصل شود</translation> @@ -5690,7 +5693,7 @@ <translation id="6466258437571594570">سایتها مسدود شدهاند تا هنگام درخواست برای ارسال اعلان مزاحم شما نشوند</translation> <translation id="6466988389784393586">&باز کردن همه نشانکها</translation> <translation id="6467304607960172345">بهینهسازی ویدیوهای تمامصفحه</translation> -<translation id="6467377768028664108"><ph name="DEVICE_TYPE" /> شما سپس میتواند:</translation> +<translation id="6467377768028664108"><ph name="DEVICE_TYPE" /> شما سپس میتواند این کارها را بکند:</translation> <translation id="6468485451923838994">قلمها</translation> <translation id="6468773105221177474"><ph name="FILE_COUNT" /> فایل</translation> <translation id="6469557521904094793">روشن کردن شبکه تلفن همراه</translation> @@ -6059,7 +6062,7 @@ <translation id="6815376457351236663">درهرصورت باز شود</translation> <translation id="6817174620439930047">اگر سایتی میخواهد از پیامهای انحصاری سیستم برای دسترسی به دستگاههای MIDI استفاده کند سؤال شود (توصیه میشود)</translation> <translation id="6818198425579322765">زبان صفحه موردنظر برای ترجمه</translation> -<translation id="6818547713623251698">مشاهده عکسها، رسانه، اعلانها، و برنامههای تلفن</translation> +<translation id="6818547713623251698">مشاهده کردن عکسها، رسانه، اعلانها، و برنامههای تلفن شما</translation> <translation id="6818802132960437751">مجهز به محافظ دربرابر ویروس</translation> <translation id="6818920801736417483">گذرواژهها ذخیره شود؟</translation> <translation id="6823174134746916417">کلیک با یک ضربه روی صفحه لمسی</translation> @@ -6192,6 +6195,10 @@ <translation id="6943939122536910181">اتصال <ph name="DEVICE" /> قطع شد</translation> <translation id="6945221475159498467">انتخاب</translation> <translation id="694592694773692225">در این صفحه، هدایت کردن مسدود شده است.</translation> +<translation id="6947015141909171112">درحال دیدن دستورهای پختی هستید که براساس فعالیت اخیر مرتبط با دستورهای پخت در «جستجو» گردآوری شده است. + <ph name="BREAK" /> + <ph name="BREAK" /> + از منوی کارت میتوانید تنظیمات را مدیریت کنید یا در «سفارشی کردن Chrome» گزینههای بیشتری را ببینید.</translation> <translation id="6949434160682548041">گذرواژه (اختیاری)</translation> <translation id="6950627417367801484">بازیابی برنامهها</translation> <translation id="6952242901357037157">بهعلاوه میتوانید گذرواژههای ذخیرهشده در <ph name="BEGIN_LINK" />حساب Google<ph name="END_LINK" /> خود را در اینجا نمایش دهید</translation> @@ -6978,7 +6985,7 @@ <translation id="7721258531237831532">سازمانتان به نمایه نیاز دارد</translation> <translation id="7722040605881499779">فضای لازم برای بهروزرسانی: <ph name="NECESSARY_SPACE" /></translation> <translation id="7724603315864178912">برش</translation> -<translation id="7726391492136714301">مشاهده اعلانها و برنامههای تلفن</translation> +<translation id="7726391492136714301">مشاهده کردن اعلانها و برنامههای تلفن شما</translation> <translation id="7728465250249629478">تغییر زبان دستگاه</translation> <translation id="7728570244950051353">صفحه قفل از حالت خواب</translation> <translation id="7728668285692163452">تغییر کانال بعداً اعمال خواهد شد</translation> @@ -6987,6 +6994,7 @@ <translation id="7737115349420013392">درحال مرتبطسازی با «<ph name="DEVICE_NAME" />» …</translation> <translation id="7737846262459425222">هر زمان خواستید میتوانید این گزینه را در «تنظیمات > دستیار Google > اطلاعات روی صفحه» تغییر دهید.</translation> <translation id="7737948071472253612">اجازه ندارد از دوربین استفاده کند</translation> +<translation id="77381465218432215">نمایش نشانههای تکیه (اِعراب) و نویسههای خاص</translation> <translation id="7740996059027112821">استاندارد</translation> <translation id="7741307896921365578">پانل کناری را در مرورگر فعال میکند تا دسترسی مفید و پایداری به «فهرست خواندن» و «نشانکها» داشته باشید.</translation> <translation id="7742558784808143689">دادهها و اجازههای سایت <ph name="SITE_NAME" />، همه سایتهای تحت آن، و برنامههای نصبشده پاک شود؟</translation> @@ -7314,7 +7322,7 @@ <translation id="8037357227543935929">درخواست (پیشفرض)</translation> <translation id="803771048473350947">فایل</translation> <translation id="8041089156583427627">ارسال بازخورد</translation> -<translation id="8041267120753677077">جاریسازی برنامههای تلفن</translation> +<translation id="8041267120753677077">جاریسازی برنامههای تلفن شما</translation> <translation id="8042142357103597104">ماتی نوشتار</translation> <translation id="8042331986490021244">گذرواژههایتان قبلاز ذخیره شدن در «مدیر گذرواژه Google» در دستگاهتان رمزگذاری میشوند</translation> <translation id="8044262338717486897"><ph name="LINUX_APP_NAME" /> پاسخ نمیدهد</translation> @@ -7776,6 +7784,7 @@ <translation id="8486666913807228950">دلیل: قانون معکوس <ph name="REVERT_RULE" /> در فهرست «باز کردن اجباری در» پیدا شد.</translation> <translation id="848666842773560761">برنامهای میخواهد به دوربین دسترسی داشته باشد. برای مجاز کردن دسترسی، کلید «حریم خصوصی دوربین» را خاموش کنید.</translation> <translation id="8487678622945914333">بزرگنمایی</translation> +<translation id="8487699605742506766">نقطه اتصال</translation> <translation id="8489156414266187072">پیشنهادهای شخصی فقط در حساب شما نمایش داده میشوند</translation> <translation id="8490896350101740396">برنامههای کیوسک زیر «<ph name="UPDATED_APPS" />» بهروز شدهاند. لطفاً برای تکمیل فرآیند بهروزرسانی دستگاه را مجدداً راهاندازی کنید.</translation> <translation id="8492685019009920170">حسگر اثر انگشت را با انگشتانتان لمس کنید. دادههایتان بهصورت ایمن ذخیره شده است و هرگز از <ph name="DEVICE_TYPE" /> شما خارج نمیشود.</translation> @@ -8270,6 +8279,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{«<ph name="TAB_TITLE" />»}=1{«<ph name="TAB_TITLE" />» و ۱ برگه دیگر}one{«<ph name="TAB_TITLE" />» و # برگه دیگر}other{«<ph name="TAB_TITLE" />» و # برگه دیگر}}</translation> <translation id="8977811652087512276">گذرواژه نادرست یا فایل خراب است</translation> <translation id="8978154919215542464">On (روشن) - همگامسازی همهچیز</translation> +<translation id="8978670037548431647">بازآوری قابلیتهای اشتراکگذاری اینترنت</translation> <translation id="897939795688207351">روشن <ph name="ORIGIN" /></translation> <translation id="8980345560318123814">گزارشهای بازخورد</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> - خراب شد</translation> @@ -8534,6 +8544,7 @@ <translation id="935854577147268200">تلفن Smart Lock تغییر کرد. برای بهروزرسانی Smart Lock، گذرواژهتان را وارد کنید. دفعه بعد، تلفنتان قفل <ph name="DEVICE_TYPE" /> را باز میکند. میتوانید Smart Lock را در «تنظیمات» خاموش کنید.</translation> <translation id="936646668635477464">دوربین و میکروفون</translation> <translation id="936801553271523408">دادههای تشخیص خطای سیستم</translation> +<translation id="937053962468712792"><ph name="DEVICE" /> از <ph name="PRIMARY_EMAIL" /> برداشته شود؟</translation> <translation id="93766956588638423">تعمیر افزونه</translation> <translation id="938568644810664664">بگویید «Ok Google, what song is this?» (Ok Google، نام این آهنگ چیست؟) یا «Ok Google, what's on my screen?» (Ok Google، چه چیزی روی صفحه من است؟)</translation> <translation id="938623846785894166">فایل غیرعادی</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index 02632b5f..6669ed0 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -907,6 +907,7 @@ <translation id="1829129547161959350">Penguin</translation> <translation id="1829192082282182671">Mag-zoom &Out</translation> <translation id="1830550083491357902">Hindi naka-sign in</translation> +<translation id="1831848493690504725">Hindi namin maabot ang Google sa pamamagitan ng nakakonektang network. Subukang pumili ng ibang network o tingnan ang iyong mga setting ng network o setting ng proxy (kung gumagamit ka ng proxy).</translation> <translation id="1832459821645506983">Oo, payag ako</translation> <translation id="1832511806131704864">Na-update na ang pagbabago sa telepono</translation> <translation id="1832848789136765277">Para matiyak na maa-access mo anumang oras ang iyong naka-sync na data, i-verify na ikaw ito</translation> @@ -4754,6 +4755,7 @@ <translation id="5533001281916885985">Gusto ng <ph name="SITE_NAME" /> na</translation> <translation id="5534304873398226603">I-discard ang larawan o video</translation> <translation id="5537725057119320332">I-cast</translation> +<translation id="5539070192556911367">Hindi maabot ang Google</translation> <translation id="5539221284352502426">Tinanggihan ng server ang password na inilagay mo. Kabilang sa mga posibleng dahilan: Masyadong maikli ang password. Dapat may mga numero o simbolo ang password. Dapat naiiba ang password sa mga nakaraang password.</translation> <translation id="5541694225089836610">Na-disable ng iyong administrator ang pagkilos na ito</translation> <translation id="5542132724887566711">Profile</translation> @@ -4817,6 +4819,7 @@ <translation id="5585912436068747822">Nabigo ang pag-format</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Nilo-load ang mga app...</translation> +<translation id="5590418976913374224">I-play ang tunog sa pagsisimula ng device</translation> <translation id="5592595402373377407">Wala pang available na sapat na data.</translation> <translation id="5595307023264033512">Kabuuang storage na ginagamit ng mga site: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">Mag-edit ng address</translation> @@ -6367,6 +6370,7 @@ <translation id="7102687220333134671">Naka-on ang mga awtomatikong update</translation> <translation id="7102832101143475489">Nag-time out ang kahilingan</translation> <translation id="710640343305609397">Buksan ang mga network setting</translation> +<translation id="7107609441453408294">I-play ang iisang audio sa lahat ng speaker</translation> <translation id="7108338896283013870">Itago</translation> <translation id="7108668606237948702">enter</translation> <translation id="7108933416628942903">I-lock ngayon</translation> @@ -6597,6 +6601,7 @@ <translation id="7364745943115323529">I-cast...</translation> <translation id="7364796246159120393">Pumili ng File</translation> <translation id="7365076891350562061">Laki ng monitor</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" /> - Naka-pin</translation> <translation id="7366316827772164604">Nagsa-scan ng mga kalapit na device...</translation> <translation id="7366415735885268578">Magdagdag ng site</translation> <translation id="7366909168761621528">Data sa pag-browse</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb index 31fee88..5d288ad 100644 --- a/chrome/app/resources/generated_resources_fr-CA.xtb +++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Utiliser votre microphone et votre caméra</translation> <translation id="1005333234656240382">Activer le débogage PDA?</translation> <translation id="1006873397406093306">Cette extension peut lire et modifier vos données sur des sites. Vous pouvez contrôler à quels sites l'extension peut accéder.</translation> +<translation id="1007057452468855774">Activer Google Play Store</translation> <translation id="1008186147501209563">Exporter les favoris</translation> <translation id="1008557486741366299">Pas maintenant</translation> <translation id="1009476156254802388">Emplacement <ph name="WEB_DRIVE" /></translation> <translation id="1009663062402466586">Commandes de jeu maintenant accessibles</translation> <translation id="1010498023906173788">Cet onglet est connecté à un port série.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{La page ne répond pas}one{La page ne répond pas}other{Les pages ne répondent pas}}</translation> +<translation id="1011003645819296594">Appareils enregistrés</translation> <translation id="1011355516189274711">Volume de la synthèse vocale</translation> <translation id="1012794136286421601">Vos fichiers Documents, Feuilles de calcul, Présentations et Dessins sont en cours de synchronisation. Ouvrez l'application Google Disque pour y accéder en ligne ou hors ligne.</translation> <translation id="1012876632442809908">Appareil USB-C (port avant)</translation> @@ -492,6 +494,7 @@ <translation id="1470350905258700113">Utiliser cet appareil</translation> <translation id="1470946456740188591">Pour activer ou désactiver la navigation au clavier, utilisez le raccourci Ctrl+Recherche+7</translation> <translation id="1472675084647422956">Plus</translation> +<translation id="1473223074251193484">Définir la configuration du partage de connexion</translation> <translation id="1474785664565228650">Pour que la modification apportée au microphone soit appliquée, Parallels Desktop doit être relancé. Relancez Parallels Desktop pour continuer.</translation> <translation id="1474893630593443211">Plus de contrôle sur les annonces que vous voyez</translation> <translation id="1475502736924165259">Vous disposez de certificats qui n'appartiennent à aucune autre catégorie</translation> @@ -1114,6 +1117,7 @@ <translation id="2044014337866019681">Assurez-vous de vérifier <ph name="ACCOUNT" /> pour déverrouiller la session.</translation> <translation id="204497730941176055">Nom du modèle de certificat Microsoft</translation> <translation id="2045117674524495717">Aide des raccourcis-clavier</translation> +<translation id="2045211794962848221">Vous ne verrez plus ce message</translation> <translation id="2045969484888636535">Continuer à bloquer les témoins</translation> <translation id="204622017488417136">Votre appareil reviendra à la version précédemment installée de Chrome. La totalité des comptes d'utilisateur et des données locales sera supprimée. Cette opération est définitive.</translation> <translation id="2046702855113914483">Nouille ramen</translation> @@ -3797,6 +3801,7 @@ <translation id="4594577641390224176">Vous recherchez la page à propos du système? Consultez</translation> <translation id="4595560905247879544">Les applications et les extensions ne peuvent être modifiées que par le gestionnaire (<ph name="CUSTODIAN_NAME" />).</translation> <translation id="4596295440756783523">Vous disposez de certificats qui identifient ces serveurs</translation> +<translation id="4598345735110653698">Gérer les mots de passe</translation> <translation id="4598556348158889687">Gestion du stockage</translation> <translation id="4598776695426288251">Connexion Wi-Fi possible à partir de plusieurs appareils</translation> <translation id="4601426376352205922">Marquer comme non lu</translation> @@ -4022,6 +4027,7 @@ <translation id="4823894915586516138">Ce NIP ou ce mot de passe protège vos données sur ce <ph name="DEVICE_TYPE" />, y compris toutes celles auxquelles vous accédez à partir de votre téléphone</translation> <translation id="4824037980212326045">Sauvegarder et restaurer le contenu Linux</translation> <translation id="4824958205181053313">Annuler la synchronisation?</translation> +<translation id="4825532258163983651">Impossible de supprimer le mot de passe</translation> <translation id="4827675678516992122">Impossible de se connecter</translation> <translation id="4827784381479890589">Correcteur orthographique amélioré dans le navigateur Chrome (le texte est envoyé à Google pour vous proposer des suggestions d'orthographe)</translation> <translation id="4827904420700932487">Créer un code QR pour cette image</translation> @@ -4284,6 +4290,7 @@ <translation id="5087249366037322692">Ajoutée par un tiers</translation> <translation id="5087580092889165836">Ajouter une carte</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 avec chiffrement RSA</translation> +<translation id="5089763948477033443">Poignée de redimensionnement du panneau latéral</translation> <translation id="5090637338841444533">Non autorisés à suivre la position de votre caméra</translation> <translation id="5093569275467863761">Sous-cadre de navigation privée de la mise en cache complète bidirectionnelle : <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">Vous pouvez ouvrir et modifier les fichiers pris en charge avec cette application à partir de l'application Fichiers ou d'autres applications. Pour contrôler quels fichiers ouvrent cette application par défaut, <ph name="BEGIN_LINK" />découvrez comment définir des applications par défaut sur votre appareil<ph name="END_LINK" />.</translation> @@ -4449,6 +4456,7 @@ <translation id="5258992782919386492">Installer sur cet appareil</translation> <translation id="5260334392110301220">Guillemets intelligents</translation> <translation id="5260508466980570042">Adresse de courriel ou mot de passe incorrect. Veuillez réessayer.</translation> +<translation id="5260958083445173099">Les sites Web afficheront du contenu dans vos langues préférées lorsque cela est possible.</translation> <translation id="5261683757250193089">Ouvrir dans la boutique en ligne Chrome Web Store</translation> <translation id="5262178194499261222">Supprimer le mot de passe</translation> <translation id="5262784498883614021">Se connecter automatiquement à un réseau</translation> @@ -4489,6 +4497,7 @@ <translation id="5294097441441645251">Doit commencer par un caractère minuscule ou un tiret de soulignement</translation> <translation id="5294618183559481278">Votre <ph name="DEVICE_TYPE" /> utilise un capteur intégré pour détecter les personnes devant votre appareil. Toutes les données sont traitées sur votre appareil immédiatement, puis supprimées. Les données des capteurs ne sont jamais envoyées à Google. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Écoutez la rétroaction vocale afin de pouvoir utiliser votre appareil sans regarder l'écran. Vous pouvez utiliser la rétroaction en braille avec les appareils connectés.</translation> +<translation id="5297005732522718715">Actualiser la configuration du partage de connexion</translation> <translation id="5297082477358294722">Mot de passe enregistré. Affichez et gérez les mots de passe enregistrés dans votre <ph name="SAVED_PASSWORDS_STORE" />.</translation> <translation id="5297946558563358707">Lorsque quelqu'un d'autre regarde votre écran, afficher l'icône de confidentialité (œil) en bas à droite de celui-ci</translation> <translation id="5298219193514155779">Thème créé par</translation> @@ -4659,6 +4668,7 @@ <translation id="5466374726908360271">Coller et rechercher « <ph name="SEARCH_TERMS" /> »</translation> <translation id="5467207440419968613">Autorisations bloquées : <ph name="PERMISSION_1" /> et <ph name="PERMISSION_2" /></translation> <translation id="5468173180030470402">Recherche de partages de fichiers en cours…</translation> +<translation id="5468330507528805311">État du partage de connexion :</translation> <translation id="5468881191994555667">Sélectionner un fichier</translation> <translation id="5469852975082458401">Vous pouvez parcourir les pages à l'aide d'un curseur de texte. Appuyez sur F7 pour désactiver ce mode.</translation> <translation id="5470735824776589490">Vous devez redémarrer votre appareil avant de pouvoir faire une réinitialisation Powerwash. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> @@ -4935,6 +4945,7 @@ <translation id="5734362860645681824">Communications</translation> <translation id="5734697361979786483">Ajouter un partage de fichier</translation> <translation id="5736796278325406685">Veuillez entrer un nom d'utilisateur valide</translation> +<translation id="5738093759615225354">Vous avez besoin de ce mot de passe pour vous connecter à votre ordinateur</translation> <translation id="5739017626473506901">Connectez-vous pour aider <ph name="USER_NAME" /> à ajouter un compte scolaire</translation> <translation id="5739235828260127894">En attente de vérification. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Très grand</translation> @@ -5096,6 +5107,7 @@ <translation id="589541317545606110">Rechercher la page avec <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">Ne pas autoriser</translation> <translation id="5900186025777217044">Smart Lock a changé</translation> +<translation id="5900243355162006650">Configuration du partage de connexion :</translation> <translation id="5900302528761731119">Photo du profil Google</translation> <translation id="590036993063074298">Renseignements sur la qualité de la duplication d'écran</translation> <translation id="5901069264981746702">Les données liées à votre empreinte digitale sont stockées de façon sécurisée et ne quittent jamais votre <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> @@ -5399,6 +5411,7 @@ <translation id="6196640612572343990">Bloquer les témoins de tiers</translation> <translation id="6196854373336333322">L'extension « <ph name="EXTENSION_NAME" /> » a pris le contrôle de vos paramètres de mandataire, ce qui signifie qu'elle peut modifier ou espionner tout ce que vous faites en ligne. Si vous ne savez pas pourquoi ce changement s'est produit, vous ne voulez probablement pas l'accepter.</translation> <translation id="6197128521826316819">Créer un code QR pour cette page</translation> +<translation id="6197223946499512637">Ces mots de passe sont stockés dans Windows Hello sur cet ordinateur. Ils ne sont pas enregistrés dans votre compte Google.</translation> <translation id="6198252989419008588">Modifier le NIP</translation> <translation id="6200047250927636406">Supprimer le fichier</translation> <translation id="6200151268994853226">Gérer l'extension</translation> @@ -5696,6 +5709,7 @@ <translation id="6482559668224714696">Loupe en mode plein écran</translation> <translation id="6483485061007832714">Ouvrir le téléchargement</translation> <translation id="6483805311199035658">Ouverture de <ph name="FILE" /> en cours...</translation> +<translation id="6486301003991593638">Pour gérer les mots de passe, utilisez une version plus récente de Windows</translation> <translation id="6488384360522318064">Sélectionner la langue</translation> <translation id="648927581764831596">Aucun</translation> <translation id="6490471652906364588">Appareil USB-C (port de droite)</translation> @@ -6280,6 +6294,7 @@ <translation id="7029307918966275733">Crostini n'est pas installé. Veuillez installer Crostini pour voir le générique.</translation> <translation id="7029809446516969842">Mots de passe</translation> <translation id="7030304022046916278">Il envoie des URL à la navigation sécurisée pour les vérifier</translation> +<translation id="7030695672997239647">Faites un clic droit sur un onglet et sélectionnez « Ajouter un onglet au groupe », puis « Nouveau groupe »</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> : connecté à un port série</translation> <translation id="7033616203784997570">L'entrée doit comporter au maximum 62 caractères</translation> <translation id="7034692021407794547">Un administrateur possédant les privilèges Gestion de la facturation doit d'abord accepter les conditions d'utilisation des accessoires Google Meet, dans la section Accessoires Google Meet de la console d'administrateur.</translation> @@ -7380,6 +7395,7 @@ <translation id="8101987792947961127">Réinitialisation « Powerwash » nécessaire au prochain démarrage</translation> <translation id="81020759409809034">Emplacement local</translation> <translation id="8102139037507939978">Supprimer les renseignements personnels du fichier system_logs.txt.</translation> +<translation id="810362914482827094">Rechercher des mots de passe</translation> <translation id="8104088837833760645">Télécharger un profil eSIM</translation> <translation id="8105368624971345109">Désactiver</translation> <translation id="8107015733319732394">Installation du Google Play Store sur votre <ph name="DEVICE_TYPE" /> en cours… Cela peut prendre quelques minutes.</translation> @@ -7826,6 +7842,7 @@ <translation id="8557022314818157177">Continuez à toucher votre clé de sécurité jusqu'à ce que votre empreinte digitale soit capturée</translation> <translation id="8557180006508471423">Activer « Google Chrome » dans les services de localisation sur votre Mac</translation> <translation id="8557856025359704738">Le prochain téléchargement est prévu à <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">Mots de passe</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Tout ouvrir dans une &nouvelle fenêtre}=1{Ouvrir dans une &nouvelle fenêtre}one{Tout ouvrir ({COUNT}) dans une &nouvelle fenêtre}other{Tout ouvrir ({COUNT}) dans une &nouvelle fenêtre}}</translation> <translation id="8561206103590473338">Éléphant</translation> <translation id="8561565784790166472">Soyez prudent</translation> @@ -7952,6 +7969,7 @@ <translation id="8677212948402625567">Tout réduire…</translation> <translation id="867767487203716855">Prochaine mise à jour</translation> <translation id="8677859815076891398">Aucun album. Créez un album dans <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />.</translation> +<translation id="8678378565142776698">Redémarrer et recevoir des mises à jour automatiques</translation> <translation id="8678538439778360739">Des données ont été chiffrées à l'aide de votre phrase de passe de synchronisation le <ph name="TIME" />. Cette méthode ne couvre pas les modes de paiement ni les adresses de Google Pay.</translation> <translation id="8678582529642151449">Les onglets ne sont pas réduits</translation> <translation id="8678933587484842200">Comment souhaitez-vous lancer cette application?</translation> @@ -8199,6 +8217,7 @@ <translation id="8910987510378294980">Masquer la liste des appareils</translation> <translation id="8912362522468806198">Compte Google</translation> <translation id="8912810933860534797">Activer l'analyse automatique</translation> +<translation id="8915307125957890427">Faites un clic droit sur un onglet et sélectionnez « Ajouter un onglet au groupe », puis « Nouveau groupe »</translation> <translation id="8915370057835397490">Chargement des suggestions en cours…</translation> <translation id="8916476537757519021">Sous-cadre de navigation privée : <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> de <ph name="GIVEN_NAME" /></translation> @@ -8272,6 +8291,7 @@ <translation id="8986362086234534611">Supprimer</translation> <translation id="8986494364107987395">Envoyer automatiquement les statistiques d'utilisation et les rapports d'erreur à Google</translation> <translation id="8987927404178983737">Mois</translation> +<translation id="8989359959810288806">Actualiser l'état du partage de connexion</translation> <translation id="8991520179165052608">Le site peut utiliser votre microphone</translation> <translation id="899384117894244799">Supprimer le profil d'utilisateur restreint</translation> <translation id="899403249577094719">URL de base du certificat Netscape</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 231ac04d..bd27aa78 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -892,6 +892,7 @@ <translation id="1829129547161959350">પેન્ગ્વિન</translation> <translation id="1829192082282182671">Zoom &Out</translation> <translation id="1830550083491357902">સાઇન ઇન નથી</translation> +<translation id="1831848493690504725">કનેક્ટેડ નેટવર્ક મારફતે અમારાથી Googleનો સંપર્ક કરી શકાતો નથી. કોઈ અલગ નેટવર્ક પસંદ કરી જુઓ અથવા તમારા નેટવર્ક સેટિંગ કે પ્રૉક્સી સેટિંગ ચેક કરી જુઓ (જો તમે કોઈ પ્રૉક્સીનો ઉપયોગ કરતા હોય, તો).</translation> <translation id="1832459821645506983">હા, સંમત છું</translation> <translation id="1832511806131704864">ફોન ફેરફાર અપડેટ કર્યો</translation> <translation id="1832848789136765277">તમે તમારો સિંક કરેલો ડેટા ગમે ત્યારે ઍક્સેસ કરી શકો છો, એની ખાતરી કરવા માટે, આ તમે જ છો તેની ચકાસણી કરો</translation> @@ -4735,6 +4736,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" />ને આ પરવાનગીની જરૂર છે</translation> <translation id="5534304873398226603">ફોટો અથવા વીડિયો કાઢી નાખો</translation> <translation id="5537725057119320332">કાસ્ટ કરો</translation> +<translation id="5539070192556911367">Googleનો સંપર્ક કરી શકાતો નથી</translation> <translation id="5539221284352502426">તમે દાખલ કરેલો પાસવર્ડ સર્વર દ્વારા નકારવામાં આવ્યો હતો. આ શક્ય કારણો હોઈ શકે છે: પાસવર્ડ ખૂબ ટૂંકો છે. પાસવર્ડમાં સંખ્યાઓ અથવા પ્રતીકોનો સમાવેશ થવો જ જોઈએ. પાસવર્ડ પહેલાંના પાસવર્ડ કરતાં જુદો હોવો જોઈએ.</translation> <translation id="5541694225089836610">તમારા વ્યવસ્થાપકે ક્રિયા બંધ કરી છે</translation> <translation id="5542132724887566711">પ્રોફાઇલ</translation> @@ -4798,6 +4800,7 @@ <translation id="5585912436068747822">ફોર્મેટિંગ નિષ્ફળ થયું</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">ઍપ્લિકેશનો લોડ કરી રહ્યું છે...</translation> +<translation id="5590418976913374224">ડિવાઇસ શરૂ થવા પર સાઉન્ડ વગાડો</translation> <translation id="5592595402373377407">હજુ સુધી પર્યાપ્ત ડેટા ઉપલબ્ધ નથી.</translation> <translation id="5595307023264033512">સાઇટ દ્વારા કરવામાં આવેલો સ્ટોરેજનો કુલ વપરાશ: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">ઍડ્રેસમાં ફેરફાર કરો</translation> @@ -6350,6 +6353,7 @@ <translation id="7102687220333134671">સ્વચલિત અપડેટ ચાલુ કરેલ છે</translation> <translation id="7102832101143475489">વિનંતીનો સમય સમાપ્ત થઈ ગયો</translation> <translation id="710640343305609397">નેટવર્ક સેટિંગ ખોલો</translation> +<translation id="7107609441453408294">બધા સ્પીકરમાંથી એક જ ઑડિયો વગાડો</translation> <translation id="7108338896283013870">છુપાવો</translation> <translation id="7108668606237948702">Enter</translation> <translation id="7108933416628942903">હમણાં જ લૉક કરો</translation> @@ -6580,6 +6584,7 @@ <translation id="7364745943115323529">કાસ્ટ કરો...</translation> <translation id="7364796246159120393">ફાઇલ પસંદ કરો</translation> <translation id="7365076891350562061">મૉનિટરનું કદ</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" /> - પિન કરેલું</translation> <translation id="7366316827772164604">નજીકના ડિવાઇસ માટે સ્કૅન કરી રહ્યાં છીએ…</translation> <translation id="7366415735885268578">એક સાઇટ ઉમેરો</translation> <translation id="7366909168761621528">બ્રાઉઝિંગ ડેટા</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index 0b42960f..0366c2e 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -907,6 +907,7 @@ <translation id="1829129547161959350">पेंगुइन</translation> <translation id="1829192082282182671">ज़ूम &आउट करें</translation> <translation id="1830550083491357902">प्रवेश नहीं है</translation> +<translation id="1831848493690504725">हम मौजूदा नेटवर्क से, Google सर्वर को ऐक्सेस नहीं कर सकते. कोई दूसरा नेटवर्क चुनकर देखें या अपनी नेटवर्क सेटिंग की जांच करें. इसके अलावा, अगर प्रॉक्सी का इस्तेमाल किया जा रहा हो, तो प्रॉक्सी सेटिंग की जांच करें.</translation> <translation id="1832459821645506983">हां, वॉइस सर्च करें</translation> <translation id="1832511806131704864">फ़ोन बदलाव अपडेट किया गया</translation> <translation id="1832848789136765277">यह पक्का करने के लिए कि आप हमेशा अपना सिंक किया हुआ डेटा ऐक्सेस कर सकें, अपनी पहचान की पुष्टि करें</translation> @@ -2741,7 +2742,7 @@ <translation id="3569382839528428029">क्या आप चाहते हैं कि <ph name="APP_NAME" /> आपकी स्क्रीन को शेयर करे?</translation> <translation id="3569407787324516067">स्क्रीन सेवर</translation> <translation id="3569682580018832495"><ph name="ORIGIN" /> नीचे दी गई फ़ाइलों और फ़ोल्डर काे देख सकती है</translation> -<translation id="3571734092741541777">सेट करें</translation> +<translation id="3571734092741541777">सेट अप करें</translation> <translation id="3575121482199441727">इस साइट के लिए सूचनाओं को अनुमति दें</translation> <translation id="3577745545227000795"><ph name="DEVICE_OS" /> हार्डवेयर डेटा क्लेकशन</translation> <translation id="3578594933904494462">इस टैब की सामग्री को शेयर किया जा रहा है.</translation> @@ -3521,7 +3522,7 @@ <translation id="431076611119798497">&विवरण</translation> <translation id="4312701113286993760">{COUNT,plural, =1{1 Google खाता}one{<ph name="EXTRA_ACCOUNTS" /> Google खाता}other{<ph name="EXTRA_ACCOUNTS" /> Google खाते}}</translation> <translation id="4312866146174492540">ब्लॉक करें (डिफ़ॉल्ट)</translation> -<translation id="4314497418046265427">बेहतर तरीके से काम करने के लिए, अपने फ़ोन को <ph name="DEVICE_TYPE" /> से कनेक्ट करें</translation> +<translation id="4314497418046265427">फ़ोन को <ph name="DEVICE_TYPE" /> से कनेक्ट करके, ज़्यादा और बेहतर काम करें</translation> <translation id="4314815835985389558">सिंक प्रबंधित करें</translation> <translation id="4315933848520197627">खाता अनलिंक करें</translation> <translation id="4316850752623536204">डेवलपर वेबसाइट</translation> @@ -3965,7 +3966,7 @@ <translation id="474609389162964566">अपनी Assistant को "Ok Google" बोलकर ऐक्सेस करें</translation> <translation id="4746351372139058112">मैसेज</translation> <translation id="4748783296226936791">आम तौर पर, साइटें उन सुविधाओं के लिए एचआईडी डिवाइसों से कनेक्ट करती हैं जो असामान्य कीबोर्ड, गेम कंट्रोलर, और दूसरे डिवाइस इस्तेमाल करती हैं</translation> -<translation id="4750185073185658673">ज़्यादा अनुमतियों की समीक्षा करने के लिए फ़ोन पर, अनुमतियों वाला सेक्शन देखें. पक्का करें कि आपके फ़ोन का ब्लूटूथ और वाई-फ़ाई चालू हो.</translation> +<translation id="4750185073185658673">कुछ और अनुमतियां देखने के लिए अपने फ़ोन के अनुमतियों वाले सेक्शन पर जाएं. पक्का करें कि आपके फ़ोन का ब्लूटूथ और वाई-फ़ाई चालू हो.</translation> <translation id="4750394297954878236">सुझाव</translation> <translation id="475088594373173692">पहला उपयोगकर्ता</translation> <translation id="4756378406049221019">रोकें/फिर से लोड करें</translation> @@ -4750,6 +4751,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> को अनुमति चाहिए</translation> <translation id="5534304873398226603">फ़ोटो या वीडियो खारिज करें</translation> <translation id="5537725057119320332">कास्ट करें</translation> +<translation id="5539070192556911367">Google सर्वर को ऐक्सेस नहीं किया जा सकता</translation> <translation id="5539221284352502426">आपने जो पासवर्ड डाला है, उसे सर्वर ने अस्वीकार कर दिया है. संभावित कारण ये हो सकते हैं: पासवर्ड बहुत छोटा है. पासवर्ड में संख्याएं या चिह्न होने चाहिए. पासवर्ड, पिछले पासवर्ड से अलग होना चाहिए.</translation> <translation id="5541694225089836610">आपके एडमिन ने कार्रवाई बंद कर दी है</translation> <translation id="5542132724887566711">प्रोफ़ाइल</translation> @@ -4813,6 +4815,7 @@ <translation id="5585912436068747822">फ़ॉर्मेटिंग विफल रही</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">ऐप्लिकेशन लोड हो रहे हैं...</translation> +<translation id="5590418976913374224">डिवाइस चालू होने पर, आवाज़ होने की सुविधा चालू करें</translation> <translation id="5592595402373377407">अभी काफ़ी डेटा उपलब्ध नहीं है.</translation> <translation id="5595307023264033512">साइटों ने कुल इतना स्टोरेज इस्तेमाल किया है: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">पते में बदलाव करें</translation> @@ -5360,7 +5363,7 @@ <translation id="6129953537138746214">Space</translation> <translation id="6130692320435119637">वाई-फ़ाई जोड़ें</translation> <translation id="6130887916931372608">कीबोर्ड का बटन</translation> -<translation id="6135823405800500595">पक्का करें कि आपका फ़ोन आस-पास है और अनलॉक है. साथ ही, उसका ब्लूटूथ और वाई-फ़ाई चालू है</translation> +<translation id="6135823405800500595">पक्का करें कि आपका फ़ोन आस-पास हो और अनलॉक हो. साथ ही, उसका ब्लूटूथ और वाई-फ़ाई चालू हो</translation> <translation id="6136114942382973861">डाउनलोड बार बंद करें</translation> <translation id="6136287496450963112">आपकी सुरक्षा कुंजी को पिन से सुरक्षित नहीं किया गया है. फ़िंगरप्रिंट प्रबंधित करने के लिए, पहले एक पिन बनाएं.</translation> <translation id="6138680304137685902">SHA-384 के साथ X9.62 ECDSA हस्ताक्षर</translation> @@ -5690,7 +5693,7 @@ <translation id="6466258437571594570">साइटें आपसे बार-बार सूचनाएं भेजने की अनुमति मांगकर, आपके काम में रुकावट नहीं डाल सकतीं</translation> <translation id="6466988389784393586">सभी बुकमार्क &खोलें</translation> <translation id="6467304607960172345">फ़ुलस्क्रीन वीडियो ऑप्टिमाइज़ करें</translation> -<translation id="6467377768028664108">इसके बाद, आपका <ph name="DEVICE_TYPE" /> ऐसा कर सकता है:</translation> +<translation id="6467377768028664108">इसके बाद, <ph name="DEVICE_TYPE" /> से ये काम किए जा सकते हैं:</translation> <translation id="6468485451923838994">फ़ॉन्ट</translation> <translation id="6468773105221177474"><ph name="FILE_COUNT" /> फ़ाइलें</translation> <translation id="6469557521904094793">सेल्युलर नेटवर्क चालू करें</translation> @@ -6359,6 +6362,7 @@ <translation id="7102687220333134671">ऑटोमैटिक अपडेट चालू हैं</translation> <translation id="7102832101143475489">अनुरोध का समय खत्म हो गया</translation> <translation id="710640343305609397">नेटवर्क सेटिंग खोलें</translation> +<translation id="7107609441453408294">सभी स्पीकर से एक ही ऑडियो चलाएं</translation> <translation id="7108338896283013870">छुपाएं</translation> <translation id="7108668606237948702">enter</translation> <translation id="7108933416628942903">अभी लॉक करें</translation> @@ -6589,6 +6593,7 @@ <translation id="7364745943115323529">कास्ट करें...</translation> <translation id="7364796246159120393">फ़ाइल चुनें</translation> <translation id="7365076891350562061">मॉनिटर का साइज़</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" /> - पिन किया गया</translation> <translation id="7366316827772164604">आस-पास के डिवाइस के लिए स्कैन किया जा रहा है...</translation> <translation id="7366415735885268578">साइट जोड़ें</translation> <translation id="7366909168761621528">ब्राउज़िंग डेटा</translation> @@ -7312,7 +7317,7 @@ <translation id="8037357227543935929">पूछें (डिफ़ॉल्ट)</translation> <translation id="803771048473350947">फ़ाइल</translation> <translation id="8041089156583427627">सुझाव भेजें</translation> -<translation id="8041267120753677077">अपने फ़ोन के ऐप्लिकेशन को स्ट्रीम करें</translation> +<translation id="8041267120753677077">अपने फ़ोन के ऐप्लिकेशन स्ट्रीम करें</translation> <translation id="8042142357103597104">टेक्स्ट की ओपैसिटी</translation> <translation id="8042331986490021244">Google पासवर्ड मैनेजर में सेव होने से पहले, आपके डिवाइस पर पासवर्ड एन्क्रिप्ट (सुरक्षित) किए जाते हैं</translation> <translation id="8044262338717486897"><ph name="LINUX_APP_NAME" /> काम नहीं कर रहा है.</translation> @@ -7635,7 +7640,7 @@ <translation id="8340547030807793004"><ph name="DEVICE" /> से जुड़ी और कार्रवाइयां</translation> <translation id="8342221978608739536">कोशिश नहीं की गई</translation> <translation id="8342861492835240085">कोई संग्रह चुनें</translation> -<translation id="8345848587667658367">अब आपके पास अपने फ़ोन में मौजूद हाल की फ़ोटो, मीडिया, सूचनाएं, और ऐप्लिकेशन देखने का विकल्प है</translation> +<translation id="8345848587667658367">अब आपके पास अपने फ़ोन में मौजूद हाल ही की फ़ोटो, मीडिया, सूचनाएं, और ऐप्लिकेशन देखने का विकल्प है</translation> <translation id="8347227221149377169">प्रिंट जॉब</translation> <translation id="834785183489258869">गुप्त मोड इस्तेमाल करने पर, अलग-अलग साइटों पर की गई आपकी ब्राउज़िंग गतिविधि देखने के लिए, साइटें, कुकी इस्तेमाल नहीं कर सकतीं. जैसे, लोगों के हिसाब से विज्ञापन दिखाने के लिए. हो सकता है कि कुछ साइटों पर खास सुविधाएं काम न करें.</translation> <translation id="8350789879725387295">डॉक में स्टाइलस टूल</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index ec201f9..44ab7191 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">upotrijebiti vaš mikrofon i kameru</translation> <translation id="1005333234656240382">Omogućiti ADB otklanjanje pogrešaka?</translation> <translation id="1006873397406093306">Ovo proširenje može čitati i mijenjati vaše podatke na web-lokacijama. Možete upravljati time kojim web-lokacijama proširenje može pristupiti.</translation> +<translation id="1007057452468855774">Uključi Trgovinu Google Play</translation> <translation id="1008186147501209563">Izvezi oznake</translation> <translation id="1008557486741366299">Ne sada</translation> <translation id="1009476156254802388">Lokacija <ph name="WEB_DRIVE" /></translation> <translation id="1009663062402466586">Sad su dostupne kontrole igara</translation> <translation id="1010498023906173788">Ta je kartica povezana sa serijskim priključkom.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Stranica ne reagira}one{Stranice ne reagiraju}few{Stranice ne reagiraju}other{Stranice ne reagiraju}}</translation> +<translation id="1011003645819296594">Spremljeni uređaji</translation> <translation id="1011355516189274711">Glasnoća govora za pretvaranje teksta u govor</translation> <translation id="1012794136286421601">Vaše se datoteke na Dokumentima, Tablicama, Prezentacijama i Crtežima sinkroniziraju. Otvorite aplikaciju Google disk da biste im pristupali na mreži ili izvanmrežno.</translation> <translation id="1012876632442809908">USB-C uređaj (prednji priključak)</translation> @@ -493,6 +495,7 @@ <translation id="1470350905258700113">Upotrijebi ovaj uređaj</translation> <translation id="1470946456740188591">Da biste uključili ili isključili pregledavanje kursorom, upotrijebite prečac Ctrl + Search + 7</translation> <translation id="1472675084647422956">Prikaži više</translation> +<translation id="1473223074251193484">Postavite konfiguraciju modemskog povezivanja</translation> <translation id="1474785664565228650">Za promjenu postavke mikrofona potrebno je ponovno pokrenuti Parallels Desktop. Ponovo pokrenite Parallels Desktop da biste nastavili.</translation> <translation id="1474893630593443211">Više kontrole nad oglasima koji vam se prikazuju</translation> <translation id="1475502736924165259">U arhivi imate certifikate koji ne odgovaraju nijednoj od ostalih kategorija</translation> @@ -1115,6 +1118,7 @@ <translation id="2044014337866019681">Provjerite potvrđujete li račun <ph name="ACCOUNT" /> da biste otključali sesiju.</translation> <translation id="204497730941176055">Naziv predloška Microsoftovog certifikata</translation> <translation id="2045117674524495717">Pomoć za tipkovničke prečace</translation> +<translation id="2045211794962848221">Više vam se neće prikazivati ta određena poruka</translation> <translation id="2045969484888636535">Nastavi blokirati kolačiće</translation> <translation id="204622017488417136">Uređaj će se vratiti na prethodno instaliranu verziju Chromea, a svi korisnički računi i lokalni podaci bit će uklonjeni. Tu radnju nije moguće poništiti.</translation> <translation id="2046702855113914483">Ramen</translation> @@ -2197,6 +2201,7 @@ <translation id="3021065318976393105">Tijekom baterijskog napajanja</translation> <translation id="3021066826692793094">Leptir</translation> <translation id="3021678814754966447">&Pogledaj izvor okvira</translation> +<translation id="3022361196600037287">Uređaj <ph name="DEVICE" /> uklonit će se s ovog Chromebooka i neće se spremiti na <ph name="PRIMARY_EMAIL" />.</translation> <translation id="3022978424994383087">Nisam shvatio.</translation> <translation id="3023464535986383522">Odabir za govor</translation> <translation id="3024374909719388945">Koristi 24-satni sat</translation> @@ -3735,6 +3740,7 @@ <translation id="4535127706710932914">Zadani profil</translation> <translation id="4535767533210902251">Senzor otiska prsta nalazi se u najvišoj tipki s desne strane tipkovnice. Dodirnite ga lagano bilo kojim prstom.</translation> <translation id="4536140153723794651">Web-lokacije koje uvijek mogu upotrebljavati kolačiće</translation> +<translation id="4536769240747010177">Mogućnosti modemskog povezivanja:</translation> <translation id="4538417792467843292">Izbriši riječ</translation> <translation id="4538792345715658285">Instalirano pravilima tvrtke.</translation> <translation id="4541123282641193691">Nismo mogli potvrditi vaš račun. Pokušajte ponovo ili ponovo pokrenite Chromebook.</translation> @@ -3762,6 +3768,7 @@ <translation id="4561893854334016293">Nema nedavno promijenjenih dopuštenja</translation> <translation id="4562155214028662640">Dodajte otisak prsta</translation> <translation id="4563210852471260509">Početni jezik unosa je kineski</translation> +<translation id="4563382028841851106">Ukloni s računa</translation> <translation id="4563880231729913339">Treći prst</translation> <translation id="4564245002465020751">Dovršite postavljanje na telefonu</translation> <translation id="4565377596337484307">Sakrij zaporku</translation> @@ -3798,6 +3805,7 @@ <translation id="4594577641390224176">Tražite li stranicu s informacijama o sustavu? Otvorite</translation> <translation id="4595560905247879544">Aplikacije i proširenja može mijenjati samo voditelj (<ph name="CUSTODIAN_NAME" />).</translation> <translation id="4596295440756783523">U arhivi imate certifikate koji identificiraju ove poslužitelje</translation> +<translation id="4598345735110653698">Upravljaj pristupnim ključevima</translation> <translation id="4598556348158889687">Upravljanje pohranom</translation> <translation id="4598776695426288251">Wi-Fi je dostupan putem više uređaja</translation> <translation id="4601426376352205922">Označi kao nepročitano</translation> @@ -4023,6 +4031,7 @@ <translation id="4823894915586516138">PIN ili zaporka štite vaše podatke na ovom uređaju <ph name="DEVICE_TYPE" />, uključujući sve podatke kojima pristupate s telefona</translation> <translation id="4824037980212326045">Sigurnosno kopiranje i vraćanje podataka na Linuxu</translation> <translation id="4824958205181053313">Otkazati sinkronizaciju?</translation> +<translation id="4825532258163983651">Nije moguće izbrisati pristupni ključ</translation> <translation id="4827675678516992122">Povezivanje nije uspjelo</translation> <translation id="4827784381479890589">Poboljšana provjera pravopisa u pregledniku Chrome (tekst se šalje Googleu radi pravopisnih prijedloga)</translation> <translation id="4827904420700932487">Izradi QR kôd za ovu sliku</translation> @@ -4285,6 +4294,7 @@ <translation id="5087249366037322692">Dodala treća strana</translation> <translation id="5087580092889165836">Dodaj karticu</translation> <translation id="5088534251099454936">PKCS br. 1 SHA-512 s RSA enkripcijom</translation> +<translation id="5089763948477033443">Ručica za promjenu veličine bočne ploče</translation> <translation id="5090637338841444533">Nije dopušteno praćenje položaja kamere</translation> <translation id="5093569275467863761">Anonimno predmemorirani posjećeni podokvir: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">Podržane datoteke možete otvarati i uređivati pomoću ove aplikacije iz aplikacije Datoteke ili drugih aplikacija. Za upravljanje datotekama koje mogu otvoriti aplikaciju prema zadanim postavkama <ph name="BEGIN_LINK" />saznajte kako postaviti zadane aplikacije na uređaju<ph name="END_LINK" />.</translation> @@ -4450,6 +4460,7 @@ <translation id="5258992782919386492">Instaliraj na ovom uređaju</translation> <translation id="5260334392110301220">Pametni navodnici</translation> <translation id="5260508466980570042">Žao nam je, nije bilo moguće potvrditi e-adresu ili zaporku. Pokušajte ponovo.</translation> +<translation id="5260958083445173099">Web-lokacije će prikazivati sadržaj na vašim preferiranim jezicima kad je to moguće.</translation> <translation id="5261683757250193089">Otvori u web-trgovini</translation> <translation id="5262178194499261222">Ukloni zaporku</translation> <translation id="5262784498883614021">Automatsko povezivanje s mrežom</translation> @@ -4490,6 +4501,7 @@ <translation id="5294097441441645251">Mora započinjati malim slovom ili podvlakom</translation> <translation id="5294618183559481278">Vaš <ph name="DEVICE_TYPE" /> koristi ugrađeni senzor kako bi detektirao osobe ispred vašeg uređaja. Svi se podaci odmah obrađuju na uređaju, a zatim brišu. Podaci senzora nikad se ne šalju Googleu. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Poslušajte govorne povratne informacije kako biste mogli upotrebljavati uređaj bez gledanja u zaslon. Povratne informacije za brajicu dostupne su uz povezani uređaj.</translation> +<translation id="5297005732522718715">Osvježi konfiguraciju modemskog povezivanja</translation> <translation id="5297082477358294722">Zaporka je spremljena. Spremljene zaporke možete pregledati i upravljati njima ovdje: <ph name="SAVED_PASSWORDS_STORE" /></translation> <translation id="5297946558563358707">Kad netko drugi pogleda vaš zaslon, u donjem desnom kutu zaslona prikazuje se ikona oka za zaštitu privatnosti</translation> <translation id="5298219193514155779">Temu je stvorio autor</translation> @@ -4660,11 +4672,13 @@ <translation id="5466374726908360271">Za&lijepi i traži pojam "<ph name="SEARCH_TERMS" />"</translation> <translation id="5467207440419968613">Blokirano je sljedeće: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation> <translation id="5468173180030470402">Traže se dijeljenja datoteka</translation> +<translation id="5468330507528805311">Status modemskog povezivanja:</translation> <translation id="5468881191994555667">Odaberite datoteku</translation> <translation id="5469852975082458401">Stranicama se možete kretati pomoću pokazivača za tekst. Pritisnite F7 da biste isključili tu značajku.</translation> <translation id="5470735824776589490">Da biste mogli izvršiti Powerwash, trebate ponovo pokrenuti uređaj. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Bok! Ja sam vaš glas alata za pretvaranje teksta u govor.</translation> <translation id="5472627187093107397">Spremanje zaporki za ovu web-lokaciju</translation> +<translation id="5473062644742711742">Pronađite više alata za pristupačnost u Chrome web-trgovini</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">Ako nastavite, pristajete na to da ovaj uređaj također može, između ostalog i mobilnim podatkovnim prijenosom, automatski preuzimati i instalirati ažuriranja i aplikacije koje šalju Google, djetetov mobilni operater i proizvođač uređaja. Neke od tih aplikacija mogu nuditi kupnje putem aplikacije.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{PIN mora imati najmanje jedan znak}one{PIN mora imati najmanje # znak}few{PIN mora imati najmanje # znaka}other{PIN mora imati najmanje # znakova}}</translation> @@ -4934,6 +4948,7 @@ <translation id="5734362860645681824">Komunikacije</translation> <translation id="5734697361979786483">Dodaj dijeljenje datoteka</translation> <translation id="5736796278325406685">Unesite važeće korisničko ime</translation> +<translation id="5738093759615225354">Taj pristupni kôd potreban je za prijavu na računalo</translation> <translation id="5739017626473506901">Prijavite se tako da <ph name="USER_NAME" /> može dodati školski račun</translation> <translation id="5739235828260127894">Čeka se potvrda. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Vrlo velik</translation> @@ -5095,6 +5110,7 @@ <translation id="589541317545606110">Pretraživanje stranice pomoću usluge <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">Nemoj dopustiti</translation> <translation id="5900186025777217044">Smart Lock je promijenjen</translation> +<translation id="5900243355162006650">Konfiguracija modemskog povezivanja:</translation> <translation id="5900302528761731119">Fotografija Google profila</translation> <translation id="590036993063074298">Pojedinosti o kvaliteti zrcaljenja</translation> <translation id="5901069264981746702">Podaci o otisku prsta sigurno se pohranjuju i nikamo se ne šalju s uređaja <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> @@ -5347,7 +5363,7 @@ <translation id="6129953537138746214">Razmak</translation> <translation id="6130692320435119637">Dodaj Wi-Fi</translation> <translation id="6130887916931372608">Tipka tipkovnice</translation> -<translation id="6135823405800500595">Provjerite je li telefon u blizini, je li otključan i jesu li Bluetooth i Wi-Fi uključeni.</translation> +<translation id="6135823405800500595">Telefon vam treba biti blizu, otključan, a Bluetooth i Wi-Fi uključeni.</translation> <translation id="6136114942382973861">Zatvori traku preuzimanja</translation> <translation id="6136287496450963112">Vaš sigurnosni ključ nije zaštićen PIN-om. Za upravljanje otiscima prstiju najprije izradite PIN.</translation> <translation id="6138680304137685902">X9.62 ECDSA potpis uz SHA-384</translation> @@ -5397,6 +5413,7 @@ <translation id="6196640612572343990">Blokiraj kolačiće trećih strana</translation> <translation id="6196854373336333322">Proširenje "<ph name="EXTENSION_NAME" />" preuzelo je kontrolu nad vašim postavkama proxyja, a to znači da može promijeniti, prekinuti ili prisluškivati sve što radite na mreži. Ako niste sigurni kako je došlo do te promjene, vjerojatno je ne želite.</translation> <translation id="6197128521826316819">Izradi QR kôd za ovu stranicu</translation> +<translation id="6197223946499512637">Ti su pristupni ključevi pohranjeni u sustavu Windows Hello na ovom računalu. Ne spremaju se na vaš Google račun.</translation> <translation id="6198252989419008588">Promijeni PIN</translation> <translation id="6200047250927636406">Odbaci datoteku</translation> <translation id="6200151268994853226">Upravljajte proširenjem</translation> @@ -5677,7 +5694,7 @@ <translation id="6466258437571594570">Web-lokacije vas ne mogu ometati postavljanjem upita o slanju obavijesti</translation> <translation id="6466988389784393586">&Otvaranje svih oznaka</translation> <translation id="6467304607960172345">Optimiziraj videozapise na cijelom zaslonu</translation> -<translation id="6467377768028664108">Uređaj <ph name="DEVICE_TYPE" /> zatim može učiniti sljedeće:</translation> +<translation id="6467377768028664108">Time uređaju <ph name="DEVICE_TYPE" /> omogućujete sljedeće:</translation> <translation id="6468485451923838994">Fontovi</translation> <translation id="6468773105221177474">Datoteka: <ph name="FILE_COUNT" /></translation> <translation id="6469557521904094793">Uključivanje mobilne mreže</translation> @@ -5694,6 +5711,7 @@ <translation id="6482559668224714696">Povećalo za cijeli zaslon</translation> <translation id="6483485061007832714">Otvorite preuzimanje</translation> <translation id="6483805311199035658">Otvaranje datoteke <ph name="FILE" />...</translation> +<translation id="6486301003991593638">Za upravljanje pristupnim ključevima upotrijebite noviju verziju Windowsa</translation> <translation id="6488384360522318064">Odaberite jezik</translation> <translation id="648927581764831596">Ništa nije dostupno</translation> <translation id="6490471652906364588">USB-C uređaj (desni priključak)</translation> @@ -6181,6 +6199,10 @@ <translation id="6943939122536910181">Prekinuta je veza s uređajem <ph name="DEVICE" /></translation> <translation id="6945221475159498467">Odaberi</translation> <translation id="694592694773692225">Preusmjeravanje je blokirano na ovoj stranici.</translation> +<translation id="6947015141909171112">Prikazuju vam se recepti na temelju vaše nedavne aktivnosti pretraživanja u vezi s receptima. + <ph name="BREAK" /> + <ph name="BREAK" /> + Postavkama možete upravljati putem izbornika kartice ili možete vidjeti više opcija u odjeljku Prilagodba Chromea.</translation> <translation id="6949434160682548041">Zaporka (nije obavezna)</translation> <translation id="6950627417367801484">Vrati aplikacije</translation> <translation id="6952242901357037157">Zaporke s <ph name="BEGIN_LINK" />Google računa<ph name="END_LINK" /> možete prikazati i ovdje</translation> @@ -6280,6 +6302,7 @@ <translation id="7029307918966275733">Crostini nije instaliran. Instalirajte Crostini da biste vidjeli bonuse.</translation> <translation id="7029809446516969842">Zaporke</translation> <translation id="7030304022046916278">Šalje URL-ove sigurnom pregledavanju na provjeru</translation> +<translation id="7030695672997239647">Kliknite karticu desnom tipkom i odaberite Dodaj karticu u grupu, a zatim odaberite Nova grupa</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> – povezano sa serijskim priključkom</translation> <translation id="7033616203784997570">Unos ne smije biti duži od 62 znaka</translation> <translation id="7034692021407794547">Administrator s ovlašću upravljanja naplatom mora prvo prihvatiti uvjete pružanja usluge hardvera za Google Meet u odjeljku Hardver za Google Meet administratorske konzole.</translation> @@ -6976,6 +6999,7 @@ <translation id="7737115349420013392">Uparivanje s uređajem "<ph name="DEVICE_NAME" />" ...</translation> <translation id="7737846262459425222">To uvijek možete promijeniti u Postavkama > Google asistent > Kontekst na zaslonu.</translation> <translation id="7737948071472253612">Nije dopuštena upotreba kamere</translation> +<translation id="77381465218432215">Prikaz naglasaka i posebnih znakova</translation> <translation id="7740996059027112821">Standardno</translation> <translation id="7741307896921365578">Omogućuje bočnu ploču na razini preglednika za koristan i stalno dostupan način pristupa popisu za čitanje i oznakama.</translation> <translation id="7742558784808143689">Želite li izbrisati podatke web-lokacije i dopuštenja za web-lokaciju <ph name="SITE_NAME" />, sve njoj podređene web-lokacije i instalirane aplikacije?</translation> @@ -7380,6 +7404,7 @@ <translation id="8101987792947961127">Pri sljedećem ponovnom pokretanju potrebno je izvršiti Powerwash</translation> <translation id="81020759409809034">Lokalna lokacija</translation> <translation id="8102139037507939978">Ukloni podatke koji otkrivaju identitet iz datoteke system_logs.txt.</translation> +<translation id="810362914482827094">Pretraživanje pristupnih ključeva</translation> <translation id="8104088837833760645">Preuzmite eSIM profil</translation> <translation id="8105368624971345109">Isključi</translation> <translation id="8107015733319732394">Trgovina Google Play instalira se na vašem uređaju <ph name="DEVICE_TYPE" />. To bi moglo potrajati nekoliko minuta.</translation> @@ -7765,6 +7790,7 @@ <translation id="8486666913807228950">Razlog: obrnuto pravilo <ph name="REVERT_RULE" /> pronađeno je na popisu Nametanje otvaranja u pregledniku.</translation> <translation id="848666842773560761">Aplikacija pokušava pristupiti fotoaparatu. Da biste omogućili pristup, isključite prekidač za privatnost fotoaparata.</translation> <translation id="8487678622945914333">Povećaj</translation> +<translation id="8487699605742506766">Žarišna točka</translation> <translation id="8489156414266187072">Osobni prijedlozi prikazuju se samo na vašem računu</translation> <translation id="8490896350101740396">Ažurirane su sljedeće aplikacije kioska: "<ph name="UPDATED_APPS" />". Ponovo pokrenite uređaj da biste dovršili postupak ažuriranja.</translation> <translation id="8492685019009920170">Prislonite prst na senzor otiska prsta. Podaci se sigurno pohranjuju i nikamo se ne šalju s uređaja <ph name="DEVICE_TYPE" />.</translation> @@ -7826,6 +7852,7 @@ <translation id="8557022314818157177">Dodirujte sigurnosni ključ dok se otisak prsta ne spremi</translation> <translation id="8557180006508471423">Uključite Google Chrome na uslugama lokacije na Macu</translation> <translation id="8557856025359704738">Sljedeće je preuzimanje <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">Pristupni ključevi</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Otvori sve u &novom prozoru}=1{Otvori u &novom prozoru}one{Otvori sve ({COUNT}) u &novom prozoru}few{Otvori sve ({COUNT}) u &novom prozoru}other{Otvori sve ({COUNT}) u &novom prozoru}}</translation> <translation id="8561206103590473338">Slon</translation> <translation id="8561565784790166472">Nastavite oprezno</translation> @@ -7952,6 +7979,7 @@ <translation id="8677212948402625567">Sažmi sve...</translation> <translation id="867767487203716855">Sljedeće ažuriranje</translation> <translation id="8677859815076891398">Nema albuma. Izradite album u <ph name="LINK_BEGIN" />Google fotografijama<ph name="LINK_END" />.</translation> +<translation id="8678378565142776698">Ponovo pokrenite i primajte automatska ažuriranja</translation> <translation id="8678538439778360739">Podaci su šifrirani vašom šifrom za sinkronzaciju <ph name="TIME" />. To ne uključuje načine plaćanja i adrese s Google Paya.</translation> <translation id="8678582529642151449">Kartice se ne smanjuju</translation> <translation id="8678933587484842200">Kako želite da se ova aplikacija pokreće?</translation> @@ -8200,6 +8228,7 @@ <translation id="8910987510378294980">Sakrij popis uređaja</translation> <translation id="8912362522468806198">Google Račun</translation> <translation id="8912810933860534797">Omogući automatsko traženje</translation> +<translation id="8915307125957890427">Kliknite karticu desnom tipkom i odaberite Dodaj karticu u grupu, a zatim odaberite Nova grupa</translation> <translation id="8915370057835397490">Učitavanje prijedloga</translation> <translation id="8916476537757519021">Anonimni podokvir: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> – <ph name="DEVICE_TYPE" /></translation> @@ -8260,6 +8289,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{„<ph name="TAB_TITLE" />"}=1{„<ph name="TAB_TITLE" />" i još jedna kartica}one{„<ph name="TAB_TITLE" />" i još # kartica}few{„<ph name="TAB_TITLE" />" i još # kartice}other{„<ph name="TAB_TITLE" />" i još # kartica}}</translation> <translation id="8977811652087512276">Netočna zaporka ili oštećena datoteka</translation> <translation id="8978154919215542464">Uključeno – sinkronizacija svega</translation> +<translation id="8978670037548431647">Osvježi mogućnosti modemskog povezivanja</translation> <translation id="897939795688207351">Na <ph name="ORIGIN" /></translation> <translation id="8980345560318123814">Izvješća s povratnim informacijama</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> – kartica se srušila</translation> @@ -8273,6 +8303,7 @@ <translation id="8986362086234534611">Zaboravi</translation> <translation id="8986494364107987395">Automatski šalji Googleu statistiku o upotrebi i izvješća o padu programa</translation> <translation id="8987927404178983737">Mjesec</translation> +<translation id="8989359959810288806">Osvježi status modemskog povezivanja</translation> <translation id="8991520179165052608">Web-lokacija može upotrebljavati vaš mikrofon</translation> <translation id="899384117894244799">Uklanjanje ograničenog korisnika</translation> <translation id="899403249577094719">Osnovni URL Netscape certifikata</translation> @@ -8524,6 +8555,7 @@ <translation id="935854577147268200">Promijenjen je telefon Smart Locka. Unesite zaporku da biste ažurirali Smart Lock. Sljedeći će put vaš telefon otključati vaš uređaj <ph name="DEVICE_TYPE" />. Smart Lock možete isključiti u Postavkama.</translation> <translation id="936646668635477464">Fotoaparat i mikrofon</translation> <translation id="936801553271523408">Podaci o dijagnozi sustava</translation> +<translation id="937053962468712792">Želite li ukloniti uređaj <ph name="DEVICE" /> s e-adrese <ph name="PRIMARY_EMAIL" />?</translation> <translation id="93766956588638423">Popravi proširenje</translation> <translation id="938568644810664664">Pokušajte reći "Hey Google, what song is this?" (Hey Google, koja je to pjesma?) ili "Hey Google, what's on my screen?" (Hey Google, što je na mojem zaslonu?)</translation> <translation id="938623846785894166">Neuobičajena datoteka</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index 9523f641..99817575 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Mikrofon és kamera használata</translation> <translation id="1005333234656240382">Engedélyezi az ADB-hibakeresést?</translation> <translation id="1006873397406093306">Ez a bővítmény olvashatja és módosíthatja az Ön adatait az egyes webhelyeken. Ön vezérli, hogy mely webhelyekhez férhet hozzá a bővítmény.</translation> +<translation id="1007057452468855774">A Google Play Áruház bekapcsolása</translation> <translation id="1008186147501209563">Könyvjelzők exportálása</translation> <translation id="1008557486741366299">Ne most</translation> <translation id="1009476156254802388">Letöltés helye itt: <ph name="WEB_DRIVE" /></translation> <translation id="1009663062402466586">Mostantól használhatók a játékvezérlők</translation> <translation id="1010498023906173788">Ez a lap soros porthoz van csatlakoztatva.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Az oldal nem válaszol}other{Több oldal nem válaszol}}</translation> +<translation id="1011003645819296594">Mentett eszközök</translation> <translation id="1011355516189274711">Szövegfelolvasó hangereje</translation> <translation id="1012794136286421601">A Dokumentumok, Táblázatok, Diák és Rajzok fájljainak szinkronizálása következik. A fájlok online vagy offline eléréséhez nyissa meg a Google Drive alkalmazást.</translation> <translation id="1012876632442809908">C típusú USB-vel kompatibilis eszköz (elülső port)</translation> @@ -494,6 +496,7 @@ <translation id="1470350905258700113">Ezt az eszközt használom</translation> <translation id="1470946456740188591">A billentyűzettel böngészés be- vagy kikapcsolásához használja a Ctrl + Keresés + 7 billentyűkombinációt</translation> <translation id="1472675084647422956">Továbbiak megjelenítése</translation> +<translation id="1473223074251193484">Internetmegosztás beállítása</translation> <translation id="1474785664565228650">A mikrofonbeállítások módosítása miatt a Parallels Desktop újraindítására van szükség. A folytatáshoz indítsa újra a Parallels Desktopot.</translation> <translation id="1474893630593443211">Jobban szabályozhatja az Ön számára megjelenő hirdetéseket</translation> <translation id="1475502736924165259">Vannak olyan tanúsítványok, amelyek nem illenek a többi kategória egyikébe se</translation> @@ -906,6 +909,7 @@ <translation id="1829129547161959350">Pingvin</translation> <translation id="1829192082282182671">Kics&inyítés</translation> <translation id="1830550083491357902">Nem jelentkezett be</translation> +<translation id="1831848493690504725">A csatlakoztatott hálózaton keresztül nem sikerült elérni a Google-t. Válasszon másik hálózatot, vagy ellenőrizze a hálózati vagy proxybeállításokat (ha proxyt használ).</translation> <translation id="1832459821645506983">Benne vagyok!</translation> <translation id="1832511806131704864">Telefonmódosítás frissítve</translation> <translation id="1832848789136765277">Igazolja személyazonosságát, hogy mindig hozzáférhessen szinkronizált adataihoz</translation> @@ -1123,6 +1127,7 @@ <translation id="2044014337866019681">A munkamenet zárolásának feloldásához igazolja a következő fiókot: <ph name="ACCOUNT" />.</translation> <translation id="204497730941176055">Microsoft tanúsítványsablon neve</translation> <translation id="2045117674524495717">Billentyűparancsokat ismertető súgó</translation> +<translation id="2045211794962848221">Ez a konkrét üzenet nem fog többé megjelenni</translation> <translation id="2045969484888636535">Cookie-k tiltásának folytatása</translation> <translation id="204622017488417136">Eszköze visszatér a Chrome korábban telepített példányához. A rendszer minden felhasználói fiókot és helyi adatot eltávolít. A műveletet nem lehet visszavonni.</translation> <translation id="2046702855113914483">Rámen</translation> @@ -2207,6 +2212,7 @@ <translation id="3021065318976393105">Amíg akkumulátorról működik</translation> <translation id="3021066826692793094">Pillangó</translation> <translation id="3021678814754966447">&Keret forrásának megtekintése</translation> +<translation id="3022361196600037287">A(z) <ph name="DEVICE" /> eszköz el lesz távolítva erről a Chromebookról, és nem menti a rendszer a következő fiókba: <ph name="PRIMARY_EMAIL" />.</translation> <translation id="3022978424994383087">Nem értettem.</translation> <translation id="3023464535986383522">Felolvasás</translation> <translation id="3024374909719388945">24 órás megjelenítés használata</translation> @@ -2330,7 +2336,7 @@ <translation id="3151539355209957474">Kezdés ideje</translation> <translation id="3151562827395986343">Előzmények, cookie-k, gyorsítótár és egyebek törlése</translation> <translation id="3151786313568798007">Tájolás</translation> -<translation id="3152356229013609796">Telefonja értesítéseinek megtekintése, elvetése, illetve válasz rájuk</translation> +<translation id="3152356229013609796">Megtekintheti, elvetheti és megválaszolhatja telefonja értesítéseit</translation> <translation id="3157387275655328056">Hozzáadás olvasási listához</translation> <translation id="3157931365184549694">Helyreállítás</translation> <translation id="3158033540161634471">Az ujjlenyomat beállítása</translation> @@ -3745,6 +3751,7 @@ <translation id="4535127706710932914">Alapértelmezett profil</translation> <translation id="4535767533210902251">Az ujjlenyomat-érzékelő a billentyűzet jobb felső sarkában található gomb. Érintse meg finoman valamelyik ujjával.</translation> <translation id="4536140153723794651">Webhelyek, amelyek mindig használhatnak cookie-kat</translation> +<translation id="4536769240747010177">Internetmegosztás lehetőségei:</translation> <translation id="4538417792467843292">Szó törlése</translation> <translation id="4538792345715658285">Vállalati házirend által telepítve.</translation> <translation id="4541123282641193691">Nem sikerült ellenőrizni a fiókot. Próbálja meg ismét, vagy indítsa újra a Chromebookot.</translation> @@ -3772,6 +3779,7 @@ <translation id="4561893854334016293">Nincsenek nemrégiben módosított engedélyek</translation> <translation id="4562155214028662640">Ujjlenyomat hozzáadása</translation> <translation id="4563210852471260509">Az alapértelmezett beviteli nyelv a kínai</translation> +<translation id="4563382028841851106">Eltávolítás a fiókból</translation> <translation id="4563880231729913339">3. ujj</translation> <translation id="4564245002465020751">Fejezze be a beállítást a telefonján</translation> <translation id="4565377596337484307">Jelszó elrejtése</translation> @@ -3808,6 +3816,7 @@ <translation id="4594577641390224176">A rendszer névjegyoldalát keresi? Nyissa meg ezt az oldalt:</translation> <translation id="4595560905247879544">Az alkalmazásokat és bővítményeket csak a kezelő (<ph name="CUSTODIAN_NAME" />) módosíthatja.</translation> <translation id="4596295440756783523">Vannak olyan tanúsítványok, amelyek ezeket a szervereket azonosítják</translation> +<translation id="4598345735110653698">Azonosítókulcsok kezelése</translation> <translation id="4598556348158889687">Tárhelykezelés</translation> <translation id="4598776695426288251">Több eszközön keresztül is rendelkezésre áll Wi-Fi-kapcsolat</translation> <translation id="4601426376352205922">Megjelölés olvasatlanként</translation> @@ -4033,6 +4042,7 @@ <translation id="4823894915586516138">Ez a PIN-kód vagy jelszó megvédi az adatait ezen a(z) <ph name="DEVICE_TYPE" /> eszközön, beleértve minden olyan információt is, amelyhez a telefonjáról fér hozzá</translation> <translation id="4824037980212326045">Biztonsági mentés és helyreállítás Linuxon</translation> <translation id="4824958205181053313">Megszakítja a szinkronizálást?</translation> +<translation id="4825532258163983651">Nem sikerült törölni az azonosítókulcsot</translation> <translation id="4827675678516992122">Nem sikerült csatlakozni</translation> <translation id="4827784381479890589">Továbbfejlesztett helyesírás-ellenőrzés a Chrome böngészőben (a rendszer elküldi a szöveget a Google-nak helyesírási javaslatokért)</translation> <translation id="4827904420700932487">QR-kód létrehozása ehhez a képhez</translation> @@ -4295,6 +4305,7 @@ <translation id="5087249366037322692">Harmadik fél adta hozzá</translation> <translation id="5087580092889165836">Kártya hozzáadása</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 RSA titkosítással</translation> +<translation id="5089763948477033443">Oldalsó panelt átméretező fogópont</translation> <translation id="5090637338841444533">Nem követhetik nyomon a kamera pozícióját</translation> <translation id="5093569275467863761">Előre-vissza gyorsítótárazott inkognitó-alkeret: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">Ezzel az alkalmazással támogatott fájlokat nyithat meg és szerkeszthet a Fájlok appban és más alkalmazásokban. Ha szabályozni szeretné, hogy mely fájlok nyíljanak meg alapértelmezés szerint ebben az alkalmazásban, <ph name="BEGIN_LINK" />itt tájékozódhat arról, hogy miként állíthat be alapértelmezett alkalmazásokat az eszközén<ph name="END_LINK" />.</translation> @@ -4460,6 +4471,7 @@ <translation id="5258992782919386492">Telepítés ezen az eszközön</translation> <translation id="5260334392110301220">Intelligens idézőjelek</translation> <translation id="5260508466980570042">Sajnáljuk, e-mail-címét vagy jelszavát nem sikerült megerősíteni. Próbálja ismét.</translation> +<translation id="5260958083445173099">A webhelyek tartalma a preferált nyelveken jelenik meg, ha lehetséges.</translation> <translation id="5261683757250193089">Megnyitás az Internetes áruházban</translation> <translation id="5262178194499261222">Jelszó eltávolítása</translation> <translation id="5262784498883614021">Automatikus csatlakozás a hálózathoz</translation> @@ -4501,6 +4513,7 @@ <translation id="5294097441441645251">Kisbetűvel vagy aláhúzásjellel kell kezdődnie</translation> <translation id="5294618183559481278"><ph name="DEVICE_TYPE" /> eszköze beépített érzékelőt használ az eszköz előtt álló emberek észleléséhez. A rendszer az összes adatot azonnal feldolgozza az eszközön, majd törli őket. A szenzoradatokat nem továbbítja a rendszer a Google-nak. <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" />.</translation> <translation id="5296350763804564124">Hangos visszajelzést kaphat, így anélkül használhatja eszközét, hogy a képernyőre kellene néznie. A Braille-visszajelzés csatlakoztatott eszközökön áll rendelkezésre.</translation> +<translation id="5297005732522718715">Internetmegosztási beállítások frissítése</translation> <translation id="5297082477358294722">Jelszó elmentve. A mentett jelszavakat itt láthatja és kezelheti: <ph name="SAVED_PASSWORDS_STORE" /></translation> <translation id="5297946558563358707">Az „Adatvédelmi szem” ikon megjelenítése a képernyő jobb alsó sarkában, amikor valaki más az Ön képernyőjére néz</translation> <translation id="5298219193514155779">Téma készítője:</translation> @@ -4671,6 +4684,7 @@ <translation id="5466374726908360271">„<ph name="SEARCH_TERMS" />” be&illesztése és keresése</translation> <translation id="5467207440419968613">Letiltva: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation> <translation id="5468173180030470402">Fájlmegosztások keresése</translation> +<translation id="5468330507528805311">Internetmegosztás állapota:</translation> <translation id="5468881191994555667">Fájl kiválasztása</translation> <translation id="5469852975082458401">Az oldalakon szövegkurzorral navigálhat. A funkciót az F7 gombbal kapcsolhatja ki.</translation> <translation id="5470735824776589490">Mielőtt a Powerwash segítségével visszaállítaná, újra kell indítania az eszközt. <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" />.</translation> @@ -4749,6 +4763,7 @@ <translation id="5533001281916885985">A(z) <ph name="SITE_NAME" /> a következőket szeretné tenni:</translation> <translation id="5534304873398226603">Kép vagy videó elvetése</translation> <translation id="5537725057119320332">Küldés</translation> +<translation id="5539070192556911367">A Google nem áll rendelkezésre</translation> <translation id="5539221284352502426">A szerver elutasította a megadott jelszót. Lehetséges okok: Túl rövid a jelszó. A jelszónak tartalmaznia kell számokat és szimbólumokat. A jelszó nem egyezhet meg korábbi jelszavakkal.</translation> <translation id="5541694225089836610">A rendszergazda letiltotta a műveletet.</translation> <translation id="5542132724887566711">Profil</translation> @@ -4812,6 +4827,7 @@ <translation id="5585912436068747822">A formázás sikertelen</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Alkalmazások betöltése…</translation> +<translation id="5590418976913374224">Hang lejátszása az eszköz indításakor</translation> <translation id="5592595402373377407">Még nem áll rendelkezésre elég adat.</translation> <translation id="5595307023264033512">Webhelyek által használt teljes tárhely: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">Cím szerkesztése</translation> @@ -4946,6 +4962,7 @@ <translation id="5734362860645681824">Kommunikáció</translation> <translation id="5734697361979786483">Fájlmegosztás hozzáadása</translation> <translation id="5736796278325406685">Érvényes felhasználónevet adjon meg</translation> +<translation id="5738093759615225354">A számítógépre való bejelentkezéshez szüksége van erre az azonosítókulcsra.</translation> <translation id="5739017626473506901">Jelentkezzen be <ph name="USER_NAME" /> iskolai fiókjának hozzáadásához</translation> <translation id="5739235828260127894">Várakozás az ellenőrzésre. <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" />.</translation> <translation id="5739458112391494395">Nagyon nagy</translation> @@ -5107,6 +5124,7 @@ <translation id="589541317545606110">Keresés az oldalon a következővel: <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">Tiltás</translation> <translation id="5900186025777217044">A Smart Lock módosult</translation> +<translation id="5900243355162006650">Internetmegosztási beállítás:</translation> <translation id="5900302528761731119">Google-profil fotó</translation> <translation id="590036993063074298">A tükrözés minőségének részletei</translation> <translation id="5901069264981746702">Az ujjlenyomatadatokat a(z) <ph name="DEVICE_TYPE" /> biztonságosan tárolja, és soha nem kerülnek ki az eszközről. <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" />.</translation> @@ -5410,6 +5428,7 @@ <translation id="6196640612572343990">Harmadik féltől származó cookie-k letiltása</translation> <translation id="6196854373336333322">A(z) <ph name="EXTENSION_NAME" /> bővítmény átvette az irányítást proxybeállításai felett, ami azt jelenti, hogy a bővítmény minden internetes tevékenységét módosíthatja, feltörheti vagy lehallgathatja. Ha nem biztos benne, hogy miért történt a változás, akkor valószínűleg nem is akarja azt.</translation> <translation id="6197128521826316819">QR-kód létrehozása ehhez az oldalhoz</translation> +<translation id="6197223946499512637">Ezeket az azonosítókulcsokat a Windows Hello tárolja ezen a számítógépen. A rendszer nem menti őket az Ön Google-fiókjába.</translation> <translation id="6198252989419008588">PIN-kód megváltoztatása</translation> <translation id="6200047250927636406">Fájl elvetése</translation> <translation id="6200151268994853226">Bővítmény kezelése</translation> @@ -5707,6 +5726,7 @@ <translation id="6482559668224714696">Teljes képernyős nagyító</translation> <translation id="6483485061007832714">Letöltés megnyitása</translation> <translation id="6483805311199035658"><ph name="FILE" /> megnyitása...</translation> +<translation id="6486301003991593638">Az azonosítókulcsok kezeléséhez használja a Windows újabb verzióját</translation> <translation id="6488384360522318064">Nyelv kiválasztása</translation> <translation id="648927581764831596">Nincs elérhető</translation> <translation id="6490471652906364588">C típusú USB-vel kompatibilis eszköz (jobb oldali port)</translation> @@ -6190,6 +6210,10 @@ <translation id="6943939122536910181">Leválasztva a következőről: <ph name="DEVICE" /></translation> <translation id="6945221475159498467">Kiválasztás</translation> <translation id="694592694773692225">Átirányítás letiltva ezen az oldalon.</translation> +<translation id="6947015141909171112">Legutóbbi receptkereső tevékenységei alapján láthat recepteket. + <ph name="BREAK" /> + <ph name="BREAK" /> + A beállításokat a kártyamenüben kezelheti, illetve megtekinthet további lehetőségeket A Chrome személyre szabása szakaszban.</translation> <translation id="6949434160682548041">Jelszó (nem kötelező)</translation> <translation id="6950627417367801484">Alkalmazások visszaállítása</translation> <translation id="6952242901357037157">A <ph name="BEGIN_LINK" />Google-fiókjából<ph name="END_LINK" /> is megjeleníthet itt jelszavakat</translation> @@ -6289,6 +6313,7 @@ <translation id="7029307918966275733">A Crostini nincs telepítve. Telepítse a Crostinit a fájl megtekintéséhez.</translation> <translation id="7029809446516969842">Jelszavak</translation> <translation id="7030304022046916278">Elküldi az URL-eket a Biztonságos Böngészésnek ellenőrzésre.</translation> +<translation id="7030695672997239647">Kattintson jobb gombbal valamelyik lapfülre, és válassza a „Lap hozzáadása csoporthoz”, majd az „Új csoport” lehetőséget.</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> – soros port csatlakoztatva</translation> <translation id="7033616203784997570">Legfeljebb 62 karaktert adhat meg</translation> <translation id="7034692021407794547">Egy számlázáskezelési jogosultsággal rendelkező adminisztrátornak előbb el kell fogadnia a Google Meet-hardver Általános Szerződési Feltételeit a Felügyeleti Konzol Google Meet-hardver szakaszában.</translation> @@ -6357,6 +6382,7 @@ <translation id="7102687220333134671">Az automatikus frissítések be vannak kapcsolva</translation> <translation id="7102832101143475489">A kérelem lejárt</translation> <translation id="710640343305609397">Hálózati beállítások megnyitása</translation> +<translation id="7107609441453408294">Hanganyag együttes lejátszása minden hangszórón</translation> <translation id="7108338896283013870">Elrejtés</translation> <translation id="7108668606237948702">enter</translation> <translation id="7108933416628942903">Zárolás most</translation> @@ -6587,6 +6613,7 @@ <translation id="7364745943115323529">Átküldés...</translation> <translation id="7364796246159120393">Fájl kiválasztása</translation> <translation id="7365076891350562061">Monitor mérete</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" /> – Kitűzve</translation> <translation id="7366316827772164604">Közeli eszközök keresése…</translation> <translation id="7366415735885268578">Webhely hozzáadása</translation> <translation id="7366909168761621528">Böngészési adatok</translation> @@ -6983,6 +7010,7 @@ <translation id="7737115349420013392">Párosítás a következővel: <ph name="DEVICE_NAME" />…</translation> <translation id="7737846262459425222">Ezt bármikor módosíthatja a Beállítások > Google Segéd > Képernyőkontextus menüpontban.</translation> <translation id="7737948071472253612">Nem használhatják a kamerát</translation> +<translation id="77381465218432215">Ékezetek és speciális karakterek megjelenítése</translation> <translation id="7740996059027112821">Szokásos</translation> <translation id="7741307896921365578">Bekapcsolja a böngészőszintű oldalsó panelt, így hasznos és állandó lehetőséget biztosít az Olvasólistához és a Könyvjelzőkhöz való hozzáféréshez.</translation> <translation id="7742558784808143689">Törli a(z) <ph name="SITE_NAME" /> webhelyre, az alá tartozó valamennyi webhelyre, valamint a telepített alkalmazásokra vonatkozó webhelyadatokat és -engedélyeket?</translation> @@ -7387,6 +7415,7 @@ <translation id="8101987792947961127">Powerwash szükséges a következő újraindításkor</translation> <translation id="81020759409809034">Letöltés helye ezen az eszközön</translation> <translation id="8102139037507939978">Személyazonosításra alkalmas adatok eltávolítása a system_logs.txt fájlból.</translation> +<translation id="810362914482827094">Azonosítókulcsok keresése</translation> <translation id="8104088837833760645">eSIM-profil letöltése</translation> <translation id="8105368624971345109">Kikapcsolás</translation> <translation id="8107015733319732394">Folyamatban van a Google Play Áruház telepítése a(z) <ph name="DEVICE_TYPE" /> eszközre. Ez eltarthat néhány percig.</translation> @@ -7772,6 +7801,7 @@ <translation id="8486666913807228950">Ok: A(z) <ph name="REVERT_RULE" /> invertált szabályt találta a rendszer a „Kényszerített megnyitás itt:” listában.</translation> <translation id="848666842773560761">Az egyik alkalmazás hozzá szeretne férni a kamerához. A hozzáférés engedélyezéséhez kapcsolja ki a kamera adatvédelmi kapcsolóját.</translation> <translation id="8487678622945914333">Nagyítás</translation> +<translation id="8487699605742506766">Hotspot</translation> <translation id="8489156414266187072">A személyes javaslatok csak a fiókjában jelennek meg</translation> <translation id="8490896350101740396">A(z) „<ph name="UPDATED_APPS" />” kioszkalkalmazás frissítve lett. Kérjük, indítsa újra az eszközt a frissítési folyamat befejezéséhez.</translation> <translation id="8492685019009920170">Érintse ujját az ujjlenyomat-érzékelőhöz Az adatokat a(z) <ph name="DEVICE_TYPE" /> biztonságosan tárolja, és soha nem kerülnek ki az eszközről.</translation> @@ -7833,6 +7863,7 @@ <translation id="8557022314818157177">Érintse meg többször a biztonsági kulcsot, amíg meg nem történik az ujjlenyomat rögzítése.</translation> <translation id="8557180006508471423">Kapcsolja be a „Google Chrome” böngészőt Mac típusú számítógépének Helyszolgáltatások menüjében.</translation> <translation id="8557856025359704738">A következő letöltés ideje: <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">Azonosítókulcsok</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Összes megnyitása &új ablakban}=1{Megnyitás &új ablakban}other{Összes ({COUNT}) megnyitása &új ablakban}}</translation> <translation id="8561206103590473338">Elefánt</translation> <translation id="8561565784790166472">Körültekintően járjon el</translation> @@ -7959,6 +7990,7 @@ <translation id="8677212948402625567">Összes listanézete...</translation> <translation id="867767487203716855">Következő frissítés</translation> <translation id="8677859815076891398">Nincs album. Hozzon létre albumot a <ph name="LINK_BEGIN" />Google Fotókban<ph name="LINK_END" />.</translation> +<translation id="8678378565142776698">Újraindítás és automatikus frissítések fogadása</translation> <translation id="8678538439778360739">Az adatok titkosítva lettek az Ön összetett szinkronizálási jelszavával ekkor: <ph name="TIME" />. Ez nem tartalmazza a Google Pay szolgáltatásban megadott fizetési módokat és címeket.</translation> <translation id="8678582529642151449">A lapok nem zsugorodnak össze</translation> <translation id="8678933587484842200">Hogyan szeretné elindítani ezt az alkalmazást?</translation> @@ -8205,6 +8237,7 @@ <translation id="8910987510378294980">Eszközlista elrejtése</translation> <translation id="8912362522468806198">Google Fiókjába</translation> <translation id="8912810933860534797">Automatikus keresés engedélyezése</translation> +<translation id="8915307125957890427">Kattintson jobb gombbal valamelyik lapfülre, és válassza a „Lap hozzáadása csoporthoz”, majd az „Új csoport” lehetőséget.</translation> <translation id="8915370057835397490">Javaslatok betöltése</translation> <translation id="8916476537757519021">Inkognitó subframe: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> – <ph name="DEVICE_TYPE" /></translation> @@ -8265,6 +8298,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{„<ph name="TAB_TITLE" />”}=1{„<ph name="TAB_TITLE" />” és 1 másik lap}other{„<ph name="TAB_TITLE" />” és # másik lap}}</translation> <translation id="8977811652087512276">Hibás jelszó vagy sérült fájl</translation> <translation id="8978154919215542464">Be – az összes szinkronizálása</translation> +<translation id="8978670037548431647">Internetmegosztási lehetőségek frissítése</translation> <translation id="897939795688207351">Itt: <ph name="ORIGIN" /></translation> <translation id="8980345560318123814">Visszajelzési jelentések</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> – Összeomlott</translation> @@ -8278,6 +8312,7 @@ <translation id="8986362086234534611">Elfelejt</translation> <translation id="8986494364107987395">Használati statisztikák és hibajelentések automatikus küldése a Google-nak</translation> <translation id="8987927404178983737">hónap</translation> +<translation id="8989359959810288806">Az internetmegosztás állapotának frissítése</translation> <translation id="8991520179165052608">A webhely használhatja a mikrofonját</translation> <translation id="899384117894244799">Korlátozott felhasználó eltávolítása</translation> <translation id="899403249577094719">Netscape tanúsítvány - alap URL</translation> @@ -8529,6 +8564,7 @@ <translation id="935854577147268200">A Smart Lock funkcióval használt telefon megváltozott. Adja meg jelszavát a Smart Lock frissítéséhez. Legközelebb a telefonjával oldhatja fel <ph name="DEVICE_TYPE" /> eszköze lezárását. A Smart Lock funkciót a Beállításokban kapcsolhatja ki.</translation> <translation id="936646668635477464">Kamera és mikrofon</translation> <translation id="936801553271523408">Rendszerdiagnosztikai adatok</translation> +<translation id="937053962468712792">Eltávolítja a következőt a(z) <ph name="PRIMARY_EMAIL" /> fiókból: <ph name="DEVICE" />?</translation> <translation id="93766956588638423">Bővítmény javítása</translation> <translation id="938568644810664664">Próbálja például, hogy „Ok, Google what song is this” (Ok Google, mi ez a szám?), vagy azt, hogy „Ok Google, what's on my screen?” (Ok Google, mi látható a képernyőn?)</translation> <translation id="938623846785894166">Szokatlan fájl</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index 3c655d6..16718d90 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -906,6 +906,7 @@ <translation id="1829129547161959350">Penguin</translation> <translation id="1829192082282182671">Per&kecil</translation> <translation id="1830550083491357902">Belum masuk</translation> +<translation id="1831848493690504725">Kami tidak dapat menjangkau Google melalui jaringan yang terhubung. Coba pilih jaringan lain atau periksa setelan jaringan atau setelan proxy Anda (jika Anda menggunakan proxy).</translation> <translation id="1832459821645506983">Ya, saya setuju</translation> <translation id="1832511806131704864">Perubahan ponsel diperbarui</translation> <translation id="1832848789136765277">Untuk memastikan Anda selalu dapat mengakses data yang disinkronkan, verifikasi diri Anda</translation> @@ -2208,6 +2209,7 @@ <translation id="3021065318976393105">Saat menggunakan baterai</translation> <translation id="3021066826692793094">Kupu-kupu</translation> <translation id="3021678814754966447">&Lihat Sumber Bingkai</translation> +<translation id="3022361196600037287"><ph name="DEVICE" /> akan dihapus dari Chromebook ini dan tidak akan disimpan ke <ph name="PRIMARY_EMAIL" />.</translation> <translation id="3022978424994383087">Tidak mengerti.</translation> <translation id="3023464535986383522">Klik untuk Diucapkan</translation> <translation id="3024374909719388945">Gunakan model waktu 24 jam</translation> @@ -3747,6 +3749,7 @@ <translation id="4535127706710932914">Profil Default</translation> <translation id="4535767533210902251">Sensor sidik jari adalah tombol di sebelah kanan atas pada keyboard Anda. Sentuh sensornya menggunakan jari apa pun.</translation> <translation id="4536140153723794651">Situs yang selalu bisa menggunakan cookie</translation> +<translation id="4536769240747010177">Kemampuan Tethering:</translation> <translation id="4538417792467843292">Hapus kata</translation> <translation id="4538792345715658285">Dipasang oleh kebijakan perusahaan.</translation> <translation id="4541123282641193691">Tidak dapat memverifikasi akun Anda. Coba lagi atau mulai ulang Chromebook.</translation> @@ -3774,6 +3777,7 @@ <translation id="4561893854334016293">Tidak ada izin yang diubah baru-baru ini</translation> <translation id="4562155214028662640">Tambahkan Sidik Jari</translation> <translation id="4563210852471260509">Bahasa masukan awal adalah Aksara China</translation> +<translation id="4563382028841851106">Hapus dari akun</translation> <translation id="4563880231729913339">Jari 3</translation> <translation id="4564245002465020751">Selesaikan penyiapan di ponsel</translation> <translation id="4565377596337484307">Sembunyikan sandi</translation> @@ -4750,6 +4754,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> ingin</translation> <translation id="5534304873398226603">Hapus foto atau video</translation> <translation id="5537725057119320332">Transmisikan</translation> +<translation id="5539070192556911367">Tidak dapat terhubung ke Google</translation> <translation id="5539221284352502426">Sandi yang Anda masukkan ditolak oleh server. Kemungkinan alasannya adalah: Sandi terlalu pendek. Sandi harus menyertakan angka atau simbol. Sandi harus berbeda dari sandi sebelumnya.</translation> <translation id="5541694225089836610">Tindakan dinonaktifkan oleh administrator Anda</translation> <translation id="5542132724887566711">Profil</translation> @@ -4813,6 +4818,7 @@ <translation id="5585912436068747822">Pemformatan gagal</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Memuat aplikasi...</translation> +<translation id="5590418976913374224">Putar suara saat perangkat dinyalakan</translation> <translation id="5592595402373377407">Data yang tersedia belum cukup.</translation> <translation id="5595307023264033512">Total penyimpanan yang digunakan oleh situs: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">Edit alamat</translation> @@ -6190,6 +6196,10 @@ <translation id="6943939122536910181">Terputus dari <ph name="DEVICE" /></translation> <translation id="6945221475159498467">Pilih</translation> <translation id="694592694773692225">Pengalihan diblokir di halaman ini.</translation> +<translation id="6947015141909171112">Anda melihat resep berdasarkan Aktivitas penelusuran terbaru Anda terkait resep. + <ph name="BREAK" /> + <ph name="BREAK" /> + Anda dapat mengelola setelan dari menu kartu atau melihat opsi lainnya di Sesuaikan Chrome.</translation> <translation id="6949434160682548041">Sandi (opsional)</translation> <translation id="6950627417367801484">Pulihkan aplikasi</translation> <translation id="6952242901357037157">Anda juga dapat menampilkan sandi dari <ph name="BEGIN_LINK" />Akun Google<ph name="END_LINK" /> Anda di sini</translation> @@ -6357,6 +6367,7 @@ <translation id="7102687220333134671">Update otomatis diaktifkan</translation> <translation id="7102832101143475489">Waktu permintaan habis</translation> <translation id="710640343305609397">Buka setelan jaringan</translation> +<translation id="7107609441453408294">Putar audio yang sama melalui semua speaker</translation> <translation id="7108338896283013870">Sembunyikan</translation> <translation id="7108668606237948702">masuk</translation> <translation id="7108933416628942903">Kunci sekarang</translation> @@ -6587,6 +6598,7 @@ <translation id="7364745943115323529">Transmisi...</translation> <translation id="7364796246159120393">Pilih File</translation> <translation id="7365076891350562061">Ukuran monitor</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" /> - Disematkan</translation> <translation id="7366316827772164604">Memindai perangkat di sekitar ...</translation> <translation id="7366415735885268578">Tambahkan situs</translation> <translation id="7366909168761621528">Data browsing</translation> @@ -6983,6 +6995,7 @@ <translation id="7737115349420013392">Menyambungkan dengan "<ph name="DEVICE_NAME" />" ...</translation> <translation id="7737846262459425222">Anda dapat mengubahnya kapan saja di Setelan > Asisten Google > Konteks layar.</translation> <translation id="7737948071472253612">Tidak diizinkan menggunakan kamera Anda</translation> +<translation id="77381465218432215">Tampilkan tanda aksen dan karakter khusus</translation> <translation id="7740996059027112821">Standar</translation> <translation id="7741307896921365578">Mengaktifkan panel samping tingkat browser untuk cara akses Daftar Bacaan dan Bookmark yang berguna dan persisten.</translation> <translation id="7742558784808143689">Hapus data situs dan izin untuk <ph name="SITE_NAME" />, semua situs di bawahnya, dan aplikasi terinstal?</translation> @@ -7773,6 +7786,7 @@ <translation id="8486666913807228950">Alasan: Aturan terbalik <ph name="REVERT_RULE" /> ditemukan dalam daftar "Buka paksa di".</translation> <translation id="848666842773560761">Sebuah aplikasi sedang mencoba mengakses kamera. Nonaktifkan tombol mode privasi kamera untuk mengizinkan akses.</translation> <translation id="8487678622945914333">Perbesar</translation> +<translation id="8487699605742506766">Hotspot</translation> <translation id="8489156414266187072">Saran pribadi hanya ditampilkan di akun Anda</translation> <translation id="8490896350101740396">Aplikasi kios "<ph name="UPDATED_APPS" />" berikut telah diperbarui. Booting ulang perangkat untuk menyelesaikan proses pembaruan.</translation> <translation id="8492685019009920170">Sentuh sensor sidik jari dengan jari Anda. Data Anda disimpan dengan aman dan hanya ada di <ph name="DEVICE_TYPE" />.</translation> @@ -8266,6 +8280,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" dan 1 tab lainnya}other{"<ph name="TAB_TITLE" />" dan # tab lainnya}}</translation> <translation id="8977811652087512276">Sandi salah atau file rusak</translation> <translation id="8978154919215542464">Aktif - sinkronkan semuanya</translation> +<translation id="8978670037548431647">Refresh Kemampuan Tethering</translation> <translation id="897939795688207351">Di <ph name="ORIGIN" /></translation> <translation id="8980345560318123814">Laporan masukan</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> - Mogok</translation> @@ -8530,6 +8545,7 @@ <translation id="935854577147268200">Ponsel Smart Lock diubah. Masukkan sandi Anda untuk memperbarui Smart Lock. Saat digunakan lagi, ponsel Anda akan membuka kunci <ph name="DEVICE_TYPE" /> ini. Anda dapat menonaktifkan Smart Lock di Setelan</translation> <translation id="936646668635477464">Kamera & mikrofon</translation> <translation id="936801553271523408">Data diagnosis sistem</translation> +<translation id="937053962468712792">Hapus <ph name="DEVICE" /> dari <ph name="PRIMARY_EMAIL" />?</translation> <translation id="93766956588638423">Perbaiki ekstensi</translation> <translation id="938568644810664664">Coba “Ok Google, lagu apa ini?” atau “Ok Google, konten apa yang ada di layar saya?”</translation> <translation id="938623846785894166">File tidak biasa</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index c9757c80..364b625 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -2194,6 +2194,7 @@ <translation id="3021065318976393105">Durante l'utilizzo della batteria</translation> <translation id="3021066826692793094">Farfalla</translation> <translation id="3021678814754966447">&Visualizza sorgente frame</translation> +<translation id="3022361196600037287">Il dispositivo <ph name="DEVICE" /> verrà rimosso da questo Chromebook e non verrà salvato in <ph name="PRIMARY_EMAIL" />.</translation> <translation id="3022978424994383087">Non ho capito.</translation> <translation id="3023464535986383522">Seleziona per ascoltare</translation> <translation id="3024374909719388945">Usa orologio 24 ore</translation> @@ -3732,6 +3733,7 @@ <translation id="4535127706710932914">Profilo predefinito</translation> <translation id="4535767533210902251">Il sensore di impronte digitali è il tasto in alto a destra della tastiera. Toccalo leggermente con un dito.</translation> <translation id="4536140153723794651">Siti che possono usare sempre i cookie</translation> +<translation id="4536769240747010177">Funzionalità di tethering:</translation> <translation id="4538417792467843292">Elimina parola</translation> <translation id="4538792345715658285">Installata per norma aziendale.</translation> <translation id="4541123282641193691">Impossibile verificare l'account. Riprova o riavvia il tuo Chromebook.</translation> @@ -3759,6 +3761,7 @@ <translation id="4561893854334016293">Nessuna autorizzazione modificata di recente</translation> <translation id="4562155214028662640">Aggiungi impronta digitale</translation> <translation id="4563210852471260509">La lingua di input iniziale è il cinese</translation> +<translation id="4563382028841851106">Rimuovi dall'account</translation> <translation id="4563880231729913339">Dito 3</translation> <translation id="4564245002465020751">Completa la configurazione sul telefono</translation> <translation id="4565377596337484307">Nascondi password</translation> @@ -5372,7 +5375,7 @@ <translation id="6163363155248589649">&Normale</translation> <translation id="6163376401832887457">Impostazioni Kerberos</translation> <translation id="6163522313638838258">Espandi tutto...</translation> -<translation id="6165508094623778733">Ulteriori informazioni</translation> +<translation id="6165508094623778733">Scopri di più</translation> <translation id="6166185671393271715">Importa le password in Chrome</translation> <translation id="6169040057125497443">Controlla il microfono.</translation> <translation id="6169967265765719844">È possibile gestire le autorizzazioni per app e giochi installati tramite Steam nelle <ph name="LINK_BEGIN" />impostazioni dell'app Steam<ph name="LINK_END" />.</translation> @@ -6174,6 +6177,10 @@ <translation id="6943939122536910181">Disconnesso da <ph name="DEVICE" /></translation> <translation id="6945221475159498467">Seleziona</translation> <translation id="694592694773692225">Reindirizzamento bloccato in questa pagina.</translation> +<translation id="6947015141909171112">Le ricette ti vengono mostrate in base alla tua attività di ricerca di ricette recente. + <ph name="BREAK" /> + <ph name="BREAK" /> + Puoi gestire le impostazioni dal menu della scheda o visualizzare altre opzioni in Personalizza Chrome.</translation> <translation id="6949434160682548041">Password (facoltativa)</translation> <translation id="6950627417367801484">Ripristina le app</translation> <translation id="6952242901357037157">Puoi visualizzare le password del tuo <ph name="BEGIN_LINK" />Account Google<ph name="END_LINK" /> anche qui</translation> @@ -6969,6 +6976,7 @@ <translation id="7737115349420013392">Accoppiamento con "<ph name="DEVICE_NAME" />"…</translation> <translation id="7737846262459425222">Puoi modificare questa preferenza in qualsiasi momento in Impostazioni > Assistente Google > Contesto dello schermo.</translation> <translation id="7737948071472253612">Non possono utilizzare la videocamera</translation> +<translation id="77381465218432215">Mostra lettere accentate e caratteri speciali</translation> <translation id="7740996059027112821">Standard</translation> <translation id="7741307896921365578">Attiva un riquadro laterale a livello di browser che offre un modo utile e comodo di accedere ai contenuti in Elenco di lettura e Segnalibri.</translation> <translation id="7742558784808143689">Cancellare le autorizzazioni e i dati dei siti per <ph name="SITE_NAME" />, tutti i siti al di sotto e le app installate?</translation> @@ -7719,7 +7727,7 @@ <translation id="8440630305826533614">App Linux</translation> <translation id="844063558976952706">Sempre su questo sito</translation> <translation id="8443795068008423036">Assicurati che il dispositivo sia aggiornato e riprova</translation> -<translation id="8446884382197647889">Ulteriori informazioni</translation> +<translation id="8446884382197647889">Scopri di più</translation> <translation id="8447409163267621480">Includi CTRL o ALT</translation> <translation id="844850004779619592">Nessun comando trovato</translation> <translation id="8448729345478502352">Ingrandisci o rimpicciolisci gli elementi sullo schermo</translation> @@ -7759,6 +7767,7 @@ <translation id="8486666913807228950">Motivo: la regola invertita <ph name="REVERT_RULE" /> è stata rilevata nell'elenco "Forza l'apertura in".</translation> <translation id="848666842773560761">Un'app sta tentando di accedere alla videocamera. Disattiva l'opzione Privacy videocamera per consentire l'accesso.</translation> <translation id="8487678622945914333">Ingrandisci</translation> +<translation id="8487699605742506766">Hotspot</translation> <translation id="8489156414266187072">I suggerimenti personali vengono mostrati soltanto nel tuo account</translation> <translation id="8490896350101740396">Le seguenti app kiosk "<ph name="UPDATED_APPS" />" sono state aggiornate. Riavvia il dispositivo per completare la procedura di aggiornamento.</translation> <translation id="8492685019009920170">Tocca il sensore di impronte digitali con il dito. I tuoi dati vengono memorizzati in modo sicuro e non possono essere trasferiti in alcun modo dal tuo <ph name="DEVICE_TYPE" />.</translation> @@ -8032,7 +8041,7 @@ <translation id="8757203080302669031">Questa scheda sta eseguendo attivamente la ricerca dei dispositivi Bluetooth.</translation> <translation id="8757368836647541092">Utente <ph name="USER_NAME_OR_EMAIL" /> rimosso</translation> <translation id="8758418656925882523">Attiva dettatura (parla per digitare)</translation> -<translation id="8759753423332885148">Ulteriori informazioni.</translation> +<translation id="8759753423332885148">Scopri di più.</translation> <translation id="8761945298804995673">Questo utente esiste già</translation> <translation id="8762886931014513155">Il dispositivo <ph name="DEVICE_TYPE" /> richiede un aggiornamento</translation> <translation id="8763927697961133303">Dispositivo USB</translation> @@ -8252,6 +8261,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" e 1 altra scheda}other{"<ph name="TAB_TITLE" />" e altre # schede}}</translation> <translation id="8977811652087512276">Password errata o file danneggiato</translation> <translation id="8978154919215542464">On: sincronizza tutto</translation> +<translation id="8978670037548431647">Aggiorna funzionalità di tethering</translation> <translation id="897939795688207351">Su <ph name="ORIGIN" /></translation> <translation id="8980345560318123814">Report di feedback</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> - Bloccata</translation> @@ -8516,6 +8526,7 @@ <translation id="935854577147268200">Telefono con Smart Lock cambiato. Inserisci la password per aggiornare Smart Lock. La prossima volta potrai usare il tuo telefono per sbloccare il dispositivo <ph name="DEVICE_TYPE" />. Puoi disattivare Smart Lock nelle Impostazioni</translation> <translation id="936646668635477464">Videocamera e microfono</translation> <translation id="936801553271523408">Dati diagnostica di sistema</translation> +<translation id="937053962468712792">Vuoi rimuovere <ph name="DEVICE" /> da <ph name="PRIMARY_EMAIL" />?</translation> <translation id="93766956588638423">Ripara estensione</translation> <translation id="938568644810664664">Prova "Hey Google, qual è il titolo di questa canzone?" oppure "Hey Google, cosa c'è sul mio schermo?"</translation> <translation id="938623846785894166">File insolito</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index 7d060602..7e2c3e88 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -894,6 +894,7 @@ <translation id="1829129547161959350">ペンギン</translation> <translation id="1829192082282182671">縮小(&O)</translation> <translation id="1830550083491357902">ログインしていません</translation> +<translation id="1831848493690504725">接続されたネットワーク経由で Google に接続できません。別のネットワークを選択するか、ネットワーク設定またはプロキシ設定(プロキシを使用している場合)を確認してください。</translation> <translation id="1832459821645506983">同意する</translation> <translation id="1832511806131704864">スマートフォンの変更が反映されました</translation> <translation id="1832848789136765277">同期データに常にアクセスできるようにするには、本人確認を行ってください</translation> @@ -2187,6 +2188,7 @@ <translation id="3021065318976393105">バッテリー駆動時</translation> <translation id="3021066826692793094">蝶</translation> <translation id="3021678814754966447">フレームのソースを表示(&V)</translation> +<translation id="3022361196600037287"><ph name="DEVICE" /> がこの Chromebook から削除され、<ph name="PRIMARY_EMAIL" /> には保存されません。</translation> <translation id="3022978424994383087">聞き取れませんでした。</translation> <translation id="3023464535986383522">選択して読み上げ</translation> <translation id="3024374909719388945">24 時間形式を使用する</translation> @@ -3720,6 +3722,7 @@ <translation id="4535127706710932914">デフォルトのプロフィール</translation> <translation id="4535767533210902251">指紋認証センサーはキーボードの右上のキーに搭載されています。いずれかの指で軽く触れてください。</translation> <translation id="4536140153723794651">常に Cookie を使用できるサイト</translation> +<translation id="4536769240747010177">テザリング機能:</translation> <translation id="4538417792467843292">1 語削除する</translation> <translation id="4538792345715658285">会社のポリシーによってインストール済み。</translation> <translation id="4541123282641193691">アカウントを確認できませんでした。もう一度お試しになるか、Chromebook を再起動してください。</translation> @@ -3747,6 +3750,7 @@ <translation id="4561893854334016293">最近変更した権限はありません</translation> <translation id="4562155214028662640">指紋を追加</translation> <translation id="4563210852471260509">初期の入力言語を中国語にする</translation> +<translation id="4563382028841851106">アカウントから削除</translation> <translation id="4563880231729913339">指 3</translation> <translation id="4564245002465020751">スマートフォンで設定を完了</translation> <translation id="4565377596337484307">パスワードを表示しない</translation> @@ -4720,6 +4724,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> が次の許可を求めています</translation> <translation id="5534304873398226603">写真または動画を破棄</translation> <translation id="5537725057119320332">キャスト</translation> +<translation id="5539070192556911367">Google に接続できません</translation> <translation id="5539221284352502426">入力したパスワードはサーバーによって拒否されました。考えられる原因は次のとおりです。パスワードが短すぎる。パスワードに数字または記号が含まれていない。以前と同じパスワードを指定した。</translation> <translation id="5541694225089836610">操作が管理者によって無効にされています</translation> <translation id="5542132724887566711">プロフィール</translation> @@ -4783,6 +4788,7 @@ <translation id="5585912436068747822">フォーマット エラー</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">アプリを読み込んでいます...</translation> +<translation id="5590418976913374224">デバイスの起動時に音を鳴らす</translation> <translation id="5592595402373377407">利用可能なデータがまだ十分にありません。</translation> <translation id="5595307023264033512">サイトの合計ストレージ使用状況: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">住所の編集</translation> @@ -6155,6 +6161,10 @@ <translation id="6943939122536910181"><ph name="DEVICE" /> との接続を解除しました</translation> <translation id="6945221475159498467">選択</translation> <translation id="694592694773692225">このページでリダイレクトがブロックされました。</translation> +<translation id="6947015141909171112">最近の検索アクティビティに基づくレシピが表示されています。 + <ph name="BREAK" /> + <ph name="BREAK" /> + カードメニューから設定を管理することや、[Chrome をカスタマイズ] でその他のオプションを見ることができます。</translation> <translation id="6949434160682548041">パスワード(任意)</translation> <translation id="6950627417367801484">アプリを復元</translation> <translation id="6952242901357037157"><ph name="BEGIN_LINK" />Google アカウント<ph name="END_LINK" />に保存したパスワードもここに表示できます</translation> @@ -6322,6 +6332,7 @@ <translation id="7102687220333134671">自動更新が有効です</translation> <translation id="7102832101143475489">リクエストがタイムアウトになりました</translation> <translation id="710640343305609397">ネットワーク設定を開く</translation> +<translation id="7107609441453408294">すべてのスピーカーで同じオーディオを再生する</translation> <translation id="7108338896283013870">非表示</translation> <translation id="7108668606237948702">Enter</translation> <translation id="7108933416628942903">今すぐロック</translation> @@ -6551,6 +6562,7 @@ <translation id="7364745943115323529">キャスト...</translation> <translation id="7364796246159120393">ファイルを選択</translation> <translation id="7365076891350562061">モニターサイズ</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" /> - 固定済み</translation> <translation id="7366316827772164604">付近のデバイスをスキャンしています…</translation> <translation id="7366415735885268578">サイトの追加</translation> <translation id="7366909168761621528">閲覧履歴データ</translation> @@ -6947,6 +6959,7 @@ <translation id="7737115349420013392">「<ph name="DEVICE_NAME" />」とペア設定しています…</translation> <translation id="7737846262459425222">この設定は、[設定] > [Google アシスタント] > [画面のコンテキスト] でいつでも変更できます。</translation> <translation id="7737948071472253612">カメラの使用を許可しないサイト</translation> +<translation id="77381465218432215">アクセント記号と特殊文字を表示</translation> <translation id="7740996059027112821">標準</translation> <translation id="7741307896921365578">ブラウザレベルのサイドパネルを有効にすると、リーディング リストやブックマークにいつでもすばやくアクセスできます。</translation> <translation id="7742558784808143689"><ph name="SITE_NAME" /> とその下にあるすべてのサイトのサイトデータと権限、およびインストール済みのアプリを削除しますか?</translation> @@ -7735,6 +7748,7 @@ <translation id="8486666913807228950">理由: 反転ルール <ph name="REVERT_RULE" /> が「次で強制的に開く」のリストに含まれています。</translation> <translation id="848666842773560761">アプリがカメラにアクセスしようとしています。アクセスを許可するには、カメラのプライバシー スイッチをオフにしてください。</translation> <translation id="8487678622945914333">拡大</translation> +<translation id="8487699605742506766">アクセス ポイント</translation> <translation id="8489156414266187072">候補はお客様のアカウントにのみ表示されます</translation> <translation id="8490896350101740396">キオスクアプリ「<ph name="UPDATED_APPS" />」を更新しました。更新処理を完了するためにデバイスを再起動してください。</translation> <translation id="8492685019009920170">指紋認証センサーに指を置いてください。お客様のデータは <ph name="DEVICE_TYPE" /> にのみ安全に保存されます。</translation> @@ -8228,6 +8242,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{「<ph name="TAB_TITLE" />」}=1{「<ph name="TAB_TITLE" />」と他 1 個のタブ}other{「<ph name="TAB_TITLE" />」と他 # 個のタブ}}</translation> <translation id="8977811652087512276">パスワードが間違っているか、ファイルが壊れています</translation> <translation id="8978154919215542464">オン - すべて同期</translation> +<translation id="8978670037548431647">テザリング機能を更新</translation> <translation id="897939795688207351"><ph name="ORIGIN" /></translation> <translation id="8980345560318123814">フィードバック レポート</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> - クラッシュしました</translation> @@ -8492,6 +8507,7 @@ <translation id="935854577147268200">Smart Lock に使用するスマートフォンが変更されました。パスワードを入力して Smart Lock を更新すると、次回から、新しいスマートフォンで <ph name="DEVICE_TYPE" /> のロックを解除できます。Smart Lock を無効にするには [設定] をご利用ください。</translation> <translation id="936646668635477464">カメラとマイク</translation> <translation id="936801553271523408">システム診断データ</translation> +<translation id="937053962468712792"><ph name="PRIMARY_EMAIL" /> から <ph name="DEVICE" /> を削除しますか?</translation> <translation id="93766956588638423">拡張機能を修復</translation> <translation id="938568644810664664">「OK Google, この曲はなに?」、「OK Google, 画面になにが表示されている?」のようにきいてみましょう。</translation> <translation id="938623846785894166">一般的ではないファイル</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index 219751a4..fa17811 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">გამოიყენეთ მიკროფონი და კამერა</translation> <translation id="1005333234656240382">გსურთ ADB გამართვის ჩართვა?</translation> <translation id="1006873397406093306">ამ გაფართოებას შეუძლია საიტებზე თქვენი მონაცემების წაკითხვა და შეცვლა. თქვენ შეგიძლიათ გააკონტროლოთ, თუ რომელ საიტებზე ექნება მას წვდომა.</translation> +<translation id="1007057452468855774">Google Play Store-ის ჩართვა</translation> <translation id="1008186147501209563">სანიშნეების ექსპორტი</translation> <translation id="1008557486741366299">ახლა არა</translation> <translation id="1009476156254802388"><ph name="WEB_DRIVE" /> მდებარეობა</translation> <translation id="1009663062402466586">ახლა ხელმისაწვდომია თამაშის მართვის საშუალებები</translation> <translation id="1010498023906173788">ეს ჩანართი დაკავშირებულია თანმიმდევრულ პორტთან.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{გვერდი არ პასუხობს}other{გვერდები არ პასუხობს}}</translation> +<translation id="1011003645819296594">შენახული მოწყობილობები</translation> <translation id="1011355516189274711">ტექსტის გახმოვანების ხმა</translation> <translation id="1012794136286421601">მიმდინარეობს თქვენი დოკუმენტების, ფურცლების, სლაიდების და ნახატების ფაილების სინქრონიზაცია. გახსენით Google Drive პროგრამა, რათა მიიღოთ წვდომა მათზე ონლაინში ან ოფლაინში.</translation> <translation id="1012876632442809908">USB-C მოწყობილობა (წინა პორტი)</translation> @@ -491,6 +493,7 @@ <translation id="1470350905258700113">ამ მოწყობილობის გამოყენება</translation> <translation id="1470946456740188591">კურსორით დათვალიერების ჩასართავად ან გამოსართავად გამოიყენეთ Ctrl+Search+7 მალსახმობი</translation> <translation id="1472675084647422956">მეტის ჩვენება</translation> +<translation id="1473223074251193484">ტეტერინგის კონფიგურირება</translation> <translation id="1474785664565228650">მიკროფონის პარამეტრის ეს ცვლილება მოითხოვს Parallels Desktop-ის ხელახლა გაშვებას. გასაგრძელებლად ხელახლა გაუშვით Parallels Desktop.</translation> <translation id="1474893630593443211">მეტი კონტროლი თქვენთვის ხილულ რეკლამაზე</translation> <translation id="1475502736924165259">თქვენ შენახული გაქვთ სერტიფიკატები, რომლებიც არცერთ სხვა კატეგორიას არ ერგება</translation> @@ -1113,6 +1116,7 @@ <translation id="2044014337866019681">სესიის განსაბლოკად დარწმუნდით, რომ <ph name="ACCOUNT" />-ის დადასტურებას ცდილობთ.</translation> <translation id="204497730941176055">Microsoft-ის სერტიფიკატის შაბლონის სახელი</translation> <translation id="2045117674524495717">კლავიატურის მალსახმობების დამხმარე ხელსაწყო</translation> +<translation id="2045211794962848221">ამ კონკრეტულ შეტყობინებას აღარ დაინახავთ</translation> <translation id="2045969484888636535">ქუქის დაბლოკვის გაგრძელება</translation> <translation id="204622017488417136">თქვენი მოწყობილობა დაბრუნდება Chrome-ის თავდაპირველ ვერსიაზე. ყველა მომხმარებლის ანგარიში და თანმხლები მონაცემები წაიშლება. ეს შეუქცევადია.</translation> <translation id="2046702855113914483">რამენი</translation> @@ -2194,6 +2198,7 @@ <translation id="3021065318976393105">ბატარეით მუშაობისას</translation> <translation id="3021066826692793094">პეპელა</translation> <translation id="3021678814754966447">ჩარჩოს წყაროს &ნახვა</translation> +<translation id="3022361196600037287"><ph name="DEVICE" /> ამოიშლება ამ Chromebook-იდან და არ შეინახება <ph name="PRIMARY_EMAIL" />-ში.</translation> <translation id="3022978424994383087">წარმოთქმულის აღქმა ვერ მოხერხდა.</translation> <translation id="3023464535986383522">მონიშვნა წარმოსათქმელად</translation> <translation id="3024374909719388945">24-საათიანი ფორმატის გამოყენება</translation> @@ -3732,6 +3737,7 @@ <translation id="4535127706710932914">ნაგულისხმევი პროფილი</translation> <translation id="4535767533210902251">თითის ანაბეჭდის სენსორი არის კლავიში, რომელიც მდებარეობს თქვენი კლავიატურის ზედა მარჯვენა კუთხეში. შეეხეთ მას მსუბუქად ნებისმიერი თითით.</translation> <translation id="4536140153723794651">საიტები, რომლებსაც ყოველთვის შეუძლია ქუქი-ჩანაწერების გამოყენება</translation> +<translation id="4536769240747010177">ტეტერინგის შესაძლებლობები:</translation> <translation id="4538417792467843292">სიტყვის წაშლა</translation> <translation id="4538792345715658285">დაყენებულია ორგანიზაციის პოლიტიკის შესაბამისად.</translation> <translation id="4541123282641193691">თქვენი ანგარიში ვერ დადასტურდა. ცადეთ ხელახლა ან გადატვირთეთ თქვენი Chromebook.</translation> @@ -3759,6 +3765,7 @@ <translation id="4561893854334016293">ბოლო დროს შეცვლილი ნებართვები არ არის</translation> <translation id="4562155214028662640">თითის ანაბეჭდის დამატება</translation> <translation id="4563210852471260509">საწყისი შეტანის ენაა ჩინური</translation> +<translation id="4563382028841851106">ანგარიშიდან ამოშლა</translation> <translation id="4563880231729913339">თითის ანაბეჭდი 3</translation> <translation id="4564245002465020751">დაასრულეთ თქვენი ტელეფონის დაყენება</translation> <translation id="4565377596337484307">პაროლის დამალვა</translation> @@ -3795,6 +3802,7 @@ <translation id="4594577641390224176">სისტემის ინფორმაციის გვერდს ეძებთ? მოინახულეთ</translation> <translation id="4595560905247879544">აპებისა და გაფართოებების შეცვლა მხოლოდ მმართველს (<ph name="CUSTODIAN_NAME" />) შეუძლია.</translation> <translation id="4596295440756783523">თქვენ შენახული გაქვთ სერტიფიკატები, რომლებიც ქვემოთ ჩამოთვლილი სერვერების ამოცნობას ახორციელებს</translation> +<translation id="4598345735110653698">წვდომის გასაღებების მართვა</translation> <translation id="4598556348158889687">მეხსიერების მართვა</translation> <translation id="4598776695426288251">რამდენიმე მოწყობილობა Wi-Fi კავშირს უზრუნველყოფს</translation> <translation id="4601426376352205922">წაუკითხავად მონიშვნა</translation> @@ -4020,6 +4028,7 @@ <translation id="4823894915586516138">ეს PIN-კოდი ან პაროლი იცავს თქვენს მონაცემებს ამ <ph name="DEVICE_TYPE" />-ზე, მათ შორის, ინფორმაციას, რომელზე წვდომაც გაქვთ თქვენი ტელეფონიდან</translation> <translation id="4824037980212326045">Linux-ის სარეზერვო ასლის შექმნა და აღდგენა</translation> <translation id="4824958205181053313">გსურთ სინქრონიზაციის გაუქმება?</translation> +<translation id="4825532258163983651">წვდომის გასაღების წაშლა ვერ მოხერხდა</translation> <translation id="4827675678516992122">დაკავშირება ვერ მოხერხდა</translation> <translation id="4827784381479890589">მართლწერის გაძლიერებული შემოწმება Chrome ბრაუზერში (ტექსტი გაეგზავნება Google-ს მართლწერასთან დაკავშირებული შემოთავაზებებისთვის)</translation> <translation id="4827904420700932487">ამ სურათისთვის QR კოდის შექმნა</translation> @@ -4282,6 +4291,7 @@ <translation id="5087249366037322692">დამატებულია მესამე მხარის მიერ</translation> <translation id="5087580092889165836">ბარათის დამატება</translation> <translation id="5088534251099454936">PKCS #1 SHA-512-ით RSA დაშიფვრა</translation> +<translation id="5089763948477033443">გვერდითი პანელის ზომის შეცვლის სახელური</translation> <translation id="5090637338841444533">თქვენი კამერის პოზიციისთვის თვალის მიდევნება დაუშვებელია</translation> <translation id="5093569275467863761">ქეშირებული ქვეფრეიმი უკან-წინ გადასვლის შესაძლებლობით: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">ამ აპის მეშვეობით შეგიძლიათ გახსნათ და დაარედაქტიროთ მხარდაჭერილი ფაილები ფაილების აპიდან ან სხვა აპებიდან. იმისთვის, რომ გააკონტროლოთ, ნაგულისხმევად რომელმა ფაილებმა გახსნას ეს აპი, <ph name="BEGIN_LINK" />შეიტყვეთ, როგორ დააყენოთ ნაგულისხმევი აპები თქვენს მოწყობილობაზე<ph name="END_LINK" />.</translation> @@ -4447,6 +4457,7 @@ <translation id="5258992782919386492">ინსტალაცია ამ მოწყობილობაზე</translation> <translation id="5260334392110301220">გონიერი ბრჭყალები</translation> <translation id="5260508466980570042">სამწუხაროდ, თქვენი ელფოსტის და პაროლის გადამოწმება ვერ მოხერხდა. ხელახლა სცადეთ.</translation> +<translation id="5260958083445173099">ვებსაიტები, შეძლებისდაგვარად, კონტენტს თქვენთვის სასურველ ენებზე გამოაჩენს.</translation> <translation id="5261683757250193089">Web Store-ში გახსნა</translation> <translation id="5262178194499261222">პაროლის ამოშლა</translation> <translation id="5262784498883614021">ქსელთან ავტომატური დაკავშირება</translation> @@ -4487,6 +4498,7 @@ <translation id="5294097441441645251">უნდა იწყებოდეს არამთავრული სიმბოლოთი ან ქვედახაზით</translation> <translation id="5294618183559481278">თქვენი <ph name="DEVICE_TYPE" /> იყენებს ჩაშენებულ სენსორს თქვენი მოწყობილობის წინ მყოფი ადამიანების აღმოსაჩენად. ყველა დაკავშირებული მონაცემი მყისიერად მუშავდება თქვენს მოწყობილობაზე, შემდეგ კი იშლება. სენსორის მონაცემები არასოდეს ეგზავნება Google-ს. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> <translation id="5296350763804564124">მოისმინეთ გახმოვანებული უკუკავშირი და გამოიყენეთ მოწყობილობა ეკრანზე ყურების საჭიროების გარეშე. ბრაილთან დაკავშირებული უკუკავშირი ხელმისაწვდომია დაკავშირებული მოწყობილობის მეშვეობით.</translation> +<translation id="5297005732522718715">ტეტერინგის კონფიგურაციის განახლება</translation> <translation id="5297082477358294722">პაროლი შენახულია. შენახული პაროლების ნახვა და მართვა შეგიძლიათ სექციაში „<ph name="SAVED_PASSWORDS_STORE" />“.</translation> <translation id="5297946558563358707">ეკრანის ქვედა მარჯვენა ნაწილში კონფიდენციალურობის თვალის ხატულის ჩვენება, როცა თქვენს ეკრანზე სხვაც იყურება</translation> <translation id="5298219193514155779">თემის ავტორი:</translation> @@ -4657,6 +4669,7 @@ <translation id="5466374726908360271">ჩა&სმა და „<ph name="SEARCH_TERMS" />“-ის ძიება</translation> <translation id="5467207440419968613">დაბლოკილია <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation> <translation id="5468173180030470402">მიმდინარეობს ფაილების გაზიარებების ძიება.</translation> +<translation id="5468330507528805311">ტეტერინგის სტატუსი:</translation> <translation id="5468881191994555667">ფაილის არჩევა</translation> <translation id="5469852975082458401">გვერდებზე ნავიგაცია ტექსტური კურსორის მეშვეობით შეგიძლიათ. გამოსართავად დააჭირეთ F7-ს.</translation> <translation id="5470735824776589490">გადატვირთვა საჭიროა, სანამ განხორციელდება თქვენი მოწყობილობის გადატვირთვა Powerwash-ით. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> @@ -4933,6 +4946,7 @@ <translation id="5734362860645681824">კომუნიკაციები</translation> <translation id="5734697361979786483">ფაილის გაზიარების დამატება</translation> <translation id="5736796278325406685">გთხოვთ, შეიყვანოთ სწორი მომხმარებლის სახელი</translation> +<translation id="5738093759615225354">წვდომის ეს გასაღები თქვენს კომპიუტერში შესასვლელად გჭირდებათ</translation> <translation id="5739017626473506901">შედით სისტემაში, რომ დაეხმაროთ <ph name="USER_NAME" />-ს სასწავლებლის ანგარიშის დამატებაში</translation> <translation id="5739235828260127894">დადასტურების მოლოდინში. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> <translation id="5739458112391494395">ძალიან დიდი</translation> @@ -5094,6 +5108,7 @@ <translation id="589541317545606110">გვერდში ძიება <ph name="VISUAL_SEARCH_PROVIDER" />-ით</translation> <translation id="5896436821193322561">არ დაიშვას</translation> <translation id="5900186025777217044">Smart Lock შეიცვალა</translation> +<translation id="5900243355162006650">ტეტერინგის კონფიგურაცია:</translation> <translation id="5900302528761731119">Google პროფილის ფოტო</translation> <translation id="590036993063074298">დეტალები არეკვლის ფუნქციის ხარისხის შესახებ</translation> <translation id="5901069264981746702">თქვენი თითის ანაბეჭდის მონაცემები უსაფრთხოდ შეინახება მხოლოდ და მხოლოდ თქვენს <ph name="DEVICE_TYPE" />-ზე. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> @@ -5397,6 +5412,7 @@ <translation id="6196640612572343990">მესამე მხარის ქუქი-ჩანაწერების დაბლოკვა</translation> <translation id="6196854373336333322">გაფართოება „<ph name="EXTENSION_NAME" />“ ახლა თქვენი პროქსის პარამეტრებს აკონტროლებს, რაც იმას ნიშნავს, რომ მას თქვენი ონლაინ საქმიანობის შეცვლა, შეწყვეტა ან მასზე ფარულად თვალთვალი შეუძლია. თუ ეს ცვლილება გაურკვეველი ხასიათისაა, შესაძლოა, იგი თქვენი ნებართვის გარეშე განხორციელდა.</translation> <translation id="6197128521826316819">ამ გვერდისთვის QR კოდის შექმნა</translation> +<translation id="6197223946499512637">წვდომის ეს გასაღებები ინახება Windows Hello-ში ამ კომპიუტერზე. ისინი არ ინახება თქვენს Google ანგარიშში.</translation> <translation id="6198252989419008588">შეცვალეთ PIN-ი</translation> <translation id="6200047250927636406">ფაილის წაშლა</translation> <translation id="6200151268994853226">გაფართოების მართვა</translation> @@ -5694,6 +5710,7 @@ <translation id="6482559668224714696">სრულეკრანიანი ლუპა</translation> <translation id="6483485061007832714">ჩამოტვირთვის გახსნა</translation> <translation id="6483805311199035658">იხსნება <ph name="FILE" />…</translation> +<translation id="6486301003991593638">წვდომის გასაღებების სამართავად გამოიყენეთ Windows-ის უფრო ახალი ვერსია</translation> <translation id="6488384360522318064">აირჩიეთ ენა</translation> <translation id="648927581764831596">არ არის ხელმისაწვდომი</translation> <translation id="6490471652906364588">USB-C მოწყობილობა (მარჯვენა პორტი)</translation> @@ -6177,6 +6194,10 @@ <translation id="6943939122536910181"><ph name="DEVICE" />-თან კავშირი გაწყვეტილია</translation> <translation id="6945221475159498467">არჩევა</translation> <translation id="694592694773692225">გადამისამართება დაიბლოკა ამ გვერდზე.</translation> +<translation id="6947015141909171112">რეცეპტებს ხედავთ რეცეპტებთან დაკავშირებული თქვენი ბოლოდროინდელი საძიებო აქტივობის საფუძველზე. + <ph name="BREAK" /> + <ph name="BREAK" /> + სურვილისამებრ, შეგიძლიათ მართოთ პარამეტრები ბარათის მენიუდან, ან გაეცნოთ მეტ ვარიანტს „Chrome-ის მორგების“ სექციიდან.</translation> <translation id="6949434160682548041">პაროლი (არასავალდებულო)</translation> <translation id="6950627417367801484">აპების აღდგენა</translation> <translation id="6952242901357037157">აქ შეგიძლიათ თქვენს <ph name="BEGIN_LINK" />Google ანგარიშში<ph name="END_LINK" /> შენახული პაროლების გამოჩენაც</translation> @@ -6276,6 +6297,7 @@ <translation id="7029307918966275733">Crostini არ არის დაინსტალირებული. გთხოვთ, დააინსტალიროთ Crostini, რათა იხილოთ კრედიტები.</translation> <translation id="7029809446516969842">პაროლები</translation> <translation id="7030304022046916278">URL-ები შესამოწმებლად გაეგზავნება Safe Browsing-ს</translation> +<translation id="7030695672997239647">მარჯვენა ღილაკით დააწკაპუნეთ ჩანართზე, აირჩიეთ „ჩანართის დამატება ჯგუფში“, შემდეგ კი — „ახალი ჯგუფი“</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> — დაკავშირებულია თანმიმდევრული პორტი</translation> <translation id="7033616203784997570">შენატანის სიგრძე უნდა იყოს მაქსიმუმ 62 სიმბოლო</translation> <translation id="7034692021407794547">პირველ რიგში, ბილინგის მართვის პრივილეგიების მქონე ადმინისტრატორი უნდა დაეთანხმოს Google Meet აპარატურის მომსახურების პირობებს, რომლებიც მოცემულია ადმინისტრატორის კონსოლის „Google Meet აპარატურის“ სექციაში.</translation> @@ -6972,6 +6994,7 @@ <translation id="7737115349420013392">მიმდინარეობს „<ph name="DEVICE_NAME" />“-თან დაწყვილება...</translation> <translation id="7737846262459425222">ამის შეცვლა ნებისმიერ დროს შეგიძლიათ აქ: პარამეტრები > Google ასისტენტი > ეკრანის კონტექსტი.</translation> <translation id="7737948071472253612">თქვენი კამერის გამოყენება დაუშვებელია</translation> +<translation id="77381465218432215">აქცენტის ნიშნებისა და საგანგებო სიმბოლოების ჩვენება</translation> <translation id="7740996059027112821">სტანდარტული</translation> <translation id="7741307896921365578">ჩართავს ბრაუზერის დონის გვერდით პანელს, თქვენს საკითხავ სიაზე და სანიშნეებზე სასარგებლო და მუდმივი წვდომის უზრუნველსაყოფად.</translation> <translation id="7742558784808143689">გსურთ, გაასუფთავოთ საიტების მონაცემები და ნებართვები როგორც <ph name="SITE_NAME" />-ის, ისე მასთან დაკავშირებული ყველა საიტისთვისა და დაინსტალირებული აპისთვის?</translation> @@ -7375,6 +7398,7 @@ <translation id="8101987792947961127">შემდეგი ჩატვირთვის დროს საჭიროა შესრულდეს განახლება</translation> <translation id="81020759409809034">ადგილობრივი მდებარეობა</translation> <translation id="8102139037507939978">system_logs.txt ფაილიდან პერსონალურად ამოცნობადი ინფორმაციის მოშორება.</translation> +<translation id="810362914482827094">წვდომის გასაღებების ძიება</translation> <translation id="8104088837833760645">eSIM-პროფილის ჩამოტვირთვა</translation> <translation id="8105368624971345109">გამორთვა</translation> <translation id="8107015733319732394">მიმდინარეობს Google Play Store-ის ინსტალაცია თქვენს <ph name="DEVICE_TYPE" />-ზე. ამას შეიძლება რამდენიმე წუთი დასჭირდეს.</translation> @@ -7760,6 +7784,7 @@ <translation id="8486666913807228950">მიზეზი: „ბრაუზერში იძულებით გახსნის“ სიაში მოიძებნა შებრუნებული წესი <ph name="REVERT_RULE" />.</translation> <translation id="848666842773560761">აპი ცდილობს კამერაზე წვდომას. წვდომის დასაშვებად გადაიყვანეთ კონფიდენციალურობის გადამრთველი გამორთულ მდგომარეობაზე.</translation> <translation id="8487678622945914333">მასშტაბის გადიდება</translation> +<translation id="8487699605742506766">უსადენო ქსელი</translation> <translation id="8489156414266187072">პერსონალური შემოთავაზებები ნაჩვენებია მხოლოდ თქვენს ანგარიშში</translation> <translation id="8490896350101740396">შემდეგი Kiosk აპები განახლდა: „<ph name="UPDATED_APPS" />“. განახლების პროცესის დასასრულებლად, გადატვირთეთ მოწყობილობა.</translation> <translation id="8492685019009920170">შეეხეთ თითის ანაბეჭდის სენსორს თითით. თქვენი მონაცემები უსაფრთხოდ შეინახება მხოლოდ და მხოლოდ თქვენს <ph name="DEVICE_TYPE" />-ზე.</translation> @@ -7821,6 +7846,7 @@ <translation id="8557022314818157177">გეჭიროთ თითი უსაფრთხოების გასაღებზე თითის ანაბეჭდის აღბეჭდვამდე</translation> <translation id="8557180006508471423">ჩართეთ „Google Chrome“ მდებარეობის სერვისებში თქვენს Mac-ზე</translation> <translation id="8557856025359704738">ჩამოტვირთვის მომდევნო თარიღია <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">წვდომის გასაღებები</translation> <translation id="8560327176991673955">{COUNT,plural, =0{ყველას ა&ხალ ფანჯარაში გახსნა}=1{ა&ხალ ფანჯარაში გახსნა}other{{COUNT}-ვეს ა&ხალ ფანჯარაში გახსნა}}</translation> <translation id="8561206103590473338">სპილო</translation> <translation id="8561565784790166472">გთხოვთ, გამოიჩინოთ სიფრთხილე</translation> @@ -7947,6 +7973,7 @@ <translation id="8677212948402625567">ყველას აკეცვა…</translation> <translation id="867767487203716855">შემდეგი განახლება</translation> <translation id="8677859815076891398">ალბომები არ არის. შექმენით ალბომები <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />-ში.</translation> +<translation id="8678378565142776698">გადატვირთვა და ავტომატური განახლებების მიღება</translation> <translation id="8678538439778360739"><ph name="TIME" />-ს მონაცემები დაიშიფრა თქვენი სინქრონიზაციის საიდუმლო ფრაზით. აღნიშნული არ მოიცავს Google Pay-ში შენახულ გადახდის მეთოდებსა და მისამართებს.</translation> <translation id="8678582529642151449">ჩანართები არ შევიწროვდება</translation> <translation id="8678933587484842200">რა გზით გსურთ ამ აპლიკაციის გაშვება?</translation> @@ -8193,6 +8220,7 @@ <translation id="8910987510378294980">მოწყობილობების სიის დამალვა</translation> <translation id="8912362522468806198">Google ანგარიში</translation> <translation id="8912810933860534797">ავტომატური სკანირების ჩართვა</translation> +<translation id="8915307125957890427">მარჯვენა ღილაკით დააწკაპუნეთ ჩანართზე, აირჩიეთ „ჩანართის დამატება ჯგუფში“, შემდეგ კი — „ახალი ჯგუფი“</translation> <translation id="8915370057835397490">შემოთავაზების ჩატვირთვა</translation> <translation id="8916476537757519021">ანონიმური ქვეჩარჩო: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" />-ის <ph name="DEVICE_TYPE" /></translation> @@ -8253,6 +8281,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{„<ph name="TAB_TITLE" />“}=1{„<ph name="TAB_TITLE" />“ და 1 სხვა ჩანართი}other{„<ph name="TAB_TITLE" />“ და # სხვა ჩანართი}}</translation> <translation id="8977811652087512276">პაროლი არასწორია, ან დაზიანებულია ფაილი</translation> <translation id="8978154919215542464">ჩართული — ყველაფრის სინქრონიზაცია</translation> +<translation id="8978670037548431647">ტეტერინგის შესაძლებლობების განახლება</translation> <translation id="897939795688207351"><ph name="ORIGIN" />-ზე</translation> <translation id="8980345560318123814">უკუკავშირის ანგარიშები</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> — ავარიულად გაითიშა</translation> @@ -8266,6 +8295,7 @@ <translation id="8986362086234534611">დავიწყება</translation> <translation id="8986494364107987395">გამოყენების სტატისტიკისა და შეცდომების შესახებ მოხსენებების ავტომატური გაგზავნა Google-ში</translation> <translation id="8987927404178983737">თვე</translation> +<translation id="8989359959810288806">ტეტერინგის სტატუსის განახლება</translation> <translation id="8991520179165052608">საიტს შეუძლია თქვენი მიკროფონის გამოყენება</translation> <translation id="899384117894244799">გსურთ შეზღუდული მომხმარებლის წაშლა?</translation> <translation id="899403249577094719">Netscape სერტიფიკატის ბაზის URL</translation> @@ -8517,6 +8547,7 @@ <translation id="935854577147268200">Smart Lock-ისთვის გამოყენებული ტელეფონი შეიცვალა. შეიყვანეთ თქვენი პაროლი Smart Lock-ის გასაახლებლად. შემდეგში <ph name="DEVICE_TYPE" /> განიბლოკება თქვენი ტელეფონის მეშვეობით. Smart Lock-ის გამორთვა შესაძლებელია პარამეტრებიდან.</translation> <translation id="936646668635477464">კამერა და მიკროფონი</translation> <translation id="936801553271523408">სისტემის დიაგნოსტიკის მონაცემები</translation> +<translation id="937053962468712792">გსურთ, <ph name="PRIMARY_EMAIL" />-დან ამოშალოთ <ph name="DEVICE" />?</translation> <translation id="93766956588638423">გაფართოების აღდგენა</translation> <translation id="938568644810664664">ცადეთ, იკითხოთ: „Ok Google, რა სიმღერაა?“ ან „Ok Google, რა არის ჩემს ეკრანზე?“</translation> <translation id="938623846785894166">არაგავრცელებული ფაილი</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index 5968dafa..9faa5c2 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -892,6 +892,7 @@ <translation id="1829129547161959350">Пингвин</translation> <translation id="1829192082282182671">Кішіре&йту</translation> <translation id="1830550083491357902">Жүйеге кірмеген</translation> +<translation id="1831848493690504725">Қосылған желі арқылы Google серверімен байланыс орната алмадық. Басқа желі таңдап, желі немесе прокси параметрлерін (егер прокси пайдаланып жатсаңыз) тексеріп көріңіз.</translation> <translation id="1832459821645506983">Жарайды</translation> <translation id="1832511806131704864">Телефон өзгерісі жаңартылды</translation> <translation id="1832848789136765277">Синхрондау деректерін әрдайым пайдалана алатыныңызға көз жеткізу үшін, жеке басыңызды растаңыз.</translation> @@ -2190,6 +2191,7 @@ <translation id="3021065318976393105">Батареямен істегенде</translation> <translation id="3021066826692793094">Көбелек</translation> <translation id="3021678814754966447">&Жақтау дереккөзін көру</translation> +<translation id="3022361196600037287"><ph name="DEVICE" /> осы Chromebook-тан өшіріледі, <ph name="PRIMARY_EMAIL" /> электрондық мекенжайына сақталмайды.</translation> <translation id="3022978424994383087">Түсініксіз.</translation> <translation id="3023464535986383522">Select to Speak</translation> <translation id="3024374909719388945">24 сағаттық пішімді пайдалану</translation> @@ -3728,6 +3730,7 @@ <translation id="4535127706710932914">Әдепкі профиль</translation> <translation id="4535767533210902251">Саусақ ізін оқу сканері – пернетақтаның оң жақ жоғарғы пернесі. Оны кез келген саусағыңызбен тексеріңіз.</translation> <translation id="4536140153723794651">Cookie файлдарын кез келген уақытта пайдалана алатын сайттар</translation> +<translation id="4536769240747010177">Тетеринг мүмкіндіктері:</translation> <translation id="4538417792467843292">Сөзді жою</translation> <translation id="4538792345715658285">Кәсіпорын саясаты бойынша орнатылған.</translation> <translation id="4541123282641193691">Аккаунтыңыз расталмады. Әрекетті қайталаңыз немесе Chromebook құрылғыңызды қайта жүктеңіз.</translation> @@ -3755,6 +3758,7 @@ <translation id="4561893854334016293">Жақында өзгертілген рұқсаттар жоқ</translation> <translation id="4562155214028662640">Саусақ ізін қосу</translation> <translation id="4563210852471260509">Қытай тіліндегі бастапқы енгізу тілі</translation> +<translation id="4563382028841851106">Аккаунттан жою</translation> <translation id="4563880231729913339">3-ші саусақ</translation> <translation id="4564245002465020751">Телефонда орнатуды аяқтау</translation> <translation id="4565377596337484307">Құпия сөзді жасыру</translation> @@ -4731,6 +4735,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> үшін қажетті әрекеттер:</translation> <translation id="5534304873398226603">Фотосурет не бейне жойылсын ба?</translation> <translation id="5537725057119320332">Cast</translation> +<translation id="5539070192556911367">Google серверіне қосылу мүмкін емес</translation> <translation id="5539221284352502426">Енгізген құпия сөзіңізді сервер қабылдамады. Себептері: Құпия сөз тым қысқа. Құпия сөзде сандар немесе таңбалар болуы керек. Құпия сөз алдыңғы құпия сөздерден басқа болуы керек.</translation> <translation id="5541694225089836610">Әрекетті сіздің әкімшіңіз өшірді.</translation> <translation id="5542132724887566711">Профиль</translation> @@ -4794,6 +4799,7 @@ <translation id="5585912436068747822">Пішімдеу сәтсіз аяқталды</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Қолданбаларды жүктеу…</translation> +<translation id="5590418976913374224">Құрылғы іске қосылғанда дыбыс ойнату</translation> <translation id="5592595402373377407">Қол жетімді деректер әлі жеткілікті емес.</translation> <translation id="5595307023264033512">Сайттар пайдаланатын жалпы жад көлемі: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">Мекенжайды өзгерту</translation> @@ -6168,6 +6174,10 @@ <translation id="6943939122536910181"><ph name="DEVICE" /> құрылғысынан ажыратылды</translation> <translation id="6945221475159498467">Таңдау</translation> <translation id="694592694773692225">Бұл бетте бағыттауға тыйым салынған.</translation> +<translation id="6947015141909171112">Соңғы Search пайдалану тарихы негізінде ұсынылған рецептілерді көріп тұрсыз. + <ph name="BREAK" /> + <ph name="BREAK" /> + Параметрлерді карта мәзірінен реттей, басқа опцияларды "Chrome браузерін реттеу" бөлімінен көре аласыз.</translation> <translation id="6949434160682548041">Құпия сөз (міндетті емес)</translation> <translation id="6950627417367801484">Қолданбаларды қалпына келтіру</translation> <translation id="6952242901357037157"><ph name="BEGIN_LINK" />Google аккаунтының<ph name="END_LINK" /> құпия сөздерін осы жерде көрсетуіңізге болады.</translation> @@ -6335,6 +6345,7 @@ <translation id="7102687220333134671">Автоматты жаңарту қосулы</translation> <translation id="7102832101143475489">Сұрау уақыты өтіп кетті</translation> <translation id="710640343305609397">Желі параметрлерін ашу</translation> +<translation id="7107609441453408294">Бір аудиожазбаны барлық динамиктен ойнату</translation> <translation id="7108338896283013870">Жасыру</translation> <translation id="7108668606237948702">enter</translation> <translation id="7108933416628942903">Қазір құлыптау</translation> @@ -6565,6 +6576,7 @@ <translation id="7364745943115323529">Трансляциялау…</translation> <translation id="7364796246159120393">Файл таңдау</translation> <translation id="7365076891350562061">Монитор өлшемі</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" /> – бекітілді</translation> <translation id="7366316827772164604">Маңайдағы құрылғылар ізделуде…</translation> <translation id="7366415735885268578">Сайтты енгізу</translation> <translation id="7366909168761621528">Шолу деректері</translation> @@ -6961,6 +6973,7 @@ <translation id="7737115349420013392">"<ph name="DEVICE_NAME" />" құрылғысымен жұпталуда ...</translation> <translation id="7737846262459425222">Оны "Параметрлер > Google Assistant > Экран контексі" тармағынан кез келген уақытта өзгертуге болады.</translation> <translation id="7737948071472253612">Камераңызды қолдануға рұқсаты жоқтар</translation> +<translation id="77381465218432215">Диакритикалық және арнайы таңбаларды көрсету</translation> <translation id="7740996059027112821">Стандартты</translation> <translation id="7741307896921365578">Оқу тізіміне және бетбелгілерге оңай және тұрақты түрде кіру үшін браузер деңгейіндегі бүйірлік панельді іске қосады.</translation> <translation id="7742558784808143689"><ph name="SITE_NAME" />, оның астындағы барлық сайт және орнатылған қолданбалар үшін сайт деректері мен рұқсаттары өшірілсін бе?</translation> @@ -7749,6 +7762,7 @@ <translation id="8486666913807228950">Себеп: <ph name="REVERT_RULE" /> теріс ережесі "Күштеп ашу" тізімінен табылды.</translation> <translation id="848666842773560761">Қолданба камераны пайдаланғалы жатыр. Пайдалануға рұқсат беру үшін камераның құпиялылық функциясын өшіріңіз.</translation> <translation id="8487678622945914333">Үлкейту</translation> +<translation id="8487699605742506766">Хотспот</translation> <translation id="8489156414266187072">Жеке ұсыныстар сіздің аккаунтыңызға ғана көрсетіледі.</translation> <translation id="8490896350101740396">Келесі киоск қолданбалары "<ph name="UPDATED_APPS" />" жаңартылды. Жаңарту процесін аяқтау үшін құрылғыны қайта іске қосыңыз.</translation> <translation id="8492685019009920170">Саусақ ізін оқу сканерін саусағыңызбен түртіңіз. Деректер қауіпсіз сақталады және <ph name="DEVICE_TYPE" /> құрылғысынан басқа ешқайда жіберілмейді.</translation> @@ -8242,6 +8256,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" және тағы 1 қойынды}other{"<ph name="TAB_TITLE" />" және тағы # қойынды}}</translation> <translation id="8977811652087512276">Құпия сөз дұрыс емес немесе файл бүлінген</translation> <translation id="8978154919215542464">Қосулы – барлығын синхрондау</translation> +<translation id="8978670037548431647">Тетеринг мүмкіндіктерін жаңарту</translation> <translation id="897939795688207351"><ph name="ORIGIN" /> сайтында</translation> <translation id="8980345560318123814">Пікір есептері</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> – бұзылды</translation> @@ -8506,6 +8521,7 @@ <translation id="935854577147268200">Smart Lock телефоны өзгерді. Smart Lock функциясын жаңарту үшін құпия сөзіңізді енгізіңіз. Келесіде телефон <ph name="DEVICE_TYPE" /> құрылғысының құлпын аша алады. Smart Lock функциясын "Параметрлер" бөлімінен өшіруге болады.</translation> <translation id="936646668635477464">Камера және микрофон</translation> <translation id="936801553271523408">Жүйенің диагностикалық деректері</translation> +<translation id="937053962468712792"><ph name="DEVICE" /> құрылғысы <ph name="PRIMARY_EMAIL" /> электрондық мекенжайынан өшірілсін бе?</translation> <translation id="93766956588638423">Кеңейтімді жөндеу</translation> <translation id="938568644810664664">"Ok Google, мынау қандай ән?" немесе "Ok Google, экрандағы не?" деп сұрап көріңіз.</translation> <translation id="938623846785894166">Әдеттен тыс файл</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index e54d413..ea8decd 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -2201,6 +2201,7 @@ <translation id="3021065318976393105">ಬ್ಯಾಟರಿ ಆನ್ ಇರುವಾಗ</translation> <translation id="3021066826692793094">ಚಿಟ್ಟೆ</translation> <translation id="3021678814754966447">ಫ್ರೇಮ್ ಮೂಲವನ್ನು &ವೀಕ್ಷಿಸಿ</translation> +<translation id="3022361196600037287">ಈ Chromebook ನಿಂದ <ph name="DEVICE" /> ಅನ್ನು ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ ಮತ್ತು <ph name="PRIMARY_EMAIL" /> ಗೆ ಉಳಿಸಲಾಗುವುದಿಲ್ಲ.</translation> <translation id="3022978424994383087">ಅದು ಅರ್ಥವಾಗಲಿಲ್ಲ.</translation> <translation id="3023464535986383522">ಧ್ವನಿ ಆಯ್ಕೆ ಮಾಡಿ</translation> <translation id="3024374909719388945">24-ಗಂಟೆಯ ಕ್ಲಾಕ್ ಬಳಸಿ</translation> @@ -3740,6 +3741,7 @@ <translation id="4535127706710932914">ಡಿಫಾಲ್ಟ್ ಪ್ರೊಫೈಲ್</translation> <translation id="4535767533210902251">ನಿಮ್ಮ ಕೀಬೋರ್ಡ್ನಲ್ಲಿ ಮೇಲೆ ಬಲತುದಿಯಲ್ಲಿರುವ ಕೀ, ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್ ಆಗಿದೆ. ಯಾವುದೇ ಬೆರಳಿನ ಮೂಲಕ ಅದನ್ನು ಮೆಲ್ಲಗೆ ಸ್ಪರ್ಶಿಸಿ.</translation> <translation id="4536140153723794651">ಯಾವಾಗಲೂ ಕುಕೀಗಳನ್ನು ಬಳಸುವ ಸೈಟ್ಗಳು</translation> +<translation id="4536769240747010177">ಟೆಥರಿಂಗ್ ಸಾಮರ್ಥ್ಯಗಳು:</translation> <translation id="4538417792467843292">ಪದವನ್ನು ಅಳಿಸಿ</translation> <translation id="4538792345715658285">ಎಂಟರ್ಪ್ರೈಸ್ ನೀತಿಯಿಂದ ಸ್ಥಾಪಿಸಲಾಗಿದೆ.</translation> <translation id="4541123282641193691">ನಿಮ್ಮ ಖಾತೆಯನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ ಅಥವಾ ನಿಮ್ಮ Chromebook ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ.</translation> @@ -3767,6 +3769,7 @@ <translation id="4561893854334016293">ಇತ್ತೀಚೆಗೆ ಯಾವುದೇ ಅನುಮತಿಗಳನ್ನು ಬದಲಾಯಿಸಲಾಗಿಲ್ಲ</translation> <translation id="4562155214028662640">ಫಿಂಗರ್ಫ್ರಿಂಟ್ ಸೇರಿಸಿ</translation> <translation id="4563210852471260509">ಚೈನೀಸ್ನ ಆರಂಭದ ಇನ್ಪುಟ್ ಭಾಷೆ</translation> +<translation id="4563382028841851106">ಖಾತೆಯಿಂದ ತೆಗೆದುಹಾಕಿ</translation> <translation id="4563880231729913339">ಬೆರಳು 3</translation> <translation id="4564245002465020751">ನಿಮ್ಮ ಫೋನ್ನಲ್ಲಿ ಸೆಟಪ್ ಮಾಡುವುದನ್ನು ಪೂರ್ಣಗೊಳಿಸಿ</translation> <translation id="4565377596337484307">ಪಾಸ್ವರ್ಡ್ ಮರೆಮಾಡಿ</translation> @@ -6187,6 +6190,10 @@ <translation id="6943939122536910181"><ph name="DEVICE" /> ನಿಂದ ಡಿಸ್ಕನೆಕ್ಟ್ ಮಾಡಲಾಗಿದೆ</translation> <translation id="6945221475159498467">ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="694592694773692225">ಈ ಪುಟದಲ್ಲಿ ಮರುನಿರ್ದೇಶಿಸುವಿಕೆಯನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ.</translation> +<translation id="6947015141909171112">ರೆಸಿಪಿಗಳಿಗೆ ಸಂಬಂಧಿಸಿದ ನಿಮ್ಮ ಇತ್ತೀಚಿನ ಹುಡುಕಾಟ ಚಟುವಟಿಕೆಯನ್ನು ಆಧರಿಸಿ ನಿಮಗೆ ರೆಸಿಪಿಗಳನ್ನು ತೋರಿಸಲಾಗುತ್ತಿದೆ. + <ph name="BREAK" /> + <ph name="BREAK" /> + ನೀವು ಕಾರ್ಡ್ ಮೆನುವಿನಿಂದ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ನಿರ್ವಹಿಸಬಹುದು ಅಥವಾ Chrome ಅನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡಿ ಎಂಬಲ್ಲಿ ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳನ್ನು ನೋಡಬಹುದು.</translation> <translation id="6949434160682548041">ಪಾಸ್ವರ್ಡ್ (ಐಚ್ಛಿಕ)</translation> <translation id="6950627417367801484">ಆ್ಯಪ್ಗಳನ್ನು ಮರುಸ್ಥಾಪಿಸಿ</translation> <translation id="6952242901357037157">ನಿಮ್ಮ <ph name="BEGIN_LINK" />Google ಖಾತೆಯಿಂದ<ph name="END_LINK" /> ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಸಹ ನೀವು ಇಲ್ಲಿ ತೋರಿಸಬಹುದು</translation> @@ -6981,6 +6988,7 @@ <translation id="7737115349420013392">"<ph name="DEVICE_NAME" />" ಜೊತೆ ಜೋಡಿಸಲಾಗುತ್ತಿದೆ...</translation> <translation id="7737846262459425222">ನೀವು ಇದನ್ನು ಯಾವಾಗ ಬೇಕಾದರೂ ಸೆಟ್ಟಿಂಗ್ಗಳು > Google Assistant > ಸ್ಕ್ರೀನ್ ಸಂದರ್ಭದಲ್ಲಿ ಬದಲಾಯಿಸಬಹುದು.</translation> <translation id="7737948071472253612">ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಬಳಸಲು ಈ ಸೈಟ್ಗಳಿಗೆ ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ</translation> +<translation id="77381465218432215">ಉಚ್ಚಾರಣಾ ಗುರುತುಗಳು ಮತ್ತು ವಿಶೇಷ ಅಕ್ಷರಗಳನ್ನು ತೋರಿಸಿ</translation> <translation id="7740996059027112821">ಪ್ರಮಾಣಿತ</translation> <translation id="7741307896921365578">ನಿಮ್ಮ ಓದುವ ಪಟ್ಟಿ ಮತ್ತು ಬುಕ್ಮಾರ್ಕ್ಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಉಪಯುಕ್ತ ಮತ್ತು ಸ್ಥಿರವಾದ ಮಾರ್ಗವನ್ನು ಒದಗಿಸಲು ಬ್ರೌಸರ್ ಮಟ್ಟದ ಪಾರ್ಶ್ವ ಫಲಕವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ.</translation> <translation id="7742558784808143689"><ph name="SITE_NAME" />, ಅದರ ಅಡಿಯಲ್ಲಿರುವ ಎಲ್ಲಾ ಸೈಟ್ಗಳು ಮತ್ತು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿದ ಆ್ಯಪ್ಗಳಿಗೆ ಸಂಬಂಧಿಸಿದ ಸೈಟ್ ಡೇಟಾ ಮತ್ತು ಅನುಮತಿಗಳನ್ನು ತೆರವುಗೊಳಿಸಬೇಕೆ?</translation> @@ -7767,6 +7775,7 @@ <translation id="8486666913807228950">ಕಾರಣ: ಇನ್ವರ್ಟ್ ಮಾಡಲಾದ ನಿಯಮ <ph name="REVERT_RULE" /> "ಬಲವಂತವಾಗಿ ತೆರೆಯಲಾಗುತ್ತಿರುವ" ಪಟ್ಟಿಯಲ್ಲಿ ಕಂಡುಬಂದಿದೆ.</translation> <translation id="848666842773560761">ಆ್ಯಪ್ವೊಂದು ಕ್ಯಾಮರಾವನ್ನು ಪ್ರವೇಶಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದೆ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸಲು ಕ್ಯಾಮರಾ ಗೌಪ್ಯತೆ ಸ್ವಿಚ್ ಅನ್ನು ಆಫ್ ಮಾಡಿ.</translation> <translation id="8487678622945914333">ಝೂಮ್ ಇನ್</translation> +<translation id="8487699605742506766">ಹಾಟ್ಸ್ಪಾಟ್</translation> <translation id="8489156414266187072">ನಿಮ್ಮ ಖಾತೆಯಲ್ಲಿ ಮಾತ್ರ ವೈಯಕ್ತಿಕ ಸಲಹೆಗಳನ್ನು ತೋರಿಸಲಾಗುತ್ತದೆ</translation> <translation id="8490896350101740396">ಈ ಕೆಳಗಿನ ಕಿಯೋಸ್ಕ್ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು "<ph name="UPDATED_APPS" />" ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗಿದೆ. ಅಪ್ಡೇಟ್ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು ದಯವಿಟ್ಟು ಸಾಧನವನ್ನು ರೀಬೂಟ್ ಮಾಡಿ.</translation> <translation id="8492685019009920170">ನಿಮ್ಮ ಬೆರಳಿನ ಮೂಲಕ ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್ ಅನ್ನು ಸ್ಪರ್ಶಿಸಿ. ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಸುರಕ್ಷಿತವಾಗಿ ಸಂಗ್ರಹಣೆ ಮಾಡಲಾಗುತ್ತದೆ ಮತ್ತು ಇದು ಎಂದೂ ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ನಿಂದ ಹೊರಗೆ ಹೋಗುವುದಿಲ್ಲ.</translation> @@ -8261,6 +8270,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" ಮತ್ತು ಇನ್ನೂ 1 ಇತರ ಟ್ಯಾಬ್}one{"<ph name="TAB_TITLE" />" ಮತ್ತು ಇನ್ನೂ # ಇತರ ಟ್ಯಾಬ್ಗಳು}other{"<ph name="TAB_TITLE" />" ಮತ್ತು ಇನ್ನೂ # ಇತರ ಟ್ಯಾಬ್ಗಳು}}</translation> <translation id="8977811652087512276">ತಪ್ಪು ಪಾಸ್ವರ್ಡ್ ಅಥವಾ ದೋಷಯುಕ್ತ ಫೈಲ್</translation> <translation id="8978154919215542464">ಆನ್- ಎಲ್ಲವನ್ನೂ ಸಿಂಕ್ ಮಾಡಿ</translation> +<translation id="8978670037548431647">ಟೆಥರಿಂಗ್ ಸಾಮರ್ಥ್ಯಗಳನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡಿ</translation> <translation id="897939795688207351"><ph name="ORIGIN" /> ನಲ್ಲಿ</translation> <translation id="8980345560318123814">ಪ್ರತಿಕ್ರಿಯೆ ವರದಿಗಳು</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> - ಕ್ರ್ಯಾಶ್ ಮಾಡಲಾಗಿದೆ</translation> @@ -8526,6 +8536,7 @@ <translation id="935854577147268200">Smart Lock ಫೋನ್ ಬದಲಾಗಿದೆ. Smart Lock ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಲು ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸಿ. ಮುಂದಿನ ಬಾರಿ, ನಿಮ್ಮ ಫೋನ್ ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಅನ್ನು ಅನ್ಲಾಕ್ ಮಾಡುತ್ತದೆ. ನೀವು ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ Smart Lock ಅನ್ನು ಆಫ್ ಮಾಡಬಹುದು</translation> <translation id="936646668635477464">ಕ್ಯಾಮರಾ ಮತ್ತು ಮೈಕ್ರೋಫೋನ್</translation> <translation id="936801553271523408">ಸಿಸ್ಟಂ ವಿಶ್ಲೇಷಣಾತ್ಮಕ ಡೇಟಾ</translation> +<translation id="937053962468712792"><ph name="PRIMARY_EMAIL" /> ನಿಂದ <ph name="DEVICE" /> ಅನ್ನು ತೆಗೆದುಹಾಕಬೇಕೇ?</translation> <translation id="93766956588638423">ವಿಸ್ತರಣೆ ದುರಸ್ತಿಪಡಿಸಿ</translation> <translation id="938568644810664664">“Ok Google, ಇದು ಯಾವ ಹಾಡು?” ಅಥವಾ “Ok Google, ನನ್ನ ಸ್ಕ್ರೀನ್ನಲ್ಲಿ ಏನಿದೆ?” ಎಂದು ಹೇಳಲು ಪ್ರಯತ್ನಿಸಿ</translation> <translation id="938623846785894166">ಅಸಾಮಾನ್ಯ ಫೈಲ್</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index 926673d..3ce247a 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -906,6 +906,7 @@ <translation id="1829129547161959350">펭귄</translation> <translation id="1829192082282182671">축소(&O)</translation> <translation id="1830550083491357902">로그인하지 않음</translation> +<translation id="1831848493690504725">연결된 네트워크를 통해 Google에 연결할 수 없습니다. 다른 네트워크를 선택하거나 네트워크 설정 또는 프록시 설정(프록시 사용 시)을 확인해 보세요.</translation> <translation id="1832459821645506983">예</translation> <translation id="1832511806131704864">휴대전화 변경사항이 업데이트됨</translation> <translation id="1832848789136765277">동기화 데이터에 항상 액세스하려면 본인 확인 절차를 거치세요.</translation> @@ -2209,6 +2210,7 @@ <translation id="3021065318976393105">배터리 사용 시</translation> <translation id="3021066826692793094">나비</translation> <translation id="3021678814754966447">프레임 소스 보기(&V)</translation> +<translation id="3022361196600037287"><ph name="DEVICE" />가 Chromebook에서 삭제되며 <ph name="PRIMARY_EMAIL" />에 저장되지 않습니다.</translation> <translation id="3022978424994383087">인식하지 못했습니다.</translation> <translation id="3023464535986383522">텍스트 읽어주기</translation> <translation id="3024374909719388945">24시간 단위 사용</translation> @@ -3746,6 +3748,7 @@ <translation id="4535127706710932914">기본 프로필</translation> <translation id="4535767533210902251">지문 센서는 키보드 오른쪽 상단의 키에 있습니다. 손가락으로 가볍게 터치하세요.</translation> <translation id="4536140153723794651">쿠키를 언제든지 사용할 수 있는 사이트</translation> +<translation id="4536769240747010177">테더링 기능:</translation> <translation id="4538417792467843292">단어 삭제</translation> <translation id="4538792345715658285">엔터프라이즈 정책에 의해 설치됨</translation> <translation id="4541123282641193691">계정을 확인할 수 없습니다. 다시 시도하거나 Chromebook을 다시 시작하세요.</translation> @@ -3773,6 +3776,7 @@ <translation id="4561893854334016293">최근 변경된 권한 없음</translation> <translation id="4562155214028662640">지문 추가</translation> <translation id="4563210852471260509">중국어를 초기 입력 언어로 설정</translation> +<translation id="4563382028841851106">계정에서 삭제</translation> <translation id="4563880231729913339">손가락 3</translation> <translation id="4564245002465020751">휴대전화 설정 마치기</translation> <translation id="4565377596337484307">비밀번호 숨김</translation> @@ -4749,6 +4753,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" />에서 다음 권한을 요청합니다.</translation> <translation id="5534304873398226603">사진 또는 동영상 삭제</translation> <translation id="5537725057119320332">전송</translation> +<translation id="5539070192556911367">Google에 연결할 수 없음</translation> <translation id="5539221284352502426">입력한 비밀번호가 서버에 의해 거부되었습니다. 가능한 이유는 다음과 같습니다. 비밀번호가 너무 짧습니다. 비밀번호에 숫자 또는 기호가 포함되어야 합니다. 이전 비밀번호와 달라야 합니다.</translation> <translation id="5541694225089836610">관리자가 사용 중지한 작업입니다.</translation> <translation id="5542132724887566711">프로필</translation> @@ -4812,6 +4817,7 @@ <translation id="5585912436068747822">포맷 실패</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />개)</translation> <translation id="558918721941304263">앱 로드 중...</translation> +<translation id="5590418976913374224">기기 시작 시 소리 재생</translation> <translation id="5592595402373377407">아직 데이터가 충분하지 않습니다.</translation> <translation id="5595307023264033512">사이트에서 사용 중인 총 저장용량: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">주소 수정</translation> @@ -6189,6 +6195,10 @@ <translation id="6943939122536910181"><ph name="DEVICE" />에서 연결 해제됨</translation> <translation id="6945221475159498467">선택</translation> <translation id="694592694773692225">이 페이지에서 리디렉션이 차단되었습니다.</translation> +<translation id="6947015141909171112">최근 레시피 검색 활동을 기반으로 표시되는 레시피입니다. + <ph name="BREAK" /> + <ph name="BREAK" /> + 카드 메뉴에서 설정을 관리하거나 Chrome 맞춤설정에서 추가 옵션을 확인할 수 있습니다.</translation> <translation id="6949434160682548041">비밀번호(선택사항)</translation> <translation id="6950627417367801484">앱 복원</translation> <translation id="6952242901357037157">여기에서 <ph name="BEGIN_LINK" />Google 계정<ph name="END_LINK" />에 저장된 비밀번호를 표시할 수도 있습니다.</translation> @@ -6356,6 +6366,7 @@ <translation id="7102687220333134671">자동 업데이트가 사용 설정되어 있습니다.</translation> <translation id="7102832101143475489">요청 제한 시간 초과</translation> <translation id="710640343305609397">네트워크 설정 열기</translation> +<translation id="7107609441453408294">모든 스피커에서 동일한 오디오 재생</translation> <translation id="7108338896283013870">숨기기</translation> <translation id="7108668606237948702">입력</translation> <translation id="7108933416628942903">지금 잠그기</translation> @@ -6586,6 +6597,7 @@ <translation id="7364745943115323529">전송...</translation> <translation id="7364796246159120393">파일 선택</translation> <translation id="7365076891350562061">모니터 크기</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" /> - 고정됨</translation> <translation id="7366316827772164604">주변 기기 검색 중...</translation> <translation id="7366415735885268578">사이트 추가</translation> <translation id="7366909168761621528">인터넷 사용정보</translation> @@ -6982,6 +6994,7 @@ <translation id="7737115349420013392">‘<ph name="DEVICE_NAME" />’ 페어링 중...</translation> <translation id="7737846262459425222">언제든지 설정 > Google 어시스턴트 > 화면 컨텍스트에서 변경할 수 있습니다.</translation> <translation id="7737948071472253612">카메라 사용이 허용되지 않음</translation> +<translation id="77381465218432215">악센트 표시 및 특수문자 표시</translation> <translation id="7740996059027112821">표준</translation> <translation id="7741307896921365578">읽기 목록과 북마크에 항상 유용하게 액세스할 수 있도록 브라우저 수준의 측면 패널을 사용 설정합니다.</translation> <translation id="7742558784808143689"><ph name="SITE_NAME" /> 및 모든 하위 사이트, 설치된 앱의 사이트 데이터와 권한을 삭제하시겠습니까?</translation> @@ -7773,6 +7786,7 @@ <translation id="8486666913807228950">이유: 반전된 규칙인 <ph name="REVERT_RULE" />이(가) "강제로 열기" 목록에 있습니다.</translation> <translation id="848666842773560761">앱에서 카메라에 액세스하려고 합니다. 액세스를 허용하려면 카메라 개인정보 보호 스위치를 끄세요.</translation> <translation id="8487678622945914333">확대</translation> +<translation id="8487699605742506766">핫스팟</translation> <translation id="8489156414266187072">개인 추천 항목은 내 계정에만 표시됩니다.</translation> <translation id="8490896350101740396">다음 Kiosk 앱 '<ph name="UPDATED_APPS" />'이(가) 업데이트되었습니다. 기기를 재부팅하여 업데이트 절차를 완료하세요.</translation> <translation id="8492685019009920170">손가락으로 지문 센서를 터치하세요. 데이터는 안전하게 저장되며 절대 <ph name="DEVICE_TYPE" /> 외부로 유출되지 않습니다.</translation> @@ -8266,6 +8280,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{‘<ph name="TAB_TITLE" />’}=1{‘<ph name="TAB_TITLE" />’ 외 탭 1개}other{‘<ph name="TAB_TITLE" />’ 외 탭 #개}}</translation> <translation id="8977811652087512276">잘못된 비밀번호이거나 손상된 파일입니다.</translation> <translation id="8978154919215542464">사용 - 모든 항목 동기화</translation> +<translation id="8978670037548431647">테더링 기능 새로고침</translation> <translation id="897939795688207351"><ph name="ORIGIN" />에서</translation> <translation id="8980345560318123814">의견 보고서</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> - 비정상 종료됨</translation> @@ -8530,6 +8545,7 @@ <translation id="935854577147268200">Smart Lock 휴대전화가 변경되었습니다. Smart Lock을 업데이트하려면 비밀번호를 입력하세요. 다음번에는 휴대전화를 통해 <ph name="DEVICE_TYPE" />이(가) 잠금 해제됩니다. 설정에서 Smart Lock을 사용 중지할 수 있습니다.</translation> <translation id="936646668635477464">카메라 및 마이크</translation> <translation id="936801553271523408">시스템 진단 데이터</translation> +<translation id="937053962468712792"><ph name="PRIMARY_EMAIL" />에서 <ph name="DEVICE" />를 삭제하시겠습니까?</translation> <translation id="93766956588638423">확장 프로그램 복구</translation> <translation id="938568644810664664">“Hey Google, 이거 무슨 노래야?” 또는 “Hey Google, 내 화면에 뭐가 표시되어 있어?”라고 말해 보세요.</translation> <translation id="938623846785894166">일반적이지 않은 파일</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index d7bae2e..56621d8 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -2208,6 +2208,7 @@ <translation id="3021065318976393105">Батареянын кубаты менен иштеп жатканда</translation> <translation id="3021066826692793094">Көпөлөк</translation> <translation id="3021678814754966447">Алкак булагын карап &көрүү</translation> +<translation id="3022361196600037287"><ph name="DEVICE" /> бул Chromebook'тан өчүрүлүп, <ph name="PRIMARY_EMAIL" /> аккаунтуна сакталбайт.</translation> <translation id="3022978424994383087">Түшүнүксүз которулуп калды.</translation> <translation id="3023464535986383522">Басып туруп угуңуз</translation> <translation id="3024374909719388945">24 сааттык саатты колдонуу</translation> @@ -3747,6 +3748,7 @@ <translation id="4535127706710932914">Демейки профиль</translation> <translation id="4535767533210902251">Манжа изинин сенсору баскычтобуңуздун жогорку оң жагында жайгашкан. Ага манжаңыздын бирөө менен акырын тийип коюңуз.</translation> <translation id="4536140153723794651">Cookie файлдарын дайыма колдоно алган сайттар</translation> +<translation id="4536769240747010177">Телефонду модем катары колдонуу мүмкүнчүлүгү:</translation> <translation id="4538417792467843292">Сөздү жок кылуу</translation> <translation id="4538792345715658285">Ишкана саясаты тарабынан орнотулду.</translation> <translation id="4541123282641193691">Аккаунтуңуз ырасталбай калды. Кайталап көрүңүз же Chromebook'уңузду өчүрүп күйгүзүңүз.</translation> @@ -3774,6 +3776,7 @@ <translation id="4561893854334016293">Акыркы убакта уруксаттар өзгөргөн жок</translation> <translation id="4562155214028662640">Манжа изин кошуу</translation> <translation id="4563210852471260509">Баштапкы киргизүү тили – кытайча</translation> +<translation id="4563382028841851106">Аккаунттан өчүрүү</translation> <translation id="4563880231729913339">3-манжа</translation> <translation id="4564245002465020751">Телефонуңузда жөндөп бүтүрүңүз</translation> <translation id="4565377596337484307">Сырсөздү жашыруу</translation> @@ -6190,6 +6193,10 @@ <translation id="6943939122536910181"><ph name="DEVICE" /> түзмөгүнөн ажыратылды</translation> <translation id="6945221475159498467">Тандаңыз</translation> <translation id="694592694773692225">Бул баракта багыттоо бөгөттөлгөн.</translation> +<translation id="6947015141909171112">Акыркы жолу изделген рецепттердин негизинде сунушталган рецепттерди көрүп турасыз. + <ph name="BREAK" /> + <ph name="BREAK" /> + Картанын менюсунан параметрлерди тескесеңиз болот же көбүрөөк параметрлерди көрүү үчүн Chrome'ду ыңгайлаштыруу бөлүмүнө өтүңүз.</translation> <translation id="6949434160682548041">Сырсөз (милдеттүү эмес)</translation> <translation id="6950627417367801484">Колдонмолорду калыбына келтирүү</translation> <translation id="6952242901357037157">Ошондой эле <ph name="BEGIN_LINK" />Google аккаунтуңуздагы<ph name="END_LINK" /> сырсөздөрдү бул жерде көрсөтсөңүз болот</translation> @@ -6983,6 +6990,7 @@ <translation id="7737115349420013392">"<ph name="DEVICE_NAME" />" менен жупташтырылууда...</translation> <translation id="7737846262459425222">Муну Жөндөөлөр > Google Жардамчы > Экрандагы контекст бөлүмүнөн каалаган убакта өзгөртө аласыз.</translation> <translation id="7737948071472253612">Камераңызды колдоно албайт</translation> +<translation id="77381465218432215">Басым белгилерин жана атайын символдорду көрсөтүү</translation> <translation id="7740996059027112821">Стандарт</translation> <translation id="7741307896921365578">Окуу тизмеси менен Кыстармаларды оңой ачуу үчүн серепчинин деңгээлиндеги капталдагы тилкени иштетет.</translation> <translation id="7742558784808143689"><ph name="SITE_NAME" />, анын астындагы бардык сайттардагы, ошондой эле орнотулган колдонмолордогу сайтка тиешелүү маалыматтар жана уруксаттар тазалансынбы?</translation> @@ -7772,6 +7780,7 @@ <translation id="8486666913807228950">Себеби: "Мажбурлап ачуу" тизмесинде инверттелген <ph name="REVERT_RULE" /> эрежеси аныкталды.</translation> <translation id="848666842773560761">Колдонмо камераны пайдаланууга аракет кылып жатат. Уруксат берүү үчүн камеранын купуялык которгучун өчүрүңүз.</translation> <translation id="8487678622945914333">Чоңойтуу</translation> +<translation id="8487699605742506766">Байланыш түйүнү</translation> <translation id="8489156414266187072">Жеке сунуштар аккаунтуңузда гана көрүнөт</translation> <translation id="8490896350101740396">Төмөнкү kiosk колдонмолору "<ph name="UPDATED_APPS" />" жаңырды. Жаңыртуу процессин бүтүрүү үчүн түзмөктү өчүрүп-күйгүзүңүз.</translation> <translation id="8492685019009920170">Манжа изинин сенсоруна манжаңыз менен тийиңиз. Маалыматыңыз <ph name="DEVICE_TYPE" /> түзмөгүңүздө коопсуз сакталат.</translation> @@ -8265,6 +8274,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" жана башка 1 өтмөк}other{"<ph name="TAB_TITLE" />" жана башка # өтмөк}}</translation> <translation id="8977811652087512276">Сырсөз туура эмес же файл бузук</translation> <translation id="8978154919215542464">Күйүк – баарын шайкештирүү</translation> +<translation id="8978670037548431647">Телефонду модем катары колдонуу мүмкүнчүлүгүн жаңыртуу:</translation> <translation id="897939795688207351"><ph name="ORIGIN" /> сайтында</translation> <translation id="8980345560318123814">Жооп пикир баяндамалары</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> – Бузулду</translation> @@ -8529,6 +8539,7 @@ <translation id="935854577147268200">Smart Lock үчүн телефон өзгөрдү. Smart Lock'ту жаңыртуу үчүн, сырсөзүңүздү киргизиңиз. Эми <ph name="DEVICE_TYPE" /> түзмөгүңүздүн кулпусун телефонуңуз менен ачсаңыз болот. Жөндөөлөргө өтүп, Smart Lock'ту өчүрүп койсоңуз болот.</translation> <translation id="936646668635477464">Камера жана микрофон</translation> <translation id="936801553271523408">Системанын диагностика дайындары</translation> +<translation id="937053962468712792"><ph name="DEVICE" /> түзмөгү <ph name="PRIMARY_EMAIL" /> аккаунтунан өчүрүлсүнбү?</translation> <translation id="93766956588638423">Кеңейтүүнү оңдоо</translation> <translation id="938568644810664664">“Окей, Google, бул кайсы ыр?” же “Окей, Google, экранымдагы эмне?” деп сурап көрүңүз</translation> <translation id="938623846785894166">Көп жүктөлүп алынбаган файл</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb index 49049b2..4009e60 100644 --- a/chrome/app/resources/generated_resources_lo.xtb +++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">ໃຊ້ໄມໂຄຣໂຟນ ແລະກ້ອງຖ່າຍຮູບຂອງທ່ານ</translation> <translation id="1005333234656240382">ເປີດນຳໃຂ້ການດີບັກ ADB ບໍ?</translation> <translation id="1006873397406093306">ສ່ວນຂະຫຍາຍນີ້ສາມາດອ່ານ ແລະ ປ່ຽນແປງຂໍ້ມູນໃນເວັບໄຊໄດ້. ທ່ານສາມາດຄວບຄຸມວ່າຈະໃຫ້ສ່ວນຂະຫຍາຍເຂົ້າເຖິງເວັບໄຊໃດແດ່ໄດ້.</translation> +<translation id="1007057452468855774">ເປີດ Google Play Store</translation> <translation id="1008186147501209563">ສົ່ງບຸກມາກອອກ</translation> <translation id="1008557486741366299">ບໍ່ແມ່ນດຽວນີ້</translation> <translation id="1009476156254802388">ສະຖານທີ່ <ph name="WEB_DRIVE" /></translation> <translation id="1009663062402466586">ຕອນນີ້ສາມາດໃຊ້ການຄວບຄຸມເກມໄດ້ແລ້ວ</translation> <translation id="1010498023906173788">ແຖບນີ້ເຊື່ອມຕໍ່ກັບຜອດອະນຸກຳ.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{ໜ້າບໍ່ຕອບຮັບ}other{ໜ້າບໍ່ຕອບຮັບ}}</translation> +<translation id="1011003645819296594">ອຸປະກອນທີ່ບັນທຶກໄວ້</translation> <translation id="1011355516189274711">ລະດັບສຽງການປ່ຽນຂໍ້ຄວາມເປັນສຽງເວົ້າ</translation> <translation id="1012794136286421601">ໄຟລ໌ເອກະສານ, ແຜ່ນ, ສະໄລດ໌, ແລະແຜ່ນແຕ້ມຂອງທ່ານກໍາລັງຖືກຊິງຄ໌. ເປີດແອັບ Google Drive ເພື່ອເຂົ້າຫາພວກມັນອອນລາຍນ໌ ຫຼືອອຟລາຍນ໌.</translation> <translation id="1012876632442809908">ອຸປະກອນ USB-C (ຜອດດ້ານໜ້າ)</translation> @@ -494,6 +496,7 @@ <translation id="1470350905258700113">ໃຊ້ອຸປະກອນນີ້</translation> <translation id="1470946456740188591">ເພື່ອເປີດ ຫຼື ປິດການຮຽກເບິ່ງດ້ວຍແປ້ນພິມ, ກະລຸນາໃຊ້ທາງລັດ Ctrl+Search+7</translation> <translation id="1472675084647422956">ສະແດງເພີ່ມເຕີມ</translation> +<translation id="1473223074251193484">ກໍານົດການຕັ້ງຄ່າການປ່ອຍສັນຍານ</translation> <translation id="1474785664565228650">ການປ່ຽນການຕັ້ງຄ່າໄມໂຄຣໂຟນກຳນົດໃຫ້ Parallels Desktop ເລີ່ມເປີດໃຊ້ໃໝ່. ເປີດການນຳໃຊ້ Parallels Desktop ເພື່ອສືບຕໍ່.</translation> <translation id="1474893630593443211">ການຄວບຄຸມເພີ່ມເຕີມຕໍ່ໂຄສະນາທີ່ທ່ານເຫັນ</translation> <translation id="1475502736924165259">ທ່ານມີໃບຢັ້ງຢືນຢູ່ໃນໄຟລ໌ທີ່ບໍ່ເຂົ້າກັບໝວດອື່ນໃດໜຶ່ງ:</translation> @@ -1121,6 +1124,7 @@ <translation id="2044014337866019681">ກະລຸນາກວດສອບໃຫ້ແນ່ໃຈວ່າທ່ານກຳລັງຢັ້ງຢືນ <ph name="ACCOUNT" /> ເພື່ອປົດລັອກເຊດຊັນ.</translation> <translation id="204497730941176055">ຊື່ແມ່ແບບໃບຢັ້ງຢືນ Microsoft</translation> <translation id="2045117674524495717">ຕົວຊ່ວຍທາງລັດແປ້ນພິມ</translation> +<translation id="2045211794962848221">ທ່ານຈະບໍ່ເຫັນຂໍ້ຄວາມສະເພາະນີ້ອີກ</translation> <translation id="2045969484888636535">ສືບຕໍ່ບລັອກຄຸກກີ້</translation> <translation id="204622017488417136">ອຸປະກອນຂອງທ່ານຈະກັບຄືນໄປສູ່ Chrome ລຸ້ນທີ່ຕິດຕັ້ງໄວ້ຜ່ານມາ. ທຸກບັນຊີຜູ້ໃຊ້ ແລະຂໍ້ມູນກັບທີ່ຂອງທ່ານຈະຖືກເອົາອອກໄປ. ອັນນີ້ບໍ່ສາມາດເຮັດກັບຄືນໄດ້.</translation> <translation id="2046702855113914483">ຣາເມັງ</translation> @@ -3809,6 +3813,7 @@ <translation id="4594577641390224176">ກຳລັງຊອກຫາໜ້າກ່ຽວກັບລະບົບບໍ? ເຂົ້າເບິ່ງ</translation> <translation id="4595560905247879544">ມີແຕ່ຜູ້ຈັດການ (<ph name="CUSTODIAN_NAME" />) ເທົ່ານັ້ນທີ່ສາມາດດັດແປງແອັບ ແລະ ສ່ວນຂະຫຍາຍໄດ້.</translation> <translation id="4596295440756783523">ທ່ານມີໃບຢັ້ງຢືນຢູ່ໃນໄຟລ໌ທີ່ລະບຸເຊີບເວີເຫຼົ່ານີ້</translation> +<translation id="4598345735110653698">ຈັດການກະແຈຜ່ານ</translation> <translation id="4598556348158889687">ການຈັດການບ່ອນເກັບຂໍ້ມູນ</translation> <translation id="4598776695426288251">Wi-Fi ມີໃຫ້ນຳໃຊ້ຜ່ານຫຼາຍອຸປະກອນ</translation> <translation id="4601426376352205922">ໝາຍວ່າຍັງບໍ່ໄດ້ອ່ານ</translation> @@ -4034,6 +4039,7 @@ <translation id="4823894915586516138">PIN ຫຼື ລະຫັດຜ່ານນີ້ຈະປົກປ້ອງຂໍ້ມູນຂອງທ່ານຢູ່ <ph name="DEVICE_TYPE" /> ນີ້, ຮວມທັງຂໍ້ມູນໃດກໍຕາມທີ່ທ່ານເຂົ້າເຖິງຈາກໂທລະສັບຂອງທ່ານ</translation> <translation id="4824037980212326045">ການສຳຮອງ ແລະ ກູ້ຂໍ້ມູນ Linux</translation> <translation id="4824958205181053313">ຍົກເລີກການຊິ້ງຂໍ້ມູນບໍ?</translation> +<translation id="4825532258163983651">ບໍ່ສາມາດລຶບກະແຈຜ່ານໄດ້</translation> <translation id="4827675678516992122">ບໍ່ສາມາດເຊື່ອມຕໍ່ໄດ້</translation> <translation id="4827784381479890589">ການກວດຄຳຜິດທີ່ປັບປຸງດີຂຶ້ນໃນໂປຣແກຣມທ່ອງເວັບ Chrome (ຂໍ້ຄວາມຖືກສົ່ງໃຫ້ Google ເພື່ອແນະນຳການສະກົດຄຳ)</translation> <translation id="4827904420700932487">ສ້າງລະຫັດ QR ສຳລັບຮູບນີ້</translation> @@ -4296,6 +4302,7 @@ <translation id="5087249366037322692">ເພີ່ມໂດຍພາກສ່ວນທີສາມ</translation> <translation id="5087580092889165836">ເພີ່ມບັດ</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 ດ້ວຍການໃສ່ລະຫັດ RSA</translation> +<translation id="5089763948477033443">ດ້າມຈັບປັບຂະໜາດແຜງຄວບຄຸມດ້ານຂ້າງ</translation> <translation id="5090637338841444533">ບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ຕິດຕາມຕຳແໜ່ງກ້ອງຂອງທ່ານ</translation> <translation id="5093569275467863761">ເຟຣມບ່ອຍແຄສຍ້ອນຫຼັງແບບບໍ່ເປີດເຜີຍຕົວຕົນ: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">ທ່ານສາມາດເປີດ ແລະ ແກ້ໄຂໄຟລ໌ທີ່ຮອງຮັບໄດ້ດ້ວຍແອັບນີ້ຈາກແອັບ Files ຫຼື ແອັບອື່ນ. ເພື່ອຄວບຄຸມວ່າໄຟລ໌ໃດເປີດແອັບນີ້ແບບເລີ່ມຕົ້ນ, <ph name="BEGIN_LINK" />ໃຫ້ສຶກສາວິທີຕັ້ງແອັບເລີ່ມຕົ້ນຢູ່ອຸປະກອນຂອງທ່ານ<ph name="END_LINK" />.</translation> @@ -4461,6 +4468,7 @@ <translation id="5258992782919386492">ຕິດຕັ້ງໃນອຸປະກອນນີ້</translation> <translation id="5260334392110301220">ເຄື່ອງໝາຍວົງຢືມອັດສະລິຍະ</translation> <translation id="5260508466980570042">ຂໍອະໄພ, ບໍ່ສາມາດກວດສອບອີເມວ ຫຼືລະຫັດຜ່ານຂອງທ່ານໄດ້. ກະລຸນາລອງໃໝ່ອີກ.</translation> +<translation id="5260958083445173099">ເວັບໄຊຈະສະແດງເນື້ອຫາເປັນພາສາທີ່ທ່ານຕ້ອງການ, ເມື່ອເປັນໄປໄດ້</translation> <translation id="5261683757250193089">ເປີດໃນ Web Store</translation> <translation id="5262178194499261222">ລຶບລະຫັດຜ່ານອອກ</translation> <translation id="5262784498883614021">ເຊື່ອມຕໍ່ກັບເຄືອຂ່າຍອັດຕະໂນມັດ</translation> @@ -4501,6 +4509,7 @@ <translation id="5294097441441645251">ຕ້ອງເລີ່ມດ້ວຍຕົວອັກສອນຕົວພິມນ້ອຍ ຫຼື ຂີດກ້ອງ</translation> <translation id="5294618183559481278"><ph name="DEVICE_TYPE" /> ຂອງທ່ານຈະໃຊ້ເຊັນເຊີທີ່ມີມາໃນຕົວເພື່ອກວດຫາຄົນທີ່ຢູ່ໜ້າອຸປະກອນຂອງທ່ານ. ຂໍ້ມູນທັງໝົດຈະຖືກປະມວນຜົນຢູ່ອຸປະກອນຂອງທ່ານທັນທີແລ້ວຈາກນັ້ນຈະຖືກລຶບອອກ. ຂໍ້ມູນເຊັນເຊີຈະບໍ່ຖືກສົ່ງໃຫ້ Google ເດັດຂາດ. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="5296350763804564124">ຟັງການຕອບສະໜອງແບບສຽງເວົ້າເພື່ອໃຫ້ທ່ານສາມາດໃຊ້ອຸປະກອນຂອງທ່ານໂດຍບໍ່ຕ້ອງເບິ່ງໜ້າຈໍ. ສາມາດສະແດງຄໍາຕິຊົມເປັນອັກສອນນູນໄດ້ກັບອຸປະກອນທີ່ເຊື່ອມຕໍ່ແລ້ວ.</translation> +<translation id="5297005732522718715">ໂຫຼດການຕັ້ງຄ່າການປ່ອຍສັນຍານຄືນໃໝ່</translation> <translation id="5297082477358294722">ບັນທຶກລະຫັດຜ່ານໄວ້ແລ້ວ. ເບິ່ງ ແລະ ຈັດການລະຫັດຜ່ານທີ່ບັນທຶກໄວ້ໃນ <ph name="SAVED_PASSWORDS_STORE" /> ຂອງທ່ານ.</translation> <translation id="5297946558563358707">ເມື່ອມີຄົນເບິ່ງໜ້າຈໍຂອງທ່ານ, ໃຫ້ສະແດງໄອຄອນຕາຄວາມປອດໄພຢູ່ມຸມຂວາລຸ່ມຂອງໜ້າຈໍທ່ານ</translation> <translation id="5298219193514155779">ສ້າງເທມຂຶ້ນໂດຍ</translation> @@ -4670,6 +4679,7 @@ <translation id="5466374726908360271">ວາງໃສ່ ແລະ ຊອກຫາ “<ph name="SEARCH_TERMS" />”</translation> <translation id="5467207440419968613">ບລັອກ <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ໄວ້ແລ້ວ</translation> <translation id="5468173180030470402">ກຳລັງຊອກຫາການແບ່ງປັນໄຟລ໌</translation> +<translation id="5468330507528805311">ສະຖານະການປ່ອຍສັນຍານ:</translation> <translation id="5468881191994555667">ເລືອກໄຟລ໌</translation> <translation id="5469852975082458401">ທ່ານສາມາດໄປຫາໜ້າຕ່າງໆດ້ວຍເຄີເຊີຂໍ້ຄວາມ. ກົດ F7 ເພື່ອປິດ.</translation> <translation id="5470735824776589490">ຈໍາເປັນຕ້ອງຣິສະຕາດກ່ອນທີ່ຈະສາມາດຣີເຊັດອຸປະກອນຂອງທ່ານດ້ວຍ Powerwash ໄດ້. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> @@ -4944,6 +4954,7 @@ <translation id="5734362860645681824">ການສື່ສານ</translation> <translation id="5734697361979786483">ເພີ່ມການແບ່ງປັນໄຟລ໌</translation> <translation id="5736796278325406685">ກະລຸນາປ້ອນຊື່ຜູ້ໃຊ້ທີ່ຖືກຕ້ອງ</translation> +<translation id="5738093759615225354">ທ່ານຕ້ອງການກະແຈຜ່ານນີ້ເພື່ອເຂົ້າສູ່ລະບົບຄອມພິວເຕີຂອງທ່ານ</translation> <translation id="5739017626473506901">ເຂົ້າສູ່ລະບົບເພື່ອຊ່ວຍ <ph name="USER_NAME" /> ເພີ່ມບັນຊີໂຮງຮຽນ</translation> <translation id="5739235828260127894">ກຳລັງລໍຖ້າການຢັ້ງຢືນ. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="5739458112391494395">ໃຫຍ່ຫຼາຍ</translation> @@ -5105,6 +5116,7 @@ <translation id="589541317545606110">ຊອກຫາໜ້າດ້ວຍ <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">ບໍ່ອະນຸຍາດ</translation> <translation id="5900186025777217044">ປ່ຽນ Smart Lock ແລ້ວ</translation> +<translation id="5900243355162006650">ການຕັ້ງຄ່າການປ່ອຍສັນຍານ:</translation> <translation id="5900302528761731119">ຮູບໂປຣໄຟລ໌ Google</translation> <translation id="590036993063074298">ລາຍລະອຽດຄຸນນະພາບການສະທ້ອນ</translation> <translation id="5901069264981746702">ຂໍ້ມູນລາຍນິ້ວມືຂອງທ່ານຈະຖືກຈັດເກັບໄວ້ຢ່າງປອດໄພ ແລະ ຈະບໍ່ຖືກສົ່ງອອກຈາກ <ph name="DEVICE_TYPE" /> ຂອງທ່ານເດັດຂາດ. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> @@ -5408,6 +5420,7 @@ <translation id="6196640612572343990">ບລັອກຄຸກກີ້ພາກສ່ວນທີສາມ</translation> <translation id="6196854373336333322">ສ່ວນຂະຫຍາຍ "<ph name="EXTENSION_NAME" />" ໄດ້ດໍາເນີນການຄວບຄຸມການຕັ້ງຄ່າພຣັອກຊີຂອງທ່ານ, ເຊິ່ງໝາຍຄວາມວ່າ ມັນສາມາດປ່ຽນແປງ, ທໍາລາຍ, ຫຼືລັກຟັງອັນໃດອັນໜຶ່ງທີ່ທ່ານເຮັດອອນລາຍນ໌ໄດ້. ຖ້າທ່ານບໍ່ແນ່ໃຈວ່າ ເປັນຫຍັງການປ່ຽນແປງນີ້ຈິ່ງເກີດຂຶ້ນ, ທ່ານອາດຈະບໍ່ຕ້ອງການມັນ.</translation> <translation id="6197128521826316819">ສ້າງລະຫັດ QR ສຳລັບໜ້ານີ້</translation> +<translation id="6197223946499512637">ກະແຈຜ່ານເຫຼົ່ານີ້ຖືກເກັບໄວ້ໃນ Windows Hello ຢູ່ຄອມພິວເຕີນີ້. ພວກມັນບໍ່ໄດ້ຖືກບັນທຶກໄວ້ໃນບັນຊີ Google ຂອງທ່ານ.</translation> <translation id="6198252989419008588">ປ່ຽນ PIN</translation> <translation id="6200047250927636406">ຍົກເລີກໄຟລ໌</translation> <translation id="6200151268994853226">ຈັດການສ່ວນຂະຫຍາຍ</translation> @@ -5705,6 +5718,7 @@ <translation id="6482559668224714696">ແວ່ນຂະຫຍາຍເຕັມຈໍ</translation> <translation id="6483485061007832714">ເປີດການດາວໂຫຼດ</translation> <translation id="6483805311199035658">ກໍາລັງເປີດ <ph name="FILE" />...</translation> +<translation id="6486301003991593638">ເພື່ອຈັດການກະແຈຜ່ານ, ໃຫ້ໃຊ້ Windows ເວີຊັນໃໝ່ກວ່າ</translation> <translation id="6488384360522318064">ເລືອກພາສາ</translation> <translation id="648927581764831596">ບໍ່ມີອັນໃດຢູ່</translation> <translation id="6490471652906364588">ອຸປະກອນ USB-C (ຊ່ອງຂວາ)</translation> @@ -6287,6 +6301,7 @@ <translation id="7029307918966275733">ບໍ່ໄດ້ຕິດຕັ້ງ Crostini ກະລຸນາຕິດຕັ້ງ Crostini ເພື່ອເບິ່ງເຄຣດິດ.</translation> <translation id="7029809446516969842">ລະຫັດຜ່ານ</translation> <translation id="7030304022046916278">ສົ່ງ URL ໄປໃຫ້ Safe Browsing ກວດເບິ່ງພວກມັນ</translation> +<translation id="7030695672997239647">ຄລິກຂວາໃສ່ແຖບໃດໜຶ່ງແລ້ວເລືອກ "ເພີ່ມແຖບໃສ່ກຸ່ມ" ແລະ ຫຼັງຈາກນັ້ນໃຫ້ເລືອກ "ກຸ່ມໃໝ່"</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - ເຊື່ອມຕໍ່ຜອດອະນຸກຳແລ້ວ</translation> <translation id="7033616203784997570">ຕ້ອງລະບຸຂໍ້ມູນບໍ່ເກີນ 62 ຕົວອັກສອນ</translation> <translation id="7034692021407794547">ຜູ້ເບິ່ງແຍງລະບົບໃດໜຶ່ງທີ່ມີສິດການຈັດການໃບບິນຈະຕ້ອງຍອມຮັບຂໍ້ກຳນົດບໍລິການຮາດແວ Google Meet ໃນພາກສ່ວນຄອນໂຊຜູ້ເບິ່ງແຍງກ່ອນ.</translation> @@ -7384,6 +7399,7 @@ <translation id="8101987792947961127">ຕ້ອງມີ Powerwash ຢູ່ໃນການປິດເປີດໃໝ່ຄັ້ງຕໍ່ໄປ</translation> <translation id="81020759409809034">ສະຖານທີ່ໃນເຄື່ອງ</translation> <translation id="8102139037507939978">ລຶບຂໍ້ມູນທີ່ລະບຸຕົວຕົນບຸກຄົນໄດ້ອອກຈາກ system_logs.txt.</translation> +<translation id="810362914482827094">ຊອກຫາກະແຈຜ່ານ</translation> <translation id="8104088837833760645">ດາວໂຫຼດໂປຣໄຟລ໌ eSIM</translation> <translation id="8105368624971345109">ປິດ</translation> <translation id="8107015733319732394">ກຳລັງຕິດຕັ້ງ Google Play Store ໃນ <ph name="DEVICE_TYPE" /> ຂອງທ່ານ. ນີ້ສາມາດໃຊ້ເວລາສອງສາມນາທີ.</translation> @@ -7830,6 +7846,7 @@ <translation id="8557022314818157177">ສືບຕໍ່ແຕະກະແຈຄວາມປອດໄພຈົນກວ່າວ່າໄດ້ບັນທຶກລາຍນິ້ວມືຂອງທ່ານໄວ້ແລ້ວ</translation> <translation id="8557180006508471423">ເປີດໃຊ້ "Google Chrome" ໃນບໍລິການສະຖານທີ່ຢູ່ Mac ຂອງທ່ານ</translation> <translation id="8557856025359704738">ການດາວໂຫຼດຕໍ່ໄປແມ່ນ <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">ກະແຈຜ່ານ</translation> <translation id="8560327176991673955">{COUNT,plural, =0{ເປີດທັງໝົດໃນ&ໜ້າຈໍໃໝ່}=1{ເປີດໃນ&ໜ້າຈໍໃໝ່}other{ເປີດທັງໝົດ ({COUNT}) ໃນ&ໜ້າຈໍໃໝ່}}</translation> <translation id="8561206103590473338">ຊ້າງ</translation> <translation id="8561565784790166472">ດຳເນີນການດ້ວຍຄວາມລະມັດລະວັງ</translation> @@ -7956,6 +7973,7 @@ <translation id="8677212948402625567">ຍຸບເຊື່ອງທັງໝົດ...</translation> <translation id="867767487203716855">ອັບເດດຕໍ່ໄປ</translation> <translation id="8677859815076891398">ບໍ່ມີອະລະບ້ຳ. ສ້າງອະລະບໍ້າໃນ <ph name="LINK_BEGIN" />Google ຮູບພາບ<ph name="LINK_END" />.</translation> +<translation id="8678378565142776698">ຣີສະຕາດ ແລະ ຮັບການອັບເດດອັດຕະໂນມັດ</translation> <translation id="8678538439778360739">ເຂົ້າລະຫັດຂໍ້ມູນໂດຍໃຊ້ລະຫັດຜ່ານການຊິ້ງຂໍ້ມູນຂອງທ່ານເມື່ອ <ph name="TIME" />. ນີ້ບໍ່ຮວມເອົາວິທີການຈ່າຍເງິນ ແລະ ທີ່ຢູ່ຈາກ Google Pay.</translation> <translation id="8678582529642151449">ບໍ່ມີການຫຍໍ້ຂະໜາດແຖບ</translation> <translation id="8678933587484842200">ທ່ານຕ້ອງການໃຫ້ແອັບພລິເຄຊັນນີ້ເປີດໃຊ້ແນວໃດ?</translation> @@ -8202,6 +8220,7 @@ <translation id="8910987510378294980">ເຊື່ອງລາຍຊື່ອຸປະກອນ</translation> <translation id="8912362522468806198">ບັນຊີ Google</translation> <translation id="8912810933860534797">ເປີດນຳໃຊ້ການສະແກນອັດຕະໂນມັດ</translation> +<translation id="8915307125957890427">ຄລິກຂວາໃສ່ແຖບໃດໜຶ່ງແລ້ວເລືອກ "ເພີ່ມແຖບໃສ່ກຸ່ມ" ແລະ ຫຼັງຈາກນັ້ນໃຫ້ເລືອກ "ກຸ່ມໃໝ່"</translation> <translation id="8915370057835397490">ກໍາລັງໂຫຼດຄໍາແນະນໍາ</translation> <translation id="8916476537757519021">ຂອບຍ່ອຍທີ່ບໍ່ເຜີຍຕົນຕົວ: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> ຂອງ <ph name="GIVEN_NAME" /></translation> @@ -8275,6 +8294,7 @@ <translation id="8986362086234534611">ລືມ</translation> <translation id="8986494364107987395">ສົ່ງສະຖິຕິການໃຊ້ ແລະລາຍງານການຂັດຂ້ອງໄປຫາ Google ໂດຍອັດຕະໂນມັດ</translation> <translation id="8987927404178983737">ເດືອນ</translation> +<translation id="8989359959810288806">ໂຫຼດສະຖານະການປ່ອຍສັນຍານຄືນໃໝ່</translation> <translation id="8991520179165052608">ເວັບໄຊສາມາດໃຊ້ໄມໂຄຣໂຟນຂອງທ່ານໄດ້</translation> <translation id="899384117894244799">ລຶບຜູ້ໃຊ້ທີ່ຖືກຈຳກັດອອກ</translation> <translation id="899403249577094719">URL ຖານໃບຢັ້ງຢືນ Netscape</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb index 560c3d9..2cc6d8f 100644 --- a/chrome/app/resources/generated_resources_mk.xtb +++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Користете ги микрофонот и фотоапаратот</translation> <translation id="1005333234656240382">Да се овозможи отстранување грешки на ADB?</translation> <translation id="1006873397406093306">Екстензијава може да ги чита и менува вашите податоци на сајтовите. Може да ги контролирате сајтовите до кои таа има пристап.</translation> +<translation id="1007057452468855774">Вклучи ја Google Play Store</translation> <translation id="1008186147501209563">Извезување обележувачи</translation> <translation id="1008557486741366299">Не сега</translation> <translation id="1009476156254802388">Локација на <ph name="WEB_DRIVE" /></translation> <translation id="1009663062402466586">Сега се достапни контроли за игри</translation> <translation id="1010498023906173788">Картичкава е поврзана со сериска порта.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Страница не реагира}one{Страница не реагира}other{Страници не реагираат}}</translation> +<translation id="1011003645819296594">Зачувани уреди</translation> <translation id="1011355516189274711">Јачина на звук за „Од текст во говор“</translation> <translation id="1012794136286421601">Вашите документи, листови, слајдови и цртежи се синхронизираат. Отворете ја апликацијата Google Диск за да им пристапите на интернет или локално.</translation> <translation id="1012876632442809908">USB-Ц уред (предна порта)</translation> @@ -495,6 +497,7 @@ <translation id="1470350905258700113">Користи го уредов</translation> <translation id="1470946456740188591">За да вклучите или исклучите „Прелистување со курсор“, користете ја кратенката Ctrl+Пребарување+7</translation> <translation id="1472675084647422956">Прикажи повеќе</translation> +<translation id="1473223074251193484">Поставете конфигурација за интернет преку мобилен</translation> <translation id="1474785664565228650">Промената во поставката за микрофонот бара рестартирање на Parallels Desktop. Рестартирајте ја Parallels Desktop за да продолжите.</translation> <translation id="1474893630593443211">Поголема контрола над рекламите што ги гледате</translation> <translation id="1475502736924165259">Имате сертификати што не припаѓаат во ниедна друга категорија</translation> @@ -1126,6 +1129,7 @@ <translation id="2044014337866019681">Проверете дали ја потврдувате <ph name="ACCOUNT" /> за да ја отклучите сесијата.</translation> <translation id="204497730941176055">Име на шаблон на сертификат на Microsoft</translation> <translation id="2045117674524495717">Помош за кратенка од тастатурата</translation> +<translation id="2045211794962848221">Нема да ја гледате оваа конкретна порака повторно</translation> <translation id="2045969484888636535">Продолжи да блокираш колачиња</translation> <translation id="204622017488417136">Уредот ќе се врати на претходно инсталираната верзија на Chrome. Сите кориснички сметки и локални податоци ќе се отстранат. Ова не може да се врати назад.</translation> <translation id="2046702855113914483">Рамен</translation> @@ -3815,6 +3819,7 @@ <translation id="4594577641390224176">Ја барате страницата „За“ на системот? Оди</translation> <translation id="4595560905247879544">Апликациите и екстензиите може да ги менува само управникот (<ph name="CUSTODIAN_NAME" />).</translation> <translation id="4596295440756783523">Имате сертификати што ги идентификуваат овие сервери</translation> +<translation id="4598345735110653698">Управувајте со криптографските клучеви</translation> <translation id="4598556348158889687">Управување со меморијата</translation> <translation id="4598776695426288251">Wi-Fi е достапно преку повеќе уреди</translation> <translation id="4601426376352205922">Обележи како непрочитано</translation> @@ -4040,6 +4045,7 @@ <translation id="4823894915586516138">Овој PIN или лозинка ги штити вашите податоци на овој <ph name="DEVICE_TYPE" />, вклучително и податоците до кои пристапувате од вашиот телефон.</translation> <translation id="4824037980212326045">Бекап и враќање на Linux</translation> <translation id="4824958205181053313">Да се откаже синхронизацијата?</translation> +<translation id="4825532258163983651">Не може да се избрише криптографскиот клуч</translation> <translation id="4827675678516992122">Не може да се поврзе</translation> <translation id="4827784381479890589">Напредна проверка на правописот во прелистувачот Chrome (текстот се испраќа во Google за правописни предлози)</translation> <translation id="4827904420700932487">Создајте QR-код за сликава</translation> @@ -4302,6 +4308,7 @@ <translation id="5087249366037322692">Додадено од трето лице</translation> <translation id="5087580092889165836">Додај картичка</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 со RSA шифрирање</translation> +<translation id="5089763948477033443">Рачка за менување големина на странична табла</translation> <translation id="5090637338841444533">Не им е дозволено да ја следат позицијата на камерата</translation> <translation id="5093569275467863761">Подрамка за инкогнито за кеш за движење наназад/нанапред: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">Со апликацијава може да отворате и уредувате поддржани датотеки од апликацијата Files или од други апликации. За да контролирате кои датотеки стандардно се отвораат во апликацијава, <ph name="BEGIN_LINK" />дознајте како да поставите стандардни апликации на вашиот уред<ph name="END_LINK" />.</translation> @@ -4467,6 +4474,7 @@ <translation id="5258992782919386492">Инсталирај на уредов</translation> <translation id="5260334392110301220">Паметни наводници</translation> <translation id="5260508466980570042">За жал, вашите е-пошта или лозинка не можеа да се потврдат. Обидете се повторно.</translation> +<translation id="5260958083445173099">Кога е можно, веб-сајтовите ќе прикажуваат содржини на вашиот претпочитан јазик</translation> <translation id="5261683757250193089">Отвори во Web Store</translation> <translation id="5262178194499261222">Отстрани ја лозинката</translation> <translation id="5262784498883614021">Автоматско поврзување на мрежа</translation> @@ -4507,6 +4515,7 @@ <translation id="5294097441441645251">Мора да почнува со мала буква или долна црта</translation> <translation id="5294618183559481278">Вашиот <ph name="DEVICE_TYPE" /> користи вграден сензор за да открие луѓе пред вашиот уред. Сите податоци веднаш се обработуваат на уредот и се бришат потоа. Податоци од сензорите никогаш не се испраќаат до Google. <ph name="LINK_BEGIN" />Дознајте повеќе<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Слушајте говорни повратни информации за да може да го користите уредот без да гледате во екранот. Повратни информации со Брајово писмо се достапни со поврзан уред.</translation> +<translation id="5297005732522718715">Освежи ја конфигурацијата за интернет преку мобилен</translation> <translation id="5297082477358294722">Лозинката е зачувана. Прегледајте ги и управувајте со зачуваните лозинки во вашата <ph name="SAVED_PASSWORDS_STORE" />.</translation> <translation id="5297946558563358707">Кога некој друг гледа во вашиот екран, долу десно на екранот се прикажува иконата „Око за приватност“</translation> <translation id="5298219193514155779">Тема креирана од</translation> @@ -4677,11 +4686,13 @@ <translation id="5466374726908360271">&Залепи и пребарај „<ph name="SEARCH_TERMS" />“</translation> <translation id="5467207440419968613">Блокирани: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation> <translation id="5468173180030470402">Се бараат споделувања датотеки</translation> +<translation id="5468330507528805311">Статус на интернет преку мобилен:</translation> <translation id="5468881191994555667">Изберете датотека</translation> <translation id="5469852975082458401">Може да се движите низ страниците со курсорот за текст. Притиснете F7 за да исклучите.</translation> <translation id="5470735824776589490">Треба да го рестартирате уредот за да може да го ресетирате со Powerwash. <ph name="LINK_BEGIN" />Дознајте повеќе<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Здраво! Јас сум вашиот глас за функцијата „Од текст до говор“.</translation> <translation id="5472627187093107397">Зачувувај лозинки за сајтов</translation> +<translation id="5473062644742711742">Најдете други алатки за пристапност во Веб-продавницата на Chrome</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">Ако продолжите, се согласувате дека уредов може автоматски да презема и инсталира ажурирања и апликации од Google, од операторот на детето и од производителот на уредов, веројатно со користење мобилен интернет. Некои од апликацииве може да нудат купувања во апликација.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{PIN-кодот мора да содржи најмалку еден знак}one{PIN-кодот мора да содржи најмалку # знак}other{PIN-кодот мора да содржи најмалку # знака}}</translation> @@ -4953,6 +4964,7 @@ <translation id="5734362860645681824">Комуникации</translation> <translation id="5734697361979786483">Додајте споделување датотеки</translation> <translation id="5736796278325406685">Внесете важечко корисничко име</translation> +<translation id="5738093759615225354">Овој криптографски клуч ви е потребен за најавување на вашиот компјутер</translation> <translation id="5739017626473506901">Најавете се за да му помогнете на корисникот <ph name="USER_NAME" /> да додаде училишна сметка</translation> <translation id="5739235828260127894">Се чека потврда. <ph name="LINK_BEGIN" />Дознајте повеќе<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Многу голем</translation> @@ -5114,6 +5126,7 @@ <translation id="589541317545606110">Пребарајте ја страницата со <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">Не дозволувај</translation> <translation id="5900186025777217044">Smart Lock е променето.</translation> +<translation id="5900243355162006650">Конфигурација на интернет преку мобилен:</translation> <translation id="5900302528761731119">Фотографија на профилот на Google</translation> <translation id="590036993063074298">Детали за квалитет на отсликувањето</translation> <translation id="5901069264981746702">Податоците за отпечатокот безбедно се складираат и никогаш не го напуштаат <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Дознајте повеќе<ph name="LINK_END" /></translation> @@ -5417,6 +5430,7 @@ <translation id="6196640612572343990">Блокирај колачиња од трети лица</translation> <translation id="6196854373336333322">Наставката „<ph name="EXTENSION_NAME" />“ ја презеде контролата врз поставките за прокси, што значи дека може да менува, прекинува или прислушува сѐ што правите на интернет. Доколку не сте сигурни зошто се случила промената, веројатно не ја сакате.</translation> <translation id="6197128521826316819">Создајте QR-код за страницава</translation> +<translation id="6197223946499512637">Овие криптографски клучеви се складирани во Windows Hello на компјутеров. Тие не се зачувани во вашата сметка на Google.</translation> <translation id="6198252989419008588">Промена на PIN</translation> <translation id="6200047250927636406">Отфрли ја датотеката</translation> <translation id="6200151268994853226">Управувајте со наставката</translation> @@ -5714,6 +5728,7 @@ <translation id="6482559668224714696">Лупа за цел екран</translation> <translation id="6483485061007832714">Отворање преземена датотека</translation> <translation id="6483805311199035658">Се отвора <ph name="FILE" />…</translation> +<translation id="6486301003991593638">За да управувате со криптографските клучеви, користете понова верзија на Windows</translation> <translation id="6488384360522318064">Изберете јазик</translation> <translation id="648927581764831596">Ништо не е достапно</translation> <translation id="6490471652906364588">USB-Ц уред (десна порта)</translation> @@ -6302,6 +6317,7 @@ <translation id="7029307918966275733">Нема инсталирано Crostini. Инсталирајте Crostini за да ги прегледате благодарностите.</translation> <translation id="7029809446516969842">Лозинки</translation> <translation id="7030304022046916278">Испраќа URL-адреси во „Безбедно прелистување“ за да се проверат</translation> +<translation id="7030695672997239647">Кликнете со десно копче на картичка и изберете „Додај картичка на група“, а потоа изберете „Нова група“</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - Поврзана е сериска порта</translation> <translation id="7033616203784997570">Внесениот текст мора да биде најмногу 62 знаци</translation> <translation id="7034692021407794547">Администраторот со привилегии за „Управување со наплати“ мора прво да ги прифати „Условите за користење хардвер на Google Meet “ во делот „Хардвер на Google Meet“ на администраторската конзола.</translation> @@ -7403,6 +7419,7 @@ <translation id="8101987792947961127">Потребно е фабричко ресетирање на следното рестартирање</translation> <translation id="81020759409809034">Локална локација</translation> <translation id="8102139037507939978">Отстрани ги податоците што откриваат идентитет од датотеката system_logs.txt.</translation> +<translation id="810362914482827094">Пребарајте криптографски клучеви</translation> <translation id="8104088837833760645">Преземете профил на eSIM</translation> <translation id="8105368624971345109">Исклучи</translation> <translation id="8107015733319732394">Google Play Store се инсталира на вашиот <ph name="DEVICE_TYPE" />. Ова може да потрае неколку минути.</translation> @@ -7853,6 +7870,7 @@ <translation id="8557022314818157177">Допирајте го безбедносниот клуч додека не се сними вашиот отпечаток</translation> <translation id="8557180006508471423">Вклучете „Google Chrome“ во „Услуги според локација“ на вашиот Mac</translation> <translation id="8557856025359704738">Следното преземање е на <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">Криптографски клучеви</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Отвори ги сите во &нов прозорец}=1{Отвори во &нов прозорец}one{Отвори ги сите ({COUNT}) во &нов прозорец}other{Отвори ги сите ({COUNT}) во &нов прозорец}}</translation> <translation id="8561206103590473338">Слон</translation> <translation id="8561565784790166472">Продолжете внимателно</translation> @@ -7979,6 +7997,7 @@ <translation id="8677212948402625567">Собери ги сите...</translation> <translation id="867767487203716855">Следно ажурирање</translation> <translation id="8677859815076891398">Нема албуми. Создајте албум во <ph name="LINK_BEGIN" />Фотографии на Google<ph name="LINK_END" />.</translation> +<translation id="8678378565142776698">Рестартирајте и добивајте автоматски ажурирања</translation> <translation id="8678538439778360739">Податоците се шифрирани со вашата лозинка за синхронизација на <ph name="TIME" />. Тоа не ги вклучува начините на плаќање и адресите од Google Pay.</translation> <translation id="8678582529642151449">Картичките не се собираат</translation> <translation id="8678933587484842200">Како би сакале да стартува апликацијава?</translation> @@ -8226,6 +8245,7 @@ <translation id="8910987510378294980">Сокријте го списокот со уреди</translation> <translation id="8912362522468806198">Сметка на Google</translation> <translation id="8912810933860534797">Овозможете автоматско скенирање</translation> +<translation id="8915307125957890427">Кликнете со десно копче на картичка и изберете „Додај картичка на група“, а потоа изберете „Нова група“</translation> <translation id="8915370057835397490">Се вчитува предлог</translation> <translation id="8916476537757519021">Инкогнито подрамка: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> на <ph name="GIVEN_NAME" /></translation> @@ -8300,6 +8320,7 @@ <translation id="8986362086234534611">Заборави</translation> <translation id="8986494364107987395">Автоматски испрати статистика за користење и извештаи за падови до Google</translation> <translation id="8987927404178983737">Месец</translation> +<translation id="8989359959810288806">Освежи го статусот на интернет преку мобилен</translation> <translation id="8991520179165052608">Сајтот може да го користи микрофонот</translation> <translation id="899384117894244799">Отстрани ограничен корисник</translation> <translation id="899403249577094719">Основен URL за сертификат на Netscape</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index 434949d2..51b5fd8 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -894,6 +894,7 @@ <translation id="1829129547161959350">പെൻഗ്വിൻ</translation> <translation id="1829192082282182671">സൂം &ഔട്ട് ചെയ്യുക</translation> <translation id="1830550083491357902">പ്രവേശിച്ചിട്ടില്ല</translation> +<translation id="1831848493690504725">കണക്റ്റ് ചെയ്ത നെറ്റ്വർക്കിലൂടെ ഞങ്ങൾക്ക് Google-ലേക്ക് എത്തിച്ചേരാനാകുന്നില്ല. മറ്റൊരു നെറ്റ്വർക്ക് തിരഞ്ഞെടുക്കാനോ നിങ്ങളുടെ നെറ്റ്വർക്ക് ക്രമീകരണമോ പ്രോക്സി ക്രമീകരണമോ പരിശോധിക്കാനോ ശ്രമിക്കുക (നിങ്ങൾ ഒരു പ്രോക്സിയാണ് ഉപയോഗിക്കുന്നതെങ്കിൽ).</translation> <translation id="1832459821645506983">ഞാൻ സമ്മതിക്കുന്നു</translation> <translation id="1832511806131704864">ഫോൺ മാറ്റം അപ്ഡേറ്റ് ചെയ്തു</translation> <translation id="1832848789136765277">സമന്വയിപ്പിക്കുന്ന ഡാറ്റ നിങ്ങൾക്ക് എപ്പോഴും ആക്സസ് ചെയ്യാനാകുമെന്ന് ഉറപ്പാക്കാൻ ഇത് നിങ്ങളാണെന്ന് പരിശോധിച്ചുറപ്പിക്കുക</translation> @@ -2192,6 +2193,7 @@ <translation id="3021065318976393105">ബാറ്ററി ഉപയോഗിക്കുമ്പോൾ</translation> <translation id="3021066826692793094">ചിത്രശലഭം</translation> <translation id="3021678814754966447">ഫ്രെയിം ഉറവിടം &കാണുക</translation> +<translation id="3022361196600037287">ഈ Chromebook-ൽ നിന്ന് <ph name="DEVICE" /> നീക്കം ചെയ്യും, അത് <ph name="PRIMARY_EMAIL" /> എന്നതിൽ സംരക്ഷിക്കില്ല.</translation> <translation id="3022978424994383087">അത് മനസ്സിലായില്ല.</translation> <translation id="3023464535986383522">വായിച്ചുകേൾക്കാൻ തിരഞ്ഞെടുക്കുക</translation> <translation id="3024374909719388945">24 മണിക്കൂര് ക്ലോക്ക് ഉപയോഗിക്കുക</translation> @@ -3729,6 +3731,7 @@ <translation id="4535127706710932914">ഡിഫോൾട്ട് പ്രൊഫൈൽ</translation> <translation id="4535767533210902251">ഫിംഗർപ്രിന്റ് സെൻസർ നിങ്ങളുടെ കീബോർഡിൽ മുകളിലെ വലതുഭാഗത്തെ കീയാണ്. ഏതെങ്കിലും വിരലുകൊണ്ട് അതിൽ മൃദുവായി സ്പർശിക്കുക.</translation> <translation id="4536140153723794651">എല്ലായ്പ്പോഴും കുക്കികൾ ഉപയോഗിക്കാനാവുന്ന സൈറ്റുകൾ</translation> +<translation id="4536769240747010177">ടെതറിംഗ് ശേഷികൾ:</translation> <translation id="4538417792467843292">പദം ഇല്ലാതാക്കുക</translation> <translation id="4538792345715658285">എന്റർപ്രൈസ് നയത്തിനാൽ ഇൻസ്റ്റാൾ ചെയ്യപ്പെട്ടത്</translation> <translation id="4541123282641193691">നിങ്ങളുടെ അക്കൗണ്ട് പരിശോധിച്ചുറപ്പിക്കാനായില്ല. വീണ്ടും ശ്രമിക്കുക അല്ലെങ്കിൽ Chromebook റീസ്റ്റാർട്ട് ചെയ്യുക.</translation> @@ -3756,6 +3759,7 @@ <translation id="4561893854334016293">അടുത്തിടെ അനുമതികളൊന്നും മാറ്റിയിട്ടില്ല</translation> <translation id="4562155214028662640">വിരലടയാളം ചേർക്കുക</translation> <translation id="4563210852471260509">പ്രാരംഭ ഇന്പുട്ട് ഭാഷ ചൈനീസ് ആണ്</translation> +<translation id="4563382028841851106">അക്കൗണ്ടിൽ നിന്ന് നീക്കം ചെയ്യുക</translation> <translation id="4563880231729913339">വിരൽ 3</translation> <translation id="4564245002465020751">നിങ്ങളുടെ ഫോണിലെ സജ്ജീകരണം പൂർത്തിയാക്കുക</translation> <translation id="4565377596337484307">പാസ്വേഡ് മറയ്ക്കുക</translation> @@ -4732,6 +4736,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> ഇത് ചെയ്യാൻ ആവശ്യപ്പെടുന്നു</translation> <translation id="5534304873398226603">ഫോട്ടോയോ വീഡിയോയോ തള്ളിക്കളയുക</translation> <translation id="5537725057119320332">കാസ്റ്റ്</translation> +<translation id="5539070192556911367">Google-ൽ എത്തിച്ചേരാനാകുന്നില്ല</translation> <translation id="5539221284352502426">നിങ്ങൾ നൽകിയ പാസ്വേഡ് സെർവർ നിരസിച്ചു. സാധ്യമായ കാരണങ്ങൾ ഇവയാണ്: പാസ്വേഡ് വളരെ ചെറുതാണ്. പാസ്വേഡിൽ അക്കങ്ങളും ചിഹ്നങ്ങളും അടങ്ങിയിരിക്കണം. പുതിയ പാസ്വേഡ്, മുമ്പ് ഉപയോഗിച്ചിട്ടുള്ള പാസ്വേഡുകളിൽ നിന്ന് വ്യത്യസ്തമായിരിക്കണം.</translation> <translation id="5541694225089836610">പ്രവർത്തനം നിങ്ങളുടെ അഡ്മിൻ പ്രവർത്തനരഹിതമാക്കി</translation> <translation id="5542132724887566711">പ്രൊഫൈൽ</translation> @@ -4795,6 +4800,7 @@ <translation id="5585912436068747822">ഫോർമാറ്റുചെയ്യൽ പരാജയപ്പെട്ടു</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">ആപ്പുകൾ ലോഡുചെയ്യുന്നു...</translation> +<translation id="5590418976913374224">ഉപകരണം ആരംഭിക്കുമ്പോൾ ശബ്ദം പ്ലേ ചെയ്യുക</translation> <translation id="5592595402373377407">ഇതുവരെയും മതിയായ ഡാറ്റ ലഭ്യമല്ല.</translation> <translation id="5595307023264033512">സൈറ്റുകൾ ഉപയോഗിച്ച മൊത്തം സ്റ്റോറേജ്: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">വിലാസം എഡിറ്റ് ചെയ്യുക</translation> @@ -6174,6 +6180,10 @@ <translation id="6943939122536910181"><ph name="DEVICE" /> എന്നതിൽ നിന്ന് വിച്ഛേദിച്ചു</translation> <translation id="6945221475159498467">തിരഞ്ഞെടുക്കുക</translation> <translation id="694592694773692225">ഈ പേജിൽ റീഡയറക്ട് ചെയ്യുന്നത് ബ്ലോക്ക് ചെയ്തു.</translation> +<translation id="6947015141909171112">റെസിപ്പികൾക്കുള്ള നിങ്ങളുടെ സമീപകാല തിരയൽ ആക്റ്റിവിറ്റി അടിസ്ഥാനമാക്കിയുള്ള റെസിപ്പികൾ ആണ് നിങ്ങൾ കാണുന്നത്. + <ph name="BREAK" /> + <ph name="BREAK" /> + നിങ്ങൾക്ക് കാർഡ് മെനുവിൽ നിന്ന് ക്രമീകരണം മാനേജ് ചെയ്യാം അല്ലെങ്കിൽ Chrome ഇഷ്ടാനുസൃതമാക്കൂ എന്നതിൽ, കൂടുതൽ ഓപ്ഷനുകൾ കാണാം.</translation> <translation id="6949434160682548041">പാസ്വേഡ് (ഓപ്ഷണൽ)</translation> <translation id="6950627417367801484">ആപ്പുകൾ പുനഃസ്ഥാപിക്കുക</translation> <translation id="6952242901357037157">നിങ്ങളുടെ <ph name="BEGIN_LINK" />Google അക്കൗണ്ടിൽ<ph name="END_LINK" /> നിന്നുള്ള പാസ്വേഡുകളും ഇവിടെ കാണിക്കാം</translation> @@ -6341,6 +6351,7 @@ <translation id="7102687220333134671">സ്വയമേവയുള്ള അപ്ഡേറ്റുകൾ ഓണാണ്</translation> <translation id="7102832101143475489">അഭ്യർത്ഥന കാലഹരണപ്പെട്ടു</translation> <translation id="710640343305609397">നെറ്റ്വര്ക്ക് ക്രമീകരണം തുറക്കുക</translation> +<translation id="7107609441453408294">എല്ലാ സ്പീക്കറുകളിലും ഒരേ ഓഡിയോ പ്ലേ ചെയ്യുക</translation> <translation id="7108338896283013870">മറയ്ക്കുക</translation> <translation id="7108668606237948702">നല്കുക</translation> <translation id="7108933416628942903">ഇപ്പോൾ ലോക്ക് ചെയ്യുക</translation> @@ -6571,6 +6582,7 @@ <translation id="7364745943115323529">കാസ്റ്റുചെയ്യുക...</translation> <translation id="7364796246159120393">ഫയല് തിരഞ്ഞെടുക്കൂ</translation> <translation id="7365076891350562061">മോണിറ്റർ വലുപ്പം</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" /> - പിൻ ചെയ്തത്</translation> <translation id="7366316827772164604">സമീപ ഉപകരണങ്ങൾക്ക് സ്കാൻ ചെയ്യുന്നു…</translation> <translation id="7366415735885268578">ഒരു സൈറ്റ് ചേർക്കുക</translation> <translation id="7366909168761621528">ഡാറ്റ ബ്രൌസ് ചെയ്യുന്നു</translation> @@ -6967,6 +6979,7 @@ <translation id="7737115349420013392">"<ph name="DEVICE_NAME" />"-മായി ജോടിയാക്കുന്നു ...</translation> <translation id="7737846262459425222">ക്രമീകരണം > Google Assistant > സ്ക്രീൻ പശ്ചാത്തലം എന്നതിൽ ഏതുസമയത്തും നിങ്ങൾക്കിത് മാറ്റാം.</translation> <translation id="7737948071472253612">നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കാൻ അനുവദിക്കുന്നില്ല</translation> +<translation id="77381465218432215">ഉച്ചാരണ ചിഹ്നങ്ങളും പ്രത്യേക അക്ഷരങ്ങളും കാണിക്കുക</translation> <translation id="7740996059027112821">സാധാരണം</translation> <translation id="7741307896921365578">വായിക്കാനുള്ളവയുടെ ലിസ്റ്റും ബുക്ക്മാർക്കുകളും ആക്സസ് ചെയ്യാനുള്ള ഉപയോഗപ്രദവും നിരന്തരവുമായ മാർഗ്ഗത്തിനുള്ള ബ്രൗസർ-ലെവൽ സെെഡ് പാനൽ പ്രവർത്തനക്ഷമമാക്കുന്നു.</translation> <translation id="7742558784808143689"><ph name="SITE_NAME" /> എന്ന സൈറ്റിനും അതിന് കീഴിലുള്ള എല്ലാ സൈറ്റുകൾക്കും ഇൻസ്റ്റാൾ ചെയ്ത ആപ്പുകൾക്കുമുള്ള സൈറ്റ് ഡാറ്റയും അനുമതികളും മായ്ക്കണോ?</translation> @@ -7756,6 +7769,7 @@ <translation id="8486666913807228950">കാരണം: "നിർബന്ധിതമായി തുറക്കുക" ലിസ്റ്റിൽ <ph name="REVERT_RULE" /> എന്ന ഇൻവേർട്ടഡ് നിയമം കണ്ടെത്തി.</translation> <translation id="848666842773560761">ഒരു ആപ്പ് ക്യാമറ ആക്സസ് ചെയ്യാൻ ശ്രമിക്കുന്നു. ആക്സസ് അനുവദിക്കുന്നതിന് ക്യാമറാ സ്വകാര്യതാ സ്വിച്ച് ഓഫാക്കുക.</translation> <translation id="8487678622945914333">സൂം ഇന് ചെയ്യുക</translation> +<translation id="8487699605742506766">ഹോട്ട്സ്പോട്ട്</translation> <translation id="8489156414266187072">വ്യക്തിപരമായ നിർദ്ദേശങ്ങൾ നിങ്ങളുടെ അക്കൗണ്ടിൽ മാത്രമേ ദൃശ്യമാകൂ</translation> <translation id="8490896350101740396">ഇനിപ്പറയുന്ന കിയോസ്ക് ആപ്പുകൾ "<ph name="UPDATED_APPS" />" അപ്ഡേറ്റ് ചെയ്തു. അപ്ഡേറ്റ് ചെയ്യൽ പ്രോസസ് പൂർത്തിയാക്കുന്നതിന് ഉപകരണം റീബൂട്ട് ചെയ്യുക.</translation> <translation id="8492685019009920170">നിങ്ങളുടെ വിരൽ ഉപയോഗിച്ച് ഫിംഗർപ്രിന്റ് സെൻസറിൽ സ്പർശിക്കുക. നിങ്ങളുടെ ഡാറ്റ <ph name="DEVICE_TYPE" /> എന്നതിൽ സുരക്ഷിതമായി സംഭരിക്കുന്നു, ഒരിക്കലും അതിൽ നിന്ന് പുറത്ത് പോകില്ല.</translation> @@ -8248,6 +8262,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" എന്നതും മറ്റൊരു ടാബും}other{"<ph name="TAB_TITLE" />" എന്നതും മറ്റ് # ടാബുകളും}}</translation> <translation id="8977811652087512276">പാസ്വേഡ് തെറ്റോ ഫയൽ കേടോ ആണ്</translation> <translation id="8978154919215542464">ഓണാണ് - എല്ലാം സമന്വയിപ്പിക്കുക</translation> +<translation id="8978670037548431647">ടെതറിംഗ് ശേഷികൾ റീഫ്രഷ് ചെയ്യുക</translation> <translation id="897939795688207351"><ph name="ORIGIN" />-ൽ</translation> <translation id="8980345560318123814">ഫീഡ്ബാക്ക് റിപ്പോർട്ടുകൾ</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> - ക്രാഷായി</translation> @@ -8512,6 +8527,7 @@ <translation id="935854577147268200">Smart Lock ഫോൺ മാറ്റി. Smart Lock അപ്ഡേറ്റ് ചെയ്യാൻ നിങ്ങളുടെ പാസ്വേഡ് നൽകുക. അടുത്ത തവണ, നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> ഫോൺ അൺലോക്ക് ചെയ്യും. ക്രമീകരണത്തിൽ Smart Lock ഓഫാക്കാം</translation> <translation id="936646668635477464">ക്യാമറയും മൈക്രോഫോണും</translation> <translation id="936801553271523408">സിസ്റ്റം ഡയഗണോസ്റ്റിക് ഡാറ്റ</translation> +<translation id="937053962468712792"><ph name="PRIMARY_EMAIL" /> എന്നതിൽ നിന്ന് <ph name="DEVICE" /> നീക്കം ചെയ്യണോ?</translation> <translation id="93766956588638423">വിപുലീകരണം റിപ്പയർ ചെയ്യുക</translation> <translation id="938568644810664664">“Ok Google, ഇത് ഏത് പാട്ട് ആണ്?” അല്ലെങ്കിൽ “Ok Google, എന്റെ സ്ക്രീനിൽ എന്താണുള്ളത്?” എന്ന് പറഞ്ഞുനോക്കൂ</translation> <translation id="938623846785894166">സാധാരണ ഉപയോഗിക്കാത്ത ഫയൽ</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index 4e8091a8..258df93 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Gunakan mikrofon dan kamera anda</translation> <translation id="1005333234656240382">Dayakan penyahpepijatan ADB?</translation> <translation id="1006873397406093306">Sambungan ini boleh membaca dan menukar data anda pada tapak. Anda boleh mengawal tapak yang boleh diakses oleh sambungan itu.</translation> +<translation id="1007057452468855774">Hidupkan Google Play Store</translation> <translation id="1008186147501209563">Eksport penanda halaman</translation> <translation id="1008557486741366299">Bukan Sekarang</translation> <translation id="1009476156254802388">Lokasi <ph name="WEB_DRIVE" /></translation> <translation id="1009663062402466586">Kini kawalan permainan tersedia</translation> <translation id="1010498023906173788">Tab ini disambungkan ke port bersiri.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Halaman Tidak Responsif}other{Halaman Tidak Responsif}}</translation> +<translation id="1011003645819296594">Peranti disimpan</translation> <translation id="1011355516189274711">Kelantangan teks ke pertuturan</translation> <translation id="1012794136286421601">Fail Dokumen, Helaian, Slaid dan Lukisan anda sedang disegerakkan. Buka apl Google Drive untuk mengakses fail dalam talian atau luar talian.</translation> <translation id="1012876632442809908">Peranti USB-C (port depan)</translation> @@ -494,6 +496,7 @@ <translation id="1470350905258700113">Gunakan peranti ini</translation> <translation id="1470946456740188591">Untuk menghidupkan atau mematikan semak imbas karet, gunakan pintasan Ctrl+Search+7</translation> <translation id="1472675084647422956">Tunjukkan lagi</translation> +<translation id="1473223074251193484">Tetapkan Konfigurasi Penambatan</translation> <translation id="1474785664565228650">Perubahan dalam tetapan mikrofon memerlukan Desktop Parallels dilancarkan semula. Lancarkan semula Desktop Parallels untuk meneruskan.</translation> <translation id="1474893630593443211">Lebih kawalan terhadap iklan yang anda lihat</translation> <translation id="1475502736924165259">Anda mempunyai sijil pada fail yang tidak sepadan dengan mana-mana kategori lain</translation> @@ -906,6 +909,7 @@ <translation id="1829129547161959350">Penguin</translation> <translation id="1829192082282182671">Zum &Keluar</translation> <translation id="1830550083491357902">Tidak dilog masuk</translation> +<translation id="1831848493690504725">Kami tidak dapat menghubungi Google melalui rangkaian yang disambungkan. Cuba pilih rangkaian lain atau semak tetapan rangkaian atau tetapan proksi (jika anda menggunakan proksi) anda.</translation> <translation id="1832459821645506983">Ya, saya setuju</translation> <translation id="1832511806131704864">Perubahan telefon dikemas kini</translation> <translation id="1832848789136765277">Untuk memastikan anda dapat mengakses data penyegerakan anda pada bila-bila masa, sahkan itu anda</translation> @@ -1124,6 +1128,7 @@ <translation id="2044014337866019681">Sila pastikan anda mengesahkan <ph name="ACCOUNT" /> untuk membuka kunci sesi.</translation> <translation id="204497730941176055">Nama Templat Sijil Microsoft</translation> <translation id="2045117674524495717">Pembantu Pintasan Papan Kekunci</translation> +<translation id="2045211794962848221">Anda tidak akan melihat mesej khusus ini lagi</translation> <translation id="2045969484888636535">Terus menyekat kuki</translation> <translation id="204622017488417136">Peranti anda akan kembali ke versi Chrome yang dipasang sebelum ini. Semua akaun pengguna dan data setempat akan dialih keluar. Proses ini tidak boleh dibuat asal.</translation> <translation id="2046702855113914483">Ramen</translation> @@ -2208,6 +2213,7 @@ <translation id="3021065318976393105">Semasa menggunakan bateri</translation> <translation id="3021066826692793094">Rama-rama</translation> <translation id="3021678814754966447">&Lihat Sumber Bingkai</translation> +<translation id="3022361196600037287"><ph name="DEVICE" /> akan dialih keluar daripada Chromebook ini dan tidak akan disimpan pada <ph name="PRIMARY_EMAIL" />.</translation> <translation id="3022978424994383087">Tidak faham.</translation> <translation id="3023464535986383522">Pilih untuk bercakap</translation> <translation id="3024374909719388945">Gunakan jam 24 jam</translation> @@ -3747,6 +3753,7 @@ <translation id="4535127706710932914">Profil Lalai</translation> <translation id="4535767533210902251">Penderia cap jari ialah kekunci sebelah kanan bahagian atas pada papan kekunci anda. Sentuh dengan lembut menggunakan mana-mana jari.</translation> <translation id="4536140153723794651">Tapak yang boleh menggunakan kuki pada setiap masa</translation> +<translation id="4536769240747010177">Keupayaan Penambatan:</translation> <translation id="4538417792467843292">Padam perkataan</translation> <translation id="4538792345715658285">Dipasang oleh dasar perusahaan.</translation> <translation id="4541123282641193691">Tidak dapat mengesahkan akaun anda. Sila cuba lagi atau mulakan semula Chromebook anda.</translation> @@ -3774,6 +3781,7 @@ <translation id="4561893854334016293">Tiada kebenaran yang diubah baru-baru ini</translation> <translation id="4562155214028662640">Tambahkan Cap Jari</translation> <translation id="4563210852471260509">Bahasa input permulaan adalah bahasa Cina</translation> +<translation id="4563382028841851106">Alih keluar daripada akaun</translation> <translation id="4563880231729913339">Jari 3</translation> <translation id="4564245002465020751">Selesaikan persediaan pada telefon anda</translation> <translation id="4565377596337484307">Sembunyikan kata laluan</translation> @@ -3810,6 +3818,7 @@ <translation id="4594577641390224176">Mencari halaman perihalan sistem? Lawati</translation> <translation id="4595560905247879544">Apl dan sambungan hanya boleh diubah suai oleh pengurus (<ph name="CUSTODIAN_NAME" />).</translation> <translation id="4596295440756783523">Anda mempunyai sijil pada fail yang mengenal pasti pelayan ini</translation> +<translation id="4598345735110653698">Urus kunci laluan</translation> <translation id="4598556348158889687">Pengurusan storan</translation> <translation id="4598776695426288251">Wi-Fi tersedia melalui berbilang peranti</translation> <translation id="4601426376352205922">Tandakan sebagai Belum Dibaca</translation> @@ -4035,6 +4044,7 @@ <translation id="4823894915586516138">PIN atau kata laluan ini melindungi data anda pada <ph name="DEVICE_TYPE" /> ini, termasuk sebarang maklumat yang anda akses daripada telefon anda</translation> <translation id="4824037980212326045">Sandaran dan pemulihan Linux</translation> <translation id="4824958205181053313">Batalkan penyegerakan?</translation> +<translation id="4825532258163983651">Tidak dapat memadamkan kunci laluan</translation> <translation id="4827675678516992122">Tidak dapat menyambung</translation> <translation id="4827784381479890589">Semak ejaan yang dipertingkatkan dalam penyemak imbas Chrome (teks dihantar kepada Google untuk mendapatkan cadangan ejaan)</translation> <translation id="4827904420700932487">Buat Kod QR untuk Imej ini</translation> @@ -4297,6 +4307,7 @@ <translation id="5087249366037322692">Ditambahkan oleh pihak ketiga</translation> <translation id="5087580092889165836">Tambah kad</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 Dengan Penyulitan RSA</translation> +<translation id="5089763948477033443">Pemegang Ubah Saiz Panel Sisi</translation> <translation id="5090637338841444533">Tidak dibenarkan untuk menjejak kedudukan kamera anda</translation> <translation id="5093569275467863761">Subbingkai Dicache Kembali/Maju Inkognito: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">Anda boleh membuka dan mengedit fail yang disokong dengan apl ini daripada apl Files atau apl lain. Untuk mengawal fail yang membuka apl ini secara lalai, <ph name="BEGIN_LINK" />ketahui cara menetapkan apl lalai pada peranti anda<ph name="END_LINK" />.</translation> @@ -4462,6 +4473,7 @@ <translation id="5258992782919386492">Pasang pada peranti ini</translation> <translation id="5260334392110301220">Tanda Petikan Pintar</translation> <translation id="5260508466980570042">Maaf, e-mel atau kata laluan anda tidak dapat disahkan. Sila cuba semula.</translation> +<translation id="5260958083445173099">Laman web akan memaparkan kandungan dalam bahasa pilihan anda, jika boleh</translation> <translation id="5261683757250193089">Buka dalam Gedung Web</translation> <translation id="5262178194499261222">Alih keluar kata laluan</translation> <translation id="5262784498883614021">Sambung kepada rangkaian secara automatik</translation> @@ -4502,6 +4514,7 @@ <translation id="5294097441441645251">Mesti bermula dengan aksara huruf kecil atau garis bawah</translation> <translation id="5294618183559481278"><ph name="DEVICE_TYPE" /> anda menggunakan penderia terbina dalam untuk mengesan orang di hadapan peranti anda. Semua data diproses pada peranti anda serta-merta, kemudian dipadamkan. Data penderia tidak sekali-kali dihantar kepada Google. <ph name="LINK_BEGIN" />Ketahui lebih lanjut<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Dengar maklum balas yang dituturkan supaya anda boleh menggunakan peranti anda tanpa melihat skrin. Maklum balas Braille tersedia dengan peranti tersambung.</translation> +<translation id="5297005732522718715">Muat Semula Konfigurasi Penambatan</translation> <translation id="5297082477358294722">Kata laluan disimpan. Lihat dan urus kata laluan yang disimpan dalam <ph name="SAVED_PASSWORDS_STORE" /> anda.</translation> <translation id="5297946558563358707">Apabila orang lain melihat skrin anda, tunjukkan ikon mata Privasi di bahagian bawah sebelah kanan skrin anda</translation> <translation id="5298219193514155779">Tema dicipta oleh</translation> @@ -4672,6 +4685,7 @@ <translation id="5466374726908360271">Ta&mpal dan cari “<ph name="SEARCH_TERMS" />”</translation> <translation id="5467207440419968613"><ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> disekat</translation> <translation id="5468173180030470402">Mencari perkongsian fail</translation> +<translation id="5468330507528805311">Status Penambatan:</translation> <translation id="5468881191994555667">Pilih fail</translation> <translation id="5469852975082458401">Anda boleh menukar halaman dengan kursor teks. Tekan F7 untuk mematikannya.</translation> <translation id="5470735824776589490">Mula semula diperlukan sebelum peranti anda boleh ditetapkan semula dengan Powerwash. <ph name="LINK_BEGIN" />Ketahui lebih lanjut<ph name="LINK_END" /></translation> @@ -4750,6 +4764,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> ingin</translation> <translation id="5534304873398226603">Buang foto atau video</translation> <translation id="5537725057119320332">Cast</translation> +<translation id="5539070192556911367">Tidak dapat menghubungi Google</translation> <translation id="5539221284352502426">Kata laluan yang anda masukkan telah ditolak oleh pelayan. Sebab yang mungkin termasuk: Kata laluan terlalu pendek. Kata laluan mesti merangkumi nombor atau simbol. Kata laluan mesti berbeza daripada kata laluan yang sebelumnya.</translation> <translation id="5541694225089836610">Tindakan dilumpuhkan oleh pentadbir anda</translation> <translation id="5542132724887566711">Profil</translation> @@ -4813,6 +4828,7 @@ <translation id="5585912436068747822">Pemformatan gagal</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Memuatkan apl...</translation> +<translation id="5590418976913374224">Mainkan bunyi pada permulaan peranti</translation> <translation id="5592595402373377407">Data yang mencukupi belum tersedia lagi.</translation> <translation id="5595307023264033512">Jumlah storan yang digunakan oleh laman: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">Edit alamat</translation> @@ -4946,6 +4962,7 @@ <translation id="5734362860645681824">Komunikasi</translation> <translation id="5734697361979786483">Tambahkan perkongsian fail</translation> <translation id="5736796278325406685">Sila masukkan nama pengguna yang sah</translation> +<translation id="5738093759615225354">Anda memerlukan kunci laluan ini untuk log masuk ke komputer anda</translation> <translation id="5739017626473506901">Log masuk untuk membantu <ph name="USER_NAME" /> menambah akaun sekolah</translation> <translation id="5739235828260127894">Menunggu pengesahan. <ph name="LINK_BEGIN" />Ketahui lebih lanjut<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Sangat besar</translation> @@ -5107,6 +5124,7 @@ <translation id="589541317545606110">Halaman Carian dengan <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">Jangan Benarkan</translation> <translation id="5900186025777217044">Smart Lock telah berubah</translation> +<translation id="5900243355162006650">Konfigurasi Penambatan:</translation> <translation id="5900302528761731119">Foto Profil Google</translation> <translation id="590036993063074298">Butiran Kualiti Pencerminan</translation> <translation id="5901069264981746702">Data cap jari anda disimpan dengan selamat dan tidak sekali-kali dihantar keluar daripada <ph name="DEVICE_TYPE" /> anda. <ph name="LINK_BEGIN" />Ketahui lebih lanjut<ph name="LINK_END" /></translation> @@ -5410,6 +5428,7 @@ <translation id="6196640612572343990">Sekat kuki pihak ketiga</translation> <translation id="6196854373336333322">Sambungan "<ph name="EXTENSION_NAME" />" telah mengambil alih kawalan tetapan proksi anda, yang bermakna sambungan ini boleh mengubah, menghentikan atau mencuri dengar apa-apa sahaja yang anda lakukan dalam talian. Jika anda tidak pasti mengapa perubahan ini berlaku, anda mungkin tidak mahukannya.</translation> <translation id="6197128521826316819">Buat Kod QR untuk Halaman ini</translation> +<translation id="6197223946499512637">Kunci laluan ini disimpan dalam Windows Hello pada komputer ini. Tidak disimpan ke Google Account anda.</translation> <translation id="6198252989419008588">Tukar PIN</translation> <translation id="6200047250927636406">Buang fail</translation> <translation id="6200151268994853226">Urus Sambungan</translation> @@ -5707,6 +5726,7 @@ <translation id="6482559668224714696">Penggadang skrin penuh</translation> <translation id="6483485061007832714">Buka muat turun</translation> <translation id="6483805311199035658">Membuka <ph name="FILE" />...</translation> +<translation id="6486301003991593638">Untuk mengurus kunci laluan, gunakan versi Windows yang lebih baharu</translation> <translation id="6488384360522318064">Pilih bahasa</translation> <translation id="648927581764831596">Tiada yang tersedia</translation> <translation id="6490471652906364588">Peranti USB-C (port kanan)</translation> @@ -6190,6 +6210,10 @@ <translation id="6943939122536910181">Diputuskan sambungan daripada <ph name="DEVICE" /></translation> <translation id="6945221475159498467">Pilih</translation> <translation id="694592694773692225">Ubah hala disekat pada halaman ini.</translation> +<translation id="6947015141909171112">Anda melihat resipi berdasarkan aktiviti Carian resipi anda baru-baru ini. + <ph name="BREAK" /> + <ph name="BREAK" /> + Anda boleh mengurus tetapan daripada menu kad atau melihat lebih banyak pilihan dalam Sesuaikan Chrome.</translation> <translation id="6949434160682548041">Kata laluan (pilihan)</translation> <translation id="6950627417367801484">Pulihkan apl</translation> <translation id="6952242901357037157">Anda juga boleh memaparkan kata laluan daripada <ph name="BEGIN_LINK" />Akaun Google<ph name="END_LINK" /> anda di sini</translation> @@ -6289,6 +6313,7 @@ <translation id="7029307918966275733">Crostini tidak dipasang. Sila pasang Crostini untuk melihat kredit.</translation> <translation id="7029809446516969842">Kata laluan</translation> <translation id="7030304022046916278">Menghantar URL kepada Penyemakan Imbas Selamat untuk semakan</translation> +<translation id="7030695672997239647">Klik kanan pada tab dan pilih "Tambahkan Tab Pada Kumpulan”, kemudian pilih "Kumpulan Baharu"</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - Port bersiri disambungkan</translation> <translation id="7033616203784997570">Input mestilah tidak melebihi 62 aksara</translation> <translation id="7034692021407794547">Pentadbir yang mempunyai keistimewaan Pengurusan Pengebilan mesti menerima Syarat Perkhidmatan Perkakasan Google Meet di bahagian Perkakasan Google Meet dalam Konsol pentadbir dahulu.</translation> @@ -6357,6 +6382,7 @@ <translation id="7102687220333134671">Kemas kini automatik dihidupkan</translation> <translation id="7102832101143475489">Permintaan telah tamat masa</translation> <translation id="710640343305609397">Buka tetapan rangkaian</translation> +<translation id="7107609441453408294">Mainkan audio yang sama melalui semua pembesar suara</translation> <translation id="7108338896283013870">Sembunyikan</translation> <translation id="7108668606237948702">enter</translation> <translation id="7108933416628942903">Kunci sekarang</translation> @@ -6587,6 +6613,7 @@ <translation id="7364745943115323529">Hantar...</translation> <translation id="7364796246159120393">Pilih Fail</translation> <translation id="7365076891350562061">Saiz monitor</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" /> - Disemat</translation> <translation id="7366316827772164604">Mengimbas untuk mengesan peranti berdekatan…</translation> <translation id="7366415735885268578">Tambahkan tapak</translation> <translation id="7366909168761621528">Data penyemakan imbas</translation> @@ -6983,6 +7010,7 @@ <translation id="7737115349420013392">Berpasangan dengan "<ph name="DEVICE_NAME" />" ...</translation> <translation id="7737846262459425222">Anda boleh menukar tetapan ini pada bila-bila masa dalam Tetapan > Google Assistant > Konteks skrin.</translation> <translation id="7737948071472253612">Tidak dibenarkan untuk menggunakan kamera anda</translation> +<translation id="77381465218432215">Tunjukkan tanda aksen dan aksara khas</translation> <translation id="7740996059027112821">Standard</translation> <translation id="7741307896921365578">Mendayakan panel sisi tahap penyemak imbas untuk cara yang berguna dan kekal untuk mengakses Senarai Bacaan dan Penanda Halaman anda.</translation> <translation id="7742558784808143689">Kosongkan data dan kebenaran laman untuk <ph name="SITE_NAME" />, semua laman di bawahnya dan apl yang dipasang?</translation> @@ -7388,6 +7416,7 @@ <translation id="8101987792947961127">Powerwash diperlukan pada but semula seterusnya</translation> <translation id="81020759409809034">Lokasi Setempat</translation> <translation id="8102139037507939978">Buang Maklumat Peribadi yang Boleh Dikenal Pasti daripada system_logs.txt.</translation> +<translation id="810362914482827094">Cari kunci laluan</translation> <translation id="8104088837833760645">Muat turun profil eSIM</translation> <translation id="8105368624971345109">Matikan</translation> <translation id="8107015733319732394">Memasang Gedung Google Play pada <ph name="DEVICE_TYPE" /> anda. Proses ini mungkin mengambil masa beberapa minit.</translation> @@ -7774,6 +7803,7 @@ <translation id="8486666913807228950">Sebab: Peraturan terbalik <ph name="REVERT_RULE" /> ditemukan dalam senarai "Buka paksa dalam".</translation> <translation id="848666842773560761">Satu apl sedang cuba mengakses kamera. Matikan suis privasi kamera untuk membenarkan akses.</translation> <translation id="8487678622945914333">Zum Masuk</translation> +<translation id="8487699605742506766">Tempat liputan</translation> <translation id="8489156414266187072">Cadangan peribadi hanya dipaparkan pada akaun anda</translation> <translation id="8490896350101740396">Apl kiosk berikut "<ph name="UPDATED_APPS" />" telah dikemas kini. Sila mulakan semula peranti untuk melengkapkan proses kemas kini.</translation> <translation id="8492685019009920170">Sentuh penderia cap jari dengan jari anda. Data anda disimpan dengan selamat dan tidak sekali-kali dihantar keluar daripada <ph name="DEVICE_TYPE" /> anda.</translation> @@ -7835,6 +7865,7 @@ <translation id="8557022314818157177">Teruskan menyentuh kunci keselamatan anda sehingga cap jari anda disimpan</translation> <translation id="8557180006508471423">Hidupkan "Google Chrome" dalam Perkhidmatan Lokasi pada Mac anda</translation> <translation id="8557856025359704738">Muat turun yang seterusnya adalah pada <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">Kunci laluan</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Buka Semua dalam Tetingkap &Baharu}=1{Buka dalam &Tetingkap Baharu}other{Buka Semua ({COUNT}) dalam Tetingkap &Baharu}}</translation> <translation id="8561206103590473338">Gajah</translation> <translation id="8561565784790166472">Teruskan dengan berhati-hati</translation> @@ -7961,6 +7992,7 @@ <translation id="8677212948402625567">Runtuhkan semua...</translation> <translation id="867767487203716855">Kemas kini seterusnya</translation> <translation id="8677859815076891398">Tiada album. Buat album dalam <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />.</translation> +<translation id="8678378565142776698">Mulakan semula dan dapatkan kemaskinian automatik</translation> <translation id="8678538439778360739">Data disulitkan dengan ungkapan laluan penyegerakan anda pada <ph name="TIME" />. Penyulitan ini tidak termasuk kaedah pembayaran dan alamat daripada Google Pay.</translation> <translation id="8678582529642151449">Tab tidak mengecil</translation> <translation id="8678933587484842200">Bagaimanakah anda mahu apl ini dilancarkan?</translation> @@ -8207,6 +8239,7 @@ <translation id="8910987510378294980">Sembunyikan senarai peranti</translation> <translation id="8912362522468806198">Akaun Google</translation> <translation id="8912810933860534797">Dayakan autoimbas</translation> +<translation id="8915307125957890427">Klik kanan pada tab dan pilih "Tambahkan tab pada kumpulan", kemudian pilih "Kumpulan baharu"</translation> <translation id="8915370057835397490">Memuatkan cadangan</translation> <translation id="8916476537757519021">Subbingkai Inkognito: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> <ph name="GIVEN_NAME" /></translation> @@ -8267,6 +8300,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" dan 1 tab lain}other{"<ph name="TAB_TITLE" />" dan # tab lain}}</translation> <translation id="8977811652087512276">Kata laluan salah atau fail rosak</translation> <translation id="8978154919215542464">Hidup - segerakkan semuanya</translation> +<translation id="8978670037548431647">Segar Semula Keupayaan Penambatan</translation> <translation id="897939795688207351">Di <ph name="ORIGIN" /></translation> <translation id="8980345560318123814">Laporan maklum malas</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> - Mengalami ranap sistem</translation> @@ -8280,6 +8314,7 @@ <translation id="8986362086234534611">Lupa</translation> <translation id="8986494364107987395">Hantar statistik penggunaan dan laporan nahas kepada Google secara automatik</translation> <translation id="8987927404178983737">Bulan</translation> +<translation id="8989359959810288806">Muat Semula Status Penambatan</translation> <translation id="8991520179165052608">Tapak boleh menggunakan mikrofon anda</translation> <translation id="899384117894244799">Alih keluar pengguna yang disekat</translation> <translation id="899403249577094719">URL Tapak Sijil Netscape</translation> @@ -8531,6 +8566,7 @@ <translation id="935854577147268200">Telefon Smart Lock ditukar. Masukkan kata laluan anda untuk mengemas kini Smart Lock. Selepas ini, telefon anda akan membuka kunci <ph name="DEVICE_TYPE" /> anda. Anda boleh mematikan Smart Lock dalam Tetapan</translation> <translation id="936646668635477464">Kamera & mikrofon</translation> <translation id="936801553271523408">Data diagnostik sistem</translation> +<translation id="937053962468712792">Alih keluar <ph name="DEVICE" /> daripada <ph name="PRIMARY_EMAIL" />?</translation> <translation id="93766956588638423">Baiki sambungan</translation> <translation id="938568644810664664">Cuba tanya “Ok Google, apakah tajuk lagu ini?” atau “Ok Google, apakah yang terpapar pada skrin saya?”</translation> <translation id="938623846785894166">Fail luar biasa</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index ca45e22c..acc9cc8 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">သင်၏ မိုက်ခရိုဖုန်း နှင့် ကင်မရာကို သုံးရန်</translation> <translation id="1005333234656240382">ADB အမှားရှာပြင်ခြင်းကို ဖွင့်လိုပါသလား။</translation> <translation id="1006873397406093306">ဤနောက်ဆက်တွဲက ဝဘ်ဆိုက်များပေါ်ရှိ သင့်ဒေတာကို ဖတ်ရှုပြီး ပြောင်းလဲနိုင်သည်။ ဤနောက်ဆက်တွဲ ဝင်သုံးခွင့်ရှိသည့် ဝဘ်ဆိုက်များကို သင်ထိန်းချုပ်နိုင်သည်။</translation> +<translation id="1007057452468855774">Google Play Store ဖွင့်ရန်</translation> <translation id="1008186147501209563">လိပ်စာများကို တင်ပို့ခြင်း</translation> <translation id="1008557486741366299">ယခု မလို</translation> <translation id="1009476156254802388"><ph name="WEB_DRIVE" /> တည်နေရာ</translation> <translation id="1009663062402466586">ဂိမ်းထိန်းချုပ်ခလုတ်များ ယခုသုံးနိုင်ပြီ</translation> <translation id="1010498023906173788">ဤတဘ်ကို အမှတ်စဉ်ပို့တ်တစ်ခုနှင့် ချိတ်ဆက်ထားသည်။</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{စာမျက်နှာ တုံ့ပြန်မှုနှေးကွေးသည်}other{စာမျက်နှာများ တုံ့ပြန်မှုနှေးကွေးသည်}}</translation> +<translation id="1011003645819296594">သိမ်းထားသည့် စက်ပစ္စည်းများ</translation> <translation id="1011355516189274711">စာ-မှ-စကား အသံအတိုးအကျယ်</translation> <translation id="1012794136286421601">သင်၏ စာတမ်းများ၊ စာရွက်များ၊ ဆလိုက်များ၊ နှင့် ဆွဲပုံ ဖိုင်များကို စင့်က် လုပ်ပေးနေသည်။ ၎င်းတို့ကို အွန်လိုင်း သို့မဟုတ် အော့ဖ်လိုင်း ရယူသုံးရန် Google ဒရိုက်ဗ် အက်ပ်ကို ဖွင့်ပါ။</translation> <translation id="1012876632442809908">USB-C ကိရိယာ (အရှေ့ပိုင်း ပို့တ်)</translation> @@ -493,6 +495,7 @@ <translation id="1470350905258700113">ဤစက်ကို သုံးရန်</translation> <translation id="1470946456740188591">Caret ဖြင့်ရှာကြည့်ခြင်းကို ဖွင့်ရန် သို့မဟုတ် ပိတ်ရန် Ctrl+Search+7 ဖြတ်လမ်းလင့်ခ်ကိုသုံးပါ</translation> <translation id="1472675084647422956">ပိုပြပါ</translation> +<translation id="1473223074251193484">မိုဘိုင်းသုံးတွဲချိတ်ခြင်း စီစဉ်သတ်မှတ်ချက် ထည့်ရန်</translation> <translation id="1474785664565228650">မိုက်ခရိုဖုန်းဆက်တင် ပြောင်းလဲမှု အကျိုးသက်ရောက်စေရန် Parallels Desktop ကို ပြန်ဖွင့်ရပါမည်။ ရှေ့ဆက်ရန် Parallels Desktop ကို ပြန်ဖွင့်ပါ။</translation> <translation id="1474893630593443211">သင်မြင်ရသည့် ကြော်ငြာများအား ပိုမိုထိန်းချုပ်နိုင်ခြင်း</translation> <translation id="1475502736924165259">အခြားအုပ်စုများနှင့် ကိုက်ညီမှုမရှိသည့် အသိအမှတ်ပြုလက်မှတ်များ သင့်ထံတွင် ရှိပါသည်</translation> @@ -1123,6 +1126,7 @@ <translation id="2044014337866019681">စက်ရှင်ဖွင့်ရန် <ph name="ACCOUNT" /> ကို စိစစ်နေကြောင်း သေချာပါစေ။</translation> <translation id="204497730941176055">Microsoft အသိမှတ်ပြုလက်မှတ် ပုံစံ အမည်</translation> <translation id="2045117674524495717">လက်ကွက်ဖြတ်လမ်း အထောက်အကူပြုကိရိယာ</translation> +<translation id="2045211794962848221">ဤသီးသန့်မက်ဆေ့ကို သင်ထပ်တွေ့ရမည် မဟုတ်ပါ</translation> <translation id="2045969484888636535">ကွတ်ကီများကို ဆက်လက် ပိတ်ဆို့မည်</translation> <translation id="204622017488417136">ဤစက်ကိရိယာသည် ယခင်က သွင်းယူထားသည့် Chrome ဗားရှင်းသို့ ပြန်ရောက်သွားမည်။ သုံးသူအကောင့်များနှင့် စက်တွင်းရှိ အချက်အလက်များအားလုံး ဖယ်ရှားခံရမည်။ ပြန်မရယူနိုင်ပါ။</translation> <translation id="2046702855113914483">ခေါက်ဆွဲ</translation> @@ -2207,6 +2211,7 @@ <translation id="3021065318976393105">ဘက်ထရီဖြင့်ဖွင့်ထားစဉ်</translation> <translation id="3021066826692793094">လိပ်ပြာ</translation> <translation id="3021678814754966447">ဖရိန် အရင်းမြစ် ကြည့်မည်</translation> +<translation id="3022361196600037287"><ph name="DEVICE" /> ကို ဤ Chromebook မှ ဖယ်ရှားမည်ဖြစ်ပြီး <ph name="PRIMARY_EMAIL" /> တွင် သိမ်းမည်မဟုတ်ပါ။</translation> <translation id="3022978424994383087">နားမလည်လိုက်ပါ။</translation> <translation id="3023464535986383522">စကားပြောရန် ရွေးပါ</translation> <translation id="3024374909719388945">၂၄ နာရီကို အသုံးပြုမည်</translation> @@ -3745,6 +3750,7 @@ <translation id="4535127706710932914">ပုံသေ ပရိုဖိုင်</translation> <translation id="4535767533210902251">လက်ဗွေ အာရုံခံကိရိယာသည် သင့်ကီးဘုတ်ပေါ်ရှိ ညာဘက်ထိပ်ရှိကီးဖြစ်သည်။ လက်ချောင်းတစ်ချောင်းဖြင့် ၎င်းကို သာသာထိပါ။</translation> <translation id="4536140153723794651">ကွတ်ကီးများကို အမြဲသုံးနိုင်သည့် ဝဘ်ဆိုက်များ</translation> +<translation id="4536769240747010177">မိုဘိုင်းသုံးတွဲချိတ်မှုဆိုင်ရာ စွမ်းဆောင်နိုင်မှုများ-</translation> <translation id="4538417792467843292">စကားလုံးကို ဖျက်ရန်</translation> <translation id="4538792345715658285">လုပ်ငန်း မူဝါဒဖြင့် တပ်ဆင်ပေးခဲ့သည်။</translation> <translation id="4541123282641193691">သင့်အကောင့်ကို စိစစ်၍ မရပါ။ ထပ်စမ်းကြည့်ပါ (သို့) သင့် Chromebook ကို ပြန်စပါ။</translation> @@ -3772,6 +3778,7 @@ <translation id="4561893854334016293">မကြာသေးမီကပြောင်းထားသော ခွင့်ပြုချက်များ မရှိပါ</translation> <translation id="4562155214028662640">လက်ဗွေထည့်ရန်</translation> <translation id="4563210852471260509">အဦးဆုံးထည့်သွင်းရန် နည်းလမ်းမှာ တရုတ်ဖြစ်</translation> +<translation id="4563382028841851106">အကောင့်မှ ဖယ်ရှားရန်</translation> <translation id="4563880231729913339">လက်ချောင်း ၃</translation> <translation id="4564245002465020751">သင့်ဖုန်းတွင် စနစ်ထည့်သွင်းမှု အပြီးသတ်ပါ</translation> <translation id="4565377596337484307">စကားဝှက်ကို ဖျောက်ရန်</translation> @@ -3808,6 +3815,7 @@ <translation id="4594577641390224176">စာမျက်နှာအကြောင်း စနစ်ကိုရှာနေပါလား။ ဝင်ကြည့်ရန်</translation> <translation id="4595560905247879544">အက်ပ်များနှင့် နောက်ဆက်တွဲများကို မန်နေဂျာကသာ မွမ်းမံပေးနိုင်ပါသည်(<ph name="CUSTODIAN_NAME" />)။</translation> <translation id="4596295440756783523">ဤဆာဗာများ၏အထောက်အထားဖြစ်သည့် အသိအမှတ်ပြုလက်မှတ်များ သင့်ထံတွင်ရှိပါသည်</translation> +<translation id="4598345735110653698">လျှို့ဝှက်ကီးများ စီမံရန်</translation> <translation id="4598556348158889687">သိုလှောင်ခန်းစီမံခန့်ခွဲမှု</translation> <translation id="4598776695426288251">စက်ပစ္စည်းများစွာမှတစ်ဆင့် Wi-Fi ရနိုင်ပါသည်</translation> <translation id="4601426376352205922">မဖတ်ရသေးဟု မှတ်သားရန်</translation> @@ -4033,6 +4041,7 @@ <translation id="4823894915586516138">ပင်နံပါတ် (သို့) စကားဝှက်က ဤစက်<ph name="DEVICE_TYPE" /> တွင် ဖုန်းမှယူသုံးသော အကြောင်းအရာအပါအဝင် သင့်ဒေတာများကို ကာကွယ်ပေးသည်။</translation> <translation id="4824037980212326045">Linux အရန်ကူးခြင်းနှင့် ပြန်လည်ရယူခြင်း</translation> <translation id="4824958205181053313">စင့်ခ်လုပ်ခြင်းကို ပယ်ဖျက်လိုပါသလား။</translation> +<translation id="4825532258163983651">လျှို့ဝှက်ကီးကို ဖျက်၍မရပါ</translation> <translation id="4827675678516992122">ချိတ်ဆက်၍ မရပါ</translation> <translation id="4827784381479890589">Chrome ဘရောင်ဇာတွင် စာလုံးပေါင်းစစ်ဆေးခြင်း အဆင့်မြှင့်တင်ထားသည် (စာလုံးပေါင်း အကြံပြုချက်များအတွက် စာသားကို Google သို့ ပို့သည်)</translation> <translation id="4827904420700932487">ဤ 'ပုံ' အတွက် QR ကုဒ် ပြုလုပ်ရန်</translation> @@ -4295,6 +4304,7 @@ <translation id="5087249366037322692">ပြင်ပကုမ္ပဏီမှ ထည့်သွင်းခဲ့သည်</translation> <translation id="5087580092889165836">ကတ်ကိုထည့်ရန်</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 RSA အန်ခရစ်ပြုလုပ်ခြင်းဖြင့်</translation> +<translation id="5089763948477033443">ဘေးအကန့် ဇယားကွက် အရွယ်ပြောင်းခြင်း</translation> <translation id="5090637338841444533">သင့်ကင်မရာ၏အနေအထားကို ခြေရာခံရန် ခွင့်ပြုမထားပါ</translation> <translation id="5093569275467863761">ရှေ့-နောက် ကက်ရှ်သိမ်းထားသော ရုပ်ဖျက်ဖရိမ်ခွဲ- <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">ပံ့ပိုးထားသည့်ဖိုင်များကို File အက်ပ်မှ ဤအက်ပ်ဖြင့်ဖြစ်စေ အခြားအက်ပ်များဖြင့်ဖြစ်စေ ဖွင့်ပြီး ပြင်ဆင်နိုင်သည်။ ဤအက်ပ်အား မည်သည့်ဖိုင်များက မူရင်းသတ်မှတ်ချက်ဖြင့် ဖွင့်မည်ကို ထိန်းချုပ်ရန် <ph name="BEGIN_LINK" />သင့်စက်တွင် မူရင်းအက်ပ် သတ်မှတ်ပုံကို လေ့လာနိုင်သည်<ph name="END_LINK" />။</translation> @@ -4460,6 +4470,7 @@ <translation id="5258992782919386492">ဤစက်ပစ္စည်းတွင် ထည့်သွင်းရန်</translation> <translation id="5260334392110301220">အဆင့်မြင့် မျက်တောင်အဖွင့်အပိတ်များ</translation> <translation id="5260508466980570042">ဆောရီး၊ သင်၏ စကားဝှက်ကို စိစစ် မရခဲ့ပါ။ ကျေးဇူးပြုပြီး ထပ် စမ်းပါ။</translation> +<translation id="5260958083445173099">ပြနိုင်သည့်အခါတွင် ဝဘ်ဆိုက်များက သင့်ဦးစားပေး ဘာသာစကားများဖြင့် အကြောင်းအရာကို ပြသပါမည်</translation> <translation id="5261683757250193089">ဝဘ်စတိုးတွင် ဖွင့်ရန်</translation> <translation id="5262178194499261222">စကားဝှက်ကို ဖယ်ရှားရန်</translation> <translation id="5262784498883614021">ကွန်ရက်သို့ အလိုအလျောက် ချိတ်ဆက်ရန်</translation> @@ -4500,6 +4511,7 @@ <translation id="5294097441441645251">အက္ခရာအသေး သို့မဟုတ် အောက်မျဉ်းဖြင့် စတင်ရမည်</translation> <translation id="5294618183559481278">သင့်စက်ရှေ့တွင် လူရှိနေကြောင်းသိရှိရန် သင်၏ <ph name="DEVICE_TYPE" /> သည် အသင့်ပါသော အာရုံခံကိရိယာကို သုံးသည်။ ဒေတာအားလုံးကို သင့်စက်တွင် ချက်ချင်းလုပ်ဆောင်ပြီး ဖျက်ပစ်သည်။ အာရုံခံစနစ် ဒေတာကို Google သို့ မည်သည့်အခါမျှ မပို့ပါ။ <ph name="LINK_BEGIN" />ပိုမိုလေ့လာရန်<ph name="LINK_END" /></translation> <translation id="5296350763804564124">ဖန်သားပြင်ကိုမကြည့်ဘဲ စက်သုံးနိုင်ရန် တုံ့ပြန်မှုများပြောပေးပါသည်။ မျက်မမြင်စာရေးစနစ် အကြံပြုချက်ကို ချိတ်ထားသည့်စက်တွင် ရနိုင်သည်။</translation> +<translation id="5297005732522718715">မိုဘိုင်းသုံးတွဲချိတ်ခြင်း စီစဉ်သတ်မှတ်ချက် ပြန်စရန်</translation> <translation id="5297082477358294722">စကားဝှက်ကို သိမ်းပြီးပါပြီ။ သိမ်းဆည်းထားသည့် စကားဝှက်များကို သင်၏ <ph name="SAVED_PASSWORDS_STORE" /> တွင် ကြည့်ရှုစီမံပါ။</translation> <translation id="5297946558563358707">သင့်ဖန်သားပြင်ကို တစ်စုံတစ်ဦးကြည့်ပါက ဖန်သားပြင် ညာဖက်အောက်တွင် ‘ပုဂ္ဂိုလ်ရေးလုံခြုံမှု’ မျက်လုံးသင်္ကေတကို ပြသည်</translation> <translation id="5298219193514155779">အပြင်အဆင်ကို ဖန်တီးခဲ့သူ</translation> @@ -4670,6 +4682,7 @@ <translation id="5466374726908360271">“<ph name="SEARCH_TERMS" />” ကို ကူးထည့်ပြီး ရှာဖွေရန်</translation> <translation id="5467207440419968613"><ph name="PERMISSION_1" />၊ <ph name="PERMISSION_2" /> ကို ပိတ်ထားသည်</translation> <translation id="5468173180030470402">ဖိုင်မျှဝေမှုများကို ရှာနေသည်</translation> +<translation id="5468330507528805311">မိုဘိုင်းသုံးတွဲချိတ်ခြင်း အခြေအနေ-</translation> <translation id="5468881191994555667">ဖိုင်ရွေးရန်</translation> <translation id="5469852975082458401">စာရိုက်သည့်ပုံကာဆာဖြင့် စာမျက်နှာများကို ကြည့်ရှုနိုင်သည်။ ပိတ်ရန် F7 ကို နှိပ်ပါ။</translation> <translation id="5470735824776589490">Powerwash ဖြင့် သင့်စက်ကို ပြင်ဆင်သတ်မှတ်ခြင်းမပြုမီ ပြန်စရန်လိုအပ်သည်။ <ph name="LINK_BEGIN" />ပိုမိုလေ့လာရန်<ph name="LINK_END" /></translation> @@ -4947,6 +4960,7 @@ <translation id="5734362860645681824">ဆက်သွယ်မှုများ</translation> <translation id="5734697361979786483">ဖိုင်မျှဝေမှုကို ထည့်ရန်</translation> <translation id="5736796278325406685">မှန်ကန်သော အသုံးပြုသူအမည်ကို ထည့်သွင်းပါ</translation> +<translation id="5738093759615225354">သင့်ကွန်ပျူတာသို့ လက်မှတ်ထိုးဝင်ရန် ဤလျှို့ဝှက်ကီး လိုအပ်သည်</translation> <translation id="5739017626473506901"><ph name="USER_NAME" /> ကျောင်းအကောင့်ထည့်ရာတွင် ကူညီရန် လက်မှတ်ထိုးဝင်ပါ</translation> <translation id="5739235828260127894">စစ်ဆေးအတည်ပြုချက် စောင့်နေသည်။ <ph name="LINK_BEGIN" />ပိုမို လေ့လာရန်<ph name="LINK_END" /></translation> <translation id="5739458112391494395">အလွန်ကြီး</translation> @@ -5108,6 +5122,7 @@ <translation id="589541317545606110"><ph name="VISUAL_SEARCH_PROVIDER" /> ဖြင့် စာမျက်နှာကို ရှာရန်</translation> <translation id="5896436821193322561">ခွင့်မပြုပါ</translation> <translation id="5900186025777217044">Smart Lock ပြောင်းလဲသွားပါသည်</translation> +<translation id="5900243355162006650">မိုဘိုင်းသုံးတွဲချိတ်ခြင်း စီစဉ်သတ်မှတ်ချက်-</translation> <translation id="5900302528761731119">Google ပရိုဖိုင်ဓါတ်ပုံ</translation> <translation id="590036993063074298">စကရင်ပွားခြင်း အရည်အသွေး အသေးစိတ်</translation> <translation id="5901069264981746702">သင့်လက်ဗွေဒေတာကို သင်၏ <ph name="DEVICE_TYPE" /> တွင်သာ လုံခြုံစွာ သိမ်းထားသည်။ <ph name="LINK_BEGIN" />ပိုမိုလေ့လာရန်<ph name="LINK_END" /></translation> @@ -5409,6 +5424,7 @@ <translation id="6196640612572343990">ပြင်ပကုမ္ပဏီကွတ်ကီးများကို ပိတ်ဆို့မည်</translation> <translation id="6196854373336333322">တိုးချဲ့လိုင်း "<ph name="EXTENSION_NAME" />" သည် သင့် ပရောက်စီ ဆက်တင်များအား ထိန်းချုပ်ထားသည်၊ ဆိုလိုသည်မှာ ၎င်းမှ အွန်လိုင်းတွင် သင်ပြုလုပ်သည်များအား ပြင်ဆင်နိုင်၊ ဖောက်ဖျက်နိုင်၊ သို့မဟုတ် ချောင်းနားထောင်နိုင်သည်။ ဤအပြောင်းအလဲဖြစ်ရခြင်းအကြောင်းရင်းအား သင် သေချာမသိပါက၊ သင် ၎င်းအား လိုအပ်မည် မထင်ပါ။</translation> <translation id="6197128521826316819">ဤ ‘စာမျက်နှာ’ အတွက် QR ကုဒ် ပြုလုပ်ရန်</translation> +<translation id="6197223946499512637">ဤလျှို့ဝှက်ကီးများကို ဤကွန်ပျူတာရှိ Windows Hello တွင် သိမ်းထားသည်။ ၎င်းတို့ကို သင့် Google Account သို့ မသိမ်းပါ။</translation> <translation id="6198252989419008588">ပင်နံပါတ် ပြောင်းလဲမည်</translation> <translation id="6200047250927636406">ဖိုင်ကို ဖယ်ပစ်ရန်</translation> <translation id="6200151268994853226">‘နောက်ဆက်တွဲ’ စီမံရန်</translation> @@ -5707,6 +5723,7 @@ <translation id="6482559668224714696">မျက်နှာပြင်အပြည့် မှန်ဘီလူး</translation> <translation id="6483485061007832714">ဒေါင်းလုဒ်လုပ်ထားသည့် ဖိုင်ကို ဖွင့်ခြင်း</translation> <translation id="6483805311199035658"><ph name="FILE" />ကို ဖွင့်ပေးနေ...</translation> +<translation id="6486301003991593638">လျှို့ဝှက်ကီးများစီမံရန် Windows ဗားရှင်းအသစ်ကို သုံးပါ</translation> <translation id="6488384360522318064">ဘာသာစကား ရွေးချယ်ရန်</translation> <translation id="648927581764831596">မရနိုင်ပါ</translation> <translation id="6490471652906364588">USB-C ကိရိယာ (ညာ ပို့တ်)</translation> @@ -6188,6 +6205,10 @@ <translation id="6943939122536910181"><ph name="DEVICE" /> မှ ချိတ်ဆက်မှုဖြုတ်လိုက်သည်</translation> <translation id="6945221475159498467">ရွေးရန်</translation> <translation id="694592694773692225">ဤစာမျက်နှာတွင် တဆင့်ပြန်ညွှန်ခြင်းကို ပိတ်ထားသည်။</translation> +<translation id="6947015141909171112">သင်၏လတ်တလော ချက်ပြုတ်နည်း ‘ရှာဖွေရေးလုပ်ဆောင်ချက်’ ပေါ်မူတည်၍ ၎င်းတို့ကို မြင်ရခြင်းဖြစ်သည်။ + <ph name="BREAK" /> + <ph name="BREAK" /> + ကတ်မီနူးတွင် ဆက်တင်များကို စီမံနိုင်သည် (သို့) ‘Chrome ကို စိတ်ကြိုက်လုပ်ခြင်း’ တွင် နောက်ထပ်ရွေးစရာများ ကြည့်နိုင်သည်။</translation> <translation id="6949434160682548041">စကားဝှက် (ချန်လှပ်ထားနိုင်သည်)</translation> <translation id="6950627417367801484">အက်ပ်များကို ပြန်ယူရန်</translation> <translation id="6952242901357037157">သင်၏ <ph name="BEGIN_LINK" />Google Account<ph name="END_LINK" /> မှ စကားဝှက်များကိုလည်း ဤနေရာတွင် ပြနိုင်သည်</translation> @@ -6287,6 +6308,7 @@ <translation id="7029307918966275733">Crostini ထည့်သွင်းမထားပါ။ ခရက်ဒစ်များကြည့်ရန် Crostini ထည့်သွင်းပါ။</translation> <translation id="7029809446516969842">စကားဝှက်များ</translation> <translation id="7030304022046916278">URL များကို စစ်ဆေးရန် ‘လုံခြုံစွာကြည့်ရှုခြင်း’ သို့ ပို့ပေးသည်</translation> +<translation id="7030695672997239647">တဘ်ပေါ်တွင် ညာဘက်ခလုတ်ကို နှိပ်ပြီး “အုပ်စုသို့ တဘ်ထည့်ရန်” ကို ရွေးပြီးနောက် “အုပ်စုအသစ်” ကို ရွေးနိုင်သည်</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - အမှတ်စဉ်ပို့တ် ချိတ်ဆက်ထားသည်</translation> <translation id="7033616203784997570">စာထည့်သွင်းရာတွင် စာလုံးရေ ၆၂ လုံး အများဆုံးရှိရမည်</translation> <translation id="7034692021407794547">‘ငွေတောင်းခံခြင်း စီမံခန့်ခွဲမှု’ ဆောင်ရွက်ခွင့်များရှိသော စီမံခန့်ခွဲသူသည် ‘စီမံခန့်ခွဲသူ’ ကွန်ဆိုးလ်၏ ‘Google Meet ဟာ့ဒ်ဝဲ’ အပိုင်းတွင် ရှေးဦးစွာ ‘Google Meet ဟာ့ဒ်ဝဲ ဝန်ဆောင်မှု စည်းမျဉ်းများ’ ကို လက်ခံရပါမည်။</translation> @@ -6983,6 +7005,7 @@ <translation id="7737115349420013392">"<ph name="DEVICE_NAME" />" နှင့် တွဲချိတ်နေသည် ...</translation> <translation id="7737846262459425222">၎င်းကို ဆက်တင်များ > Google Assistant > ‘ဖန်သားပြင်’ အကြောင်းအရာ တွင် အချိန်မရွေး ပြောင်းနိုင်သည်။</translation> <translation id="7737948071472253612">သင့်ကင်မရာ သုံးရန် ခွင့်ပြုမထားပါ</translation> +<translation id="77381465218432215">အသံပြောင်းသင်္ကေတနှင့် အထူးစာလုံးများ ပြရန်</translation> <translation id="7740996059027112821">ပုံမှန်</translation> <translation id="7741307896921365578">သင်၏ ‘ဖတ်ရန် စာရင်းနှင့် လိပ်စာများ’ အား အသုံးပြုပုံသည် အကျိုးရှိပြီး အပြောင်းအလဲမရှိစေရန် ဘရောင်ဇာအဆင့် ဘေးအကန့်ကို ဖွင့်ပေးသည်။</translation> <translation id="7742558784808143689"><ph name="SITE_NAME" /> ၊ ၎င်းအောက်ရှိ ဝဘ်ဆိုက်အားလုံးနှင့် ထည့်သွင်းထားသော အက်ပ်များအတွက် ဝဘ်ဆိုက်ဒေတာနှင့် ခွင့်ပြုချက်များ ဖယ်ရှားမလား။</translation> @@ -7387,6 +7410,7 @@ <translation id="8101987792947961127">နောက်တစ်ကြိမ် reboot လုပ်လျှင် Powerwash လိုအပ်သည်။</translation> <translation id="81020759409809034">စက်တွင်း တည်နေရာ</translation> <translation id="8102139037507939978">system_logs.txt မှ 'ပုဂ္ဂိုလ်ရေးအရ ခွဲခြားသိရှိနိုင်သော အချက်အလက်များ' ကို ဖယ်ရှားသည်။</translation> +<translation id="810362914482827094">လျှို့ဝှက်ကီးများရှာရန်</translation> <translation id="8104088837833760645">eSIM ပရိုဖိုင် ဒေါင်းလုဒ်လုပ်ရန်</translation> <translation id="8105368624971345109">ပိတ်ပါ</translation> <translation id="8107015733319732394">သင့် <ph name="DEVICE_TYPE" /> တွင် Google Play Store ကို ထည့်သွင်းနေပါသည်။ မိနစ်အနည်းငယ် ကြာနိုင်ပါသည်။</translation> @@ -7772,6 +7796,7 @@ <translation id="8486666913807228950">အကြောင်းရင်း- “၎င်းတွင် မဖြစ်မနေဖွင့်မည်” စာရင်းတွင် ပြောင်းထားသည့်စည်းမျဉ်း <ph name="REVERT_RULE" /> ကို တွေ့ခဲ့သည်။</translation> <translation id="848666842773560761">အက်ပ်က ကင်မရာကိုသုံးရန် ကြိုးစားနေသည်။ သုံးခွင့်ပြုရန် ကင်မရာကိုယ်ရေးလုံခြုံမှုခလုတ်ကို ပိတ်ပါ။</translation> <translation id="8487678622945914333">ဇူးမ်ဆွဲရန်</translation> +<translation id="8487699605742506766">ဟော့စပေါ့</translation> <translation id="8489156414266187072">ပုဂ္ဂိုလ်ရေးသီးသန့် အကြံပြုချက်များကို သင့်အကောင့်တွင်သာ ပြသသည်</translation> <translation id="8490896350101740396">အောက်ပါ kiosk အက်ပ်များကို "<ph name="UPDATED_APPS" />" မွမ်းမံခဲ့သည်။ ကျေးဇူးပြုပြီး မွမ်းမံရေး ဖြစ်စဉ်ကို ပြီးဆုံးစေရန် ကိရိယာကို ပြန်ဖွင့်ပါ။</translation> <translation id="8492685019009920170">လက်ဗွေအာရုံခံကိရိယာကို သင့်လက်ချောင်းဖြင့် ထိပါ။ သင့်ဒေတာကို လုံခြုံစွာသိမ်းထားပြီး သင့် <ph name="DEVICE_TYPE" /> မှ အခြားသို့ မည်သည့်အခါမျှမပေးပို့ပါ။</translation> @@ -7833,6 +7858,7 @@ <translation id="8557022314818157177">သင်၏လက်ဗွေကို ထည့်ပြီးသည်အထိ သင်၏လုံခြုံရေးကီးကို ဆက်ထိပေးပါ</translation> <translation id="8557180006508471423">သင့် Mac ပေါ်ရှိ ‘တည်နေရာဝန်ဆောင်မှုများ’ တွင် “Google Chrome” ဖွင့်ပါ</translation> <translation id="8557856025359704738">လာမည့်ဒေါင်းလုဒ်က <ph name="NEXT_DATE_DOWNLOAD" /> တွင် ဖြစ်သည်။</translation> +<translation id="8559858985063901027">လျှို့ဝှက်ကီးများ</translation> <translation id="8560327176991673955">{COUNT,plural, =0{အားလုံးကို &ဝင်းဒိုးအသစ်တွင် ဖွင့်ရန်}=1{&ဝင်းဒိုးအသစ်တွင် ဖွင့်ရန်}other{({COUNT}) ခုလုံးကို &ဝင်းဒိုးအသစ်တွင် ဖွင့်ရန်}}</translation> <translation id="8561206103590473338">ဆင်</translation> <translation id="8561565784790166472">သတိထားပြီး ရှေ့ဆက်ပါ</translation> @@ -7959,6 +7985,7 @@ <translation id="8677212948402625567">အားလုံး ခေါက်သိမ်းရန်...</translation> <translation id="867767487203716855">လာမည့် အပ်ဒိတ်</translation> <translation id="8677859815076891398">အယ်လ်ဘမ် မရှိပါ။ <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" /> တွင် အယ်လ်ဘမ်တစ်ခု ပြုလုပ်ပါ။</translation> +<translation id="8678378565142776698">ပြန်စတင်ပြီး အလိုအလျောက်အပ်ဒိတ်များ ရယူရန်</translation> <translation id="8678538439778360739"><ph name="TIME" /> တွင် ဒေတာကို သင်၏စင့်ခ်စကားဝှက်စာဖြင့် အသွင်ဝှက်ထားသည်။ ၎င်းတွင် ငွေပေးချေနည်းလမ်းများနှင့် Google Pay မှ လိပ်စာများ မပါဝင်ပါ။</translation> <translation id="8678582529642151449">တဘ်များချုံ့သွားမည် မဟုတ်ပါ</translation> <translation id="8678933587484842200">ဤအပလီကေးရှင်းကို မည်ကဲ့သို့ စတင်စေလိုပါသနည်း။</translation> @@ -8205,6 +8232,7 @@ <translation id="8910987510378294980">စက်စာရင်းကို ဖျောက်ထားရန်</translation> <translation id="8912362522468806198">Google အကောင့်</translation> <translation id="8912810933860534797">အလိုအလျောက် စကင်ဖတ်ခြင်းကို ဖွင့်ရန်</translation> +<translation id="8915307125957890427">တဘ်ပေါ်တွင် ညာဘက်ခလုတ်ကို နှိပ်ပြီး “အုပ်စုသို့ တဘ်ထည့်ရန်” ကို ရွေးပြီးနောက် “အုပ်စုအသစ်” ကို ရွေးနိုင်သည်</translation> <translation id="8915370057835397490">အကြံပေးချက်ကို တင်ပေးနေ</translation> <translation id="8916476537757519021">ရုပ်ဖျက် ဘောင်ငယ် : <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> ၏ <ph name="DEVICE_TYPE" /></translation> @@ -8265,6 +8293,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" နှင့် အခြားတဘ် ၁ ခု}other{"<ph name="TAB_TITLE" />" နှင့် အခြားတဘ် # ခု}}</translation> <translation id="8977811652087512276">စကားဝှက် မမှန်ကန်ပါ သို့မဟုတ် ဖိုင်ပျက်စီးနေသည်</translation> <translation id="8978154919215542464">ဖွင့်ရန် - အားလုံးကို စင့်ခ်လုပ်ရန်</translation> +<translation id="8978670037548431647">မိုဘိုင်းသုံးတွဲချိတ်မှုဆိုင်ရာ စွမ်းဆောင်နိုင်မှုများ ပြန်လည်စတင်ရန်</translation> <translation id="897939795688207351"><ph name="ORIGIN" /> တွင်</translation> <translation id="8980345560318123814">တုံ့ပြန်ချက် အစီရင်ခံစာများ</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> - ရပ်တန့်သွားပါသည်</translation> @@ -8278,6 +8307,7 @@ <translation id="8986362086234534611">မေ့ပစ်လိုက်ပါ</translation> <translation id="8986494364107987395">Google ထံသို့ သုံးစွဲမှု စာရင်းအင်းများ နှင့် ပျက်စီးမှု အစီရင်ခံစာများကို အလိုအလျောက် ပို့ပေးရန်</translation> <translation id="8987927404178983737">လ</translation> +<translation id="8989359959810288806">မိုဘိုင်းသုံးတွဲချိတ်ခြင်းအခြေအနေ ပြန်စရန်</translation> <translation id="8991520179165052608">ဝဘ်ဆိုက်က သင့်မိုက်ခရိုဖုန်းကို အသုံးပြုနိုင်သည်</translation> <translation id="899384117894244799">ကန့်သတ်ထားသော အသုံးပြုသူကို ဖယ်ရှားရန်</translation> <translation id="899403249577094719">Netscape လက်မှတ် အခြေခံ URL</translation> @@ -8529,6 +8559,7 @@ <translation id="935854577147268200">Smart Lock ဖုန်း ပြောင်းသွားပါပြီ။ Smart Lock ကို အပ်ဒိတ်လုပ်ရန် စကားဝှက်ထည့်ပါ။ နောက်တစ်ကြိမ်တွင် သင့်ဖုန်းသည် <ph name="DEVICE_TYPE" /> ကို လော့ခ်ဖွင့်ပေးပါမည်။ Smart Lock ကို 'ဆက်တင်များ' တွင် ပိတ်နိုင်သည်</translation> <translation id="936646668635477464">ကင်မရာနှင့် မိုက်ခရိုဖုန်း</translation> <translation id="936801553271523408">စနစ် ချွတ်ယွင်းချက် စူးစမ်းမှု ဒေတာ</translation> +<translation id="937053962468712792"><ph name="DEVICE" /> ကို <ph name="PRIMARY_EMAIL" /> မှ ဖယ်ရှားလိုပါသလား။</translation> <translation id="93766956588638423">ပရိုဂရမ်အဆက်အား ပြင်ဆင်ရန်</translation> <translation id="938568644810664664">သီချင်းအမည်ကို သိလိုလျှင် “Ok Google, what song is this?” (သို့) စခရင်ပေါ်ရှိအရာကို သိလိုလျှင် “Ok Google, what's on my screen?” ဟု မေးကြည့်ပါ</translation> <translation id="938623846785894166">တွေ့နေကျမဟုတ်သော ဖိုင်</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb index 93575ca..5d060b90 100644 --- a/chrome/app/resources/generated_resources_ne.xtb +++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -892,6 +892,7 @@ <translation id="1829129547161959350">पेन्गुइन</translation> <translation id="1829192082282182671">जुम &घटाउनुहोस्</translation> <translation id="1830550083491357902">साइन इन भएको छैन</translation> +<translation id="1831848493690504725">हामीले हालको नेटवर्कमार्फत Google का सर्भरमा कनेक्ट गर्न सकेनौँ। अर्कै नेटवर्क छनौट गरी हेर्नुहोस् वा आफ्नो नेटवर्कका सेटिङ वा प्रोक्सीसम्बन्धी सेटिङको जाँच गर्नुहोस् (तपाईं प्रोक्सी प्रयोग गर्दै हुनुहुन्छ भने)।</translation> <translation id="1832459821645506983">अँ, म सहमत छु</translation> <translation id="1832511806131704864">फोन परिवर्तन अद्यावधिक गरियो</translation> <translation id="1832848789136765277">तपाईं आफूले सिंक गरेका डेटा जुनसुकै बेला हेर्न तथा प्रयोग गर्न सक्नुहुन्छ भन्ने कुरा सुनिश्चित गर्न साइन इन गर्ने व्यक्ति तपाईं नै हो भन्ने कुरा पुष्टि गर्नुहोस्</translation> @@ -2191,6 +2192,7 @@ <translation id="3021065318976393105">ब्याट्री प्रयोग भइरहेका बेला</translation> <translation id="3021066826692793094">पुतली</translation> <translation id="3021678814754966447">फ्रेम स्रोत &हेर्नुहोस्</translation> +<translation id="3022361196600037287">यो Chromebook बाट <ph name="DEVICE" /> हटाइने छ र उक्त डिभाइस अब <ph name="PRIMARY_EMAIL" /> मा सेभ गरिने छैन।</translation> <translation id="3022978424994383087">मैले बुझिनँ।</translation> <translation id="3023464535986383522">सेलेक्ट टु स्पिक सुविधा</translation> <translation id="3024374909719388945">24-घण्टे घडी प्रयोग गर्नुहोस</translation> @@ -3728,6 +3730,7 @@ <translation id="4535127706710932914">डिफल्ट प्रोफाइल</translation> <translation id="4535767533210902251">तपाईंको किबोर्डको दायाँतिर सबैभन्दा माथि रहेको कुञ्जी फिंगरप्रिन्ट सेन्सर हो। यसलाई कुनै एक औँलाले हल्का छुनुहोस्।</translation> <translation id="4536140153723794651">कुकीहरू सधैँ प्रयोग गर्न पाउने साइटहरू</translation> +<translation id="4536769240747010177">टेदरिङसम्बन्धी सुविधाहरू:</translation> <translation id="4538417792467843292">शब्द मेट्नुहोस्</translation> <translation id="4538792345715658285">उद्योग नीतिद्वारा स्थपित।</translation> <translation id="4541123282641193691">तपाईंको खाता पुष्टि गर्न सकिएन। कृपया फेरि प्रयास गर्नुहोस् वा आफ्नो Chromebook रिस्टार्ट गर्नुहोस्।</translation> @@ -3755,6 +3758,7 @@ <translation id="4561893854334016293">हालै परिवर्तन गरिएको कुनै पनि अनुमति छैन</translation> <translation id="4562155214028662640">फिंगरप्रिन्ट हाल्नुहोस्</translation> <translation id="4563210852471260509">प्रारम्भिक आगत भाषा चिनियाँ हो</translation> +<translation id="4563382028841851106">खाताबाट हटाउनुहोस्</translation> <translation id="4563880231729913339">औँला ३</translation> <translation id="4564245002465020751">आफ्नो फोनमा सेटअप गर्ने कार्य पूरा गर्नुहोस्</translation> <translation id="4565377596337484307">पासवर्ड लुकाउनुहोस्</translation> @@ -4731,6 +4735,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> निम्न कुराका लागि अनुमति चाहन्छ</translation> <translation id="5534304873398226603">तस्बिर वा भिडियो खारेज गर्नुहोस्</translation> <translation id="5537725057119320332">कास्ट गर्नु</translation> +<translation id="5539070192556911367">Google का सर्भरमा कनेक्ट गर्न सकिएन</translation> <translation id="5539221284352502426">तपाईंले प्रविष्ट गर्नुभएको पासवर्ड सर्भरद्वारा अस्वीकार गरियो। यसका सम्भावित कारणहरू निम्न हुन सक्छन्: पासवर्ड निकै छोटो छ। पासवर्डमा अनिवार्य रूपमा सङ्ख्या वा चिन्हहरू समावेश हुनु पर्छ। पासवर्ड अनिवार्य रूपमा अघिल्ला पासवर्डहरूभन्दा फरक हुनु पर्छ।</translation> <translation id="5541694225089836610">तपाईंका प्रशासकले कारबाहीसम्बन्धी सुविधा असक्षम पार्नुभएको छ</translation> <translation id="5542132724887566711">प्रोफाइल</translation> @@ -4794,6 +4799,7 @@ <translation id="5585912436068747822">फर्म्याटिङ असफल भयो</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">एपहरू लोड गर्दै...</translation> +<translation id="5590418976913374224">डिभाइस अन हुँदा ध्वनि बजाइयोस्</translation> <translation id="5592595402373377407">अझै पर्याप्त डाटा उपलब्ध छैन।</translation> <translation id="5595307023264033512">साइटहरूले प्रयोग गरेको कुल भण्डारण: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">ठेगाना सम्पादन गर्नुहोस्</translation> @@ -6170,6 +6176,10 @@ <translation id="6943939122536910181"><ph name="DEVICE" /> बाट डिस्कनेक्ट गरिएको छ</translation> <translation id="6945221475159498467">चयन गर्नुहोस्</translation> <translation id="694592694773692225">यो पृष्ठमा रिडिरेक्ट गर्ने सेवामाथि रोक लगाइयो।</translation> +<translation id="6947015141909171112">तपाईंले हालसालै गरेका पाकविधिसम्बन्धी खोजका आधारमा तपाईंलाई यी पाकविधि देखाइएको हो। + <ph name="BREAK" /> + <ph name="BREAK" /> + तपाईं कार्ड मेनुमार्फत सेटिङ मिलाउन वा "Chrome कस्टमाइज गर्नुहोस्" मा गई थप विकल्पहरू हेर्न सक्नुहुन्छ।</translation> <translation id="6949434160682548041">पासवर्ड (ऐच्छिक)</translation> <translation id="6950627417367801484">एपहरू पुनर्स्थापित गर्नुहोस्</translation> <translation id="6952242901357037157">तपाईं यहाँ आफ्नो <ph name="BEGIN_LINK" />Google खाता<ph name="END_LINK" />मा सुरक्षित गरिएका पासवर्डहरू पनि देखाउन सक्नुहुन्छ</translation> @@ -6337,6 +6347,7 @@ <translation id="7102687220333134671">स्वतःअद्यावधिकहरू सक्रिय गरिएका छन्</translation> <translation id="7102832101143475489">यो अनुरोधको समयावधि सकियो</translation> <translation id="710640343305609397">नेटवर्कका सेटिङहरू खोल्नुहोस्</translation> +<translation id="7107609441453408294">सबै स्पिकरहरूबाट उही अडियो प्ले गर्नुहोस्</translation> <translation id="7108338896283013870">लुकाउनुहोस्</translation> <translation id="7108668606237948702">प्रविष्टि गर्नुहोस्</translation> <translation id="7108933416628942903">अब लक गर्नुहोस्</translation> @@ -6567,6 +6578,7 @@ <translation id="7364745943115323529">Cast...</translation> <translation id="7364796246159120393">फाइल छान्नुहोस्</translation> <translation id="7365076891350562061">मनिटरको आकार</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" /> - पिन गरिएको</translation> <translation id="7366316827772164604">नजिकैका डिभाइसहरू स्क्यान गरिँदै छ…</translation> <translation id="7366415735885268578">कुनै साइट थप्नुहोस्</translation> <translation id="7366909168761621528">ब्राउजिङको डेटा</translation> @@ -6963,6 +6975,7 @@ <translation id="7737115349420013392">"<ph name="DEVICE_NAME" />" सँग जोडा बनाउँदै ...</translation> <translation id="7737846262459425222">तपाईं सेटिङ > Google सहायक > स्क्रिन कन्टेक्स्ट नामक खण्डमा गएर जुनसुकै बेला यो सेटिङ बदल्न सक्नुहुन्छ।</translation> <translation id="7737948071472253612">तपाईंको क्यामेरा प्रयोग गर्ने अनुमति नदिइएका साइटहरू</translation> +<translation id="77381465218432215">एक्सेन्ट चिन्ह तथा विशेष वर्णहरू देखाइऊन्</translation> <translation id="7740996059027112821">मानक</translation> <translation id="7741307896921365578">तपाईंले पछि पढ्न सेभ गरेका वेबपेजका सूची र बुकमार्कहरू जुनसुकै बेला सजिलैसँग भेट्टाउन सकियोस् भन्नाका लागि ब्राउजरमा साइड प्यानल सक्षम पार्छ।</translation> <translation id="7742558784808143689"><ph name="SITE_NAME" />, यसअन्तर्गत रहेका सबै साइट र इन्स्टल गरिएका सम्बन्धित वेब एपका साइट डेटा मेटाउनुका साथै ती साइट र एपलाई दिइएका अनुमति रद्द गर्ने हो?</translation> @@ -7752,6 +7765,7 @@ <translation id="8486666913807228950">कारण: <ph name="REVERT_RULE" /> इन्भर्टेड रुल "जे भए पनि यो ब्राउजरमा खोलियोस्" को सूचीमा भेटिएको थियो।</translation> <translation id="848666842773560761">कुनै एपले क्यामेरा प्रयोग गर्न खोज्दै छ। उक्त एपलाई क्यामेरा प्रयोग गर्ने अनुमति दिन क्यामेराको गोपनीयता स्विच अफ गर्नुहोस्।</translation> <translation id="8487678622945914333">जुम बढाउनुहोस्</translation> +<translation id="8487699605742506766">हटस्पट</translation> <translation id="8489156414266187072">व्यक्तिगत सिफारिस तपाईंको खातामा मात्र देखाइन्छन्</translation> <translation id="8490896350101740396">निम्न kisok एपहरू " <ph name="UPDATED_APPS" /> "अद्यावधिक गरिएका छन्। अद्यावधिक प्रक्रिया पूरा गर्न यन्त्रलाई रिबुट गर्नुहोस्।</translation> <translation id="8492685019009920170">औँलाले फिंगरप्रिन्ट सेन्सरमा छुनुहोस्। तपाईंको जानकारी सुरक्षित रूपमा भण्डारण गरिन्छ र यो जानकारी तपाईंको <ph name="DEVICE_TYPE" /> बाट अन्यत्र पठाइँदैन।</translation> @@ -8245,6 +8259,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" र अरू १ ट्याब}other{"<ph name="TAB_TITLE" />" र अरू # ट्याबहरू}}</translation> <translation id="8977811652087512276">गलत पासवर्ड वा बिग्रिएको फाइल</translation> <translation id="8978154919215542464">सक्रिय - सबै सिंक गर्नुहोस्</translation> +<translation id="8978670037548431647">टेदरिङसम्बन्धी सुविधाहरू रिफ्रेस गर्नुहोस्</translation> <translation id="897939795688207351"><ph name="ORIGIN" /> मा</translation> <translation id="8980345560318123814">प्रतिक्रियासम्बन्धी रिपोर्टहरू</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> - क्र्याश भएको छ</translation> @@ -8509,6 +8524,7 @@ <translation id="935854577147268200">Smart Lock रहेको फोन परिवर्तन गरियो। Smart Lock अद्यावधिक गर्न आफ्नो पासवर्ड प्रविष्टि गर्नुहोस्। अर्को पटकदेखि, तपाईंको फोनले तपाईंको <ph name="DEVICE_TYPE" />अनलक गर्ने छ। तपाईं सेटिङहरूमा गई Smart Lock निष्क्रिय पार्न सक्नुहुन्छ</translation> <translation id="936646668635477464">क्यामेरा र माइक्रोफोन</translation> <translation id="936801553271523408">प्रणाली विकर्ण लगत</translation> +<translation id="937053962468712792"><ph name="PRIMARY_EMAIL" /> बाट <ph name="DEVICE" /> हटाउने हो?</translation> <translation id="93766956588638423">विस्तार मर्मत गर्नुहोस्</translation> <translation id="938568644810664664">“Ok Google, यो कुन गीत हो?” वा “Ok Google, मेरो स्क्रिनमा के छ?” भनी हेर्नुहोस्।</translation> <translation id="938623846785894166">असामान्य फाइल</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index 2f09dc9..9596557 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -901,6 +901,7 @@ <translation id="1829129547161959350">Pingviner</translation> <translation id="1829192082282182671">Zoom &ut</translation> <translation id="1830550083491357902">Ikke pålogget</translation> +<translation id="1831848493690504725">Vi får ikke kontakt med Google via det tilkoblede nettverket. Prøv å velge et annet nettverk, eller sjekk nettverksinnstillingene eller proxy-innstillingene (hvis du bruker en proxy-tjener).</translation> <translation id="1832459821645506983">Ja, den er grei</translation> <translation id="1832511806131704864">Telefonendring oppdatert</translation> <translation id="1832848789136765277">For å sikre at du alltid har tilgang til de synkroniserte dataene dine, må du bekrefte at det er deg</translation> @@ -4740,6 +4741,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> vil</translation> <translation id="5534304873398226603">Forkast bilde eller video</translation> <translation id="5537725057119320332">Cast</translation> +<translation id="5539070192556911367">Får ikke kontakt med Google</translation> <translation id="5539221284352502426">Passordet du skrev inn, ble avvist av tjeneren. Mulige grunner kan være: Passordet er for kort. Passordet må inneholde tall eller symboler. Passordet må være forskjellig fra tidligere passord.</translation> <translation id="5541694225089836610">Administratoren din har slått av handlingen</translation> <translation id="5542132724887566711">Profil</translation> @@ -4803,6 +4805,7 @@ <translation id="5585912436068747822">Formateringen mislyktes</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Laster inn apper …</translation> +<translation id="5590418976913374224">Spill av lyd ved oppstart av enheten</translation> <translation id="5592595402373377407">Nok data er ikke tilgjengelig ennå.</translation> <translation id="5595307023264033512">Total mengde lagringsplass som brukes av nettsteder: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">Rediger adresse</translation> @@ -6347,6 +6350,7 @@ <translation id="7102687220333134671">Automatiske oppdateringer er slått på</translation> <translation id="7102832101143475489">Forespørselen ble tidsavbrutt</translation> <translation id="710640343305609397">Åpne nettverksinnstillingene</translation> +<translation id="7107609441453408294">Spill av den samme lyden på alle høyttalere</translation> <translation id="7108338896283013870">Skjul</translation> <translation id="7108668606237948702">Enter</translation> <translation id="7108933416628942903">Lås nå</translation> @@ -6577,6 +6581,7 @@ <translation id="7364745943115323529">Cast</translation> <translation id="7364796246159120393">Velg fil</translation> <translation id="7365076891350562061">Skjermstørrelse</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" /> – festet</translation> <translation id="7366316827772164604">Søker etter enheter i nærheten …</translation> <translation id="7366415735885268578">Legg til et nettsted</translation> <translation id="7366909168761621528">Nettleserdata</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb index e09385b..1636d0241 100644 --- a/chrome/app/resources/generated_resources_or.xtb +++ b/chrome/app/resources/generated_resources_or.xtb
@@ -2192,6 +2192,7 @@ <translation id="3021065318976393105">ବ୍ୟାଟେରୀରେ ଚାଲୁଥିବା ସମୟରେ</translation> <translation id="3021066826692793094">ପ୍ରଜାପତି</translation> <translation id="3021678814754966447">ଫ୍ରେମ୍ ଉତ୍ସ &ଦେଖନ୍ତୁ</translation> +<translation id="3022361196600037287">ଏହି Chromebookରୁ <ph name="DEVICE" />କୁ କାଢ଼ି ଦିଆଯିବ ଏବଂ ଏହା <ph name="PRIMARY_EMAIL" />ରେ ସେଭ ହେବ ନାହିଁ।</translation> <translation id="3022978424994383087">ତାହା ବୁଝିହେଲା ନହିଁ।</translation> <translation id="3023464535986383522">ସିଲେକ୍ଟ ଟୁ ସ୍ପିକ୍</translation> <translation id="3024374909719388945">24-ଘଣ୍ଟିଆ ଘଣ୍ଟା ବ୍ୟବହାର କରନ୍ତୁ</translation> @@ -3730,6 +3731,7 @@ <translation id="4535127706710932914">ଡିଫଲ୍ଟ ପ୍ରୋଫାଇଲ୍</translation> <translation id="4535767533210902251">ଆପଣଙ୍କ କୀବୋର୍ଡର ଉପର ଡାହାଣ କୀ ଟିପଚିହ୍ନ ସେନ୍ସର୍ ଅଟେ। ଏହାକୁ କୌଣସି ଆଙ୍ଗୁଠିରେ ହାଲୁକା ଭାବେ ସ୍ପର୍ଶ କରନ୍ତୁ।</translation> <translation id="4536140153723794651">କୁକୀଗୁଡ଼ିକୁ ସର୍ବଦା ବ୍ୟବହାର କରିପାରୁଥିବା ସାଇଟଗୁଡ଼ିକ</translation> +<translation id="4536769240747010177">ଟିଥରିଂ ଦକ୍ଷତାଗୁଡ଼ିକ:</translation> <translation id="4538417792467843292">ଶବ୍ଦ ଡିଲିଟ୍ କରନ୍ତୁ</translation> <translation id="4538792345715658285">ଏଣ୍ଟରପ୍ରାଇଜ୍ ନୀତି ଦ୍ୱାରା ଇନ୍ଷ୍ଟଲ୍ କରାଯାଇଛି।</translation> <translation id="4541123282641193691">ଆପଣଙ୍କ ଆକାଉଣ୍ଟକୁ ଯାଞ୍ଚ କରାଯାଇପାରିଲା ନାହିଁ। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ କିମ୍ବା ଆପଣଙ୍କ Chromebookକୁ ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ।</translation> @@ -3757,6 +3759,7 @@ <translation id="4561893854334016293">ବର୍ତ୍ତମାନ ପରିବର୍ତ୍ତନ କରାଯାଇଥିବା କୌଣସି ଅନୁମତି ନାହିଁ</translation> <translation id="4562155214028662640">ଟିପଚିହ୍ନ ଯୋଗ କରନ୍ତୁ</translation> <translation id="4563210852471260509">ପ୍ରାରମ୍ଭିକ ଇନପୁଟ୍ ଭାଷା ଚାଇନିଜ୍ ଅଟେ</translation> +<translation id="4563382028841851106">ଆକାଉଣ୍ଟରୁ କାଢ଼ି ଦିଅନ୍ତୁ</translation> <translation id="4563880231729913339">ଟିପଚିହ୍ନ 3</translation> <translation id="4564245002465020751">ଆପଣଙ୍କ ଫୋନରେ ସେଟ ଅପ କରିବା ସମ୍ପୂର୍ଣ୍ଣ କରନ୍ତୁ</translation> <translation id="4565377596337484307">ପାସୱାର୍ଡ୍ ଲୁଚାନ୍ତୁ</translation> @@ -6174,6 +6177,10 @@ <translation id="6943939122536910181"><ph name="DEVICE" />ରୁ ବିଚ୍ଛିନ୍ନ କରାଯାଇଛି</translation> <translation id="6945221475159498467">ଚୟନ କରନ୍ତୁ</translation> <translation id="694592694773692225">ଏହି ପୃଷ୍ଠାରେ ରିଡାଇରେକ୍ଟ ପ୍ରକ୍ରିୟାକୁ ବ୍ଲକ୍ କରାଗଲା।</translation> +<translation id="6947015141909171112">ଆପଣ ରେସିପିଗୁଡ଼ିକ ପାଇଁ ଆପଣଙ୍କ ବର୍ତ୍ତମାନର ସନ୍ଧାନ କାର୍ଯ୍ୟକଳାପ ଆଧାରରେ ରେସିପିଗୁଡ଼ିକୁ ଦେଖୁଛନ୍ତି। + <ph name="BREAK" /> + <ph name="BREAK" /> + ଆପଣ କାର୍ଡ ମେନୁରୁ ସେଟିଂସକୁ ପରିଚାଳନା କରିପାରିବେ କିମ୍ବା "Chromeକୁ କଷ୍ଟମାଇଜ କରନ୍ତୁ"ରେ ଅଧିକ ବିକଳ୍ପ ଦେଖିପାରିବେ।</translation> <translation id="6949434160682548041">ପାସ୍ୱର୍ଡ (ଇଚ୍ଛାଧୀନ)</translation> <translation id="6950627417367801484">ଆପ୍ସ ରିଷ୍ଟୋର୍ କରନ୍ତୁ</translation> <translation id="6952242901357037157">ଆପଣ ଏଠାରେ <ph name="BEGIN_LINK" />ଆପଣଙ୍କ Google ଆକାଉଣ୍ଟ<ph name="END_LINK" />ରୁ ପାସୱାର୍ଡଗୁଡ଼ିକ ମଧ୍ୟ ଦେଖାଇ ପାରିବେ</translation> @@ -6969,6 +6976,7 @@ <translation id="7737115349420013392">"<ph name="DEVICE_NAME" />" ସହ ପେୟାର୍ କରାଯାଉଛି ...</translation> <translation id="7737846262459425222">ଆପଣ ଏହାକୁ ଯେ କୌଣସି ସମୟରେ "ସେଟିଂସ୍ > Google Assistant > ସ୍କ୍ରିନ୍ ପ୍ରସଙ୍ଗ"ରେ ପରିବର୍ତ୍ତନ କରିପାରିବେ।</translation> <translation id="7737948071472253612">ଆପଣଙ୍କ କ୍ୟାମେରା ବ୍ୟବହାର କରିବାକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ</translation> +<translation id="77381465218432215">ଆକ୍ସେଣ୍ଟ ମାର୍କ ଏବଂ ବିଶେଷ କେରେକ୍ଟରଗୁଡ଼ିକ ଦେଖାନ୍ତୁ</translation> <translation id="7740996059027112821">ମାନାଙ୍କ</translation> <translation id="7741307896921365578">ଆପଣଙ୍କ ପଢ଼ିବା ତାଲିକା ଏବଂ ବୁକମାର୍କଗୁଡ଼ିକୁ ଆକ୍ସେସ୍ କରିବା ନିମନ୍ତେ ଉପଯୋଗୀ ଓ ଅବିରତ ଉପାୟ ପାଇଁ ଏକ ବ୍ରାଉଜର୍-ଲେଭେଲରେ ସାଇଡ୍ ପ୍ୟାନେଲ୍ ସକ୍ଷମ କରେ।</translation> <translation id="7742558784808143689"><ph name="SITE_NAME" />, ଏହା ଅଧୀନରେ ଥିବା ସମସ୍ତ ସାଇଟ ଏବଂ ଇନଷ୍ଟଲ କରାଯାଇଥିବା ଆପଗୁଡ଼ିକ ପାଇଁ ସାଇଟ ଡାଟା ଓ ଅନୁମତିଗୁଡ଼ିକୁ ଖାଲି କରିବେ କି?</translation> @@ -7756,6 +7764,7 @@ <translation id="8486666913807228950">କାରଣ: "ବାଧ୍ୟତାମୂଳକ ଭାବେ ଖୋଲନ୍ତୁ" ତାଲିକାରେ ବିପରୀତ ନିୟମ <ph name="REVERT_RULE" /> ମିଳିଛି।</translation> <translation id="848666842773560761">ଏକ ଆପ୍ କ୍ୟାମେରାକୁ ଆକ୍ସେସ୍ କରିବାକୁ ଚେଷ୍ଟା କରୁଛି। ଆକ୍ସେସ୍ କରିବାକୁ ଅନୁମତି ଦେବାକୁ କ୍ୟାମେରାର ଗୋପନୀୟତା ସ୍ୱିଚକୁ ବନ୍ଦ କରନ୍ତୁ।</translation> <translation id="8487678622945914333">ଜୁମ୍ ଇନ୍</translation> +<translation id="8487699605742506766">ହଟସ୍ପଟ</translation> <translation id="8489156414266187072">ବ୍ୟକ୍ତିଗତ ପରାମର୍ଶଗୁଡ଼ିକ କେବଳ ଆପଣଙ୍କ ଆକାଉଣ୍ଟରେ ଦେଖାଯାଏ</translation> <translation id="8490896350101740396">ନିମ୍ନୋକ୍ତ କିଓସ୍କ ଆପ୍ସ "<ph name="UPDATED_APPS" />" ଅପ୍ଡେଟ୍ କରାଯାଇଛି। ଅପ୍ଡେଟ୍ ପ୍ରକ୍ରିୟାକୁ ସମ୍ପୂର୍ଣ୍ଣ କରିବାକୁ ଦୟାକରି ଡିଭାଇସ୍କୁ ରିବୁଟ୍ କରନ୍ତୁ।</translation> <translation id="8492685019009920170">ଆପଣଙ୍କ ଆଙ୍ଗୁଠିରେ ଟିପଚିହ୍ନ ସେନ୍ସରକୁ ସ୍ପର୍ଶ କରନ୍ତୁ। ଆପଣଙ୍କ ଡାଟା ସୁରକ୍ଷିତ ଭାବେ ଷ୍ଟୋର୍ କରାଯାଇଥାଏ ଏବଂ କେବେ ବି ଆପଣଙ୍କ <ph name="DEVICE_TYPE" />ରୁ କାଢ଼ି ଦିଆଯାଏ ନାହିଁ।</translation> @@ -8249,6 +8258,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" ଏବଂ ଅନ୍ୟ 1ଟି ଟାବ୍}other{"<ph name="TAB_TITLE" />" ଏବଂ ଅନ୍ୟ #ଟି ଟାବ୍}}</translation> <translation id="8977811652087512276">ଭୁଲ୍ ପାସ୍ୱର୍ଡ କିମ୍ବା ଖରାପ ଫାଇଲ୍</translation> <translation id="8978154919215542464">ଚାଲୁ - ସବୁକିଛି ସିଙ୍କ କରନ୍ତୁ</translation> +<translation id="8978670037548431647">ଟିଥରିଂ ଦକ୍ଷତାଗୁଡ଼ିକୁ ରିଫ୍ରେସ କରନ୍ତୁ</translation> <translation id="897939795688207351"><ph name="ORIGIN" /> ରେ</translation> <translation id="8980345560318123814">ମତାମତ ରିପୋର୍ଟଗୁଡ଼ିକ</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> - କ୍ରାସ୍ ହୋଇଗଲା</translation> @@ -8513,6 +8523,7 @@ <translation id="935854577147268200">ସ୍ମାର୍ଟ ଲକ୍ ଫୋନ୍ ବଦଳିଗଲା। ସ୍ମାର୍ଟ ଲକ୍କୁ ଅପ୍ଡେଟ୍ କରିବା ପାଇଁ ଆପଣଙ୍କର ପାସ୍ୱର୍ଡ ଲେଖନ୍ତୁ। ପରବର୍ତ୍ତୀ ସମୟରେ, ଆପଣଙ୍କର ଫୋନ୍ ଆପଣଙ୍କ <ph name="DEVICE_TYPE" /> ଅନ୍ଲକ୍ କରିବ।ସେଟିଂସ୍ରେ ଆପଣ ସ୍ମାର୍ଟ ଲକ୍ ପରିବର୍ତ୍ତନ କରିପାରିବେ</translation> <translation id="936646668635477464">କ୍ୟାମେରା ଓ ମାଇକ୍ରୋଫୋନ୍</translation> <translation id="936801553271523408">ସିଷ୍ଟମ୍ ଡାଏଗ୍ନୋଷ୍ଟିକ୍ ଡାଟା</translation> +<translation id="937053962468712792"><ph name="PRIMARY_EMAIL" />ରୁ <ph name="DEVICE" />କୁ କାଢ଼ିବେ?</translation> <translation id="93766956588638423">ଏକ୍ସଟେନ୍ସନ୍ ମରାମତି କରନ୍ତୁ</translation> <translation id="938568644810664664">“Hey Google, ଏହା କେଉଁ ଗୀତ?” କିମ୍ବା “Hey Google, ମୋ ସ୍କ୍ରିନରେ କଣ ଅଛି?” ବୋଲି କହି ଦେଖନ୍ତୁ</translation> <translation id="938623846785894166">ଅସାଧାରଣ ଫାଇଲ</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index 9ca803d..11ffc94 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">ਆਪਣਾ ਮਾਈਕ੍ਰੋਫੋਨ ਅਤੇ ਕੈਮਰਾ ਵਰਤੋ</translation> <translation id="1005333234656240382">ਕੀ ADB ਡੀਬੱਗਿੰਗ ਨੂੰ ਚਾਲੂ ਕਰਨਾ ਹੈ?</translation> <translation id="1006873397406093306">ਇਹ ਐਕਸਟੈਂਸ਼ਨ ਸਾਈਟਾਂ 'ਤੇ ਮੌਜੂਦ ਤੁਹਾਡਾ ਡਾਟਾ ਪੜ੍ਹ ਅਤੇ ਬਦਲ ਸਕਦੀ ਹੈ। ਤੁਸੀਂ ਸਾਈਟਾਂ ਤੱਕ ਐਕਸਟੈਂਸ਼ਨ ਦੀ ਪਹੁੰਚ ਨੂੰ ਕੰਟਰੋਲ ਕਰ ਸਕਦੇ ਹੋ।</translation> +<translation id="1007057452468855774">Google Play Store ਚਾਲੂ ਕਰੋ</translation> <translation id="1008186147501209563">ਬੁੱਕਮਾਰਕ ਨਿਰਯਾਤ ਕਰੋ</translation> <translation id="1008557486741366299">ਹੁਣ ਨਹੀਂ</translation> <translation id="1009476156254802388"><ph name="WEB_DRIVE" /> ਟਿਕਾਣਾ</translation> <translation id="1009663062402466586">ਗੇਮ ਦੇ ਕੰਟਰੋਲ ਹੁਣ ਉਪਲਬਧ ਹਨ</translation> <translation id="1010498023906173788">ਇਹ ਟੈਬ ਕਿਸੇ ਸੀਰੀਅਲ ਪੋਰਟ ਨਾਲ ਕਨੈਕਟ ਕੀਤੀ ਗਈ ਹੈ।</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{ਪੰਨਾ ਗੈਰਜਵਾਬਦੇਹ}one{ਪੰਨੇ ਗੈਰਜਵਾਬਦੇਹ}other{ਪੰਨੇ ਗੈਰਜਵਾਬਦੇਹ}}</translation> +<translation id="1011003645819296594">ਰੱਖਿਅਤ ਕੀਤੇ ਡੀਵਾਈਸ</translation> <translation id="1011355516189274711">ਲਿਖਤ-ਤੋਂ-ਬੋਲੀ ਅਵਾਜ਼</translation> <translation id="1012794136286421601">ਤੁਹਾਡੇ Docs, Sheets, Slides ਅਤੇ Drawings ਫ਼ਾਈਲਾਂ ਸਿੰਕ ਕੀਤੀਆਂ ਜਾ ਰਹੀਆਂ ਹਨ। ਉਹਨਾਂ 'ਤੇ ਆਨਲਾਈਨ ਜਾਂ ਆਫ਼ਲਾਈਨ ਪਹੁੰਚ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ Google Drive ਐਪ ਖੋਲ੍ਹੋ।</translation> <translation id="1012876632442809908">USB-C ਡੀਵਾਈਸ (ਅੱਗੇ ਦਾ ਪੋਰਟ)</translation> @@ -495,6 +497,7 @@ <translation id="1470350905258700113">ਇਸ ਡੀਵਾਈਸ ਨੂੰ ਵਰਤੋ</translation> <translation id="1470946456740188591">ਕੈਰਟ ਬ੍ਰਾਊਜ਼ਿੰਗ ਨੂੰ ਚਾਲੂ ਜਾਂ ਬੰਦ ਕਰਨ ਲਈ, Ctrl+Search+7 ਸ਼ਾਰਟਕੱਟ ਵਰਤੋ</translation> <translation id="1472675084647422956">ਹੋਰ ਦਿਖਾਓ</translation> +<translation id="1473223074251193484">ਟੈਦਰਿੰਗ ਸੰਰੂਪਣ ਨੂੰ ਸੈੱਟ ਕਰੋ</translation> <translation id="1474785664565228650">ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਸੈਟਿੰਗ ਵਿੱਚ ਤਬਦੀਲੀ ਲਈ Parallels Desktop ਦਾ ਮੁੜ-ਲਾਂਚ ਹੋਣਾ ਲੋੜੀਂਦਾ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ Parallels Desktop ਨੂੰ ਮੁੜ-ਲਾਂਚ ਕਰੋ।</translation> <translation id="1474893630593443211">ਤੁਹਾਨੂੰ ਦਿਸਣ ਵਾਲੇ ਵਿਗਿਆਪਨਾਂ 'ਤੇ ਤੁਹਾਡਾ ਜ਼ਿਆਦਾ ਕੰਟਰੋਲ</translation> <translation id="1475502736924165259">ਤੁਹਾਡੇ ਕੋਲ ਫ਼ਾਈਲ 'ਤੇ ਅਜਿਹੇ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਹਨ ਜੋ ਹੋਰ ਕਿਸੇ ਵੀ ਸ਼੍ਰੇਣੀ ਦੇ ਅਨੁਕੂਲ ਨਹੀਂ ਹਨ</translation> @@ -907,6 +910,7 @@ <translation id="1829129547161959350">ਪੈਂਗਵਿਨ</translation> <translation id="1829192082282182671">ਜ਼ੂਮ &ਘਟਾਓ</translation> <translation id="1830550083491357902">ਸਾਈਨ ਇਨ ਨਹੀਂ ਕੀਤਾ</translation> +<translation id="1831848493690504725">ਅਸੀਂ ਕਨੈਕਟ ਕੀਤੇ ਨੈੱਟਵਰਕ ਰਾਹੀਂ Google ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਕਰ ਸਕਦੇ। ਕੋਈ ਵੱਖਰਾ ਨੈੱਟਵਰਕ ਚੁਣ ਤੇ ਜਾਂ ਆਪਣੀਆਂ ਨੈੱਟਵਰਕ ਸੈਟਿੰਗਾਂ ਜਾਂ ਪ੍ਰੌਕਸੀ ਸੈਟਿੰਗਾਂ (ਜੇ ਤੁਸੀਂ ਪ੍ਰੌਕਸੀ ਵਰਤ ਰਹੇ ਹੋ) ਦੀ ਜਾਂਚ ਕਰ ਕੇ ਦੇਖੋ।</translation> <translation id="1832459821645506983">ਹਾਂ, ਮੈਂ ਸਹਿਮਤ ਹਾਂ</translation> <translation id="1832511806131704864">ਫ਼ੋਨ ਤਬਦੀਲੀ ਅੱਪਡੇਟ ਕੀਤੀ ਗਈ</translation> <translation id="1832848789136765277">ਇਹ ਪੱਕਾ ਕਰਨ ਲਈ ਕਿ ਤੁਸੀਂ ਆਪਣੇ ਸਿੰਕ ਕੀਤੇ ਡਾਟੇ ਤੱਕ ਹਮੇਸ਼ਾਂ ਪਹੁੰਚ ਕਰ ਸਕੋ, ਆਪਣੀ ਪਛਾਣ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ</translation> @@ -1125,6 +1129,7 @@ <translation id="2044014337866019681">ਕਿਰਪਾ ਕਰਕੇ ਪੱਕਾ ਕਰੋ ਕਿ ਤੁਸੀਂ ਸੈਸ਼ਨ ਨੂੰ ਅਣਲਾਕ ਕਰਨ ਲਈ <ph name="ACCOUNT" /> ਦੀ ਪੁਸ਼ਟੀ ਕਰ ਰਹੇ ਹੋ।</translation> <translation id="204497730941176055">Microsoft ਪ੍ਰਮਾਣ-ਪੱਤਰ ਟੈਮਪਲੇਟ ਨਾਮ</translation> <translation id="2045117674524495717">ਕੀ-ਬੋਰਡ ਸ਼ਾਰਟਕੱਟ ਸਹਾਇਕ</translation> +<translation id="2045211794962848221">ਤੁਹਾਨੂੰ ਇਹ ਖਾਸ ਸੁਨੇਹਾ ਦੁਬਾਰਾ ਨਹੀਂ ਦਿਸੇਗਾ</translation> <translation id="2045969484888636535">ਕੁਕੀਜ਼ ਬਲੌਕ ਕਰਨਾ ਜਾਰੀ ਰੱਖੋ</translation> <translation id="204622017488417136">ਤੁਹਾਡਾ ਡੀਵਾਈਸ Chrome ਦੇ ਪਹਿਲਾਂ ਸਥਾਪਤ ਕੀਤੇ ਵਰਜਨ 'ਤੇ ਵਾਪਸ ਚਲਾ ਜਾਵੇਗਾ। ਸਾਰੇ ਵਰਤੋਂਕਾਰ ਖਾਤੇ ਅਤੇ ਸਥਾਨਕ ਡਾਟਾ ਹਟਾ ਦਿੱਤੇ ਜਾਣਗੇ। ਇਸਨੂੰ ਅਣਕੀਤਾ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।</translation> <translation id="2046702855113914483">ਰੈਮਨ</translation> @@ -2208,6 +2213,7 @@ <translation id="3021065318976393105">ਜਦੋਂ ਚਾਰਜ ਨਾ ਹੋ ਰਿਹਾ ਹੋਵੇ</translation> <translation id="3021066826692793094">ਤਿਤਲੀ</translation> <translation id="3021678814754966447">&ਫ੍ਰੇਮ ਸ੍ਰੋਤ ਦੇਖੋ</translation> +<translation id="3022361196600037287"><ph name="DEVICE" /> ਨੂੰ ਇਸ Chromebook ਤੋਂ ਹਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ ਅਤੇ <ph name="PRIMARY_EMAIL" /> ਵਿੱਚ ਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਜਾਵੇਗਾ।</translation> <translation id="3022978424994383087">ਸਮਝ ਨਹੀਂ ਆਇਆ।</translation> <translation id="3023464535986383522">ਚੁਣੋ ਅਤੇ ਸੁਣੋ</translation> <translation id="3024374909719388945">24-ਘੰਟੇ ਵਾਲੀ ਘੜੀ ਵਰਤੋ</translation> @@ -3747,6 +3753,7 @@ <translation id="4535127706710932914">ਪੂਰਵ-ਨਿਰਧਾਰਤ ਪ੍ਰੋਫਾਈਲ</translation> <translation id="4535767533210902251">ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਤੁਹਾਡੇ ਕੀਬੋਰਡ 'ਤੇ ਸਿਖਰਲੀ ਸੱਜੇ ਪਾਸੇ ਦੀ ਕੁੰਜੀ ਹੈ। ਇਸਨੂੰ ਕਿਸੇ ਵੀ ਉਂਗਲ ਨਾਲ ਹਲਕਾ ਜਿਹਾ ਸਪਰਸ਼ ਕਰੋ।</translation> <translation id="4536140153723794651">ਉਹ ਸਾਈਟਾਂ ਜੋ ਹਮੇਸ਼ਾਂ ਕੁਕੀਜ਼ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੀਆਂ ਹਨ</translation> +<translation id="4536769240747010177">ਟੈਦਰਿੰਗ ਸਮਰੱਥਾਵਾਂ:</translation> <translation id="4538417792467843292">ਸ਼ਬਦ ਮਿਟਾਓ</translation> <translation id="4538792345715658285">ਐਂਟਰਪ੍ਰਾਈਜ ਨੀਤੀ ਵੱਲੋਂ ਸਥਾਪਤ ਕੀਤਾ ਗਿਆ।</translation> <translation id="4541123282641193691">ਤੁਹਾਡੇ ਖਾਤੇ ਦੀ ਪੁਸ਼ਟੀ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜਾਂ ਆਪਣੀ Chromebook ਨੂੰ ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ।</translation> @@ -3774,6 +3781,7 @@ <translation id="4561893854334016293">ਕੋਈ ਹਾਲੀਆ ਬਦਲੀਆਂ ਇਜਾਜ਼ਤਾਂ ਨਹੀਂ</translation> <translation id="4562155214028662640">ਫਿੰਗਰਪ੍ਰਿੰਟ ਸ਼ਾਮਲ ਕਰੋ</translation> <translation id="4563210852471260509">ਅਰੰਭਿਕ ਇਨਪੁਟ ਭਾਸ਼ਾ ਚੀਨੀ ਹੈ</translation> +<translation id="4563382028841851106">ਖਾਤੇ ਤੋਂ ਹਟਾਓ</translation> <translation id="4563880231729913339">ਉਂਗਲ 3</translation> <translation id="4564245002465020751">ਤੁਹਾਡੇ ਫ਼ੋਨ 'ਤੇ ਸੈੱਟਅੱਪ ਪੂਰਾ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation> <translation id="4565377596337484307">ਪਾਸਵਰਡ ਲੁਕਾਓ</translation> @@ -3810,6 +3818,7 @@ <translation id="4594577641390224176">ਕੀ ਪੰਨੇ ਸੰਬੰਧੀ ਸਿਸਟਮ ਨੂੰ ਲੱਭ ਰਹੇ ਹੋ? ਇੱਥੇ ਜਾਓ</translation> <translation id="4595560905247879544">ਐਪਾਂ ਅਤੇ ਐਕਸਟੈਂਸ਼ਨਾਂ ਸਿਰਫ਼ ਮੈਨੇਜਰ (<ph name="CUSTODIAN_NAME" />) ਵੱਲੋਂ ਸੰਸ਼ੋਧਿਤ ਕੀਤੀਆਂ ਜਾ ਸਕਦੀਆਂ ਹਨ।</translation> <translation id="4596295440756783523">ਤੁਹਾਡੇ ਕੋਲ ਫ਼ਾਈਲ 'ਤੇ ਅਜਿਹੇ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਹਨ ਜੋ ਇਹਨਾਂ ਸਰਵਰਾਂ ਦੀ ਪਛਾਣ ਕਰਦੇ ਹਨ</translation> +<translation id="4598345735110653698">ਪਾਸਕੀਆਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ</translation> <translation id="4598556348158889687">ਸਟੋਰੇਜ ਪ੍ਰਬੰਧਨ</translation> <translation id="4598776695426288251">ਇੱਕ ਤੋਂ ਵੱਧ ਡੀਵਾਈਸਾਂ ਰਾਹੀਂ ਵਾਈ-ਫਾਈ ਉਪਲਬਧ ਹੈ</translation> <translation id="4601426376352205922">ਨਾ-ਪੜ੍ਹੇ ਵਜੋਂ ਨਿਸ਼ਾਨਦੇਹੀ ਕਰੋ</translation> @@ -4035,6 +4044,7 @@ <translation id="4823894915586516138">ਇਹ ਪਿੰਨ ਜਾਂ ਪਾਸਵਰਡ ਇਸ <ph name="DEVICE_TYPE" /> 'ਤੇ ਤੁਹਾਡੇ ਡਾਟੇ ਦੀ ਸੁਰੱਖਿਆ ਕਰਦਾ ਹੈ, ਇਸ ਵਿੱਚ ਉਹ ਜਾਣਕਾਰੀ ਵੀ ਸ਼ਾਮਲ ਹੈ, ਜਿਸ ਤੱਕ ਤੁਸੀਂ ਆਪਣੇ ਫ਼ੋਨ ਰਾਹੀਂ ਪਹੁੰਚ ਕੀਤੀ ਹੈ</translation> <translation id="4824037980212326045">Linux ਬੈਕਅੱਪ ਅਤੇ ਮੁੜ-ਬਹਾਲੀ</translation> <translation id="4824958205181053313">ਕੀ ਸਿੰਕ ਰੱਦ ਕਰਨਾ ਹੈ?</translation> +<translation id="4825532258163983651">ਪਾਸਕੀ ਨੂੰ ਮਿਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ</translation> <translation id="4827675678516992122">ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ</translation> <translation id="4827784381479890589">Chrome ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਵਿਸਤ੍ਰਿਤ ਸ਼ਬਦ-ਜੋੜ ਜਾਂਚ ਦੀ ਸੁਵਿਧਾ (ਸ਼ਬਦ-ਜੋੜ ਸੁਝਾਵਾਂ ਲਈ ਲਿਖਤ Google ਨੂੰ ਭੇਜੀ ਜਾਂਦੀ ਹੈ)</translation> <translation id="4827904420700932487">ਇਸ ਚਿੱਤਰ ਲਈ QR ਕੋਡ ਬਣਾਓ</translation> @@ -4297,6 +4307,7 @@ <translation id="5087249366037322692">ਕਿਸੇ ਤੀਜੀ-ਪਾਰਟੀ ਵੱਲੋਂ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ</translation> <translation id="5087580092889165836">ਕਾਰਡ ਸ਼ਾਮਲ ਕਰੋ</translation> <translation id="5088534251099454936">RSA ਐਨਕ੍ਰਿਪਸ਼ਨ ਨਾਲ PKCS #1 SHA-512</translation> +<translation id="5089763948477033443">ਸਾਈਡ ਪੈਨਲ ਦਾ ਆਕਾਰ ਬਦਲਣ ਵਾਲਾ ਹੈਂਡਲ</translation> <translation id="5090637338841444533">ਤੁਹਾਡੇ ਕੈਮਰੇ ਦੀ ਸਥਿਤੀ ਨੂੰ ਟਰੈਕ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ</translation> <translation id="5093569275467863761">ਪੂਰੇ ਪੰਨੇ ਦੇ ਕੈਸ਼ੇ ਵਿੱਚ ਸਟੋਰ ਕੀਤਾ ਇਨਕੋਗਨਿਟੋ ਸਬਫ੍ਰੇਮ: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">ਤੁਸੀਂ ਆਪਣੇ ਫ਼ਾਈਲ ਐਪ ਜਾਂ ਹੋਰ ਐਪਾਂ ਤੋਂ ਇਸ ਐਪ ਨਾਲ ਸਮਰਥਿਤ ਫ਼ਾਈਲਾਂ ਨੂੰ ਖੋਲ੍ਹ ਸਕਦੇ ਹੋ ਅਤੇ ਉਨ੍ਹਾਂ ਦਾ ਸੰਪਾਦਨ ਕਰ ਸਕਦੇ ਹੋ। ਇਹ ਕੰਟਰੋਲ ਕਰਨ ਲਈ ਕਿ ਕਿਹੜੀਆਂ ਫ਼ਾਈਲਾਂ ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਤੌਰ 'ਤੇ ਇਸ ਐਪ ਨੂੰ ਖੋਲ੍ਹਣ, ਇਸ ਲਈ <ph name="BEGIN_LINK" />ਆਪਣੇ ਡੀਵਾਈਸ 'ਤੇ ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਐਪਾਂ ਨੂੰ ਸੈੱਟ ਕਰਨ ਦਾ ਤਰੀਕਾ ਜਾਣੋ<ph name="END_LINK" />।</translation> @@ -4462,6 +4473,7 @@ <translation id="5258992782919386492">ਇਸ ਡੀਵਾਈਸ 'ਤੇ ਸਥਾਪਤ ਕਰੋ</translation> <translation id="5260334392110301220">ਸਮਾਰਟ ਕੌਮੇ</translation> <translation id="5260508466980570042">ਮਾਫ਼ ਕਰਨਾ, ਤੁਹਾਡੀ ਈਮੇਲ ਜਾਂ ਪਾਸਵਰਡ ਨੂੰ ਪ੍ਰਮਾਣਿਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> +<translation id="5260958083445173099">ਸੰਭਵ ਹੋਣ 'ਤੇ, ਵੈੱਬਸਾਈਟਾਂ ਸਮੱਗਰੀ ਨੂੰ ਤੁਹਾਡੀਆਂ ਤਰਜੀਹੀ ਭਾਸ਼ਾਵਾਂ ਵਿੱਚ ਦਿਖਾਉਣਗੀਆਂ</translation> <translation id="5261683757250193089">ਵੈੱਬ ਸਟੋਰ ਵਿੱਚ ਖੋਲ੍ਹੋ</translation> <translation id="5262178194499261222">ਪਾਸਵਰਡ ਹਟਾਓ</translation> <translation id="5262784498883614021">ਨੈੱਟਵਰਕ ਨਾਲ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਕਨੈਕਟ ਕਰੋ</translation> @@ -4502,6 +4514,7 @@ <translation id="5294097441441645251">ਛੋਟੇ ਅੱਖਰ ਜਾਂ ਅੰਡਰਸਕੋਰ ਨਾਲ ਸ਼ੁਰੂ ਹੋਣਾ ਲਾਜ਼ਮੀ ਹੈ</translation> <translation id="5294618183559481278">ਤੁਹਾਡੀ <ph name="DEVICE_TYPE" /> ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦੇ ਸਾਹਮਣੇ ਮੌਜੂਦ ਲੋਕਾਂ ਦਾ ਪਤਾ ਲਗਾਉਣ ਲਈ ਬਿਲਟ-ਇਨ ਸੈਂਸਰ ਦੀ ਵਰਤੋਂ ਕਰਦੀ ਹੈ। ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਵਿਚਲੇ ਸਾਰੇ ਡਾਟੇ 'ਤੇ ਤੁਰੰਤ ਪ੍ਰਕਿਰਿਆ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਅਤੇ ਫਿਰ ਇਸਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਂਦਾ ਹੈ। ਸੈਂਸਰ ਡਾਟਾ ਕਦੇ ਵੀ Google ਨੂੰ ਨਹੀਂ ਭੇਜਿਆ ਜਾਂਦਾ। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation> <translation id="5296350763804564124">ਬੋਲੀ ਪ੍ਰਤੀਕਰਮ ਸੁਣੋ, ਤਾਂ ਜੋ ਤੁਸੀਂ ਬਿਨਾਂ ਸਕ੍ਰੀਨ ਦੇਖੇ ਆਪਣੇ ਡੀਵਾਈਸ ਨੂੰ ਵਰਤ ਸਕੋ। ਬਰੇਲ ਲਿਪੀ ਸੰਬੰਧੀ ਵਿਚਾਰ ਕਨੈਕਟ ਕੀਤੇ ਡੀਵਾਈਸ ਨਾਲ ਉਪਲਬਧ ਹੈ।</translation> +<translation id="5297005732522718715">ਟੈਦਰਿੰਗ ਸੰਰੂਪਣ ਨੂੰ ਰਿਫ੍ਰੈਸ਼ ਕਰੋ</translation> <translation id="5297082477358294722">ਪਾਸਵਰਡ ਰੱਖਿਅਤ ਕੀਤਾ ਗਿਆ। ਆਪਣੇ <ph name="SAVED_PASSWORDS_STORE" /> ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤੇ ਪਾਸਵਰਡ ਦੇਖੋ ਅਤੇ ਉਹਨਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ।</translation> <translation id="5297946558563358707">ਜਦੋਂ ਕੋਈ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ ਵੱਲ ਦੇਖਦਾ ਹੈ, ਤਾਂ ਆਪਣੀ ਸਕ੍ਰੀਨ ਦੇ ਹੇਠਲੇ ਸੱਜੇ ਪਾਸੇ ਦਿੱਤਾ ਪਰਦੇਦਾਰੀ ਅੱਖ ਪ੍ਰਤੀਕ ਦਿਖਾਓ</translation> <translation id="5298219193514155779">ਵੱਲੋਂ ਬਣਾਇਆ ਗਿਆ ਥੀਮ</translation> @@ -4672,11 +4685,13 @@ <translation id="5466374726908360271">“<ph name="SEARCH_TERMS" />” ਪੇਸਟ ਕਰਕੇ ਖੋਜੋ</translation> <translation id="5467207440419968613"><ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ਨੂੰ ਬਲਾਕ ਕੀਤਾ ਗਿਆ</translation> <translation id="5468173180030470402">ਫ਼ਾਈਲ ਸਾਂਝਾਕਰਨਾਂ ਨੂੰ ਲੱਭਿਆ ਜਾ ਰਿਹਾ ਹੈ</translation> +<translation id="5468330507528805311">ਟੈਦਰਿੰਗ ਸਥਿਤੀ:</translation> <translation id="5468881191994555667">ਫਾਈਲ ਚੁਣੋ</translation> <translation id="5469852975082458401">ਤੁਸੀਂ ਲਿਖਤ ਕਰਸਰ ਦੇ ਨਾਲ ਪੰਨਿਆਂ 'ਤੇ ਨੈਵੀਗੇਟ ਕਰ ਸਕਦੇ ਹੋ। ਬੰਦ ਕਰਨ ਲਈ F7 ਦਬਾਓ।</translation> <translation id="5470735824776589490">ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨੂੰ ਪਾਵਰਵਾਸ਼ ਨਾਲ ਰੀਸੈੱਟ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਮੁੜ-ਸ਼ੁਰੂ ਕਰਨ ਦੀ ਲੋੜ ਹੈ। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation> <translation id="5471768120198416576">ਸਤਿ ਸ੍ਰੀ ਅਕਾਲ! ਮੈਂ ਤੁਹਾਡੀ ਲਿਖਤ ਤੋਂ ਬੋਲੀ ਵਿੱਚ ਬਦਲੀ ਹੋਈ ਅਵਾਜ਼ ਹਾਂ।</translation> <translation id="5472627187093107397">ਇਸ ਸਾਈਟ ਲਈ ਪਾਸਵਰਡ ਰੱਖਿਅਤ ਕਰੋ</translation> +<translation id="5473062644742711742">Chrome Web Store ਵਿੱਚ ਹੋਰ ਪਹੁੰਚਯੋਗਤਾ ਟੂਲ ਲੱਭੋ</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">ਜਾਰੀ ਰੱਖ ਕੇ, ਤੁਸੀਂ ਇਹ ਸਹਿਮਤੀ ਦਿੰਦੇ ਹੋ ਕਿ ਇਹ ਡੀਵਾਈਸ ਸੰਭਾਵੀ ਤੌਰ 'ਤੇ ਸੈਲਿਊਲਰ ਡਾਟੇ ਦੀ ਵਰਤੋਂ ਨਾਲ Google, ਤੁਹਾਡੇ ਬੱਚੇ ਦਾ ਕੈਰੀਅਰ ਅਤੇ ਇਸ ਡੀਵਾਈਸ ਦੇ ਨਿਰਮਾਤਾ ਤੋਂ ਅੱਪਡੇਟ ਅਤੇ ਐਪਾਂ ਨੂੰ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਡਾਊਨਲੋਡ ਅਤੇ ਸਥਾਪਤ ਵੀ ਕਰ ਸਕਦਾ ਹੈ। ਇਨ੍ਹਾਂ ਵਿੱਚੋਂ ਕੁਝ ਐਪਾਂ ਐਪ-ਅੰਦਰ ਖਰੀਦਾਂ ਦੀ ਪੇਸ਼ਕਸ਼ ਕਰ ਸਕਦੀਆਂ ਹਨ।</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{ਪਿੰਨ ਘੱਟੋ-ਘੱਟ ਇੱਕ ਅੱਖਰ-ਚਿੰਨ੍ਹ ਦਾ ਹੋਣਾ ਲਾਜ਼ਮੀ ਹੈ}one{ਪਿੰਨ ਘੱਟੋ-ਘੱਟ # ਅੱਖਰ-ਚਿੰਨ੍ਹ ਦਾ ਹੋਣਾ ਲਾਜ਼ਮੀ ਹੈ}other{ਪਿੰਨ ਘੱਟੋ-ਘੱਟ # ਅੱਖਰ-ਚਿੰਨ੍ਹਾਂ ਦਾ ਹੋਣਾ ਲਾਜ਼ਮੀ ਹੈ}}</translation> @@ -4750,6 +4765,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> ਇਹ ਕਰਨਾ ਚਾਹੁੰਦੀ ਹੈ</translation> <translation id="5534304873398226603">ਫ਼ੋਟੋ ਜਾਂ ਵੀਡੀਓ ਰੱਦ ਕਰੋ</translation> <translation id="5537725057119320332">ਕਾਸਟ ਕਰੋ</translation> +<translation id="5539070192556911367">Google ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ</translation> <translation id="5539221284352502426">ਤੁਹਾਡੇ ਵੱਲੋਂ ਦਾਖਲ ਕੀਤੇ ਪਾਸਵਰਡ ਨੂੰ ਸਰਵਰ ਨੇ ਅਸਵੀਕਾਰ ਕੀਤਾ। ਸੰਭਾਵਿਤ ਕਾਰਨਾਂ ਵਿੱਚ ਇਹ ਸ਼ਾਮਲ ਹੈ: ਪਾਸਵਰਡ ਬਹੁਤ ਛੋਟਾ ਹੈ। ਪਾਸਵਰਡ ਵਿੱਚ ਨੰਬਰ ਜਾਂ ਚਿੰਨ੍ਹ ਹੋਣਾ ਲਾਜ਼ਮੀ ਹੈ। ਪਾਸਵਰਡ ਲਾਜ਼ਮੀ ਤੌਰ 'ਤੇ ਪਿਛਲੇ ਪਾਸਵਰਡਾਂ ਤੋਂ ਵੱਖਰਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।</translation> <translation id="5541694225089836610">ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਨੇ ਕਾਰਵਾਈ ਨੂੰ ਬੰਦ ਕੀਤਾ ਹੋਇਆ ਹੈ</translation> <translation id="5542132724887566711">ਪ੍ਰੋਫਾਈਲ</translation> @@ -4813,6 +4829,7 @@ <translation id="5585912436068747822">ਫੌਰਮੈਟ ਕਰਨਾ ਅਸਫਲ</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">ਐਪਾਂ ਲੋਡ ਕੀਤੀਆਂ ਜਾ ਰਹੀਆਂ ਹਨ...</translation> +<translation id="5590418976913374224">ਡੀਵਾਈਸ ਨੂੰ ਸ਼ੁਰੂ ਕਰਨ ਵੇਲੇ ਧੁਨੀ ਚਲਾਓ</translation> <translation id="5592595402373377407">ਅਜੇ ਕਾਫ਼ੀ ਡਾਟਾ ਉਪਲਬਧ ਨਹੀਂ।</translation> <translation id="5595307023264033512">ਸਾਈਟਾਂ ਵੱਲੋਂ ਵਰਤੀ ਗਈ ਕੁੱਲ ਸਟੋਰੇਜ: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">ਪਤਾ ਸੰਪਾਦਿਤ ਕਰੋ</translation> @@ -4946,6 +4963,7 @@ <translation id="5734362860645681824">ਸੰਚਾਰ</translation> <translation id="5734697361979786483">ਫ਼ਾਈਲ ਸਾਂਝਾਕਰਨ ਸ਼ਾਮਲ ਕਰੋ</translation> <translation id="5736796278325406685">ਕਿਰਪਾ ਕਰਕੇ ਇੱਕ ਵੈਧ ਵਰਤੋਂਕਾਰ ਨਾਮ ਦਾਖਲ ਕਰੋ</translation> +<translation id="5738093759615225354">ਤੁਹਾਨੂੰ ਆਪਣੇ ਕੰਪਿਊਟਰ ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰਨ ਲਈ ਇਸ ਪਾਸਕੀ ਦੀ ਲੋੜ ਹੈ</translation> <translation id="5739017626473506901">ਸਕੂਲੀ ਖਾਤਾ ਸ਼ਾਮਲ ਕਰਨ ਵਿੱਚ <ph name="USER_NAME" /> ਦੀ ਮਦਦ ਕਰਨ ਲਈ ਸਾਈਨ-ਇਨ ਕਰੋ</translation> <translation id="5739235828260127894">ਪੁਸ਼ਟੀਕਰਨ ਦੀ ਉਡੀਕ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation> <translation id="5739458112391494395">ਬਹੁਤ ਵੱਡਾ</translation> @@ -5107,6 +5125,7 @@ <translation id="589541317545606110"><ph name="VISUAL_SEARCH_PROVIDER" /> ਨਾਲ ਪੰਨਾ ਖੋਜੋ</translation> <translation id="5896436821193322561">ਆਗਿਆ ਨਾ ਦਿਓ</translation> <translation id="5900186025777217044">Smart Lock ਬਦਲ ਗਿਆ ਹੈ</translation> +<translation id="5900243355162006650">ਟੈਦਰਿੰਗ ਸੰਰੂਪਣ:</translation> <translation id="5900302528761731119">Google ਪ੍ਰੋਫਾਈਲ ਫ਼ੋਟੋ</translation> <translation id="590036993063074298">ਪ੍ਰਤਿਬਿੰਬੀਕਰਨ ਕੁਆਲਿਟੀ ਦੇ ਵੇਰਵੇ</translation> <translation id="5901069264981746702">ਤੁਹਾਡਾ ਫਿੰਗਰਪ੍ਰਿੰਟ ਡਾਟਾ ਸੁਰੱਖਿਅਤ ਤਰੀਕੇ ਨਾਲ ਸਟੋਰ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਅਤੇ ਕਦੇ ਵੀ ਤੁਹਾਡੇ <ph name="DEVICE_TYPE" /> ਤੋਂ ਬਾਹਰ ਨਹੀਂ ਜਾਂਦਾ ਹੈ। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation> @@ -5410,6 +5429,7 @@ <translation id="6196640612572343990">ਤੀਜੀ-ਧਿਰ ਵਾਲੀਆਂ ਕੁੱਕੀਜ਼ ਨੂੰ ਬਲੌਕ ਕਰੋ</translation> <translation id="6196854373336333322">ਐਕਸਟੈਂਸ਼ਨ "<ph name="EXTENSION_NAME" />" ਨੇ ਤੁਹਾਡੀਆਂ ਪ੍ਰੌਕਸੀ ਸੈਟਿੰਗਾਂ 'ਤੇ ਕੰਟਰੋਲ ਹਾਸਲ ਕਰ ਲਿਆ ਹੈ, ਜਿਸਦਾ ਮਤਲਬ ਹੈ ਕਿ ਇਹ ਤੁਹਾਡੇ ਵੱਲੋਂ ਆਨਲਾਈਨ ਕੀਤੀ ਜਾਣ ਵਾਲੀ ਕਿਸੇ ਵੀ ਕਿਰਿਆ ਨੂੰ ਬਦਲ ਸਕਦੀ ਹੈ, ਖੰਡਿਤ ਕਰ ਸਕਦੀ ਹੈ ਜਾਂ ਗੁਪਤ ਢੰਗ ਨਾਲ ਵਾਰਤਾਲਾਪ ਨੂੰ ਸੁਣ ਸਕਦੀ ਹੈ। ਜੇਕਰ ਤੁਸੀਂ ਪੱਕੇ ਨਹੀਂ ਹੋ ਕਿ ਇਹ ਬਦਲਾਵ ਕਿਉਂ ਵਾਪਰਿਆ ਹੈ, ਤਾਂ ਸੰਭਾਵਨਾ ਹੈ ਕਿ ਤੁਸੀਂ ਵੀ ਇਹ ਨਹੀਂ ਚਾਹੁੰਦੇ।</translation> <translation id="6197128521826316819">ਇਸ ਪੰਨੇ ਲਈ QR ਕੋਡ ਬਣਾਓ</translation> +<translation id="6197223946499512637">ਇਨ੍ਹਾਂ ਪਾਸਕੀਆਂ ਨੂੰ ਇਸ ਕੰਪਿਊਟਰ 'ਤੇ ਮੌਜੂਦ Windows Hell ਵਿੱਚ ਸਟੋਰ ਕੀਤਾ ਗਿਆ ਹੈ। ਉਨ੍ਹਾਂ ਨੂੰ ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ।</translation> <translation id="6198252989419008588">PIN ਬਦਲੋ</translation> <translation id="6200047250927636406">ਫ਼ਾਈਲ ਨੂੰ ਬਰਖਾਸਤ ਕਰੋ</translation> <translation id="6200151268994853226">ਐਕਸਟੈਂਸ਼ਨ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ</translation> @@ -5707,6 +5727,7 @@ <translation id="6482559668224714696">ਪੂਰੀ-ਸਕ੍ਰੀਨ ਵੱਡਦਰਸ਼ੀ</translation> <translation id="6483485061007832714">ਡਾਊਨਲੋਡ ਖੋਲ੍ਹੋ</translation> <translation id="6483805311199035658"><ph name="FILE" /> ਨੂੰ ਖੋਲ੍ਹ ਰਿਹਾ ਹੈ...</translation> +<translation id="6486301003991593638">ਪਾਸਕੀਆਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਲਈ, Windows ਦਾ ਨਵਾਂ ਵਰਜਨ ਵਰਤੋ</translation> <translation id="6488384360522318064">ਭਾਸ਼ਾ ਚੁਣੋ</translation> <translation id="648927581764831596">ਕੋਈ ਵੀ ਉਪਲਬਧ ਨਹੀਂ</translation> <translation id="6490471652906364588">USB-C ਡਿਵਾਈਸ (ਸੱਜਾ ਪੋਰਟ)</translation> @@ -6193,6 +6214,10 @@ <translation id="6943939122536910181"><ph name="DEVICE" /> ਤੋਂ ਡਿਸਕਨੈਕਟ ਹੈ</translation> <translation id="6945221475159498467">ਚੁਣੋ</translation> <translation id="694592694773692225">ਇਸ ਪੰਨੇ 'ਤੇ ਰੀਡਾਇਰੈਕਟ ਨੂੰ ਬਲਾਕ ਕੀਤਾ ਗਿਆ।</translation> +<translation id="6947015141909171112">ਤੁਸੀਂ ਪਕਵਾਨ-ਵਿਧੀਆਂ ਲਈ ਆਪਣੀ ਹਾਲੀਆ ਖੋਜ ਸਰਗਰਮੀ ਦੇ ਆਧਾਰ 'ਤੇ ਪਕਵਾਨ-ਵਿਧੀਆਂ ਦੇਖ ਰਹੇ ਹੋ। + <ph name="BREAK" /> + <ph name="BREAK" /> + ਤੁਸੀਂ ਕਾਰਡ ਮੀਨੂ ਤੋਂ ਸੈਟਿੰਗਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦੇ ਹੋ ਜਾਂ 'Chrome ਨੂੰ ਵਿਉਂਤਬੱਧ ਕਰੋ' ਵਿੱਚ ਹੋਰ ਵਿਕਲਪ ਦੇਖ ਸਕਦੇ ਹੋ।</translation> <translation id="6949434160682548041">ਪਾਸਵਰਡ (ਵਿਕਲਪਿਕ)</translation> <translation id="6950627417367801484">ਐਪਾਂ ਮੁੜ-ਬਹਾਲ ਕਰੋ</translation> <translation id="6952242901357037157">ਤੁਸੀਂ ਇੱਥੇ ਆਪਣੇ <ph name="BEGIN_LINK" />Google ਖਾਤੇ<ph name="END_LINK" /> ਤੋਂ ਪਾਸਵਰਡ ਵੀ ਦਿਖਾ ਸਕਦੇ ਹੋ</translation> @@ -6292,6 +6317,7 @@ <translation id="7029307918966275733">Crostini ਸਥਾਪਤ ਨਹੀਂ ਹੈ। ਕ੍ਰੈਡਿਟਾਂ ਨੂੰ ਦੇਖਣ ਲਈ ਕਿਰਪਾ ਕਰਕੇ Crostini ਨੂੰ ਸਥਾਪਤ ਕਰੋ।</translation> <translation id="7029809446516969842">ਪਾਸਵਰਡ</translation> <translation id="7030304022046916278">URL ਦੀ ਜਾਂਚ ਕਰਨ ਲਈ ਇਹ ਸੁਰੱਖਿਅਤ ਬ੍ਰਾਊਜ਼ਿੰਗ ਨੂੰ ਭੇਜੇ ਜਾਂਦੇ ਹਨ</translation> +<translation id="7030695672997239647">ਟੈਬ 'ਤੇ ਸੱਜਾ-ਕਲਿੱਕ ਕਰੋ ਅਤੇ "ਗਰੁੱਪ ਵਿੱਚ ਟੈਬ ਸ਼ਾਮਲ ਕਰੋ" ਚੁਣੋ ਅਤੇ ਫਿਰ "ਨਵਾਂ ਗਰੁੱਪ" ਚੁਣੋ</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - ਸੀਰੀਅਲ ਪੋਰਟ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ</translation> <translation id="7033616203784997570">ਇਨਪੁੱਟ ਵੱਧ ਤੋਂ ਵੱਧ 62 ਅੱਖਰ-ਚਿੰਨ੍ਹਾਂ ਦਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ</translation> <translation id="7034692021407794547">ਬਿਲਿੰਗ ਪ੍ਰਬੰਧਨ ਅਧਿਕਾਰਾਂ ਵਾਲੇ ਪ੍ਰਸ਼ਾਸਕ ਦਾ ਸਭ ਤੋਂ ਪਹਿਲਾਂ ਪ੍ਰਸ਼ਾਸਕ ਕੰਸੋਲ ਦੇ Google Meet ਹਾਰਡਵੇਅਰ ਸੈਕਸ਼ਨ ਵਿੱਚ Google Meet ਹਾਰਡਵੇਅਰ ਦੇ ਸੇਵਾ ਦੇ ਨਿਯਮਾਂ ਨੂੰ ਸਵੀਕਾਰ ਕਰਨਾ ਲਾਜ਼ਮੀ ਹੈ।</translation> @@ -6360,6 +6386,7 @@ <translation id="7102687220333134671">ਸਵੈਚਲਿਤ ਅੱਪਡੇਟ ਚਾਲੂ ਹਨ</translation> <translation id="7102832101143475489">ਬੇਨਤੀ ਦੀ ਸਮਾਂ-ਸਮਾਪਤੀ</translation> <translation id="710640343305609397">ਨੈੱਟਵਰਕ ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ</translation> +<translation id="7107609441453408294">ਸਾਰਿਆਂ ਸਪੀਕਰਾਂ ਰਾਹੀਂ ਇੱਕੋ ਜਿਹੀ ਆਡੀਓ ਚਲਾਓ</translation> <translation id="7108338896283013870">ਲੁਕਾਓ</translation> <translation id="7108668606237948702">ਦਰਜ ਕਰੋ</translation> <translation id="7108933416628942903">ਹੁਣੇ ਲਾਕ ਕਰੋ</translation> @@ -6590,6 +6617,7 @@ <translation id="7364745943115323529">ਕਾਸਟ ਕਰੋ...</translation> <translation id="7364796246159120393">ਫਾਈਲ ਚੁਣੋ</translation> <translation id="7365076891350562061">ਮਾਨੀਟਰ ਦਾ ਆਕਾਰ</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" /> - ਪਿੰਨ ਕੀਤੀ ਗਈ</translation> <translation id="7366316827772164604">ਨਜ਼ਦੀਕੀ ਡੀਵਾਈਸਾਂ ਲਈ ਸਕੈਨ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...</translation> <translation id="7366415735885268578">ਕੋਈ ਸਾਈਟ ਸ਼ਾਮਲ ਕਰੋ</translation> <translation id="7366909168761621528">ਬ੍ਰਾਊਜ਼ਿੰਗ ਡਾਟਾ </translation> @@ -6986,6 +7014,7 @@ <translation id="7737115349420013392">"<ph name="DEVICE_NAME" />" ਨਾਲ ਜੋੜਾਬੱਧ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ ...</translation> <translation id="7737846262459425222">ਤੁਸੀਂ ਕਿਸੇ ਵੀ ਸਮੇਂ ਸੈਟਿੰਗਾਂ > Google Assistant > ਸਕ੍ਰੀਨ ਸੰਦਰਭ ਵਿੱਚ ਜਾ ਕੇ ਇਸਨੂੰ ਬਦਲ ਸਕਦੇ ਹੋ।</translation> <translation id="7737948071472253612">ਤੁਹਾਡਾ ਕੈਮਰਾ ਵਰਤਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ</translation> +<translation id="77381465218432215">ਐਕਸੈਂਟ ਚਿੰਨ੍ਹ ਅਤੇ ਖਾਸ ਅੱਖਰ-ਚਿੰਨ੍ਹ ਦਿਖਾਓ</translation> <translation id="7740996059027112821">ਸਟੈਂਡਰਡ</translation> <translation id="7741307896921365578">ਆਪਣੀ ਪੜ੍ਹਨ-ਸੂਚੀ ਅਤੇ Bookmarks ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੇ ਲਾਹੇਵੰਦ ਅਤੇ ਸਥਾਈ ਤਰੀਕੇ ਲਈ ਬ੍ਰਾਊਜ਼ਰ-ਪੱਧਰ ਦੇ ਸਾਈਡ ਪੈਨਲ ਨੂੰ ਚਾਲੂ ਕਰਦਾ ਹੈ।</translation> <translation id="7742558784808143689">ਕੀ <ph name="SITE_NAME" />, ਇਸਦੇ ਅਧੀਨ ਆਉਂਦੀਆਂ ਸਾਰੀਆਂ ਸਾਈਟਾਂ, ਅਤੇ ਸਥਾਪਤ ਕੀਤੀਆਂ ਐਪਾਂ ਲਈ ਸਾਈਟ ਡਾਟਾ ਅਤੇ ਇਜਾਜ਼ਤਾਂ ਨੂੰ ਕਲੀਅਰ ਕਰਨਾ ਹੈ?</translation> @@ -7389,6 +7418,7 @@ <translation id="8101987792947961127">ਅਗਲੇ ਰੀਬੂਟ 'ਤੇ ਪਾਵਰਵਾਸ਼ ਲੁੜੀਂਦਾ</translation> <translation id="81020759409809034">ਸਥਾਨਕ ਟਿਕਾਣਾ</translation> <translation id="8102139037507939978">system_logs.txt ਤੋਂ ਨਿੱਜੀ ਪਛਾਣ ਕਰਨ ਵਾਲੀ ਜਾਣਕਾਰੀ ਨੂੰ ਹਟਾਓ।</translation> +<translation id="810362914482827094">ਪਾਸਕੀਆਂ ਖੋਜੋ</translation> <translation id="8104088837833760645">ਈ-ਸਿਮ ਪ੍ਰੋਫਾਈਲ ਡਾਊਨਲੋਡ ਕਰੋ</translation> <translation id="8105368624971345109">ਬੰਦ ਕਰੋ</translation> <translation id="8107015733319732394">ਤੁਹਾਡੀ <ph name="DEVICE_TYPE" /> 'ਤੇ Google Play Store ਸਥਾਪਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ। ਇਸ ਵਿੱਚ ਥੋੜ੍ਹੀ ਦੇਰ ਲੱਗ ਸਕਦੀ ਹੈ।</translation> @@ -7774,6 +7804,7 @@ <translation id="8486666913807228950">ਕਾਰਨ: ਉਲਟਾ ਨਿਯਮ <ph name="REVERT_RULE" /> "ਇਸ ਵਿੱਚ ਜ਼ਬਰਦਸਤੀ ਖੋਲ੍ਹੋ" ਸੂਚੀ ਵਿੱਚ ਮਿਲਿਆ ਸੀ।</translation> <translation id="848666842773560761">ਕੋਈ ਐਪ ਕੈਮਰੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਰਹੀ ਹੈ। ਪਹੁੰਚ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣ ਲਈ ਕੈਮਰਾ ਪਰਦੇਦਾਰੀ ਸਵਿੱਚ ਨੂੰ ਬੰਦ ਕਰੋ।</translation> <translation id="8487678622945914333">ਜ਼ੂਮ ਵਧਾਓ</translation> +<translation id="8487699605742506766">ਹੌਟਸਪੌਟ</translation> <translation id="8489156414266187072">ਨਿੱਜੀ ਸੁਝਾਅ ਸਿਰਫ਼ ਤੁਹਾਡੇ ਖਾਤੇ 'ਤੇ ਦਿਖਾਏ ਜਾਂਦੇ ਹਨ</translation> <translation id="8490896350101740396">ਹੇਠਾਂ ਦਿੱਤੇ ਕਿਓਸਕ ਐਪਾਂ "<ph name="UPDATED_APPS" />" ਅਪਡੇਟ ਕੀਤੇ ਗਏ ਹਨ। ਕਿਰਪਾ ਕਰਕੇ ਅਪਡੇਟ ਪ੍ਰਕਿਰਿਆ ਪੂਰੀ ਕਰਨ ਲਈ ਡਿਵਾਈਸ ਨੂੰ ਰੀਬੂਟ ਕਰੋ।</translation> <translation id="8492685019009920170">ਆਪਣੀ ਉਂਗਲ ਨਾਲ ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਨੂੰ ਸਪਰਸ਼ ਕਰੋ। ਤੁਹਾਡਾ ਡਾਟਾ ਸੁਰੱਖਿਅਤ ਤਰੀਕੇ ਨਾਲ ਸਟੋਰ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਅਤੇ ਕਦੇ ਵੀ ਤੁਹਾਡੀ <ph name="DEVICE_TYPE" /> ਤੋਂ ਬਾਹਰ ਨਹੀਂ ਜਾਂਦਾ।</translation> @@ -7835,6 +7866,7 @@ <translation id="8557022314818157177">ਤੁਹਾਡੇ ਫਿੰਗਰਪ੍ਰਿੰਟ ਦੇ ਕੈਪਚਰ ਹੋਣ ਤੱਕ ਆਪਣੀ ਸੁਰੱਖਿਆ ਕੁੰਜੀ ਨੂੰ ਸਪਰਸ਼ ਕਰਕੇ ਰੱਖੋ</translation> <translation id="8557180006508471423">ਆਪਣੇ Mac 'ਤੇ ਟਿਕਾਣਾ ਸੇਵਾਵਾਂ ਵਿੱਚ "Google Chrome" ਨੂੰ ਚਾਲੂ ਕਰੋ</translation> <translation id="8557856025359704738">ਅਗਲਾ ਡਾਊਨਲੋਡ <ph name="NEXT_DATE_DOWNLOAD" /> ਨੂੰ ਹੈ।</translation> +<translation id="8559858985063901027">ਪਾਸਕੀਆਂ</translation> <translation id="8560327176991673955">{COUNT,plural, =0{ਸਾਰੇ &ਨਵੀਂ ਵਿੰਡੋ ਵਿੱਚ ਖੋਲ੍ਹੋ}=1{&ਨਵੀਂ ਵਿੰਡੋ ਵਿੱਚ ਖੋਲ੍ਹੋ}other{ਸਾਰੇ ({COUNT}) &ਨਵੀਂ ਵਿੰਡੋ ਵਿੱਚ ਖੋਲ੍ਹੋ}}</translation> <translation id="8561206103590473338">ਹਾਥੀ</translation> <translation id="8561565784790166472">ਸਾਵਧਾਨੀ ਨਾਲ ਜਾਰੀ ਰੱਖੋ</translation> @@ -7961,6 +7993,7 @@ <translation id="8677212948402625567">ਸਭ ਸਮੇਟੋ</translation> <translation id="867767487203716855">ਅਗਲਾ ਅੱਪਡੇਟ</translation> <translation id="8677859815076891398">ਕੋਈ ਐਲਬਮ ਨਹੀਂ ਹੈ। <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" /> ਵਿੱਚ ਐਲਬਮ ਬਣਾਓ।</translation> +<translation id="8678378565142776698">ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ ਅਤੇ ਸਵੈਚਲਿਤ ਅੱਪਡੇਟ ਪ੍ਰਾਪਤ ਕਰੋ</translation> <translation id="8678538439778360739"><ph name="TIME" /> ਵਜੇ ਡਾਟਾ ਤੁਹਾਡੇ ਸਿੰਕ ਪਾਸਫਰੇਜ਼ ਨਾਲ ਇਨਕ੍ਰਿਪਟ ਕੀਤਾ ਗਿਆ ਸੀ। ਇਸ ਵਿੱਚ Google Pay ਦੀਆਂ ਭੁਗਤਾਨ ਵਿਧੀਆਂ ਅਤੇ ਪਤੇ ਸ਼ਾਮਲ ਨਹੀਂ ਹਨ।</translation> <translation id="8678582529642151449">ਟੈਬਾਂ ਨਹੀਂ ਸੁੰਗੜਨਗੀਆਂ</translation> <translation id="8678933587484842200">ਤੁਸੀਂ ਇਸ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਕਿਵੇਂ ਲਾਂਚ ਕਰਨਾ ਚਾਹੋਗੇ?</translation> @@ -8208,6 +8241,7 @@ <translation id="8910987510378294980">ਡੀਵਾਈਸ ਸੂਚੀ ਲੁਕਾਓ</translation> <translation id="8912362522468806198">Google ਖਾਤਾ</translation> <translation id="8912810933860534797">ਸਵੈਚਲਿਤ ਸਕੈਨ ਚਾਲੂ ਕਰੋ</translation> +<translation id="8915307125957890427">ਟੈਬ 'ਤੇ ਸੱਜਾ-ਕਲਿੱਕ ਕਰੋ ਅਤੇ "ਗਰੁੱਪ ਵਿੱਚ ਟੈਬ ਸ਼ਾਮਲ ਕਰੋ" ਚੁਣੋ ਅਤੇ ਫਿਰ "ਨਵਾਂ ਗਰੁੱਪ" ਚੁਣੋ</translation> <translation id="8915370057835397490">ਸੁਝਾਅ ਲੋਡ ਕਰ ਰਿਹਾ ਹੈ</translation> <translation id="8916476537757519021">ਗੁਮਨਾਮ ਸਬਫ੍ਰੇਮ: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> ਦਾ <ph name="DEVICE_TYPE" /></translation> @@ -8268,6 +8302,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" ਅਤੇ 1 ਹੋਰ ਟੈਬ}other{"<ph name="TAB_TITLE" />" ਅਤੇ # ਹੋਰ ਟੈਬਾਂ}}</translation> <translation id="8977811652087512276">ਗਲਤ ਪਾਸਵਰਡ ਜਾਂ ਖਰਾਬ ਫ਼ਾਈਲ</translation> <translation id="8978154919215542464">ਚਾਲੂ - ਸਭ ਕੁਝ ਸਿੰਕ ਕਰੋ</translation> +<translation id="8978670037548431647">ਟੈਦਰਿੰਗ ਸਮਰੱਥਾਵਾਂ ਨੂੰ ਰਿਫ੍ਰੈਸ਼ ਕਰੋ</translation> <translation id="897939795688207351"><ph name="ORIGIN" /> 'ਤੇ</translation> <translation id="8980345560318123814">ਵਿਚਾਰ ਰਿਪੋਰਟਾਂ</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> - ਕ੍ਰੈਸ਼ ਕੀਤਾ</translation> @@ -8281,6 +8316,7 @@ <translation id="8986362086234534611">ਭੁੱਲਣਾ</translation> <translation id="8986494364107987395">ਵਰਤੋਂ ਅੰਕੜੇ ਅਤੇ ਕਰੈਸ਼ ਰਿਪੋਰਟਾਂ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ Google ਨੂੰ ਭੇਜੋ</translation> <translation id="8987927404178983737">ਮਹੀਨਾ</translation> +<translation id="8989359959810288806">ਟੈਦਰਿੰਗ ਸਥਿਤੀ ਨੂੰ ਰਿਫ੍ਰੈਸ਼ ਕਰੋ</translation> <translation id="8991520179165052608">ਸਾਈਟ ਤੁਹਾਡੇ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੀ ਹੈ</translation> <translation id="899384117894244799">ਪ੍ਰਤਿਬੰਧਿਤ ਵਰਤੋਂਕਾਰ ਨੂੰ ਹਟਾਓ</translation> <translation id="899403249577094719">Netscape ਪ੍ਰਮਾਣ-ਪੱਤਰ ਬੇਸ URL</translation> @@ -8532,6 +8568,7 @@ <translation id="935854577147268200">'ਸਮਾਰਟ ਲਾਕ' ਵਾਲਾ ਫ਼ੋਨ ਬਦਲਿਆ। 'ਸਮਾਰਟ ਲਾਕ' ਨੂੰ ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਆਪਣਾ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ। ਅਗਲੀ ਵਾਰ, ਤੁਹਾਡਾ ਫ਼ੋਨ ਤੁਹਾਡੀ <ph name="DEVICE_TYPE" /> ਨੂੰ ਅਣਲਾਕ ਕਰੇਗਾ। ਤੁਸੀਂ ਸੈਟਿੰਗਾਂ ਵਿੱਚ 'ਸਮਾਰਟ ਲਾਕ' ਨੂੰ ਬੰਦ ਕਰ ਸਕਦੇ ਹੋ</translation> <translation id="936646668635477464">ਕੈਮਰਾ ਅਤੇ ਮਾਈਕ੍ਰੋਫ਼ੋਨ</translation> <translation id="936801553271523408">ਸਿਸਟਮ ਨਿਦਾਨ ਡਾਟਾ</translation> +<translation id="937053962468712792">ਕੀ <ph name="DEVICE" /> ਨੂੰ <ph name="PRIMARY_EMAIL" /> ਤੋਂ ਹਟਾਉਣਾ ਹੈ?</translation> <translation id="93766956588638423">ਐਕਸਟੈਂਸ਼ਨ ਰਿਪੇਅਰ ਕਰੋ</translation> <translation id="938568644810664664">“Ok Google, ਇਹ ਕਿਹੜਾ ਗੀਤ ਹੈ?” ਜਾਂ “Ok Google, ਮੇਰੀ ਸਕ੍ਰੀਨ 'ਤੇ ਕੀ ਹੈ?” ਬੋਲ ਕੇ ਦੇਖੋ</translation> <translation id="938623846785894166">ਅਸਧਾਰਨ ਫ਼ਾਈਲ</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index 891ee43..2f0a48e 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -893,6 +893,7 @@ <translation id="1829129547161959350">Pingwin</translation> <translation id="1829192082282182671">Po&mniejsz</translation> <translation id="1830550083491357902">Niezalogowany</translation> +<translation id="1831848493690504725">Nie możemy uzyskać dostępu do serwerów Google przez połączoną sieć. Wybierz inną sieć albo sprawdź ustawienia sieci lub serwera proxy (jeśli z niego korzystasz).</translation> <translation id="1832459821645506983">Tak, zgadzam się</translation> <translation id="1832511806131704864">Zmiana telefonu została zapisana</translation> <translation id="1832848789136765277">Aby zapewnić sobie stały dostęp do zsynchronizowanych danych, potwierdź swoją tożsamość</translation> @@ -4720,6 +4721,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> prosi o pozwolenie na:</translation> <translation id="5534304873398226603">Odrzuć zdjęcie lub film</translation> <translation id="5537725057119320332">Przesyłaj</translation> +<translation id="5539070192556911367">Brak połączenia z Google</translation> <translation id="5539221284352502426">Podane hasło zostało odrzucone przez serwer. Możliwe, że jest ono za krótkie, musi zawierać cyfry lub symbole albo musi się różnić od poprzednich haseł.</translation> <translation id="5541694225089836610">Administrator wyłączył to działanie</translation> <translation id="5542132724887566711">Profil</translation> @@ -4783,6 +4785,7 @@ <translation id="5585912436068747822">Formatowanie nie powiodło się</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Wczytuję aplikacje…</translation> +<translation id="5590418976913374224">Odtwarzaj dźwięk podczas uruchamiania urządzenia</translation> <translation id="5592595402373377407">Brak wystarczającej ilości danych.</translation> <translation id="5595307023264033512">Całkowita pamięć używana przez strony: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">Edytuj adres</translation> @@ -5005,7 +5008,7 @@ <translation id="5828545842856466741">Dodaj profil…</translation> <translation id="5828633471261496623">Trwa drukowanie...</translation> <translation id="5828797982387013521">Wybierz playbook</translation> -<translation id="5830205393314753525">Nie można otworzyć: <ph name="APP_NAME" /></translation> +<translation id="5830205393314753525">Nie można otworzyć aplikacji <ph name="APP_NAME" /></translation> <translation id="5830720307094128296">Zapisz stronę &jako...</translation> <translation id="5832813618714645810">Profile</translation> <translation id="583281660410589416">Nieznany</translation> @@ -6331,6 +6334,7 @@ <translation id="7102687220333134671">Automatyczne aktualizacje są włączone</translation> <translation id="7102832101143475489">Żądanie przekroczyło limit czasu</translation> <translation id="710640343305609397">Otwórz ustawienia sieci</translation> +<translation id="7107609441453408294">Odtwarzaj ten sam dźwięk na wszystkich głośnikach</translation> <translation id="7108338896283013870">Ukryj</translation> <translation id="7108668606237948702">wpisz</translation> <translation id="7108933416628942903">Zablokuj teraz</translation> @@ -6561,6 +6565,7 @@ <translation id="7364745943115323529">Przesyłaj...</translation> <translation id="7364796246159120393">Wybierz plik</translation> <translation id="7365076891350562061">Rozmiar interfejsu</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" /> – przypięto</translation> <translation id="7366316827772164604">Szukam urządzeń w pobliżu…</translation> <translation id="7366415735885268578">Dodawanie strony</translation> <translation id="7366909168761621528">Dane przeglądania</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 2ac664e2..e382b7a0 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -2210,6 +2210,7 @@ <translation id="3021065318976393105">Enquanto estiver na bateria</translation> <translation id="3021066826692793094">Borboleta</translation> <translation id="3021678814754966447">&Exibir código fonte do frame</translation> +<translation id="3022361196600037287">O dispositivo <ph name="DEVICE" /> vai ser removido deste Chromebook e não será salvo em <ph name="PRIMARY_EMAIL" />.</translation> <translation id="3022978424994383087">Não entendi.</translation> <translation id="3023464535986383522">Selecionar para ouvir</translation> <translation id="3024374909719388945">Usar relógio no formato 24 horas</translation> @@ -3750,6 +3751,7 @@ <translation id="4535127706710932914">Perfil padrão</translation> <translation id="4535767533210902251">O sensor de impressão digital fica no canto superior direito do teclado. Toque nele de leve com qualquer dedo.</translation> <translation id="4536140153723794651">Sites que podem usar cookies sempre</translation> +<translation id="4536769240747010177">Recursos de tethering:</translation> <translation id="4538417792467843292">Excluir palavra</translation> <translation id="4538792345715658285">Instalada pela política empresarial.</translation> <translation id="4541123282641193691">Não foi possível verificar sua conta. Tente novamente ou reinicie o Chromebook.</translation> @@ -3777,6 +3779,7 @@ <translation id="4561893854334016293">Não há permissões com mudanças recentes</translation> <translation id="4562155214028662640">Adicionar impressão digital</translation> <translation id="4563210852471260509">O idioma de entrada inicial é o chinês</translation> +<translation id="4563382028841851106">Remover da conta</translation> <translation id="4563880231729913339">Dedo 3</translation> <translation id="4564245002465020751">Termine a configuração no seu smartphone</translation> <translation id="4565377596337484307">Ocultar senha</translation> @@ -6198,6 +6201,10 @@ <translation id="6943939122536910181">Desconectado de <ph name="DEVICE" /></translation> <translation id="6945221475159498467">Selecionar</translation> <translation id="694592694773692225">Redirecionamento bloqueado nesta página.</translation> +<translation id="6947015141909171112">Você está recebendo receitas com base nas suas atividades de pesquisa recentes. + <ph name="BREAK" /> + <ph name="BREAK" /> + É possível gerenciar as configurações no menu do card ou ver mais opções em "Personalizar o Chrome".</translation> <translation id="6949434160682548041">Senha (opcional)</translation> <translation id="6950627417367801484">Restaurar apps</translation> <translation id="6952242901357037157">Você também pode mostrar as senhas da sua <ph name="BEGIN_LINK" />Conta do Google<ph name="END_LINK" /> aqui</translation> @@ -6993,6 +7000,7 @@ <translation id="7737115349420013392">Pareando com "<ph name="DEVICE_NAME" />"…</translation> <translation id="7737846262459425222">Você pode mudar essa opção a qualquer momento em Configurações > Google Assistente > Contexto da tela.</translation> <translation id="7737948071472253612">Bloquear o uso da câmera</translation> +<translation id="77381465218432215">Mostrar acentos e caracteres especiais</translation> <translation id="7740996059027112821">Padrão</translation> <translation id="7741307896921365578">Ativa um painel lateral no navegador para oferecer acesso útil e consistente à Lista de leitura e aos favoritos.</translation> <translation id="7742558784808143689">Remover dados do site e permissões para <ph name="SITE_NAME" />, todos os sites relacionados e apps instalados?</translation> @@ -7783,6 +7791,7 @@ <translation id="8486666913807228950">Motivo: a regra invertida <ph name="REVERT_RULE" /> foi encontrada na lista "Forçar a abertura em"</translation> <translation id="848666842773560761">Um app está tentando acessar a câmera. Desative a chave de privacidade da câmera para permitir o acesso.</translation> <translation id="8487678622945914333">Aproximar</translation> +<translation id="8487699605742506766">Ponto de acesso</translation> <translation id="8489156414266187072">As sugestões personalizadas são exibidas apenas na sua conta</translation> <translation id="8490896350101740396">Os aplicativos de quiosque "<ph name="UPDATED_APPS" />" a seguir foram atualizados. Reinicie o dispositivo para concluir o processo de atualização.</translation> <translation id="8492685019009920170">Toque no sensor de impressão digital com o dedo. Seus dados são armazenados de forma segura e nunca saem do <ph name="DEVICE_TYPE" />.</translation> @@ -8277,6 +8286,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" e mais 1 guia}one{"<ph name="TAB_TITLE" />" e mais # guia}other{"<ph name="TAB_TITLE" />" e mais # guias}}</translation> <translation id="8977811652087512276">Senha incorreta ou arquivo corrompido</translation> <translation id="8978154919215542464">Ativado - sincronizar tudo</translation> +<translation id="8978670037548431647">Atualizar recursos de tethering</translation> <translation id="897939795688207351">Em <ph name="ORIGIN" /></translation> <translation id="8980345560318123814">Relatórios de feedback</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> - Falhou</translation> @@ -8541,6 +8551,7 @@ <translation id="935854577147268200">O smartphone do Smart Lock mudou. Digite sua senha para atualizar o Smart Lock. Na próxima vez, o smartphone desbloqueará seu <ph name="DEVICE_TYPE" />. É possível desativar o Smart Lock nas configurações</translation> <translation id="936646668635477464">Câmera e microfone</translation> <translation id="936801553271523408">Dados de diagnóstico do sistema</translation> +<translation id="937053962468712792">O dispositivo <ph name="DEVICE" /> foi removido de <ph name="PRIMARY_EMAIL" />?</translation> <translation id="93766956588638423">Reparar extensão</translation> <translation id="938568644810664664">Tente perguntar "Ok Google, que música é essa?" ou "Ok Google, o que está na minha tela?"</translation> <translation id="938623846785894166">Arquivo incomum</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index 7596c7e..1ae16eaa 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Utilizar o seu microfone e a câmara</translation> <translation id="1005333234656240382">Ativar a depuração do adb?</translation> <translation id="1006873397406093306">Esta extensão pode ler e alterar os seus dados em sites. É possível controlar os sites aos quais a extensão pode aceder.</translation> +<translation id="1007057452468855774">Ativar Google Play Store</translation> <translation id="1008186147501209563">Exportar marcadores</translation> <translation id="1008557486741366299">Agora não</translation> <translation id="1009476156254802388">Localização do <ph name="WEB_DRIVE" /></translation> <translation id="1009663062402466586">Controlos de jogos já disponíveis</translation> <translation id="1010498023906173788">Este separador está associado a uma porta de série.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Página sem resposta}other{Páginas sem resposta}}</translation> +<translation id="1011003645819296594">Dispositivos guardados</translation> <translation id="1011355516189274711">Volume da conversão de texto em voz</translation> <translation id="1012794136286421601">Os seus ficheiros de Docs, Folhas, Slides e Desenhos estão a ser sincronizados. Abra a app Google Drive para aceder aos ficheiros online ou offline.</translation> <translation id="1012876632442809908">Dispositivo USB-C (porta frontal)</translation> @@ -491,6 +493,7 @@ <translation id="1470350905258700113">Utilizar este dispositivo</translation> <translation id="1470946456740188591">Para ativar ou desativar a navegação por cursor, utilize o atalho Ctrl + Pesquisa + 7.</translation> <translation id="1472675084647422956">Mostrar mais</translation> +<translation id="1473223074251193484">Definir configuração da ligação (à Internet) via telemóvel</translation> <translation id="1474785664565228650">A alteração na definição do microfone requer que o Parallels Desktop seja reiniciado. Reinicie o Parallels Desktop para continuar.</translation> <translation id="1474893630593443211">Mais controlo sobre os anúncios que vê</translation> <translation id="1475502736924165259">Tem certificados em arquivo que não encaixam em nenhuma das restantes categorias</translation> @@ -1113,6 +1116,7 @@ <translation id="2044014337866019681">Certifique-se de que está a validar a conta <ph name="ACCOUNT" /> para desbloquear a sessão.</translation> <translation id="204497730941176055">Nome do modelo de certificado Microsoft</translation> <translation id="2045117674524495717">Ajuda dos atalhos de teclado</translation> +<translation id="2045211794962848221">Não vai voltar a ver esta mensagem específica</translation> <translation id="2045969484888636535">Continuar a bloquear cookies</translation> <translation id="204622017488417136">O dispositivo regressa à versão do Chrome instalada anteriormente. Todos os dados locais e as contas de utilizador são removidos. Não é possível anular esta ação.</translation> <translation id="2046702855113914483">Ramen</translation> @@ -3799,6 +3803,7 @@ <translation id="4594577641390224176">Está à procura da página Acerca do sistema? Visite</translation> <translation id="4595560905247879544">Apenas o gestor (<ph name="CUSTODIAN_NAME" />) pode modificar as aplicações e as extensões.</translation> <translation id="4596295440756783523">Tem certificados em arquivo que identificam estes servidores</translation> +<translation id="4598345735110653698">Gerir chaves de acesso</translation> <translation id="4598556348158889687">Gestão de armazenamento</translation> <translation id="4598776695426288251">Wi-Fi disponível através de vários dispositivos</translation> <translation id="4601426376352205922">Marcar como não lido</translation> @@ -4024,6 +4029,7 @@ <translation id="4823894915586516138">Este PIN ou palavra-passe protege os seus dados neste dispositivo <ph name="DEVICE_TYPE" />, incluindo as informações a que acede a partir do telemóvel</translation> <translation id="4824037980212326045">Cópia de segurança e restauro do Linux</translation> <translation id="4824958205181053313">Pretende cancelar a sincronização?</translation> +<translation id="4825532258163983651">Não é possível eliminar a chave de acesso</translation> <translation id="4827675678516992122">Não foi possível ligar</translation> <translation id="4827784381479890589">Verificação ortográfica melhorada no navegador Chrome (o texto é enviado à Google para sugestões ortográficas)</translation> <translation id="4827904420700932487">Criar código QR para esta imagem</translation> @@ -4286,6 +4292,7 @@ <translation id="5087249366037322692">Adicionada por terceiros</translation> <translation id="5087580092889165836">Adicionar cartão</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 Com encriptação RSA</translation> +<translation id="5089763948477033443">Indicador de redimensionamento do painel lateral</translation> <translation id="5090637338841444533">Sem autorização para monitorizar a posição da câmara</translation> <translation id="5093569275467863761">Subframe de Navegação anónima na cache para a frente/para trás: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">Pode abrir e editar ficheiros suportados com esta app a partir da app Files ou outras apps. Para controlar que ficheiros abrem esta app por predefinição, <ph name="BEGIN_LINK" />saiba como definir apps predefinidas no dispositivo<ph name="END_LINK" />.</translation> @@ -4451,6 +4458,7 @@ <translation id="5258992782919386492">Instalar neste dispositivo</translation> <translation id="5260334392110301220">Aspas inteligentes</translation> <translation id="5260508466980570042">Lamentamos, mas não foi possível confirmar o seu email ou palavra-passe. Tente novamente.</translation> +<translation id="5260958083445173099">Os Websites vão apresentar conteúdos nos seus idiomas favoritos, quando tal for possível</translation> <translation id="5261683757250193089">Abrir na Web Store</translation> <translation id="5262178194499261222">Remover palavra-passe</translation> <translation id="5262784498883614021">Ligar automaticamente à rede</translation> @@ -4491,6 +4499,7 @@ <translation id="5294097441441645251">Tem de começar com um caráter minúsculo ou um sublinhado.</translation> <translation id="5294618183559481278">O dispositivo <ph name="DEVICE_TYPE" /> utiliza um sensor incorporado para detetar pessoas à frente do dispositivo. Todos os dados são processados imediatamente no seu dispositivo e, de seguida, eliminados. Os dados de sensores nunca são enviados para a Google. <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Obtenha feedback de voz para poder usar o dispositivo sem olhar para o ecrã. O feedback em braille está disponível com um dispositivo ligado.</translation> +<translation id="5297005732522718715">Atualizar configuração da ligação (à Internet) via telemóvel</translation> <translation id="5297082477358294722">Palavra-passe guardada. Veja e faça a gestão das palavras-passe guardadas em <ph name="SAVED_PASSWORDS_STORE" />.</translation> <translation id="5297946558563358707">Quando alguém olhar para o ecrã, mostrar o ícone de olho de privacidade na parte inferior direita do ecrã</translation> <translation id="5298219193514155779">Tema criado por</translation> @@ -4661,11 +4670,13 @@ <translation id="5466374726908360271">Co&lar e pesquisar "<ph name="SEARCH_TERMS" />"</translation> <translation id="5467207440419968613">Bloqueou <ph name="PERMISSION_1" /> e <ph name="PERMISSION_2" /></translation> <translation id="5468173180030470402">À procura de partilhas de ficheiros…</translation> +<translation id="5468330507528805311">Estado da ligação (à Internet) via telemóvel:</translation> <translation id="5468881191994555667">Escolher ficheiro</translation> <translation id="5469852975082458401">Pode navegar pelas páginas com um cursor de texto. Prima F7 para desativar esta opção.</translation> <translation id="5470735824776589490">É necessário reiniciar antes de ser possível repor o dispositivo com o Powerwash. <ph name="LINK_BEGIN" />Saber mais<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Olá! Sou a sua voz para a conversão de texto em voz.</translation> <translation id="5472627187093107397">Guardar palavras-passe para este site</translation> +<translation id="5473062644742711742">Encontre mais ferramentas de acessibilidade na Web Store do Chrome</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">Ao continuar, aceita que este dispositivo também pode transferir e instalar automaticamente atualizações e apps da Google, do operador da criança e do fabricante deste dispositivo, possivelmente através de dados móveis. Algumas destas apps podem oferecer compras na app.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{O PIN tem de ter, pelo menos, um caráter.}other{O PIN tem de ter, pelo menos, # carateres.}}</translation> @@ -4938,6 +4949,7 @@ <translation id="5734362860645681824">Comunicações</translation> <translation id="5734697361979786483">Adicionar partilha de ficheiros</translation> <translation id="5736796278325406685">Introduza um nome de utilizador válido</translation> +<translation id="5738093759615225354">Precisa desta chave de acesso para iniciar sessão no seu computador</translation> <translation id="5739017626473506901">Inicie sessão para ajudar <ph name="USER_NAME" /> a adicionar uma conta escolar.</translation> <translation id="5739235828260127894">A aguardar a validação. <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Muito grande</translation> @@ -5099,6 +5111,7 @@ <translation id="589541317545606110">Pesquisar página com o <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">Não permitir</translation> <translation id="5900186025777217044">O Smart Lock mudou</translation> +<translation id="5900243355162006650">Configuração da ligação (à Internet) via telemóvel:</translation> <translation id="5900302528761731119">Fotografia do Perfil do Google</translation> <translation id="590036993063074298">Detalhes da qualidade do espelhamento</translation> <translation id="5901069264981746702">Os seus dados de impressões digitais são armazenados em segurança e nunca saem do <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation> @@ -5402,6 +5415,7 @@ <translation id="6196640612572343990">Bloquear cookies de terceiros</translation> <translation id="6196854373336333322">A extensão "<ph name="EXTENSION_NAME" />" apoderou-se das suas definições de proxy, o que significa que pode alterar, interromper ou intercetar qualquer coisa que esteja a fazer online. Se não tem a certeza do motivo pelo qual aconteceu esta alteração, é provável que não a queira.</translation> <translation id="6197128521826316819">Criar código QR para esta página</translation> +<translation id="6197223946499512637">Estas chaves de acesso são armazenadas no Windows Hello neste computador. Não são guardadas na sua Conta Google.</translation> <translation id="6198252989419008588">Alterar PIN</translation> <translation id="6200047250927636406">Rejeitar ficheiro</translation> <translation id="6200151268994853226">Gerir extensão</translation> @@ -5699,6 +5713,7 @@ <translation id="6482559668224714696">Lupa de ecrã inteiro</translation> <translation id="6483485061007832714">Abrir transferência</translation> <translation id="6483805311199035658">A abrir <ph name="FILE" />...</translation> +<translation id="6486301003991593638">Para gerir as chaves de acesso, use uma versão mais recente do Windows</translation> <translation id="6488384360522318064">Selecionar idioma</translation> <translation id="648927581764831596">Nenhum disponível</translation> <translation id="6490471652906364588">Dispositivo USB-C (porta direita)</translation> @@ -6285,6 +6300,7 @@ <translation id="7029307918966275733">O Crostini não está instalado. Instale o Crostini para ver os créditos.</translation> <translation id="7029809446516969842">Palavras-passe</translation> <translation id="7030304022046916278">Envia URLs para a Navegação segura para os verificar</translation> +<translation id="7030695672997239647">Clique com o botão direito do rato num separador, selecione "Adicionar separador a grupo" e, em seguida, "Novo grupo"</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - porta de série associada</translation> <translation id="7033616203784997570">A entrada tem de ter, no máximo, 62 carateres</translation> <translation id="7034692021407794547">Um administrador com os privilégios Gestão de faturação tem primeiro de aceitar os Termos de Utilização do hardware Google Meet na secção hardware Google Meet da consola do administrador.</translation> @@ -7387,6 +7403,7 @@ <translation id="8101987792947961127">Powerwash necessário no próximo reinício</translation> <translation id="81020759409809034">Localização local</translation> <translation id="8102139037507939978">Elimine informações de identificação pessoal do ficheiro system_logs.txt.</translation> +<translation id="810362914482827094">Pesquisar chaves de acesso</translation> <translation id="8104088837833760645">Transferir perfil do eSIM</translation> <translation id="8105368624971345109">Desativar</translation> <translation id="8107015733319732394">A instalar a Google Play Store no <ph name="DEVICE_TYPE" />… Esta ação pode demorar alguns minutos.</translation> @@ -7834,6 +7851,7 @@ <translation id="8557022314818157177">Continue a tocar na chave de segurança até que a sua impressão digital seja capturada.</translation> <translation id="8557180006508471423">Ative o "Google Chrome" nos Serviços de localização do seu Mac</translation> <translation id="8557856025359704738">A próxima transferência é a <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">Chaves de acesso</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Abrir todos numa &nova janela}=1{Abrir numa &nova Janela}other{Abrir todos ({COUNT}) numa &nova janela}}</translation> <translation id="8561206103590473338">Elefante</translation> <translation id="8561565784790166472">Continue com cuidado</translation> @@ -7960,6 +7978,7 @@ <translation id="8677212948402625567">Reduzir tudo...</translation> <translation id="867767487203716855">Próxima atualização</translation> <translation id="8677859815076891398">Não existem álbuns. Crie um álbum no <ph name="LINK_BEGIN" />Google Fotos<ph name="LINK_END" />.</translation> +<translation id="8678378565142776698">Reiniciar e obter atualizações automáticas</translation> <translation id="8678538439778360739">Os dados foram encriptados com a sua frase de acesso de sincronização a <ph name="TIME" />. Não estão incluídos métodos de pagamento e endereços do Google Pay.</translation> <translation id="8678582529642151449">Os separadores não são reduzidos</translation> <translation id="8678933587484842200">Como pretende que esta aplicação seja iniciada?</translation> @@ -8206,6 +8225,7 @@ <translation id="8910987510378294980">Ocultar lista de dispositivos</translation> <translation id="8912362522468806198">Conta Google</translation> <translation id="8912810933860534797">Ativar análise automática</translation> +<translation id="8915307125957890427">Clique com o botão direito do rato num separador, selecione "Adicionar separador a grupo" e, em seguida, "Novo grupo"</translation> <translation id="8915370057835397490">A carregar sugestão</translation> <translation id="8916476537757519021">Subestrutura da navegação anónima: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> de <ph name="GIVEN_NAME" /></translation> @@ -8280,6 +8300,7 @@ <translation id="8986362086234534611">Esquecer</translation> <translation id="8986494364107987395">Enviar automaticamente estatísticas de utilização e relatórios de falhas para a Google</translation> <translation id="8987927404178983737">Mês</translation> +<translation id="8989359959810288806">Atualizar estado da ligação (à Internet) via telemóvel</translation> <translation id="8991520179165052608">O site pode utilizar o microfone.</translation> <translation id="899384117894244799">Remover utilizador restrito</translation> <translation id="899403249577094719">URL base do certificado Netscape</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 7957ba6..c7ad40fb 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -2317,7 +2317,7 @@ <translation id="3151539355209957474">Ora de începere</translation> <translation id="3151562827395986343">Șterge istoricul, cookie-urile, memoria cache și altele</translation> <translation id="3151786313568798007">Orientare</translation> -<translation id="3152356229013609796">Afișează notificările telefonului, respinge-le și răspunde la ele</translation> +<translation id="3152356229013609796">Afișează notificările telefonului, le respinge și răspunde la ele</translation> <translation id="3157387275655328056">Adaugă în lista de lectură</translation> <translation id="3157931365184549694">Restabilește</translation> <translation id="3158033540161634471">Adaugă amprenta</translation> @@ -6447,7 +6447,7 @@ <translation id="7227458944009118910">Și aplicațiile enumerate mai jos pot gestiona linkuri de protocol. Alte aplicații vor solicita permisiunea.</translation> <translation id="7228523857728654909">Blocarea ecranului și conectarea</translation> <translation id="7230222852462421043">&Restabilește fereastra</translation> -<translation id="7231260028442989757">Afișează notificările telefonului, respinge-le și răspunde la ele</translation> +<translation id="7231260028442989757">Afișează notificările telefonului, le respinge și răspunde la ele</translation> <translation id="7232750842195536390">Redenumirea nu a reușit</translation> <translation id="723343421145275488">Caută imagini cu <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="7234010996000898150">Se anulează restabilirea Linux</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index f815952..1e4306f 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -134,7 +134,7 @@ <translation id="1126809382673880764">Не защищает вас от сайтов, расширений и скачанных файлов, которые могут представлять опасность. Безопасный просмотр по-прежнему будет работать в других сервисах Google, например в Gmail и Поиске.</translation> <translation id="1128090040635299943">Выполняется настройка Linux. Это займет несколько минут.</translation> <translation id="1128591060186966949">Изменить поисковую систему</translation> -<translation id="1129420403709586868">Просмотр фотографий и медиафайлов с телефона</translation> +<translation id="1129420403709586868">Смотреть фотографии и медиафайлы с телефона</translation> <translation id="1129850422003387628">Управление приложениями</translation> <translation id="113050636487300043">Укажите имя и установите цветовую тему, чтобы отличать свой профиль от других.</translation> <translation id="1130589222747246278">"<ph name="WINDOW_TITLE" />" – элемент группы "<ph name="GROUP_NAME" />"</translation> @@ -2318,7 +2318,7 @@ <translation id="3151539355209957474">Время начала</translation> <translation id="3151562827395986343">Удалить файлы cookie и данные сайтов, очистить историю и кеш</translation> <translation id="3151786313568798007">Ориентация</translation> -<translation id="3152356229013609796">Просматривайте и скрывайте уведомления с телефона, а также отвечайте на них.</translation> +<translation id="3152356229013609796">Просматривать и скрывать уведомления с телефона, а также отвечать на них</translation> <translation id="3157387275655328056">Добавить в список для чтения</translation> <translation id="3157931365184549694">Восстановить</translation> <translation id="3158033540161634471">Добавьте отпечаток пальца</translation> @@ -2772,7 +2772,7 @@ <translation id="3616741288025931835">Очистить данные просмотров...</translation> <translation id="3617891479562106823">Фоновые изображения недоступны. Повторите попытку позже.</translation> <translation id="3619115746895587757">Капучино</translation> -<translation id="3619962278978697442">Выбирайте один из способов при каждом входе.</translation> +<translation id="3619962278978697442">Выбирайте способ входа при каждой разблокировке устройства.</translation> <translation id="3621807901162200696">Помогать повышать производительность и улучшать функции Chrome OS</translation> <translation id="362266093274784978">{COUNT,plural, =1{приложение}one{# приложение}few{# приложения}many{# приложений}other{# приложения}}</translation> <translation id="362333465072914957">Ожидание выдачи сертификата центром сертификации</translation> @@ -3508,7 +3508,7 @@ <translation id="431076611119798497">&Подробнее</translation> <translation id="4312701113286993760">{COUNT,plural, =1{1 аккаунт Google}one{<ph name="EXTRA_ACCOUNTS" /> аккаунт Google}few{<ph name="EXTRA_ACCOUNTS" /> аккаунта Google}many{<ph name="EXTRA_ACCOUNTS" /> аккаунтов Google}other{<ph name="EXTRA_ACCOUNTS" /> аккаунта Google}}</translation> <translation id="4312866146174492540">Блокировать (по умолчанию)</translation> -<translation id="4314497418046265427">Работайте эффективнее, подключив телефон к устройству "<ph name="DEVICE_TYPE" />"</translation> +<translation id="4314497418046265427">Работайте эффективнее, подключив телефон к устройству <ph name="DEVICE_TYPE" /></translation> <translation id="4314815835985389558">Настройки синхронизации</translation> <translation id="4315933848520197627">Отменить связь</translation> <translation id="4316850752623536204">Сайт разработчика</translation> @@ -3761,7 +3761,7 @@ <translation id="4562155214028662640">Добавить отпечаток пальца</translation> <translation id="4563210852471260509">Первоначальный язык ввода – китайский</translation> <translation id="4563880231729913339">3-й палец</translation> -<translation id="4564245002465020751">Завершите настройку телефона</translation> +<translation id="4564245002465020751">Завершите настройку на телефоне</translation> <translation id="4565377596337484307">Скрыть пароль</translation> <translation id="4565917129334815774">Сохранить системные журналы</translation> <translation id="4566170377336116390">Чтобы сменить режим после регистрации, необходимо сбросить устройство до заводских настроек (Powerwash).</translation> @@ -4018,7 +4018,7 @@ <translation id="4820236583224459650">Выбрать в качестве активного билета</translation> <translation id="4821935166599369261">&Сбор данных включен</translation> <translation id="4823484602432206655">Просмотр и изменение настроек для пользователей и устройств</translation> -<translation id="4823894915586516138">Этот PIN-код или пароль будет защищать ваши данные на текущем устройстве <ph name="DEVICE_TYPE" />, в том числе сведения, к которым вы получаете доступ с телефона.</translation> +<translation id="4823894915586516138">Этот PIN-код или пароль будут защищать ваши данные на текущем устройстве <ph name="DEVICE_TYPE" />, в том числе информацию, получаемую с телефона.</translation> <translation id="4824037980212326045">Резервное копирование и восстановление Linux</translation> <translation id="4824958205181053313">Отключить синхронизацию?</translation> <translation id="4827675678516992122">Ошибка подключения</translation> @@ -5676,7 +5676,7 @@ <translation id="6466258437571594570">Сайтам запрещено прерывать вашу работу запросами на показ уведомлений</translation> <translation id="6466988389784393586">&Открыть все закладки</translation> <translation id="6467304607960172345">Оптимизация полноэкранного видео</translation> -<translation id="6467377768028664108">На устройстве "<ph name="DEVICE_TYPE" />" теперь доступно:</translation> +<translation id="6467377768028664108">Теперь на устройстве <ph name="DEVICE_TYPE" /> вы можете:</translation> <translation id="6468485451923838994">Шрифты</translation> <translation id="6468773105221177474">Файлов: <ph name="FILE_COUNT" /></translation> <translation id="6469557521904094793">Включить мобильную сеть</translation> @@ -6049,7 +6049,7 @@ <translation id="6815376457351236663">Все равно открыть</translation> <translation id="6817174620439930047">Уведомлять меня о сайтах, пытающихся использовать системные сообщения для доступа к MIDI-устройствам (рекомендуется)</translation> <translation id="6818198425579322765">Исходный язык страницы</translation> -<translation id="6818547713623251698">Просмотр фотографий, медиафайлов, уведомлений и приложений с телефона</translation> +<translation id="6818547713623251698">Просматривайте фотографии, медиафайлы, уведомления и приложения с телефона</translation> <translation id="6818802132960437751">Встроенная защита от вирусов</translation> <translation id="6818920801736417483">Сохранить пароли?</translation> <translation id="6823174134746916417">Нажатие от прикосновения к сенсорной панели</translation> @@ -7302,7 +7302,7 @@ <translation id="8037357227543935929">Спрашивать (по умолчанию)</translation> <translation id="803771048473350947">Файл</translation> <translation id="8041089156583427627">Отправить отзыв</translation> -<translation id="8041267120753677077">Трансляция приложений с телефона</translation> +<translation id="8041267120753677077">Транслировать приложения с телефона</translation> <translation id="8042142357103597104">Прозрачность текста</translation> <translation id="8042331986490021244">Ваши пароли шифруются на устройстве и только потом сохраняются в Диспетчере паролей Google.</translation> <translation id="8044262338717486897"><ph name="LINUX_APP_NAME" /> не отвечает</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index 6a60bd6..6433f717 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -2196,6 +2196,7 @@ <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="3022361196600037287">Zariadenie <ph name="DEVICE" /> bude z tohto Chromebooku odstránené a do účtu <ph name="PRIMARY_EMAIL" /> sa neuloží.</translation> <translation id="3022978424994383087">Nebolo rozumieť.</translation> <translation id="3023464535986383522">Počúvanie vybraného textu</translation> <translation id="3024374909719388945">Použiť 24-hodinový režim hodín</translation> @@ -3734,6 +3735,7 @@ <translation id="4535127706710932914">Predvolený profil</translation> <translation id="4535767533210902251">Senzor odtlačkov prstov je pravý horný kláves na klávesnici. Zľahka sa ho dotknite ľubovoľným prstom.</translation> <translation id="4536140153723794651">Weby, ktoré môžu vždy používať súbory cookie</translation> +<translation id="4536769240747010177">Možnosti zdieľania dátového pripojenia:</translation> <translation id="4538417792467843292">Odstrániť slovo</translation> <translation id="4538792345715658285">Nainštalované na základe podnikových pravidiel.</translation> <translation id="4541123282641193691">Účet sa nepodarilo overiť. Skúste to neskôr alebo reštartujte Chromebook.</translation> @@ -3761,6 +3763,7 @@ <translation id="4561893854334016293">Žiadne nedávno zmenené povolenia</translation> <translation id="4562155214028662640">Pridať odtlačok</translation> <translation id="4563210852471260509">Úvodný jazyk vstupu: čínština</translation> +<translation id="4563382028841851106">Odstrániť z účtu</translation> <translation id="4563880231729913339">3. prst</translation> <translation id="4564245002465020751">Dokončenie nastavovania v telefóne</translation> <translation id="4565377596337484307">Skryť heslo</translation> @@ -6183,6 +6186,10 @@ <translation id="6943939122536910181">Odpojené od siete <ph name="DEVICE" /></translation> <translation id="6945221475159498467">Vybrať</translation> <translation id="694592694773692225">Presmerovanie bolo zablokované na tejto stránke.</translation> +<translation id="6947015141909171112">Zobrazujú sa recepty na základe vašej nedávnej aktivity vyhľadávania receptov. + <ph name="BREAK" /> + <ph name="BREAK" /> + Môžete spravovať nastavenia v ponuke karty alebo si zobraziť ďalšie možnosti v sekcii Prispôsobenie Chromu.</translation> <translation id="6949434160682548041">Heslo (nepovinné)</translation> <translation id="6950627417367801484">Obnoviť aplikácie</translation> <translation id="6952242901357037157">Môžete si tu zobraziť aj heslá zo svojho <ph name="BEGIN_LINK" />účtu Google<ph name="END_LINK" /></translation> @@ -6978,6 +6985,7 @@ <translation id="7737115349420013392">Páruje sa so zariadením <ph name="DEVICE_NAME" />...</translation> <translation id="7737846262459425222">Túto možnosť môžete kedykoľvek zmeniť v sekcii Nastavenia > Asistent Google > Kontext obrazovky.</translation> <translation id="7737948071472253612">Nemôže používať vašu kameru</translation> +<translation id="77381465218432215">Zobrazovať diakritické znamienka a špeciálne znaky</translation> <translation id="7740996059027112821">Štandardne</translation> <translation id="7741307896921365578">Povolí bočný panel na úrovni prehliadača zaisťujúci užitočný a trvalý spôsob prístupu k čitateľskému zoznamu a záložkám.</translation> <translation id="7742558784808143689">Chcete vymazať dáta a povolenia webu <ph name="SITE_NAME" />, všetky jeho podriadené weby a nainštalované aplikácie?</translation> @@ -7767,6 +7775,7 @@ <translation id="8486666913807228950">Dôvod: V zozname „Vynútiť otvorenie v prehliadači“ bolo nájdené invertované pravidlo <ph name="REVERT_RULE" />.</translation> <translation id="848666842773560761">K fotoaparátu sa snaží získať prístup určitá aplikácia. Ak chcete prístup povoliť, vypnite prepínač ochrany súkromia fotoaparátu.</translation> <translation id="8487678622945914333">Priblížiť</translation> +<translation id="8487699605742506766">Hotspot</translation> <translation id="8489156414266187072">Osobné návrhy sa zobrazujú iba vo vašom účte</translation> <translation id="8490896350101740396">Aplikácie Kiosku (<ph name="UPDATED_APPS" />) boli aktualizované. Reštartujte zariadenie a dokončite tak proces aktualizácie.</translation> <translation id="8492685019009920170">Klepnite na senzor odtlačkov prstov. Vaše údaje sú uložené bezpečne a nikdy sa nedostanú mimo zariadenia <ph name="DEVICE_TYPE" />.</translation> @@ -8262,6 +8271,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{„<ph name="TAB_TITLE" />“}=1{„<ph name="TAB_TITLE" />“ a jedna ďalšia karta}few{„<ph name="TAB_TITLE" />“ a # ďalšie karty}many{"<ph name="TAB_TITLE" />" and # other tabs}other{„<ph name="TAB_TITLE" />“ a # ďalších kariet}}</translation> <translation id="8977811652087512276">Nesprávne heslo alebo poškodený súbor</translation> <translation id="8978154919215542464">Zapnuté – synchronizovať všetko</translation> +<translation id="8978670037548431647">Obnoviť možnosti zdieľania dátového pripojenia</translation> <translation id="897939795688207351">Na <ph name="ORIGIN" /></translation> <translation id="8980345560318123814">Hlásenia spätnej väzby</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> – Zlyhanie</translation> @@ -8526,6 +8536,7 @@ <translation id="935854577147268200">Zmenil sa telefón spojený s funkciou Smart Lock. Ak chcete Smart Lock aktualizovať, zadajte heslo. Zariadenie <ph name="DEVICE_TYPE" /> nabudúce odomknete telefónom. Smart Lock vypnete v Nastaveniach.</translation> <translation id="936646668635477464">Kamera a mikrofón</translation> <translation id="936801553271523408">Údaje o diagnostike systému</translation> +<translation id="937053962468712792">Chcete z účtu <ph name="PRIMARY_EMAIL" /> zariadenie <ph name="DEVICE" /> odstrániť?</translation> <translation id="93766956588638423">Opraviť rozšírenie</translation> <translation id="938568644810664664">Vyskúšajte „Hey Google, what song is this?“ (Hey Google, aká je toto skladba?) alebo „Hey Google, what's on my screen?“ (Hey Google, čo je na mojej obrazovke?)</translation> <translation id="938623846785894166">Nezvyčajný súbor</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index de8a507..2ae3ff8 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -909,6 +909,7 @@ <translation id="1829129547161959350">Pingvin</translation> <translation id="1829192082282182671">Poma&njšaj</translation> <translation id="1830550083491357902">Niste prijavljeni</translation> +<translation id="1831848493690504725">Googla ni mogoče doseči prek povezanega omrežja. Izberite drugo omrežje ali preverite omrežne nastavitve ali nastavitve strežnika proxy (če ga uporabljate).</translation> <translation id="1832459821645506983">Da, sem za</translation> <translation id="1832511806131704864">Sprememba telefona posodobljena</translation> <translation id="1832848789136765277">Če želite poskrbeti, da boste vedno lahko dostopali do sinhroniziranih podatkov, potrdite, da ste to vi.</translation> @@ -2211,6 +2212,7 @@ <translation id="3021065318976393105">Med napajanjem iz baterije</translation> <translation id="3021066826692793094">Metulj</translation> <translation id="3021678814754966447">&Prikaz izvorne kode okvirja</translation> +<translation id="3022361196600037287">Naprava <ph name="DEVICE" /> bo odstranjena iz tega Chromebooka in ne bo shranjena v račun <ph name="PRIMARY_EMAIL" />.</translation> <translation id="3022978424994383087">Ni bilo razumljivo.</translation> <translation id="3023464535986383522">Izberite in poslušajte</translation> <translation id="3024374909719388945">Uporabi 24-urno obliko ure</translation> @@ -3750,6 +3752,7 @@ <translation id="4535127706710932914">Privzeti profil</translation> <translation id="4535767533210902251">Tipalo prstnih odtisov je tipka v zgornjem desnem kotu tipkovnice. Rahlo se ga dotaknite s poljubnim prstom.</translation> <translation id="4536140153723794651">Spletna mesta, ki lahko vedno uporabijo piškotke</translation> +<translation id="4536769240747010177">Možnosti za povezavo računalnika z internetom prek mobilnega telefona:</translation> <translation id="4538417792467843292">Izbriše besedo</translation> <translation id="4538792345715658285">Nameščeno s pravilnikom podjetja.</translation> <translation id="4541123282641193691">Računa ni bilo mogoče preveriti. Poskusite znova ali znova zaženite Chromebook.</translation> @@ -3777,6 +3780,7 @@ <translation id="4561893854334016293">Ni nedavno spremenjenih dovoljenj</translation> <translation id="4562155214028662640">Dodaj prstni odtis</translation> <translation id="4563210852471260509">Prvotni jezik vnosa je kitajščina</translation> +<translation id="4563382028841851106">Odstrani iz računa</translation> <translation id="4563880231729913339">Prst 3</translation> <translation id="4564245002465020751">Dokončajte nastavitev v telefonu</translation> <translation id="4565377596337484307">Skrij geslo</translation> @@ -4753,6 +4757,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> želi</translation> <translation id="5534304873398226603">Zavrzi fotografijo ali videoposnetek</translation> <translation id="5537725057119320332">Predvajanje</translation> +<translation id="5539070192556911367">Googla ni mogoče doseči</translation> <translation id="5539221284352502426">Vneseno geslo je zavrnil strežnik. Možni razlogi za to so: Geslo je prekratko. Geslo mora vsebovati številke ali simbole. Geslo se mora razlikovati od prejšnjih gesel.</translation> <translation id="5541694225089836610">Dejanje je onemogočil skrbnik</translation> <translation id="5542132724887566711">Profil</translation> @@ -4817,6 +4822,7 @@ <translation id="5585912436068747822">Formatiranje ni uspelo</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Nalaganje aplikacij ...</translation> +<translation id="5590418976913374224">Predvajaj zvok ob zagonu naprave</translation> <translation id="5592595402373377407">Na voljo še ni dovolj podatkov.</translation> <translation id="5595307023264033512">Skupna shramba, ki jo uporabljajo spletna mesta: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">Uredi naslov</translation> @@ -6201,6 +6207,10 @@ <translation id="6943939122536910181">Povezava z napravo <ph name="DEVICE" /> je prekinjena.</translation> <translation id="6945221475159498467">Izberi</translation> <translation id="694592694773692225">Preusmeritev je na tej strani blokirana.</translation> +<translation id="6947015141909171112">Prikazani so recepti na podlagi vašega nedavnega iskanja receptov v Iskanju Google. + <ph name="BREAK" /> + <ph name="BREAK" /> + Upravljate lahko nastavitve v meniju kartice ali si ogledate več možnosti v razdelku za prilagajanje Chroma.</translation> <translation id="6949434160682548041">Geslo (izbirno)</translation> <translation id="6950627417367801484">Obnovi aplikacije</translation> <translation id="6952242901357037157">Tukaj lahko prikažete tudi gesla iz <ph name="BEGIN_LINK" />računa Google<ph name="END_LINK" /></translation> @@ -6368,6 +6378,7 @@ <translation id="7102687220333134671">Samodejne posodobitve so vklopljene</translation> <translation id="7102832101143475489">Časovna omejitev zahteve je potekla</translation> <translation id="710640343305609397">Odpri nastavitve omrežja</translation> +<translation id="7107609441453408294">Predvajanje istega zvoka prek vseh zvočnikov</translation> <translation id="7108338896283013870">Skrij</translation> <translation id="7108668606237948702">vnos</translation> <translation id="7108933416628942903">Zakleni zdaj</translation> @@ -6598,6 +6609,7 @@ <translation id="7364745943115323529">Predvajaj ...</translation> <translation id="7364796246159120393">Izberite datoteko</translation> <translation id="7365076891350562061">Velikost monitorja</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" /> – pripeto</translation> <translation id="7366316827772164604">Iskanje naprav v bližini …</translation> <translation id="7366415735885268578">Dodajanje spletnega mesta</translation> <translation id="7366909168761621528">Podatki brskanja</translation> @@ -6994,6 +7006,7 @@ <translation id="7737115349420013392">Seznanjanje z napravo »<ph name="DEVICE_NAME" />« …</translation> <translation id="7737846262459425222">To lahko kadar koli spremenite v »Nastavitve« > »Pomočnik Google« > »Vsebina na zaslonu«.</translation> <translation id="7737948071472253612">Ni dovoljena uporaba kamere</translation> +<translation id="77381465218432215">Prikaz naglasnih znamenj in posebnih znakov</translation> <translation id="7740996059027112821">Standardno</translation> <translation id="7741307896921365578">Omogoča stransko podokno na ravni brskalnika za uporaben in trajen način dostopanja do bralnega seznama in zaznamkov.</translation> <translation id="7742558784808143689">Želite izbrisati podatke spletnega mesta in dovoljenja za <ph name="SITE_NAME" />, vsa njegova podrejena spletna mesta in nameščene aplikacije?</translation> @@ -7784,6 +7797,7 @@ <translation id="8486666913807228950">Razlog: Obrnjeno pravilo <ph name="REVERT_RULE" /> je bilo najdeno na seznamu »Vsiljeno odprtje v«.</translation> <translation id="848666842773560761">Aplikacija poskuša dostopati do kamere. Če želite omogočiti dostop, izklopite zasebnost kamere.</translation> <translation id="8487678622945914333">Povečaj</translation> +<translation id="8487699605742506766">Dostopna točka</translation> <translation id="8489156414266187072">Osebni predlogi so prikazani samo v vašem računu</translation> <translation id="8490896350101740396">Posodobljene so bile te aplikacije za kiosk: »<ph name="UPDATED_APPS" />«. Znova zaženite napravo, da dokončate postopek posodobitve.</translation> <translation id="8492685019009920170">S prstom se dotaknite tipala prstnih odtisov. Podatki so varno shranjeni in nikoli ne zapustijo naprave <ph name="DEVICE_TYPE" />.</translation> @@ -8280,6 +8294,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{»<ph name="TAB_TITLE" />«}=1{»<ph name="TAB_TITLE" />« in še 1 zavihek}one{»<ph name="TAB_TITLE" />« in še # zavihek}two{»<ph name="TAB_TITLE" />« in še # zavihka}few{»<ph name="TAB_TITLE" />« in še # zavihki}other{»<ph name="TAB_TITLE" />« in še # zavihkov}}</translation> <translation id="8977811652087512276">Napačno geslo ali poškodovana datoteka</translation> <translation id="8978154919215542464">Vklopljeno – sinhroniziranje vsega</translation> +<translation id="8978670037548431647">Osveževanje možnosti povezave računalnika z internetom prek mobilnega telefona</translation> <translation id="897939795688207351">Izvor: <ph name="ORIGIN" /></translation> <translation id="8980345560318123814">Poročila s povratnimi informacijami</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> – zrušitev</translation> @@ -8544,6 +8559,7 @@ <translation id="935854577147268200">Telefon za Smart Lock je spremenjen. Vnesite geslo, če želite posodobiti Smart Lock. Naslednjič bo telefon odklenil napravo <ph name="DEVICE_TYPE" />. Smart Lock lahko izklopite v nastavitvah.</translation> <translation id="936646668635477464">Kamera in mikrofon</translation> <translation id="936801553271523408">Sistemski diagnostični podatki</translation> +<translation id="937053962468712792">Ali želite napravo <ph name="DEVICE" /> odstraniti iz računa <ph name="PRIMARY_EMAIL" />?</translation> <translation id="93766956588638423">Popravi razširitev</translation> <translation id="938568644810664664">Poskusi vprašati »Hey Google, what song is this?« (Hey Google, katera je ta skladba?) ali »Hey Google, what's on my screen?« (Hey Google, kaj je na mojem zaslonu?).</translation> <translation id="938623846785894166">Neobičajna datoteka</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index 4a57d48..84e4ba6 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -894,6 +894,7 @@ <translation id="1829129547161959350">Pingvin</translation> <translation id="1829192082282182671">Zoom &Out (Umanji)</translation> <translation id="1830550083491357902">Niste prijavljeni</translation> +<translation id="1831848493690504725">Ne možemo da pristupimo Google-u preko povezane mreže. Izaberite drugu mrežu ili proverite podešavanja mreže ili podešavanja proksija (ako koristite proksi).</translation> <translation id="1832459821645506983">Da, omogući</translation> <translation id="1832511806131704864">Promena telefona je ažurirana</translation> <translation id="1832848789136765277">Da biste bili sigurni da uvek možete da pristupate sinhronizovanim podacima, potvrdite da ste to vi</translation> @@ -2192,6 +2193,7 @@ <translation id="3021065318976393105">Tokom korišćenja baterije</translation> <translation id="3021066826692793094">Leptir</translation> <translation id="3021678814754966447">&Prikaži izvor okvira</translation> +<translation id="3022361196600037287">Uređaj <ph name="DEVICE" /> će biti uklonjen sa ovog Chromebook-a i neće biti sačuvan na <ph name="PRIMARY_EMAIL" />.</translation> <translation id="3022978424994383087">Nismo vas razumeli.</translation> <translation id="3023464535986383522">Izaberite za govor</translation> <translation id="3024374909719388945">Koristi 24-časovni sat</translation> @@ -3730,6 +3732,7 @@ <translation id="4535127706710932914">Podrazumevani profil</translation> <translation id="4535767533210902251">Senzor za otisak prsta je taster u gornjem desnom uglu tastature. Lagano ga dodirnite prstom.</translation> <translation id="4536140153723794651">Sajtovi koji uvek mogu da koriste kolačiće</translation> +<translation id="4536769240747010177">Mogućnosti privezivanja:</translation> <translation id="4538417792467843292">Brisanje reči</translation> <translation id="4538792345715658285">Instalirano je prema smernicama za preduzeće.</translation> <translation id="4541123282641193691">Verifikacija naloga nije uspela. Probajte ponovo ili restartujte Chromebook.</translation> @@ -3757,6 +3760,7 @@ <translation id="4561893854334016293">Nema nedavno promenjenih dozvola</translation> <translation id="4562155214028662640">Dodaj digitalni otisak</translation> <translation id="4563210852471260509">Početni jezik za unos je kineski</translation> +<translation id="4563382028841851106">Ukloni sa naloga</translation> <translation id="4563880231729913339">Prst 3</translation> <translation id="4564245002465020751">Dovršite podešavanje telefona</translation> <translation id="4565377596337484307">Sakrij lozinku</translation> @@ -4732,6 +4736,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> želi da</translation> <translation id="5534304873398226603">Odbaci sliku ili video</translation> <translation id="5537725057119320332">Prebacuj</translation> +<translation id="5539070192556911367">Google nije dostupan</translation> <translation id="5539221284352502426">Server je odbio lozinku koju ste uneli. Mogući razlozi obuhvataju: Lozinka je prekratka. Lozinka mora da sadrži brojeve ili simbole. Lozinka mora da se razlikuje od prethodnih lozinki.</translation> <translation id="5541694225089836610">Administrator je onemogućio radnju</translation> <translation id="5542132724887566711">Profil</translation> @@ -4795,6 +4800,7 @@ <translation id="5585912436068747822">Formatiranje nije uspelo</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Aplikacije se učitavaju…</translation> +<translation id="5590418976913374224">Pusti zvuk pri pokretanju uređaja</translation> <translation id="5592595402373377407">Još uvek nije dostupna dovoljna količina podataka.</translation> <translation id="5595307023264033512">Ukupan memorijski prostor koji koriste sajtovi: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">Izmena adrese</translation> @@ -6177,6 +6183,10 @@ <translation id="6943939122536910181">Prekinuta je veza sa uređajem <ph name="DEVICE" /></translation> <translation id="6945221475159498467">Izaberi</translation> <translation id="694592694773692225">Preusmeravanje je blokirano na ovoj stranici.</translation> +<translation id="6947015141909171112">Prikazuju vam se recepti na osnovu nedavne aktivnosti pretrage za recepte. + <ph name="BREAK" /> + <ph name="BREAK" /> + Možete da upravljate podešavanjima iz menija kartice ili da vidite još opcija u meniju Prilagodite Chrome.</translation> <translation id="6949434160682548041">Lozinka (opcionalno)</translation> <translation id="6950627417367801484">Vrati aplikacije</translation> <translation id="6952242901357037157">Ovde možete i da prikažete lozinke sa <ph name="BEGIN_LINK" />Google naloga<ph name="END_LINK" /></translation> @@ -6344,6 +6354,7 @@ <translation id="7102687220333134671">Automatska ažuriranja su uključena</translation> <translation id="7102832101143475489">Zahtev je istekao</translation> <translation id="710640343305609397">Otvori podešavanja mreže</translation> +<translation id="7107609441453408294">Pušta isti zvuk na svim zvučnicima</translation> <translation id="7108338896283013870">Sakrij</translation> <translation id="7108668606237948702">enter</translation> <translation id="7108933416628942903">Zaključaj</translation> @@ -6574,6 +6585,7 @@ <translation id="7364745943115323529">Prebacuj...</translation> <translation id="7364796246159120393">Odaberi fajl</translation> <translation id="7365076891350562061">Veličina monitora</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" /> – zakačeno je</translation> <translation id="7366316827772164604">Traže se uređaji u blizini…</translation> <translation id="7366415735885268578">Dodajte sajt</translation> <translation id="7366909168761621528">Podaci pregledanja</translation> @@ -6970,6 +6982,7 @@ <translation id="7737115349420013392">Uparuje se sa „<ph name="DEVICE_NAME" />“ ...</translation> <translation id="7737846262459425222">Ovo možete da promenite u svakom trenutku u Podešavanjima > Google pomoćnik > Kontekst ekrana.</translation> <translation id="7737948071472253612">Nije im dozvoljeno da koriste kameru</translation> +<translation id="77381465218432215">Prikazuj oznake akcenta i specijalne znakove</translation> <translation id="7740996059027112821">Standardno</translation> <translation id="7741307896921365578">Omogućava bočnu tablu na nivou pregledača da biste na koristan i dosledan način mogli da pristupate listi za čitanje i obeleživačima.</translation> <translation id="7742558784808143689">Želite da obrišete podatke o sajtovima i dozvole za <ph name="SITE_NAME" />, sve podređene sajtove i instalirane aplikacije?</translation> @@ -7759,6 +7772,7 @@ <translation id="8486666913807228950">Razlog: Inverzno pravilo <ph name="REVERT_RULE" /> je pronađeno na listi Prinudno otvori na.</translation> <translation id="848666842773560761">Aplikacija pokušava da pristupi kameri. Isključite prekidač za privatnost kamere da biste omogućili pristup.</translation> <translation id="8487678622945914333">Uvećaj</translation> +<translation id="8487699605742506766">Hotspot</translation> <translation id="8489156414266187072">Lični predlozi se prikazuju samo na vašem nalogu</translation> <translation id="8490896350101740396">Sledeće kiosk aplikacije „<ph name="UPDATED_APPS" />“ su ažurirane. Restartujte uređaj da biste završili proces ažuriranja.</translation> <translation id="8492685019009920170">Dodirnite prstom senzor za otisak prsta. Podaci se bezbedno čuvaju isključivo na uređaju <ph name="DEVICE_TYPE" />.</translation> @@ -8254,6 +8268,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{„<ph name="TAB_TITLE" />“}=1{„<ph name="TAB_TITLE" />“ i još 1 kartica}one{„<ph name="TAB_TITLE" />“ i još # kartica}few{„<ph name="TAB_TITLE" />“ i još # kartice}other{„<ph name="TAB_TITLE" />“ i još # kartica}}</translation> <translation id="8977811652087512276">Netačna lozinka ili oštećena datoteka</translation> <translation id="8978154919215542464">Uključeno – sinhronizuj sve</translation> +<translation id="8978670037548431647">Osveži mogućnosti privezivanja</translation> <translation id="897939795688207351">Na <ph name="ORIGIN" /></translation> <translation id="8980345560318123814">Izveštaji sa povratnim informacijama</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> – Otkazao je</translation> @@ -8518,6 +8533,7 @@ <translation id="935854577147268200">Smart Lock telefon je promenjen. Unesite lozinku da biste ažurirali Smart Lock. Sledeći put će telefon otključati <ph name="DEVICE_TYPE" />. Možete da isključite Smart Lock u podešavanjima</translation> <translation id="936646668635477464">Kamera i mikrofon</translation> <translation id="936801553271523408">Sistemski dijagnostički podaci</translation> +<translation id="937053962468712792">Želite da uklonite uređaj <ph name="DEVICE" /> sa <ph name="PRIMARY_EMAIL" />?</translation> <translation id="93766956588638423">Popravi dodatak</translation> <translation id="938568644810664664">Probajte da pitate „Hej Google, koja je ovo pesma?“ ili „Hej Google, šta je prikazano na mom ekranu?“</translation> <translation id="938623846785894166">Neuobičajen fajl</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index c3bed64..382f740a 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -894,6 +894,7 @@ <translation id="1829129547161959350">Пингвин</translation> <translation id="1829192082282182671">Zoom &Out (Умањи)</translation> <translation id="1830550083491357902">Нисте пријављени</translation> +<translation id="1831848493690504725">Не можемо да приступимо Google-у преко повезане мреже. Изаберите другу мрежу или проверите подешавања мреже или подешавања проксија (ако користите прокси).</translation> <translation id="1832459821645506983">Да, омогући</translation> <translation id="1832511806131704864">Промена телефона је ажурирана</translation> <translation id="1832848789136765277">Да бисте били сигурни да увек можете да приступате синхронизованим подацима, потврдите да сте то ви</translation> @@ -2192,6 +2193,7 @@ <translation id="3021065318976393105">Током коришћења батерије</translation> <translation id="3021066826692793094">Лептир</translation> <translation id="3021678814754966447">&Прикажи извор оквира</translation> +<translation id="3022361196600037287">Уређај <ph name="DEVICE" /> ће бити уклоњен са овог Chromebook-а и неће бити сачуван на <ph name="PRIMARY_EMAIL" />.</translation> <translation id="3022978424994383087">Нисмо вас разумели.</translation> <translation id="3023464535986383522">Изаберите за говор</translation> <translation id="3024374909719388945">Користи 24-часовни сат</translation> @@ -3730,6 +3732,7 @@ <translation id="4535127706710932914">Подразумевани профил</translation> <translation id="4535767533210902251">Сензор за отисак прста је тастер у горњем десном углу тастатуре. Лагано га додирните прстом.</translation> <translation id="4536140153723794651">Сајтови који увек могу да користе колачиће</translation> +<translation id="4536769240747010177">Могућности привезивања:</translation> <translation id="4538417792467843292">Брисање речи</translation> <translation id="4538792345715658285">Инсталирано је према смерницама за предузеће.</translation> <translation id="4541123282641193691">Верификација налога није успела. Пробајте поново или рестартујте Chromebook.</translation> @@ -3757,6 +3760,7 @@ <translation id="4561893854334016293">Нема недавно промењених дозвола</translation> <translation id="4562155214028662640">Додај дигитални отисак</translation> <translation id="4563210852471260509">Почетни језик за унос је кинески</translation> +<translation id="4563382028841851106">Уклони са налога</translation> <translation id="4563880231729913339">Прст 3</translation> <translation id="4564245002465020751">Довршите подешавање телефона</translation> <translation id="4565377596337484307">Сакриј лозинку</translation> @@ -4732,6 +4736,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> жели да</translation> <translation id="5534304873398226603">Одбаци слику или видео</translation> <translation id="5537725057119320332">Пребацуј</translation> +<translation id="5539070192556911367">Google није доступан</translation> <translation id="5539221284352502426">Сервер је одбио лозинку коју сте унели. Могући разлози обухватају: Лозинка је прекратка. Лозинка мора да садржи бројеве или симболе. Лозинка мора да се разликује од претходних лозинки.</translation> <translation id="5541694225089836610">Администратор је онемогућио радњу</translation> <translation id="5542132724887566711">Профил</translation> @@ -4795,6 +4800,7 @@ <translation id="5585912436068747822">Форматирање није успело</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Апликације се учитавају…</translation> +<translation id="5590418976913374224">Пусти звук при покретању уређаја</translation> <translation id="5592595402373377407">Још увек није доступна довољна количина података.</translation> <translation id="5595307023264033512">Укупан меморијски простор који користе сајтови: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">Измена адресе</translation> @@ -6177,6 +6183,10 @@ <translation id="6943939122536910181">Прекинута је веза са уређајем <ph name="DEVICE" /></translation> <translation id="6945221475159498467">Изабери</translation> <translation id="694592694773692225">Преусмеравање је блокирано на овој страници.</translation> +<translation id="6947015141909171112">Приказују вам се рецепти на основу недавне активности претраге за рецепте. + <ph name="BREAK" /> + <ph name="BREAK" /> + Можете да управљате подешавањима из менија картице или да видите још опција у менију Прилагодите Chrome.</translation> <translation id="6949434160682548041">Лозинка (опционално)</translation> <translation id="6950627417367801484">Врати апликације</translation> <translation id="6952242901357037157">Овде можете и да прикажете лозинке са <ph name="BEGIN_LINK" />Google налога<ph name="END_LINK" /></translation> @@ -6344,6 +6354,7 @@ <translation id="7102687220333134671">Аутоматска ажурирања су укључена</translation> <translation id="7102832101143475489">Захтев је истекао</translation> <translation id="710640343305609397">Отвори подешавања мреже</translation> +<translation id="7107609441453408294">Пушта исти звук на свим звучницима</translation> <translation id="7108338896283013870">Сакриј</translation> <translation id="7108668606237948702">enter</translation> <translation id="7108933416628942903">Закључај</translation> @@ -6574,6 +6585,7 @@ <translation id="7364745943115323529">Пребацуј...</translation> <translation id="7364796246159120393">Одабери фајл</translation> <translation id="7365076891350562061">Величина монитора</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" /> – закачено је</translation> <translation id="7366316827772164604">Траже се уређаји у близини…</translation> <translation id="7366415735885268578">Додајте сајт</translation> <translation id="7366909168761621528">Подаци прегледања</translation> @@ -6970,6 +6982,7 @@ <translation id="7737115349420013392">Упарује се са „<ph name="DEVICE_NAME" />“ ...</translation> <translation id="7737846262459425222">Ово можете да промените у сваком тренутку у Подешавањима > Google помоћник > Контекст екрана.</translation> <translation id="7737948071472253612">Није им дозвољено да користе камеру</translation> +<translation id="77381465218432215">Приказуј ознаке акцента и специјалне знакове</translation> <translation id="7740996059027112821">Стандардно</translation> <translation id="7741307896921365578">Омогућава бочну таблу на нивоу прегледача да бисте на користан и доследан начин могли да приступате листи за читање и обележивачима.</translation> <translation id="7742558784808143689">Желите да обришете податке о сајтовима и дозволе за <ph name="SITE_NAME" />, све подређене сајтове и инсталиране апликације?</translation> @@ -7759,6 +7772,7 @@ <translation id="8486666913807228950">Разлог: Инверзно правило <ph name="REVERT_RULE" /> је пронађено на листи Принудно отвори на.</translation> <translation id="848666842773560761">Апликација покушава да приступи камери. Искључите прекидач за приватност камере да бисте омогућили приступ.</translation> <translation id="8487678622945914333">Увећај</translation> +<translation id="8487699605742506766">Хотспот</translation> <translation id="8489156414266187072">Лични предлози се приказују само на вашем налогу</translation> <translation id="8490896350101740396">Следеће киоск апликације „<ph name="UPDATED_APPS" />“ су ажуриране. Рестартујте уређај да бисте завршили процес ажурирања.</translation> <translation id="8492685019009920170">Додирните прстом сензор за отисак прста. Подаци се безбедно чувају искључиво на уређају <ph name="DEVICE_TYPE" />.</translation> @@ -8254,6 +8268,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{„<ph name="TAB_TITLE" />“}=1{„<ph name="TAB_TITLE" />“ и још 1 картица}one{„<ph name="TAB_TITLE" />“ и још # картица}few{„<ph name="TAB_TITLE" />“ и још # картице}other{„<ph name="TAB_TITLE" />“ и још # картица}}</translation> <translation id="8977811652087512276">Нетачна лозинка или оштећена датотека</translation> <translation id="8978154919215542464">Укључено – синхронизуј све</translation> +<translation id="8978670037548431647">Освежи могућности привезивања</translation> <translation id="897939795688207351">На <ph name="ORIGIN" /></translation> <translation id="8980345560318123814">Извештаји са повратним информацијама</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> – Отказао је</translation> @@ -8518,6 +8533,7 @@ <translation id="935854577147268200">Smart Lock телефон је промењен. Унесите лозинку да бисте ажурирали Smart Lock. Следећи пут ће телефон откључати <ph name="DEVICE_TYPE" />. Можете да искључите Smart Lock у подешавањима</translation> <translation id="936646668635477464">Камера и микрофон</translation> <translation id="936801553271523408">Системски дијагностички подаци</translation> +<translation id="937053962468712792">Желите да уклоните уређај <ph name="DEVICE" /> са <ph name="PRIMARY_EMAIL" />?</translation> <translation id="93766956588638423">Поправи додатак</translation> <translation id="938568644810664664">Пробајте да питате „Хеј Google, која је ово песма?“ или „Хеј Google, шта је приказано на мом екрану?“</translation> <translation id="938623846785894166">Неуобичајен фајл</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 50bf8e3..b4d4783 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -906,6 +906,7 @@ <translation id="1829129547161959350">பென்குயின்</translation> <translation id="1829192082282182671">Zoom &Out</translation> <translation id="1830550083491357902">உள்நுழைந்திருக்கவில்லை</translation> +<translation id="1831848493690504725">இணைத்துள்ள நெட்வொர்க் மூலம் Googleளை அணுக முடியவில்லை. வேறொரு நெட்வொர்க்கைத் தேர்வுசெய்யவும் அல்லது நெட்வொர்க் அமைப்புகளையோ ப்ராக்ஸி அமைப்புகளையோ (ப்ராக்ஸியைப் பயன்படுத்தினால்) சரிபார்க்கவும்.</translation> <translation id="1832459821645506983">ஏற்கிறேன்</translation> <translation id="1832511806131704864">ஃபோன் மாற்றம் புதுப்பிக்கப்பட்டது</translation> <translation id="1832848789136765277">நீங்கள் ஒத்திசைத்த தரவை எப்போது வேண்டுமானாலும் அணுக இது நீங்கள்தான் என உறுதிசெய்யவும்</translation> @@ -4753,6 +4754,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> பின்வருவனவற்றைச் செய்ய விரும்புகிறது:</translation> <translation id="5534304873398226603">படம் அல்லது வீடியோவை நிராகரி</translation> <translation id="5537725057119320332">அலைபரப்பு</translation> +<translation id="5539070192556911367">Googleளை அணுக முடியவில்லை</translation> <translation id="5539221284352502426">சேவையகம் நீங்கள் உள்ளிட்ட கடவுச்சொல்லை நிராகரித்தது. நிராகரிப்பிற்கான சாத்தியமான காரணங்கள்: கடவுச்சொல் மிகச் சிறியது. கடவுச்சொல்லில் எண்கள் அல்லது குறியீடுகள் இருக்க வேண்டும். முந்தைய கடவுச்சொற்களிலிருந்து தற்போதைய கடவுச்சொல் வேறுபட்டு இருக்க வேண்டும்.</translation> <translation id="5541694225089836610">செயல்பாட்டை நிர்வாகி முடக்கியுள்ளார்</translation> <translation id="5542132724887566711">சுயவிவரம்</translation> @@ -4816,6 +4818,7 @@ <translation id="5585912436068747822">வடிவமைத்தல் தோல்வியடைந்தது</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">ஆப்ஸை ஏற்றுகிறது...</translation> +<translation id="5590418976913374224">சாதனம் தொடங்கும்போது ஒலி எழுப்பு</translation> <translation id="5592595402373377407">போதுமான தரவு இதுவரை கிடைக்கவில்லை.</translation> <translation id="5595307023264033512">தளங்கள் பயன்படுத்தும் மொத்தச் சேமிப்பகம்: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">முகவரியைத் திருத்து</translation> @@ -6365,6 +6368,7 @@ <translation id="7102687220333134671">தானியங்கு புதுப்பிப்புகள் இயக்கப்பட்டுள்ளன</translation> <translation id="7102832101143475489">கோரிக்கை காலாவதியானது</translation> <translation id="710640343305609397">நெட்வொர்க் அமைப்புகளைத் திற</translation> +<translation id="7107609441453408294">எல்லா ஸ்பீக்கர்களிலும் ஒரே ஆடியோவைப் பிளே செய்யும்</translation> <translation id="7108338896283013870">மறை</translation> <translation id="7108668606237948702">உள்ளிடு</translation> <translation id="7108933416628942903">இப்போதே பூட்டு</translation> @@ -6595,6 +6599,7 @@ <translation id="7364745943115323529">அனுப்பு...</translation> <translation id="7364796246159120393">ஃபைலைத் தேர்வு செய்க</translation> <translation id="7365076891350562061">மானிட்டரின் அளவு</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" /> - பின் செய்யப்பட்டது</translation> <translation id="7366316827772164604">அருகில் சாதனங்கள் உள்ளனவா எனத் தேடுகிறது...</translation> <translation id="7366415735885268578">தளத்தைச் சேர்</translation> <translation id="7366909168761621528">உலாவிய தரவு</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index 3029f69..c8b8800 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">మీ మైక్రోఫోన్ మరియు కెమెరాను ఉపయోగించండి</translation> <translation id="1005333234656240382">ADB డీబగ్గింగ్ను ఎనేబుల్ చేయాలా?</translation> <translation id="1006873397406093306">సైట్లలోని మీ డేటాను ఈ ఎక్స్టెన్షన్ చదవగలదు, అలాగే మార్చగలదు. ఏయే సైట్లను ఎక్స్టెన్షన్ యాక్సెస్ చేయవచ్చన్నది మీరు నియంత్రించవచ్చు.</translation> +<translation id="1007057452468855774">Google Play Storeను ఆన్ చేయండి</translation> <translation id="1008186147501209563">బుక్మార్క్లను ఎగుమతి చేయండి</translation> <translation id="1008557486741366299">ఇప్పుడు కాదు</translation> <translation id="1009476156254802388"><ph name="WEB_DRIVE" /> లొకేషన్</translation> <translation id="1009663062402466586">గేమ్ కంట్రోల్స్ ఇప్పుడు అందుబాటులో ఉన్నాయి</translation> <translation id="1010498023906173788">ఈ ట్యాబ్ ఒక సీరియల్ పోర్ట్కు కనెక్ట్ చేయబడింది.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{పేజీ ప్రతిస్పందించడం లేదు}other{పేజీలు ప్రతిస్పందించడం లేదు}}</translation> +<translation id="1011003645819296594">సేవ్ చేసిన పరికరాలు</translation> <translation id="1011355516189274711">టెక్ట్స్-టు-స్పీచ్ వాల్యూమ్</translation> <translation id="1012794136286421601">మీ డాక్స్, షీట్లు, స్లయిడ్లు మరియు డ్రాయింగ్ల ఫైళ్లు సింక్ చేయబడుతున్నాయి. వీటిని ఆన్లైన్ లేదా ఆఫ్లైన్లో యాక్సెస్ చేయడానికి Google Drive యాప్ని తెరవండి.</translation> <translation id="1012876632442809908">USB-C పరికరం (ముందువైపు పోర్ట్)</translation> @@ -136,7 +138,7 @@ <translation id="1126809382673880764">ప్రమాదకరమైన వెబ్సైట్లు, డౌన్లోడ్లు మరియు ఎక్స్టెన్షన్ల నుండి మిమ్మల్ని రక్షించదు. Gmail, Search వంటి ఇతర Google సర్వీస్లలో, సురక్షిత బ్రౌజింగ్ అందుబాటులో ఉన్న చోట మీరు ఇప్పటికీ రక్షణను పొందుతారు.</translation> <translation id="1128090040635299943">Linux ప్రస్తుతం కాన్ఫిగర్ చేయబడుతోంది. కాన్ఫిగరేషన్కు కొన్ని నిమిషాల సమయం పడుతుంది.</translation> <translation id="1128591060186966949">సెర్చ్ ఇంజిన్ను ఎడిట్ చేయండి</translation> -<translation id="1129420403709586868">మీ ఫోన్లోని ఫోటోలు, మీడియాను చూడండి</translation> +<translation id="1129420403709586868">మీ ఫోన్లోని ఫోటోలు, మీడియాను చూడగలదు</translation> <translation id="1129850422003387628">యాప్లను మేనేజ్ చేయండి</translation> <translation id="113050636487300043">ప్రొఫైళ్ల మధ్య తేడా కనిపించేలా పేరు, రంగు రూపాన్ని ఎంచుకోండి</translation> <translation id="1130589222747246278"><ph name="WINDOW_TITLE" /> - <ph name="GROUP_NAME" /> గ్రూప్లో భాగం</translation> @@ -494,6 +496,7 @@ <translation id="1470350905258700113">ఈ పరికరాన్ని ఉపయోగించండి</translation> <translation id="1470946456740188591">క్యారెట్ బ్రౌజింగ్ను ఆన్ లేదా ఆఫ్ చేయడానికి, షార్ట్కట్ Ctrl+Search+7ను ఉపయోగించండి</translation> <translation id="1472675084647422956">మరిన్ని చూపించు</translation> +<translation id="1473223074251193484">టెథరింగ్ కాన్ఫిగరేషన్ను సెటప్ చేయండి</translation> <translation id="1474785664565228650">మైక్రోఫోన్ సెట్టింగ్లో మార్చడానికి పారలల్స్ డెస్క్టాప్ను మళ్లీ ప్రారంభించవలసి ఉంటుంది. కొనసాగించడానికి పారలల్స్ డెస్క్టాప్ను మళ్లీ ప్రారంభించండి.</translation> <translation id="1474893630593443211">మీరు చూసే యాడ్లపై మరింత కంట్రోల్</translation> <translation id="1475502736924165259">మీకు ఫైల్లో మరే ఇతర వర్గంలోనూ సరిపోని ప్రమాణపత్రాలు ఉన్నాయి</translation> @@ -1123,6 +1126,7 @@ <translation id="2044014337866019681">సెషన్ను అన్లాక్ చేయడానికి, మీరు <ph name="ACCOUNT" />ను వెరిఫై చేస్తున్నారని దయచేసి నిర్ధారించుకోండి.</translation> <translation id="204497730941176055">Microsoft సర్టిఫికెట్ టెంప్లేట్ పేరు</translation> <translation id="2045117674524495717">కీబోర్డ్ షార్ట్కట్ సహాయం</translation> +<translation id="2045211794962848221">మీకు ఈ నిర్దిష్ట మెసేజ్ మళ్లీ కనిపించదు</translation> <translation id="2045969484888636535">కుకీలను నిరోధించడాన్ని కొనసాగించండి</translation> <translation id="204622017488417136">మీ పరికరం మునుపు ఇన్స్టాల్ చేసిన Chrome వెర్షన్కు తిరిగి మార్చబడింది. అన్ని వినియోగదారు ఖాతాలు మరియు స్థానిక డేటా తీసివేయబడుతుంది. దీన్ని రద్దు చేయడం సాధ్యపడదు.</translation> <translation id="2046702855113914483">రామెన్</translation> @@ -2331,7 +2335,7 @@ <translation id="3151539355209957474">ప్రారంభ సమయం</translation> <translation id="3151562827395986343">చరిత్ర, కుక్కీలు, కాష్ మొదలైన వాటిని తీసివేస్తుంది</translation> <translation id="3151786313568798007">దృగ్విన్యాసం</translation> -<translation id="3152356229013609796">మీ ఫోన్ నోటిఫికేషన్లను చూడండి, విస్మరించండి, వాటికి రిప్లయి చేయండి</translation> +<translation id="3152356229013609796">మీ ఫోన్ నోటిఫికేషన్లను చూడడం, విస్మరించడం, వాటికి రిప్లయి ఇవ్వడం చేయగలదు</translation> <translation id="3157387275655328056">పఠన లిస్ట్కు జోడించు</translation> <translation id="3157931365184549694">పునరుద్ధరించు</translation> <translation id="3158033540161634471">మీ వేలిముద్రను సెటప్ చేయండి</translation> @@ -3812,6 +3816,7 @@ <translation id="4594577641390224176">సిస్టమ్కు సంబంధించిన వివరాల పేజీ కోసం వెతుకుతున్నారా? సందర్శించండి</translation> <translation id="4595560905247879544">యాప్లు మరియు ఎక్స్టెన్షన్లను నిర్వాహకుడు (<ph name="CUSTODIAN_NAME" />) మాత్రమే ఎడిట్ చేయగలరు.</translation> <translation id="4596295440756783523">మీకు ఫైల్లో ఈ సర్వర్లను గుర్తించే ప్రమాణపత్రాలు ఉన్నాయి</translation> +<translation id="4598345735110653698">పాస్-కీలను మేనేజ్ చేయండి</translation> <translation id="4598556348158889687">నిల్వ నిర్వహణ</translation> <translation id="4598776695426288251">బహుళ పరికరాల ద్వారా Wi-Fi అందుబాటులో ఉంది</translation> <translation id="4601426376352205922">చదవనిదిగా మార్క్ చేయండి</translation> @@ -4037,6 +4042,7 @@ <translation id="4823894915586516138">మీరు మీ ఫోన్ నుండి యాక్సెస్ చేసే ఏదైనా సమాచారంతో పాటు, ఈ <ph name="DEVICE_TYPE" />లో ఉన్న డేటాను ఈ PIN లేదా పాస్వర్డ్ రక్షిస్తుంది</translation> <translation id="4824037980212326045">Linux బ్యాకప్ చేసి, పునరుద్ధరించడం</translation> <translation id="4824958205181053313">సింక్ను రద్దు చేయాలా?</translation> +<translation id="4825532258163983651">పాస్-కీని తొలగించడం సాధ్యం కాదు</translation> <translation id="4827675678516992122">కనెక్ట్ చేయడం సాధ్యపడలేదు</translation> <translation id="4827784381479890589">Chrome బ్రౌజర్లో మెరుగుపరిచిన స్పెల్ చెక్ (స్పెల్లింగ్ సూచనల కోసం టెక్స్ట్ Googleకు పంపబడుతుంది)</translation> <translation id="4827904420700932487">ఈ ఇమేజ్ కోసం QR కోడ్ను క్రియేట్ చేయండి</translation> @@ -4299,6 +4305,7 @@ <translation id="5087249366037322692">మూడవ పక్షం ద్వారా జోడించబడింది</translation> <translation id="5087580092889165836">కార్డ్ను జోడించు</translation> <translation id="5088534251099454936">RSA ఎన్క్రిప్షన్తో PKCS #1 SHA-512</translation> +<translation id="5089763948477033443">సైడ్ ప్యానెల్ సైజ్ మార్చే హ్యాండిల్</translation> <translation id="5090637338841444533">మీ కెమెరా పొజిషన్ను ట్రాక్ చేయడానికి అనుమతించబడలేదు</translation> <translation id="5093569275467863761">అజ్ఞాత వెనుకకు-ముందుకు కాష్ సబ్ఫ్రేమ్: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">మీ Files యాప్ లేదా ఇతర యాప్ల నుండి ఈ యాప్తో, సపోర్ట్ ఉన్న ఫైల్స్ను మీరు తెరవవచ్చు, ఎడిట్ చేయవచ్చు. ఈ యాప్తో ఆటోమేటిక్గా ఏ ఫైల్స్ తెరుచుకోవాలి అనే దానిని కంట్రోల్ చేయడానికి, <ph name="BEGIN_LINK" />మీ పరికరంలో ఆటోమేటిక్ యాప్లను సెట్ చేయడం ఎలాగో తెలుసుకోండి<ph name="END_LINK" />.</translation> @@ -4464,6 +4471,7 @@ <translation id="5258992782919386492">ఈ పరికరంలో ఇన్స్టాల్ చేయి</translation> <translation id="5260334392110301220">స్మార్ట్ కోట్లు</translation> <translation id="5260508466980570042">క్షమించండి, మీ ఈమెయిల్ లేదా పాస్వర్డ్ ధృవీకరించబడలేదు. దయచేసి మళ్ళీ ప్రయత్నించండి.</translation> +<translation id="5260958083445173099">సాధ్యమైనప్పుడల్లా, వెబ్సైట్లు, తమ కంటెంట్ను మీ ప్రాధాన్య భాషలలో చూపుతాయి</translation> <translation id="5261683757250193089">వెబ్ స్టోర్లో తెరవండి</translation> <translation id="5262178194499261222">పాస్వర్డ్ను తీసివేయండి</translation> <translation id="5262784498883614021">నెట్వర్క్కు ఆటోమేటిక్గా కనెక్ట్ చేయడం</translation> @@ -4504,6 +4512,7 @@ <translation id="5294097441441645251">తప్పనిసరిగా లోయర్కేస్ అక్షరం లేదా కింది గీతతో ప్రారంభం కావాలి</translation> <translation id="5294618183559481278">మీ పరికరం ముందు వ్యక్తులను గుర్తించినప్పుడు, మీ <ph name="DEVICE_TYPE" /> బిల్ట్-ఇన్ సెన్సార్ను ఉపయోగిస్తుంది. మీ పరికరంలో డేటా మొత్తం వెంటనే ప్రాసెస్ చేయబడుతుంది, ఆపై తొలగించబడుతుంది. సెన్సార్ డేటా ఎప్పటికీ Googleకు పంపబడదు. <ph name="LINK_BEGIN" />మరింత తెలుసుకోండి<ph name="LINK_END" /></translation> <translation id="5296350763804564124">'మాటల ప్రతిస్పందన'ను వినండి, తద్వారా మీరు స్క్రీన్ను చూడకుండానే మీ పరికరాన్ని ఉపయోగించవచ్చు. కనెక్ట్ అయిన పరికరంలో బ్రెయిలీ ఫీడ్బ్యాక్ అందుబాటులో ఉంది.</translation> +<translation id="5297005732522718715">టెథరింగ్ కాన్ఫిగరేషన్ను రిఫ్రెష్ చేయండి</translation> <translation id="5297082477358294722">పాస్వర్డ్ సేవ్ చేయబడింది. మీ <ph name="SAVED_PASSWORDS_STORE" />లో సేవ్ చేసిన పాస్వర్డ్లను చూడండి మరియు నిర్వహించండి.</translation> <translation id="5297946558563358707">వేరొకరు మీ స్క్రీన్ను చూసినప్పుడు, మీ స్క్రీన్ దిగువున కుడి వైపున గోప్యతా కన్ను చిహ్నాన్ని చూపండి</translation> <translation id="5298219193514155779">థీమ్ వీరిచే క్రియేట్ చేయబడింది</translation> @@ -4674,11 +4683,13 @@ <translation id="5466374726908360271">అతికించి “<ph name="SEARCH_TERMS" />” కోసం వెతకండి</translation> <translation id="5467207440419968613"><ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> బ్లాక్ చేయబడ్డాయి</translation> <translation id="5468173180030470402">ఫైల్ షేర్ల కోసం చూస్తోంది</translation> +<translation id="5468330507528805311">టెథరింగ్ స్టేటస్:</translation> <translation id="5468881191994555667">ఫైల్ను ఎంచుకోండి</translation> <translation id="5469852975082458401">టెక్స్ట్ కర్సర్తో మీరు పేజీలను నావిగేట్ చేయవచ్చు. ఆఫ్ చేయడానికి F7ను నొక్కండి.</translation> <translation id="5470735824776589490">మీ పరికరాన్ని పవర్వాష్తో రీసెట్ చేయడానికి ముందు రీస్టార్ట్ చేయడం అవసరం. <ph name="LINK_BEGIN" />మరింత తెలుసుకోండి<ph name="LINK_END" /></translation> <translation id="5471768120198416576">హలో! నేను మీ వచనం నుండి ప్రసంగం వాయిస్ని.</translation> <translation id="5472627187093107397">ఈ సైట్ కోసం పాస్వర్డ్లను సేవ్ చేయండి</translation> +<translation id="5473062644742711742">మరిన్ని యాక్సెసిబిలిటీ టూల్స్ను Chrome వెబ్ స్టోర్లో కనుగొనండి</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">కొనసాగించడం ద్వారా, ఈ పరికరం Google, మీ చిన్నారి క్యారియర్, అలాగే ఈ పరికర తయారీదారు నుండి ఆటోమేటిక్గా అప్డేట్లను, యాప్లను డౌన్లోడ్ చేసి, ఇన్స్టాల్ చేయవచ్చని ఇందుకు సెల్యులార్ డేటా ఉపయోగించబడవచ్చని మీరు అంగీకరిస్తున్నారు. ఈ యాప్లలో కొన్ని, 'యాప్లో కొనుగోళ్ల'ను ఆఫర్ చేయవచ్చు.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{పిన్ తప్పనిసరిగా కనీసం ఒక అక్షరాన్ని కలిగి ఉండాలి}other{పిన్ తప్పనిసరిగా కనీసం # అక్షరాలను ఉండాలి}}</translation> @@ -4948,6 +4959,7 @@ <translation id="5734362860645681824">కమ్యూనికేషన్లు</translation> <translation id="5734697361979786483">ఫైల్ షేర్ను జోడించండి</translation> <translation id="5736796278325406685">దయచేసి చెల్లుబాటు అయ్యే వినియోగదారు పేరును నమోదు చేయండి</translation> +<translation id="5738093759615225354">మీ కంప్యూటర్లో సైన్ ఇన్ చేయడానికి మీకు ఈ పాస్-కీ అవసరం</translation> <translation id="5739017626473506901"><ph name="USER_NAME" /> పాఠశాల ఖాతాను జోడించడంలో సహాయపడటానికి సైన్ ఇన్ చేయండి</translation> <translation id="5739235828260127894">ధృవీకరణ కోసం వేచి ఉంది. <ph name="LINK_BEGIN" />మరింత తెలుసుకోండి<ph name="LINK_END" /></translation> <translation id="5739458112391494395">చాలా పెద్దవిగా</translation> @@ -5109,6 +5121,7 @@ <translation id="589541317545606110"><ph name="VISUAL_SEARCH_PROVIDER" /> సహాయంతో పేజీని సెర్చ్ చేయండి</translation> <translation id="5896436821193322561">అనుమతించవద్దు</translation> <translation id="5900186025777217044">Smart Lock మార్చబడింది</translation> +<translation id="5900243355162006650">టెథరింగ్ కాన్ఫిగరేషన్:</translation> <translation id="5900302528761731119">Google ప్రొఫైల్ ఫోటో</translation> <translation id="590036993063074298">మిర్రరింగ్ క్వాలిటీ వివరాలు</translation> <translation id="5901069264981746702">మీ వేలిముద్ర డేటా సురక్షితంగా స్టోర్ చేయబడుతుంది, ఎప్పటికీ మీ <ph name="DEVICE_TYPE" />లోనే ఉంటుంది. <ph name="LINK_BEGIN" />మరింత తెలుసుకోండి<ph name="LINK_END" /></translation> @@ -5412,6 +5425,7 @@ <translation id="6196640612572343990">థర్డ్ పార్టీ కుక్కీలను బ్లాక్ చేయండి</translation> <translation id="6196854373336333322">"<ph name="EXTENSION_NAME" />" ఎక్సటెన్షన్ మీ ప్రాక్సీ సెట్టింగ్లపై నియంత్రణను కలిగి ఉంది, అంటే ఇది మీరు ఆన్లైన్లో చేసే ప్రతిదీ మార్చగలదు, విచ్ఛిన్నం చేయగలదు లేదా మీకు తెలియకుండా గమనించగలదు. ఈ మార్పు ఎందుకు జరిగిందో మీకు సరిగ్గా తెలియదంటే, బహుశా మీరు ఇది కోరుకొని ఉండకపోవచ్చు.</translation> <translation id="6197128521826316819">ఈ పేజీ కోసం QR కోడ్ను క్రియేట్ చేయండి</translation> +<translation id="6197223946499512637">ఈ పాస్-కీలు ఈ కంప్యూటర్లో Windows Helloలో స్టోర్ చేయబడ్డాయి. అవి మీ Google ఖాతాలో సేవ్ చేయబడలేదు.</translation> <translation id="6198252989419008588">పిన్ మార్పు</translation> <translation id="6200047250927636406">ఫైల్ను విస్మరించండి</translation> <translation id="6200151268994853226">ఎక్స్టెన్షన్ను మేనేజ్ చేయండి</translation> @@ -5709,6 +5723,7 @@ <translation id="6482559668224714696">ఫుల్-స్క్రీన్ మాగ్నిఫైయర్</translation> <translation id="6483485061007832714">డౌన్లోడ్ చేసినది తెరువు</translation> <translation id="6483805311199035658"><ph name="FILE" /> ని తెరుస్తుంది...</translation> +<translation id="6486301003991593638">పాస్-కీలను మేనేజ్ చేయడానికి, Windows కొత్త వెర్షన్ను ఉపయోగించండి</translation> <translation id="6488384360522318064">భాషను ఎంచుకోండి</translation> <translation id="648927581764831596">ఏవీ అందుబాటులో లేవు</translation> <translation id="6490471652906364588">USB-C పరికరం (కుడి పోర్ట్)</translation> @@ -6295,6 +6310,7 @@ <translation id="7029307918966275733">Crostini ఇన్స్టాల్ చేయబడలేదు. క్రెడిట్లను చూడడానికి దయచేసి Crostiniని ఇన్స్టాల్ చేయండి.</translation> <translation id="7029809446516969842">పాస్వర్డ్లు</translation> <translation id="7030304022046916278">URLలను చెక్ చేయడానికి వాటిని సురక్షిత బ్రౌజింగ్కు పంపుతుంది</translation> +<translation id="7030695672997239647">ట్యాబ్పై కుడి క్లిక్ చేసి, "Tabను గ్రూప్నకు జోడించండి" ఆప్షన్ను ఎంచుకుని, తర్వాత "కొత్త గ్రూప్"ను ఎంచుకోండి</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - సీరియల్ పోర్ట్ కనెక్ట్ చేయబడింది</translation> <translation id="7033616203784997570">ఇన్పుట్లో గరిష్ఠంగా 62 అక్షరాలు ఉండవచ్చు</translation> <translation id="7034692021407794547">బిల్లింగ్ మేనేజ్మెంట్ ప్రత్యేక హక్కులతో ఉన్న అడ్మినిస్ట్రేటర్ మొదట అడ్మిన్ కన్సోల్లోని Google Meet హార్డ్వేర్ విభాగంలో Google Meet హార్డ్వేర్ సర్వీస్ నియమాలను అంగీకరించాలి.</translation> @@ -7391,6 +7407,7 @@ <translation id="8101987792947961127">తరువాత రీబూట్లో పవర్వాష్ అవసరం</translation> <translation id="81020759409809034">స్థానిక లొకేషన్</translation> <translation id="8102139037507939978">system_logs.txt నుండి వ్యక్తిగతంగా గుర్తించగలిగే సమాచారాన్ని తొలగించండి.</translation> +<translation id="810362914482827094">పాస్-కీలను సెర్చ్ చేయండి</translation> <translation id="8104088837833760645">eSIM ప్రొఫైల్ను డౌన్లోడ్ చేయండి</translation> <translation id="8105368624971345109">ఆఫ్ చేయి</translation> <translation id="8107015733319732394">మీ <ph name="DEVICE_TYPE" />లో Google Play Storeను ఇన్స్టాల్ చేస్తోంది. ఇందుకు కొన్ని నిమిషాలు పట్టవచ్చు.</translation> @@ -7838,6 +7855,7 @@ <translation id="8557022314818157177">మీ వేలిముద్ర క్యాప్చర్ అయ్యేవరకు, మీ సెక్యూరిటీ కీని తాకుతూ ఉండండి</translation> <translation id="8557180006508471423">మీ Macలో లొకేషన్ సర్వీస్లలో "Google Chrome"ను ఆన్ చేయండి</translation> <translation id="8557856025359704738">తర్వాతి డౌన్లోడ్ <ph name="NEXT_DATE_DOWNLOAD" />న జరుగుతుంది.</translation> +<translation id="8559858985063901027">పాస్-కీలు</translation> <translation id="8560327176991673955">{COUNT,plural, =0{అన్నింటినీ &కొత్త విండోలో తెరువు}=1{&కొత్త విండోలో తెరువు}other{అన్నింటినీ ({COUNT}) &కొత్త విండోలో తెరువు}}</translation> <translation id="8561206103590473338">ఏనుగు</translation> <translation id="8561565784790166472">జాగ్రత్తగా ముందుకు కొనసాగండి</translation> @@ -7964,6 +7982,7 @@ <translation id="8677212948402625567">అన్నీ కుదించు...</translation> <translation id="867767487203716855">తర్వాతి అప్డేట్</translation> <translation id="8677859815076891398">ఆల్బమ్లు ఏవీ లేవు. <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />లో ఆల్బమ్ను క్రియేట్ చేయండి.</translation> +<translation id="8678378565142776698">రీస్టార్ట్ చేసి, ఆటోమేటిక్ అప్డేట్లను పొందండి</translation> <translation id="8678538439778360739"><ph name="TIME" />లో సింక్ రహస్య పదబంధంతో డేటా ఎన్క్రిప్ట్ చేయబడింది. Google Payలోని పేమెంట్ ఆప్షన్లు, అడ్రస్లు ఇందులో ఉండవు.</translation> <translation id="8678582529642151449">ట్యాబ్లు కుదించబడవు</translation> <translation id="8678933587484842200">మీరు ఈ అప్లికేషన్ను ఎలా ప్రారంభించాలనుకుంటున్నారు?</translation> @@ -8210,6 +8229,7 @@ <translation id="8910987510378294980">పరికర లిస్ట్ను దాచండి</translation> <translation id="8912362522468806198">Google ఖాతా</translation> <translation id="8912810933860534797">ఆటోమేటిక్ స్కాన్ను ప్రారంభించు</translation> +<translation id="8915307125957890427">ట్యాబ్పై కుడి క్లిక్ చేసి, "Tabను గ్రూప్నకు జోడించండి" ఆప్షన్ను ఎంచుకుని, తర్వాత "కొత్త గ్రూప్"ను ఎంచుకోండి</translation> <translation id="8915370057835397490">సూచన లోడ్ అవుతోంది</translation> <translation id="8916476537757519021">అజ్ఞాత సబ్ఫ్రేమ్: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" />కు చెందిన <ph name="DEVICE_TYPE" /></translation> @@ -8284,6 +8304,7 @@ <translation id="8986362086234534611">మరిచిపోయారా</translation> <translation id="8986494364107987395">Googleకు ఆటోమేటిక్గా వినియోగ గణాంకాలను, క్రాష్ రిపోర్ట్లను పంపు</translation> <translation id="8987927404178983737">నెల</translation> +<translation id="8989359959810288806">టెథరింగ్ స్టేటస్ను రిఫ్రెష్ చేయండి</translation> <translation id="8991520179165052608">సైట్ మీ మైక్రోఫోన్ను ఉపయోగించవచ్చు</translation> <translation id="899384117894244799">పరిమితం చేయబడిన యూజర్ను తీసివేయండి</translation> <translation id="899403249577094719">Netscape సర్టిఫికెట్ ఆధార URL</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index eef65e6e4..3a7ed436 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -2212,6 +2212,7 @@ <translation id="3021065318976393105">Якщо пристрій не заряджається</translation> <translation id="3021066826692793094">Метелик</translation> <translation id="3021678814754966447">&Переглянути джерело фрейму</translation> +<translation id="3022361196600037287">Пристрій "<ph name="DEVICE" />" буде вилучено з цього пристрою Chromebook. Також його не буде збережено в обліковому записі <ph name="PRIMARY_EMAIL" />.</translation> <translation id="3022978424994383087">Незрозуміло.</translation> <translation id="3023464535986383522">Читання з екрана</translation> <translation id="3024374909719388945">Використовувати 24-годинний формат</translation> @@ -3751,6 +3752,7 @@ <translation id="4535127706710932914">Профіль за умовчанням</translation> <translation id="4535767533210902251">Сканер відбитків пальців – це верхня клавіша праворуч на клавіатурі. Легко торкніться її будь-яким пальцем.</translation> <translation id="4536140153723794651">Сайти, які завжди можуть використовувати файли cookie</translation> +<translation id="4536769240747010177">Можливості використання телефона як модема</translation> <translation id="4538417792467843292">Видалити слово</translation> <translation id="4538792345715658285">Установлено політикою підприємства.</translation> <translation id="4541123282641193691">Не вдалося підтвердити ваш обліковий запис. Повторіть спробу або перезапустіть Chromebook.</translation> @@ -3778,6 +3780,7 @@ <translation id="4561893854334016293">Немає нещодавно змінених дозволів</translation> <translation id="4562155214028662640">Додати відбиток пальця</translation> <translation id="4563210852471260509">Початкова мова введення – китайська</translation> +<translation id="4563382028841851106">Вилучити з облікового запису</translation> <translation id="4563880231729913339">Палець 3</translation> <translation id="4564245002465020751">Завершіть налаштування на телефоні</translation> <translation id="4565377596337484307">Сховати пароль</translation> @@ -6199,6 +6202,10 @@ <translation id="6943939122536910181">Відключено від пристрою "<ph name="DEVICE" />"</translation> <translation id="6945221475159498467">Вибрати</translation> <translation id="694592694773692225">Переспрямування заблоковано на цій сторінці.</translation> +<translation id="6947015141909171112">Ви бачите рецепти, підібрані на основі вашої нещодавньої історії пошуку. + <ph name="BREAK" /> + <ph name="BREAK" /> + Ви можете керувати налаштуваннями в меню картки або переглянути інші опції в розділі "Налаштувати Chrome".</translation> <translation id="6949434160682548041">Пароль (необов’язково)</translation> <translation id="6950627417367801484">Відновити додатки</translation> <translation id="6952242901357037157">Ви також можете переглядати тут паролі, збережені у вашому <ph name="BEGIN_LINK" />обліковому записі Google<ph name="END_LINK" /></translation> @@ -6994,6 +7001,7 @@ <translation id="7737115349420013392">Підключення до пристрою "<ph name="DEVICE_NAME" />"…</translation> <translation id="7737846262459425222">Цей параметр можна будь-коли змінити в розділі "Налаштування" > "Google Асистент" > "Екранний контекст".</translation> <translation id="7737948071472253612">Заборонено використовувати камеру</translation> +<translation id="77381465218432215">Показувати діакритичні знаки та спеціальні символи</translation> <translation id="7740996059027112821">Стандартно</translation> <translation id="7741307896921365578">Вмикає бічну панель у веб-переглядачі, щоб користувач мав постійну можливість переходити до списку читання та закладок.</translation> <translation id="7742558784808143689">Очистити дані та дозволи для сайту <ph name="SITE_NAME" />, усіх сайтів його групи та встановлених додатків?</translation> @@ -7784,6 +7792,7 @@ <translation id="8486666913807228950">Причина: у списку "Де примусово відкривати" виявлено зворотне правило <ph name="REVERT_RULE" />.</translation> <translation id="848666842773560761">Додаток намагається отримати доступ до камери. Щоб надати його, вимкніть перемикач конфіденційності камери.</translation> <translation id="8487678622945914333">Збільшити</translation> +<translation id="8487699605742506766">Точка доступу</translation> <translation id="8489156414266187072">Персональні підказки з'являються лише у вашому обліковому записі</translation> <translation id="8490896350101740396">Оновлено такі додатки-термінали: <ph name="UPDATED_APPS" />. Перезавантажте пристрій, щоб завершити оновлення.</translation> <translation id="8492685019009920170">Торкніться пальцем сканера відбитків. <ph name="DEVICE_TYPE" /> надійно зберігає ваші дані й нікуди не надсилає їх.</translation> @@ -8280,6 +8289,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" і ще 1 вкладка}one{"<ph name="TAB_TITLE" />" і ще # вкладка}few{"<ph name="TAB_TITLE" />" і ще # вкладки}many{"<ph name="TAB_TITLE" />" і ще # вкладок}other{"<ph name="TAB_TITLE" />" і ще # вкладки}}</translation> <translation id="8977811652087512276">Неправильний пароль або пошкоджений файл</translation> <translation id="8978154919215542464">Увімкнено – синхронізувати все</translation> +<translation id="8978670037548431647">Оновити можливості використання телефона як модема</translation> <translation id="897939795688207351">На сайті <ph name="ORIGIN" /></translation> <translation id="8980345560318123814">Надсилати відгуки</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> – аварійне завершення роботи</translation> @@ -8544,6 +8554,7 @@ <translation id="935854577147268200">Телефон для Smart Lock змінено. Щоб оновити Smart Lock, введіть пароль. Наступного разу ви зможете розблокувати пристрій <ph name="DEVICE_TYPE" /> за допомогою свого телефона. Smart Lock можна вимкнути в налаштуваннях</translation> <translation id="936646668635477464">Камера та мікрофон</translation> <translation id="936801553271523408">Дані діагностики системи</translation> +<translation id="937053962468712792">Вилучити пристрій "<ph name="DEVICE" />" з облікового запису <ph name="PRIMARY_EMAIL" />?</translation> <translation id="93766956588638423">Полагодити розширення</translation> <translation id="938568644810664664">Спробуйте запитати "Ok Google, що це за пісня?" або "Ok Google, що в мене на екрані?"</translation> <translation id="938623846785894166">Незвичний файл</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index a394f3c..79060cc 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Mikrofon va kameradan foydalanish</translation> <translation id="1005333234656240382">ADB tuzatish vositasi yoqilsinmi?</translation> <translation id="1006873397406093306">Bu kengaytma sayt maʼlumotlarini koʻrishi va oʻzgartirishi mumkin Kengaytmaga qaysi sayt maʼlumotlari koʻrinishini siz boshqarasiz.</translation> +<translation id="1007057452468855774">Google Play Marketni yoqish</translation> <translation id="1008186147501209563">Xatcho‘plarni eksport qilish</translation> <translation id="1008557486741366299">Hozir emas</translation> <translation id="1009476156254802388"><ph name="WEB_DRIVE" /> jildi</translation> <translation id="1009663062402466586">Oʻyin boshqaruvlari taqdim etildi</translation> <translation id="1010498023906173788">Bu varaq seriyali portga ulangan.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Sahifa javob bermayapti}other{Sahifalar javob bermayapti}}</translation> +<translation id="1011003645819296594">Saqlangan qurilmalar</translation> <translation id="1011355516189274711">Nutq sintezatori ovozi balandligi</translation> <translation id="1012794136286421601">Hujjatlar, Jadvallar, Taqdimotlar va Chizmalardagi fayllaringiz sinxronlanmoqda. Ulardan onlayn va oflayn rejimda foydalanish uchun “Google Disk” ilovasini ishga tushiring.</translation> <translation id="1012876632442809908">USB-C qurilma (old port)</translation> @@ -492,6 +494,7 @@ <translation id="1470350905258700113">Bu qurilma ishlatilsin</translation> <translation id="1470946456740188591">Faol kursor rejimini yoqish yoki oʻchirish uchun Ctrl+Search+F7 tugmalaridan foydalaning</translation> <translation id="1472675084647422956">Yana</translation> +<translation id="1473223074251193484">Modem rejimi konfiguratsiyasini sozlash</translation> <translation id="1474785664565228650">Mikrofon sozlamasi oʻzgarishi uchun Parallels Desktopni qaytadan ishga tushiring Davom etish uchun Parallels Desktopni qayta ishga tushiring.</translation> <translation id="1474893630593443211">Chiqadigan reklamani kengroq boshqarish</translation> <translation id="1475502736924165259">Sizda quyidagi turkumlardan hech qaysiga to‘g‘ri kelmaydigan sertifikatlar mavjud</translation> @@ -1112,6 +1115,7 @@ <translation id="2044014337866019681">Bu seansni qulfdan chiqarish uchun <ph name="ACCOUNT" /> hisobidan kiring.</translation> <translation id="204497730941176055">Microsoft sertifikati andozasi nomi</translation> <translation id="2045117674524495717">Tezkor tugmalar yordamchisi</translation> +<translation id="2045211794962848221">Bu maxsus xabar boshqa chiqmaydi</translation> <translation id="2045969484888636535">Cookie-fayllari saqlanishini doim bloklash</translation> <translation id="204622017488417136">Qurilmangiz Chrome’ning avvalgi versiyasiga qaytariladi. Barcha foydalanuvchilar hisoblari va mahalliy ma’lumotlar o‘chib ketadi. Buni ortga qaytarib bo‘lmaydi.</translation> <translation id="2046702855113914483">Ramyon</translation> @@ -3801,6 +3805,7 @@ <translation id="4594577641390224176">Tizim haqida sahifasini qidiryapsizmi? Bu sahifaga kiring</translation> <translation id="4595560905247879544">Ilovalar va kengaytmalarni faqat boshqaruvchi (<ph name="CUSTODIAN_NAME" />) o‘zgartira oladi.</translation> <translation id="4596295440756783523">Sizda quyidagi serverlar haqiqiyligini tasdiqlovchi sertifikatlar bor</translation> +<translation id="4598345735110653698">Kodlarni boshqarish</translation> <translation id="4598556348158889687">Xotira boshqaruvi</translation> <translation id="4598776695426288251">Bir nechta qurilmalar tarqatayotgan Wi-Fi tarmoqlar mavjud</translation> <translation id="4601426376352205922">Oʻqilmagan deb belgilash</translation> @@ -4026,6 +4031,7 @@ <translation id="4823894915586516138">Bu PIN kod yoki parol <ph name="DEVICE_TYPE" /> qurilmangizdagi maʼlumotlar, jumladan telefon orqali ochiladigan barcha axborotlarni himoyalaydi</translation> <translation id="4824037980212326045">Linux tizimini zaxiralash va tiklash</translation> <translation id="4824958205181053313">Sinxronizatsiya bekor qilinsinmi?</translation> +<translation id="4825532258163983651">Kod oʻchmadi</translation> <translation id="4827675678516992122">Ulanmadi</translation> <translation id="4827784381479890589">Chrome brauzeridagi kengaytirilgan imlo tekshiruvi (imlo tekshiruvi takliflari chiqishi uchun matnlar Googlega yuboriladi)</translation> <translation id="4827904420700932487">Bu rasm uchun QR kod yaratish</translation> @@ -4288,6 +4294,7 @@ <translation id="5087249366037322692">Tashqi ta’minotchi tomonidan qo‘shilgan</translation> <translation id="5087580092889165836">Yangi karta qo‘shish</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 algoritmli RSA shifrlash</translation> +<translation id="5089763948477033443">Yon panel oʻlcham dastagi</translation> <translation id="5090637338841444533">Kamerangiz joylashuvini kuzatish taqiqlangan</translation> <translation id="5093569275467863761">Inkognito rejimida orqaga qaytarilgan kesh subfreymi: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">Mos keladigan fayllarni bu ilova bilan Fayllar yoki boshqa ilovalar orqali ochishingiz va tahrirlashingiz mumkin. Bu ilova bilan standart holatda qaysi ilovalar ochilishini boshqarish uchun <ph name="BEGIN_LINK" />qurilmangizda standart ilovalarni sozlash haqida batafsil axborot oling<ph name="END_LINK" />.</translation> @@ -4453,6 +4460,7 @@ <translation id="5258992782919386492">Shu qurilmaga oʻrnatish</translation> <translation id="5260334392110301220">Smart iqtiboslar</translation> <translation id="5260508466980570042">Noto‘g‘ri elektron pochta yoki parol kiritdingiz. Qayta urinib ko‘ring.</translation> +<translation id="5260958083445173099">Saytlar kontentlarni iloji boricha afzal tillaringizda chiqaradi.</translation> <translation id="5261683757250193089">Chrome internet-do‘konida ochish</translation> <translation id="5262178194499261222">Parolni olib tashlash</translation> <translation id="5262784498883614021">Tarmoqqa avtomatik ulanish</translation> @@ -4493,6 +4501,7 @@ <translation id="5294097441441645251">Faqat kichik harf yoki ostki chiziq bilan boshlansin</translation> <translation id="5294618183559481278"><ph name="DEVICE_TYPE" /> qurilmangiz oldidagi odamlarni aniqlash uchun ichki sensordan foydalanadi. Barcha maʼlumotlar tezda qurilmangizda qayta ishlanadi va oʻchirib tashlanadi. Sensor maʼlumotlari hech qachon Googlega yuborilmaydi. <ph name="LINK_BEGIN" />Batafsil<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Oʻqib eshittirish orqali qurilmadan ekranga qaramay foydalanish mumkin. Ulangan qurilmada brayl aloqasi ishlaydi.</translation> +<translation id="5297005732522718715">Modem rejimi konfiguratsiyasini yangilash</translation> <translation id="5297082477358294722">Parol saqlandi. <ph name="SAVED_PASSWORDS_STORE" /> omboridagi saqlangan parollarni ko‘rish va boshqarish.</translation> <translation id="5297946558563358707">Biror kishi ekraningizga qarasa, ekranning pastki oʻng burchagida koʻz belgisi chiqadi</translation> <translation id="5298219193514155779">Mavzu muallifi:</translation> @@ -4663,11 +4672,13 @@ <translation id="5466374726908360271">Joyla&sh va qidirish: <ph name="SEARCH_TERMS" /></translation> <translation id="5467207440419968613">Bloklandi: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation> <translation id="5468173180030470402">Umumiy jildlar qidirilmoqda</translation> +<translation id="5468330507528805311">Modem rejimi holati:</translation> <translation id="5468881191994555667">Faylni tanlash</translation> <translation id="5469852975082458401">Sahifalarni matn kursori bilan kezish mumkin. Rejimdan chiqish uchun F7 tugmasini bosing.</translation> <translation id="5470735824776589490">Powerwash yordamida dastlabki sozlamarini tiklashdan oldin qurilmani qaytadan ishga tushirish kerak. <ph name="LINK_BEGIN" />Batafsil<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Salom! Men sizga matnni nutqqa aylantirib beraman.</translation> <translation id="5472627187093107397">Bu sayt parollarini saqlash</translation> +<translation id="5473062644742711742">Chrome Web Store orqali maxsus qulay vositalarni toping</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">Davom etish orqali siz bu qurilma Google, aloqa operatoringiz va qurilma ishlab chiqaruvchisidan dasturiy yangilanish va ilovalarni mobil internet orqali ham avtomatik ravishda yuklab olishi va oʻrnatishiga rozilik bildirgan hisoblanasiz. Ayrim ilovalar ichki xaridlarni ham taklif etishi mumkin.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{PIN kod kamida bitta belgidan iborat boʻlsin}other{PIN kod kamida # ta belgidan iborat boʻlsin}}</translation> @@ -4939,6 +4950,7 @@ <translation id="5734362860645681824">Uskunalar</translation> <translation id="5734697361979786483">Fayllarni ulashish sozlamasini kiritish</translation> <translation id="5736796278325406685">Yaroqli foydalanuvchi nomini kiriting.</translation> +<translation id="5738093759615225354">Bu kod kompyuterga kirish uchun kerak</translation> <translation id="5739017626473506901"><ph name="USER_NAME" /> maktab hisobini kiritishiga yordam berish uchun hisobingizga kiring</translation> <translation id="5739235828260127894">Tasdiqlanishi zarur. <ph name="LINK_BEGIN" />Batafsil axborot.<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Juda katta</translation> @@ -5100,6 +5112,7 @@ <translation id="589541317545606110">Sahifadan <ph name="VISUAL_SEARCH_PROVIDER" /> orqali qidirish</translation> <translation id="5896436821193322561">Rad etish</translation> <translation id="5900186025777217044">Smart Lock oʻzgardi</translation> +<translation id="5900243355162006650">Modem rejimi konfiguratsiyasi:</translation> <translation id="5900302528761731119">Google profili rasmi</translation> <translation id="590036993063074298">Translatsiya sifati tafsilotlari</translation> <translation id="5901069264981746702">Barmoq izlaringiz yaxshi himoya ostida va faqat <ph name="DEVICE_TYPE" /> qurilmangizda saqlanadi. <ph name="LINK_BEGIN" />Batafsil<ph name="LINK_END" /></translation> @@ -5403,6 +5416,7 @@ <translation id="6196640612572343990">Tashqi cookie-fayllarni bloklash.</translation> <translation id="6196854373336333322">“<ph name="EXTENSION_NAME" />” kengaytmasi proksi-server sozlamalarini nazorat qiladi. U internetda bajargan ishlaringizni o‘zgartirishi, buzishi yoki bildirmasdan eshitishi mumkin. Agar bu haqda eshitmagan bo‘lsangiz, uni o‘chirib qo‘yganingiz yaxshi.</translation> <translation id="6197128521826316819">Bu sahifa uchun QR kod yaratish</translation> +<translation id="6197223946499512637">Kalitlar shu kompyuterdagi Windows Hello xizmatiga saqlanadi. Ular Google hisobiga saqlanmaydi.</translation> <translation id="6198252989419008588">PIN-kodni o‘zgartirish</translation> <translation id="6200047250927636406">Faylni yopish</translation> <translation id="6200151268994853226">Kengaytmalar boshqaruvi</translation> @@ -5700,6 +5714,7 @@ <translation id="6482559668224714696">Butun ekran rejimidagi lupa</translation> <translation id="6483485061007832714">Yuklanmani ochish</translation> <translation id="6483805311199035658"><ph name="FILE" /> ochilmoqda...</translation> +<translation id="6486301003991593638">Kodlarni boshqarish uchun Windows tizimining yangiroq versiyasidan foydalaning</translation> <translation id="6488384360522318064">Tilni tanlash</translation> <translation id="648927581764831596">Mavjud emas</translation> <translation id="6490471652906364588">USB-C qurilma (o‘ng port)</translation> @@ -6286,6 +6301,7 @@ <translation id="7029307918966275733">Crostini oʻrnatilmadi. Mualliflarni koʻrish uchun Crostini tizimini oʻrnating.</translation> <translation id="7029809446516969842">Parollar</translation> <translation id="7030304022046916278">URL manzillarni Saytlarni xavfsiz kezish tizimi tekshiruviga yuboradi</translation> +<translation id="7030695672997239647">Varaq ustida oʻng klikni bosib, avval “Varaqni guruhga kiritish” bandini, keyin esa “Yangi guruh” bandini tanlang</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> – Seriyali portga ulangan</translation> <translation id="7033616203784997570">Maksimal 62 ta belgi kiritish mumkin</translation> <translation id="7034692021407794547">Hisob-kitobni boshqarish vakolatiga ega administrator avval Administrator konsoli orqali Google Meet qurilmalari boʻlimida Google Meet qurilmalari xizmat shartlarini qabul qilishi lozim.</translation> @@ -7386,6 +7402,7 @@ <translation id="8101987792947961127">Qurilmani keyingi marta qayta ishga tushirishda Powerwash amali bajarilishi kerak</translation> <translation id="81020759409809034">Qurilmadagi jild</translation> <translation id="8102139037507939978">Shaxsni aniqlash maʼlumotlarini system_logs.txt faylidan chiqarib tashlash.</translation> +<translation id="810362914482827094">Kodlarni qidirish</translation> <translation id="8104088837833760645">eSIM profilini yuklab olish</translation> <translation id="8105368624971345109">O‘chirib qo‘yish</translation> <translation id="8107015733319732394">Google Market <ph name="DEVICE_TYPE" /> qurilmangizga o‘rnatilmoqda. Bu bir necha daqiqa oladi.</translation> @@ -7833,6 +7850,7 @@ <translation id="8557022314818157177">Barmoq izi yozib olinguncha elektron kalitga teginib turing</translation> <translation id="8557180006508471423">Mac qurilmangizda “Location Services” orqali “Google Chrome” brauzerini yoqing</translation> <translation id="8557856025359704738">Keyingi yuklab olish sanasi: <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">Kodlar</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Barchasini &yangi oynada ochish}=1{&Yangi oynada ochish}other{Barchasini ({COUNT}) &yangi oynada ochish}}</translation> <translation id="8561206103590473338">Fil</translation> <translation id="8561565784790166472">Ehtiyotkorlik bilan davom eting</translation> @@ -7959,6 +7977,7 @@ <translation id="8677212948402625567">Barchasini yig‘ish...</translation> <translation id="867767487203716855">Keyingi yangilanish</translation> <translation id="8677859815076891398">Albomlar mavjud emas. <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" /> orqali albom yarating.</translation> +<translation id="8678378565142776698">Qayta ishga tushiring va avtomatik yangilanishlarni oling</translation> <translation id="8678538439778360739">Maʼlumotlaringiz <ph name="TIME" /> sanasida kodli ibora bilan shifrlangan. Google Pay manzillari va toʻlov usullari esa shifrlanmagan.</translation> <translation id="8678582529642151449">Varaqlar kichraymaydi</translation> <translation id="8678933587484842200">Bu ilova qanday ishga tushirilsin?</translation> @@ -8205,6 +8224,7 @@ <translation id="8910987510378294980">Qurilmalar roʻyxatini berkitish</translation> <translation id="8912362522468806198">Google hisobi</translation> <translation id="8912810933860534797">Avtomatik skanerlashni yoqish</translation> +<translation id="8915307125957890427">Varaq ustida oʻng klikni bosib, avval “Varaqni guruhga kiritish” bandini, keyin esa “Yangi guruh” bandini tanlang</translation> <translation id="8915370057835397490">Taklif yuklanmoqda</translation> <translation id="8916476537757519021">Inkognito rejimidagi quyi freym: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> (<ph name="GIVEN_NAME" />)</translation> @@ -8279,6 +8299,7 @@ <translation id="8986362086234534611">Olib tashlash</translation> <translation id="8986494364107987395">Foydalanish statistikasi va ishdan chiqishlar hisobotini avtomatik ravishda Google‘ga jo‘natish</translation> <translation id="8987927404178983737">Oy</translation> +<translation id="8989359959810288806">Modem rejimi holatini yangilash</translation> <translation id="8991520179165052608">Sayt mikrofondan foydalanishi mumkin</translation> <translation id="899384117894244799">Cheklangan foydalanuvchini olib tashlash</translation> <translation id="899403249577094719">Netscape sertifikatlar omborining URL manzili</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 270e576..bfd5624 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Sử dụng micrô và máy ảnh của bạn</translation> <translation id="1005333234656240382">Bật tùy chọn gỡ lỗi ADB?</translation> <translation id="1006873397406093306">Tiện ích này có thể đọc và thay đổi dữ liệu của bạn trên các trang web. Bạn có thể kiểm soát việc tiện ích có thể truy cập vào các trang web nào.</translation> +<translation id="1007057452468855774">Bật Cửa hàng Google Play</translation> <translation id="1008186147501209563">Xuất dấu trang</translation> <translation id="1008557486741366299">Để sau</translation> <translation id="1009476156254802388">Vị trí của <ph name="WEB_DRIVE" /></translation> <translation id="1009663062402466586">Đã có chế độ điều khiển trò chơi</translation> <translation id="1010498023906173788">Thẻ này đã kết nối với một cổng nối tiếp.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Trang không phản hồi}other{Trang không phản hồi}}</translation> +<translation id="1011003645819296594">Thiết bị đã lưu</translation> <translation id="1011355516189274711">Âm lượng giọng nói của tính năng chuyển văn bản sang lời nói</translation> <translation id="1012794136286421601">Các tệp Google Tài liệu, Trang tính, Trang trình bày và Bản vẽ của bạn đang được đồng bộ hóa. Mở ứng dụng Google Drive để truy cập chúng trực tuyến hoặc ngoại tuyến.</translation> <translation id="1012876632442809908">Thiết bị USB-C (cổng phía trước)</translation> @@ -494,6 +496,7 @@ <translation id="1470350905258700113">Sử dụng thiết bị này</translation> <translation id="1470946456740188591">Để bật hoặc tắt tính năng duyệt web có con nháy, hãy dùng phím tắt Ctrl+Search+7</translation> <translation id="1472675084647422956">Hiện thêm</translation> +<translation id="1473223074251193484">Thiết lập cấu hình chia sẻ Internet</translation> <translation id="1474785664565228650">Bạn cần chạy lại ứng dụng Parallels Desktop để thay đổi tùy chọn cài đặt micrô. Hãy chạy lại ứng dụng Parallels Desktop để tiếp tục.</translation> <translation id="1474893630593443211">Tăng khả năng kiểm soát quảng cáo bạn thấy</translation> <translation id="1475502736924165259">Bạn có các chứng chỉ trên tệp không phù hợp với bất kỳ danh mục nào khác</translation> @@ -906,6 +909,7 @@ <translation id="1829129547161959350">Chim cánh cụt</translation> <translation id="1829192082282182671">Thu &nhỏ</translation> <translation id="1830550083491357902">Chưa đăng nhập</translation> +<translation id="1831848493690504725">Chúng tôi không thể kết nối với Google thông qua mạng được kết nối. Hãy thử chọn một mạng khác hoặc kiểm tra chế độ cài đặt mạng hoặc chế độ cài đặt proxy của bạn (nếu bạn đang sử dụng proxy).</translation> <translation id="1832459821645506983">Có, tôi đồng ý</translation> <translation id="1832511806131704864">Đã cập nhật thay đổi điện thoại</translation> <translation id="1832848789136765277">Hãy xác minh danh tính để đảm bảo bạn luôn có thể truy cập vào dữ liệu đã đồng bộ</translation> @@ -1124,6 +1128,7 @@ <translation id="2044014337866019681">Để mở khóa phiên này, hãy đảm bảo rằng bạn đang xác minh <ph name="ACCOUNT" />.</translation> <translation id="204497730941176055">Tên Mẫu Chứng chỉ của Microsoft</translation> <translation id="2045117674524495717">Trình trợ giúp phím tắt</translation> +<translation id="2045211794962848221">Bạn sẽ không thấy thông báo cụ thể này nữa</translation> <translation id="2045969484888636535">Tiếp tục chặn cookie</translation> <translation id="204622017488417136">Thiết bị của bạn sẽ được quay lại phiên bản Chrome đã cài đặt trước đó. Tất cả các tài khoản người dùng và dữ liệu cục bộ sẽ bị xóa. Không thể hoàn tác thao tác này.</translation> <translation id="2046702855113914483">Mỳ tôm</translation> @@ -2208,6 +2213,7 @@ <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="3022361196600037287"><ph name="DEVICE" /> sẽ bị xoá khỏi Chromebook này và sẽ không được lưu vào <ph name="PRIMARY_EMAIL" />.</translation> <translation id="3022978424994383087">Không hiểu được.</translation> <translation id="3023464535986383522">Chọn để nói</translation> <translation id="3024374909719388945">Sử dụng đồng hồ 24 giờ</translation> @@ -3747,6 +3753,7 @@ <translation id="4535127706710932914">Hồ sơ mặc định</translation> <translation id="4535767533210902251">Cảm biến vân tay là phím trên cùng bên phải của bàn phím. Hãy chạm nhẹ ngón tay bất kỳ vào đó.</translation> <translation id="4536140153723794651">Các trang web luôn có thể dùng cookie</translation> +<translation id="4536769240747010177">Các chức năng chia sẻ Internet:</translation> <translation id="4538417792467843292">Xóa từ</translation> <translation id="4538792345715658285">Được cài đặt theo chính sách doanh nghiệp.</translation> <translation id="4541123282641193691">Không thể xác minh tài khoản của bạn. Vui lòng thử lại hoặc khởi động lại Chromebook.</translation> @@ -3774,8 +3781,9 @@ <translation id="4561893854334016293">Bạn chưa thay đổi quyền nào gần đây</translation> <translation id="4562155214028662640">Thêm vân tay</translation> <translation id="4563210852471260509">Ngôn ngữ nhập vào ban đầu là tiếng Trung</translation> +<translation id="4563382028841851106">Xoá khỏi tài khoản</translation> <translation id="4563880231729913339">Ngón tay số 3</translation> -<translation id="4564245002465020751">Hoàn tất cài đặt trên điện thoại của bạn.</translation> +<translation id="4564245002465020751">Hoàn tất quá trình thiết lập điện thoại của bạn.</translation> <translation id="4565377596337484307">Ẩn mật khẩu</translation> <translation id="4565917129334815774">Lưu trữ nhật ký hệ thống</translation> <translation id="4566170377336116390">Nếu muốn chuyển đổi sau khi đăng ký, bạn sẽ phải đặt lại thiết bị về trạng thái ban đầu (powerwash).</translation> @@ -3810,6 +3818,7 @@ <translation id="4594577641390224176">Bạn đang tìm hệ thống giới thiệu trang? Hãy truy cập</translation> <translation id="4595560905247879544">Chỉ người quản lý mới có thể sửa đổi ứng dụng và tiện ích (<ph name="CUSTODIAN_NAME" />).</translation> <translation id="4596295440756783523">Bạn có các chứng chỉ trên tệp có thể nhận dạng các máy chủ này</translation> +<translation id="4598345735110653698">Quản lý mã xác thực</translation> <translation id="4598556348158889687">Quản lý bộ nhớ</translation> <translation id="4598776695426288251">Wi-Fi khả dụng qua nhiều thiết bị</translation> <translation id="4601426376352205922">Đánh dấu là chưa đọc</translation> @@ -4035,6 +4044,7 @@ <translation id="4823894915586516138">Mã PIN hoặc mật khẩu này bảo vệ dữ liệu của bạn trên <ph name="DEVICE_TYPE" /> này, bao gồm mọi thông tin bạn truy cập từ điện thoại của mình</translation> <translation id="4824037980212326045">Sao lưu và khôi phục Linux</translation> <translation id="4824958205181053313">Bạn muốn hủy đồng bộ hóa?</translation> +<translation id="4825532258163983651">Không thể xoá mã xác thực</translation> <translation id="4827675678516992122">Không thể kết nối</translation> <translation id="4827784381479890589">Tính năng kiểm tra lỗi chính tả nâng cao trong trình duyệt Chrome (văn bản sẽ được gửi đến Google để đưa ra các đề xuất chính tả)</translation> <translation id="4827904420700932487">Tạo mã QR cho Hình ảnh này</translation> @@ -4297,6 +4307,7 @@ <translation id="5087249366037322692">Được thêm bởi bên thứ ba</translation> <translation id="5087580092889165836">Thêm thẻ</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 Với Mã hóa RSA</translation> +<translation id="5089763948477033443">Ô điều khiển thay đổi kích thước của bảng điều khiển bên</translation> <translation id="5090637338841444533">Không được phép theo dõi vị trí máy ảnh của bạn</translation> <translation id="5093569275467863761">Khung phụ ẩn danh lưu trong bộ nhớ đệm cho thao tác tiến/lùi: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">Bạn có thể dùng ứng dụng này trên ứng dụng Files hoặc các ứng dụng khác để mở và chỉnh sửa các tệp được hỗ trợ. Để kiểm soát loại tệp mở được ứng dụng này theo mặc định, hãy <ph name="BEGIN_LINK" />tìm hiểu cách đặt ứng dụng mặc định trên thiết bị<ph name="END_LINK" />.</translation> @@ -4462,6 +4473,7 @@ <translation id="5258992782919386492">Cài đặt trên thiết bị này</translation> <translation id="5260334392110301220">Dấu ngoặc kép thông minh</translation> <translation id="5260508466980570042">Rất tiếc, không thể xác minh được email hoặc mật khẩu của bạn. Vui lòng thử lại.</translation> +<translation id="5260958083445173099">Các trang web sẽ hiển thị nội dung bằng ngôn ngữ mà bạn ưu tiên sử dụng, khi có thể</translation> <translation id="5261683757250193089">Mở trong Cửa hàng trực tuyến</translation> <translation id="5262178194499261222">Xóa mật khẩu</translation> <translation id="5262784498883614021">Tự động kết nối mạng</translation> @@ -4502,6 +4514,7 @@ <translation id="5294097441441645251">Phải bắt đầu bằng ký tự viết thường hoặc dấu gạch dưới</translation> <translation id="5294618183559481278"><ph name="DEVICE_TYPE" /> của bạn dùng một cảm biến tích hợp sẵn để phát hiện người ở đối diện thiết bị. Mọi dữ liệu đều được xử lý ngay trên thiết bị và sau đó sẽ được xoá. Dữ liệu cảm biến không bao giờ được gửi cho Google. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Nghe phản hồi bằng giọng nói để sử dụng thiết bị mà không cần nhìn vào màn hình. Bạn có thể xem phản hồi bằng chữ nổi qua thiết bị đã kết nối.</translation> +<translation id="5297005732522718715">Làm mới cấu hình chia sẻ Internet</translation> <translation id="5297082477358294722">Đã lưu mật khẩu. Hãy xem và quản lý mật khẩu đã lưu trong <ph name="SAVED_PASSWORDS_STORE" /> của bạn.</translation> <translation id="5297946558563358707">Khi ai đó nhìn vào màn hình của bạn, hãy làm hiện biểu tượng con mắt Quyền riêng tư ở góc dưới cùng bên phải màn hình</translation> <translation id="5298219193514155779">Chủ đề được tạo bởi</translation> @@ -4672,6 +4685,7 @@ <translation id="5466374726908360271">Dá&n và tìm kiếm “<ph name="SEARCH_TERMS" />”</translation> <translation id="5467207440419968613">Đã chặn <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation> <translation id="5468173180030470402">Đang tìm mục chia sẻ tệp</translation> +<translation id="5468330507528805311">Trạng thái chia sẻ Internet:</translation> <translation id="5468881191994555667">Chọn tệp</translation> <translation id="5469852975082458401">Bạn có thể di chuyển giữa các trang bằng con trỏ văn bản. Hãy nhấn F7 để tắt.</translation> <translation id="5470735824776589490">Bạn cần khởi động lại trước khi có thể đặt lại thiết bị của mình bằng Powerwash. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation> @@ -4750,6 +4764,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" /> muốn</translation> <translation id="5534304873398226603">Hủy ảnh hoặc video</translation> <translation id="5537725057119320332">Truyền</translation> +<translation id="5539070192556911367">Không thể kết nối với Google</translation> <translation id="5539221284352502426">Mật khẩu bạn nhập đã bị máy chủ từ chối. Các lý do có thể bao gồm: Mật khẩu quá ngắn. Mật khẩu phải chứa chữ số hoặc biểu tượng. Mật khẩu phải khác với mật khẩu cũ.</translation> <translation id="5541694225089836610">Quản trị viên đã vô hiệu hóa thao tác này</translation> <translation id="5542132724887566711">Tiểu sử</translation> @@ -4813,6 +4828,7 @@ <translation id="5585912436068747822">Định dạng không thành công</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">Đang tải ứng dụng...</translation> +<translation id="5590418976913374224">Phát âm thanh khi khởi động thiết bị</translation> <translation id="5592595402373377407">Chưa có đủ dữ liệu.</translation> <translation id="5595307023264033512">Tổng bộ nhớ mà các trang web sử dụng: <ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">Chỉnh sửa địa chỉ</translation> @@ -4946,6 +4962,7 @@ <translation id="5734362860645681824">Truyền thông</translation> <translation id="5734697361979786483">Thêm mục chia sẻ tệp</translation> <translation id="5736796278325406685">Vui lòng nhập tên người dùng hợp lệ</translation> +<translation id="5738093759615225354">Bạn cần mã xác thực này để đăng nhập vào máy tính của mình</translation> <translation id="5739017626473506901">Đăng nhập để giúp <ph name="USER_NAME" /> thêm tài khoản trường học</translation> <translation id="5739235828260127894">Đang chờ xác minh. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Rất lớn</translation> @@ -5107,6 +5124,7 @@ <translation id="589541317545606110">Tìm trên trang bằng <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">Không cho phép</translation> <translation id="5900186025777217044">Smart Lock đã thay đổi</translation> +<translation id="5900243355162006650">Cấu hình chia sẻ Internet:</translation> <translation id="5900302528761731119">Ảnh hồ sơ trên Google</translation> <translation id="590036993063074298">Thông tin chi tiết về chất lượng phản chiếu</translation> <translation id="5901069264981746702">Dữ liệu vân tay được lưu trữ an toàn và chỉ có trên <ph name="DEVICE_TYPE" /> của bạn. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation> @@ -5410,6 +5428,7 @@ <translation id="6196640612572343990">Chặn cookie của bên thứ ba</translation> <translation id="6196854373336333322">Tiện ích "<ph name="EXTENSION_NAME" />" đã chiếm quyền kiểm soát cài đặt proxy của bạn, điều đó có nghĩa là tiện ích này có thể thay đổi, làm gián đoạn hoặc nghe trộm bất kỳ điều gì bạn thực hiện trực tuyến. Nếu bạn không chắc chắn về lý do thay đổi này diễn ra, bạn có thể không cần tiện ích này.</translation> <translation id="6197128521826316819">Tạo mã QR cho Trang này</translation> +<translation id="6197223946499512637">Các mã xác thực này được lưu trữ trong Windows Hello trên máy tính này. Các mã này không được lưu vào Tài khoản Google của bạn.</translation> <translation id="6198252989419008588">Thay đổi mã PIN</translation> <translation id="6200047250927636406">Loại bỏ tệp</translation> <translation id="6200151268994853226">Quản lý tiện ích</translation> @@ -5707,6 +5726,7 @@ <translation id="6482559668224714696">Phóng to toàn màn hình</translation> <translation id="6483485061007832714">Mở tệp đã tải xuống</translation> <translation id="6483805311199035658">Đang mở <ph name="FILE" />...</translation> +<translation id="6486301003991593638">Để quản lý mã xác thực, hãy sử dụng phiên bản Windows mới hơn</translation> <translation id="6488384360522318064">Chọn ngôn ngữ</translation> <translation id="648927581764831596">Không có</translation> <translation id="6490471652906364588">Thiết bị USB-C (cổng bên phải)</translation> @@ -6190,6 +6210,10 @@ <translation id="6943939122536910181">Đã ngắt kết nối khỏi <ph name="DEVICE" /></translation> <translation id="6945221475159498467">Chọn</translation> <translation id="694592694773692225">Đã chặn chuyển hướng trên trang này.</translation> +<translation id="6947015141909171112">Bạn đang xem các công thức nấu ăn dựa trên Hoạt động tìm kiếm công thức nấu ăn gần đây của bạn. + <ph name="BREAK" /> + <ph name="BREAK" /> + Bạn có thể quản lý chế độ cài đặt qua trình đơn thẻ hoặc xem tuỳ chọn khác trong phần Tuỳ chỉnh Chrome.</translation> <translation id="6949434160682548041">Mật khẩu (không bắt buộc)</translation> <translation id="6950627417367801484">Khôi phục ứng dụng</translation> <translation id="6952242901357037157">Bạn cũng có thể hiển thị các mật khẩu trong <ph name="BEGIN_LINK" />Tài khoản Google<ph name="END_LINK" /> tại đây</translation> @@ -6289,6 +6313,7 @@ <translation id="7029307918966275733">Chưa cài đặt Crostini. Vui lòng cài đặt Crostini để xem thông tin về người đóng góp.</translation> <translation id="7029809446516969842">Mật khẩu</translation> <translation id="7030304022046916278">Gửi URL để tính năng Duyệt web an toàn kiểm tra</translation> +<translation id="7030695672997239647">Nhấp chuột phải vào một thẻ rồi chọn "Thêm thẻ vào nhóm", sau đó chọn "Nhóm mới"</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> – Đã kết nối với cổng nối tiếp</translation> <translation id="7033616203784997570">Dữ liệu nhập chỉ được dài tối đa 62 ký tự</translation> <translation id="7034692021407794547">Trước tiên, một quản trị viên có đặc quyền Quản lý thanh toán phải chấp nhận Điều khoản dịch vụ dành cho Thiết bị Google Meet trong phần Thiết bị Google Meet của Bảng điều khiển dành cho quản trị viên.</translation> @@ -6357,6 +6382,7 @@ <translation id="7102687220333134671">Tính năng tự động cập nhật đã được bật</translation> <translation id="7102832101143475489">Yêu cầu đã hết giờ</translation> <translation id="710640343305609397">Mở tùy chọn cài đặt mạng</translation> +<translation id="7107609441453408294">Phát cùng một âm thanh qua tất cả các loa</translation> <translation id="7108338896283013870">Ẩn</translation> <translation id="7108668606237948702">nhập</translation> <translation id="7108933416628942903">Khóa ngay</translation> @@ -6587,6 +6613,7 @@ <translation id="7364745943115323529">Truyền...</translation> <translation id="7364796246159120393">Chọn tệp</translation> <translation id="7365076891350562061">Kích thước màn hình</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" /> – Đã ghim</translation> <translation id="7366316827772164604">Đang quét tìm thiết bị ở gần...</translation> <translation id="7366415735885268578">Thêm trang web</translation> <translation id="7366909168761621528">Dữ liệu duyệt web</translation> @@ -6983,6 +7010,7 @@ <translation id="7737115349420013392">Đang ghép nối với "<ph name="DEVICE_NAME" />"...</translation> <translation id="7737846262459425222">Bạn có thể thay đổi tính năng này bất kỳ lúc nào trong phần Cài đặt > Trợ lý Google > Ngữ cảnh trên màn hình.</translation> <translation id="7737948071472253612">Không được phép sử dụng máy ảnh của bạn</translation> +<translation id="77381465218432215">Hiển thị dấu phụ và ký tự đặc biệt</translation> <translation id="7740996059027112821">Chuẩn</translation> <translation id="7741307896921365578">Bật một bảng điều khiển bên trên trình duyệt để bạn dễ dàng và thuận tiện truy cập vào Danh sách đọc và Dấu trang.</translation> <translation id="7742558784808143689">Xóa tất cả dữ liệu trang web và quyền của <ph name="SITE_NAME" />, cũng như mọi trang web thuộc nhóm này và các ứng dụng đã cài đặt?</translation> @@ -7388,6 +7416,7 @@ <translation id="8101987792947961127">Yêu cầu Powerwash trong lần khởi động lại tiếp theo</translation> <translation id="81020759409809034">Vị trí cục bộ trên thiết bị</translation> <translation id="8102139037507939978">Xóa thông tin nhận dạng cá nhân khỏi tệp system_logs.txt.</translation> +<translation id="810362914482827094">Tìm kiếm mã xác thực</translation> <translation id="8104088837833760645">Tải hồ sơ eSIM xuống</translation> <translation id="8105368624971345109">Tắt</translation> <translation id="8107015733319732394">Đang cài đặt Cửa hàng Google Play trên <ph name="DEVICE_TYPE" /> của bạn. Quá trình này có thể mất vài phút.</translation> @@ -7773,6 +7802,7 @@ <translation id="8486666913807228950">Lý do: Tìm thấy quy tắc nghịch đảo <ph name="REVERT_RULE" /> trong danh sách "Buộc mở trong".</translation> <translation id="848666842773560761">Một ứng dụng đang cố truy cập vào máy ảnh. Hãy tắt nút quyền riêng tư khi dùng máy ảnh để cho phép ứng dụng đó truy cập.</translation> <translation id="8487678622945914333">Phóng To</translation> +<translation id="8487699605742506766">Điểm phát sóng</translation> <translation id="8489156414266187072">Nội dung đề xuất cá nhân chỉ hiển thị trên tài khoản của bạn</translation> <translation id="8490896350101740396">Các ứng dụng kiosk sau đây "<ph name="UPDATED_APPS" />" đã được cập nhật. Hãy khởi động lại thiết bị để hoàn tất quá trình cập nhật.</translation> <translation id="8492685019009920170">Dùng ngón tay chạm vào cảm biến vân tay. Dữ liệu vân tay được lưu trữ an toàn và chỉ có trên chiếc <ph name="DEVICE_TYPE" /> của bạn.</translation> @@ -7834,6 +7864,7 @@ <translation id="8557022314818157177">Chạm liên tục vào khóa bảo mật cho đến khi thiết bị ghi lại vân tay của bạn</translation> <translation id="8557180006508471423">Hãy bật "Google Chrome" trong mục cài đặt Dịch vụ vị trí (Location Services) trên máy Mac của bạn</translation> <translation id="8557856025359704738">Lượt tải xuống tiếp theo bắt đầu vào <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">Mã xác thực</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Mở tất cả trong cửa sổ &mới}=1{Mở trong cửa sổ &mới}other{Mở tất cả ({COUNT}) trong cửa sổ &mới}}</translation> <translation id="8561206103590473338">Voi</translation> <translation id="8561565784790166472">Hãy thận trọng nếu tiếp tục</translation> @@ -7960,6 +7991,7 @@ <translation id="8677212948402625567">Thu gọn tất cả...</translation> <translation id="867767487203716855">Thời gian cập nhật tiếp theo</translation> <translation id="8677859815076891398">Không có album nào. Hãy tạo một album trong <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />.</translation> +<translation id="8678378565142776698">Khởi động lại và nhận bản cập nhật tự động</translation> <translation id="8678538439778360739">Dữ liệu đã được mã hóa bằng cụm mật khẩu đồng bộ hóa của bạn vào <ph name="TIME" />. Dữ liệu này không bao gồm địa chỉ và phương thức thanh toán trên Google Pay.</translation> <translation id="8678582529642151449">Thẻ sẽ không thu gọn</translation> <translation id="8678933587484842200">Bạn muốn ứng dụng này khởi động như thế nào?</translation> @@ -8206,6 +8238,7 @@ <translation id="8910987510378294980">Ẩn danh sách thiết bị</translation> <translation id="8912362522468806198">Tài khoản Google</translation> <translation id="8912810933860534797">Bật tính năng tự động quét</translation> +<translation id="8915307125957890427">Nhấp chuột phải vào một thẻ rồi chọn "Thêm thẻ vào nhóm", sau đó chọn "Nhóm mới"</translation> <translation id="8915370057835397490">Đang tải đề xuất</translation> <translation id="8916476537757519021">Khung ẩn danh phụ: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> của <ph name="GIVEN_NAME" /></translation> @@ -8266,6 +8299,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" và 1 thẻ khác}other{"<ph name="TAB_TITLE" />" và # thẻ khác}}</translation> <translation id="8977811652087512276">Mật khẩu không chính xác hoặc tệp lỗi</translation> <translation id="8978154919215542464">Bật - đồng bộ hóa mọi thứ</translation> +<translation id="8978670037548431647">Làm mới các chức năng chia sẻ Internet</translation> <translation id="897939795688207351">Trên <ph name="ORIGIN" /></translation> <translation id="8980345560318123814">Báo cáo phản hồi</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> - Đã bị lỗi</translation> @@ -8279,6 +8313,7 @@ <translation id="8986362086234534611">Quên</translation> <translation id="8986494364107987395">Tự động gửi số liệu thống kê về việc sử dụng và báo cáo sự cố cho Google</translation> <translation id="8987927404178983737">Tháng</translation> +<translation id="8989359959810288806">Làm mới trạng thái chia sẻ Internet</translation> <translation id="8991520179165052608">Trang web có thể sử dụng micrô của bạn</translation> <translation id="899384117894244799">Xóa người dùng bị hạn chế</translation> <translation id="899403249577094719">URL Cơ sở Chứng chỉ Netscape</translation> @@ -8530,6 +8565,7 @@ <translation id="935854577147268200">Đã thay đổi điện thoại Smart Lock. Hãy nhập mật khẩu để cập nhật 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="936646668635477464">Máy ảnh và micrô</translation> <translation id="936801553271523408">Dữ liệu chẩn đoán hệ thống</translation> +<translation id="937053962468712792">Xoá <ph name="DEVICE" /> khỏi <ph name="PRIMARY_EMAIL" />?</translation> <translation id="93766956588638423">Sửa tiện ích</translation> <translation id="938568644810664664">Hãy thử hỏi "Ok Google, đây là bài hát gì?" hoặc "Ok Google, có gì trên màn hình của tôi?"</translation> <translation id="938623846785894166">Tệp bất thường</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index e8efcd9..40c60e7 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -890,6 +890,7 @@ <translation id="1829129547161959350">企鹅</translation> <translation id="1829192082282182671">缩小(&O)</translation> <translation id="1830550083491357902">未登录</translation> +<translation id="1831848493690504725">我们无法通过所连接的网络连接到 Google。请尝试换个网络,或者检查网络设置或代理设置(如果您使用了代理)。</translation> <translation id="1832459821645506983">是的,我同意</translation> <translation id="1832511806131704864">配对手机已更新</translation> <translation id="1832848789136765277">若要确保您能随时访问自己的同步数据,请验证是您本人在操作</translation> @@ -4723,6 +4724,7 @@ <translation id="5533001281916885985"><ph name="SITE_NAME" />想要</translation> <translation id="5534304873398226603">舍弃照片或视频</translation> <translation id="5537725057119320332">投放</translation> +<translation id="5539070192556911367">无法连接到 Google</translation> <translation id="5539221284352502426">您输入的密码被服务器拒绝了。可能的原因包括:此密码太短。此密码必须包含数字或符号,且必须不同于旧密码。</translation> <translation id="5541694225089836610">操作已被您的管理员禁止执行</translation> <translation id="5542132724887566711">个人资料</translation> @@ -4786,6 +4788,7 @@ <translation id="5585912436068747822">格式化失败</translation> <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation> <translation id="558918721941304263">正在加载应用…</translation> +<translation id="5590418976913374224">设备启动时播放声音</translation> <translation id="5592595402373377407">尚无足够的数据。</translation> <translation id="5595307023264033512">网站占用的总存储空间:<ph name="TOTAL_USAGE" /></translation> <translation id="5595485650161345191">修改地址</translation> @@ -6327,6 +6330,7 @@ <translation id="7102687220333134671">已开启自动更新功能</translation> <translation id="7102832101143475489">此请求已超时</translation> <translation id="710640343305609397">打开网络设置</translation> +<translation id="7107609441453408294">在所有音响设备上播放相同的音频</translation> <translation id="7108338896283013870">隐藏</translation> <translation id="7108668606237948702">输入</translation> <translation id="7108933416628942903">立即锁定</translation> @@ -6557,6 +6561,7 @@ <translation id="7364745943115323529">投放…</translation> <translation id="7364796246159120393">选择文件</translation> <translation id="7365076891350562061">显示器上的内容大小</translation> +<translation id="7365995455115045224"><ph name="WINDOW_TITLE" /> - 已固定</translation> <translation id="7366316827772164604">正在搜寻附近的设备…</translation> <translation id="7366415735885268578">添加网站</translation> <translation id="7366909168761621528">浏览数据</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index e0dc73d6..d379619 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -4678,6 +4678,7 @@ <translation id="5470735824776589490">您必須先重新啟動裝置,才能透過執行 Powerwash 重設裝置。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="5471768120198416576">您好!呢個係文字轉語音嘅聲音。</translation> <translation id="5472627187093107397">儲存此網站的密碼</translation> +<translation id="5473062644742711742">在「Chrome 網上應用程式商店」尋找更多無障礙工具</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">如繼續操作,即表示您亦允許此裝置自動下載和安裝來自 Google、您子女的流動網絡供應商和裝置製造商的更新內容和應用程式,當中可能會使用流動數據,部分應用程式可能會提供應用程式內購買。</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{PIN 必須包含至少 1 個字元}other{PIN 必須包含至少 # 個字元}}</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index cac1316..b7aaa8e 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -4661,6 +4661,7 @@ <translation id="5470735824776589490">你必須先重新啟動裝置,才能透過 Powerwash 重設裝置。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="5471768120198416576">你好!這是文字轉語音的語音。</translation> <translation id="5472627187093107397">儲存這個網站的密碼</translation> +<translation id="5473062644742711742">前往 Chrome 線上應用程式商店尋找更多無障礙工具</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">如果選擇繼續,即表示您允許這部裝置自動下載及安裝來自 Google、貴子女的電信業者和裝置製造商的更新內容和應用程式,上述程序可能會使用行動數據。這類應用程式中,有些可能會提供應用程式內購。</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{PIN 碼必須包含至少一個字元}other{PIN 碼必須包含至少 # 個字元}}</translation>
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index b7c58d2..5178ba1 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -1333,6 +1333,9 @@ <message name="IDS_SETTINGS_LANGUAGES_NO_LANGUAGES_ADDED" desc="Placeholder for language list settings when no languages have been added, on the Manage Languages page."> No languages added </message> + <message name="IDS_SETTINGS_TRANSLATE_PAGE_TITLE" desc="Name of the settings page which displays translate preferences."> + Google Translate + </message> <message name="IDS_SETTINGS_LANGUAGES_AUTOMATIC_TRANSLATE" desc="Title of Translation settings that lists languages that should be automatically translated."> Automatically translate these languages </message>
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_TRANSLATE_PAGE_TITLE.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_TRANSLATE_PAGE_TITLE.png.sha1 new file mode 100644 index 0000000..ee60cd7 --- /dev/null +++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_TRANSLATE_PAGE_TITLE.png.sha1
@@ -0,0 +1 @@ +f280eef462829e68b6f1af8fd4b570b572992a8a \ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index e25cb729..5ddc297 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -5525,6 +5525,8 @@ "lacros/standalone_browser_test_controller.h", "lacros/sync/sync_explicit_passphrase_client_lacros.cc", "lacros/sync/sync_explicit_passphrase_client_lacros.h", + "lacros/sync/sync_user_settings_client_lacros.cc", + "lacros/sync/sync_user_settings_client_lacros.h", "lacros/system_logs/lacros_system_log_fetcher.cc", "lacros/system_logs/lacros_system_log_fetcher.h", "lacros/task_manager_lacros.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 9c6d6db..613947c0 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -1111,6 +1111,15 @@ {"Action Chips Enabled with Pedals", kJourneysOmniboxActionWithPedalsParams, std::size(kJourneysOmniboxActionWithPedalsParams), nullptr}, }; +const FeatureEntry::FeatureParam kSidePanelJourneysOpensFromOmniboxParams[] = { + {"SidePanelJourneysOpensFromOmnibox", "true"}, +}; +const FeatureEntry::FeatureVariation + kSidePanelJourneysOpensFromOmniboxVariations[] = { + {"Omnibox opens Side Panel Journeys", + kSidePanelJourneysOpensFromOmniboxParams, + std::size(kSidePanelJourneysOpensFromOmniboxParams), nullptr}, +}; const FeatureEntry::FeatureParam kJourneysLabelsWithEntitiesParams[] = { {"labels_from_entities", "true"}, }; @@ -5533,7 +5542,10 @@ {flag_descriptions::kSidePanelJourneysFlagId, flag_descriptions::kSidePanelJourneysName, flag_descriptions::kSidePanelJourneysDescription, kOsDesktop, - FEATURE_VALUE_TYPE(features::kSidePanelJourneys)}, + FEATURE_WITH_PARAMS_VALUE_TYPE( + features::kSidePanelJourneys, + kSidePanelJourneysOpensFromOmniboxVariations, + "SidePanelJourneys")}, {flag_descriptions::kUnifiedSidePanelFlagId, flag_descriptions::kUnifiedSidePanelName, @@ -7314,13 +7326,6 @@ #endif // BUILDFLAG(IS_CHROMEOS_ASH) #if BUILDFLAG(IS_CHROMEOS_ASH) - {"launcher-pulsing-blocks-refresh", - flag_descriptions::kLauncherPulsingBlocksRefreshName, - flag_descriptions::kLauncherPulsingBlocksRefreshDescription, kOsCrOS, - FEATURE_VALUE_TYPE(ash::features::kLauncherPulsingBlocksRefresh)}, -#endif // BUILDFLAG(IS_CHROMEOS_ASH) - -#if BUILDFLAG(IS_CHROMEOS_ASH) {"mac-address-randomization", flag_descriptions::kMacAddressRandomizationName, flag_descriptions::kMacAddressRandomizationDescription, kOsCrOS, @@ -9003,6 +9008,10 @@ FEATURE_VALUE_TYPE( autofill::features::kAutofillParseVcnCardOnFileStandaloneCvcFields)}, + {"batch-fetch-requests", flag_descriptions::kBatchFetchRequestsName, + flag_descriptions::kBatchFetchRequestsDescription, kOsAll, + FEATURE_VALUE_TYPE(blink::features::kBatchFetchRequests)}, + #if !BUILDFLAG(IS_ANDROID) {"desktop-partial-translate", flag_descriptions::kDesktopPartialTranslateName,
diff --git a/chrome/browser/accessibility/accessibility_ui.cc b/chrome/browser/accessibility/accessibility_ui.cc index a1c0a809..28366584 100644 --- a/chrome/browser/accessibility/accessibility_ui.cc +++ b/chrome/browser/accessibility/accessibility_ui.cc
@@ -19,7 +19,6 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" #include "base/trace_event/trace_event.h" -#include "base/values.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "chrome/browser/profiles/profile.h" @@ -110,7 +109,7 @@ namespace { -std::unique_ptr<base::DictionaryValue> BuildTargetDescriptor( +base::Value::Dict BuildTargetDescriptor( const GURL& url, const std::string& name, const GURL& favicon_url, @@ -118,21 +117,20 @@ int routing_id, ui::AXMode accessibility_mode, base::ProcessHandle handle = base::kNullProcessHandle) { - std::unique_ptr<base::DictionaryValue> target_data( - new base::DictionaryValue()); - target_data->SetIntKey(kProcessIdField, process_id); - target_data->SetIntKey(kRoutingIdField, routing_id); - target_data->SetStringKey(kUrlField, url.spec()); - target_data->SetStringKey(kNameField, base::EscapeForHTML(name)); - target_data->SetIntKey(kPidField, base::GetProcId(handle)); - target_data->SetStringKey(kFaviconUrlField, favicon_url.spec()); - target_data->SetIntKey(kAccessibilityModeField, accessibility_mode.mode()); - target_data->SetStringKey(kTypeField, kPage); + base::Value::Dict target_data; + target_data.Set(kProcessIdField, process_id); + target_data.Set(kRoutingIdField, routing_id); + target_data.Set(kUrlField, url.spec()); + target_data.Set(kNameField, base::EscapeForHTML(name)); + target_data.Set(kPidField, static_cast<int>(base::GetProcId(handle))); + target_data.Set(kFaviconUrlField, favicon_url.spec()); + target_data.Set(kAccessibilityModeField, + static_cast<int>(accessibility_mode.mode())); + target_data.Set(kTypeField, kPage); return target_data; } -std::unique_ptr<base::DictionaryValue> BuildTargetDescriptor( - content::RenderViewHost* rvh) { +base::Value::Dict BuildTargetDescriptor(content::RenderViewHost* rvh) { TRACE_EVENT1("accessibility", "BuildTargetDescriptor", "render_view_host", rvh); content::WebContents* web_contents = @@ -165,29 +163,24 @@ } #if !BUILDFLAG(IS_ANDROID) -std::unique_ptr<base::DictionaryValue> BuildTargetDescriptor(Browser* browser) { - std::unique_ptr<base::DictionaryValue> target_data( - new base::DictionaryValue()); - target_data->SetIntKey(kSessionIdField, browser->session_id().id()); - target_data->SetStringKey(kNameField, - browser->GetWindowTitleForCurrentTab(false)); - target_data->SetStringKey(kTypeField, kBrowser); +base::Value::Dict BuildTargetDescriptor(Browser* browser) { + base::Value::Dict target_data; + target_data.Set(kSessionIdField, browser->session_id().id()); + target_data.Set(kNameField, browser->GetWindowTitleForCurrentTab(false)); + target_data.Set(kTypeField, kBrowser); return target_data; } #endif // !BUILDFLAG(IS_ANDROID) #if defined(USE_AURA) && !BUILDFLAG(IS_CHROMEOS_ASH) -std::unique_ptr<base::DictionaryValue> BuildTargetDescriptor( - views::Widget* widget) { - std::unique_ptr<base::DictionaryValue> widget_data( - new base::DictionaryValue()); - widget_data->SetStringKey(kNameField, - widget->widget_delegate()->GetWindowTitle()); - widget_data->SetStringKey(kTypeField, kWidget); +base::Value::Dict BuildTargetDescriptor(views::Widget* widget) { + base::Value::Dict widget_data; + widget_data.Set(kNameField, widget->widget_delegate()->GetWindowTitle()); + widget_data.Set(kTypeField, kWidget); // Use the Widget's root view ViewAccessibility's unique ID for lookup. int id = widget->GetRootView()->GetViewAccessibility().GetUniqueId().Get(); - widget_data->SetIntKey(kWidgetIdField, id); + widget_data.Set(kWidgetIdField, id); return widget_data; } #endif // defined(USE_AURA) && !BUILDFLAG(IS_CHROMEOS_ASH) @@ -202,7 +195,7 @@ content::WebUIDataSource::GotDataCallback callback) { DCHECK(ShouldHandleAccessibilityRequestCallback(path)); - base::DictionaryValue data; + base::Value::Dict data; PrefService* pref = Profile::FromBrowserContext(current_context)->GetPrefs(); ui::AXMode mode = content::BrowserAccessibilityState::GetInstance()->GetAccessibilityMode(); @@ -217,30 +210,28 @@ // The "native" and "web" flags are disabled if // --disable-renderer-accessibility is set. - data.SetStringKey(kNative, - is_native_enabled ? (native ? kOn : kOff) : kDisabled); - data.SetStringKey(kWeb, is_native_enabled ? (web ? kOn : kOff) : kDisabled); + data.Set(kNative, is_native_enabled ? (native ? kOn : kOff) : kDisabled); + data.Set(kWeb, is_native_enabled ? (web ? kOn : kOff) : kDisabled); // The "text", "screenreader" and "html" flags are only // meaningful if "web" is enabled. bool is_web_enabled = is_native_enabled && web; - data.SetStringKey(kText, is_web_enabled ? (text ? kOn : kOff) : kDisabled); - data.SetStringKey(kScreenReader, - is_web_enabled ? (screenreader ? kOn : kOff) : kDisabled); - data.SetStringKey(kHTML, is_web_enabled ? (html ? kOn : kOff) : kDisabled); + data.Set(kText, is_web_enabled ? (text ? kOn : kOff) : kDisabled); + data.Set(kScreenReader, + is_web_enabled ? (screenreader ? kOn : kOff) : kDisabled); + data.Set(kHTML, is_web_enabled ? (html ? kOn : kOff) : kDisabled); // The "pdf" flag is independent of the others. - data.SetStringKey(kPDF, pdf ? kOn : kOff); + data.Set(kPDF, pdf ? kOn : kOff); // The "Top Level Widgets" section is only relevant if views accessibility is // enabled. - data.SetBoolKey(kViewsAccessibility, - features::IsAccessibilityTreeForViewsEnabled()); + data.Set(kViewsAccessibility, features::IsAccessibilityTreeForViewsEnabled()); bool show_internal = pref->GetBoolean(prefs::kShowInternalAccessibilityTree); - data.SetStringKey(kInternal, show_internal ? kOn : kOff); + data.Set(kInternal, show_internal ? kOn : kOff); - std::unique_ptr<base::ListValue> page_list(new base::ListValue()); + base::Value::List page_list; std::unique_ptr<content::RenderWidgetHostIterator> widget_iter( content::RenderWidgetHost::GetRenderWidgetHosts()); @@ -265,32 +256,29 @@ if (context != current_context) continue; - std::unique_ptr<base::DictionaryValue> descriptor = - BuildTargetDescriptor(rvh); - descriptor->SetBoolKey(kNative, is_native_enabled); - descriptor->SetBoolKey(kWeb, is_web_enabled); - page_list->Append(base::Value::FromUniquePtrValue(std::move(descriptor))); + base::Value::Dict descriptor = BuildTargetDescriptor(rvh); + descriptor.Set(kNative, is_native_enabled); + descriptor.Set(kWeb, is_web_enabled); + page_list.Append(std::move(descriptor)); } data.Set(kPagesField, std::move(page_list)); - std::unique_ptr<base::ListValue> browser_list(new base::ListValue()); + base::Value::List browser_list; #if !BUILDFLAG(IS_ANDROID) for (Browser* browser : *BrowserList::GetInstance()) { - browser_list->Append( - base::Value::FromUniquePtrValue(BuildTargetDescriptor(browser))); + browser_list.Append(BuildTargetDescriptor(browser)); } #endif // !BUILDFLAG(IS_ANDROID) data.Set(kBrowsersField, std::move(browser_list)); - std::unique_ptr<base::ListValue> widgets_list(new base::ListValue()); + base::Value::List widgets_list; #if defined(USE_AURA) && !BUILDFLAG(IS_CHROMEOS_ASH) if (features::IsAccessibilityTreeForViewsEnabled()) { views::WidgetAXTreeIDMap& manager_map = views::WidgetAXTreeIDMap::GetInstance(); const std::vector<views::Widget*> widgets = manager_map.GetWidgets(); for (views::Widget* widget : widgets) { - widgets_list->Append( - base::Value::FromUniquePtrValue(BuildTargetDescriptor(widget))); + widgets_list.Append(BuildTargetDescriptor(widget)); } } #endif // defined(USE_AURA) && !BUILDFLAG(IS_CHROMEOS_ASH) @@ -434,13 +422,12 @@ void AccessibilityUIMessageHandler::ToggleAccessibility( const base::Value::List& args) { - const base::Value& data = args[0]; - CHECK(data.is_dict()); + const base::Value::Dict& data = args[0].GetDict(); - int process_id = *data.FindIntPath(kProcessIdField); - int routing_id = *data.FindIntPath(kRoutingIdField); - int mode = *data.FindIntPath(kModeIdField); - bool should_request_tree = *data.FindBoolPath(kShouldRequestTreeField); + int process_id = *data.FindInt(kProcessIdField); + int routing_id = *data.FindInt(kRoutingIdField); + int mode = *data.FindInt(kModeIdField); + bool should_request_tree = *data.FindBool(kShouldRequestTreeField); AllowJavascript(); content::RenderViewHost* rvh = @@ -480,20 +467,19 @@ // Call accessibility.showOrRefreshTree without a 'tree' field so the row's // accessibility mode buttons are updated. AllowJavascript(); - std::unique_ptr<base::DictionaryValue> new_mode(BuildTargetDescriptor(rvh)); - FireWebUIListener("showOrRefreshTree", *(new_mode.get())); + base::Value::Dict new_mode = BuildTargetDescriptor(rvh); + FireWebUIListener("showOrRefreshTree", new_mode); } } void AccessibilityUIMessageHandler::SetGlobalFlag( const base::Value::List& args) { - const base::Value& data = args[0]; - CHECK(data.is_dict()); + const base::Value::Dict& data = args[0].GetDict(); - const std::string* flag_name_str_p = data.FindStringPath(kFlagNameField); + const std::string* flag_name_str_p = data.FindString(kFlagNameField); CHECK(IsValidJSValue(flag_name_str_p)); std::string flag_name_str = *flag_name_str_p; - bool enabled = *data.FindBoolPath(kEnabledField); + bool enabled = *data.FindBool(kEnabledField); AllowJavascript(); if (flag_name_str == kInternal) { @@ -542,55 +528,52 @@ state->RemoveAccessibilityModeFlags(new_mode); } -// TODO(crbug.com/1187061): Consider replacing base::DictionaryValue with -// base::flat_map<std::string, base::Value>. void AccessibilityUIMessageHandler::GetRequestTypeAndFilters( - const base::DictionaryValue& data, + const base::Value::Dict& data, std::string& request_type, std::string& allow, std::string& allow_empty, std::string& deny) { - const std::string* request_type_p = data.FindStringPath(kRequestTypeField); + const std::string* request_type_p = data.FindString(kRequestTypeField); CHECK(IsValidJSValue(request_type_p)); request_type = *request_type_p; CHECK(request_type == kShowOrRefreshTree || request_type == kCopyTree); - const std::string* allow_p = data.FindStringPath("filters.allow"); + const std::string* allow_p = data.FindStringByDottedPath("filters.allow"); CHECK(IsValidJSValue(allow_p)); allow = *allow_p; - const std::string* allow_empty_p = data.FindStringPath("filters.allowEmpty"); + const std::string* allow_empty_p = + data.FindStringByDottedPath("filters.allowEmpty"); CHECK(IsValidJSValue(allow_empty_p)); allow_empty = *allow_empty_p; - const std::string* deny_p = data.FindStringPath("filters.deny"); + const std::string* deny_p = data.FindStringByDottedPath("filters.deny"); CHECK(IsValidJSValue(deny_p)); deny = *deny_p; } void AccessibilityUIMessageHandler::RequestWebContentsTree( const base::Value::List& args) { - const base::Value& data = args[0]; - CHECK(data.is_dict()); + const base::Value::Dict& data = args[0].GetDict(); std::string request_type, allow, allow_empty, deny; - GetRequestTypeAndFilters(static_cast<const base::DictionaryValue&>(data), - request_type, allow, allow_empty, deny); + GetRequestTypeAndFilters(data, request_type, allow, allow_empty, deny); - int process_id = *data.FindIntPath(kProcessIdField); - int routing_id = *data.FindIntPath(kRoutingIdField); + int process_id = *data.FindInt(kProcessIdField); + int routing_id = *data.FindInt(kRoutingIdField); AllowJavascript(); content::RenderViewHost* rvh = content::RenderViewHost::FromID(process_id, routing_id); if (!rvh) { - std::unique_ptr<base::DictionaryValue> result(new base::DictionaryValue()); - result->SetIntKey(kProcessIdField, process_id); - result->SetIntKey(kRoutingIdField, routing_id); - result->SetStringKey(kErrorField, "Renderer no longer exists."); - FireWebUIListener(request_type, *(result.get())); + base::Value::Dict result; + result.Set(kProcessIdField, process_id); + result.Set(kRoutingIdField, routing_id); + result.Set(kErrorField, "Renderer no longer exists."); + FireWebUIListener(request_type, result); return; } - std::unique_ptr<base::DictionaryValue> result(BuildTargetDescriptor(rvh)); + base::Value::Dict result(BuildTargetDescriptor(rvh)); content::WebContents* web_contents = content::WebContents::FromRenderViewHost(rvh); // No matter the state of the current web_contents, we want to force the mode @@ -609,20 +592,18 @@ bool internal = pref->GetBoolean(prefs::kShowInternalAccessibilityTree); std::string accessibility_contents = web_contents->DumpAccessibilityTree(internal, property_filters); - result->SetStringKey(kTreeField, accessibility_contents); - FireWebUIListener(request_type, *(result.get())); + result.Set(kTreeField, accessibility_contents); + FireWebUIListener(request_type, result); } void AccessibilityUIMessageHandler::RequestNativeUITree( const base::Value::List& args) { - const base::Value& data = args[0]; - CHECK(data.is_dict()); + const base::Value::Dict& data = args[0].GetDict(); std::string request_type, allow, allow_empty, deny; - GetRequestTypeAndFilters(static_cast<const base::DictionaryValue&>(data), - request_type, allow, allow_empty, deny); + GetRequestTypeAndFilters(data, request_type, allow, allow_empty, deny); - int session_id = *data.FindIntPath(kSessionIdField); + int session_id = *data.FindInt(kSessionIdField); AllowJavascript(); @@ -635,36 +616,32 @@ for (Browser* browser : *BrowserList::GetInstance()) { if (browser->session_id().id() == session_id) { - std::unique_ptr<base::DictionaryValue> result( - BuildTargetDescriptor(browser)); + base::Value::Dict result = BuildTargetDescriptor(browser); gfx::NativeWindow native_window = browser->window()->GetNativeWindow(); ui::AXPlatformNode* node = ui::AXPlatformNode::FromNativeWindow(native_window); - result->SetKey(kTreeField, - base::Value(RecursiveDumpAXPlatformNodeAsString( - node, 0, property_filters))); - FireWebUIListener(request_type, *(result.get())); + result.Set(kTreeField, RecursiveDumpAXPlatformNodeAsString( + node, 0, property_filters)); + FireWebUIListener(request_type, result); return; } } #endif // !BUILDFLAG(IS_ANDROID) // No browser with the specified |session_id| was found. - std::unique_ptr<base::DictionaryValue> result(new base::DictionaryValue()); - result->SetIntKey(kSessionIdField, session_id); - result->SetStringKey(kTypeField, kBrowser); - result->SetStringKey(kErrorField, "Browser no longer exists."); - FireWebUIListener(request_type, *(result.get())); + base::Value::Dict result; + result.Set(kSessionIdField, session_id); + result.Set(kTypeField, kBrowser); + result.Set(kErrorField, "Browser no longer exists."); + FireWebUIListener(request_type, result); } void AccessibilityUIMessageHandler::RequestWidgetsTree( const base::Value::List& args) { #if defined(USE_AURA) && !BUILDFLAG(IS_CHROMEOS_ASH) - const base::Value& data = args[0]; - CHECK(data.is_dict()); + const base::Value::Dict& data = args[0].GetDict(); std::string request_type, allow, allow_empty, deny; - GetRequestTypeAndFilters(static_cast<const base::DictionaryValue&>(data), - request_type, allow, allow_empty, deny); + GetRequestTypeAndFilters(data, request_type, allow, allow_empty, deny); std::vector<AXPropertyFilter> property_filters; AddPropertyFilters(property_filters, allow, AXPropertyFilter::ALLOW); @@ -673,7 +650,7 @@ AddPropertyFilters(property_filters, deny, AXPropertyFilter::DENY); if (features::IsAccessibilityTreeForViewsEnabled()) { - int widget_id = *data.FindIntPath(kWidgetIdField); + int widget_id = *data.FindInt(kWidgetIdField); views::WidgetAXTreeIDMap& manager_map = views::WidgetAXTreeIDMap::GetInstance(); const std::vector<views::Widget*> widgets = manager_map.GetWidgets(); @@ -688,21 +665,20 @@ std::string tree_dump = formatter->DumpInternalAccessibilityTree(tree_id, property_filters); - std::unique_ptr<base::DictionaryValue> result( - BuildTargetDescriptor(widget)); - result->SetKey(kTreeField, base::Value(tree_dump)); + base::Value::Dict result(BuildTargetDescriptor(widget)); + result.Set(kTreeField, tree_dump); AllowJavascript(); - FireWebUIListener(request_type, *(result.get())); + FireWebUIListener(request_type, result); return; } } } - std::unique_ptr<base::DictionaryValue> result(new base::DictionaryValue()); - result->SetStringKey(kTypeField, kWidget); - result->SetStringKey(kErrorField, "Window no longer exists."); + base::Value::Dict result; + result.Set(kTypeField, kWidget); + result.Set(kErrorField, "Window no longer exists."); AllowJavascript(); - FireWebUIListener(request_type, *(result.get())); + FireWebUIListener(request_type, result); #endif // defined(USE_AURA) && !BUILDFLAG(IS_CHROMEOS_ASH) } @@ -718,12 +694,11 @@ void AccessibilityUIMessageHandler::RequestAccessibilityEvents( const base::Value::List& args) { - const base::Value& data = args[0]; - CHECK(data.is_dict()); + const base::Value::Dict& data = args[0].GetDict(); - int process_id = *data.FindIntPath(kProcessIdField); - int routing_id = *data.FindIntPath(kRoutingIdField); - bool start_recording = *data.FindBoolPath(kStartField); + int process_id = *data.FindInt(kProcessIdField); + int routing_id = *data.FindInt(kRoutingIdField); + bool start_recording = *data.FindBool(kStartField); AllowJavascript(); @@ -733,7 +708,7 @@ return; } - std::unique_ptr<base::DictionaryValue> result(BuildTargetDescriptor(rvh)); + base::Value::Dict result = BuildTargetDescriptor(rvh); content::WebContents* web_contents = content::WebContents::FromRenderViewHost(rvh); if (start_recording) { @@ -753,10 +728,10 @@ event_logs_str += log; event_logs_str += "\n"; } - result->SetStringKey(kEventLogsField, event_logs_str); + result.Set(kEventLogsField, event_logs_str); event_logs_.clear(); - FireWebUIListener("startOrStopEvents", *(result.get())); + FireWebUIListener("startOrStopEvents", result); } }
diff --git a/chrome/browser/accessibility/accessibility_ui.h b/chrome/browser/accessibility/accessibility_ui.h index 6bc5891..8ae101c 100644 --- a/chrome/browser/accessibility/accessibility_ui.h +++ b/chrome/browser/accessibility/accessibility_ui.h
@@ -11,15 +11,12 @@ #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" +#include "base/values.h" #include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_ui_controller.h" #include "content/public/browser/web_ui_data_source.h" #include "content/public/browser/web_ui_message_handler.h" -namespace base { -class DictionaryValue; -} // namespace base - namespace content { struct AXEventNotificationDetails; class WebContents; @@ -71,7 +68,7 @@ void ToggleAccessibility(const base::Value::List& args); void SetGlobalFlag(const base::Value::List& args); - void GetRequestTypeAndFilters(const base::DictionaryValue& data, + void GetRequestTypeAndFilters(const base::Value::Dict& data, std::string& request_type, std::string& allow, std::string& allow_empty,
diff --git a/chrome/browser/ash/BUILD.gn b/chrome/browser/ash/BUILD.gn index da06f5f..8d58dd16 100644 --- a/chrome/browser/ash/BUILD.gn +++ b/chrome/browser/ash/BUILD.gn
@@ -1997,6 +1997,7 @@ "//ui/chromeos", "//ui/chromeos/resources", "//ui/chromeos/strings", + "//ui/chromeos/styles:cros_tokens_color_mappings", "//ui/color", "//ui/color:color_headers", "//ui/color:mixers",
diff --git a/chrome/browser/ash/accessibility/spoken_feedback_browsertest.cc b/chrome/browser/ash/accessibility/spoken_feedback_browsertest.cc index 79ce123..e42eb7c 100644 --- a/chrome/browser/ash/accessibility/spoken_feedback_browsertest.cc +++ b/chrome/browser/ash/accessibility/spoken_feedback_browsertest.cc
@@ -1746,7 +1746,7 @@ sm_.Call([this]() { SendKeyPress(ui::VKEY_TAB); }); sm_.ExpectSpeechPattern("Template, Desk 1"); sm_.ExpectSpeech("Button"); - sm_.ExpectSpeech("Press Ctrl plus W to close"); + sm_.ExpectSpeech("Press Ctrl plus W to delete"); sm_.ExpectSpeech("Press Search plus Space to activate"); // The next item is the textfield inside the template card, which also has the
diff --git a/chrome/browser/ash/arc/input_overlay/ui/action_edit_menu.cc b/chrome/browser/ash/arc/input_overlay/ui/action_edit_menu.cc index 02119b4c..cf8a6c1 100644 --- a/chrome/browser/ash/arc/input_overlay/ui/action_edit_menu.cc +++ b/chrome/browser/ash/arc/input_overlay/ui/action_edit_menu.cc
@@ -6,10 +6,10 @@ #include "ash/resources/vector_icons/vector_icons.h" #include "ash/style/ash_color_provider.h" -#include "ash/style/dark_light_mode_controller_impl.h" #include "ash/style/style_util.h" #include "chrome/grit/generated_resources.h" #include "ui/base/l10n/l10n_util.h" +#include "ui/chromeos/styles/cros_tokens_color_mappings.h" #include "ui/gfx/paint_vector_icon.h" #include "ui/views/background.h" #include "ui/views/layout/box_layout.h" @@ -116,12 +116,11 @@ SetLayoutManager(std::make_unique<views::BoxLayout>( views::BoxLayout::Orientation::kVertical)); - auto* color_provider = ash::AshColorProvider::Get(); + auto* color_provider = GetColorProvider(); DCHECK(color_provider); if (!color_provider) return; - auto bg_color = color_provider->GetBackgroundColorInMode( - ash::DarkLightModeControllerImpl::Get()->IsDarkModeEnabled()); + const auto bg_color = color_provider->GetColor(cros_tokens::kBgColor); SetBackground(views::CreateRoundedRectBackground(bg_color, kCornerRadius)); // Add each binding button.
diff --git a/chrome/browser/ash/arc/input_overlay/ui/input_menu_view.cc b/chrome/browser/ash/arc/input_overlay/ui/input_menu_view.cc index 966534c..e60be66 100644 --- a/chrome/browser/ash/arc/input_overlay/ui/input_menu_view.cc +++ b/chrome/browser/ash/arc/input_overlay/ui/input_menu_view.cc
@@ -8,7 +8,6 @@ #include "ash/login/ui/views_utils.h" #include "ash/public/cpp/new_window_delegate.h" #include "ash/style/ash_color_provider.h" -#include "ash/style/dark_light_mode_controller_impl.h" #include "ash/style/pill_button.h" #include "ash/style/style_util.h" #include "base/bind.h" @@ -23,6 +22,7 @@ #include "ui/base/l10n/l10n_util.h" #include "ui/base/ui_base_types.h" #include "ui/chromeos/styles/cros_styles.h" +#include "ui/chromeos/styles/cros_tokens_color_mappings.h" #include "ui/color/color_id.h" #include "ui/gfx/font.h" #include "ui/gfx/font_list.h" @@ -183,6 +183,12 @@ InputMenuView::~InputMenuView() {} +void InputMenuView::OnThemeChanged() { + views::View::OnThemeChanged(); + const auto bg_color = GetColorProvider()->GetColor(cros_tokens::kBgColor); + SetBackground(views::CreateRoundedRectBackground(bg_color, kCornerRadius)); +} + void InputMenuView::CloseMenu() { if (display_overlay_controller_) display_overlay_controller_->SetDisplayMode(DisplayMode::kView); @@ -194,9 +200,6 @@ SetLayoutManager(std::make_unique<views::BoxLayout>( views::BoxLayout::Orientation::kVertical)); auto* color_provider = ash::AshColorProvider::Get(); - auto bg_color = color_provider->GetBackgroundColorInMode( - ash::DarkLightModeControllerImpl::Get()->IsDarkModeEnabled()); - SetBackground(views::CreateRoundedRectBackground(bg_color, kCornerRadius)); SkColor color = color_provider->GetContentLayerColor( ash::AshColorProvider::ContentLayerType::kTextColorPrimary); int menu_width = GetMenuWidth(parent_size.width());
diff --git a/chrome/browser/ash/arc/input_overlay/ui/input_menu_view.h b/chrome/browser/ash/arc/input_overlay/ui/input_menu_view.h index f061962..669669ca 100644 --- a/chrome/browser/ash/arc/input_overlay/ui/input_menu_view.h +++ b/chrome/browser/ash/arc/input_overlay/ui/input_menu_view.h
@@ -51,6 +51,9 @@ InputMenuView& operator=(const InputMenuView&) = delete; ~InputMenuView() override; + // views::View: + void OnThemeChanged() override; + private: class FeedbackButton;
diff --git a/chrome/browser/ash/bruschetta/bruschetta_launcher_unittest.cc b/chrome/browser/ash/bruschetta/bruschetta_launcher_unittest.cc index 37df1f0..ae8c442 100644 --- a/chrome/browser/ash/bruschetta/bruschetta_launcher_unittest.cc +++ b/chrome/browser/ash/bruschetta/bruschetta_launcher_unittest.cc
@@ -49,7 +49,7 @@ guest_os::GuestId id{guest_os::VmType::UNKNOWN, "vm_name", "penguin"}; guest_os::GuestOsSessionTracker::GetForProfile(&profile_) - ->AddGuestForTesting(id, guest_os::GuestInfo(id, 30, {}, {}, {})); + ->AddGuestForTesting(id, guest_os::GuestInfo(id, 30, {}, {}, {}, {})); } void TearDown() override {}
diff --git a/chrome/browser/ash/bruschetta/bruschetta_mount_provider.cc b/chrome/browser/ash/bruschetta/bruschetta_mount_provider.cc index 89a4d7b..290ae5b 100644 --- a/chrome/browser/ash/bruschetta/bruschetta_mount_provider.cc +++ b/chrome/browser/ash/bruschetta/bruschetta_mount_provider.cc
@@ -69,10 +69,8 @@ std::move(callback).Run(false, 0, 0, base::FilePath()); return; } - - // TODO(b/217469540): Once the sftp changes in garcon land, change the port - // from hardcoded 1234 to the real value. - std::move(callback).Run(true, info->cid, 1234, info->homedir); + std::move(callback).Run(true, info->cid, info->sftp_vsock_port, + info->homedir); } } // namespace bruschetta
diff --git a/chrome/browser/ash/bruschetta/bruschetta_mount_provider_unittest.cc b/chrome/browser/ash/bruschetta/bruschetta_mount_provider_unittest.cc index a6da64b0..41ef707 100644 --- a/chrome/browser/ash/bruschetta/bruschetta_mount_provider_unittest.cc +++ b/chrome/browser/ash/bruschetta/bruschetta_mount_provider_unittest.cc
@@ -36,7 +36,7 @@ TestingProfile profile_; guest_os::GuestId id_{guest_os::VmType::BRUSCHETTA, "vm_name", ""}; guest_os::GuestInfo info_{id_, 32, "username", base::FilePath("/home/dir"), - ""}; + "", 123}; FakeBruschettaLauncher* launcher_; BruschettaMountProvider provider_{&profile_, id_}; }; @@ -59,7 +59,7 @@ [this, &called](bool result, int cid, int port, base::FilePath path) { EXPECT_TRUE(result); EXPECT_EQ(cid, info_.cid); - EXPECT_EQ(port, 1234); + EXPECT_EQ(port, 123); EXPECT_EQ(path, info_.homedir); called = true; }));
diff --git a/chrome/browser/ash/crosapi/BUILD.gn b/chrome/browser/ash/crosapi/BUILD.gn index cdf1f00..12ab2a6 100644 --- a/chrome/browser/ash/crosapi/BUILD.gn +++ b/chrome/browser/ash/crosapi/BUILD.gn
@@ -127,6 +127,8 @@ "idle_service_ash.h", "image_writer_ash.cc", "image_writer_ash.h", + "in_session_auth_ash.cc", + "in_session_auth_ash.h", "keystore_service_ash.cc", "keystore_service_ash.h", "keystore_service_factory_ash.cc",
diff --git a/chrome/browser/ash/crosapi/crosapi_ash.cc b/chrome/browser/ash/crosapi/crosapi_ash.cc index 115b8b51..8468372 100644 --- a/chrome/browser/ash/crosapi/crosapi_ash.cc +++ b/chrome/browser/ash/crosapi/crosapi_ash.cc
@@ -57,6 +57,7 @@ #include "chrome/browser/ash/crosapi/identity_manager_ash.h" #include "chrome/browser/ash/crosapi/idle_service_ash.h" #include "chrome/browser/ash/crosapi/image_writer_ash.h" +#include "chrome/browser/ash/crosapi/in_session_auth_ash.h" #include "chrome/browser/ash/crosapi/keystore_service_ash.h" #include "chrome/browser/ash/crosapi/kiosk_session_service_ash.h" #include "chrome/browser/ash/crosapi/local_printer_ash.h" @@ -202,6 +203,7 @@ identity_manager_ash_(std::make_unique<IdentityManagerAsh>()), idle_service_ash_(std::make_unique<IdleServiceAsh>()), image_writer_ash_(std::make_unique<ImageWriterAsh>()), + in_session_auth_ash_(std::make_unique<InSessionAuthAsh>()), keystore_service_ash_(std::make_unique<KeystoreServiceAsh>()), kiosk_session_service_ash_(std::make_unique<KioskSessionServiceAsh>()), chrome_app_kiosk_service_ash_( @@ -420,6 +422,11 @@ image_writer_ash_->BindReceiver(std::move(receiver)); } +void CrosapiAsh::BindInSessionAuth( + mojo::PendingReceiver<mojom::InSessionAuth> receiver) { + in_session_auth_ash_->BindReceiver(std::move(receiver)); +} + void CrosapiAsh::BindKeystoreService( mojo::PendingReceiver<crosapi::mojom::KeystoreService> receiver) { keystore_service_ash_->BindReceiver(std::move(receiver));
diff --git a/chrome/browser/ash/crosapi/crosapi_ash.h b/chrome/browser/ash/crosapi/crosapi_ash.h index d37d529..452194b 100644 --- a/chrome/browser/ash/crosapi/crosapi_ash.h +++ b/chrome/browser/ash/crosapi/crosapi_ash.h
@@ -62,6 +62,7 @@ class IdentityManagerAsh; class IdleServiceAsh; class ImageWriterAsh; +class InSessionAuthAsh; class KeystoreServiceAsh; class KioskSessionServiceAsh; class LocalPrinterAsh; @@ -203,6 +204,8 @@ mojo::PendingReceiver<mojom::IdleService> receiver) override; void BindImageWriter( mojo::PendingReceiver<mojom::ImageWriter> receiver) override; + void BindInSessionAuth( + mojo::PendingReceiver<mojom::InSessionAuth> receiver) override; void BindKeystoreService( mojo::PendingReceiver<mojom::KeystoreService> receiver) override; void BindKioskSessionService( @@ -458,6 +461,7 @@ std::unique_ptr<IdentityManagerAsh> identity_manager_ash_; std::unique_ptr<IdleServiceAsh> idle_service_ash_; std::unique_ptr<ImageWriterAsh> image_writer_ash_; + std::unique_ptr<InSessionAuthAsh> in_session_auth_ash_; std::unique_ptr<KeystoreServiceAsh> keystore_service_ash_; std::unique_ptr<KioskSessionServiceAsh> kiosk_session_service_ash_; std::unique_ptr<ChromeAppKioskServiceAsh> chrome_app_kiosk_service_ash_;
diff --git a/chrome/browser/ash/crosapi/crosapi_util.cc b/chrome/browser/ash/crosapi/crosapi_util.cc index 0bf06e3..b52f4f99 100644 --- a/chrome/browser/ash/crosapi/crosapi_util.cc +++ b/chrome/browser/ash/crosapi/crosapi_util.cc
@@ -73,6 +73,7 @@ #include "chromeos/crosapi/mojom/holding_space_service.mojom.h" #include "chromeos/crosapi/mojom/identity_manager.mojom.h" #include "chromeos/crosapi/mojom/image_writer.mojom.h" +#include "chromeos/crosapi/mojom/in_session_auth.mojom.h" #include "chromeos/crosapi/mojom/keystore_service.mojom.h" #include "chromeos/crosapi/mojom/kiosk_session_service.mojom.h" #include "chromeos/crosapi/mojom/launcher_search.mojom.h" @@ -237,7 +238,7 @@ return {T::Uuid_, T::Version_}; } -static_assert(crosapi::mojom::Crosapi::Version_ == 91, +static_assert(crosapi::mojom::Crosapi::Version_ == 92, "If you add a new crosapi, please add it to " "kInterfaceVersionEntries below."); @@ -288,6 +289,7 @@ MakeInterfaceVersionEntry<crosapi::mojom::IdleService>(), MakeInterfaceVersionEntry<crosapi::mojom::ImageWriter>(), MakeInterfaceVersionEntry<crosapi::mojom::InputMethodTestInterface>(), + MakeInterfaceVersionEntry<crosapi::mojom::InSessionAuth>(), MakeInterfaceVersionEntry<crosapi::mojom::KeystoreService>(), MakeInterfaceVersionEntry<crosapi::mojom::KioskSessionService>(), MakeInterfaceVersionEntry<crosapi::mojom::LocalPrinter>(),
diff --git a/chrome/browser/ash/crosapi/in_session_auth_ash.cc b/chrome/browser/ash/crosapi/in_session_auth_ash.cc new file mode 100644 index 0000000..2c16275 --- /dev/null +++ b/chrome/browser/ash/crosapi/in_session_auth_ash.cc
@@ -0,0 +1,77 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ash/crosapi/in_session_auth_ash.h" + +#include "ash/public/cpp/in_session_auth_dialog_controller.h" +#include "ash/session/session_controller_impl.h" +#include "ash/shell.h" +#include "base/json/values_util.h" +#include "base/notreached.h" +#include "chrome/browser/ash/login/quick_unlock/auth_token.h" +#include "chrome/browser/ash/login/quick_unlock/quick_unlock_factory.h" +#include "chrome/browser/ash/login/quick_unlock/quick_unlock_storage.h" +#include "chromeos/crosapi/mojom/in_session_auth.mojom.h" + +namespace crosapi { + +ash::InSessionAuthDialogController::Reason ToAshReason(mojom::Reason reason) { + switch (reason) { + case mojom::Reason::kAccessPasswordManager: + return ash::InSessionAuthDialogController::kAccessPasswordManager; + case mojom::Reason::kModifyAuthFactors: + return ash::InSessionAuthDialogController::kModifyAuthFactors; + case mojom::Reason::kModifyAuthFactorsMultidevice: + return ash::InSessionAuthDialogController::kModifyAuthFactorsMultidevice; + } +} + +InSessionAuthAsh::InSessionAuthAsh() = default; +InSessionAuthAsh::~InSessionAuthAsh() = default; + +void InSessionAuthAsh::BindReceiver( + mojo::PendingReceiver<InSessionAuth> receiver) { + receivers_.Add(this, std::move(receiver)); +} + +void InSessionAuthAsh::RequestToken(mojom::Reason reason, + RequestTokenCallback callback) { + ash::Shell::Get()->in_session_auth_dialog_controller()->ShowAuthDialog( + ToAshReason(reason), + base::BindOnce(&InSessionAuthAsh::OnAuthComplete, + weak_factory_.GetWeakPtr(), std::move(callback))); +} + +void InSessionAuthAsh::CheckToken(mojom::Reason reason, + const std::string& token, + CheckTokenCallback callback) { + // TODO(b/239681292): Use AuthSession-backed tokens. + auto account_id = + ash::Shell::Get()->session_controller()->GetActiveAccountId(); + + ash::quick_unlock::QuickUnlockStorage* quick_unlock_storage = + ash::quick_unlock::QuickUnlockFactory::GetForAccountId(account_id); + const ash::quick_unlock::AuthToken* auth_token = + quick_unlock_storage->GetAuthToken(); + + std::move(callback).Run( + auth_token != nullptr && auth_token->GetAge().has_value() && + auth_token->GetAge() <= ash::quick_unlock::AuthToken::kTokenExpiration); +} + +void InSessionAuthAsh::InvalidateToken(const std::string& token) { + // TODO(b/239681292): Implement as a feature of AuthSession-backed tokens + NOTIMPLEMENTED(); +} + +void InSessionAuthAsh::OnAuthComplete(RequestTokenCallback callback, + bool success, + const base::UnguessableToken& token, + base::TimeDelta timeout) { + std::move(callback).Run( + success ? mojom::RequestTokenReply::New(token.ToString(), timeout) + : nullptr); +} + +} // namespace crosapi
diff --git a/chrome/browser/ash/crosapi/in_session_auth_ash.h b/chrome/browser/ash/crosapi/in_session_auth_ash.h new file mode 100644 index 0000000..1525d41 --- /dev/null +++ b/chrome/browser/ash/crosapi/in_session_auth_ash.h
@@ -0,0 +1,50 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_ASH_CROSAPI_IN_SESSION_AUTH_ASH_H_ +#define CHROME_BROWSER_ASH_CROSAPI_IN_SESSION_AUTH_ASH_H_ + +#include "base/memory/weak_ptr.h" +#include "chromeos/crosapi/mojom/in_session_auth.mojom-shared.h" +#include "chromeos/crosapi/mojom/in_session_auth.mojom.h" +#include "mojo/public/cpp/bindings/receiver_set.h" + +namespace crosapi { + +// This is the ash-chrome implementation of the InSessionAuth mojo interface. +// Used by lacros-chrome to call into ash authentication backends to +// authenticate users in session. +class InSessionAuthAsh : public mojom::InSessionAuth { + public: + InSessionAuthAsh(); + InSessionAuthAsh(const InSessionAuthAsh&) = delete; + InSessionAuthAsh& operator=(const InSessionAuthAsh&) = delete; + ~InSessionAuthAsh() override; + + void BindReceiver(mojo::PendingReceiver<InSessionAuth> receiver); + + // crosapi::mojom::InSessionAuth + void RequestToken(mojom::Reason reason, + RequestTokenCallback callback) override; + void CheckToken(mojom::Reason reason, + const std::string& token, + CheckTokenCallback callback) override; + void InvalidateToken(const std::string& token) override; + + private: + // Continuation of InSessionAuthAsh::RequestToken. Last 3 params match + // InSessionAuthDialogController::OnAuthComplete + void OnAuthComplete(RequestTokenCallback callback, + bool sucess, + const base::UnguessableToken& token, + base::TimeDelta timeout); + + mojo::ReceiverSet<mojom::InSessionAuth> receivers_; + + base::WeakPtrFactory<InSessionAuthAsh> weak_factory_{this}; +}; + +} // namespace crosapi + +#endif // CHROME_BROWSER_ASH_CROSAPI_IN_SESSION_AUTH_ASH_H_
diff --git a/chrome/browser/ash/guest_os/guest_os_session_tracker.cc b/chrome/browser/ash/guest_os/guest_os_session_tracker.cc index 821c45d..c5f5bf2 100644 --- a/chrome/browser/ash/guest_os/guest_os_session_tracker.cc +++ b/chrome/browser/ash/guest_os/guest_os_session_tracker.cc
@@ -22,12 +22,14 @@ int64_t cid, std::string username, base::FilePath homedir, - std::string ipv4_address) + std::string ipv4_address, + uint32_t sftp_vsock_port) : guest_id(std::move(guest_id)), cid(cid), username(std::move(username)), homedir(std::move(homedir)), - ipv4_address(std::move(ipv4_address)) {} + ipv4_address(std::move(ipv4_address)), + sftp_vsock_port(sftp_vsock_port) {} GuestInfo::~GuestInfo() = default; GuestInfo::GuestInfo(GuestInfo&&) = default; GuestInfo::GuestInfo(const GuestInfo&) = default; @@ -121,9 +123,12 @@ return; } GuestId id{VmType::UNKNOWN, signal.vm_name(), signal.container_name()}; - GuestInfo info{id, iter->second.cid(), signal.container_username(), + GuestInfo info{id, + iter->second.cid(), + signal.container_username(), base::FilePath(signal.container_homedir()), - signal.ipv4_address()}; + signal.ipv4_address(), + signal.sftp_vsock_port()}; guests_.insert_or_assign(id, info); auto cb_list = container_start_callbacks_.find(id); if (cb_list != container_start_callbacks_.end()) {
diff --git a/chrome/browser/ash/guest_os/guest_os_session_tracker.h b/chrome/browser/ash/guest_os/guest_os_session_tracker.h index 87761d72d..59cb1e4 100644 --- a/chrome/browser/ash/guest_os/guest_os_session_tracker.h +++ b/chrome/browser/ash/guest_os/guest_os_session_tracker.h
@@ -22,7 +22,8 @@ int64_t cid, std::string username, base::FilePath homedir, - std::string ipv4_address); + std::string ipv4_address, + uint32_t sftp_vsock_port); ~GuestInfo(); GuestInfo(GuestInfo&&); GuestInfo(const GuestInfo&); @@ -33,6 +34,7 @@ std::string username; base::FilePath homedir; std::string ipv4_address; + uint32_t sftp_vsock_port; }; class GuestOsSessionTracker : protected ash::ConciergeClient::VmObserver,
diff --git a/chrome/browser/ash/login/app_mode/test/kiosk_base_test.cc b/chrome/browser/ash/login/app_mode/test/kiosk_base_test.cc index ca986cf..f9b9943 100644 --- a/chrome/browser/ash/login/app_mode/test/kiosk_base_test.cc +++ b/chrome/browser/ash/login/app_mode/test/kiosk_base_test.cc
@@ -234,6 +234,14 @@ EXPECT_TRUE(LaunchApp(test_app_id())); } +void KioskBaseTest::StartExistingAppLaunchFromLoginScreen( + NetworkPortalDetector::CaptivePortalStatus network_status) { + SetupTestAppUpdateCheck(); + + network_portal_detector_.SimulateDefaultNetworkState(network_status); + EXPECT_TRUE(LaunchApp(test_app_id())); +} + const extensions::Extension* KioskBaseTest::GetInstalledApp() { Profile* app_profile = ProfileManager::GetPrimaryUserProfile(); return extensions::ExtensionRegistry::Get(app_profile)
diff --git a/chrome/browser/ash/login/app_mode/test/kiosk_base_test.h b/chrome/browser/ash/login/app_mode/test/kiosk_base_test.h index 93568b4..ab12846 100644 --- a/chrome/browser/ash/login/app_mode/test/kiosk_base_test.h +++ b/chrome/browser/ash/login/app_mode/test/kiosk_base_test.h
@@ -87,6 +87,8 @@ void StartAppLaunchFromLoginScreen( NetworkPortalDetector::CaptivePortalStatus network_status); + void StartExistingAppLaunchFromLoginScreen( + NetworkPortalDetector::CaptivePortalStatus network_status); const extensions::Extension* GetInstalledApp();
diff --git a/chrome/browser/ash/login/app_mode/test/kiosk_update_browsertest.cc b/chrome/browser/ash/login/app_mode/test/kiosk_update_browsertest.cc index e6fac2c3..bab4621 100644 --- a/chrome/browser/ash/login/app_mode/test/kiosk_update_browsertest.cc +++ b/chrome/browser/ash/login/app_mode/test/kiosk_update_browsertest.cc
@@ -724,7 +724,7 @@ set_test_app_version("2.0.0"); set_test_crx_file(test_app_id() + "_v2_read_and_verify_data.crx"); extensions::ResultCatcher catcher; - StartAppLaunchFromLoginScreen( + StartExistingAppLaunchFromLoginScreen( NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE); WaitForAppLaunchWithOptions(true /* check_launch_data */, false /* terminate_app */);
diff --git a/chrome/browser/ash/login/quick_unlock/auth_token.cc b/chrome/browser/ash/login/quick_unlock/auth_token.cc index fbe6b33..e45ba6d 100644 --- a/chrome/browser/ash/login/quick_unlock/auth_token.cc +++ b/chrome/browser/ash/login/quick_unlock/auth_token.cc
@@ -12,7 +12,7 @@ namespace ash { namespace quick_unlock { -const int AuthToken::kTokenExpirationSeconds = 5 * 60; +constexpr base::TimeDelta AuthToken::kTokenExpiration = base::Seconds(5 * 60); AuthToken::AuthToken(const UserContext& user_context) : identifier_(base::UnguessableToken::Create()), @@ -20,7 +20,7 @@ user_context_(std::make_unique<UserContext>(user_context)) { base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( FROM_HERE, base::BindOnce(&AuthToken::Reset, weak_factory_.GetWeakPtr()), - base::Seconds(kTokenExpirationSeconds)); + kTokenExpiration); } AuthToken::~AuthToken() = default;
diff --git a/chrome/browser/ash/login/quick_unlock/auth_token.h b/chrome/browser/ash/login/quick_unlock/auth_token.h index b270184..728cfa4 100644 --- a/chrome/browser/ash/login/quick_unlock/auth_token.h +++ b/chrome/browser/ash/login/quick_unlock/auth_token.h
@@ -25,7 +25,7 @@ class AuthToken { public: // How long the token lives. - static const int kTokenExpirationSeconds; + static const base::TimeDelta kTokenExpiration; explicit AuthToken(const UserContext& user_context);
diff --git a/chrome/browser/ash/login/screens/fingerprint_setup_screen.cc b/chrome/browser/ash/login/screens/fingerprint_setup_screen.cc index db0528e5..6c108064 100644 --- a/chrome/browser/ash/login/screens/fingerprint_setup_screen.cc +++ b/chrome/browser/ash/login/screens/fingerprint_setup_screen.cc
@@ -105,23 +105,19 @@ } FingerprintSetupScreen::FingerprintSetupScreen( - FingerprintSetupScreenView* view, + base::WeakPtr<FingerprintSetupScreenView> view, const ScreenExitCallback& exit_callback) : BaseScreen(FingerprintSetupScreenView::kScreenId, OobeScreenPriority::DEFAULT), - view_(view), + view_(std::move(view)), exit_callback_(exit_callback) { content::GetDeviceService().BindFingerprint( fp_service_.BindNewPipeAndPassReceiver()); fp_service_->AddFingerprintObserver(receiver_.BindNewPipeAndPassRemote()); DCHECK(view_); - view_->Bind(this); } -FingerprintSetupScreen::~FingerprintSetupScreen() { - if (view_) - view_->Bind(nullptr); -} +FingerprintSetupScreen::~FingerprintSetupScreen() = default; bool FingerprintSetupScreen::MaybeSkip(WizardContext* context) { if (context->skip_post_login_screens_for_tests || @@ -137,7 +133,8 @@ void FingerprintSetupScreen::ShowImpl() { StartAddingFinger(); - view_->Show(); + if (view_) + view_->Show(); } void FingerprintSetupScreen::HideImpl() { @@ -147,13 +144,12 @@ base::BindOnce(&FingerprintSetupScreen::OnCancelCurrentEnrollSession, weak_ptr_factory_.GetWeakPtr())); } - view_->Hide(); } -void FingerprintSetupScreen::OnUserActionDeprecated( - const std::string& action_id) { +void FingerprintSetupScreen::OnUserAction(const base::Value::List& args) { + const std::string& action_id = args[0].GetString(); if (!IsFingerprintUserAction(action_id)) { - BaseScreen::OnUserActionDeprecated(action_id); + BaseScreen::OnUserAction(args); return; } RecordUserAction(action_id); @@ -179,16 +175,19 @@ << scan_result << ", enroll_session_complete=" << enroll_session_complete << ", percent_complete=" << percent_complete; - view_->OnEnrollScanDone(scan_result, enroll_session_complete, - percent_complete); - + if (view_) { + view_->OnEnrollScanDone(scan_result, enroll_session_complete, + percent_complete); + } if (!enroll_session_complete) return; enroll_session_started_ = false; ++enrolled_finger_count_; - view_->EnableAddAnotherFinger( - /* enable = */ enrolled_finger_count_ < kMaxAllowedFingerprints); + if (view_) { + view_->EnableAddAnotherFinger( + /* enable = */ enrolled_finger_count_ < kMaxAllowedFingerprints); + } // Update the number of registered fingers, it's fine to override because // this is the first time user log in and have no finger registered.
diff --git a/chrome/browser/ash/login/screens/fingerprint_setup_screen.h b/chrome/browser/ash/login/screens/fingerprint_setup_screen.h index 0b3c5d2..17f7bb3d 100644 --- a/chrome/browser/ash/login/screens/fingerprint_setup_screen.h +++ b/chrome/browser/ash/login/screens/fingerprint_setup_screen.h
@@ -8,6 +8,7 @@ #include <string> #include "base/callback.h" +#include "base/memory/weak_ptr.h" #include "chrome/browser/ash/login/screens/base_screen.h" // TODO(https://crbug.com/1164001): move to forward declaration. #include "chrome/browser/ui/webui/chromeos/login/fingerprint_setup_screen_handler.h" @@ -45,7 +46,7 @@ using ScreenExitCallback = base::RepeatingCallback<void(Result result)>; - FingerprintSetupScreen(FingerprintSetupScreenView* view, + FingerprintSetupScreen(base::WeakPtr<FingerprintSetupScreenView> view, const ScreenExitCallback& exit_callback); FingerprintSetupScreen(const FingerprintSetupScreen&) = delete; @@ -79,7 +80,7 @@ bool MaybeSkip(WizardContext* context) override; void ShowImpl() override; void HideImpl() override; - void OnUserActionDeprecated(const std::string& action_id) override; + void OnUserAction(const base::Value::List& args) override; private: void StartAddingFinger(); @@ -90,7 +91,7 @@ int enrolled_finger_count_ = 0; bool enroll_session_started_ = false; - FingerprintSetupScreenView* const view_; + base::WeakPtr<FingerprintSetupScreenView> view_; ScreenExitCallback exit_callback_; base::WeakPtrFactory<FingerprintSetupScreen> weak_ptr_factory_{this};
diff --git a/chrome/browser/ash/login/screens/guest_tos_screen.cc b/chrome/browser/ash/login/screens/guest_tos_screen.cc index 4d11437..dd45c27 100644 --- a/chrome/browser/ash/login/screens/guest_tos_screen.cc +++ b/chrome/browser/ash/login/screens/guest_tos_screen.cc
@@ -18,6 +18,7 @@ constexpr const char kUserActionBackClicked[] = "back-button"; constexpr const char kUserActionCancelClicked[] = "cancel"; +constexpr const char kUserActionGuestToSAccept[] = "guest-tos-accept"; std::string GetGoogleEulaOnlineUrl() { if (base::CommandLine::ForCurrentProcess()->HasSwitch( @@ -55,25 +56,15 @@ } } -GuestTosScreen::GuestTosScreen(GuestTosScreenView* view, +GuestTosScreen::GuestTosScreen(base::WeakPtr<GuestTosScreenView> view, const ScreenExitCallback& exit_callback) : BaseScreen(GuestTosScreenView::kScreenId, OobeScreenPriority::DEFAULT), - view_(view), + view_(std::move(view)), exit_callback_(exit_callback) { DCHECK(view_); - if (view_) - view_->Bind(this); } -GuestTosScreen::~GuestTosScreen() { - if (view_) - view_->Unbind(); -} - -void GuestTosScreen::OnViewDestroyed(GuestTosScreenView* view) { - if (view_ == view) - view_ = nullptr; -} +GuestTosScreen::~GuestTosScreen() = default; void GuestTosScreen::ShowImpl() { if (!view_) @@ -83,13 +74,18 @@ void GuestTosScreen::HideImpl() {} -void GuestTosScreen::OnUserActionDeprecated(const std::string& action_id) { +void GuestTosScreen::OnUserAction(const base::Value::List& args) { + const std::string& action_id = args[0].GetString(); if (action_id == kUserActionBackClicked) { exit_callback_.Run(Result::BACK); } else if (action_id == kUserActionCancelClicked) { exit_callback_.Run(Result::CANCEL); + } else if (action_id == kUserActionGuestToSAccept) { + CHECK_EQ(args.size(), 2); + const bool enable_usage_stats = args[1].GetBool(); + OnAccept(enable_usage_stats); } else { - BaseScreen::OnUserActionDeprecated(action_id); + BaseScreen::OnUserAction(args); } }
diff --git a/chrome/browser/ash/login/screens/guest_tos_screen.h b/chrome/browser/ash/login/screens/guest_tos_screen.h index 840a7691..e54c442e 100644 --- a/chrome/browser/ash/login/screens/guest_tos_screen.h +++ b/chrome/browser/ash/login/screens/guest_tos_screen.h
@@ -24,26 +24,24 @@ static std::string GetResultString(Result result); using ScreenExitCallback = base::RepeatingCallback<void(Result result)>; - explicit GuestTosScreen(GuestTosScreenView* view, + explicit GuestTosScreen(base::WeakPtr<GuestTosScreenView> view, const ScreenExitCallback& exit_callback); GuestTosScreen(const GuestTosScreen&) = delete; GuestTosScreen& operator=(const GuestTosScreen&) = delete; ~GuestTosScreen() override; - void OnViewDestroyed(GuestTosScreenView* view); - void OnAccept(bool enable_usage_stats); private: // BaseScreen: void ShowImpl() override; void HideImpl() override; - void OnUserActionDeprecated(const std::string& action_id) override; + void OnUserAction(const base::Value::List& args) override; // Callback to make when the guest OOBE prefs are done writing. void OnOobeGuestPrefWriteDone(); - GuestTosScreenView* view_ = nullptr; + base::WeakPtr<GuestTosScreenView> view_; ScreenExitCallback exit_callback_; base::WeakPtrFactory<GuestTosScreen> weak_ptr_factory_{this};
diff --git a/chrome/browser/ash/login/screens/hid_detection_screen.cc b/chrome/browser/ash/login/screens/hid_detection_screen.cc index 0f5632f..c1abb79 100644 --- a/chrome/browser/ash/login/screens/hid_detection_screen.cc +++ b/chrome/browser/ash/login/screens/hid_detection_screen.cc
@@ -718,6 +718,18 @@ const bool all_devices_autodetected = !pointing_device_id.empty() && !keyboard_device_id.empty(); + hid_detection::HidsMissing hids_missing = hid_detection::HidsMissing::kNone; + if (pointing_device_id.empty()) { + if (keyboard_device_id.empty()) { + hids_missing = hid_detection::HidsMissing::kPointerAndKeyboard; + } else { + hids_missing = hid_detection::HidsMissing::kPointer; + } + } else if (keyboard_device_id.empty()) { + hids_missing = hid_detection::HidsMissing::kKeyboard; + } + hid_detection::RecordInitialHidsMissing(hids_missing); + std::move(on_check_done).Run(!all_devices_autodetected); }
diff --git a/chrome/browser/ash/login/screens/hid_detection_screen_browsertest.cc b/chrome/browser/ash/login/screens/hid_detection_screen_browsertest.cc index 6cd2b5b4..786bcb7 100644 --- a/chrome/browser/ash/login/screens/hid_detection_screen_browsertest.cc +++ b/chrome/browser/ash/login/screens/hid_detection_screen_browsertest.cc
@@ -41,6 +41,7 @@ using ::testing::_; using HidType = hid_detection::HidType; +using HidsMissing = hid_detection::HidsMissing; using InputState = hid_detection::HidDetectionManager::InputState; using NiceMockDevice = std::unique_ptr<testing::NiceMock<device::MockBluetoothDevice>>; @@ -167,6 +168,15 @@ "OOBE.HidDetectionScreen.BluetoothPairing.Result", success, count); } + void AssertInitialHidsMissingCount(HidsMissing hids_missing, int count) { + // This is not applicable after the revamp. + if (GetParam()) + return; + + histogram_tester_.ExpectBucketCount( + "OOBE.HidDetectionScreen.InitialHidsMissing", hids_missing, count); + } + bool HasPendingConnectCallback() const { return !connect_callback_.is_null(); } @@ -305,8 +315,9 @@ IN_PROC_BROWSER_TEST_P(HIDDetectionScreenChromeboxTest, NoDevicesConnected) { OobeScreenWaiter(HIDDetectionView::kScreenId).Wait(); test::OobeJS().ExpectDisabledPath(kHidContinueButton); - EXPECT_FALSE(GetExitResult().has_value()); + AssertInitialHidsMissingCount(HidsMissing::kPointerAndKeyboard, /*count=*/1); + EXPECT_FALSE(GetExitResult().has_value()); ForceStopHidDetectionIfRevamp(); } @@ -648,6 +659,7 @@ IN_PROC_BROWSER_TEST_P(HIDDetectionSkipTest, BothDevicesPreConnected) { OobeScreenWaiter(WelcomeView::kScreenId).Wait(); + AssertInitialHidsMissingCount(HidsMissing::kNone, /*count=*/1); EXPECT_FALSE(GetExitResult().has_value()); histogram_tester.ExpectTotalCount("OOBE.HidDetectionScreen.HidConnected", 0); } @@ -877,6 +889,7 @@ test::OobeJS().ExpectHiddenPath(kHidTouchscreenEntry); test::OobeJS().CreateVisibilityWaiter(true, kHidMouseTick)->Wait(); test::OobeJS().ExpectEnabledPath(kHidContinueButton); + AssertInitialHidsMissingCount(HidsMissing::kKeyboard, /*count=*/1); AssertHidConnectedCount(HidType::kUsbPointer, /*count=*/0); AssertHidConnectedCount(HidType::kUsbKeyboard, /*count=*/0); @@ -895,4 +908,30 @@ ForceStopHidDetectionIfRevamp(); } +class HIDDetectionPreconnectedBTTest : public HIDDetectionScreenChromeboxTest { + public: + HIDDetectionPreconnectedBTTest() { + SetWaitUntilIdleAfterDeviceUpdate(false); + SimulateKeyboardHidConnected( + device::mojom::InputDeviceType::TYPE_BLUETOOTH); + } +}; + +INSTANTIATE_TEST_SUITE_P(All, HIDDetectionPreconnectedBTTest, testing::Bool()); + +IN_PROC_BROWSER_TEST_P(HIDDetectionPreconnectedBTTest, + BTKeyboardDevicePreConnected) { + OobeScreenWaiter(HIDDetectionView::kScreenId).Wait(); + test::OobeJS().ExpectHiddenPath(kHidTouchscreenEntry); + test::OobeJS().CreateVisibilityWaiter(true, kHidKeyboardTick)->Wait(); + test::OobeJS().ExpectEnabledPath(kHidContinueButton); + + AssertHidConnectedCount(HidType::kUsbPointer, /*count=*/0); + AssertHidConnectedCount(HidType::kUsbKeyboard, /*count=*/0); + AssertInitialHidsMissingCount(HidsMissing::kPointer, /*count=*/1); + + EXPECT_FALSE(GetExitResult().has_value()); + ForceStopHidDetectionIfRevamp(); +} + } // namespace ash
diff --git a/chrome/browser/ash/login/screens/pin_setup_screen.cc b/chrome/browser/ash/login/screens/pin_setup_screen.cc index 6c7526f2..bd3a183 100644 --- a/chrome/browser/ash/login/screens/pin_setup_screen.cc +++ b/chrome/browser/ash/login/screens/pin_setup_screen.cc
@@ -138,11 +138,10 @@ } void PinSetupScreen::ShowImpl() { - token_lifetime_timeout_.Start( - FROM_HERE, - base::Seconds(quick_unlock::AuthToken::kTokenExpirationSeconds), - base::BindOnce(&PinSetupScreen::OnTokenTimedOut, - weak_ptr_factory_.GetWeakPtr())); + token_lifetime_timeout_.Start(FROM_HERE, + quick_unlock::AuthToken::kTokenExpiration, + base::BindOnce(&PinSetupScreen::OnTokenTimedOut, + weak_ptr_factory_.GetWeakPtr())); quick_unlock::QuickUnlockStorage* quick_unlock_storage = quick_unlock::QuickUnlockFactory::GetForProfile( ProfileManager::GetActiveUserProfile());
diff --git a/chrome/browser/ash/login/users/default_user_image/default_user_images.cc b/chrome/browser/ash/login/users/default_user_image/default_user_images.cc index 895a8c1..95027cd0 100644 --- a/chrome/browser/ash/login/users/default_user_image/default_user_images.cc +++ b/chrome/browser/ash/login/users/default_user_image/default_user_images.cc
@@ -18,7 +18,6 @@ #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/system/sys_info.h" -#include "base/values.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h" #include "ui/chromeos/resources/grit/ui_chromeos_resources.h" @@ -375,14 +374,14 @@ return result; } -std::unique_ptr<base::ListValue> GetCurrentImageSetAsListValue() { - auto image_urls = std::make_unique<base::ListValue>(); +base::Value::List GetCurrentImageSetAsListValue() { + base::Value::List image_urls; for (auto& user_image : GetCurrentImageSet()) { base::Value::Dict image_data; image_data.Set("index", user_image.index); image_data.Set("title", std::move(user_image.title)); image_data.Set("url", user_image.url.spec()); - image_urls->GetList().Append(std::move(image_data)); + image_urls.Append(std::move(image_data)); } return image_urls; }
diff --git a/chrome/browser/ash/login/users/default_user_image/default_user_images.h b/chrome/browser/ash/login/users/default_user_image/default_user_images.h index c9f827d..2fa2381 100644 --- a/chrome/browser/ash/login/users/default_user_image/default_user_images.h +++ b/chrome/browser/ash/login/users/default_user_image/default_user_images.h
@@ -12,13 +12,10 @@ #include <vector> #include "ash/public/cpp/default_user_image.h" +#include "base/values.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "url/gurl.h" -namespace base { -class ListValue; -} - namespace gfx { class ImageSkia; } @@ -90,7 +87,7 @@ // Returns a vector of current |DefaultUserImage|. std::vector<DefaultUserImage> GetCurrentImageSet(); -std::unique_ptr<base::ListValue> GetCurrentImageSetAsListValue(); +base::Value::List GetCurrentImageSetAsListValue(); // Returns the source info of the default user image with specified index. // Returns nullopt if there is no source info.
diff --git a/chrome/browser/ash/login/users/default_user_image/default_user_images_unittest.cc b/chrome/browser/ash/login/users/default_user_image/default_user_images_unittest.cc index a24df5df..0ca5d53 100644 --- a/chrome/browser/ash/login/users/default_user_image/default_user_images_unittest.cc +++ b/chrome/browser/ash/login/users/default_user_image/default_user_images_unittest.cc
@@ -11,10 +11,10 @@ namespace default_user_image { TEST(DefaultUserImagesTest, CurrentImageSetShouldBeEligible) { - std::unique_ptr<base::ListValue> current_default_images = + base::Value::List current_default_images = default_user_image::GetCurrentImageSetAsListValue(); - for (auto& image_data : current_default_images.get()->GetListDeprecated()) { + for (auto& image_data : current_default_images) { const auto index = image_data.FindIntPath("index"); EXPECT_TRUE(index.has_value()); EXPECT_TRUE(IsValidIndex(index.value()));
diff --git a/chrome/browser/ash/login/wizard_controller.cc b/chrome/browser/ash/login/wizard_controller.cc index 4237a7d8..18fed0d 100644 --- a/chrome/browser/ash/login/wizard_controller.cc +++ b/chrome/browser/ash/login/wizard_controller.cc
@@ -694,7 +694,7 @@ base::BindRepeating(&WizardController::OnPinSetupScreenExit, weak_factory_.GetWeakPtr()))); append(std::make_unique<FingerprintSetupScreen>( - oobe_ui->GetView<FingerprintSetupScreenHandler>(), + oobe_ui->GetView<FingerprintSetupScreenHandler>()->AsWeakPtr(), base::BindRepeating(&WizardController::OnFingerprintSetupScreenExit, weak_factory_.GetWeakPtr()))); append(std::make_unique<GestureNavigationScreen>( @@ -778,7 +778,7 @@ weak_factory_.GetWeakPtr()))); append(std::make_unique<GuestTosScreen>( - oobe_ui->GetView<GuestTosScreenHandler>(), + oobe_ui->GetView<GuestTosScreenHandler>()->AsWeakPtr(), base::BindRepeating(&WizardController::OnGuestTosScreenExit, weak_factory_.GetWeakPtr()))); }
diff --git a/chrome/browser/ash/net/network_diagnostics/has_secure_wifi_connection_routine_unittest.cc b/chrome/browser/ash/net/network_diagnostics/has_secure_wifi_connection_routine_unittest.cc index 10eda17..d9bbb796 100644 --- a/chrome/browser/ash/net/network_diagnostics/has_secure_wifi_connection_routine_unittest.cc +++ b/chrome/browser/ash/net/network_diagnostics/has_secure_wifi_connection_routine_unittest.cc
@@ -17,8 +17,8 @@ // TODO(https://crbug.com/1164001): remove when migrated to namespace ash. namespace mojom = ::chromeos::network_diagnostics::mojom; -const char* kInsecureSecurity = shill::kSecurityWep; -const char* kSecureSecurity = shill::kSecurityPsk; +const char* kInsecureSecurity = shill::kSecurityClassWep; +const char* kSecureSecurity = shill::kSecurityClassPsk; } // namespace
diff --git a/chrome/browser/ash/net/network_diagnostics/network_diagnostics_unittest.cc b/chrome/browser/ash/net/network_diagnostics/network_diagnostics_unittest.cc index d338ab1..d53419e 100644 --- a/chrome/browser/ash/net/network_diagnostics/network_diagnostics_unittest.cc +++ b/chrome/browser/ash/net/network_diagnostics/network_diagnostics_unittest.cc
@@ -83,7 +83,7 @@ // Set up properties for the WiFi service. SetUpWiFi(shill::kStateOnline); SetServiceProperty(wifi_path(), shill::kSecurityClassProperty, - base::Value(shill::kSecurityPsk)); + base::Value(shill::kSecurityClassPsk)); base::RunLoop().RunUntilIdle(); }
diff --git a/chrome/browser/ash/policy/external_data/cloud_external_data_policy_observer.cc b/chrome/browser/ash/policy/external_data/cloud_external_data_policy_observer.cc index 41aa72c..eb6b089 100644 --- a/chrome/browser/ash/policy/external_data/cloud_external_data_policy_observer.cc +++ b/chrome/browser/ash/policy/external_data/cloud_external_data_policy_observer.cc
@@ -14,12 +14,13 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "base/containers/contains.h" -#include "base/logging.h" #include "base/values.h" #include "chrome/browser/ash/policy/core/device_local_account.h" +#include "chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/policy/profile_policy_connector.h" #include "chrome/browser/profiles/profile.h" +#include "components/policy/core/browser/policy_error_map.h" #include "components/policy/core/common/cloud/cloud_policy_core.h" #include "components/policy/core/common/cloud/cloud_policy_store.h" #include "components/policy/core/common/external_data_fetcher.h" @@ -264,7 +265,9 @@ void CloudExternalDataPolicyObserver::HandleExternalDataPolicyUpdate( const std::string& user_id, const PolicyMap::Entry* entry) { - if (!entry) { + PolicyErrorMap error_map; + if (!entry || !ExternalDataPolicyHandler::CheckPolicySettings( + policy_.c_str(), entry, &error_map)) { delegate_->OnExternalDataCleared(policy_, user_id); fetch_weak_ptrs_.erase(user_id); return;
diff --git a/chrome/browser/ash/policy/external_data/cloud_external_data_policy_observer_unittest.cc b/chrome/browser/ash/policy/external_data/cloud_external_data_policy_observer_unittest.cc index 28bee799..b0acd838 100644 --- a/chrome/browser/ash/policy/external_data/cloud_external_data_policy_observer_unittest.cc +++ b/chrome/browser/ash/policy/external_data/cloud_external_data_policy_observer_unittest.cc
@@ -10,6 +10,7 @@ #include "base/files/file_path.h" #include "base/files/file_util.h" +#include "base/json/json_reader.h" #include "base/json/json_writer.h" #include "base/memory/ptr_util.h" #include "base/memory/ref_counted.h" @@ -71,6 +72,7 @@ const char kAvatar1URL[] = "http://localhost/avatar1.jpg"; const char kAvatar2URL[] = "http://localhost/avatar2.jpg"; +const char kInvalidAvatarURL[] = "http//localhost/avatar1.jpg"; void ConstructAvatarPolicy(const std::string& file_name, const std::string& url, @@ -140,8 +142,10 @@ std::string avatar_policy_1_data_; std::string avatar_policy_2_data_; + std::string invalid_avatar_policy_data_; std::string avatar_policy_1_; std::string avatar_policy_2_; + std::string invalid_avatar_policy_; std::unique_ptr<ash::CrosSettings> cros_settings_; std::unique_ptr<DeviceLocalAccountPolicyService> @@ -206,6 +210,8 @@ &avatar_policy_1_); ConstructAvatarPolicy("avatar2.jpg", kAvatar2URL, &avatar_policy_2_data_, &avatar_policy_2_); + ConstructAvatarPolicy("avatar1.jpg", kInvalidAvatarURL, + &invalid_avatar_policy_data_, &invalid_avatar_policy_); } void CloudExternalDataPolicyObserverTest::TearDown() { @@ -355,8 +361,14 @@ const std::string& value) { PolicyMap policy_map; if (!value.empty()) { + auto parsed_json = base::JSONReader::ReadAndReturnValueWithError( + value, base::JSON_ALLOW_TRAILING_COMMAS); + ASSERT_TRUE(parsed_json.has_value()) << parsed_json.error().message; + ASSERT_TRUE(parsed_json->is_dict()); + policy_map.Set(key::kUserAvatarImage, POLICY_LEVEL_MANDATORY, - POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, base::Value(value), + POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, + (*parsed_json).Clone(), external_data_manager_.CreateExternalDataFetcher( key::kUserAvatarImage)); } @@ -993,4 +1005,25 @@ ClearObservations(); } +// Tests that if an invalid policy (a policy for which +// ExternalDataPolicyHandler::CheckPolicySettings() returns false) is passed +// through to the policy map, only a 'cleared' notifications is emitted. +TEST_F(CloudExternalDataPolicyObserverTest, RegularUserInvalidPolicyTest) { + SetRegularUserAvatarPolicy(invalid_avatar_policy_); + + CreateObserver(); + + EXPECT_CALL(external_data_manager_, + Fetch(key::kUserAvatarImage, std::string(), _)) + .Times(0); + + LogInAsRegularUser(); + + EXPECT_TRUE(set_calls_.empty()); + EXPECT_TRUE(fetched_calls_.empty()); + EXPECT_EQ(1u, cleared_calls_.size()); + EXPECT_EQ(kRegularUserID, cleared_calls_.front()); + ClearObservations(); +} + } // namespace policy
diff --git a/chrome/browser/ash/policy/external_data/device_cloud_external_data_policy_observer.cc b/chrome/browser/ash/policy/external_data/device_cloud_external_data_policy_observer.cc index 28c039f..3fe9925 100644 --- a/chrome/browser/ash/policy/external_data/device_cloud_external_data_policy_observer.cc +++ b/chrome/browser/ash/policy/external_data/device_cloud_external_data_policy_observer.cc
@@ -5,6 +5,8 @@ #include "chrome/browser/ash/policy/external_data/device_cloud_external_data_policy_observer.h" #include "base/bind.h" +#include "chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.h" +#include "components/policy/core/browser/policy_error_map.h" #include "components/policy/core/common/external_data_fetcher.h" namespace policy { @@ -53,7 +55,9 @@ void DeviceCloudExternalDataPolicyObserver::HandleExternalDataPolicyUpdate( const PolicyMap::Entry* entry) { - if (!entry) { + PolicyErrorMap error_map; + if (!entry || !ExternalDataPolicyHandler::CheckPolicySettings( + policy_.c_str(), entry, &error_map)) { delegate_->OnDeviceExternalDataCleared(policy_); return; }
diff --git a/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.cc b/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.cc index 2abf4f80..31d90983 100644 --- a/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.cc +++ b/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.cc
@@ -32,7 +32,6 @@ #include "components/onc/onc_pref_names.h" #include "components/policy/core/browser/policy_error_map.h" #include "components/policy/core/common/external_data_fetcher.h" -#include "components/policy/core/common/policy_map.h" #include "components/policy/core/common/schema.h" #include "components/policy/policy_constants.h" #include "components/prefs/pref_value_map.h" @@ -137,19 +136,28 @@ } // namespace ExternalDataPolicyHandler::ExternalDataPolicyHandler(const char* policy_name) - : TypeCheckingPolicyHandler(policy_name, base::Value::Type::DICTIONARY) {} + : TypeCheckingPolicyHandler(policy_name, base::Value::Type::DICT) {} ExternalDataPolicyHandler::~ExternalDataPolicyHandler() {} bool ExternalDataPolicyHandler::CheckPolicySettings(const PolicyMap& policies, PolicyErrorMap* errors) { - if (!TypeCheckingPolicyHandler::CheckPolicySettings(policies, errors)) - return false; - const std::string policy = policy_name(); if (!policies.IsPolicySet(policy)) return true; - const base::Value* value = policies.GetValue(policy, base::Value::Type::DICT); + + return CheckPolicySettings(policy.c_str(), policies.Get(policy), errors); +} + +bool ExternalDataPolicyHandler::CheckPolicySettings( + const char* policy, + const PolicyMap::Entry* entry, + PolicyErrorMap* errors) { + if (!TypeCheckingPolicyHandler::CheckPolicySettings( + policy, base::Value::Type::DICT, entry, errors)) + return false; + + const base::Value* value = entry->value(base::Value::Type::DICT); DCHECK(value); absl::optional<std::string> url_string = GetSubkeyString(*value, errors, policy, kSubkeyURL);
diff --git a/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.h b/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.h index 7eba492d..837ea56 100644 --- a/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.h +++ b/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.h
@@ -12,6 +12,7 @@ #include "chromeos/ash/components/network/network_ui_data.h" #include "components/onc/onc_constants.h" #include "components/policy/core/browser/configuration_policy_handler.h" +#include "components/policy/core/common/policy_map.h" namespace policy { @@ -28,6 +29,10 @@ ~ExternalDataPolicyHandler() override; + static bool CheckPolicySettings(const char* policy, + const PolicyMap::Entry* entry, + PolicyErrorMap* errors); + // TypeCheckingPolicyHandler: bool CheckPolicySettings(const PolicyMap& policies, PolicyErrorMap* errors) override;
diff --git a/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash_unittest.cc b/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash_unittest.cc index 1add5a36..680675a 100644 --- a/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash_unittest.cc +++ b/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash_unittest.cc
@@ -17,6 +17,7 @@ #include "chromeos/dbus/power/power_policy_controller.h" #include "components/policy/core/browser/configuration_policy_handler.h" #include "components/policy/core/browser/policy_error_map.h" +#include "components/policy/core/common/cloud/mock_cloud_external_data_manager.h" #include "components/policy/core/common/external_data_fetcher.h" #include "components/policy/core/common/policy_map.h" #include "components/policy/core/common/policy_types.h" @@ -173,9 +174,12 @@ "hash", "1234567890123456789012345678901234567890123456789012345678901234"); PolicyMap policy_map; - policy_map.Set(key::kUserAvatarImage, POLICY_LEVEL_MANDATORY, - POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, std::move(dict), - nullptr); + MockCloudExternalDataManager external_data_manager; + + policy_map.Set( + key::kUserAvatarImage, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, + POLICY_SOURCE_CLOUD, std::move(dict), + external_data_manager.CreateExternalDataFetcher(key::kUserAvatarImage)); PolicyErrorMap errors; EXPECT_TRUE(ExternalDataPolicyHandler(key::kUserAvatarImage) .CheckPolicySettings(policy_map, &errors));
diff --git a/chrome/browser/ash/policy/networking/network_policy_application_browsertest.cc b/chrome/browser/ash/policy/networking/network_policy_application_browsertest.cc index c4932fc..5c3deee 100644 --- a/chrome/browser/ash/policy/networking/network_policy_application_browsertest.cc +++ b/chrome/browser/ash/policy/networking/network_policy_application_browsertest.cc
@@ -414,7 +414,7 @@ kServiceWifi1, shill::kSSIDProperty, base::Value("WifiOne")); shill_service_client_test_->SetServiceProperty( kServiceWifi1, shill::kSecurityClassProperty, - base::Value(shill::kSecurityPsk)); + base::Value(shill::kSecurityClassPsk)); shill_service_client_test_->AddService( kServiceWifi2, "wifi_orig_guid_2", "WifiTwo", shill::kTypeWifi, @@ -423,7 +423,7 @@ kServiceWifi2, shill::kSSIDProperty, base::Value("WifiTwo")); shill_service_client_test_->SetServiceProperty( kServiceWifi2, shill::kSecurityClassProperty, - base::Value(shill::kSecurityPsk)); + base::Value(shill::kSecurityClassPsk)); // Apply device ONC policy and wait until it takes effect (one of the networks // auto connects). @@ -605,7 +605,7 @@ kServiceWifi1, shill::kSSIDProperty, base::Value("WifiOne")); shill_service_client_test_->SetServiceProperty( kServiceWifi1, shill::kSecurityClassProperty, - base::Value(shill::kSecurityPsk)); + base::Value(shill::kSecurityClassPsk)); shill_service_client_test_->AddService( kServiceWifi2, "wifi_orig_guid_2", "WifiTwo", shill::kTypeWifi, @@ -614,7 +614,7 @@ kServiceWifi2, shill::kSSIDProperty, base::Value("WifiTwo")); shill_service_client_test_->SetServiceProperty( kServiceWifi2, shill::kSecurityClassProperty, - base::Value(shill::kSecurityPsk)); + base::Value(shill::kSecurityClassPsk)); const char kDeviceONC1[] = R"( { @@ -696,7 +696,7 @@ kServiceWifi1, shill::kSSIDProperty, base::Value("DeviceLevelWifiSsid")); shill_service_client_test_->SetServiceProperty( kServiceWifi1, shill::kSecurityClassProperty, - base::Value(shill::kSecurity8021x)); + base::Value(shill::kSecurityClass8021x)); ServicePropertyValueWatcher eap_cert_id_watcher( shill_service_client_test_, kServiceWifi1, shill::kEapCertIdProperty); @@ -787,7 +787,7 @@ kServiceWifi1, shill::kSSIDProperty, base::Value("DeviceLevelWifiSsid")); shill_service_client_test_->SetServiceProperty( kServiceWifi1, shill::kSecurityClassProperty, - base::Value(shill::kSecurity8021x)); + base::Value(shill::kSecurityClass8021x)); const char kDeviceONC1[] = R"( { @@ -861,7 +861,7 @@ kServiceWifi1, shill::kSSIDProperty, base::Value("DeviceLevelWifiSsid")); shill_service_client_test_->SetServiceProperty( kServiceWifi1, shill::kSecurityClassProperty, - base::Value(shill::kSecurity8021x)); + base::Value(shill::kSecurityClass8021x)); std::string kDeviceONC1 = base::StringPrintf(R"( @@ -925,7 +925,7 @@ kServiceWifi1, shill::kSSIDProperty, base::Value("UserLevelWifiSsid")); shill_service_client_test_->SetServiceProperty( kServiceWifi1, shill::kSecurityClassProperty, - base::Value(shill::kSecurity8021x)); + base::Value(shill::kSecurityClass8021x)); std::string user_hash = ash::ProfileHelper::GetUserIdHashByUserIdForTesting( test_account_id_.GetUserEmail());
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/README.md b/chrome/browser/ash/policy/reporting/metrics_reporting/README.md new file mode 100644 index 0000000..eb2c8f4 --- /dev/null +++ b/chrome/browser/ash/policy/reporting/metrics_reporting/README.md
@@ -0,0 +1,10 @@ +This directory contains code that reports events and telemetry through the +Encrypted Reporting Pipeline (ERP). + +Generally speaking, new events that are reported through the ERP should be added +here. Exceptions include events that may be more conveniently enqueued from +another ChromiumOS process (which are usually best implemented within that +process), and other exceptional circumstances. + +Telemetry is data that are collected once or periodically. They are reported via +protos in `components/reporting/proto/synced/metric_data.proto`.
diff --git a/chrome/browser/ash/telemetry_extension/BUILD.gn b/chrome/browser/ash/telemetry_extension/BUILD.gn index 636c4607..cedee3d 100644 --- a/chrome/browser/ash/telemetry_extension/BUILD.gn +++ b/chrome/browser/ash/telemetry_extension/BUILD.gn
@@ -24,23 +24,6 @@ ] } -source_set("test_support") { - testonly = true - sources = [ - "fake_probe_service.cc", - "fake_probe_service.h", - "fake_probe_service_factory.cc", - "fake_probe_service_factory.h", - ] - - deps = [ - ":telemetry_extension", - "//base", - "//chrome/test:test_support", - "//chromeos/crosapi/mojom", - ] -} - source_set("unit_tests") { testonly = true sources = [
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.cc index 30e610c..fe83aec 100644 --- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.cc +++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.cc
@@ -120,8 +120,6 @@ OnAnimationThemeChanged(); ResetLocalSettings(); - // Will notify WebUI when fetches successfully. - FetchSettingsAndAlbums(); } void PersonalizationAppAmbientProviderImpl::SetAmbientModeEnabled( @@ -230,6 +228,24 @@ page_viewed_ = true; } +void PersonalizationAppAmbientProviderImpl::FetchSettingsAndAlbums() { + // If there is an ongoing update, do not fetch. If update succeeds, it will + // update the UI with the new settings. If update fails, it will restore + // previous settings and update UI. + if (is_updating_backend_) { + has_pending_fetch_request_ = true; + return; + } + + // TODO(b/161044021): Add a helper function to get all the albums. Currently + // only load 100 latest modified albums. + ash::AmbientBackendController::Get()->FetchSettingsAndAlbums( + kBannerWidthPx, kBannerHeightPx, /*num_albums=*/100, + base::BindOnce( + &PersonalizationAppAmbientProviderImpl::OnSettingsAndAlbumsFetched, + read_weak_factory_.GetWeakPtr())); +} + void PersonalizationAppAmbientProviderImpl::OnAmbientModeEnabledChanged() { const bool enabled = IsAmbientModeEnabled(); if (ambient_observer_remote_.is_bound()) { @@ -420,24 +436,6 @@ has_pending_fetch_request_ = false; } -void PersonalizationAppAmbientProviderImpl::FetchSettingsAndAlbums() { - // If there is an ongoing update, do not fetch. If update succeeds, it will - // update the UI with the new settings. If update fails, it will restore - // previous settings and update UI. - if (is_updating_backend_) { - has_pending_fetch_request_ = true; - return; - } - - // TODO(b/161044021): Add a helper function to get all the albums. Currently - // only load 100 latest modified albums. - ash::AmbientBackendController::Get()->FetchSettingsAndAlbums( - kBannerWidthPx, kBannerHeightPx, /*num_albums=*/100, - base::BindOnce( - &PersonalizationAppAmbientProviderImpl::OnSettingsAndAlbumsFetched, - read_weak_factory_.GetWeakPtr())); -} - void PersonalizationAppAmbientProviderImpl::OnSettingsAndAlbumsFetched( const absl::optional<ash::AmbientSettings>& settings, ash::PersonalAlbums personal_albums) {
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.h b/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.h index e624265..f4cbd37 100644 --- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.h +++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.h
@@ -56,6 +56,7 @@ ash::AmbientModeTopicSource topic_source, bool selected) override; void SetPageViewed() override; + void FetchSettingsAndAlbums() override; // Notify WebUI the latest values. void OnAmbientModeEnabledChanged(); @@ -86,8 +87,6 @@ // `success` is true when update successfully. void UpdateUIWithCachedSettings(bool success); - // Fetch settings and albums from Backdrop server. - void FetchSettingsAndAlbums(); void OnSettingsAndAlbumsFetched( const absl::optional<ash::AmbientSettings>& settings, ash::PersonalAlbums personal_albums);
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl_unittest.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl_unittest.cc index ca80b43..d51a162f7 100644 --- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl_unittest.cc +++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl_unittest.cc
@@ -227,7 +227,10 @@ ambient_provider_->SetAnimationTheme(animation_theme); } - void FetchSettings() { ambient_provider_->FetchSettingsAndAlbums(); } + void FetchSettings() { + ambient_provider_remote()->FetchSettingsAndAlbums(); + ambient_provider_remote().FlushForTesting(); + } void UpdateSettings() { if (!ambient_provider_->settings_) @@ -381,7 +384,7 @@ EXPECT_TRUE(pref_service); pref_service->SetBoolean(ash::ambient::prefs::kAmbientModeEnabled, false); SetAmbientObserver(); - ambient_provider_remote().FlushForTesting(); + FetchSettings(); EXPECT_FALSE(ObservedAmbientModeEnabled()); pref_service->SetBoolean(ash::ambient::prefs::kAmbientModeEnabled, true); @@ -393,7 +396,7 @@ TEST_F(PersonalizationAppAmbientProviderImplTest, ShouldCallOnAnimationThemeChanged) { SetAmbientObserver(); - ambient_provider_remote().FlushForTesting(); + FetchSettings(); SetAnimationTheme(ash::AmbientAnimationTheme::kSlideshow); EXPECT_EQ(ash::AmbientAnimationTheme::kSlideshow, ObservedAnimationTheme()); histogram_tester().ExpectBucketCount(kAmbientModeAnimationThemeHistogramName, @@ -410,9 +413,8 @@ TEST_F(PersonalizationAppAmbientProviderImplTest, ShouldCallOnTopicSourceChanged) { - // Will fetch settings when observer is set. SetAmbientObserver(); - ambient_provider_remote().FlushForTesting(); + FetchSettings(); ReplyFetchSettingsAndAlbums(/*success=*/true); EXPECT_EQ(ash::AmbientModeTopicSource::kGooglePhotos, ObservedTopicSource()); EXPECT_FALSE(ObservedGooglePhotosAlbumsPreviews().empty()); @@ -422,9 +424,8 @@ } TEST_F(PersonalizationAppAmbientProviderImplTest, ShouldCallOnAlbumsChanged) { - // Will fetch settings when observer is set. SetAmbientObserver(); - ambient_provider_remote().FlushForTesting(); + FetchSettings(); ReplyFetchSettingsAndAlbums(/*success=*/true); auto albums = ObservedAlbums(); // The fake albums are set in FakeAmbientBackendControllerImpl. Hidden setting @@ -435,9 +436,8 @@ TEST_F(PersonalizationAppAmbientProviderImplTest, ShouldCallOnTemperatureUnitChanged) { - // Will fetch settings when observer is set. SetAmbientObserver(); - ambient_provider_remote().FlushForTesting(); + FetchSettings(); ReplyFetchSettingsAndAlbums(/*success=*/true); EXPECT_EQ(ash::AmbientModeTemperatureUnit::kCelsius, ObservedTemperatureUnit());
diff --git a/chrome/browser/autocomplete/DEPS b/chrome/browser/autocomplete/DEPS new file mode 100644 index 0000000..3f815627 --- /dev/null +++ b/chrome/browser/autocomplete/DEPS
@@ -0,0 +1,6 @@ +specific_include_rules = { + # TODO(crbug.com/1341399): Use side panel abstract API once it's available. + "chrome_autocomplete_provider_client\.cc": [ + "+chrome/browser/ui/views", + ] +}
diff --git a/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc b/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc index ca60d5f..d581940 100644 --- a/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc +++ b/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc
@@ -80,6 +80,10 @@ #include "chrome/browser/ui/browser_commands.h" #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "chrome/browser/ui/ui_features.h" +#include "chrome/browser/ui/views/frame/browser_view.h" +#include "chrome/browser/ui/views/side_panel/side_panel_coordinator.h" +#include "chrome/browser/ui/views/side_panel/side_panel_entry.h" #include "chrome/browser/upgrade_detector/upgrade_detector.h" #endif @@ -450,6 +454,33 @@ #endif // !BUILDFLAG(IS_ANDROID) } +bool ChromeAutocompleteProviderClient::OpenJourneys() { +#if !BUILDFLAG(IS_ANDROID) + if (!base::FeatureList::IsEnabled(features::kUnifiedSidePanel) || + !base::FeatureList::IsEnabled(features::kSidePanelJourneys) || + !features::kSidePanelJourneysOpensFromOmnibox.Get()) { + return false; + } + + Browser* browser = BrowserList::GetInstance()->GetLastActive(); + if (!browser) + return false; + + BrowserView* const browser_view = + BrowserView::GetBrowserViewForBrowser(browser); + if (!browser_view) + return false; + + if (browser_view->side_panel_coordinator()) { + browser_view->side_panel_coordinator()->Show( + SidePanelEntry::Id::kHistoryClusters); + return true; + } +#endif // !BUILDFLAG(IS_ANDROID) + + return false; +} + void ChromeAutocompleteProviderClient::PromptPageTranslation() { #if !BUILDFLAG(IS_ANDROID) Browser* browser = BrowserList::GetInstance()->GetLastActive();
diff --git a/chrome/browser/autocomplete/chrome_autocomplete_provider_client.h b/chrome/browser/autocomplete/chrome_autocomplete_provider_client.h index 85dd0c31a..82b18a3 100644 --- a/chrome/browser/autocomplete/chrome_autocomplete_provider_client.h +++ b/chrome/browser/autocomplete/chrome_autocomplete_provider_client.h
@@ -107,6 +107,7 @@ void OpenIncognitoClearBrowsingDataDialog() override; void CloseIncognitoWindows() override; void PromptPageTranslation() override; + bool OpenJourneys() override; // For testing. void set_storage_partition(content::StoragePartition* storage_partition) {
diff --git a/chrome/browser/autofill/form_structure_browsertest.cc b/chrome/browser/autofill/form_structure_browsertest.cc index 36b47d3..918538d 100644 --- a/chrome/browser/autofill/form_structure_browsertest.cc +++ b/chrome/browser/autofill/form_structure_browsertest.cc
@@ -110,7 +110,7 @@ // integers in |field->section| with consecutive unique integers. // The section string is of the form "fieldname_id1_id2-suffix", where // id1, id2 are platform-dependent and thus need to be substituted. - std::string section = field->section; + std::string section = field->section.ToString(); size_t last_underscore = section.find_last_of('_'); size_t second_last_underscore = section.find_last_of('_', last_underscore - 1); @@ -198,8 +198,10 @@ features::kAutofillEnableSupportForParsingWithSharedLabels, // TODO(crbug.com/1277480): Remove once launched. features::kAutofillEnableNameSurenameParsing, - // TODO(crbug/1190334): Remove once launched. - features::kAutofillParseMerchantPromoCodeFields}, + // TODO(crbug.com/1190334): Remove once launched. + features::kAutofillParseMerchantPromoCodeFields, + // TODO(crbug.com/1113970): Remove once launched. + features::kAutofillSectionUponRedundantNameInfo}, // Disabled {}); }
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/BUILD.gn b/chrome/browser/chromeos/extensions/telemetry/api/BUILD.gn index f1979b78..7f8e173 100644 --- a/chrome/browser/chromeos/extensions/telemetry/api/BUILD.gn +++ b/chrome/browser/chromeos/extensions/telemetry/api/BUILD.gn
@@ -78,6 +78,10 @@ "diagnostics_api_browsertest.cc", "fake_api_guard_delegate.cc", "fake_api_guard_delegate.h", + "fake_probe_service.cc", + "fake_probe_service.h", + "fake_probe_service_factory.cc", + "fake_probe_service_factory.h", "telemetry_api_browsertest.cc", "telemetry_extension_capabilities_browser_test.cc", ] @@ -89,7 +93,6 @@ "//ash/webui/telemetry_extension_ui/services:telemetry_services_test", "//base", "//chrome/browser/ash/telemetry_extension", - "//chrome/browser/ash/telemetry_extension:test_support", "//chrome/browser/ash/wilco_dtc_supportd:mojo_utils", "//chrome/common/chromeos/extensions", "//chrome/test:test_support",
diff --git a/chrome/browser/ash/telemetry_extension/fake_probe_service.cc b/chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service.cc similarity index 93% rename from chrome/browser/ash/telemetry_extension/fake_probe_service.cc rename to chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service.cc index db26893..7c80b4a6 100644 --- a/chrome/browser/ash/telemetry_extension/fake_probe_service.cc +++ b/chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service.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/ash/telemetry_extension/fake_probe_service.h" +#include "chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service.h" #include <memory> #include <utility> @@ -15,7 +15,7 @@ #include "mojo/public/cpp/bindings/pending_receiver.h" #include "testing/gtest/include/gtest/gtest.h" -namespace ash { +namespace chromeos { FakeProbeService::FakeProbeService() : receiver_(this) {} FakeProbeService::~FakeProbeService() { @@ -60,4 +60,4 @@ oem_data_ = std::move(oem_data); } -} // namespace ash +} // namespace chromeos
diff --git a/chrome/browser/ash/telemetry_extension/fake_probe_service.h b/chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service.h similarity index 87% rename from chrome/browser/ash/telemetry_extension/fake_probe_service.h rename to chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service.h index 745682d..4f899db 100644 --- a/chrome/browser/ash/telemetry_extension/fake_probe_service.h +++ b/chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_ASH_TELEMETRY_EXTENSION_FAKE_PROBE_SERVICE_H_ -#define CHROME_BROWSER_ASH_TELEMETRY_EXTENSION_FAKE_PROBE_SERVICE_H_ +#ifndef CHROME_BROWSER_CHROMEOS_EXTENSIONS_TELEMETRY_API_FAKE_PROBE_SERVICE_H_ +#define CHROME_BROWSER_CHROMEOS_EXTENSIONS_TELEMETRY_API_FAKE_PROBE_SERVICE_H_ #include <memory> #include <vector> @@ -12,7 +12,7 @@ #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver.h" -namespace ash { +namespace chromeos { class FakeProbeService : public crosapi::mojom::ProbeService { public: @@ -61,6 +61,6 @@ std::vector<crosapi::mojom::ProbeCategoryEnum> expected_requested_categories_; }; -} // namespace ash +} // namespace chromeos -#endif // CHROME_BROWSER_ASH_TELEMETRY_EXTENSION_FAKE_PROBE_SERVICE_H_ +#endif // CHROME_BROWSER_CHROMEOS_EXTENSIONS_TELEMETRY_API_FAKE_PROBE_SERVICE_H_
diff --git a/chrome/browser/ash/telemetry_extension/fake_probe_service_factory.cc b/chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service_factory.cc similarity index 86% rename from chrome/browser/ash/telemetry_extension/fake_probe_service_factory.cc rename to chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service_factory.cc index d308f00..714aac9c 100644 --- a/chrome/browser/ash/telemetry_extension/fake_probe_service_factory.cc +++ b/chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service_factory.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/ash/telemetry_extension/fake_probe_service_factory.h" +#include "chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service_factory.h" #include <memory> #include <utility> @@ -10,7 +10,7 @@ #include "chromeos/crosapi/mojom/probe_service.mojom.h" #include "mojo/public/cpp/bindings/pending_receiver.h" -namespace ash { +namespace chromeos { FakeProbeServiceFactory::FakeProbeServiceFactory() = default; FakeProbeServiceFactory::~FakeProbeServiceFactory() = default; @@ -27,4 +27,4 @@ return std::move(fake_service_); } -} // namespace ash +} // namespace chromeos
diff --git a/chrome/browser/ash/telemetry_extension/fake_probe_service_factory.h b/chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service_factory.h similarity index 68% rename from chrome/browser/ash/telemetry_extension/fake_probe_service_factory.h rename to chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service_factory.h index 8f0ad28..821fb969 100644 --- a/chrome/browser/ash/telemetry_extension/fake_probe_service_factory.h +++ b/chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service_factory.h
@@ -2,17 +2,17 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_ASH_TELEMETRY_EXTENSION_FAKE_PROBE_SERVICE_FACTORY_H_ -#define CHROME_BROWSER_ASH_TELEMETRY_EXTENSION_FAKE_PROBE_SERVICE_FACTORY_H_ +#ifndef CHROME_BROWSER_CHROMEOS_EXTENSIONS_TELEMETRY_API_FAKE_PROBE_SERVICE_FACTORY_H_ +#define CHROME_BROWSER_CHROMEOS_EXTENSIONS_TELEMETRY_API_FAKE_PROBE_SERVICE_FACTORY_H_ #include <memory> -#include "chrome/browser/ash/telemetry_extension/fake_probe_service.h" #include "chrome/browser/ash/telemetry_extension/probe_service_ash.h" +#include "chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service.h" #include "chromeos/crosapi/mojom/probe_service.mojom.h" #include "mojo/public/cpp/bindings/pending_receiver.h" -namespace ash { +namespace chromeos { class FakeProbeServiceFactory : public ash::ProbeServiceAsh::Factory { public: @@ -31,6 +31,6 @@ std::unique_ptr<FakeProbeService> fake_service_; }; -} // namespace ash +} // namespace chromeos -#endif // CHROME_BROWSER_ASH_TELEMETRY_EXTENSION_FAKE_PROBE_SERVICE_FACTORY_H_ +#endif // CHROME_BROWSER_CHROMEOS_EXTENSIONS_TELEMETRY_API_FAKE_PROBE_SERVICE_FACTORY_H_
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/telemetry_api_browsertest.cc b/chrome/browser/chromeos/extensions/telemetry/api/telemetry_api_browsertest.cc index 271d25d..c04dff44 100644 --- a/chrome/browser/chromeos/extensions/telemetry/api/telemetry_api_browsertest.cc +++ b/chrome/browser/chromeos/extensions/telemetry/api/telemetry_api_browsertest.cc
@@ -6,10 +6,10 @@ #include <string> #include <utility> -#include "chrome/browser/ash/telemetry_extension/fake_probe_service.h" -#include "chrome/browser/ash/telemetry_extension/fake_probe_service_factory.h" #include "chrome/browser/ash/telemetry_extension/probe_service_ash.h" #include "chrome/browser/chromeos/extensions/telemetry/api/base_telemetry_extension_browser_test.h" +#include "chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service.h" +#include "chrome/browser/chromeos/extensions/telemetry/api/fake_probe_service_factory.h" #include "content/public/test/browser_test.h" #include "testing/gtest/include/gtest/gtest.h" @@ -30,19 +30,19 @@ protected: void SetServiceForTesting( - std::unique_ptr<ash::FakeProbeService> fake_diagnostics_service_impl) { + std::unique_ptr<FakeProbeService> fake_probe_service_impl) { fake_probe_factory_.SetCreateInstanceResponse( - std::move(fake_diagnostics_service_impl)); + std::move(fake_probe_service_impl)); } - ash::FakeProbeServiceFactory fake_probe_factory_; + FakeProbeServiceFactory fake_probe_factory_; }; IN_PROC_BROWSER_TEST_F(TelemetryExtensionTelemetryApiBrowserTest, GetBatteryInfo_Error) { // Configure FakeProbeService. { - auto fake_service_impl = std::make_unique<ash::FakeProbeService>(); + auto fake_service_impl = std::make_unique<FakeProbeService>(); fake_service_impl->SetExpectedLastRequestedCategories( {crosapi::mojom::ProbeCategoryEnum::kBattery}); @@ -97,7 +97,7 @@ std::move(battery_info)); } - auto fake_service_impl = std::make_unique<ash::FakeProbeService>(); + auto fake_service_impl = std::make_unique<FakeProbeService>(); fake_service_impl->SetProbeTelemetryInfoResponse(std::move(telemetry_info)); fake_service_impl->SetExpectedLastRequestedCategories( {crosapi::mojom::ProbeCategoryEnum::kBattery}); @@ -138,7 +138,7 @@ GetCpuInfo_Error) { // Configure FakeProbeService. { - auto fake_service_impl = std::make_unique<ash::FakeProbeService>(); + auto fake_service_impl = std::make_unique<FakeProbeService>(); fake_service_impl->SetExpectedLastRequestedCategories( {crosapi::mojom::ProbeCategoryEnum::kCpu}); @@ -231,7 +231,7 @@ crosapi::mojom::ProbeCpuResult::NewCpuInfo(std::move(cpu_info)); } - auto fake_service_impl = std::make_unique<ash::FakeProbeService>(); + auto fake_service_impl = std::make_unique<FakeProbeService>(); fake_service_impl->SetProbeTelemetryInfoResponse(std::move(telemetry_info)); fake_service_impl->SetExpectedLastRequestedCategories( {crosapi::mojom::ProbeCategoryEnum::kCpu}); @@ -294,7 +294,7 @@ GetMemoryInfo_Error) { // Configure FakeProbeService. { - auto fake_service_impl = std::make_unique<ash::FakeProbeService>(); + auto fake_service_impl = std::make_unique<FakeProbeService>(); fake_service_impl->SetExpectedLastRequestedCategories( {crosapi::mojom::ProbeCategoryEnum::kMemory}); @@ -336,7 +336,7 @@ std::move(memory_info)); } - auto fake_service_impl = std::make_unique<ash::FakeProbeService>(); + auto fake_service_impl = std::make_unique<FakeProbeService>(); fake_service_impl->SetProbeTelemetryInfoResponse(std::move(telemetry_info)); fake_service_impl->SetExpectedLastRequestedCategories( {crosapi::mojom::ProbeCategoryEnum::kMemory}); @@ -363,7 +363,7 @@ GetOemDataWithSerialNumberPermission_Error) { // Configure FakeProbeService. { - auto fake_service_impl = std::make_unique<ash::FakeProbeService>(); + auto fake_service_impl = std::make_unique<FakeProbeService>(); SetServiceForTesting(std::move(fake_service_impl)); } @@ -384,7 +384,7 @@ GetOemDataWithSerialNumberPermission_Success) { // Configure FakeProbeService. { - auto fake_service_impl = std::make_unique<ash::FakeProbeService>(); + auto fake_service_impl = std::make_unique<FakeProbeService>(); auto oem_data = crosapi::mojom::ProbeOemData::New(); oem_data->oem_data = "123456789"; @@ -409,7 +409,7 @@ GetOsVersionInfo_Error) { // Configure FakeProbeService. { - auto fake_service_impl = std::make_unique<ash::FakeProbeService>(); + auto fake_service_impl = std::make_unique<FakeProbeService>(); fake_service_impl->SetExpectedLastRequestedCategories( {crosapi::mojom::ProbeCategoryEnum::kSystem}); @@ -452,7 +452,7 @@ std::move(system_info)); } - auto fake_service_impl = std::make_unique<ash::FakeProbeService>(); + auto fake_service_impl = std::make_unique<FakeProbeService>(); fake_service_impl->SetProbeTelemetryInfoResponse(std::move(telemetry_info)); fake_service_impl->SetExpectedLastRequestedCategories( {crosapi::mojom::ProbeCategoryEnum::kSystem}); @@ -481,7 +481,7 @@ GetVpdInfoError) { // Configure FakeProbeService. { - auto fake_service_impl = std::make_unique<ash::FakeProbeService>(); + auto fake_service_impl = std::make_unique<FakeProbeService>(); fake_service_impl->SetExpectedLastRequestedCategories( {crosapi::mojom::ProbeCategoryEnum::kCachedVpdData}); @@ -518,7 +518,7 @@ crosapi::mojom::ProbeCachedVpdResult::NewVpdInfo(std::move(vpd_info)); } - auto fake_service_impl = std::make_unique<ash::FakeProbeService>(); + auto fake_service_impl = std::make_unique<FakeProbeService>(); fake_service_impl->SetProbeTelemetryInfoResponse(std::move(telemetry_info)); fake_service_impl->SetExpectedLastRequestedCategories( {crosapi::mojom::ProbeCategoryEnum::kCachedVpdData}); @@ -544,7 +544,7 @@ GetStatefulPartitionInfo_Error) { // Configure FakeProbeService. { - auto fake_service_impl = std::make_unique<ash::FakeProbeService>(); + auto fake_service_impl = std::make_unique<FakeProbeService>(); fake_service_impl->SetExpectedLastRequestedCategories( {crosapi::mojom::ProbeCategoryEnum::kStatefulPartition}); @@ -582,7 +582,7 @@ std::move(stateful_part_info)); } - auto fake_service_impl = std::make_unique<ash::FakeProbeService>(); + auto fake_service_impl = std::make_unique<FakeProbeService>(); fake_service_impl->SetProbeTelemetryInfoResponse(std::move(telemetry_info)); fake_service_impl->SetExpectedLastRequestedCategories( {crosapi::mojom::ProbeCategoryEnum::kStatefulPartition}); @@ -681,7 +681,7 @@ std::move(battery_info)); } - auto fake_service_impl = std::make_unique<ash::FakeProbeService>(); + auto fake_service_impl = std::make_unique<FakeProbeService>(); fake_service_impl->SetProbeTelemetryInfoResponse(std::move(telemetry_info)); fake_service_impl->SetExpectedLastRequestedCategories( {crosapi::mojom::ProbeCategoryEnum::kBattery}); @@ -721,9 +721,9 @@ IN_PROC_BROWSER_TEST_F( TelemetryExtensionTelemetryApiWithoutSerialNumberBrowserTest, GetOemDataWithoutSerialNumberPermission) { - // Configure FakeDiagnosticsService. + // Configure FakeProbeService. { - auto fake_service_impl = std::make_unique<ash::FakeProbeService>(); + auto fake_service_impl = std::make_unique<FakeProbeService>(); SetServiceForTesting(std::move(fake_service_impl)); } @@ -759,7 +759,7 @@ crosapi::mojom::ProbeCachedVpdResult::NewVpdInfo(std::move(vpd_info)); } - auto fake_service_impl = std::make_unique<ash::FakeProbeService>(); + auto fake_service_impl = std::make_unique<FakeProbeService>(); fake_service_impl->SetProbeTelemetryInfoResponse(std::move(telemetry_info)); fake_service_impl->SetExpectedLastRequestedCategories( {crosapi::mojom::ProbeCategoryEnum::kCachedVpdData});
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.cc index 0e228fe..601a484 100644 --- a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.cc +++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.cc
@@ -340,6 +340,10 @@ void ContentAnalysisDelegate::StringRequestCallback( BinaryUploadService::Result result, enterprise_connectors::ContentAnalysisResponse response) { + // Remember to send an ack for this response. + if (result == safe_browsing::BinaryUploadService::Result::SUCCESS) + request_tokens_.push_back(response.request_token()); + int64_t content_size = 0; for (const std::string& entry : data_.text) content_size += entry.size(); @@ -378,6 +382,9 @@ void ContentAnalysisDelegate::FilesRequestCallback( std::vector<RequestHandlerResult> results) { + // Remember to send acks for any responses. + files_request_handler_->AppendRequestTokensTo(&request_tokens_); + // No reporting here, because the MultiFileRequestHandler does that. DCHECK_EQ(results.size(), result_.paths_results.size()); for (size_t index = 0; index < results.size(); ++index) { @@ -417,6 +424,10 @@ void ContentAnalysisDelegate::PageRequestCallback( BinaryUploadService::Result result, enterprise_connectors::ContentAnalysisResponse response) { + // Remember to send an ack for this response. + if (result == safe_browsing::BinaryUploadService::Result::SUCCESS) + request_tokens_.push_back(response.request_token()); + RecordDeepScanMetrics(access_point_, base::TimeTicks::Now() - upload_start_time_, page_size_bytes_, result, response); @@ -581,6 +592,8 @@ return; } + AckAllRequests(); + // If showing the warning message, wait before running the callback. The // callback will be called either in BypassWarnings or Cancel. if (final_result_ != FinalContentAnalysisResult::WARNING) @@ -607,4 +620,25 @@ } } +void ContentAnalysisDelegate::AckAllRequests() { + BinaryUploadService* upload_service = GetBinaryUploadService(); + if (!upload_service) + return; + + // Calculate overall status for all requests. + // TODO(b/240629222): Calculate status based on final_result_. + // However, final_result_ does not take info account timeout and I think + // the enum values of ContentAnalysisAcknowledgement::Status are not + // right. + auto status = ContentAnalysisAcknowledgement::SUCCESS; + + for (auto& token : request_tokens_) { + auto ack = std::make_unique<safe_browsing::BinaryUploadService::Ack>( + data_.settings.cloud_or_local_settings); + ack->set_request_token(token); + ack->set_status(status); + upload_service->MaybeAcknowledge(std::move(ack)); + } +} + } // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h index e8ac0d3..79cecdd 100644 --- a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h +++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h
@@ -275,6 +275,10 @@ void UpdateFinalResult(FinalContentAnalysisResult message, const std::string& tag); + // Send an acknowledgement to the service provider of the final result + // for the requests of this ContentAnalysisDelegate instance. + void AckAllRequests(); + // Returns the BinaryUploadService used to upload content for deep scanning. // Virtual to override in tests. virtual safe_browsing::BinaryUploadService* GetBinaryUploadService(); @@ -341,6 +345,10 @@ // Always nullptr for non-file content scanning. std::unique_ptr<FilesRequestHandler> files_request_handler_; + // The request tokens of all the requests that make up the user action + // represented by this ContentAnalysisDelegate instance. + std::vector<std::string> request_tokens_; + base::TimeTicks upload_start_time_; base::WeakPtrFactory<ContentAnalysisDelegate> weak_ptr_factory_{this};
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_browsertest.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_browsertest.cc index abd79c8..b95fe5a 100644 --- a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_browsertest.cc +++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_browsertest.cc
@@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include <algorithm> #include <memory> #include <set> @@ -90,8 +91,16 @@ } int requests_count() const { return requests_count_; } + int ack_count() const { return ack_count_; } private: + void MaybeAcknowledge(std::unique_ptr<Ack> ack) override { + ++ack_count_; + ASSERT_NE(requests_tokens_.end(), + std::find(requests_tokens_.begin(), requests_tokens_.end(), + ack->ack().request_token())); + } + void UploadForDeepScanning(std::unique_ptr<Request> request) override { ++requests_count_; @@ -109,10 +118,13 @@ ASSERT_FALSE(file.empty()); ASSERT_TRUE(prepared_file_results_.count(file)); ASSERT_TRUE(prepared_file_responses_.count(file)); + requests_tokens_.push_back( + prepared_file_responses_[file].request_token()); request->FinishRequest(prepared_file_results_[file], prepared_file_responses_[file]); break; case AnalysisConnector::BULK_DATA_ENTRY: + requests_tokens_.push_back(prepared_text_response_.request_token()); request->FinishRequest(prepared_text_result_, prepared_text_response_); break; @@ -145,7 +157,9 @@ std::map<std::string, BinaryUploadService::Result> prepared_file_results_; std::map<std::string, ContentAnalysisResponse> prepared_file_responses_; + std::vector<std::string> requests_tokens_; int requests_count_ = 0; + int ack_count_ = 0; bool should_automatically_authorize_ = false; }; @@ -374,6 +388,7 @@ // 1 request to authenticate for upload. ASSERT_EQ(FakeBinaryUploadServiceStorage()->requests_count(), 1); + ASSERT_EQ(FakeBinaryUploadServiceStorage()->ack_count(), 0); } IN_PROC_BROWSER_TEST_P(ContentAnalysisDelegateBrowserTest, Files) { @@ -458,6 +473,7 @@ // There should have been 1 request per file (2 files) and 1 for // authentication. ASSERT_EQ(FakeBinaryUploadServiceStorage()->requests_count(), 3); + ASSERT_EQ(FakeBinaryUploadServiceStorage()->ack_count(), 2); } IN_PROC_BROWSER_TEST_P(ContentAnalysisDelegateBrowserTest, Texts) { @@ -543,6 +559,7 @@ // There should have been 1 request for all texts, // 1 for authentication of the scanning request. ASSERT_EQ(FakeBinaryUploadServiceStorage()->requests_count(), 2); + ASSERT_EQ(FakeBinaryUploadServiceStorage()->ack_count(), 1); } IN_PROC_BROWSER_TEST_P(ContentAnalysisDelegateBrowserTest, Throttled) { @@ -623,8 +640,9 @@ EXPECT_TRUE(called); // There should have been 1 request for the first file and 1 for - // authentication. + // authentication. There were no successful requests so no acks. ASSERT_EQ(FakeBinaryUploadServiceStorage()->requests_count(), 2); + ASSERT_EQ(FakeBinaryUploadServiceStorage()->ack_count(), 0); } // This class tests each of the blocking settings used in Connector policies: @@ -736,6 +754,7 @@ run_loop.Run(); EXPECT_TRUE(called); ASSERT_EQ(FakeBinaryUploadServiceStorage()->requests_count(), 0); + ASSERT_EQ(FakeBinaryUploadServiceStorage()->ack_count(), 0); } IN_PROC_BROWSER_TEST_P(ContentAnalysisDelegateBlockingSettingBrowserTest, @@ -1080,6 +1099,7 @@ // removed for crbug.com/1090088, then count should be 1), + 1 to scan the // file in all cases. ASSERT_EQ(FakeBinaryUploadServiceStorage()->requests_count(), 2); + ASSERT_EQ(FakeBinaryUploadServiceStorage()->ack_count(), 1); } // This class tests that ContentAnalysisDelegate is handled correctly when the @@ -1205,6 +1225,7 @@ // No requests should be made since the DM token is unauthorized. ASSERT_EQ(FakeBinaryUploadServiceStorage()->requests_count(), 0); + ASSERT_EQ(FakeBinaryUploadServiceStorage()->ack_count(), 0); } IN_PROC_BROWSER_TEST_P(ContentAnalysisDelegateUnauthorizedBrowserTest, Files) { @@ -1255,6 +1276,7 @@ // No requests should be made since the DM token is unauthorized. ASSERT_EQ(FakeBinaryUploadServiceStorage()->requests_count(), 0); + ASSERT_EQ(FakeBinaryUploadServiceStorage()->ack_count(), 0); } } // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/analysis/files_request_handler.cc b/chrome/browser/enterprise/connectors/analysis/files_request_handler.cc index e4035b66..da5028e6 100644 --- a/chrome/browser/enterprise/connectors/analysis/files_request_handler.cc +++ b/chrome/browser/enterprise/connectors/analysis/files_request_handler.cc
@@ -213,6 +213,10 @@ size_t index, safe_browsing::BinaryUploadService::Result upload_result, enterprise_connectors::ContentAnalysisResponse response) { + // Remember to send an ack for this response. + if (upload_result == safe_browsing::BinaryUploadService::Result::SUCCESS) + request_tokens_.push_back(response.request_token()); + DCHECK_EQ(results_.size(), paths_.size()); if (upload_result == safe_browsing::BinaryUploadService::Result::TOO_MANY_REQUESTS) {
diff --git a/chrome/browser/enterprise/connectors/analysis/files_request_handler_unittest.cc b/chrome/browser/enterprise/connectors/analysis/files_request_handler_unittest.cc index 50578dd0..31b1e29 100644 --- a/chrome/browser/enterprise/connectors/analysis/files_request_handler_unittest.cc +++ b/chrome/browser/enterprise/connectors/analysis/files_request_handler_unittest.cc
@@ -232,6 +232,13 @@ fake_files_request_handler_->UploadData(); RunUntilDone(); + + EXPECT_GE(paths.size(), + fake_files_request_handler_->GetRequestTokensForTesting().size()); + for (auto& token : + fake_files_request_handler_->GetRequestTokensForTesting()) { + EXPECT_FALSE(token.empty()); + } } enterprise_connectors::AnalysisSettings GetSettings() { @@ -330,6 +337,8 @@ *response.add_results() = dlp_response_.value().results(0); } + // Set any non empty request token. + response.set_request_token("request_token"); return response; }
diff --git a/chrome/browser/enterprise/connectors/analysis/local_binary_upload_service.cc b/chrome/browser/enterprise/connectors/analysis/local_binary_upload_service.cc index 396b14b..c2361ab 100644 --- a/chrome/browser/enterprise/connectors/analysis/local_binary_upload_service.cc +++ b/chrome/browser/enterprise/connectors/analysis/local_binary_upload_service.cc
@@ -27,6 +27,13 @@ request->cloud_or_local_settings().user_specific()}; } +// Build a content analysis SDK client config based on the ack being sent. +content_analysis::sdk::Client::Config SDKConfigFromAck( + const safe_browsing::BinaryUploadService::Ack* ack) { + return {ack->cloud_or_local_settings().local_path(), + ack->cloud_or_local_settings().user_specific()}; +} + // Convert enterprise connector ContentAnalysisRequest into the SDK equivalent. // SDK ContentAnalysisRequest is a strict subset of the enterprise connector // version, therefore the function should always work. @@ -58,6 +65,20 @@ return response; } +content_analysis::sdk::ContentAnalysisAcknowledgement ConvertChromeAckToSDKAck( + const ContentAnalysisAcknowledgement& ack) { + content_analysis::sdk::ContentAnalysisAcknowledgement sdk_ack; + + // TODO(b/226679912): Add unit tests to + // components/enterprise/common/proto/connectors_unittest.cc to ensure the + // conversion methods here and below always work. + if (!sdk_ack.ParseFromString(ack.SerializeAsString())) { + return content_analysis::sdk::ContentAnalysisAcknowledgement(); + } + + return sdk_ack; +} + // Sends a request to the local server provider and waits for a response. absl::optional<content_analysis::sdk::ContentAnalysisResponse> SendRequestToSDK( scoped_refptr<ContentAnalysisSdkManager::WrappedClient> wrapped, @@ -67,8 +88,8 @@ content_analysis::sdk::ContentAnalysisResponse response; if (wrapped && wrapped->client()) { - int sts = wrapped->client()->Send(sdk_request, &response); - if (sts == 0) + int status = wrapped->client()->Send(sdk_request, &response); + if (status == 0) return response; } return absl::nullopt; @@ -93,6 +114,28 @@ request->FinishRequest(result, std::move(response)); } +int SendAckToSDK( + scoped_refptr<ContentAnalysisSdkManager::WrappedClient> wrapped, + content_analysis::sdk::ContentAnalysisAcknowledgement sdk_ack) { + base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, + base::BlockingType::MAY_BLOCK); + + int status = -1; + if (wrapped && wrapped->client()) + status = wrapped->client()->Acknowledge(sdk_ack); + + return status; +} + +void HandleAckResponse( + std::unique_ptr<safe_browsing::BinaryUploadService::Ack> ack, + int status) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + + if (status != 0) + ContentAnalysisSdkManager::Get()->ResetClient(SDKConfigFromAck(ack.get())); +} + // Sends a request's data to the local service provider. Handles the response // the service provider asynchronously. void DoLocalContentAnalysis( @@ -106,8 +149,8 @@ } request->SetRandomRequestToken(); - DCHECK(request->cloud_or_local_settings().is_local_analysis()); + auto client = ContentAnalysisSdkManager::Get()->GetClient( SDKConfigFromRequest(request.get())); content_analysis::sdk::ContentAnalysisRequest sdk_request = @@ -121,8 +164,6 @@ NOTREACHED(); } - // TODO(b/238897238): Manage SDK client pointer via - // ChromeBrowserPolicyConnector. base::ThreadPool::PostTaskAndReplyWithResult( FROM_HERE, {base::TaskPriority::USER_VISIBLE, base::MayBlock(), @@ -149,4 +190,20 @@ base::BindOnce(&DoLocalContentAnalysis, std::move(request))); } +void LocalBinaryUploadService::MaybeAcknowledge(std::unique_ptr<Ack> ack) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + + auto client = + ContentAnalysisSdkManager::Get()->GetClient(SDKConfigFromAck(ack.get())); + content_analysis::sdk::ContentAnalysisAcknowledgement sdk_ack = + ConvertChromeAckToSDKAck(ack->ack()); + + base::ThreadPool::PostTaskAndReplyWithResult( + FROM_HERE, + {base::TaskPriority::USER_VISIBLE, base::MayBlock(), + base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, + base::BindOnce(&SendAckToSDK, client, std::move(sdk_ack)), + base::BindOnce(&HandleAckResponse, std::move(ack))); +} + } // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/analysis/local_binary_upload_service.h b/chrome/browser/enterprise/connectors/analysis/local_binary_upload_service.h index 76cc5c9b..c2fdf808 100644 --- a/chrome/browser/enterprise/connectors/analysis/local_binary_upload_service.h +++ b/chrome/browser/enterprise/connectors/analysis/local_binary_upload_service.h
@@ -19,6 +19,7 @@ // Send the given file contents to local partners for deep scanning. void MaybeUploadForDeepScanning(std::unique_ptr<Request> request) override; + void MaybeAcknowledge(std::unique_ptr<Ack> ack) override; }; } // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/analysis/request_handler_base.cc b/chrome/browser/enterprise/connectors/analysis/request_handler_base.cc index 317d3347..2d4b1aae 100644 --- a/chrome/browser/enterprise/connectors/analysis/request_handler_base.cc +++ b/chrome/browser/enterprise/connectors/analysis/request_handler_base.cc
@@ -26,6 +26,14 @@ return UploadDataImpl(); } +void RequestHandlerBase::AppendRequestTokensTo( + std::vector<std::string>* request_tokens) { + request_tokens->reserve(request_tokens->size() + request_tokens_.size()); + std::move(std::begin(request_tokens_), std::end(request_tokens_), + std::back_inserter(*request_tokens)); + request_tokens_.clear(); +} + void RequestHandlerBase::PrepareRequest( enterprise_connectors::AnalysisConnector connector, safe_browsing::BinaryUploadService::Request* request) {
diff --git a/chrome/browser/enterprise/connectors/analysis/request_handler_base.h b/chrome/browser/enterprise/connectors/analysis/request_handler_base.h index 39d8a51..11c454c2c 100644 --- a/chrome/browser/enterprise/connectors/analysis/request_handler_base.h +++ b/chrome/browser/enterprise/connectors/analysis/request_handler_base.h
@@ -5,6 +5,9 @@ #ifndef CHROME_BROWSER_ENTERPRISE_CONNECTORS_ANALYSIS_REQUEST_HANDLER_BASE_H_ #define CHROME_BROWSER_ENTERPRISE_CONNECTORS_ANALYSIS_REQUEST_HANDLER_BASE_H_ +#include <string> +#include <vector> + #include "base/memory/raw_ptr.h" #include "chrome/browser/enterprise/connectors/common.h" #include "chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h" @@ -38,12 +41,23 @@ // the background and false if there is nothing to do. bool UploadData(); + // Moves the tokens of all file requests being handled to the end of the + // given vector. + void AppendRequestTokensTo(std::vector<std::string>* request_tokens); + // This method is called after a user has bypassed a scanning warning and is // expected to send one or more reports corresponding to the data that was // allowed to be transferred by the user. virtual void ReportWarningBypass( absl::optional<std::u16string> user_justification) = 0; + // After All file requests have been processed, this call can be used to + // retrieve any request tokens stored internally. There should one for + // each successful request and they must all be non-empty. + const std::vector<std::string>& GetRequestTokensForTesting() const { + return request_tokens_; + } + private: // Uploads the actual requests. To be implemented by child classes. // Returns true if uploading is occurring in the background and false if there @@ -65,6 +79,10 @@ GURL url_; safe_browsing::DeepScanAccessPoint access_point_; + // The request tokens of all the requests that make up the user action + // represented by this ContentAnalysisDelegate instance. + std::vector<std::string> request_tokens_; + base::TimeTicks upload_start_time_; };
diff --git a/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc b/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc index bf88cd2f..280b012c 100644 --- a/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc +++ b/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc
@@ -165,7 +165,7 @@ AddService(kWifi1ServicePath, "wifi1", shill::kTypeWifi, shill::kStateOnline); SetServiceProperty(kWifi1ServicePath, shill::kSecurityClassProperty, - base::Value(shill::kSecurityWep)); + base::Value(shill::kSecurityClassWep)); SetServiceProperty(kWifi1ServicePath, shill::kWifiBSsid, base::Value("00:01:02:03:04:05")); SetServiceProperty(kWifi1ServicePath, shill::kSignalStrengthProperty, @@ -193,7 +193,7 @@ AddService(kWifi2ServicePath, "wifi2_PSK", shill::kTypeWifi, shill::kStateIdle); SetServiceProperty(kWifi2ServicePath, shill::kSecurityClassProperty, - base::Value(shill::kSecurityPsk)); + base::Value(shill::kSecurityClassPsk)); SetServiceProperty(kWifi2ServicePath, shill::kSignalStrengthProperty, base::Value(80)); SetServiceProperty(kWifi2ServicePath, shill::kConnectableProperty,
diff --git a/chrome/browser/extensions/api/quick_unlock_private/quick_unlock_private_api_unittest.cc b/chrome/browser/extensions/api/quick_unlock_private/quick_unlock_private_api_unittest.cc index a90bf46..e36a1b9 100644 --- a/chrome/browser/extensions/api/quick_unlock_private/quick_unlock_private_api_unittest.cc +++ b/chrome/browser/extensions/api/quick_unlock_private/quick_unlock_private_api_unittest.cc
@@ -682,7 +682,7 @@ EXPECT_EQ(token_info->token, quick_unlock_storage->GetAuthToken()->Identifier()); EXPECT_EQ(token_info->lifetime_seconds, - ash::quick_unlock::AuthToken::kTokenExpirationSeconds); + ash::quick_unlock::AuthToken::kTokenExpiration.InSeconds()); } // Verifies that GetAuthTokenValid fails when an invalid password is provided.
diff --git a/chrome/browser/extensions/api/quick_unlock_private/quick_unlock_private_ash_utils.cc b/chrome/browser/extensions/api/quick_unlock_private/quick_unlock_private_ash_utils.cc index 519b4061..9f9dece5 100644 --- a/chrome/browser/extensions/api/quick_unlock_private/quick_unlock_private_ash_utils.cc +++ b/chrome/browser/extensions/api/quick_unlock_private/quick_unlock_private_ash_utils.cc
@@ -76,7 +76,7 @@ ash::quick_unlock::QuickUnlockFactory::GetForProfile(profile_); quick_unlock_storage->MarkStrongAuth(); token_info->token = quick_unlock_storage->CreateAuthToken(user_context); - token_info->lifetime_seconds = AuthToken::kTokenExpirationSeconds; + token_info->lifetime_seconds = AuthToken::kTokenExpiration.InSeconds(); // The user has successfully authenticated, so we should reset pin/fingerprint // attempt counts.
diff --git a/chrome/browser/extensions/api/web_request/web_request_apitest.cc b/chrome/browser/extensions/api/web_request/web_request_apitest.cc index 8a36059..fba63311d 100644 --- a/chrome/browser/extensions/api/web_request/web_request_apitest.cc +++ b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
@@ -91,6 +91,7 @@ #include "content/public/test/browser_test_utils.h" #include "content/public/test/prerender_test_util.h" #include "content/public/test/simple_url_loader_test_helper.h" +#include "content/public/test/test_navigation_observer.h" #include "content/public/test/url_loader_interceptor.h" #include "content/public/test/url_loader_monitor.h" #include "content/public/test/web_transport_simple_test_server.h" @@ -100,6 +101,7 @@ #include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/process_manager.h" +#include "extensions/browser/service_worker/service_worker_test_utils.h" #include "extensions/common/extension_builder.h" #include "extensions/common/extension_features.h" #include "extensions/common/features/feature.h" @@ -4906,4 +4908,86 @@ << message_; } +using ContextType = ExtensionBrowserTest::ContextType; + +class WebRequestApiTestWithContextType + : public ExtensionWebRequestApiTest, + public testing::WithParamInterface<ContextType> { + public: + WebRequestApiTestWithContextType() = default; + ~WebRequestApiTestWithContextType() override = default; +}; + +namespace { + +constexpr char kGetNumRequests[] = + R"((async function() { + // Wait for any pending storage writes to complete. + await flushStorage(); + chrome.storage.local.get( + {requestCount: -1}, + (result) => { + chrome.test.sendScriptResult(result.requestCount); + }); + })();)"; + +} // namespace + +// Tests that webRequest listeners are persistent across browser restarts. +IN_PROC_BROWSER_TEST_P(WebRequestApiTestWithContextType, + PRE_TestListenersArePersistent) { + // Load an extension that listens for webRequest events. + ASSERT_TRUE(StartEmbeddedTestServer()); + const Extension* extension = + LoadExtension(test_data_dir_.AppendASCII("webrequest_persistent")); + ASSERT_TRUE(extension); + + // Navigate to example.com (a site the extension has access to). + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), + embedded_test_server()->GetURL("example.com", "/simple.html"))); + + // Validate that we have a single request seen by the extension. + base::Value request_count = BackgroundScriptExecutor::ExecuteScript( + profile(), extension->id(), kGetNumRequests, + BackgroundScriptExecutor::ResultCapture::kSendScriptResult); + ASSERT_TRUE(request_count.is_int()); + EXPECT_EQ(1, request_count.GetInt()); +} + +IN_PROC_BROWSER_TEST_P(WebRequestApiTestWithContextType, + TestListenersArePersistent) { + // Find the installed extension and wait for it to fully load. + ASSERT_TRUE(StartEmbeddedTestServer()); + const Extension* extension = nullptr; + for (const auto& candidate : extension_registry()->enabled_extensions()) { + if (candidate->name() == "Web Request Persistence") { + extension = candidate.get(); + break; + } + } + ASSERT_TRUE(extension); + WaitForExtensionViewsToLoad(); + + // Navigate once more to example.com. + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), + embedded_test_server()->GetURL("example.com", "/simple.html"))); + + // We should now have two records seen by the extension. + base::Value request_count = BackgroundScriptExecutor::ExecuteScript( + profile(), extension->id(), kGetNumRequests, + BackgroundScriptExecutor::ResultCapture::kSendScriptResult); + + ASSERT_TRUE(request_count.is_int()); + EXPECT_EQ(2, request_count.GetInt()); +} + +INSTANTIATE_TEST_SUITE_P(PersistentBackground, + WebRequestApiTestWithContextType, + ::testing::Values(ContextType::kPersistentBackground)); +INSTANTIATE_TEST_SUITE_P(ServiceWorker, + WebRequestApiTestWithContextType, + ::testing::Values(ContextType::kServiceWorker)); + } // namespace extensions
diff --git a/chrome/browser/feed/android/BUILD.gn b/chrome/browser/feed/android/BUILD.gn index c766fc47..6fbf31e 100644 --- a/chrome/browser/feed/android/BUILD.gn +++ b/chrome/browser/feed/android/BUILD.gn
@@ -26,6 +26,8 @@ "java/src/org/chromium/chrome/browser/feed/FeedReliabilityLoggingBridge.java", "java/src/org/chromium/chrome/browser/feed/FeedScrollState.java", "java/src/org/chromium/chrome/browser/feed/FeedServiceBridge.java", + "java/src/org/chromium/chrome/browser/feed/FeedServiceDependencyProviderFactory.java", + "java/src/org/chromium/chrome/browser/feed/FeedServiceUtil.java", "java/src/org/chromium/chrome/browser/feed/FeedSliceViewTracker.java", "java/src/org/chromium/chrome/browser/feed/FeedStream.java", "java/src/org/chromium/chrome/browser/feed/FeedStreamViewResizer.java",
diff --git a/chrome/browser/feed/android/feed_service_bridge.cc b/chrome/browser/feed/android/feed_service_bridge.cc index 677e69c..dbd050da 100644 --- a/chrome/browser/feed/android/feed_service_bridge.cc +++ b/chrome/browser/feed/android/feed_service_bridge.cc
@@ -164,6 +164,12 @@ return base::FeatureList::IsEnabled(kInterestFeedV2Autoplay); } +TabGroupEnabledState FeedServiceBridge::GetTabGroupEnabledState() { + JNIEnv* env = base::android::AttachCurrentThread(); + return static_cast<TabGroupEnabledState>( + Java_FeedServiceBridge_getTabGroupEnabledState(env)); +} + void FeedServiceBridge::ClearAll() { JNIEnv* env = base::android::AttachCurrentThread(); Java_FeedServiceBridge_clearAll(env);
diff --git a/chrome/browser/feed/android/feed_service_bridge.h b/chrome/browser/feed/android/feed_service_bridge.h index de67bf3..c2a8194 100644 --- a/chrome/browser/feed/android/feed_service_bridge.h +++ b/chrome/browser/feed/android/feed_service_bridge.h
@@ -20,6 +20,7 @@ static std::string GetLanguageTag(); static DisplayMetrics GetDisplayMetrics(); static bool IsAutoplayEnabled(); + static TabGroupEnabledState GetTabGroupEnabledState(); static void ClearAll(); static bool IsEnabled(); static void PrefetchImage(const GURL& url);
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedServiceBridge.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedServiceBridge.java index cb873fdd..c153962f 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedServiceBridge.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedServiceBridge.java
@@ -21,7 +21,6 @@ import org.chromium.chrome.browser.feed.v2.FeedUserActionType; import org.chromium.chrome.browser.xsurface.ImageCacheHelper; import org.chromium.chrome.browser.xsurface.ProcessScope; -import org.chromium.chrome.browser.xsurface.ProcessScopeDependencyProvider; import java.lang.reflect.InvocationTargetException; import java.util.Locale; @@ -38,6 +37,25 @@ return FeedServiceBridgeJni.TEST_HOOKS; } + private static FeedServiceDependencyProviderFactory getDependencyProviderFactory() { + Class<?> dependencyProviderFactoryClazz; + try { + dependencyProviderFactoryClazz = Class.forName( + "org.chromium.chrome.browser.app.feed.FeedServiceDependencyProviderFactoryImpl"); + } catch (ClassNotFoundException e) { + return null; + } + try { + return (FeedServiceDependencyProviderFactory) dependencyProviderFactoryClazz + .getDeclaredMethod("getInstance") + .invoke(null); + } catch (NoSuchMethodException e) { + } catch (InvocationTargetException e) { + } catch (IllegalAccessException e) { + } + return null; + } + private static ProcessScope sXSurfaceProcessScope; public static ProcessScope xSurfaceProcessScope() { @@ -48,28 +66,8 @@ if (!feedHooks.isEnabled()) { return null; } - Class<?> dependencyProviderFactoryClazz; - try { - dependencyProviderFactoryClazz = Class.forName( - "org.chromium.chrome.browser.app.feed.ProcessScopeDependencyProviderFactory"); - } catch (ClassNotFoundException e) { - return null; - } - - ProcessScopeDependencyProvider dependencyProvider = null; - try { - dependencyProvider = (ProcessScopeDependencyProvider) dependencyProviderFactoryClazz - .getDeclaredMethod("create") - .invoke(null); - } catch (NoSuchMethodException e) { - } catch (InvocationTargetException e) { - } catch (IllegalAccessException e) { - } - if (dependencyProvider == null) { - return null; - } - - sXSurfaceProcessScope = feedHooks.createProcessScope(dependencyProvider); + sXSurfaceProcessScope = feedHooks.createProcessScope( + getDependencyProviderFactory().createProcessScopeDependencyProvider()); return sXSurfaceProcessScope; } @@ -77,6 +75,15 @@ sXSurfaceProcessScope = processScope; } + private static FeedServiceUtil sFeedServiceUtil; + + public static FeedServiceUtil feedServiceUtil() { + if (sFeedServiceUtil == null) { + sFeedServiceUtil = getDependencyProviderFactory().createFeedServiceUtil(); + } + return sFeedServiceUtil; + } + public static boolean isEnabled() { return FeedServiceBridgeJni.get().isEnabled(); } @@ -117,6 +124,12 @@ } } } + + @CalledByNative + public static @TabGroupEnabledState int getTabGroupEnabledState() { + return feedServiceUtil().getTabGroupEnabledState(); + } + /** Called at startup to trigger creation of |FeedService|. */ public static void startup() { FeedServiceBridgeJni.get().startup();
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedServiceDependencyProviderFactory.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedServiceDependencyProviderFactory.java new file mode 100644 index 0000000..2768f8d --- /dev/null +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedServiceDependencyProviderFactory.java
@@ -0,0 +1,19 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.feed; + +/** + * Provides instances needed in response to Native calls. + * + * Note that certain instances, like ProcessScopeDependencyProvider is sometimes needed in response + * to a Native call, we use this through reflection rather than simply injecting an instance. + */ +public interface FeedServiceDependencyProviderFactory { + /** Constructs and returns a ProcessScopeDependencyProvider instance. */ + FeedProcessScopeDependencyProvider createProcessScopeDependencyProvider(); + + /** Constructs and returns a FeedServiceUtil instance. */ + FeedServiceUtil createFeedServiceUtil(); +}
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedServiceUtil.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedServiceUtil.java new file mode 100644 index 0000000..475e870 --- /dev/null +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedServiceUtil.java
@@ -0,0 +1,14 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.feed; + +/** + * Provides access to utilities used for feed service. + */ +public interface FeedServiceUtil { + /** Returns the enabled state of tab group feature. */ + @TabGroupEnabledState + int getTabGroupEnabledState(); +}
diff --git a/chrome/browser/feed/feed_service_factory.cc b/chrome/browser/feed/feed_service_factory.cc index 5c1084c..6931b18 100644 --- a/chrome/browser/feed/feed_service_factory.cc +++ b/chrome/browser/feed/feed_service_factory.cc
@@ -102,6 +102,13 @@ return false; #endif } + TabGroupEnabledState GetTabGroupEnabledState() override { +#if BUILDFLAG(IS_ANDROID) + return FeedServiceBridge::GetTabGroupEnabledState(); +#else + return TabGroupEnabledState::kNone; +#endif + } void ClearAll() override { // TODO(jianli): Need to figure out what to do for desktop version. #if BUILDFLAG(IS_ANDROID)
diff --git a/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.cc b/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.cc index 2a54196..f0aade0 100644 --- a/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.cc +++ b/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.cc
@@ -399,13 +399,12 @@ return; // Add sync logs to |response|. - std::unique_ptr<base::DictionaryValue> sync_logs = - syncer::sync_ui_util::ConstructAboutInformation( - syncer::sync_ui_util::IncludeSensitiveData(false), - SyncServiceFactory::GetForProfile(profile), - chrome::GetChannelName(chrome::WithExtendedStable(true))); + base::Value::Dict sync_logs = syncer::sync_ui_util::ConstructAboutInformation( + syncer::sync_ui_util::IncludeSensitiveData(false), + SyncServiceFactory::GetForProfile(profile), + chrome::GetChannelName(chrome::WithExtendedStable(true))); std::string serialized_sync_logs; - JSONStringValueSerializer(&serialized_sync_logs).Serialize(*sync_logs); + JSONStringValueSerializer(&serialized_sync_logs).Serialize(sync_logs); response->emplace(kSyncDataKey, serialized_sync_logs); }
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 8a50f81..9c2f34b 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -624,6 +624,11 @@ "expiry_milestone": 109 }, { + "name": "batch-fetch-requests", + "owners": ["pmeenan"], + "expiry_milestone": 120 + }, + { "name": "biometric-authentication-for-filling", "owners": ["sygiet@google.com", "vsemeniuk@google.com"], "expiry_milestone": 111 @@ -746,7 +751,7 @@ { "name": "bypass-app-banner-engagement-checks", "owners": [ "dmurph" ], - "expiry_milestone": 95 + "expiry_milestone": 120 }, { "name": "calculate-native-win-occlusion", @@ -989,21 +994,11 @@ "expiry_milestone": 110 }, { - "name": "content-suggestions-header-migration", - "owners": [ "thegreenfrog@google.com", "adamta@google.com" ], - "expiry_milestone": 105 - }, - { "name": "content-suggestions-ui-module-refresh", "owners": [ "thegreenfrog@google.com", "bling-flags@google.com" ], "expiry_milestone": 108 }, { - "name": "content-suggestions-uiviewcontroller-migration", - "owners": [ "thegreenfrog@google.com", "adamta@google.com" ], - "expiry_milestone": 106 - }, - { "name": "context-menu-popup-style", "owners": [ "wenyufu", "clank-app-team@google.com" ], "expiry_milestone": 108 @@ -4118,11 +4113,6 @@ "expiry_milestone": 108 }, { - "name": "launcher-pulsing-blocks-refresh", - "owners": [ "anasalazar", "cros-system-ui-eng@google.com" ], - "expiry_milestone": 105 - }, - { "name": "lazily-create-web-state-on-restoration", "owners": ["olivierrobin", "sdefresne"], "expiry_milestone": 105 @@ -5841,11 +5831,6 @@ "expiry_milestone": 106 }, { - "name": "single-cell-content-suggestions", - "owners": [ "thegreenfrog@google.com", "sczs@google.com"], - "expiry_milestone": 106 - }, - { "name": "single-ntp", "owners": [ "thegreenfrog@google.com", "sczs@google.com"], "expiry_milestone": 106
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index b5b175a4..9b27a7e 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -103,6 +103,10 @@ "reporting delays and noise. Only works if the Attribution Reporting API " "is already enabled."; +const char kBatchFetchRequestsName[] = "Batch Fetch Requests"; +const char kBatchFetchRequestsDescription[] = + "Process resource requests in batches while parsing a HTML document."; + const char kBrokerFileOperationsOnDiskCacheInNetworkServiceName[] = "Broker file operations on disk cache in the Network Service"; const char kBrokerFileOperationsOnDiskCacheInNetworkServiceDescription[] = @@ -5842,11 +5846,6 @@ "Adds a 'Hide all suggestions' option to the continue section item " "right-click menus."; -const char kLauncherPulsingBlocksRefreshName[] = - "Launcher pulsing blocks' new UI"; -const char kLauncherPulsingBlocksRefreshDescription[] = - "Show the new pulsing blocks' UI in launcher during initial apps sync."; - const char kMacAddressRandomizationName[] = "MAC address randomization"; const char kMacAddressRandomizationDescription[] = "Feature to allow MAC address randomization to be enabled for WiFi "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index d918a6e..39c6055 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -81,6 +81,9 @@ extern const char kAttributionReportingDebugModeName[]; extern const char kAttributionReportingDebugModeDescription[]; +extern const char kBatchFetchRequestsName[]; +extern const char kBatchFetchRequestsDescription[]; + extern const char kBrokerFileOperationsOnDiskCacheInNetworkServiceName[]; extern const char kBrokerFileOperationsOnDiskCacheInNetworkServiceDescription[]; @@ -3354,9 +3357,6 @@ extern const char kLauncherHideContinueSectionName[]; extern const char kLauncherHideContinueSectionDescription[]; -extern const char kLauncherPulsingBlocksRefreshName[]; -extern const char kLauncherPulsingBlocksRefreshDescription[]; - extern const char kMacAddressRandomizationName[]; extern const char kMacAddressRandomizationDescription[];
diff --git a/chrome/browser/lacros/sync/sync_user_settings_client_lacros.cc b/chrome/browser/lacros/sync/sync_user_settings_client_lacros.cc new file mode 100644 index 0000000..9763b8bc --- /dev/null +++ b/chrome/browser/lacros/sync/sync_user_settings_client_lacros.cc
@@ -0,0 +1,59 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/lacros/sync/sync_user_settings_client_lacros.h" + +#include "base/callback.h" +#include "chromeos/crosapi/mojom/sync.mojom.h" +#include "components/sync/driver/sync_service.h" +#include "components/sync/driver/sync_user_settings.h" +#include "mojo/public/cpp/bindings/receiver.h" +#include "mojo/public/cpp/bindings/remote.h" + +SyncUserSettingsClientLacros::SyncUserSettingsClientLacros( + syncer::SyncService* sync_service, + mojo::Remote<crosapi::mojom::SyncService>* sync_service_remote) + : sync_service_(sync_service) { + DCHECK(sync_service_); + DCHECK(sync_service_remote); + DCHECK(sync_service_remote->is_bound()); + + (*sync_service_remote) + ->BindUserSettingsClient(client_remote_.BindNewPipeAndPassReceiver()); + client_remote_.get()->AddObserver( + observer_receiver_.BindNewPipeAndPassRemote()); + sync_service_->AddObserver(this); + + client_remote_.get()->IsAppsSyncEnabled( + base::BindOnce(&SyncUserSettingsClientLacros::OnIsAppsSyncEnabledFetched, + base::Unretained(this))); +} + +SyncUserSettingsClientLacros::~SyncUserSettingsClientLacros() { + if (sync_service_) { + sync_service_->RemoveObserver(this); + } +} + +void SyncUserSettingsClientLacros::OnAppsSyncEnabledChanged( + bool is_apps_sync_enabled) { + DCHECK(sync_service_); + sync_service_->GetUserSettings()->SetAppsSyncEnabledByOs( + is_apps_sync_enabled); +} + +void SyncUserSettingsClientLacros::OnSyncShutdown( + syncer::SyncService* sync_service) { + sync_service_->RemoveObserver(this); + client_remote_.reset(); + observer_receiver_.reset(); + sync_service_ = nullptr; +} + +void SyncUserSettingsClientLacros::OnIsAppsSyncEnabledFetched( + bool is_apps_sync_enabled) { + DCHECK(sync_service_); + sync_service_->GetUserSettings()->SetAppsSyncEnabledByOs( + is_apps_sync_enabled); +}
diff --git a/chrome/browser/lacros/sync/sync_user_settings_client_lacros.h b/chrome/browser/lacros/sync/sync_user_settings_client_lacros.h new file mode 100644 index 0000000..715d2e8 --- /dev/null +++ b/chrome/browser/lacros/sync/sync_user_settings_client_lacros.h
@@ -0,0 +1,53 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_LACROS_SYNC_SYNC_USER_SETTINGS_CLIENT_LACROS_H_ +#define CHROME_BROWSER_LACROS_SYNC_SYNC_USER_SETTINGS_CLIENT_LACROS_H_ + +#include "chromeos/crosapi/mojom/sync.mojom.h" +#include "components/sync/driver/sync_service_observer.h" +#include "mojo/public/cpp/bindings/receiver.h" +#include "mojo/public/cpp/bindings/remote.h" + +namespace syncer { +class SyncService; +} // namespace syncer + +// Once created, observes changes in Ash SyncUserSettings via Crosapi +// (currently, only apps toggle state) and populates them to Lacros +// SyncUserSettings. Stops working upon Lacros SyncService Shutdown(). +class SyncUserSettingsClientLacros + : public crosapi::mojom::SyncUserSettingsClientObserver, + public syncer::SyncServiceObserver { + public: + // |sync_service| must not be null. |sync_service_remote| must not be null and + // must be bound. + // TODO(crbug.com/1330894): ensure |sync_service_remote| has + // BindUserSettingsClient() method (may not have due to Ash/Lacros version + // scew), probably as a part of object owning |this|. + SyncUserSettingsClientLacros( + syncer::SyncService* sync_service, + mojo::Remote<crosapi::mojom::SyncService>* sync_service_remote); + SyncUserSettingsClientLacros(const SyncUserSettingsClientLacros& other) = + delete; + SyncUserSettingsClientLacros& operator=( + const SyncUserSettingsClientLacros& other) = delete; + ~SyncUserSettingsClientLacros() override; + + // crosapi::mojom::SyncUserSettingsClientObserver overrides. + void OnAppsSyncEnabledChanged(bool is_apps_sync_enabled) override; + + // SyncServiceObserver overrides. + void OnSyncShutdown(syncer::SyncService* sync_service) override; + + private: + void OnIsAppsSyncEnabledFetched(bool is_apps_sync_enabled); + + base::raw_ptr<syncer::SyncService> sync_service_; + mojo::Receiver<crosapi::mojom::SyncUserSettingsClientObserver> + observer_receiver_{this}; + mojo::Remote<crosapi::mojom::SyncUserSettingsClient> client_remote_; +}; + +#endif // CHROME_BROWSER_LACROS_SYNC_SYNC_USER_SETTINGS_CLIENT_LACROS_H_
diff --git a/chrome/browser/lacros/sync/sync_user_settings_client_lacros_unittest.cc b/chrome/browser/lacros/sync/sync_user_settings_client_lacros_unittest.cc new file mode 100644 index 0000000..22ceb9b --- /dev/null +++ b/chrome/browser/lacros/sync/sync_user_settings_client_lacros_unittest.cc
@@ -0,0 +1,83 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/lacros/sync/sync_user_settings_client_lacros.h" + +#include "base/run_loop.h" +#include "base/test/gmock_callback_support.h" +#include "base/test/task_environment.h" +#include "chromeos/crosapi/mojom/sync.mojom.h" +#include "components/sync/chromeos/lacros/fake_sync_mojo_service.h" +#include "components/sync/chromeos/lacros/fake_sync_user_settings_client_ash.h" +#include "components/sync/driver/mock_sync_service.h" +#include "mojo/public/cpp/bindings/remote.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +class SyncUserSettingsClientLacrosTest : public testing::Test { + public: + SyncUserSettingsClientLacrosTest() = default; + ~SyncUserSettingsClientLacrosTest() override = default; + + void SetUp() override { + sync_mojo_service_.BindReceiver( + sync_mojo_service_remote_.BindNewPipeAndPassReceiver()); + client_lacros_ = std::make_unique<SyncUserSettingsClientLacros>( + &sync_service_, &sync_mojo_service_remote_); + } + + syncer::MockSyncService& sync_service() { return sync_service_; } + + syncer::SyncUserSettingsMock& user_settings() { + return *sync_service_.GetMockUserSettings(); + } + + mojo::Remote<crosapi::mojom::SyncService>& sync_mojo_service_remote() { + return sync_mojo_service_remote_; + } + + syncer::FakeSyncUserSettingsClientAsh& client_ash() { + return sync_mojo_service_.GetFakeSyncUserSettingsClientAsh(); + } + + private: + base::test::SingleThreadTaskEnvironment task_environment_; + + testing::NiceMock<syncer::MockSyncService> sync_service_; + + mojo::Remote<crosapi::mojom::SyncService> sync_mojo_service_remote_; + syncer::FakeSyncMojoService sync_mojo_service_; + + std::unique_ptr<SyncUserSettingsClientLacros> client_lacros_; +}; + +TEST_F(SyncUserSettingsClientLacrosTest, + ShouldPlumbInitialAppsSyncEnabledValue) { + base::RunLoop run_loop; + EXPECT_CALL( + user_settings(), + SetAppsSyncEnabledByOs( + syncer::FakeSyncUserSettingsClientAsh::kDefaultAppsSyncIsEnabled)) + .WillOnce(base::test::RunOnceClosure(run_loop.QuitClosure())); + SyncUserSettingsClientLacros client_lacros(&sync_service(), + &sync_mojo_service_remote()); + run_loop.Run(); +} + +TEST_F(SyncUserSettingsClientLacrosTest, ShouldHandleAppsSyncEnabledChanges) { + SyncUserSettingsClientLacros client_lacros(&sync_service(), + &sync_mojo_service_remote()); + const bool kNonDefaultAppsSyncIsEnabled = + !syncer::FakeSyncUserSettingsClientAsh::kDefaultAppsSyncIsEnabled; + base::RunLoop run_loop; + EXPECT_CALL(user_settings(), + SetAppsSyncEnabledByOs(kNonDefaultAppsSyncIsEnabled)) + .WillOnce(base::test::RunOnceClosure(run_loop.QuitClosure())); + client_ash().SetAppsSyncIsEnabled(kNonDefaultAppsSyncIsEnabled); + run_loop.Run(); +} + +} // namespace
diff --git a/chrome/browser/media/router/BUILD.gn b/chrome/browser/media/router/BUILD.gn index 2e80505..37d6cc9 100644 --- a/chrome/browser/media/router/BUILD.gn +++ b/chrome/browser/media/router/BUILD.gn
@@ -183,7 +183,6 @@ deps += [ "//third_party/openscreen/src/osp/public", "//third_party/openscreen/src/platform", - "//third_party/openscreen/src/util", ] } }
diff --git a/chrome/browser/password_manager/android/password_sync_controller_delegate_android.cc b/chrome/browser/password_manager/android/password_sync_controller_delegate_android.cc index 79e55411..0f40bef 100644 --- a/chrome/browser/password_manager/android/password_sync_controller_delegate_android.cc +++ b/chrome/browser/password_manager/android/password_sync_controller_delegate_android.cc
@@ -108,8 +108,7 @@ AllNodesCallback callback) { // This is not implemented because it's not worth the hassle just to display // debug information in chrome://sync-internals. - std::move(callback).Run(syncer::PASSWORDS, - std::make_unique<base::ListValue>()); + std::move(callback).Run(syncer::PASSWORDS, base::Value::List()); } void PasswordSyncControllerDelegateAndroid::GetTypeEntitiesCountForDebugging(
diff --git a/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_request.cc b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_request.cc index 7d3b37f9..9b259ba 100644 --- a/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_request.cc +++ b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_request.cc
@@ -107,6 +107,34 @@ : embedder_support::GetUserAgent()); } +// Used for StateTransitions matching. +const char* SearchPrefetchStatusToString(SearchPrefetchStatus status) { + switch (status) { + case SearchPrefetchStatus::kNotStarted: + return "NotStarted"; + case SearchPrefetchStatus::kInFlight: + return "InFlight"; + case SearchPrefetchStatus::kCanBeServed: + return "CanBeServed"; + case SearchPrefetchStatus::kCanBeServedAndUserClicked: + return "CanBeServedAndUserClicked"; + case SearchPrefetchStatus::kComplete: + return "Complete"; + case SearchPrefetchStatus::kRequestCancelled: + return "RequestCancelled"; + case SearchPrefetchStatus::kRequestFailed: + return "RequestFailed"; + case SearchPrefetchStatus::kPrerendered: + return "Prerendered"; + case SearchPrefetchStatus::kPrerenderedAndClicked: + return "PrerenderedAndClicked"; + case SearchPrefetchStatus::kPrefetchServedForRealNavigation: + return "kPrefetchServedForRealNavigation"; + case SearchPrefetchStatus::kPrerenderActivated: + return "PrerenderActivated"; + } +} + } // namespace SearchPrefetchRequest::SearchPrefetchRequest( @@ -280,7 +308,7 @@ prefetch_url_ = resource_request->url; - current_status_ = SearchPrefetchStatus::kInFlight; + SetSearchPrefetchStatus(SearchPrefetchStatus::kInFlight); StartPrefetchRequestInternal(profile, std::move(resource_request), network_traffic_annotation, @@ -299,10 +327,7 @@ } void SearchPrefetchRequest::CancelPrefetch() { - DCHECK(current_status_ == SearchPrefetchStatus::kInFlight || - current_status_ == SearchPrefetchStatus::kCanBeServed || - current_status_ == SearchPrefetchStatus::kPrerendered); - current_status_ = SearchPrefetchStatus::kRequestCancelled; + SetSearchPrefetchStatus(SearchPrefetchStatus::kRequestCancelled); StopPrefetch(); StopPrerender(); } @@ -369,11 +394,9 @@ } void SearchPrefetchRequest::ErrorEncountered() { - DCHECK(current_status_ == SearchPrefetchStatus::kInFlight || - current_status_ == SearchPrefetchStatus::kCanBeServed || - current_status_ == SearchPrefetchStatus::kCanBeServedAndUserClicked || - current_status_ == SearchPrefetchStatus::kPrerendered); - current_status_ = SearchPrefetchStatus::kRequestFailed; + // When prerender fails, don't set the prefetch status to failure. + if (current_status_ != SearchPrefetchStatus::kPrerendered) + SetSearchPrefetchStatus(SearchPrefetchStatus::kRequestFailed); StopPrefetch(); StopPrerender(); } @@ -394,20 +417,15 @@ } void SearchPrefetchRequest::MarkPrefetchAsServable() { - DCHECK(current_status_ == SearchPrefetchStatus::kInFlight); - current_status_ = SearchPrefetchStatus::kCanBeServed; + SetSearchPrefetchStatus(SearchPrefetchStatus::kCanBeServed); } void SearchPrefetchRequest::MarkPrefetchAsPrerendered() { - DCHECK(current_status_ == SearchPrefetchStatus::kCanBeServed || - current_status_ == SearchPrefetchStatus::kComplete); - current_status_ = SearchPrefetchStatus::kPrerendered; + SetSearchPrefetchStatus(SearchPrefetchStatus::kPrerendered); } void SearchPrefetchRequest::MarkPrefetchAsPrerenderActivated() { - DCHECK(current_status_ == SearchPrefetchStatus::kPrerenderedAndClicked || - current_status_ == SearchPrefetchStatus::kPrerendered); - current_status_ = SearchPrefetchStatus::kPrerenderActivated; + SetSearchPrefetchStatus(SearchPrefetchStatus::kPrerenderActivated); } void SearchPrefetchRequest::ResetPrerenderUpgrader() { @@ -417,26 +435,20 @@ } void SearchPrefetchRequest::MarkPrefetchAsComplete() { - DCHECK(current_status_ == SearchPrefetchStatus::kInFlight || - current_status_ == SearchPrefetchStatus::kCanBeServed || - current_status_ == SearchPrefetchStatus::kCanBeServedAndUserClicked); - current_status_ = SearchPrefetchStatus::kComplete; + SetSearchPrefetchStatus(SearchPrefetchStatus::kComplete); } void SearchPrefetchRequest::MarkPrefetchAsClicked() { - DCHECK(current_status_ == SearchPrefetchStatus::kCanBeServed || - current_status_ == SearchPrefetchStatus::kPrerendered); if (current_status_ == SearchPrefetchStatus::kCanBeServed) { - current_status_ = SearchPrefetchStatus::kCanBeServedAndUserClicked; + SetSearchPrefetchStatus(SearchPrefetchStatus::kCanBeServedAndUserClicked); } else if (current_status_ == SearchPrefetchStatus::kPrerendered) { - current_status_ = SearchPrefetchStatus::kPrerenderedAndClicked; + SetSearchPrefetchStatus(SearchPrefetchStatus::kPrerenderedAndClicked); } } void SearchPrefetchRequest::MarkPrefetchAsServed() { - DCHECK(current_status_ == SearchPrefetchStatus::kCanBeServedAndUserClicked || - current_status_ == SearchPrefetchStatus::kComplete); - current_status_ = SearchPrefetchStatus::kPrefetchServedForRealNavigation; + SetSearchPrefetchStatus( + SearchPrefetchStatus::kPrefetchServedForRealNavigation); UMA_HISTOGRAM_TIMES("Omnibox.SearchPrefetch.ClickToNavigationIntercepted", base::TimeTicks::Now() - time_clicked_); } @@ -481,3 +493,60 @@ prerender_url_ = GURL(); } } + +void SearchPrefetchRequest::SetSearchPrefetchStatus( + SearchPrefetchStatus new_status) { +#if DCHECK_IS_ON() + static const base::NoDestructor<base::StateTransitions<SearchPrefetchStatus>> + allowed_transitions(base::StateTransitions<SearchPrefetchStatus>({ + {SearchPrefetchStatus::kNotStarted, + {SearchPrefetchStatus::kInFlight}}, + + {SearchPrefetchStatus::kInFlight, + {SearchPrefetchStatus::kCanBeServed, + SearchPrefetchStatus::kRequestCancelled, + SearchPrefetchStatus::kRequestFailed}}, + + {SearchPrefetchStatus::kCanBeServed, + {SearchPrefetchStatus::kCanBeServedAndUserClicked, + SearchPrefetchStatus::kComplete, + SearchPrefetchStatus::kRequestFailed, + SearchPrefetchStatus::kRequestCancelled, + SearchPrefetchStatus::kPrerendered}}, + + {SearchPrefetchStatus::kCanBeServedAndUserClicked, + {SearchPrefetchStatus::kComplete, + SearchPrefetchStatus::kPrefetchServedForRealNavigation, + SearchPrefetchStatus::kRequestFailed}}, + + {SearchPrefetchStatus::kComplete, + {SearchPrefetchStatus::kPrefetchServedForRealNavigation, + SearchPrefetchStatus::kPrerendered}}, + + {SearchPrefetchStatus::kPrefetchServedForRealNavigation, {}}, + + {SearchPrefetchStatus::kPrerendered, + {SearchPrefetchStatus::kPrerenderedAndClicked, + SearchPrefetchStatus::kRequestCancelled, + SearchPrefetchStatus::kPrerenderActivated}}, + + {SearchPrefetchStatus::kPrerenderedAndClicked, + {SearchPrefetchStatus::kPrerenderActivated}}, + + {SearchPrefetchStatus::kPrerenderActivated, {}}, + + {SearchPrefetchStatus::kRequestFailed, {}}, + + {SearchPrefetchStatus::kRequestCancelled, {}}, + + })); + DCHECK_STATE_TRANSITION(allowed_transitions, + /*old_state=*/current_status_, + /*new_state=*/new_status); +#endif // DCHECK_IS_ON() + current_status_ = new_status; +} + +std::ostream& operator<<(std::ostream& o, const SearchPrefetchStatus& s) { + return o << SearchPrefetchStatusToString(s); +}
diff --git a/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_request.h b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_request.h index 3519bfe..427b164 100644 --- a/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_request.h +++ b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_request.h
@@ -8,6 +8,7 @@ #include <memory> #include "base/callback.h" +#include "base/state_transitions.h" #include "net/traffic_annotation/network_traffic_annotation.h" #include "services/network/public/cpp/resource_request.h" #include "url/gurl.h" @@ -168,6 +169,9 @@ // Cancels ongoing and pending prerender. void StopPrerender(); + // Updates the `current_status_` to status. + void SetSearchPrefetchStatus(SearchPrefetchStatus status); + // Whether the request has received a servable response. See // `CanServePrefetchRequest` in ./streaming_search_prefetch_url_loader.cc for // the definition of servable response. @@ -214,4 +218,7 @@ base::raw_ptr<Profile> profile_; }; +// Used when DCHECK_STATE_TRANSITION triggers. +std::ostream& operator<<(std::ostream& o, const SearchPrefetchStatus& s); + #endif // CHROME_BROWSER_PRELOADING_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_REQUEST_H_
diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc index 6925ea1..170b2c0a 100644 --- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc +++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
@@ -351,7 +351,9 @@ #if BUILDFLAG(IS_CHROMEOS_LACROS) CertDbInitializerFactory::GetInstance(); #endif +#if BUILDFLAG(SAFE_BROWSING_AVAILABLE) CertificateReportingServiceFactory::GetInstance(); +#endif #if !BUILDFLAG(IS_ANDROID) ChromeBrowsingDataLifetimeManagerFactory::GetInstance(); #endif
diff --git a/chrome/browser/resources/certificate_viewer/certificate_viewer.html b/chrome/browser/resources/certificate_viewer/certificate_viewer.html index 59ad5116..1361ecc0 100644 --- a/chrome/browser/resources/certificate_viewer/certificate_viewer.html +++ b/chrome/browser/resources/certificate_viewer/certificate_viewer.html
@@ -104,8 +104,8 @@ $i18n{certFieldVal} </h3> <div id="cert-field-value" class="section-contents" tabindex="0" - aria-live="polite" aria-atomic="true" aria-readonly="true" - aria-labelledby="cert-field-value-label" role="textbox"></div> + aria-readonly="true" aria-labelledby="cert-field-value-label" + role="textbox"></div> <div> <button id="export">$i18n{export}</button> </div>
diff --git a/chrome/browser/resources/certificate_viewer/certificate_viewer.ts b/chrome/browser/resources/certificate_viewer/certificate_viewer.ts index 02f27a4..d8a3bac 100644 --- a/chrome/browser/resources/certificate_viewer/certificate_viewer.ts +++ b/chrome/browser/resources/certificate_viewer/certificate_viewer.ts
@@ -188,6 +188,8 @@ const treeItem = document.createElement('cr-tree-item'); treeItem.label = tree.label; treeItem.detail = {payload: tree.payload ? tree.payload : {}, children: {}}; + treeItem.setExtraAriaLabel( + (treeItem.detail as TreeItemDetail).payload.val || ''); if (tree.children) { for (let i = 0; i < tree.children.length; i++) { const child = constructTree(tree.children[i]!);
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn b/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn index abf829b..60a2b059 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
@@ -32,7 +32,6 @@ "common/extension_bridge.js", "common/log_types.js", "common/panel_menu_data.js", - "common/spannable.js", "common/tree_dumper.js", "common/tts_interface.js", "injected/api_implementation.js", @@ -139,6 +138,7 @@ "common/msgs.js", "common/panel_bridge.js", "common/panel_command.js", + "common/spannable.js", "common/tts_base.js", "learn_mode/learn_mode.js", "log_page/log.js",
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js index 4d68a46a..7e11f85 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js
@@ -52,6 +52,8 @@ await importModule('Cursor', '/common/cursors/cursor.js'); await importModule( 'OutputAction', '/chromevox/background/output/output_types.js'); + await importModule( + ['Spannable', 'MultiSpannable'], '/chromevox/common/spannable.js'); window.doGesture = this.doGesture; window.simulateHitTestResult = this.simulateHitTestResult;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_command_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_command_handler.js index cecc8ac..45213b1 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_command_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_command_handler.js
@@ -11,6 +11,7 @@ import {BridgeConstants} from '../../common/bridge_constants.js'; import {BridgeHelper} from '../../common/bridge_helper.js'; import {EventSourceType} from '../../common/event_source_type.js'; +import {Spannable} from '../../common/spannable.js'; import {ChromeVox} from '../chromevox.js'; import {ChromeVoxState} from '../chromevox_state.js'; import {CommandHandlerInterface} from '../command_handler_interface.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler.js index 2f7ce2ef..919c8bf 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler.js
@@ -10,6 +10,7 @@ import {EventGenerator} from '../../../common/event_generator.js'; import {StringUtil} from '../../../common/string_util.js'; +import {Spannable} from '../../common/spannable.js'; import {BrailleTranslatorManager} from './braille_translator_manager.js'; import {ExpandingBrailleTranslator} from './expanding_braille_translator.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler_test.js index ac56b12d..62f247bf 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler_test.js
@@ -445,6 +445,7 @@ await importModule( ['ExtraCellsSpan', 'ValueSelectionSpan', 'ValueSpan'], '/chromevox/background/braille/spans.js'); + await importModule('Spannable', '/chromevox/common/spannable.js'); chrome.runtime.onConnectExternal = new FakeChromeEvent(); this.port = new FakePort();
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator.js index 9495ed7..9ebb8d98 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator.js
@@ -6,6 +6,8 @@ * @fileoverview Translates text to braille, optionally with some parts * uncontracted. */ +import {Spannable} from '../../common/spannable.js'; + import {LibLouis} from './liblouis.js'; import {BrailleTextStyleSpan, ExtraCellsSpan, ValueSelectionSpan, ValueSpan} from './spans.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator_test.js index 9690a59..1479786 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator_test.js
@@ -19,6 +19,7 @@ ['ExtraCellsSpan', 'ValueSelectionSpan', 'ValueSpan'], '/chromevox/background/braille/spans.js'); await importModule('LibLouis', '/chromevox/background/braille/liblouis.js'); + await importModule('Spannable', '/chromevox/common/spannable.js'); } }; @@ -26,7 +27,6 @@ ChromeVoxExpandingBrailleTranslatorUnitTest.prototype.extraLibraries = [ '../../../common/testing/assert_additions.js', '../../testing/fake_dom.js', - '../../common/spannable.js', ]; /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/spans.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/spans.js index 0ab8fa4e..eca626d1 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/spans.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/spans.js
@@ -7,6 +7,8 @@ * and selections. */ +import {Spannable} from '../../common/spannable.js'; + import {LibLouis} from './liblouis.js'; /** Attached to the value region of a braille spannable. */
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_line.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_line.js index e208a52..8c462b4 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_line.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_line.js
@@ -10,6 +10,7 @@ */ import {Cursor, CURSOR_NODE_INDEX, CursorMovement, CursorUnit} from '../../../common/cursors/cursor.js'; import {CursorRange} from '../../../common/cursors/range.js'; +import {Spannable} from '../../common/spannable.js'; import {LibLouis} from '../braille/liblouis.js'; import {Output} from '../output/output.js'; import {OutputEventType, OutputNodeSpan} from '../output/output_types.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing.js index 5a1d40e6..b9c31d34 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing.js
@@ -12,6 +12,7 @@ import {NavBraille} from '../../common/braille/nav_braille.js'; import {ChromeVoxEvent} from '../../common/custom_automation_event.js'; import {Msgs} from '../../common/msgs.js'; +import {MultiSpannable, Spannable} from '../../common/spannable.js'; import {BrailleBackground} from '../braille/braille_background.js'; import {LibLouis} from '../braille/liblouis.js'; import {BrailleTextStyleSpan, ValueSelectionSpan, ValueSpan} from '../braille/spans.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js index 7ea0ffe..bfc4bf8 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js
@@ -23,7 +23,6 @@ goog.require('PanelTabMenuItemData'); goog.require('QueueMode'); goog.require('RecoveryStrategy'); -goog.require('Spannable'); goog.require('SpeechLog'); goog.require('TextLog'); goog.require('TreeDumper');
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js index 63b210ac..ac1c706 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js
@@ -11,6 +11,7 @@ import {EventSourceType} from '../../common/event_source_type.js'; import {LocaleOutputHelper} from '../../common/locale_output_helper.js'; import {Msgs} from '../../common/msgs.js'; +import {Spannable} from '../../common/spannable.js'; import {ValueSelectionSpan, ValueSpan} from '../braille/spans.js'; import {ChromeVox} from '../chromevox.js'; import {EventSourceState} from '../event_source.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/braille/nav_braille.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/braille/nav_braille.js index 260d647..72da0f6 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/braille/nav_braille.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/braille/nav_braille.js
@@ -12,6 +12,9 @@ * A class capturing the braille for navigation from one object to * another. */ + +import {Spannable} from '../spannable.js'; + export class NavBraille { /** * @param {{text: (undefined|string|!Spannable),
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/spannable.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/spannable.js index fdbd070..c9840fd 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/spannable.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/spannable.js
@@ -6,10 +6,7 @@ * @fileoverview Class which allows construction of annotated strings. */ -goog.provide('MultiSpannable'); -goog.provide('Spannable'); - -Spannable = class { +export class Spannable { /** * @param {string|!Spannable=} opt_string Initial value of the spannable. * @param {*=} opt_annotation Initial annotation for the entire string. @@ -401,7 +398,7 @@ serializableSpansByName.set(name, obj); serializableSpansByConstructor.set(constructor, obj); } -}; +} /** @@ -410,7 +407,7 @@ * Note that most methods that assume a span value is unique such as * |getSpanStart| will use the first span value. */ -MultiSpannable = class extends Spannable { +export class MultiSpannable extends Spannable { /** * @param {string|!Spannable=} opt_string Initial value of the spannable. * @param {*=} opt_annotation Initial annotation for the entire string. @@ -429,7 +426,7 @@ const ret = Spannable.prototype.substring.call(this, start, opt_end); return new MultiSpannable(ret); } -}; +} /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/spannable_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/spannable_test.js index a4504e6f..02f0f27 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/spannable_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/spannable_test.js
@@ -61,6 +61,12 @@ /** @override */ setUp() { super.setUp(); + } + + async setUpDeferred() { + await super.setUpDeferred(); + await importModule( + ['Spannable', 'MultiSpannable'], '/chromevox/common/spannable.js'); Spannable.registerStatelessSerializableSpan( StatelessSerializableSpan, 'StatelessSerializableSpan'); @@ -76,7 +82,6 @@ ChromeVoxSpannableUnitTest.prototype.extraLibraries = [ '../../common/testing/assert_additions.js', '../testing/fake_dom.js', - 'spannable.js', ];
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/kbexplorer_loader.js b/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/kbexplorer_loader.js index f661a20..e0ec2bc8 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/kbexplorer_loader.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/kbexplorer_loader.js
@@ -10,7 +10,6 @@ goog.require('BrailleKeyCommand'); goog.require('BrailleKeyEvent'); goog.require('KeyCode'); -goog.require('Spannable'); goog.require('TtsInterface'); goog.require('constants');
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/learn_mode.js b/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/learn_mode.js index 2d1e603d..2e106512 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/learn_mode.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/learn_mode.js
@@ -16,6 +16,7 @@ import {KeyUtil} from '../common/key_util.js'; import {ChromeVoxKbHandler} from '../common/keyboard_handler.js'; import {Msgs} from '../common/msgs.js'; +import {Spannable} from '../common/spannable.js'; /** * Class to manage the keyboard explorer.
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_loader.js b/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_loader.js index d2db3431..f5cf9f47 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_loader.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_loader.js
@@ -11,7 +11,6 @@ goog.require('BluetoothBrailleDisplayManager'); goog.require('BrailleKeyCommand'); goog.require('BrailleKeyEvent'); -goog.require('Spannable'); goog.require('SpeechLog'); goog.require('TtsInterface');
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_loader.js b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_loader.js index fa6bc8dd..11b69d5f 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_loader.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_loader.js
@@ -19,7 +19,6 @@ goog.require('PanelNodeMenuItemData'); goog.require('QueueMode'); goog.require('RecoveryStrategy'); -goog.require('Spannable'); goog.require('SpeechLog'); goog.require('TextLog'); goog.require('TreeDumper');
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/testing/mock_feedback_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/testing/mock_feedback_test.js index a0e4adc66..57b0abb 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/testing/mock_feedback_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/testing/mock_feedback_test.js
@@ -34,6 +34,7 @@ 'BrailleInterface', '/chromevox/common/braille/braille_interface.js'); await importModule( 'NavBraille', '/chromevox/common/braille/nav_braille.js'); + await importModule('Spannable', '/chromevox/common/spannable.js'); } /** @override */ @@ -47,7 +48,6 @@ '../../common/testing/assert_additions.js', '../testing/fake_dom.js', // Must come before other files '../common/abstract_earcons.js', - '../common/spannable.js', '../common/tts_interface.js', 'mock_feedback.js', ];
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_it.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_it.xtb index d9884ee..2db2e0ae 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_it.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_it.xtb
@@ -769,7 +769,7 @@ <translation id="6150023170003443621">Verde-giallo</translation> <translation id="6158882249329863701">riga <ph name="TABLECELLROWINDEX" /> colonna <ph name="TABLECELLCOLUMNINDEX" /></translation> <translation id="6164829606128959761">indicatore</translation> -<translation id="6165508094623778733">Ulteriori informazioni</translation> +<translation id="6165508094623778733">Scopri di più</translation> <translation id="6166362019018438352">Sottotitoli braille disattivati</translation> <translation id="6186305613600865047">Vai alla fine della pagina</translation> <translation id="6187190722927752226">Acquamarina</translation> @@ -1075,7 +1075,7 @@ <translation id="8428213095426709021">Impostazioni</translation> <translation id="8428603554127842284">livello <ph name="DEPTH" /></translation> <translation id="8430049249787218991">mnubr</translation> -<translation id="8446884382197647889">Ulteriori informazioni</translation> +<translation id="8446884382197647889">Scopri di più</translation> <translation id="8448196839635577295">Nessun focus ChromeVox corrente. Tocca Esplora per trovare elementi.</translation> <translation id="8455868257606149352">Massimo: <ph name="X" /></translation> <translation id="84575901236241018">dispone di tasto di accesso, <ph name="KEY" /></translation>
diff --git a/chrome/browser/resources/chromeos/login/oobe_auto_imports.gni b/chrome/browser/resources/chromeos/login/oobe_auto_imports.gni index c5e4016..948028f 100644 --- a/chrome/browser/resources/chromeos/login/oobe_auto_imports.gni +++ b/chrome/browser/resources/chromeos/login/oobe_auto_imports.gni
@@ -64,6 +64,7 @@ "chrome/browser/resources/chromeos/login/keyboard_utils.html|keyboard", "chrome/browser/resources/chromeos/login/login_ui_tools.html|addSubmitListener", "chrome/browser/resources/gaia_auth_host/authenticator.html|Authenticator,AuthFlow,AuthMode,AuthParams,SUPPORTED_PARAMS", + "ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.html|CrFingerprintProgressArcElement", "ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup_delegate.html|MultiDeviceSetupDelegate", "ui/webui/resources/cr_components/chromeos/network/mojo_interface_provider.html|MojoInterfaceProviderImpl", "ui/webui/resources/cr_components/chromeos/network/network_list_types.html|NetworkList",
diff --git a/chrome/browser/resources/chromeos/login/screens/common/guest_tos.js b/chrome/browser/resources/chromeos/login/screens/common/guest_tos.js index 1da2d71..4cfdbcb 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/guest_tos.js +++ b/chrome/browser/resources/chromeos/login/screens/common/guest_tos.js
@@ -161,7 +161,7 @@ } onAcceptClick_() { - chrome.send('GuestToSAccept', [this.usageChecked]); + this.userActed(['guest-tos-accept', this.usageChecked]); } onBackClick_() {
diff --git a/chrome/browser/resources/chromeos/login/test_api/test_api.js b/chrome/browser/resources/chromeos/login/test_api/test_api.js index e798f5a..2d52ca9e 100644 --- a/chrome/browser/resources/chromeos/login/test_api/test_api.js +++ b/chrome/browser/resources/chromeos/login/test_api/test_api.js
@@ -576,6 +576,76 @@ } } + +class GuestTosScreenTester extends ScreenElementApi { + constructor() { + super('guest-tos'); + this.loadedStep = new PolymerElementApi(this, '#loaded'); + this.nextButton = new PolymerElementApi(this, '#acceptButton'); + } + + /** @override */ + shouldSkip() { + return loadTimeData.getBoolean('testapi_shouldSkipGuestTos'); + } + + /** @return {boolean} */ + isReadyForTesting() { + return this.isVisible() && this.loadedStep.isVisible(); + } + + /** @return {string} */ + getNextButtonName() { + return loadTimeData.getString('guestTosAccept'); + } +} + + +class GestureNavigationScreenTester extends ScreenElementApi { + constructor() { + super('gesture-navigation'); + } + + /** @return {string} */ + getNextButtonName() { + return loadTimeData.getString('gestureNavigationIntroNextButton'); + } +} + +class ConsolidatedConsentScreenTester extends ScreenElementApi { + constructor() { + super('consolidated-consent'); + this.loadedStep = new PolymerElementApi(this, '#loadedDialog'); + this.nextButton = new PolymerElementApi(this, '#acceptButton'); + this.readMoreButton = + new PolymerElementApi(this.loadedStep, '#readMoreButton'); + } + + /** @override */ + shouldSkip() { + return loadTimeData.getBoolean('testapi_shouldSkipConsolidatedConsent'); + } + + /** @return {boolean} */ + isReadyForTesting() { + return this.isVisible() && this.loadedStep.isVisible(); + } + + /** @return {boolean} */ + isReadMoreButtonShown() { + // The read more button is inside a <dom-if> element, if it's hidden, the + // element would be removed entirely from dom, so we need to check if the + // element exists before checking if it's visible. + return this.readMoreButton.element() != null && + this.readMoreButton.isVisible(); + } + + /** @return {string} */ + getNextButtonName() { + return loadTimeData.getString('consolidatedConsentAcceptAndContinue'); + } +} + class OobeApiProvider { constructor() { this.screens = { @@ -601,6 +671,7 @@ ArcTosScreen: new ArcTosScreenTester(), ThemeSelectionScreen: new ThemeSelectionScreenTester(), GestureNavigation: new GestureNavigationScreenTester(), + ConsolidatedConsentScreen: new ConsolidatedConsentScreenTester(), }; this.loginWithPin = function(username, pin) { @@ -629,43 +700,4 @@ } } -class GuestTosScreenTester extends ScreenElementApi { - constructor() { - super('guest-tos'); - this.loadedStep = new PolymerElementApi(this, '#loaded'); - this.nextButton = new PolymerElementApi(this, '#acceptButton'); - } - - /** @override */ - shouldSkip() { - return loadTimeData.getBoolean('testapi_shouldSkipGuestTos'); - } - - /** @return {boolean} */ - isReadyForTesting() { - return this.isVisible() && this.loadedStep.isVisible(); - } - - /** @return {string} */ - getNextButtonName() { - return loadTimeData.getString('guestTosAccept'); - } -} - -class GestureNavigationScreenTester extends ScreenElementApi { - constructor() { - super('gesture-navigation'); - } - - /** @return {string} */ - getNextButtonName() { - return loadTimeData.getString('gestureNavigationIntroNextButton'); - } - - /** @return {string} */ - getGetStartedButtonName() { - return loadTimeData.getString('welcomeScreenGetStarted'); - } -} - window.OobeAPI = new OobeApiProvider();
diff --git a/chrome/browser/resources/gaia_auth_host/BUILD.gn b/chrome/browser/resources/gaia_auth_host/BUILD.gn index 520fc7987..3e8e78b 100644 --- a/chrome/browser/resources/gaia_auth_host/BUILD.gn +++ b/chrome/browser/resources/gaia_auth_host/BUILD.gn
@@ -139,6 +139,7 @@ ":channel.m", ":post_message_channel.m", ":saml_password_attributes.m", + ":saml_username_autofill.m", ":webview_event_manager.m", ] extra_deps = [ ":modulize" ] @@ -151,7 +152,6 @@ deps = [ ":saml_handler.m", ":saml_password_attributes.m", - ":saml_username_autofill.m", "//ui/webui/resources/js:assert.m", "//ui/webui/resources/js:cr.m", "//ui/webui/resources/js:util.m",
diff --git a/chrome/browser/resources/gaia_auth_host/authenticator.js b/chrome/browser/resources/gaia_auth_host/authenticator.js index b599cca..0473d9e 100644 --- a/chrome/browser/resources/gaia_auth_host/authenticator.js +++ b/chrome/browser/resources/gaia_auth_host/authenticator.js
@@ -3,7 +3,6 @@ // found in the LICENSE file. // <include src="saml_handler.js"> -// <include src="saml_username_autofill.js"> // Note: webview_event_manager.js is already included by saml_handler.js. // clang-format off @@ -15,7 +14,6 @@ // #import {SamlHandler, OnHeadersReceivedDetails} from './saml_handler.m.js'; // #import {WebviewEventManager} from './webview_event_manager.m.js'; // #import {PasswordAttributes} from './saml_password_attributes.m.js'; -// #import {maybeAutofillUsername} from './saml_username_autofill.m.js' ; // clang-format on /** @@ -441,8 +439,6 @@ /** @private {?SyncTrustedVaultKeys} */ this.syncTrustedVaultKeys_ = null; this.closeViewReceived_ = false; - /** @private {string|null} */ - this.urlParameterToAutofillSAMLUsername_ = null; this.gaiaStartTime = null; window.addEventListener( @@ -486,7 +482,6 @@ this.maybeClearGaiaTimeout_(); this.syncTrustedVaultKeys_ = null; this.closeViewReceived_ = false; - this.urlParameterToAutofillSAMLUsername_ = null; } /** @@ -653,8 +648,6 @@ this.clientId_ = data.clientId; this.dontResizeNonEmbeddedPages = data.dontResizeNonEmbeddedPages; this.enableGaiaActionButtons_ = data.enableGaiaActionButtons; - this.urlParameterToAutofillSAMLUsername_ = - data.urlParameterToAutofillSAMLUsername; this.initialFrameUrl_ = this.constructInitialFrameUrl_(data); this.reloadUrl_ = data.frameUrl || this.initialFrameUrl_; @@ -670,6 +663,9 @@ this.idpOrigin_.startsWith('https://'); this.samlHandler_.extractSamlPasswordAttributes = data.extractSamlPasswordAttributes; + this.samlHandler_.email = data.email; + this.samlHandler_.urlParameterToAutofillSAMLUsername = + data.urlParameterToAutofillSAMLUsername; this.needPassword = !('needPassword' in data) || data.needPassword; @@ -932,15 +928,6 @@ assert(header.value !== undefined); const location = decodeURIComponent(header.value); this.chooseWhatToSync_ = !!location.match(/(\?|&)source=3($|&)/); - // In some cases we can add a url parameter to autofill the username - // field on saml IdP login page. - const urlToAutofillUsername = - samlUsernameAutofill.maybeAutofillUsername( - header.value, this.urlParameterToAutofillSAMLUsername_, - this.email_); - if (urlToAutofillUsername) { - this.webview_.src = urlToAutofillUsername; - } } } }
diff --git a/chrome/browser/resources/gaia_auth_host/saml_handler.js b/chrome/browser/resources/gaia_auth_host/saml_handler.js index a6424a5..b021b986 100644 --- a/chrome/browser/resources/gaia_auth_host/saml_handler.js +++ b/chrome/browser/resources/gaia_auth_host/saml_handler.js
@@ -5,6 +5,7 @@ // <include src="post_message_channel.js"> // <include src="webview_event_manager.js"> // <include src="saml_password_attributes.js"> +// <include src="saml_username_autofill.js"> // clang-format off // #import {Channel} from './channel.m.js'; @@ -12,6 +13,7 @@ // #import {WebviewEventManager} from './webview_event_manager.m.js'; // #import {NativeEventTarget as EventTarget} from 'chrome://resources/js/cr/event_target.m.js' // #import {PasswordAttributes, readPasswordAttributes} from './saml_password_attributes.m.js'; +// #import {maybeAutofillUsername} from './saml_username_autofill.m.js' ; // clang-format on /** @@ -264,6 +266,19 @@ this.passwordAttributes_ = samlPasswordAttributes.PasswordAttributes.EMPTY; + /** + * User's email/ + * @public {?string} + */ + this.email = null; + + /** + * Url parameter name for SAML IdP web page which is used to autofill the + * username. + * @public {?string} + */ + this.urlParameterToAutofillSAMLUsername = null; + this.webviewEventManager_ = WebviewEventManager.create(); this.webviewEventManager_.addEventListener( @@ -285,6 +300,11 @@ {urls: ['http://*/*', 'https://*/*'], types: ['main_frame']}, ['requestBody']); + this.webviewEventManager_.addWebRequestEventListener( + this.webview_.request.onBeforeRequest, + this.onMainFrameHttpsWebRequest_.bind(this), + {urls: ['https://*/*'], types: ['main_frame']}, ['blocking']); + if (!this.startsOnSamlPage_) { this.webviewEventManager_.addEventListener( this.webview_, 'loadcommit', this.onLoadCommit_.bind(this)); @@ -439,6 +459,9 @@ this.passwordAttributes_ = samlPasswordAttributes.PasswordAttributes.EMPTY; this.x509certificate = null; + + this.email = null; + this.urlParameterToAutofillSAMLUsername = null; } /** @@ -587,6 +610,23 @@ } /** + * Handler for webRequest.onBeforeRequest, used to optionally add a url + * parameter to the IdP login page in order to autofill the username field. + * @param {OnBeforeRequestDetails} details The web-request details. + * @return {BlockingResponse} Allows the event handler to modify network + * requests. + * @private + */ + onMainFrameHttpsWebRequest_(details) { + const urlToAutofillUsername = samlUsernameAutofill.maybeAutofillUsername( + details.url, this.urlParameterToAutofillSAMLUsername, this.email); + if (urlToAutofillUsername) { + return {redirectUrl: urlToAutofillUsername}; + } + return {}; + } + + /** * Receives a response for a device attestation challenge and navigates to * saved redirect page. * @param {string} url Url from canceled redirect.
diff --git a/chrome/browser/resources/omnibox/BUILD.gn b/chrome/browser/resources/omnibox/BUILD.gn index 5ea5135..d06c5a7 100644 --- a/chrome/browser/resources/omnibox/BUILD.gn +++ b/chrome/browser/resources/omnibox/BUILD.gn
@@ -9,7 +9,7 @@ # TODO(crbug.com/1323980): Migrate files listed below to TypeScript. ts_files = [ "omnibox_element.ts", - "omnibox_input.js", + "omnibox_input.ts", "omnibox.js", "omnibox_output.js", ]
diff --git a/chrome/browser/resources/omnibox/omnibox.html b/chrome/browser/resources/omnibox/omnibox.html index 02206189..07eca4a 100644 --- a/chrome/browser/resources/omnibox/omnibox.html +++ b/chrome/browser/resources/omnibox/omnibox.html
@@ -19,7 +19,7 @@ autofocus autocomplete="off" placeholder="Enter omnibox input [Alt+L]"> <div class="arrow-container"> - <span class="arrow-padding"></span> + <span id="arrow-padding"></span> <span class="arrow-up">▲</span> </div> <label class="row checkbox-container"
diff --git a/chrome/browser/resources/omnibox/omnibox_element.ts b/chrome/browser/resources/omnibox/omnibox_element.ts index 7b820ed..d2897853 100644 --- a/chrome/browser/resources/omnibox/omnibox_element.ts +++ b/chrome/browser/resources/omnibox/omnibox_element.ts
@@ -18,8 +18,7 @@ } /** - * Finds the 1st element matching the query within the local shadow root. At - * least 1 matching element should exist. + * Finds the 1st element matching the query within the local shadow root. */ protected $<E extends Element = Element>(query: string): E|null { return this.shadowRoot!.querySelector<E>(query); @@ -28,7 +27,7 @@ /** * Finds all elements matching the query within the local shadow root. */ - protected $$<E extends Element = Element>(query: string): NodeListOf<E> { + protected $all<E extends Element = Element>(query: string): NodeListOf<E> { return this.shadowRoot!.querySelectorAll<E>(query); }
diff --git a/chrome/browser/resources/omnibox/omnibox_input.css b/chrome/browser/resources/omnibox/omnibox_input.css index de69345..976d7a1 100644 --- a/chrome/browser/resources/omnibox/omnibox_input.css +++ b/chrome/browser/resources/omnibox/omnibox_input.css
@@ -136,7 +136,7 @@ visibility: hidden; } -.arrow-padding { +#arrow-padding { display: inline-block; height: 0; overflow: hidden;
diff --git a/chrome/browser/resources/omnibox/omnibox_input.js b/chrome/browser/resources/omnibox/omnibox_input.js deleted file mode 100644 index 5d02be2..0000000 --- a/chrome/browser/resources/omnibox/omnibox_input.js +++ /dev/null
@@ -1,386 +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. - -import {OmniboxElement} from './omnibox_element.js'; - -/** - * @typedef {{ - * inputText: string, - * resetAutocompleteController: boolean, - * cursorLock: boolean, - * cursorPosition: number, - * zeroSuggest: boolean, - * preventInlineAutocomplete: boolean, - * preferKeyword: boolean, - * currentUrl: string, - * pageClassification: number, - * }} - */ -export let QueryInputs; - -/** - * @typedef {{ - * showIncompleteResults: boolean, - * showDetails: boolean, - * showAllProviders: boolean, - * elideCells: boolean, - * thinRows: boolean, - * }} - */ -export let DisplayInputs; - -export class OmniboxInput extends OmniboxElement { - constructor() { - super('omnibox-input-template'); - this.restoreInputs_(); - } - - /** @override */ - connectedCallback() { - this.setupElementListeners_(); - } - - /** @private */ - storeInputs_() { - const inputs = { - connectWindowOmnibox: this.connectWindowOmnibox, - displayInputs: this.displayInputs, - }; - window.localStorage.setItem('preserved-inputs', JSON.stringify(inputs)); - } - - /** @private */ - restoreInputs_() { - const inputsString = window.localStorage.getItem('preserved-inputs'); - const inputs = inputsString && JSON.parse(inputsString) || {}; - this.$('#connect-window-omnibox').checked = inputs.connectWindowOmnibox; - this.displayInputs = - inputs.displayInputs || OmniboxInput.defaultDisplayInputs; - } - - /** @private */ - setupElementListeners_() { - ['#input-text', - '#reset-autocomplete-controller', - '#lock-cursor-position', - '#zero-suggest', - '#prevent-inline-autocomplete', - '#prefer-keyword', - '#current-url', - '#page-classification', - ].forEach(query => { - this.$(query).addEventListener( - 'input', this.onQueryInputsChanged_.bind(this)); - }); - - // Set text of .arrow-padding to substring of #input-text text, from - // beginning until cursor position, in order to correctly align .arrow-up. - this.$('#input-text') - .addEventListener( - 'input', this.positionCursorPositionIndicators_.bind(this)); - - this.$('#connect-window-omnibox') - .addEventListener('input', this.storeInputs_.bind(this)); - - this.$('#response-selection') - .addEventListener('input', this.onResponseSelectionChanged_.bind(this)); - this.$('#response-selection') - .addEventListener('blur', this.onResponseSelectionBlur_.bind(this)); - - ['#show-incomplete-results', - '#show-details', - '#show-all-providers', - '#elide-cells', - '#thin-rows', - ].forEach(query => { - this.$(query).addEventListener( - 'input', this.onDisplayInputsChanged_.bind(this)); - }); - - this.$('#filter-text') - .addEventListener('input', this.onFilterInputsChanged_.bind(this)); - - this.$('#export-clipboard') - .addEventListener('click', this.onExportClipboard_.bind(this)); - this.$('#export-file') - .addEventListener('click', this.onExportFile_.bind(this)); - this.$('#import-clipboard') - .addEventListener('click', this.onImportClipboard_.bind(this)); - this.$('#import-file-input') - .addEventListener('input', this.onImportFile_.bind(this)); - this.$('#process-batch-input') - .addEventListener('input', this.onProcessBatchFile_.bind(this)); - ['#import-clipboard', '#import-file'].forEach(query => { - this.setupDragListeners_(this.$(query)); - this.$(query).addEventListener('drop', this.onImportDropped_.bind(this)); - }); - this.setupDragListeners_(this.$('#process-batch')); - this.$('#process-batch') - .addEventListener('drop', this.onProcessBatchDropped_.bind(this)); - - this.$$('.button').forEach(el => el.addEventListener('keypress', e => { - if (e.key === ' ' || e.key === 'Enter') { - el.click(); - } - })); - } - - /** - * Sets up boilerplate event listeners for an element that is able to receive - * drag events. - * @private @param {!Element} element - */ - setupDragListeners_(element) { - element.addEventListener( - 'dragenter', () => element.classList.add('drag-hover')); - element.addEventListener( - 'dragleave', () => element.classList.remove('drag-hover')); - element.addEventListener('dragover', e => e.preventDefault()); - element.addEventListener('drop', e => { - e.preventDefault(); - element.classList.remove('drag-hover'); - }); - } - - /** @private */ - onQueryInputsChanged_() { - this.$('#imported-warning').hidden = true; - this.$('#current-url').disabled = this.$('#zero-suggest').checked; - if (this.$('#zero-suggest').checked) { - this.$('#current-url').value = this.$('#input-text').value; - } - this.dispatchEvent( - new CustomEvent('query-inputs-changed', {detail: this.queryInputs})); - } - - /** @return {QueryInputs} */ - get queryInputs() { - return { - inputText: this.$('#input-text').value, - resetAutocompleteController: - this.$('#reset-autocomplete-controller').checked, - cursorLock: this.$('#lock-cursor-position').checked, - cursorPosition: this.cursorPosition_, - zeroSuggest: this.$('#zero-suggest').checked, - preventInlineAutocomplete: this.$('#prevent-inline-autocomplete').checked, - preferKeyword: this.$('#prefer-keyword').checked, - currentUrl: this.$('#current-url').value, - pageClassification: this.$('#page-classification').value, - }; - } - - /** @param {QueryInputs} queryInputs */ - set queryInputs(queryInputs) { - this.$('#input-text').value = queryInputs.inputText; - this.$('#reset-autocomplete-controller').checked = - queryInputs.resetAutocompleteController; - this.$('#lock-cursor-position').checked = queryInputs.cursorLock; - this.cursorPosition_ = queryInputs.cursorPosition; - this.$('#zero-suggest').checked = queryInputs.zeroSuggest; - this.$('#prevent-inline-autocomplete').checked = - queryInputs.preventInlineAutocomplete; - this.$('#prefer-keyword').checked = queryInputs.preferKeyword; - this.$('#current-url').value = queryInputs.currentUrl; - this.$('#page-classification').value = queryInputs.pageClassification; - } - - /** @private @return {number} */ - get cursorPosition_() { - return this.$('#lock-cursor-position').checked ? - this.$('#input-text').value.length : - this.$('#input-text').selectionEnd; - } - - /** @private @param {number} value */ - set cursorPosition_(value) { - this.$('#input-text').setSelectionRange(value, value); - this.positionCursorPositionIndicators_(); - } - - /** @private */ - positionCursorPositionIndicators_() { - this.$('.arrow-padding').textContent = - this.$('#input-text').value.substring(0, this.cursorPosition_); - } - - /** @return {boolean} */ - get connectWindowOmnibox() { - return this.$('#connect-window-omnibox').checked; - } - - /** @private @param {boolean} connectWindowOmnibox */ - set connectWindowOmnibox_(connectWindowOmnibox) { - this.$('#connect-window-omnibox').checked = connectWindowOmnibox; - } - - /** @private */ - onResponseSelectionChanged_() { - const {value, max} = this.$('#response-selection'); - this.$('#history-warning').hidden = value === '0' || value === max; - this.dispatchEvent(new CustomEvent('response-select', {detail: value - 1})); - } - - /** @private */ - onResponseSelectionBlur_() { - const {value, min, max} = this.$('#response-selection'); - this.$('#response-selection').value = Math.max(Math.min(value, max), min); - this.onResponseSelectionChanged_(); - } - - /** @param {number} value */ - set responsesCount(value) { - if (this.$('#response-selection').value === - this.$('#response-selection').max) { - this.$('#response-selection').value = value; - } - this.$('#response-selection').max = value; - this.$('#response-selection').min = value ? 1 : 0; - this.$('#responses-count').textContent = value; - this.onResponseSelectionBlur_(); - } - - /** @private */ - onDisplayInputsChanged_() { - this.storeInputs_(); - this.dispatchEvent(new CustomEvent( - 'display-inputs-changed', {detail: this.displayInputs})); - } - - /** @return {DisplayInputs} */ - get displayInputs() { - return { - showIncompleteResults: this.$('#show-incomplete-results').checked, - showDetails: this.$('#show-details').checked, - showAllProviders: this.$('#show-all-providers').checked, - elideCells: this.$('#elide-cells').checked, - thinRows: this.$('#thin-rows').checked, - }; - } - - /** @param {DisplayInputs} displayInputs */ - set displayInputs(displayInputs) { - this.$('#show-incomplete-results').checked = - displayInputs.showIncompleteResults; - this.$('#show-details').checked = displayInputs.showDetails; - this.$('#show-all-providers').checked = displayInputs.showAllProviders; - this.$('#elide-cells').checked = displayInputs.elideCells; - this.$('#thin-rows').checked = displayInputs.thinRows; - } - - /** @private */ - onFilterInputsChanged_() { - this.dispatchEvent(new CustomEvent( - 'filter-input-changed', {detail: this.$('#filter-text').value})); - } - - /** @private */ - onExportClipboard_() { - this.dispatchEvent(new CustomEvent('export-clipboard')); - } - - /** @private */ - onExportFile_() { - this.dispatchEvent(new CustomEvent('export-file')); - } - - /** @private */ - async onImportClipboard_() { - this.import_(await navigator.clipboard.readText()); - } - - /** @private @param {!Event} event */ - onImportFile_(event) { - this.importFile_(event.target.files[0]); - } - - /** @private @param {!Event} event */ - onProcessBatchFile_(event) { - this.processBatchFile_(event.target.files[0]); - } - - /** @private @param {!Event} event */ - onImportDropped_(event) { - const dragText = event.dataTransfer.getData('Text'); - if (dragText) { - this.import_(dragText); - } else if (event.dataTransfer.files[0]) { - this.importFile_(event.dataTransfer.files[0]); - } - } - - /** @private @param {!Event} event */ - onProcessBatchDropped_(event) { - const dragText = event.dataTransfer.getData('Text'); - if (dragText) { - this.processBatch_(dragText); - } else if (event.dataTransfer.files[0]) { - this.processBatchFile_(event.dataTransfer.files[0]); - } - } - - /** @private @param {!File} file */ - importFile_(file) { - OmniboxInput.readFile_(file).then(this.import_.bind(this)); - } - - /** @private @param {!File} file */ - processBatchFile_(file) { - OmniboxInput.readFile_(file).then(this.processBatch_.bind(this)); - } - - /** @private @param {string} importString */ - import_(importString) { - try { - const importData = JSON.parse(importString); - // TODO(manukh): If import fails, this UI state change shouldn't happen. - this.$('#imported-warning').hidden = false; - this.dispatchEvent(new CustomEvent('import', {detail: importData})); - } catch (error) { - console.error('error during import, invalid json:', error); - } - } - - /** @private @param {string} processBatchString */ - processBatch_(processBatchString) { - try { - const processBatchData = JSON.parse(processBatchString); - this.dispatchEvent( - new CustomEvent('process-batch', {detail: processBatchData})); - } catch (error) { - console.error('error during process batch, invalid json:', error); - } - } - - /** - * @private - * @param {!File} file - * @return {!Promise} - */ - static readFile_(file) { - return new Promise(resolve => { - const reader = new FileReader(); - reader.onloadend = () => { - if (reader.readyState === FileReader.DONE) { - resolve(/** @type {string} */(reader.result)); - } else { - console.error('error importing, unable to read file:', reader.error); - } - }; - reader.readAsText(file); - }); - } - - /** @return {DisplayInputs} */ - static get defaultDisplayInputs() { - return { - showIncompleteResults: false, - showDetails: false, - showAllProviders: true, - elideCells: true, - thinRows: false, - }; - } -} - -customElements.define('omnibox-input', OmniboxInput);
diff --git a/chrome/browser/resources/omnibox/omnibox_input.ts b/chrome/browser/resources/omnibox/omnibox_input.ts new file mode 100644 index 0000000..e597fd5 --- /dev/null +++ b/chrome/browser/resources/omnibox/omnibox_input.ts
@@ -0,0 +1,413 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import {OmniboxElement} from './omnibox_element.js'; + +interface QueryInputs { + inputText: string; + resetAutocompleteController: boolean; + cursorLock: boolean; + cursorPosition: number; + zeroSuggest: boolean; + preventInlineAutocomplete: boolean; + preferKeyword: boolean; + currentUrl: string; + pageClassification: number; +} + +interface DisplayInputs { + showIncompleteResults: boolean; + showDetails: boolean; + showAllProviders: boolean; + elideCells: boolean; + thinRows: boolean; +} + +export class OmniboxInput extends OmniboxElement { + private elements: { + arrowPadding: HTMLElement, + connectWindowOmnibox: HTMLInputElement, + currentUrl: HTMLInputElement, + elideCells: HTMLInputElement, + exportClipboard: HTMLElement, + exportFile: HTMLElement, + filterText: HTMLInputElement, + historyWarning: HTMLElement, + importClipboard: HTMLElement, + importedWarning: HTMLElement, + importFile: HTMLElement, + importFileInput: HTMLInputElement, + inputText: HTMLInputElement, + lockCursorPosition: HTMLInputElement, + pageClassification: HTMLSelectElement, + preferKeyword: HTMLInputElement, + preventInlineAutocomplete: HTMLInputElement, + processBatch: HTMLElement, + processBatchInput: HTMLInputElement, + resetAutocompleteController: HTMLInputElement, + responsesCount: HTMLElement, + responseSelection: HTMLInputElement, + showAllProviders: HTMLInputElement, + showDetails: HTMLInputElement, + showIncompleteResults: HTMLInputElement, + thinRows: HTMLInputElement, + zeroSuggest: HTMLInputElement, + }; + + constructor() { + super('omnibox-input-template'); + } + + connectedCallback() { + this.elements = { + arrowPadding: this.$<HTMLElement>('#arrow-padding')!, + connectWindowOmnibox: this.$<HTMLInputElement>('#connect-window-omnibox')! + , + currentUrl: this.$<HTMLInputElement>('#current-url')!, + elideCells: this.$<HTMLInputElement>('#elide-cells')!, + exportClipboard: this.$<HTMLElement>('#export-clipboard')!, + exportFile: this.$<HTMLElement>('#export-file')!, + filterText: this.$<HTMLInputElement>('#filter-text')!, + historyWarning: this.$<HTMLElement>('#history-warning')!, + importClipboard: this.$<HTMLElement>('#import-clipboard')!, + importedWarning: this.$<HTMLElement>('#imported-warning')!, + importFile: this.$<HTMLElement>('#import-file')!, + importFileInput: this.$<HTMLInputElement>('#import-file-input')!, + inputText: this.$<HTMLInputElement>('#input-text')!, + lockCursorPosition: this.$<HTMLInputElement>('#lock-cursor-position')!, + pageClassification: this.$<HTMLSelectElement>('#page-classification')!, + preferKeyword: this.$<HTMLInputElement>('#prefer-keyword')!, + preventInlineAutocomplete: + this.$<HTMLInputElement>('#prevent-inline-autocomplete')!, + processBatch: this.$<HTMLElement>('#process-batch')!, + processBatchInput: this.$<HTMLInputElement>('#process-batch-input')!, + resetAutocompleteController: + this.$<HTMLInputElement>('#reset-autocomplete-controller')!, + responsesCount: this.$<HTMLElement>('#responses-count')!, + responseSelection: this.$<HTMLInputElement>('#response-selection')!, + showAllProviders: this.$<HTMLInputElement>('#show-all-providers')!, + showDetails: this.$<HTMLInputElement>('#show-details')!, + showIncompleteResults: + this.$<HTMLInputElement>('#show-incomplete-results')!, + thinRows: this.$<HTMLInputElement>('#thin-rows')!, + zeroSuggest: this.$<HTMLInputElement>('#zero-suggest')!, + }; + this.restoreInputs(); + this.setupElementListeners(); + } + + private storeInputs() { + const inputs = { + connectWindowOmnibox: this.connectWindowOmnibox, + displayInputs: this.displayInputs, + }; + window.localStorage.setItem('preserved-inputs', JSON.stringify(inputs)); + } + + private restoreInputs() { + const inputsString = window.localStorage.getItem('preserved-inputs'); + const inputs = inputsString && JSON.parse(inputsString) || {}; + this.elements.connectWindowOmnibox.checked = inputs.connectWindowOmnibox; + this.displayInputs = + inputs.displayInputs || OmniboxInput.defaultDisplayInputs; + } + + private setupElementListeners() { + [this.elements.inputText, + this.elements.resetAutocompleteController, + this.elements.lockCursorPosition, + this.elements.zeroSuggest, + this.elements.preventInlineAutocomplete, + this.elements.preferKeyword, + this.elements.currentUrl, + this.elements.pageClassification, + ].forEach(element => { + element.addEventListener('input', this.onQueryInputsChanged.bind(this)); + }); + + // Set text of #arrow-padding to substring of #input-text text, from + // beginning until cursor position, in order to correctly align .arrow-up. + this.elements.inputText.addEventListener( + 'input', this.positionCursorPositionIndicators.bind(this)); + + this.elements.connectWindowOmnibox.addEventListener( + 'input', this.storeInputs.bind(this)); + + this.elements.responseSelection.addEventListener( + 'input', this.onResponseSelectionChanged.bind(this)); + this.elements.responseSelection.addEventListener( + 'blur', this.onResponseSelectionBlur.bind(this)); + + [this.elements.showIncompleteResults, + this.elements.showDetails, + this.elements.showAllProviders, + this.elements.elideCells, + this.elements.thinRows, + ].forEach(element => { + element.addEventListener('input', this.onDisplayInputsChanged.bind(this)); + }); + + this.elements.filterText.addEventListener( + 'input', this.onFilterInputsChanged.bind(this)); + + this.elements.exportClipboard.addEventListener( + 'click', this.onExportClipboard.bind(this)); + this.elements.exportFile.addEventListener( + 'click', this.onExportFile.bind(this)); + this.elements.importClipboard.addEventListener( + 'click', this.onImportClipboard.bind(this)); + this.elements.importFileInput.addEventListener( + 'input', this.onImportFile.bind(this)); + this.elements.processBatchInput.addEventListener( + 'input', this.onProcessBatchFile.bind(this)); + [this.elements.importClipboard, this.elements.importFile].forEach( + element => { + this.setupDragListeners(element); + element.addEventListener('drop', this.onImportDropped.bind(this)); + }); + this.setupDragListeners(this.elements.processBatch); + this.elements.processBatch.addEventListener( + 'drop', this.onProcessBatchDropped.bind(this)); + + this.$all<HTMLElement>('.button').forEach( + el => el.addEventListener('keypress', (e: KeyboardEvent) => { + if (e.key === ' ' || e.key === 'Enter') { + el.click(); + } + })); + } + + /** + * Sets up boilerplate event listeners for an element that is able to receive + * drag events. + */ + private setupDragListeners(element: Element) { + element.addEventListener( + 'dragenter', () => element.classList.add('drag-hover')); + element.addEventListener( + 'dragleave', () => element.classList.remove('drag-hover')); + element.addEventListener('dragover', e => e.preventDefault()); + element.addEventListener('drop', e => { + e.preventDefault(); + element.classList.remove('drag-hover'); + }); + } + + private onQueryInputsChanged() { + this.elements.importedWarning.hidden = true; + this.elements.currentUrl.disabled = this.elements.zeroSuggest.checked; + if (this.elements.zeroSuggest.checked) { + this.elements.currentUrl.value = this.elements.inputText.value; + } + this.dispatchEvent( + new CustomEvent('query-inputs-changed', {detail: this.queryInputs})); + } + + get queryInputs(): QueryInputs { + return { + inputText: this.elements.inputText.value, + resetAutocompleteController: + this.elements.resetAutocompleteController.checked, + cursorLock: this.elements.lockCursorPosition.checked, + cursorPosition: this.cursorPosition, + zeroSuggest: this.elements.zeroSuggest.checked, + preventInlineAutocomplete: + this.elements.preventInlineAutocomplete.checked, + preferKeyword: this.elements.preferKeyword.checked, + currentUrl: this.elements.currentUrl.value, + pageClassification: Number(this.elements.pageClassification.value), + }; + } + + set queryInputs(queryInputs: QueryInputs) { + this.elements.inputText.value = queryInputs.inputText; + this.elements.resetAutocompleteController.checked = + queryInputs.resetAutocompleteController; + this.elements.lockCursorPosition.checked = queryInputs.cursorLock; + this.cursorPosition = queryInputs.cursorPosition; + this.elements.zeroSuggest.checked = queryInputs.zeroSuggest; + this.elements.preventInlineAutocomplete.checked = + queryInputs.preventInlineAutocomplete; + this.elements.preferKeyword.checked = queryInputs.preferKeyword; + this.elements.currentUrl.value = queryInputs.currentUrl; + this.elements.pageClassification.value = + String(queryInputs.pageClassification); + } + + private get cursorPosition(): number { + return this.elements.lockCursorPosition.checked ? + this.elements.inputText.value.length : + Number(this.elements.inputText.selectionEnd); + } + + private set cursorPosition(value: number) { + this.elements.inputText.setSelectionRange(value, value); + this.positionCursorPositionIndicators(); + } + + private positionCursorPositionIndicators() { + this.elements.arrowPadding.textContent = + this.elements.inputText.value.substring(0, this.cursorPosition); + } + + get connectWindowOmnibox(): boolean { + return this.elements.connectWindowOmnibox.checked; + } + + private onResponseSelectionChanged() { + const {value, max} = this.elements.responseSelection; + this.elements.historyWarning.hidden = value === '0' || value === max; + this.dispatchEvent( + new CustomEvent('response-select', {detail: Number(value) - 1})); + } + + private onResponseSelectionBlur() { + const {value, min, max} = this.elements.responseSelection; + this.elements.responseSelection.value = + String(Math.max(Math.min(Number(value), Number(max)), Number(min))); + this.onResponseSelectionChanged(); + } + + set responsesCount(value: number) { + if (this.elements.responseSelection.value === + this.elements.responseSelection.max) { + this.elements.responseSelection.value = String(value); + } + this.elements.responseSelection.max = String(value); + this.elements.responseSelection.min = String(value ? 1 : 0); + this.elements.responsesCount.textContent = String(value); + this.onResponseSelectionBlur(); + } + + private onDisplayInputsChanged() { + this.storeInputs(); + this.dispatchEvent(new CustomEvent( + 'display-inputs-changed', {detail: this.displayInputs})); + } + + get displayInputs(): DisplayInputs { + return { + showIncompleteResults: this.elements.showIncompleteResults.checked, + showDetails: this.elements.showDetails.checked, + showAllProviders: this.elements.showAllProviders.checked, + elideCells: this.elements.elideCells.checked, + thinRows: this.elements.thinRows.checked, + }; + } + + set displayInputs(displayInputs: DisplayInputs) { + this.elements.showIncompleteResults.checked = + displayInputs.showIncompleteResults; + this.elements.showDetails.checked = displayInputs.showDetails; + this.elements.showAllProviders.checked = displayInputs.showAllProviders; + this.elements.elideCells.checked = displayInputs.elideCells; + this.elements.thinRows.checked = displayInputs.thinRows; + } + + private onFilterInputsChanged() { + this.dispatchEvent(new CustomEvent( + 'filter-input-changed', {detail: this.elements.filterText.value})); + } + + private onExportClipboard() { + this.dispatchEvent(new CustomEvent('export-clipboard')); + } + + private onExportFile() { + this.dispatchEvent(new CustomEvent('export-file')); + } + + private async onImportClipboard() { + this.import(await navigator.clipboard.readText()); + } + + private onImportFile(event: Event) { + const file = (event.target as HTMLInputElement).files?.[0]; + if (file) { + this.importFile(file); + } + } + + private onProcessBatchFile(event: Event) { + const file = (event.target as HTMLInputElement).files?.[0]; + if (file) { + this.processBatchFile(file); + } + } + + private onImportDropped(event: DragEvent) { + const data = event.dataTransfer!; + const dragText = data.getData('Text'); + if (dragText) { + this.import(dragText); + } else if (data.files[0]) { + this.importFile(data.files[0]); + } + } + + private onProcessBatchDropped(event: DragEvent) { + const data = event.dataTransfer!; + const dragText = data.getData('Text'); + if (dragText) { + this.processBatch(dragText); + } else if (data.files[0]) { + this.processBatchFile(data.files[0]); + } + } + + private importFile(file: File) { + OmniboxInput.readFile(file).then(this.import.bind(this)); + } + + private processBatchFile(file: File) { + OmniboxInput.readFile(file).then(this.processBatch.bind(this)); + } + + private import(importString: string) { + try { + const importData = JSON.parse(importString); + // TODO(manukh): If import fails, this UI state change shouldn't happen. + this.elements.importedWarning.hidden = false; + this.dispatchEvent(new CustomEvent('import', {detail: importData})); + } catch (error) { + console.error('error during import, invalid json:', error); + } + } + + private processBatch(processBatchString: string) { + try { + const processBatchData = JSON.parse(processBatchString); + this.dispatchEvent( + new CustomEvent('process-batch', {detail: processBatchData})); + } catch (error) { + console.error('error during process batch, invalid json:', error); + } + } + + private static readFile(file: File): Promise<string> { + return new Promise(resolve => { + const reader = new FileReader(); + reader.onloadend = () => { + if (reader.readyState === FileReader.DONE) { + resolve(reader.result as string); + } else { + console.error('error importing, unable to read file:', reader.error); + } + }; + reader.readAsText(file); + }); + } + + static get defaultDisplayInputs(): DisplayInputs { + return { + showIncompleteResults: false, + showDetails: false, + showAllProviders: true, + elideCells: true, + thinRows: false, + }; + } +} + +customElements.define('omnibox-input', OmniboxInput);
diff --git a/chrome/browser/resources/omnibox/tsconfig_base.json b/chrome/browser/resources/omnibox/tsconfig_base.json index 99a81eca..362119d6 100644 --- a/chrome/browser/resources/omnibox/tsconfig_base.json +++ b/chrome/browser/resources/omnibox/tsconfig_base.json
@@ -1,6 +1,7 @@ { "extends": "../../../../tools/typescript/tsconfig_base.json", "compilerOptions": { - "allowJs": true + "allowJs": true, + "strictPropertyInitialization": false } }
diff --git a/chrome/browser/resources/settings/BUILD.gn b/chrome/browser/resources/settings/BUILD.gn index de17653..3a26646c 100644 --- a/chrome/browser/resources/settings/BUILD.gn +++ b/chrome/browser/resources/settings/BUILD.gn
@@ -252,6 +252,7 @@ "languages_page/add_languages_dialog.ts", "languages_page/languages_page.ts", "languages_page/spell_check_page.ts", + "languages_page/translate_page.ts", "system_page/system_page.ts", ] }
diff --git a/chrome/browser/resources/settings/basic_page/basic_page.html b/chrome/browser/resources/settings/basic_page/basic_page.html index cb2b8a2..3a528e1 100644 --- a/chrome/browser/resources/settings/basic_page/basic_page.html +++ b/chrome/browser/resources/settings/basic_page/basic_page.html
@@ -135,6 +135,16 @@ </settings-spell-check-page> </settings-section> </template> + <template is="dom-if" + if="[[enableDesktopDetailedLanguageSettings_]]" restamp> + <settings-section page-title="$i18n{translatePageTitle}" + section="translate" nest-under-section="languages"> + <settings-translate-page prefs="{{prefs}}" + languages="{{languages}}" + language-helper="{{languageHelper}}"> + </settings-translate-page> + </settings-section> + </template> </if> <template is="dom-if" if="[[showPage_(pageVisibility.downloads)]]" restamp>
diff --git a/chrome/browser/resources/settings/basic_page/basic_page.ts b/chrome/browser/resources/settings/basic_page/basic_page.ts index a286ff6f..309877b 100644 --- a/chrome/browser/resources/settings/basic_page/basic_page.ts +++ b/chrome/browser/resources/settings/basic_page/basic_page.ts
@@ -142,6 +142,16 @@ }, }, + // <if expr="not chromeos_ash"> + enableDesktopDetailedLanguageSettings_: { + type: Boolean, + value() { + return loadTimeData.getBoolean( + 'enableDesktopDetailedLanguageSettings'); + }, + }, + // </if> + /** * True if the basic page should currently display the privacy guide * promo. @@ -183,6 +193,7 @@ // <if expr="not chromeos_ash"> languages?: LanguagesModel; languageHelper: LanguageHelper; + private enableDesktopDetailedLanguageSettings_: boolean; // </if> pageVisibility: PageVisibility; inSearchMode: boolean;
diff --git a/chrome/browser/resources/settings/chromeos/BUILD.gn b/chrome/browser/resources/settings/chromeos/BUILD.gn index 1f3cdd92..1fa32fa6 100644 --- a/chrome/browser/resources/settings/chromeos/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/BUILD.gn
@@ -46,9 +46,9 @@ deps = [ ":build_ts", ":preprocess_browser_settings_tsc", + ":preprocess_gen_js_files", ":preprocess_mojo_webui", - ":preprocess_non_web_component_files", - ":preprocess_web_components", + ":preprocess_src_js_files", "//chrome/browser/resources/nearby_share/shared:preprocess_v3", "//ui/webui/resources:preprocess", "//ui/webui/resources/cr_components/app_management:build_ts", @@ -99,8 +99,8 @@ } # TypeScript Build Configuration -# TODO(crbug/1315757) Gradually remove JS files from preprocess_web_components -# and preprocess_non_web_component_files, and add them as input files here. +# TODO(crbug/1315757) Gradually remove JS files from pending_src_js_files +# and pending_gen_js_files, and add them as input files here. # Eventually, ts_library() will be the only build path for all JS/TS files. ts_library("build_ts") { tsconfig_base = "tsconfig_base.json" @@ -137,6 +137,25 @@ out_folder = "$target_gen_dir/$preprocessed_ts_folder" } +# TODO(crbug/1315757) Transfer these JS files into ts_library() when +# ready for TS conversion +preprocess_if_expr("preprocess_src_js_files") { + defines = chrome_grit_defines + in_folder = "../" + out_folder = "$target_gen_dir/$preprocessed_folder" + out_manifest = "$target_gen_dir/$non_web_component_files_manifest" + in_files = pending_src_js_files +} + +preprocess_if_expr("preprocess_gen_js_files") { + defines = chrome_grit_defines + deps = [ ":generate_web_components" ] + in_folder = get_path_info("../", "gen_dir") + out_folder = "$target_gen_dir/$preprocessed_folder" + out_manifest = "$target_gen_dir/$web_components_manifest" + in_files = pending_gen_js_files +} + # Preprocess all WebUI mojom files, which are bundled in optimized builds. preprocess_if_expr("preprocess_mojo_webui") { deps = [ @@ -320,9 +339,9 @@ deps += [ ":build_ts", ":preprocess_browser_settings_tsc", + ":preprocess_gen_js_files", ":preprocess_mojo_webui", - ":preprocess_non_web_component_files", - ":preprocess_web_components", + ":preprocess_src_js_files", "//chrome/browser/resources/nearby_share/shared:build_v3_grdp", "//ui/webui/resources/cr_components/app_management:build_ts", ] @@ -338,90 +357,6 @@ } } -preprocess_if_expr("preprocess_non_web_component_files") { - defines = chrome_grit_defines - in_folder = "../" - out_folder = "$target_gen_dir/$preprocessed_folder" - out_manifest = "$target_gen_dir/$non_web_component_files_manifest" - in_files = [ - "chromeos/lazy_load.js", - "chromeos/os_settings.js", - "chromeos/os_people_page/lock_state_behavior.js", - "chromeos/os_people_page/os_sync_browser_proxy.js", - "chromeos/crostini_page/crostini_browser_proxy.js", - "chromeos/date_time_page/date_time_types.js", - "chromeos/date_time_page/timezone_browser_proxy.js", - "chromeos/device_page/cros_audio_config.js", - "chromeos/device_page/device_page_browser_proxy.js", - "chromeos/device_page/drag_behavior.js", - "chromeos/device_page/layout_behavior.js", - "chromeos/google_assistant_page/google_assistant_browser_proxy.js", - "chromeos/guest_os/guest_os_browser_proxy.js", - "chromeos/os_privacy_page/privacy_hub_browser_proxy.js", - "chromeos/internet_page/cellular_setup_settings_delegate.js", - "chromeos/internet_page/internet_page_browser_proxy.js", - "chromeos/kerberos_page/kerberos_accounts_browser_proxy.js", - "chromeos/multidevice_page/multidevice_browser_proxy.js", - "chromeos/multidevice_page/multidevice_constants.js", - "chromeos/multidevice_page/multidevice_feature_behavior.js", - "chromeos/multidevice_page/multidevice_metrics_logger.js", - "chromeos/nearby_share_page/nearby_account_manager_browser_proxy.js", - "chromeos/nearby_share_page/nearby_share_receive_manager.js", - "chromeos/nearby_share_page/types.js", - "chromeos/os_a11y_page/manage_a11y_page_browser_proxy.js", - "chromeos/os_a11y_page/os_a11y_page_browser_proxy.js", - "chromeos/os_a11y_page/switch_access_constants.js", - "chromeos/os_a11y_page/switch_access_subpage_browser_proxy.js", - "chromeos/os_a11y_page/text_to_speech_page_browser_proxy.js", - "chromeos/os_a11y_page/keyboard_and_text_input_page_browser_proxy.js", - "chromeos/os_a11y_page/cursor_and_touchpad_page_browser_proxy.js", - "chromeos/os_a11y_page/audio_and_captions_page_browser_proxy.js", - "chromeos/os_a11y_page/tts_subpage_browser_proxy.js", - "chromeos/os_apps_page/android_apps_browser_proxy.js", - "chromeos/os_apps_page/app_management_page/actions.js", - "chromeos/os_apps_page/app_management_page/api_listener.js", - "chromeos/os_apps_page/app_management_page/browser_proxy.js", - "chromeos/os_apps_page/app_management_page/fake_page_handler.js", - "chromeos/os_apps_page/app_management_page/reducers.js", - "chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_browser_proxy.js", - "chromeos/os_apps_page/app_management_page/store.js", - "chromeos/os_apps_page/app_management_page/store_client.js", - "chromeos/os_apps_page/app_management_page/util.js", - "chromeos/os_apps_page/app_management_page/types.js", - "chromeos/os_apps_page/app_notifications_page/mojo_interface_provider.js", - "chromeos/os_bluetooth_page/os_bluetooth_devices_subpage_browser_proxy.js", - "chromeos/os_bluetooth_page/settings_fast_pair_constants.js", - "chromeos/os_languages_page/input_method_settings.js", - "chromeos/os_languages_page/languages_browser_proxy.js", - "chromeos/os_languages_page/languages.js", - "chromeos/os_languages_page/languages_types.js", - "chromeos/os_languages_page/input_method_util.js", - "chromeos/os_languages_page/languages_metrics_proxy.js", - "chromeos/os_people_page/fingerprint_browser_proxy.js", - "chromeos/os_printing_page/cups_printers_entry_list_behavior.js", - "chromeos/os_printing_page/cups_printer_dialog_util.js", - "chromeos/os_printing_page/cups_printer_types.js", - "chromeos/os_printing_page/cups_printers_browser_proxy.js", - "chromeos/os_printing_page/cups_printers_entry_manager.js", - "chromeos/os_search_page/search_engines_browser_proxy.js", - "chromeos/os_settings_page/main_page_behavior.js", - "chromeos/bluetooth_page/bluetooth_page_browser_proxy.js", - "chromeos/os_about_page/about_page_browser_proxy.js", - "chromeos/os_about_page/device_name_browser_proxy.js", - "chromeos/os_about_page/device_name_util.js", - "chromeos/os_reset_page/os_reset_browser_proxy.js", - "chromeos/parental_controls_page/parental_controls_browser_proxy.js", - "chromeos/personalization_page/change_picture_browser_proxy.js", - "chromeos/personalization_page/personalization_hub_browser_proxy.js", - "chromeos/personalization_page/wallpaper_browser_proxy.js", - "chromeos/os_privacy_page/peripheral_data_access_browser_proxy.js", - "chromeos/os_privacy_page/metrics_consent_browser_proxy.js", - "chromeos/os_people_page/account_manager_browser_proxy.js", - "chromeos/ambient_mode_page/ambient_mode_browser_proxy.js", - "chromeos/ambient_mode_page/constants.js", - ] -} - # Since Browser Settings is migrating to TypeScript (crbug.com/1234307), and # some files are still shared with CrOS Settings, need to copy the transpiled # JS files from TS compiler's output. @@ -492,228 +427,6 @@ } } -preprocess_if_expr("preprocess_web_components") { - defines = chrome_grit_defines - deps = [ ":generate_web_components" ] - in_folder = get_path_info("../", "gen_dir") - out_folder = "$target_gen_dir/$preprocessed_folder" - out_manifest = "$target_gen_dir/$web_components_manifest" - in_files = [ - "chromeos/ambient_mode_page/album_item.js", - "chromeos/ambient_mode_page/album_list.js", - "chromeos/ambient_mode_page/ambient_mode_page.js", - "chromeos/ambient_mode_page/ambient_mode_photos_page.js", - "chromeos/ambient_mode_page/art_album_dialog.js", - "chromeos/ambient_mode_page/text_with_tooltip.js", - "chromeos/ambient_mode_page/topic_source_item.js", - "chromeos/ambient_mode_page/topic_source_list.js", - "chromeos/bluetooth_page/bluetooth_device_list_item.js", - "chromeos/bluetooth_page/bluetooth_page.js", - "chromeos/bluetooth_page/bluetooth_subpage.js", - "chromeos/crostini_page/bruschetta_subpage.js", - "chromeos/crostini_page/crostini_arc_adb_confirmation_dialog.js", - "chromeos/crostini_page/crostini_arc_adb.js", - "chromeos/crostini_page/crostini_confirmation_dialog.js", - "chromeos/crostini_page/crostini_disk_resize_confirmation_dialog.js", - "chromeos/crostini_page/crostini_disk_resize_dialog.js", - "chromeos/crostini_page/crostini_export_import.js", - "chromeos/crostini_page/crostini_extra_containers_create_dialog.js", - "chromeos/crostini_page/crostini_extra_containers.js", - "chromeos/crostini_page/crostini_import_confirmation_dialog.js", - "chromeos/crostini_page/crostini_page.js", - "chromeos/crostini_page/crostini_port_forwarding_add_port_dialog.js", - "chromeos/crostini_page/crostini_port_forwarding.js", - "chromeos/crostini_page/crostini_subpage.js", - "chromeos/date_time_page/date_time_page.js", - "chromeos/date_time_page/timezone_selector.js", - "chromeos/date_time_page/timezone_subpage.js", - "chromeos/device_page/audio.js", - "chromeos/device_page/device_page.js", - "chromeos/device_page/display.js", - "chromeos/device_page/display_layout.js", - "chromeos/device_page/display_overscan_dialog.js", - "chromeos/device_page/keyboard.js", - "chromeos/device_page/pointers.js", - "chromeos/device_page/power.js", - "chromeos/device_page/storage_external_entry.js", - "chromeos/device_page/storage_external.js", - "chromeos/device_page/storage.js", - "chromeos/device_page/stylus.js", - "chromeos/google_assistant_page/google_assistant_page.js", - "chromeos/guest_os/guest_os_container_select.js", - "chromeos/guest_os/guest_os_shared_paths.js", - "chromeos/guest_os/guest_os_shared_usb_devices.js", - "chromeos/internet_page/cellular_networks_list.js", - "chromeos/internet_page/cellular_roaming_toggle_button.js", - "chromeos/internet_page/cellular_setup_dialog.js", - "chromeos/internet_page/esim_install_error_dialog.js", - "chromeos/internet_page/esim_remove_profile_dialog.js", - "chromeos/internet_page/esim_rename_dialog.js", - "chromeos/internet_page/internet_config.js", - "chromeos/internet_page/internet_detail_menu.js", - "chromeos/internet_page/internet_detail_page.js", - "chromeos/internet_page/internet_known_networks_page.js", - "chromeos/internet_page/internet_page.js", - "chromeos/internet_page/internet_shared_css.js", - "chromeos/internet_page/internet_subpage.js", - "chromeos/internet_page/network_always_on_vpn.js", - "chromeos/internet_page/network_proxy_section.js", - "chromeos/internet_page/network_summary_item.js", - "chromeos/internet_page/network_summary.js", - "chromeos/internet_page/settings_traffic_counters.js", - "chromeos/internet_page/tether_connection_dialog.js", - "chromeos/kerberos_page/kerberos_accounts.js", - "chromeos/kerberos_page/kerberos_add_account_dialog.js", - "chromeos/kerberos_page/kerberos_page.js", - "chromeos/keyboard_shortcut_banner/keyboard_shortcut_banner.js", - "chromeos/multidevice_page/multidevice_combined_setup_item.js", - "chromeos/multidevice_page/multidevice_feature_item.js", - "chromeos/multidevice_page/multidevice_feature_toggle.js", - "chromeos/multidevice_page/multidevice_notification_access_setup_dialog.js", - "chromeos/multidevice_page/multidevice_page.js", - "chromeos/multidevice_page/multidevice_permissions_setup_dialog.js", - "chromeos/multidevice_page/multidevice_radio_button.js", - "chromeos/multidevice_page/multidevice_screen_lock_subpage.js", - "chromeos/multidevice_page/multidevice_smartlock_item.js", - "chromeos/multidevice_page/multidevice_smartlock_subpage.js", - "chromeos/multidevice_page/multidevice_subpage.js", - "chromeos/multidevice_page/multidevice_task_continuation_disabled_link.js", - "chromeos/multidevice_page/multidevice_task_continuation_item.js", - "chromeos/multidevice_page/multidevice_tether_item.js", - "chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.js", - "chromeos/multidevice_page/multidevice_wifi_sync_item.js", - "chromeos/nearby_share_page/nearby_share_confirm_page.js", - "chromeos/nearby_share_page/nearby_share_contact_visibility_dialog.js", - "chromeos/nearby_share_page/nearby_share_data_usage_dialog.js", - "chromeos/nearby_share_page/nearby_share_device_name_dialog.js", - "chromeos/nearby_share_page/nearby_share_high_visibility_page.js", - "chromeos/nearby_share_page/nearby_share_receive_dialog.js", - "chromeos/nearby_share_page/nearby_share_subpage.js", - "chromeos/os_a11y_page/change_dictation_locale_dialog.js", - "chromeos/os_a11y_page/display_and_magnification_page.js", - "chromeos/os_a11y_page/keyboard_and_text_input_page.js", - "chromeos/os_a11y_page/cursor_and_touchpad_page.js", - "chromeos/os_a11y_page/audio_and_captions_page.js", - "chromeos/os_a11y_page/manage_a11y_page.js", - "chromeos/os_a11y_page/os_a11y_page.js", - "chromeos/os_a11y_page/switch_access_action_assignment_dialog.js", - "chromeos/os_a11y_page/switch_access_action_assignment_pane.js", - "chromeos/os_a11y_page/switch_access_setup_guide_dialog.js", - "chromeos/os_a11y_page/switch_access_setup_guide_warning_dialog.js", - "chromeos/os_a11y_page/switch_access_subpage.js", - "chromeos/os_a11y_page/text_to_speech_page.js", - "chromeos/os_a11y_page/tts_subpage.js", - "chromeos/os_about_page/channel_switcher_dialog.js", - "chromeos/os_about_page/consumer_auto_update_toggle_dialog.js", - "chromeos/os_about_page/detailed_build_info.js", - "chromeos/os_about_page/edit_hostname_dialog.js", - "chromeos/os_about_page/os_about_page.js", - "chromeos/os_about_page/update_warning_dialog.js", - "chromeos/os_apps_page/android_apps_subpage.js", - "chromeos/os_apps_page/app_management_page/app_details_item.js", - "chromeos/os_apps_page/app_management_page/app_detail_view.js", - "chromeos/os_apps_page/app_management_page/app_item.js", - "chromeos/os_apps_page/app_management_page/app_management_page.js", - "chromeos/os_apps_page/app_management_page/arc_detail_view.js", - "chromeos/os_apps_page/app_management_page/borealis_page/borealis_detail_view.js", - "chromeos/os_apps_page/app_management_page/chrome_app_detail_view.js", - "chromeos/os_apps_page/app_management_page/dom_switch.js", - "chromeos/os_apps_page/app_management_page/main_view.js", - "chromeos/os_apps_page/app_management_page/pin_to_shelf_item.js", - "chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_detail_view.js", - "chromeos/os_apps_page/app_management_page/pwa_detail_view.js", - "chromeos/os_apps_page/app_management_page/resize_lock_item.js", - "chromeos/os_apps_page/app_management_page/shared_style.js", - "chromeos/os_apps_page/app_management_page/shared_vars.js", - "chromeos/os_apps_page/app_management_page/supported_links_dialog.js", - "chromeos/os_apps_page/app_management_page/supported_links_item.js", - "chromeos/os_apps_page/app_management_page/supported_links_overlapping_apps_dialog.js", - "chromeos/os_apps_page/app_notifications_page/app_notification_row.js", - "chromeos/os_apps_page/app_notifications_page/app_notifications_subpage.js", - "chromeos/os_apps_page/os_apps_page.js", - "chromeos/os_bluetooth_page/os_bluetooth_change_device_name_dialog.js", - "chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.js", - "chromeos/os_bluetooth_page/os_bluetooth_devices_subpage.js", - "chromeos/os_bluetooth_page/os_bluetooth_saved_devices_subpage.js", - "chromeos/os_bluetooth_page/os_bluetooth_page.js", - "chromeos/os_bluetooth_page/os_bluetooth_pairing_dialog.js", - "chromeos/os_bluetooth_page/os_bluetooth_summary.js", - "chromeos/os_bluetooth_page/os_bluetooth_true_wireless_images.js", - "chromeos/os_bluetooth_page/os_paired_bluetooth_list_item.js", - "chromeos/os_bluetooth_page/os_paired_bluetooth_list.js", - "chromeos/os_bluetooth_page/os_saved_devices_list.js", - "chromeos/os_bluetooth_page/os_saved_devices_list_item.js", - "chromeos/os_bluetooth_page/os_remove_saved_device_dialog.js", - "chromeos/os_bluetooth_page/os_bluetooth_forget_device_dialog.js", - "chromeos/os_bluetooth_page/settings_fast_pair_toggle.js", - "chromeos/os_files_page/os_files_page.js", - "chromeos/os_files_page/smb_shares_page.js", - "chromeos/os_languages_page/add_input_methods_dialog.js", - "chromeos/os_languages_page/add_items_dialog.js", - "chromeos/os_languages_page/add_spellcheck_languages_dialog.js", - "chromeos/os_languages_page/change_device_language_dialog.js", - "chromeos/os_languages_page/cr_checkbox_with_policy.js", - "chromeos/os_languages_page/input_method_options_page.js", - "chromeos/os_languages_page/input_page.js", - "chromeos/os_languages_page/os_add_languages_dialog.js", - "chromeos/os_languages_page/os_edit_dictionary_page.js", - "chromeos/os_languages_page/os_languages_page_v2.js", - "chromeos/os_languages_page/os_languages_section.js", - "chromeos/os_languages_page/shared_style.js", - "chromeos/os_languages_page/shared_vars.js", - "chromeos/os_languages_page/smart_inputs_page.js", - "chromeos/os_people_page/account_manager.js", - "chromeos/os_people_page/fingerprint_list.js", - "chromeos/os_people_page/lock_screen.js", - "chromeos/os_people_page/lock_screen_password_prompt_dialog.js", - "chromeos/os_people_page/os_people_page.js", - "chromeos/os_people_page/os_sync_controls.js", - "chromeos/os_people_page/pin_autosubmit_dialog.js", - "chromeos/os_people_page/setup_fingerprint_dialog.js", - "chromeos/os_people_page/setup_pin_dialog.js", - "chromeos/os_people_page/user_list.js", - "chromeos/os_people_page/users_add_user_dialog.js", - "chromeos/os_people_page/users_page.js", - "chromeos/os_printing_page/cups_add_printer_dialog.js", - "chromeos/os_printing_page/cups_add_printer_manually_dialog.js", - "chromeos/os_printing_page/cups_add_printer_manufacturer_model_dialog.js", - "chromeos/os_printing_page/cups_add_print_server_dialog.js", - "chromeos/os_printing_page/cups_edit_printer_dialog.js", - "chromeos/os_printing_page/cups_enterprise_printers.js", - "chromeos/os_printing_page/cups_nearby_printers.js", - "chromeos/os_printing_page/cups_printer_dialog_error.js", - "chromeos/os_printing_page/cups_printers_entry.js", - "chromeos/os_printing_page/cups_printer_shared_css.js", - "chromeos/os_printing_page/cups_printers.js", - "chromeos/os_printing_page/cups_saved_printers.js", - "chromeos/os_printing_page/cups_settings_add_printer_dialog.js", - "chromeos/os_printing_page/os_printing_page.js", - "chromeos/os_privacy_page/os_privacy_page.js", - "chromeos/os_privacy_page/peripheral_data_access_protection_dialog.js", - "chromeos/os_privacy_page/privacy_hub_page.js", - "chromeos/os_privacy_page/smart_privacy_page.js", - "chromeos/os_reset_page/os_powerwash_dialog_esim_item.js", - "chromeos/os_reset_page/os_powerwash_dialog.js", - "chromeos/os_reset_page/os_reset_page.js", - "chromeos/os_search_page/os_search_page.js", - "chromeos/os_search_page/os_search_selection_dialog.js", - "chromeos/os_search_page/search_engine.js", - "chromeos/os_search_page/search_subpage.js", - "chromeos/os_settings_main/os_settings_main.js", - "chromeos/os_settings_menu/os_settings_menu.js", - "chromeos/os_settings_page/os_settings_page.js", - "chromeos/os_settings_page/settings_idle_load.js", - "chromeos/os_settings_search_box/os_search_result_row.js", - "chromeos/os_settings_search_box/os_settings_search_box.js", - "chromeos/os_settings_ui/os_settings_ui.js", - "chromeos/os_toolbar/os_toolbar.js", - "chromeos/parental_controls_page/parental_controls_page.js", - "chromeos/personalization_page/change_picture.js", - "chromeos/personalization_page/personalization_page.js", - "chromeos/settings_scheduler_slider/settings_scheduler_slider.js", - ] -} - html_to_js("web_components") { js_files = [ "os_icons.js",
diff --git a/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.html b/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.html index f84711d..44f7896 100644 --- a/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.html +++ b/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.html
@@ -35,6 +35,7 @@ } iron-icon[icon='cr:error-outline'], + iron-icon[icon='cr:warning'], iron-icon[icon='os-settings:end-of-life'] { fill: var(--cros-icon-color-alert); } @@ -117,6 +118,9 @@ id="endOfLifeMessageContainer" hidden="[[!hasEndOfLife_]]" localized-string="$i18n{endOfLifeMessage}"> </localized-link> + <div class="secondary" hidden="[[!hasDeferredUpdate_]]"> + $i18n{aboutDeferredUpdate} + </div> <div class="secondary">$i18n{aboutBrowserVersion}</div> </div> <div class="separator" hidden="[[!showButtonContainer_]]"></div>
diff --git a/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.js b/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.js index 3ec8ebe..b27f9d2 100644 --- a/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.js +++ b/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.js
@@ -549,7 +549,7 @@ case UpdateStatus.DISABLED_BY_ADMIN: return this.i18nAdvanced('aboutUpgradeAdministrator'); case UpdateStatus.DEFERRED: - return this.i18nAdvanced('aboutUpgradeRelaunch'); + return this.i18nAdvanced('aboutUpgradeNotUpToDate'); default: function formatMessage(msg) { return parseHtmlSubset('<b>' + msg + '</b>', ['br', 'pre']) @@ -588,9 +588,10 @@ return 'cr:error-outline'; case UpdateStatus.UPDATED: case UpdateStatus.NEARLY_UPDATED: - case UpdateStatus.DEFERRED: // TODO(crbug.com/986596): Don't use browser icons here. Fork them. return 'settings:check-circle'; + case UpdateStatus.DEFERRED: + return 'cr:warning'; default: return null; }
diff --git a/chrome/browser/resources/settings/chromeos/os_settings.gni b/chrome/browser/resources/settings/chromeos/os_settings.gni index 23c2fd1..c7e53fc 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings.gni +++ b/chrome/browser/resources/settings/chromeos/os_settings.gni
@@ -5,6 +5,81 @@ import("//third_party/closure_compiler/compile_js.gni") import("../settings.gni") +# TODO(crbug/1315757) These pending files will should be transferred to their +# respective list (src_ts_files or gen_ts_files) once eligible to be converted +# to TS and input to ts_library(). +pending_src_js_files = [ + "chromeos/lazy_load.js", + "chromeos/os_settings.js", + "chromeos/internet_page/cellular_setup_settings_delegate.js", + "chromeos/internet_page/internet_page_browser_proxy.js", + "chromeos/multidevice_page/multidevice_browser_proxy.js", + "chromeos/multidevice_page/multidevice_constants.js", + "chromeos/multidevice_page/multidevice_feature_behavior.js", + "chromeos/multidevice_page/multidevice_metrics_logger.js", + "chromeos/os_printing_page/cups_printers_entry_list_behavior.js", + "chromeos/os_printing_page/cups_printer_dialog_util.js", + "chromeos/os_printing_page/cups_printer_types.js", + "chromeos/os_printing_page/cups_printers_browser_proxy.js", + "chromeos/os_printing_page/cups_printers_entry_manager.js", + "chromeos/os_reset_page/os_reset_browser_proxy.js", +] + +pending_gen_js_files = [ + "chromeos/internet_page/cellular_networks_list.js", + "chromeos/internet_page/cellular_roaming_toggle_button.js", + "chromeos/internet_page/cellular_setup_dialog.js", + "chromeos/internet_page/esim_install_error_dialog.js", + "chromeos/internet_page/esim_remove_profile_dialog.js", + "chromeos/internet_page/esim_rename_dialog.js", + "chromeos/internet_page/internet_config.js", + "chromeos/internet_page/internet_detail_menu.js", + "chromeos/internet_page/internet_detail_page.js", + "chromeos/internet_page/internet_known_networks_page.js", + "chromeos/internet_page/internet_page.js", + "chromeos/internet_page/internet_shared_css.js", + "chromeos/internet_page/internet_subpage.js", + "chromeos/internet_page/network_always_on_vpn.js", + "chromeos/internet_page/network_proxy_section.js", + "chromeos/internet_page/network_summary_item.js", + "chromeos/internet_page/network_summary.js", + "chromeos/internet_page/settings_traffic_counters.js", + "chromeos/internet_page/tether_connection_dialog.js", + "chromeos/multidevice_page/multidevice_combined_setup_item.js", + "chromeos/multidevice_page/multidevice_feature_item.js", + "chromeos/multidevice_page/multidevice_feature_toggle.js", + "chromeos/multidevice_page/multidevice_notification_access_setup_dialog.js", + "chromeos/multidevice_page/multidevice_page.js", + "chromeos/multidevice_page/multidevice_permissions_setup_dialog.js", + "chromeos/multidevice_page/multidevice_radio_button.js", + "chromeos/multidevice_page/multidevice_screen_lock_subpage.js", + "chromeos/multidevice_page/multidevice_smartlock_item.js", + "chromeos/multidevice_page/multidevice_smartlock_subpage.js", + "chromeos/multidevice_page/multidevice_subpage.js", + "chromeos/multidevice_page/multidevice_task_continuation_disabled_link.js", + "chromeos/multidevice_page/multidevice_task_continuation_item.js", + "chromeos/multidevice_page/multidevice_tether_item.js", + "chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.js", + "chromeos/multidevice_page/multidevice_wifi_sync_item.js", + "chromeos/os_printing_page/cups_add_printer_dialog.js", + "chromeos/os_printing_page/cups_add_printer_manually_dialog.js", + "chromeos/os_printing_page/cups_add_printer_manufacturer_model_dialog.js", + "chromeos/os_printing_page/cups_add_print_server_dialog.js", + "chromeos/os_printing_page/cups_edit_printer_dialog.js", + "chromeos/os_printing_page/cups_enterprise_printers.js", + "chromeos/os_printing_page/cups_nearby_printers.js", + "chromeos/os_printing_page/cups_printer_dialog_error.js", + "chromeos/os_printing_page/cups_printers_entry.js", + "chromeos/os_printing_page/cups_printer_shared_css.js", + "chromeos/os_printing_page/cups_printers.js", + "chromeos/os_printing_page/cups_saved_printers.js", + "chromeos/os_printing_page/cups_settings_add_printer_dialog.js", + "chromeos/os_printing_page/os_printing_page.js", + "chromeos/os_reset_page/os_powerwash_dialog_esim_item.js", + "chromeos/os_reset_page/os_powerwash_dialog.js", + "chromeos/os_reset_page/os_reset_page.js", +] + # Files sourced from their checked-in version under src root # TODO(crbug/1315757) JS files here are available for TS conversion src_ts_files = [ @@ -22,6 +97,67 @@ "chromeos/route_observer_behavior.js", "chromeos/route_origin_behavior.js", "chromeos/settings_search_handler.js", + "chromeos/ambient_mode_page/ambient_mode_browser_proxy.js", + "chromeos/ambient_mode_page/constants.js", + "chromeos/bluetooth_page/bluetooth_page_browser_proxy.js", + "chromeos/crostini_page/crostini_browser_proxy.js", + "chromeos/date_time_page/date_time_types.js", + "chromeos/date_time_page/timezone_browser_proxy.js", + "chromeos/device_page/cros_audio_config.js", + "chromeos/device_page/device_page_browser_proxy.js", + "chromeos/device_page/drag_behavior.js", + "chromeos/device_page/layout_behavior.js", + "chromeos/google_assistant_page/google_assistant_browser_proxy.js", + "chromeos/guest_os/guest_os_browser_proxy.js", + "chromeos/kerberos_page/kerberos_accounts_browser_proxy.js", + "chromeos/nearby_share_page/nearby_account_manager_browser_proxy.js", + "chromeos/nearby_share_page/nearby_share_receive_manager.js", + "chromeos/nearby_share_page/types.js", + "chromeos/os_a11y_page/audio_and_captions_page_browser_proxy.js", + "chromeos/os_a11y_page/cursor_and_touchpad_page_browser_proxy.js", + "chromeos/os_a11y_page/keyboard_and_text_input_page_browser_proxy.js", + "chromeos/os_a11y_page/manage_a11y_page_browser_proxy.js", + "chromeos/os_a11y_page/os_a11y_page_browser_proxy.js", + "chromeos/os_a11y_page/switch_access_constants.js", + "chromeos/os_a11y_page/switch_access_subpage_browser_proxy.js", + "chromeos/os_a11y_page/text_to_speech_page_browser_proxy.js", + "chromeos/os_a11y_page/tts_subpage_browser_proxy.js", + "chromeos/os_about_page/about_page_browser_proxy.js", + "chromeos/os_about_page/device_name_browser_proxy.js", + "chromeos/os_about_page/device_name_util.js", + "chromeos/os_apps_page/android_apps_browser_proxy.js", + "chromeos/os_apps_page/app_management_page/actions.js", + "chromeos/os_apps_page/app_management_page/api_listener.js", + "chromeos/os_apps_page/app_management_page/browser_proxy.js", + "chromeos/os_apps_page/app_management_page/fake_page_handler.js", + "chromeos/os_apps_page/app_management_page/reducers.js", + "chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_browser_proxy.js", + "chromeos/os_apps_page/app_management_page/store.js", + "chromeos/os_apps_page/app_management_page/store_client.js", + "chromeos/os_apps_page/app_management_page/util.js", + "chromeos/os_apps_page/app_management_page/types.js", + "chromeos/os_apps_page/app_notifications_page/mojo_interface_provider.js", + "chromeos/os_bluetooth_page/os_bluetooth_devices_subpage_browser_proxy.js", + "chromeos/os_bluetooth_page/settings_fast_pair_constants.js", + "chromeos/os_people_page/account_manager_browser_proxy.js", + "chromeos/os_people_page/fingerprint_browser_proxy.js", + "chromeos/os_people_page/lock_state_behavior.js", + "chromeos/os_people_page/os_sync_browser_proxy.js", + "chromeos/os_privacy_page/metrics_consent_browser_proxy.js", + "chromeos/os_privacy_page/peripheral_data_access_browser_proxy.js", + "chromeos/os_privacy_page/privacy_hub_browser_proxy.js", + "chromeos/os_languages_page/input_method_settings.js", + "chromeos/os_languages_page/languages_browser_proxy.js", + "chromeos/os_languages_page/languages.js", + "chromeos/os_languages_page/languages_types.js", + "chromeos/os_languages_page/input_method_util.js", + "chromeos/os_languages_page/languages_metrics_proxy.js", + "chromeos/os_search_page/search_engines_browser_proxy.js", + "chromeos/os_settings_page/main_page_behavior.js", + "chromeos/parental_controls_page/parental_controls_browser_proxy.js", + "chromeos/personalization_page/change_picture_browser_proxy.js", + "chromeos/personalization_page/personalization_hub_browser_proxy.js", + "chromeos/personalization_page/wallpaper_browser_proxy.js", "router.js", ] @@ -30,6 +166,166 @@ gen_ts_files = [ "chromeos/os_icons.js", "chromeos/os_settings_icons_css.js", + "chromeos/ambient_mode_page/album_item.js", + "chromeos/ambient_mode_page/album_list.js", + "chromeos/ambient_mode_page/ambient_mode_page.js", + "chromeos/ambient_mode_page/ambient_mode_photos_page.js", + "chromeos/ambient_mode_page/art_album_dialog.js", + "chromeos/ambient_mode_page/text_with_tooltip.js", + "chromeos/ambient_mode_page/topic_source_item.js", + "chromeos/ambient_mode_page/topic_source_list.js", + "chromeos/bluetooth_page/bluetooth_device_list_item.js", + "chromeos/bluetooth_page/bluetooth_page.js", + "chromeos/bluetooth_page/bluetooth_subpage.js", + "chromeos/crostini_page/bruschetta_subpage.js", + "chromeos/crostini_page/crostini_arc_adb_confirmation_dialog.js", + "chromeos/crostini_page/crostini_arc_adb.js", + "chromeos/crostini_page/crostini_confirmation_dialog.js", + "chromeos/crostini_page/crostini_disk_resize_confirmation_dialog.js", + "chromeos/crostini_page/crostini_disk_resize_dialog.js", + "chromeos/crostini_page/crostini_export_import.js", + "chromeos/crostini_page/crostini_extra_containers_create_dialog.js", + "chromeos/crostini_page/crostini_extra_containers.js", + "chromeos/crostini_page/crostini_import_confirmation_dialog.js", + "chromeos/crostini_page/crostini_page.js", + "chromeos/crostini_page/crostini_port_forwarding_add_port_dialog.js", + "chromeos/crostini_page/crostini_port_forwarding.js", + "chromeos/crostini_page/crostini_subpage.js", + "chromeos/date_time_page/date_time_page.js", + "chromeos/date_time_page/timezone_selector.js", + "chromeos/date_time_page/timezone_subpage.js", + "chromeos/device_page/audio.js", + "chromeos/device_page/device_page.js", + "chromeos/device_page/display.js", + "chromeos/device_page/display_layout.js", + "chromeos/device_page/display_overscan_dialog.js", + "chromeos/device_page/keyboard.js", + "chromeos/device_page/pointers.js", + "chromeos/device_page/power.js", + "chromeos/device_page/storage_external_entry.js", + "chromeos/device_page/storage_external.js", + "chromeos/device_page/storage.js", + "chromeos/device_page/stylus.js", + "chromeos/google_assistant_page/google_assistant_page.js", + "chromeos/guest_os/guest_os_container_select.js", + "chromeos/guest_os/guest_os_shared_paths.js", + "chromeos/guest_os/guest_os_shared_usb_devices.js", + "chromeos/kerberos_page/kerberos_accounts.js", + "chromeos/kerberos_page/kerberos_add_account_dialog.js", + "chromeos/kerberos_page/kerberos_page.js", + "chromeos/keyboard_shortcut_banner/keyboard_shortcut_banner.js", + "chromeos/nearby_share_page/nearby_share_confirm_page.js", + "chromeos/nearby_share_page/nearby_share_contact_visibility_dialog.js", + "chromeos/nearby_share_page/nearby_share_data_usage_dialog.js", + "chromeos/nearby_share_page/nearby_share_device_name_dialog.js", + "chromeos/nearby_share_page/nearby_share_high_visibility_page.js", + "chromeos/nearby_share_page/nearby_share_receive_dialog.js", + "chromeos/nearby_share_page/nearby_share_subpage.js", + "chromeos/os_a11y_page/audio_and_captions_page.js", + "chromeos/os_a11y_page/change_dictation_locale_dialog.js", + "chromeos/os_a11y_page/cursor_and_touchpad_page.js", + "chromeos/os_a11y_page/display_and_magnification_page.js", + "chromeos/os_a11y_page/keyboard_and_text_input_page.js", + "chromeos/os_a11y_page/manage_a11y_page.js", + "chromeos/os_a11y_page/os_a11y_page.js", + "chromeos/os_a11y_page/switch_access_action_assignment_dialog.js", + "chromeos/os_a11y_page/switch_access_action_assignment_pane.js", + "chromeos/os_a11y_page/switch_access_setup_guide_dialog.js", + "chromeos/os_a11y_page/switch_access_setup_guide_warning_dialog.js", + "chromeos/os_a11y_page/switch_access_subpage.js", + "chromeos/os_a11y_page/text_to_speech_page.js", + "chromeos/os_a11y_page/tts_subpage.js", + "chromeos/os_about_page/channel_switcher_dialog.js", + "chromeos/os_about_page/consumer_auto_update_toggle_dialog.js", + "chromeos/os_about_page/detailed_build_info.js", + "chromeos/os_about_page/edit_hostname_dialog.js", + "chromeos/os_about_page/os_about_page.js", + "chromeos/os_about_page/update_warning_dialog.js", + "chromeos/os_apps_page/android_apps_subpage.js", + "chromeos/os_apps_page/app_management_page/app_details_item.js", + "chromeos/os_apps_page/app_management_page/app_detail_view.js", + "chromeos/os_apps_page/app_management_page/app_item.js", + "chromeos/os_apps_page/app_management_page/app_management_page.js", + "chromeos/os_apps_page/app_management_page/arc_detail_view.js", + "chromeos/os_apps_page/app_management_page/borealis_page/borealis_detail_view.js", + "chromeos/os_apps_page/app_management_page/chrome_app_detail_view.js", + "chromeos/os_apps_page/app_management_page/dom_switch.js", + "chromeos/os_apps_page/app_management_page/main_view.js", + "chromeos/os_apps_page/app_management_page/pin_to_shelf_item.js", + "chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_detail_view.js", + "chromeos/os_apps_page/app_management_page/pwa_detail_view.js", + "chromeos/os_apps_page/app_management_page/resize_lock_item.js", + "chromeos/os_apps_page/app_management_page/shared_style.js", + "chromeos/os_apps_page/app_management_page/shared_vars.js", + "chromeos/os_apps_page/app_management_page/supported_links_dialog.js", + "chromeos/os_apps_page/app_management_page/supported_links_item.js", + "chromeos/os_apps_page/app_management_page/supported_links_overlapping_apps_dialog.js", + "chromeos/os_apps_page/app_notifications_page/app_notification_row.js", + "chromeos/os_apps_page/app_notifications_page/app_notifications_subpage.js", + "chromeos/os_apps_page/os_apps_page.js", + "chromeos/os_bluetooth_page/os_bluetooth_change_device_name_dialog.js", + "chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.js", + "chromeos/os_bluetooth_page/os_bluetooth_devices_subpage.js", + "chromeos/os_bluetooth_page/os_bluetooth_forget_device_dialog.js", + "chromeos/os_bluetooth_page/os_bluetooth_saved_devices_subpage.js", + "chromeos/os_bluetooth_page/os_bluetooth_page.js", + "chromeos/os_bluetooth_page/os_bluetooth_pairing_dialog.js", + "chromeos/os_bluetooth_page/os_bluetooth_summary.js", + "chromeos/os_bluetooth_page/os_bluetooth_true_wireless_images.js", + "chromeos/os_bluetooth_page/os_paired_bluetooth_list_item.js", + "chromeos/os_bluetooth_page/os_paired_bluetooth_list.js", + "chromeos/os_bluetooth_page/os_remove_saved_device_dialog.js", + "chromeos/os_bluetooth_page/os_saved_devices_list.js", + "chromeos/os_bluetooth_page/os_saved_devices_list_item.js", + "chromeos/os_bluetooth_page/settings_fast_pair_toggle.js", + "chromeos/os_files_page/os_files_page.js", + "chromeos/os_files_page/smb_shares_page.js", + "chromeos/os_people_page/account_manager.js", + "chromeos/os_people_page/fingerprint_list.js", + "chromeos/os_people_page/lock_screen.js", + "chromeos/os_people_page/lock_screen_password_prompt_dialog.js", + "chromeos/os_people_page/os_people_page.js", + "chromeos/os_people_page/os_sync_controls.js", + "chromeos/os_people_page/pin_autosubmit_dialog.js", + "chromeos/os_people_page/setup_fingerprint_dialog.js", + "chromeos/os_people_page/setup_pin_dialog.js", + "chromeos/os_people_page/user_list.js", + "chromeos/os_people_page/users_add_user_dialog.js", + "chromeos/os_people_page/users_page.js", + "chromeos/os_privacy_page/os_privacy_page.js", + "chromeos/os_privacy_page/peripheral_data_access_protection_dialog.js", + "chromeos/os_privacy_page/privacy_hub_page.js", + "chromeos/os_privacy_page/smart_privacy_page.js", + "chromeos/os_languages_page/add_input_methods_dialog.js", + "chromeos/os_languages_page/add_items_dialog.js", + "chromeos/os_languages_page/add_spellcheck_languages_dialog.js", + "chromeos/os_languages_page/change_device_language_dialog.js", + "chromeos/os_languages_page/cr_checkbox_with_policy.js", + "chromeos/os_languages_page/input_method_options_page.js", + "chromeos/os_languages_page/input_page.js", + "chromeos/os_languages_page/os_add_languages_dialog.js", + "chromeos/os_languages_page/os_edit_dictionary_page.js", + "chromeos/os_languages_page/os_languages_page_v2.js", + "chromeos/os_languages_page/os_languages_section.js", + "chromeos/os_languages_page/shared_style.js", + "chromeos/os_languages_page/shared_vars.js", + "chromeos/os_languages_page/smart_inputs_page.js", + "chromeos/os_search_page/os_search_page.js", + "chromeos/os_search_page/os_search_selection_dialog.js", + "chromeos/os_search_page/search_engine.js", + "chromeos/os_search_page/search_subpage.js", + "chromeos/os_settings_main/os_settings_main.js", + "chromeos/os_settings_menu/os_settings_menu.js", + "chromeos/os_settings_page/os_settings_page.js", + "chromeos/os_settings_page/settings_idle_load.js", + "chromeos/os_settings_search_box/os_search_result_row.js", + "chromeos/os_settings_search_box/os_settings_search_box.js", + "chromeos/os_settings_ui/os_settings_ui.js", + "chromeos/os_toolbar/os_toolbar.js", + "chromeos/parental_controls_page/parental_controls_page.js", + "chromeos/personalization_page/change_picture.js", + "chromeos/personalization_page/personalization_page.js", + "chromeos/settings_scheduler_slider/settings_scheduler_slider.js", ] # TODO(crbug.com/1121865): browser_resolver_prefix_replacements allows path
diff --git a/chrome/browser/resources/settings/chromeos/tsconfig_base.json b/chrome/browser/resources/settings/chromeos/tsconfig_base.json index 3f69ccee..a099193 100644 --- a/chrome/browser/resources/settings/chromeos/tsconfig_base.json +++ b/chrome/browser/resources/settings/chromeos/tsconfig_base.json
@@ -4,6 +4,7 @@ "allowJs": true, "noUncheckedIndexedAccess": false, "noUnusedLocals": false, - "strictPropertyInitialization": false + "strictPropertyInitialization": false, + "preserveValueImports": true } }
diff --git a/chrome/browser/resources/settings/languages_page/languages_page.html b/chrome/browser/resources/settings/languages_page/languages_page.html index 6a1e8e11..71360f4 100644 --- a/chrome/browser/resources/settings/languages_page/languages_page.html +++ b/chrome/browser/resources/settings/languages_page/languages_page.html
@@ -109,155 +109,79 @@ </div> </template> </div> - <settings-toggle-button id="offerTranslateOtherLanguages" - pref="{{prefs.translate.enabled}}" - label="$i18n{offerToEnableTranslate}" - on-settings-boolean-control-change="onTranslateToggleChange_"> - </settings-toggle-button> - <template is="dom-if" if="[[enableDesktopDetailedLanguageSettings_]]"> - <div class="cr-row continuation"> - <h2 class="flex"> - $i18n{automaticallyTranslateLanguages} - </h2> - <cr-button id="addAlwaysTranslate" class="header-aligned-button" - on-click="onAddAlwaysTranslateLanguagesClick_"> - $i18n{add} - </cr-button> - </div> - <div class="list-frame"> - <div id="alwaysTranslateList" class="vertical-list"> - <template is="dom-repeat" items="[[languages.alwaysTranslate]]"> - <div class="list-item"> - <div class="start cr-padded-text"> - [[item.displayName]] - </div> - <cr-icon-button class="icon-clear" - on-click="onRemoveAlwaysTranslateLanguageClick_"> - </cr-icon-button> - </div> - </template> - </div> - <div id="noAlwaysTranslateLabel" class="list-item" - hidden$="[[hasSome_(languages.alwaysTranslate)]]"> - $i18n{noLanguagesAdded} - </div> - </div> - <div class="cr-row continuation"> - <h2 class="flex"> - $i18n{neverTranslateLanguages} - </h2> - <cr-button id="addNeverTranslate" class="header-aligned-button" - on-click="onAddNeverTranslateLanguagesClick_"> - $i18n{add} - </cr-button> - </div> - <div class="list-frame"> - <div id="neverTranslateList" class="vertical-list"> - <template is="dom-repeat" items="[[languages.neverTranslate]]"> - <div class="list-item"> - <div class="start cr-padded-text"> - [[item.displayName]] - </div> - <cr-icon-button class="icon-clear" - value="[[item.code]]" - on-click="onRemoveNeverTranslateLanguageClick_"> - </cr-icon-button> - </div> - </template> - </div> - <div id="noNeverTranslateLabel" class="list-item" - hidden$="[[hasSome_(languages.neverTranslate)]]"> - $i18n{noLanguagesAdded} - </div> - </div> + <template is="dom-if" if="[[!enableDesktopDetailedLanguageSettings_]]"> + <settings-toggle-button id="offerTranslateOtherLanguages" + pref="{{prefs.translate.enabled}}" label="$i18n{offerToEnableTranslate}" + on-settings-boolean-control-change="onTranslateToggleChange_"> + </settings-toggle-button> </template> <cr-lazy-render id="menu"> - <template> - <cr-action-menu role-description="$i18n{menu}" + <template> + <cr-action-menu role-description="$i18n{menu}" <if expr="is_win"> - on-close="onCloseMenu_" + on-close="onCloseMenu_" </if> - class$="[[getMenuClass_(prefs.translate.enabled.value)]]"> + class$="[[getMenuClass_(prefs.translate.enabled.value)]]"> <if expr="is_win"> - <cr-checkbox id="uiLanguageItem" - class="dropdown-item" - checked="[[isProspectiveUILanguage_( - detailLanguage_.language.code, - languages.prospectiveUILanguage)]]" - on-change="onUILanguageChange_" - disabled="[[disableUILanguageCheckbox_( - detailLanguage_, languages.prospectiveUILanguage)]]"> - <span> - $i18n{displayInThisLanguage} - </span> - <iron-icon class="policy" icon="cr20:domain" - hidden$="[[!detailLanguage_.language.isProhibitedLanguage]]"> - </iron-icon> - </cr-checkbox> + <cr-checkbox id="uiLanguageItem" + class="dropdown-item" + checked="[[isProspectiveUILanguage_( + detailLanguage_.language.code, + languages.prospectiveUILanguage)]]" + on-change="onUILanguageChange_" + disabled="[[disableUILanguageCheckbox_( + detailLanguage_, languages.prospectiveUILanguage)]]"> + <span> + $i18n{displayInThisLanguage} + </span> + <iron-icon class="policy" icon="cr20:domain" + hidden$="[[!detailLanguage_.language.isProhibitedLanguage]]"> + </iron-icon> + </cr-checkbox> </if> <!-- is_win --> - <template is="dom-if" - if="[[!enableDesktopDetailedLanguageSettings_]]"> - <cr-checkbox id="offerTranslations" - class="dropdown-item" - checked="[[detailLanguage_.translateEnabled]]" - on-change="onTranslateCheckboxChange_" - hidden="[[!prefs.translate.enabled.value]]" - disabled="[[disableTranslateCheckbox_( - detailLanguage_, languages.translateTarget)]]"> - $i18n{offerToTranslateInThisLanguage} - </cr-checkbox> - <hr hidden="[[!shouldShowDialogSeparator_( - languages.enabled.*)]]"> - </template> - <button class="dropdown-item" role="menuitem" - on-click="onMoveToTopTap_" - hidden="[[isNthLanguage_( - 0, detailLanguage_, languages.enabled.*)]]"> - $i18n{moveToTop} - </button> - <button class="dropdown-item" role="menuitem" - on-click="onMoveUpTap_" - hidden="[[!showMoveUp_(detailLanguage_, - languages.enabled.*)]]"> - $i18n{moveUp} - </button> - <button class="dropdown-item" role="menuitem" - on-click="onMoveDownTap_" - hidden="[[!showMoveDown_( - detailLanguage_, languages.enabled.*)]]"> - $i18n{moveDown} - </button> - <button class="dropdown-item" role="menuitem" - on-click="onRemoveLanguageTap_" - hidden="[[!detailLanguage_.removable]]"> - $i18n{removeLanguage} - </button> - </cr-action-menu> - </template> - </cr-lazy-render> - </div> + <template is="dom-if" if="[[!enableDesktopDetailedLanguageSettings_]]"> + <cr-checkbox id="offerTranslations" + class="dropdown-item" + checked="[[detailLanguage_.translateEnabled]]" + on-change="onTranslateCheckboxChange_" + hidden="[[!prefs.translate.enabled.value]]" + disabled="[[disableTranslateCheckbox_( + detailLanguage_, languages.translateTarget)]]"> + $i18n{offerToTranslateInThisLanguage} </cr-checkbox> + <hr hidden="[[!shouldShowDialogSeparator_(languages.enabled.*)]]"> + </template> + <button class="dropdown-item" role="menuitem" + on-click="onMoveToTopTap_" + hidden="[[isNthLanguage_( + 0, detailLanguage_, languages.enabled.*)]]"> + $i18n{moveToTop} + </button> + <button class="dropdown-item" role="menuitem" + on-click="onMoveUpTap_" + hidden="[[!showMoveUp_(detailLanguage_, languages.enabled.*)]]"> + $i18n{moveUp} + </button> + <button class="dropdown-item" role="menuitem" + on-click="onMoveDownTap_" + hidden="[[!showMoveDown_( + detailLanguage_, languages.enabled.*)]]"> + $i18n{moveDown} + </button> + <button class="dropdown-item" role="menuitem" + on-click="onRemoveLanguageTap_" + hidden="[[!detailLanguage_.removable]]"> + $i18n{removeLanguage} + </button> + </cr-action-menu> + </template> + </cr-lazy-render> +</div> <template is="dom-if" if="[[showAddLanguagesDialog_]]" restamp> <settings-add-languages-dialog languages="[[addLanguagesDialogLanguages_]]" on-languages-added="onLanguagesAdded_" on-close="onAddLanguagesDialogClose_"> </settings-add-languages-dialog> </template> -<template is="dom-if" if="[[enableDesktopDetailedLanguageSettings_]]"> - <template is="dom-if" if="[[showAddAlwaysTranslateDialog_]]" restamp> - <settings-add-languages-dialog languages="[[addLanguagesDialogLanguages_]]" - id="alwaysTranslateDialog" - on-close="onAlwaysTranslateDialogClose_" - on-languages-added="onAlwaysTranslateLanguagesAdded_"> - </settings-add-languages-dialog> - </template> - <template is="dom-if" if="[[showAddNeverTranslateDialog_]]" restamp> - <settings-add-languages-dialog languages="[[addLanguagesDialogLanguages_]]" - id="neverTranslateDialog" - on-close="onNeverTranslateDialogClose_" - on-languages-added="onNeverTranslateLanguagesAdded_"> - </settings-add-languages-dialog> - </template> -</template> <template is="dom-if" if="[[showManagedLanguageDialog_]]" restamp> <managed-dialog on-close="onManagedLanguageDialogClosed_" title="[[i18n('languageManagedDialogTitle')]]"
diff --git a/chrome/browser/resources/settings/languages_page/languages_page.ts b/chrome/browser/resources/settings/languages_page/languages_page.ts index 3f60cb8..03f38bf 100644 --- a/chrome/browser/resources/settings/languages_page/languages_page.ts +++ b/chrome/browser/resources/settings/languages_page/languages_page.ts
@@ -6,42 +6,41 @@ * @fileoverview 'settings-languages-page' is the settings page * for language and input method settings. */ - import 'chrome://resources/cr_components/managed_dialog/managed_dialog.js'; - import 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.js'; - 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_icon_button/cr_icon_button.m.js'; - import 'chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render.js'; - import 'chrome://resources/cr_elements/icons.m.js'; - import 'chrome://resources/cr_elements/policy/cr_policy_pref_indicator.m.js'; - import 'chrome://resources/cr_elements/shared_style_css.m.js'; - import 'chrome://resources/cr_elements/shared_vars_css.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/iron-flex-layout/iron-flex-layout-classes.js'; - import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; - import './add_languages_dialog.js'; - import './languages.js'; - import '../controls/settings_toggle_button.js'; - import '../icons.html.js'; - import '../relaunch_confirmation_dialog.js'; - import '../settings_shared.css.js'; - import '../settings_vars.css.js'; +// clang-format off - import {CrActionMenuElement} from '//resources/cr_elements/cr_action_menu/cr_action_menu.js'; - import {CrCheckboxElement} from 'chrome://resources/cr_elements/cr_checkbox/cr_checkbox.m.js'; - import {CrLazyRenderElement} from 'chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render.js'; - import {assert} from 'chrome://resources/js/assert_ts.js'; - import {isWindows} from 'chrome://resources/js/cr.m.js'; - import {focusWithoutInk} from 'chrome://resources/js/cr/ui/focus_without_ink.m.js'; - import {I18nMixin, I18nMixinInterface} from 'chrome://resources/js/i18n_mixin.js'; - import {DomRepeatEvent, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - // <if expr="is_win"> - import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - // </if> +import 'chrome://resources/cr_components/managed_dialog/managed_dialog.js'; +import 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.js'; +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_icon_button/cr_icon_button.m.js'; +import 'chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render.js'; +import 'chrome://resources/cr_elements/icons.m.js'; +import 'chrome://resources/cr_elements/shared_style_css.m.js'; +import 'chrome://resources/cr_elements/shared_vars_css.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/iron-flex-layout/iron-flex-layout-classes.js'; +import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; +import './add_languages_dialog.js'; +import '../controls/settings_toggle_button.js'; +import '../icons.html.js'; +import '../relaunch_confirmation_dialog.js'; +import '../settings_shared.css.js'; +import '../settings_vars.css.js'; + +import {CrActionMenuElement} from '//resources/cr_elements/cr_action_menu/cr_action_menu.js'; +import {CrCheckboxElement} from 'chrome://resources/cr_elements/cr_checkbox/cr_checkbox.m.js'; +import {CrLazyRenderElement} from 'chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render.js'; +import {assert} from 'chrome://resources/js/assert_ts.js'; +import {isWindows} from 'chrome://resources/js/cr.m.js'; +import {focusWithoutInk} from 'chrome://resources/js/cr/ui/focus_without_ink.m.js'; +import {I18nMixin, I18nMixinInterface} from 'chrome://resources/js/i18n_mixin.js'; +import {DomRepeatEvent, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +// <if expr="is_win"> +import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +// </if> import {SettingsToggleButtonElement} from '../controls/settings_toggle_button.js'; -import {FocusConfig} from '../focus_config.js'; import {loadTimeData} from '../i18n_setup.js'; import {PrefsMixin, PrefsMixinInterface} from '../prefs/prefs_mixin.js'; import {RelaunchMixin, RelaunchMixinInterface, RestartType} from '../relaunch_mixin.js'; @@ -52,6 +51,8 @@ import {LanguageSettingsActionType, LanguageSettingsMetricsProxy, LanguageSettingsMetricsProxyImpl, LanguageSettingsPageImpressionType} from './languages_settings_metrics_proxy.js'; import {LanguageHelper, LanguagesModel, LanguageState} from './languages_types.js'; +// clang-format on + /** * Millisecond delay that can be used when closing an action menu to keep it * briefly on-screen. @@ -103,46 +104,34 @@ /** * The language to display the details for. */ - detailLanguage_: Object, + detailLanguage_: Object, - showAddLanguagesDialog_: Boolean, - showAddAlwaysTranslateDialog_: Boolean, - showAddNeverTranslateDialog_: Boolean, - addLanguagesDialogLanguages_: Array, + showAddLanguagesDialog_: Boolean, + addLanguagesDialogLanguages_: Array, - focusConfig_: { - type: Object, - value: function() { - return new Map(); - }, - }, + showManagedLanguageDialog_: { + type: Boolean, + value: false, + }, - showManagedLanguageDialog_: { - type: Boolean, - value: false, - }, - - enableDesktopDetailedLanguageSettings_: { - type: Boolean, - value: function() { - return loadTimeData.getBoolean( + enableDesktopDetailedLanguageSettings_: { + type: Boolean, + value: function() { + return loadTimeData.getBoolean( 'enableDesktopDetailedLanguageSettings'); - }, - }, + }, + }, }; } languages?: LanguagesModel; languageHelper: LanguageHelper; + private enableDesktopDetailedLanguageSettings_: boolean; private detailLanguage_?: LanguageState; private showAddLanguagesDialog_: boolean; - private showAddAlwaysTranslateDialog_: boolean; - private showAddNeverTranslateDialog_: boolean; private addLanguagesDialogLanguages_: chrome.languageSettingsPrivate.Language[]|null; - private focusConfig_: FocusConfig; private showManagedLanguageDialog_: boolean; - private enableDesktopDetailedLanguageSettings_: boolean; private languageSettingsMetricsProxy_: LanguageSettingsMetricsProxy = LanguageSettingsMetricsProxyImpl.getInstance(); @@ -183,48 +172,6 @@ } /** - * Stamps and opens the Add Languages dialog, registering a listener to - * disable the dialog's dom-if again on close. - */ - private onAddAlwaysTranslateLanguagesClick_(e: Event) { - e.preventDefault(); - - const translatableLanguages = this.getTranslatableLanguages_(); - this.addLanguagesDialogLanguages_ = translatableLanguages.filter( - language => !this.languages!.alwaysTranslate.includes(language)); - this.showAddAlwaysTranslateDialog_ = true; - } - - private onAlwaysTranslateDialogClose_() { - this.showAddAlwaysTranslateDialog_ = false; - this.addLanguagesDialogLanguages_ = null; - const toFocus = this.shadowRoot!.querySelector('#addAlwaysTranslate'); - assert(toFocus); - focusWithoutInk(toFocus); - } - - - /** - * Helper function fired by the add dialog's on-languages-added event. Adds - * selected languages to the always-translate languages list. - */ - private onAlwaysTranslateLanguagesAdded_(e: CustomEvent<string[]>) { - const languagesToAdd = e.detail; - languagesToAdd.forEach(languageCode => { - this.languageHelper.setLanguageAlwaysTranslateState(languageCode, true); - }); - } - - /** - * Removes a language from the always translate languages list. - */ - private onRemoveAlwaysTranslateLanguageClick_( - e: DomRepeatEvent<chrome.languageSettingsPrivate.Language>) { - const languageCode = e.model.item.code; - this.languageHelper.setLanguageAlwaysTranslateState(languageCode, false); - } - - /** * Checks if there are supported languages that are not enabled but can be * enabled. * @return True if there is at least one available language. @@ -236,42 +183,6 @@ } /** - * Stamps and opens the Add Languages dialog, registering a listener to - * disable the dialog's dom-if again on close. - */ - private onAddNeverTranslateLanguagesClick_(e: Event) { - e.preventDefault(); - - this.addLanguagesDialogLanguages_ = this.languages!.supported.filter( - language => !this.languages!.neverTranslate.includes(language)); - this.showAddNeverTranslateDialog_ = true; - } - - private onNeverTranslateDialogClose_() { - this.showAddNeverTranslateDialog_ = false; - this.addLanguagesDialogLanguages_ = null; - const toFocus = this.shadowRoot!.querySelector('#addNeverTranslate'); - assert(toFocus); - focusWithoutInk(toFocus); - } - - private onNeverTranslateLanguagesAdded_(e: CustomEvent<string[]>) { - const languagesToAdd = e.detail; - languagesToAdd.forEach(languageCode => { - this.languageHelper.disableTranslateLanguage(languageCode); - }); - } - - /** - * Removes a language from the never translate languages list. - */ - private onRemoveNeverTranslateLanguageClick_( - e: DomRepeatEvent<chrome.languageSettingsPrivate.Language>) { - const languageCode = e.model.item.code; - this.languageHelper.enableTranslateLanguage(languageCode); - } - - /** * Used to determine whether to show the separator between checkbox settings * and move buttons in the dialog menu. * @return True if there is currently more than one selected language. @@ -484,7 +395,8 @@ * the spacing of items and show a separator in the menu. */ private getMenuClass_(translateEnabled: boolean): string { - if (translateEnabled || isWindows) { + if (isWindows || + (translateEnabled && !this.enableDesktopDetailedLanguageSettings_)) { return 'complex'; } return ''; @@ -599,23 +511,6 @@ this.showManagedLanguageDialog_ = false; } - /** - * @return Whether the list is non-null and has items. - */ - private hasSome_(list: any[]): boolean { - return !!(list && list.length); - } - - /** - * Gets the list of languages that chrome can translate - */ - private getTranslatableLanguages_(): - chrome.languageSettingsPrivate.Language[] { - return this.languages!.supported.filter(language => { - return this.languageHelper.isLanguageTranslatable(language); - }); - } - override currentRouteChanged(currentRoute: Route) { if (currentRoute === routes.LANGUAGES) { this.languageSettingsMetricsProxy_.recordPageImpressionMetric(
diff --git a/chrome/browser/resources/settings/languages_page/languages_settings_metrics_proxy.ts b/chrome/browser/resources/settings/languages_page/languages_settings_metrics_proxy.ts index c97be945..f7b0281 100644 --- a/chrome/browser/resources/settings/languages_page/languages_settings_metrics_proxy.ts +++ b/chrome/browser/resources/settings/languages_page/languages_settings_metrics_proxy.ts
@@ -23,13 +23,6 @@ ENABLE_TRANSLATE_FOR_SINGLE_LANGUAGE = 7, LANGUAGE_LIST_REORDERED = 8, CHANGE_CHROME_LANGUAGE = 9, - // 10-16 are Android only - ENABLE_SPELL_CHECK_GLOBALLY = 17, - DISABLE_SPELL_CHECK_GLOBALLY = 18, - ENABLE_SPELL_CHECK_FOR_LANGUAGE = 19, - DISABLE_SPELL_CHECK_FOR_LANGUAGE = 20, - SELECT_BASIC_SPELL_CHECK = 21, - SELECT_ENHANCED_SPELL_CHECK = 22, } /**
diff --git a/chrome/browser/resources/settings/languages_page/spell_check_page.html b/chrome/browser/resources/settings/languages_page/spell_check_page.html index 8099d8d..95115f35 100644 --- a/chrome/browser/resources/settings/languages_page/spell_check_page.html +++ b/chrome/browser/resources/settings/languages_page/spell_check_page.html
@@ -61,8 +61,7 @@ label="$i18n{offerToEnableSpellCheck}" sub-label="[[getSpellCheckSubLabel_(spellCheckLanguages_)]]" pref="{{prefs.browser.enable_spellchecking}}" - disabled="[[!spellCheckLanguages_.length]]" - on-settings-boolean-control-change="onSpellCheckToggleChange_"> + disabled="[[!spellCheckLanguages_.length]]"> </settings-toggle-button> <if expr="_google_chrome or not is_macosx"> <iron-collapse id="spellCheckCollapse" @@ -70,8 +69,7 @@ <if expr="_google_chrome"> <div class="cr-row continuation spell-check-radio-group"> <settings-radio-group class="flex" - pref="{{prefs.spellcheck.use_spelling_service}}" - on-change="onSelectedSpellingServiceChange_"> + pref="{{prefs.spellcheck.use_spelling_service}}"> <controlled-radio-button class="spell-check-radio-button" id="spellingServiceDisable" label="$i18n{spellCheckBasicLabel}" name="false"
diff --git a/chrome/browser/resources/settings/languages_page/spell_check_page.ts b/chrome/browser/resources/settings/languages_page/spell_check_page.ts index 91c72817b..e998c4d 100644 --- a/chrome/browser/resources/settings/languages_page/spell_check_page.ts +++ b/chrome/browser/resources/settings/languages_page/spell_check_page.ts
@@ -32,8 +32,6 @@ // <if expr="not is_macosx"> import './edit_dictionary_page.js'; // </if> - -import {SettingsToggleButtonElement} from '../controls/settings_toggle_button.js'; import {assert} from 'chrome://resources/js/assert_ts.js'; import {focusWithoutInk} from 'chrome://resources/js/cr/ui/focus_without_ink.m.js'; import {I18nMixin} from 'chrome://resources/js/i18n_mixin.js'; @@ -45,7 +43,6 @@ import {routes} from '../route.js'; import {Router} from '../router.js'; -import {LanguageSettingsActionType, LanguageSettingsMetricsProxy, LanguageSettingsMetricsProxyImpl} from './languages_settings_metrics_proxy.js'; import {LanguageHelper, LanguagesModel, LanguageState, SpellCheckLanguageState} from './languages_types.js'; import {getTemplate} from './spell_check_page.html.js'; @@ -127,22 +124,6 @@ private spellCheckLanguages_: Array<LanguageState|SpellCheckLanguageState>; private hideSpellCheckLanguages_: boolean; private focusConfig_: FocusConfig; - private languageSettingsMetricsProxy_: LanguageSettingsMetricsProxy = - LanguageSettingsMetricsProxyImpl.getInstance(); - - private onSpellCheckToggleChange_(e: Event) { - this.languageSettingsMetricsProxy_.recordSettingsMetric( - (e.target as SettingsToggleButtonElement).checked ? - LanguageSettingsActionType.ENABLE_SPELL_CHECK_GLOBALLY : - LanguageSettingsActionType.DISABLE_SPELL_CHECK_GLOBALLY); - } - - private onSelectedSpellingServiceChange_() { - this.languageSettingsMetricsProxy_.recordSettingsMetric( - this.prefs.spellcheck.use_spelling_service ? - LanguageSettingsActionType.SELECT_ENHANCED_SPELL_CHECK : - LanguageSettingsActionType.SELECT_BASIC_SPELL_CHECK); - } // <if expr="not is_macosx"> /** @@ -267,11 +248,6 @@ this.languageHelper.toggleSpellCheck( item.language.code, !item.spellCheckEnabled); - - this.languageSettingsMetricsProxy_.recordSettingsMetric( - item.spellCheckEnabled ? - LanguageSettingsActionType.ENABLE_SPELL_CHECK_FOR_LANGUAGE : - LanguageSettingsActionType.DISABLE_SPELL_CHECK_FOR_LANGUAGE); } /**
diff --git a/chrome/browser/resources/settings/languages_page/translate_page.html b/chrome/browser/resources/settings/languages_page/translate_page.html new file mode 100644 index 0000000..ee62e04 --- /dev/null +++ b/chrome/browser/resources/settings/languages_page/translate_page.html
@@ -0,0 +1,63 @@ +<style include="cr-shared-style settings-shared iron-flex"></style> +<settings-toggle-button id="offerTranslateOtherLanguages" + pref="{{prefs.translate.enabled}}" label="$i18n{offerToEnableTranslate}" + on-settings-boolean-control-change="onTranslateToggleChange_"> +</settings-toggle-button> +<div class="cr-row continuation"> + <h2 class="flex">$i18n{automaticallyTranslateLanguages}</h2> + <cr-button id="addAlwaysTranslate" class="header-aligned-button" + on-click="onAddAlwaysTranslateLanguagesClick_"> + $i18n{add} + </cr-button> +</div> +<div class="list-frame"> + <div id="alwaysTranslateList" class="vertical-list"> + <template is="dom-repeat" items="[[languages.alwaysTranslate]]"> + <div class="list-item"> + <div class="start cr-padded-text">[[item.displayName]]</div> + <cr-icon-button class="icon-clear" + on-click="onRemoveAlwaysTranslateLanguageClick_"> + </cr-icon-button> + </div> + </template> + </div> + <div id="noAlwaysTranslateLabel" class="list-item" + hidden$="[[hasSome_(languages.alwaysTranslate)]]"> + $i18n{noLanguagesAdded} + </div> +</div> +<div class="cr-row continuation"> + <h2 class="flex">$i18n{neverTranslateLanguages}</h2> + <cr-button id="addNeverTranslate" class="header-aligned-button" + on-click="onAddNeverTranslateLanguagesClick_"> + $i18n{add} + </cr-button> +</div> +<div class="list-frame"> + <div id="neverTranslateList" class="vertical-list"> + <template is="dom-repeat" items="[[languages.neverTranslate]]"> + <div class="list-item"> + <div class="start cr-padded-text">[[item.displayName]]</div> + <cr-icon-button class="icon-clear" value="[[item.code]]" + on-click="onRemoveNeverTranslateLanguageClick_"> + </cr-icon-button> + </div> + </template> + </div> + <div id="noNeverTranslateLabel" class="list-item" + hidden$="[[hasSome_(languages.neverTranslate)]]"> + $i18n{noLanguagesAdded} + </div> +</div> +<template is="dom-if" if="[[showAddAlwaysTranslateDialog_]]" restamp> + <settings-add-languages-dialog languages="[[addLanguagesDialogLanguages_]]" + id="alwaysTranslateDialog" on-close="onAlwaysTranslateDialogClose_" + on-languages-added="onAlwaysTranslateLanguagesAdded_"> + </settings-add-languages-dialog> +</template> +<template is="dom-if" if="[[showAddNeverTranslateDialog_]]" restamp> + <settings-add-languages-dialog languages="[[addLanguagesDialogLanguages_]]" + id="neverTranslateDialog" on-close="onNeverTranslateDialogClose_" + on-languages-added="onNeverTranslateLanguagesAdded_"> + </settings-add-languages-dialog> +</template>
diff --git a/chrome/browser/resources/settings/languages_page/translate_page.ts b/chrome/browser/resources/settings/languages_page/translate_page.ts new file mode 100644 index 0000000..424fba0f --- /dev/null +++ b/chrome/browser/resources/settings/languages_page/translate_page.ts
@@ -0,0 +1,187 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview 'settings-translate-page' is the settings page + * translate settings. + */ + +import 'chrome://resources/cr_elements/cr_button/cr_button.m.js'; +import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js'; +import 'chrome://resources/cr_elements/icons.m.js'; +import 'chrome://resources/cr_elements/shared_style_css.m.js'; +import 'chrome://resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js'; +import './add_languages_dialog.js'; +import './languages.js'; +import '../controls/settings_toggle_button.js'; +import '../icons.html.js'; +import '../settings_shared.css.js'; + +import {assert} from 'chrome://resources/js/assert_ts.js'; +import {focusWithoutInk} from 'chrome://resources/js/cr/ui/focus_without_ink.m.js'; +import {DomRepeatEvent, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {SettingsToggleButtonElement} from '../controls/settings_toggle_button.js'; +import {PrefsMixin} from '../prefs/prefs_mixin.js'; + +import {LanguageSettingsActionType, LanguageSettingsMetricsProxy, LanguageSettingsMetricsProxyImpl} from './languages_settings_metrics_proxy.js'; +import {LanguageHelper, LanguagesModel} from './languages_types.js'; +import {getTemplate} from './translate_page.html.js'; + +const SettingsTranslatePageElementBase = PrefsMixin(PolymerElement); + +export class SettingsTranslatePageElement extends + SettingsTranslatePageElementBase { + static get is() { + return 'settings-translate-page'; + } + + static get template() { + return getTemplate(); + } + + static get properties() { + return { + /** + * Preferences state. + */ + prefs: { + type: Object, + notify: true, + }, + + /** + * Read-only reference to the languages model provided by the + * 'settings-languages' instance. + */ + languages: { + type: Object, + notify: true, + }, + + languageHelper: Object, + + showAddAlwaysTranslateDialog_: Boolean, + showAddNeverTranslateDialog_: Boolean, + addLanguagesDialogLanguages_: Array, + }; + } + + languages?: LanguagesModel; + languageHelper: LanguageHelper; + private showAddAlwaysTranslateDialog_: boolean; + private showAddNeverTranslateDialog_: boolean; + private addLanguagesDialogLanguages_: + chrome.languageSettingsPrivate.Language[]|null; + private languageSettingsMetricsProxy_: LanguageSettingsMetricsProxy = + LanguageSettingsMetricsProxyImpl.getInstance(); + + /** + * Stamps and opens the Add Languages dialog, registering a listener to + * disable the dialog's dom-if again on close. + */ + private onAddAlwaysTranslateLanguagesClick_(e: Event) { + e.preventDefault(); + const translatableLanguages = this.getTranslatableLanguages_(); + this.addLanguagesDialogLanguages_ = translatableLanguages.filter( + language => !this.languages!.alwaysTranslate.includes(language)); + this.showAddAlwaysTranslateDialog_ = true; + } + + private onAlwaysTranslateDialogClose_() { + this.showAddAlwaysTranslateDialog_ = false; + this.addLanguagesDialogLanguages_ = null; + const toFocus = this.shadowRoot!.querySelector('#addAlwaysTranslate'); + assert(toFocus); + focusWithoutInk(toFocus); + } + + /** + * Helper function fired by the add dialog's on-languages-added event. Adds + * selected languages to the always-translate languages list. + */ + private onAlwaysTranslateLanguagesAdded_(e: CustomEvent<string[]>) { + const languagesToAdd = e.detail; + languagesToAdd.forEach(languageCode => { + this.languageHelper.setLanguageAlwaysTranslateState(languageCode, true); + }); + } + + /** + * Removes a language from the always translate languages list. + */ + private onRemoveAlwaysTranslateLanguageClick_( + e: DomRepeatEvent<chrome.languageSettingsPrivate.Language>) { + const languageCode = e.model.item.code; + this.languageHelper.setLanguageAlwaysTranslateState(languageCode, false); + } + + /** + * Stamps and opens the Add Languages dialog, registering a listener to + * disable the dialog's dom-if again on close. + */ + private onAddNeverTranslateLanguagesClick_(e: Event) { + e.preventDefault(); + this.addLanguagesDialogLanguages_ = this.languages!.supported.filter( + language => !this.languages!.neverTranslate.includes(language)); + this.showAddNeverTranslateDialog_ = true; + } + + private onNeverTranslateDialogClose_() { + this.showAddNeverTranslateDialog_ = false; + this.addLanguagesDialogLanguages_ = null; + const toFocus = this.shadowRoot!.querySelector('#addNeverTranslate'); + assert(toFocus); + focusWithoutInk(toFocus); + } + + private onNeverTranslateLanguagesAdded_(e: CustomEvent<string[]>) { + const languagesToAdd = e.detail; + languagesToAdd.forEach(languageCode => { + this.languageHelper.disableTranslateLanguage(languageCode); + }); + } + + /** + * Removes a language from the never translate languages list. + */ + private onRemoveNeverTranslateLanguageClick_( + e: DomRepeatEvent<chrome.languageSettingsPrivate.Language>) { + const languageCode = e.model.item.code; + this.languageHelper.enableTranslateLanguage(languageCode); + } + + private onTranslateToggleChange_(e: Event) { + this.languageSettingsMetricsProxy_.recordSettingsMetric( + (e.target as SettingsToggleButtonElement).checked ? + LanguageSettingsActionType.ENABLE_TRANSLATE_GLOBALLY : + LanguageSettingsActionType.DISABLE_TRANSLATE_GLOBALLY); + } + + /** + * @return Whether the list is non-null and has items. + */ + private hasSome_(list: any[]): boolean { + return !!(list && list.length); + } + + /** + * Gets the list of languages that chrome can translate + */ + private getTranslatableLanguages_(): + chrome.languageSettingsPrivate.Language[] { + return this.languages!.supported.filter(language => { + return this.languageHelper.isLanguageTranslatable(language); + }); + } +} + +declare global { + interface HTMLElementTagNameMap { + 'settings-translate-page': SettingsTranslatePageElement; + } +} + +customElements.define( + SettingsTranslatePageElement.is, SettingsTranslatePageElement);
diff --git a/chrome/browser/resources/settings/lazy_load.ts b/chrome/browser/resources/settings/lazy_load.ts index 9a63f47..230fb04 100644 --- a/chrome/browser/resources/settings/lazy_load.ts +++ b/chrome/browser/resources/settings/lazy_load.ts
@@ -57,6 +57,7 @@ // <if expr="not chromeos_ash"> import './languages_page/languages_page.js'; import './languages_page/spell_check_page.js'; +import './languages_page/translate_page.js'; // </if> import './reset_page/reset_page.js'; // <if expr="not chromeos_ash"> @@ -138,6 +139,7 @@ export {LanguageSettingsActionType, LanguageSettingsMetricsProxy, LanguageSettingsMetricsProxyImpl, LanguageSettingsPageImpressionType} from './languages_page/languages_settings_metrics_proxy.js'; export {LanguageHelper, LanguagesModel} from './languages_page/languages_types.js'; export {SettingsSpellCheckPageElement} from './languages_page/spell_check_page.js'; +export {SettingsTranslatePageElement} from './languages_page/translate_page.js'; // </if> // <if expr="not chromeos_ash and not chromeos_lacros"> export {BrowserProfile, ImportDataBrowserProxy, ImportDataBrowserProxyImpl, ImportDataStatus} from './people_page/import_data_browser_proxy.js';
diff --git a/chrome/browser/resources/signin/profile_customization/profile_customization_app.ts b/chrome/browser/resources/signin/profile_customization/profile_customization_app.ts index 5dd83f5..73822b55 100644 --- a/chrome/browser/resources/signin/profile_customization/profile_customization_app.ts +++ b/chrome/browser/resources/signin/profile_customization/profile_customization_app.ts
@@ -69,6 +69,11 @@ value: () => loadTimeData.getBoolean('profileCustomizationInDialogDesign'), }, + + isLocalProfileCreation_: { + type: Boolean, + value: () => loadTimeData.getBoolean('isLocalProfileCreation'), + }, }; } @@ -77,6 +82,7 @@ private pictureUrl_: string; private welcomeTitle_: string; private profileCustomizationInDialogDesign_: boolean; + private isLocalProfileCreation_: boolean; private profileCustomizationBrowserProxy_: ProfileCustomizationBrowserProxy = ProfileCustomizationBrowserProxyImpl.getInstance();
diff --git a/chrome/browser/resources/webapks/OWNERS b/chrome/browser/resources/webapks/OWNERS new file mode 100644 index 0000000..3fa3f22 --- /dev/null +++ b/chrome/browser/resources/webapks/OWNERS
@@ -0,0 +1 @@ +file://components/webapk/OWNERS
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.cc b/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.cc index 2513bbe..812cde7b 100644 --- a/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.cc +++ b/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.cc
@@ -113,10 +113,6 @@ content_analysis_request_.set_device_token(token); } -void BinaryUploadService::Request::set_request_token(const std::string& token) { - content_analysis_request_.set_request_token(token); -} - void BinaryUploadService::Request::set_filename(const std::string& filename) { content_analysis_request_.mutable_request_data()->set_filename(filename); } @@ -164,10 +160,12 @@ } std::string BinaryUploadService::Request::SetRandomRequestToken() { + DCHECK(request_token().empty()); + std::string token = base::RandBytesAsString(128); - token = base::HexEncode(token.data(), token.size()); - set_request_token(token); - return token; + content_analysis_request_.set_request_token( + base::HexEncode(token.data(), token.size())); + return content_analysis_request_.request_token(); } enterprise_connectors::AnalysisConnector @@ -263,6 +261,21 @@ access_token_ = access_token; } +BinaryUploadService::Ack::Ack( + enterprise_connectors::CloudOrLocalAnalysisSettings settings) + : cloud_or_local_settings_(std::move(settings)) {} + +BinaryUploadService::Ack::~Ack() = default; + +void BinaryUploadService::Ack::set_request_token(const std::string& token) { + ack_.set_request_token(token); +} + +void BinaryUploadService::Ack::set_status( + enterprise_connectors::ContentAnalysisAcknowledgement::Status status) { + ack_.set_status(status); +} + // static BinaryUploadService* BinaryUploadService::GetForProfile( Profile* profile,
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h b/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h index ccdb6ec..e4eca5f 100644 --- a/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h +++ b/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h
@@ -145,7 +145,6 @@ void set_csd(ClientDownloadRequest csd); void add_tag(const std::string& tag); void set_email(const std::string& email); - void set_request_token(const std::string& token); void set_fcm_token(const std::string& token); void set_device_token(const std::string& token); void set_filename(const std::string& filename); @@ -199,6 +198,40 @@ std::string access_token_; }; + // A class to encapsulate the a request acknowledgement. This class will + // provide all the functionality needed to generate a + // ContentAnalysisAcknowledgement. + class Ack { + public: + explicit Ack(enterprise_connectors::CloudOrLocalAnalysisSettings settings); + virtual ~Ack(); + Ack(const Ack&) = delete; + Ack& operator=(const Ack&) = delete; + Ack(Ack&&) = delete; + Ack& operator=(Ack&&) = delete; + + void set_request_token(const std::string& token); + void set_status( + enterprise_connectors::ContentAnalysisAcknowledgement::Status status); + + const enterprise_connectors::CloudOrLocalAnalysisSettings& + cloud_or_local_settings() const { + return cloud_or_local_settings_; + } + + const enterprise_connectors::ContentAnalysisAcknowledgement& ack() const { + return ack_; + } + + private: + enterprise_connectors::ContentAnalysisAcknowledgement ack_; + + // Settings used to determine how the request is used in the cloud or + // locally. + enterprise_connectors::CloudOrLocalAnalysisSettings + cloud_or_local_settings_; + }; + static BinaryUploadService* GetForProfile( Profile* profile, const enterprise_connectors::AnalysisSettings& settings); @@ -206,6 +239,9 @@ // Upload the given file contents for deep scanning if the browser is // authorized to upload data, otherwise queue the request. virtual void MaybeUploadForDeepScanning(std::unique_ptr<Request> request) = 0; + + // Send an acknowledgement for the request with the given token. + virtual void MaybeAcknowledge(std::unique_ptr<Ack> ack) = 0; }; } // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.cc b/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.cc index 54e82a3..d60480c5 100644 --- a/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.cc +++ b/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.cc
@@ -216,6 +216,10 @@ std::move(request), can_upload_enterprise_data_[token_and_connector]); } +void CloudBinaryUploadService::MaybeAcknowledge(std::unique_ptr<Ack> ack) { + // Nothing to do for cloud upload service. +} + void CloudBinaryUploadService::MaybeUploadForDeepScanningCallback( std::unique_ptr<CloudBinaryUploadService::Request> request, bool authorized) {
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.h b/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.h index b785781..10da500 100644 --- a/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.h +++ b/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.h
@@ -37,6 +37,7 @@ // Upload the given file contents for deep scanning if the browser is // authorized to upload data, otherwise queue the request. void MaybeUploadForDeepScanning(std::unique_ptr<Request> request) override; + void MaybeAcknowledge(std::unique_ptr<Ack> ack) override; // Indicates whether the DM token/Connector combination is allowed to upload // data.
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/test_binary_upload_service.h b/chrome/browser/safe_browsing/cloud_content_scanning/test_binary_upload_service.h index b8bd308c..9adc372 100644 --- a/chrome/browser/safe_browsing/cloud_content_scanning/test_binary_upload_service.h +++ b/chrome/browser/safe_browsing/cloud_content_scanning/test_binary_upload_service.h
@@ -19,6 +19,7 @@ ~TestBinaryUploadService() override = default; void MaybeUploadForDeepScanning(std::unique_ptr<Request> request) override; + void MaybeAcknowledge(std::unique_ptr<Ack> ack) override {} void SetResponse(Result result, enterprise_connectors::ContentAnalysisResponse response);
diff --git a/chrome/browser/safe_browsing/download_protection/deep_scanning_request.cc b/chrome/browser/safe_browsing/download_protection/deep_scanning_request.cc index 8bea2b78..fc970146 100644 --- a/chrome/browser/safe_browsing/download_protection/deep_scanning_request.cc +++ b/chrome/browser/safe_browsing/download_protection/deep_scanning_request.cc
@@ -539,6 +539,7 @@ /*response=*/response); DownloadCheckResult download_result = DownloadCheckResult::UNKNOWN; if (result == BinaryUploadService::Result::SUCCESS) { + request_tokens_.push_back(response.request_token()); ResponseToDownloadCheckResult(response, &download_result); base::UmaHistogramEnumeration( "SBClientDownload.MalwareDeepScanResult." + GetTriggerName(trigger_), @@ -670,6 +671,8 @@ for (auto& observer : observers_) observer.OnFinish(this); + AcknowledgeRequest(); + if (!callback_.is_null()) callback_.Run(result); weak_ptr_factory_.InvalidateWeakPtrs(); @@ -713,4 +716,25 @@ enterprise_connectors::BlockUntilVerdict::kNoBlock; } +void DeepScanningRequest::AcknowledgeRequest() { + Profile* profile = Profile::FromBrowserContext( + content::DownloadItemUtils::GetBrowserContext(item_)); + BinaryUploadService* binary_upload_service = + download_service_->GetBinaryUploadService(profile, analysis_settings_); + if (!binary_upload_service) + return; + + // Calculate overall status for all requests. + // TODO(b/240629222): Calculate status based on final result. + auto status = enterprise_connectors::ContentAnalysisAcknowledgement::SUCCESS; + + for (auto& token : request_tokens_) { + auto ack = std::make_unique<BinaryUploadService::Ack>( + analysis_settings_.cloud_or_local_settings); + ack->set_request_token(token); + ack->set_status(status); + binary_upload_service->MaybeAcknowledge(std::move(ack)); + } +} + } // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/download_protection/deep_scanning_request.h b/chrome/browser/safe_browsing/download_protection/deep_scanning_request.h index 4fcfe82..961f070 100644 --- a/chrome/browser/safe_browsing/download_protection/deep_scanning_request.h +++ b/chrome/browser/safe_browsing/download_protection/deep_scanning_request.h
@@ -182,6 +182,9 @@ // conjunction with the corresponding policy value. bool ReportOnlyScan(); + // Acknowledge the request's handling to the service provider. + void AcknowledgeRequest(); + // The download item to scan. This is unowned, and could become nullptr if the // download is destroyed. raw_ptr<download::DownloadItem> item_; @@ -248,6 +251,10 @@ // is known. The callbacks in this list should be called in FinishRequest. base::OnceCallbackList<void(EventResult result)> report_callbacks_; + // The request tokens of all the requests that make up the user action + // represented by this ContentAnalysisDelegate instance. + std::vector<std::string> request_tokens_; + base::WeakPtrFactory<DeepScanningRequest> weak_ptr_factory_; };
diff --git a/chrome/browser/safe_browsing/download_protection/deep_scanning_request_unittest.cc b/chrome/browser/safe_browsing/download_protection/deep_scanning_request_unittest.cc index f161cab5..78b35f2 100644 --- a/chrome/browser/safe_browsing/download_protection/deep_scanning_request_unittest.cc +++ b/chrome/browser/safe_browsing/download_protection/deep_scanning_request_unittest.cc
@@ -142,11 +142,19 @@ } } + void MaybeAcknowledge(std::unique_ptr<Ack> ack) override { + ++num_acks_; + ASSERT_NE(requests_tokens_.end(), + std::find(requests_tokens_.begin(), requests_tokens_.end(), + ack->ack().request_token())); + } + void SetResponse(const base::FilePath& path, BinaryUploadService::Result result, enterprise_connectors::ContentAnalysisResponse response) { saved_results_[path.AsUTF8Unsafe()] = result; saved_responses_[path.AsUTF8Unsafe()] = response; + requests_tokens_.push_back(response.request_token()); } const enterprise_connectors::ContentAnalysisRequest& last_request() { @@ -158,11 +166,14 @@ } size_t num_finished_requests() { return num_finished_requests_; } + size_t num_acks() { return num_acks_; } void Reset() { saved_results_.clear(); saved_responses_.clear(); + requests_tokens_.clear(); num_finished_requests_ = 0; + num_acks_ = 0; } private: @@ -171,9 +182,11 @@ base::flat_map<std::string, enterprise_connectors::ContentAnalysisResponse> saved_responses_; enterprise_connectors::ContentAnalysisRequest last_request_; + std::vector<std::string> requests_tokens_; base::RepeatingClosure quit_on_last_request_; size_t num_finished_requests_ = 0; + size_t num_acks_ = 0; }; class FakeDownloadProtectionService : public DownloadProtectionService { @@ -1146,6 +1159,9 @@ EXPECT_EQ(DownloadCheckResult::DEEP_SCANNED_SAFE, last_result_); EXPECT_EQ(4u, download_protection_service_.GetFakeBinaryUploadService() ->num_finished_requests()); + EXPECT_EQ( + 4u, + download_protection_service_.GetFakeBinaryUploadService()->num_acks()); download_protection_service_.GetFakeBinaryUploadService()->Reset(); } @@ -1218,6 +1234,9 @@ EXPECT_EQ(DownloadCheckResult::SAFE, last_result_); EXPECT_EQ(4u, download_protection_service_.GetFakeBinaryUploadService() ->num_finished_requests()); + EXPECT_EQ( + 4u, + download_protection_service_.GetFakeBinaryUploadService()->num_acks()); download_protection_service_.GetFakeBinaryUploadService()->Reset(); } @@ -1318,6 +1337,9 @@ EXPECT_EQ(DownloadCheckResult::SENSITIVE_CONTENT_BLOCK, last_result_); EXPECT_EQ(4u, download_protection_service_.GetFakeBinaryUploadService() ->num_finished_requests()); + EXPECT_EQ( + 4u, + download_protection_service_.GetFakeBinaryUploadService()->num_acks()); download_protection_service_.GetFakeBinaryUploadService()->Reset(); } }
diff --git a/chrome/browser/sync/android/sync_service_android_bridge.cc b/chrome/browser/sync/android/sync_service_android_bridge.cc index dec5af6..106718a 100644 --- a/chrome/browser/sync/android/sync_service_android_bridge.cc +++ b/chrome/browser/sync/android/sync_service_android_bridge.cc
@@ -51,9 +51,9 @@ void NativeGetAllNodesCallback( JNIEnv* env, const base::android::ScopedJavaGlobalRef<jobject>& callback, - std::unique_ptr<base::ListValue> result) { + base::Value::List result) { std::string json_string; - if (!result.get() || !base::JSONWriter::Write(*result, &json_string)) { + if (!base::JSONWriter::Write(result, &json_string)) { DVLOG(1) << "Writing as JSON failed. Passing empty string to Java code."; json_string = std::string(); }
diff --git a/chrome/browser/sync/test/integration/sync_service_impl_harness.cc b/chrome/browser/sync/test/integration/sync_service_impl_harness.cc index 8c90b66..f8968b05 100644 --- a/chrome/browser/sync/test/integration/sync_service_impl_harness.cc +++ b/chrome/browser/sync/test/integration/sync_service_impl_harness.cc
@@ -592,13 +592,12 @@ std::string SyncServiceImplHarness::GetServiceStatus() { // This method is only used in test code for debugging purposes, so it's fine // to include sensitive data in ConstructAboutInformation(). - std::unique_ptr<base::DictionaryValue> value( - syncer::sync_ui_util::ConstructAboutInformation( - syncer::sync_ui_util::IncludeSensitiveData(true), service(), - chrome::GetChannelName(chrome::WithExtendedStable(true)))); + base::Value::Dict value = syncer::sync_ui_util::ConstructAboutInformation( + syncer::sync_ui_util::IncludeSensitiveData(true), service(), + chrome::GetChannelName(chrome::WithExtendedStable(true))); std::string service_status; base::JSONWriter::WriteWithOptions( - *value, base::JSONWriter::OPTIONS_PRETTY_PRINT, &service_status); + value, base::JSONWriter::OPTIONS_PRETTY_PRINT, &service_status); return service_status; }
diff --git a/chrome/browser/tab/BUILD.gn b/chrome/browser/tab/BUILD.gn index ea7adae..b885d048 100644 --- a/chrome/browser/tab/BUILD.gn +++ b/chrome/browser/tab/BUILD.gn
@@ -53,6 +53,7 @@ "java/src/org/chromium/chrome/browser/tab/state/PersistedTabDataStorageFactory.java", "java/src/org/chromium/chrome/browser/tab/state/PriceDropMetricsLogger.java", "java/src/org/chromium/chrome/browser/tab/state/SerializedCriticalPersistedTabData.java", + "java/src/org/chromium/chrome/browser/tab/state/Serializer.java", "java/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabData.java", "java/src/org/chromium/chrome/browser/tab/state/StorePersistedTabData.java", ]
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabStateAttributes.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabStateAttributes.java index 098c9e7..911659de 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabStateAttributes.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabStateAttributes.java
@@ -6,6 +6,7 @@ import org.chromium.base.UserData; import org.chromium.base.UserDataHost; +import org.chromium.chrome.browser.tab.state.CriticalPersistedTabData; /** * Attributes related to {@link TabState} @@ -14,6 +15,7 @@ private static final Class<TabStateAttributes> USER_DATA_KEY = TabStateAttributes.class; /** Whether or not the TabState has changed. */ private boolean mIsTabStateDirty = true; + private Tab mTab; /** * @return {@link TabStateAttributes} for a {@link Tab} @@ -21,10 +23,12 @@ public static TabStateAttributes from(Tab tab) { UserDataHost host = tab.getUserDataHost(); TabStateAttributes attrs = host.getUserData(USER_DATA_KEY); - return attrs != null ? attrs : host.setUserData(USER_DATA_KEY, new TabStateAttributes()); + return attrs != null ? attrs : host.setUserData(USER_DATA_KEY, new TabStateAttributes(tab)); } - private TabStateAttributes() {} + private TabStateAttributes(Tab tab) { + mTab = tab; + } /** * @return true if the {@link TabState} has been changed @@ -41,5 +45,8 @@ */ public void setIsTabStateDirty(boolean isTabStateDirty) { mIsTabStateDirty = isTabStateDirty; + if (isTabStateDirty && !mTab.isDestroyed()) { + CriticalPersistedTabData.from(mTab).setShouldSave(); + } } }
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CouponPersistedTabData.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CouponPersistedTabData.java index 7c28485..c97e2f5 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CouponPersistedTabData.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CouponPersistedTabData.java
@@ -16,7 +16,6 @@ import org.chromium.base.Callback; import org.chromium.base.Log; import org.chromium.base.supplier.ObservableSupplierImpl; -import org.chromium.base.supplier.Supplier; import org.chromium.base.task.PostTask; import org.chromium.chrome.browser.commerce.PriceUtils; import org.chromium.chrome.browser.endpoint_fetcher.EndpointFetcher; @@ -230,7 +229,7 @@ } @Override - Supplier<ByteBuffer> getSerializeSupplier() { + Serializer<ByteBuffer> getSerializer() { CouponPersistedTabDataProto.Builder builder = CouponPersistedTabDataProto.newBuilder(); if (mCoupon != null) { if (mCoupon.promoCode != null) {
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java index d15cb5d98..d54c624c 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java
@@ -19,7 +19,6 @@ import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.DoNotClassMerge; import org.chromium.base.metrics.RecordHistogram; -import org.chromium.base.supplier.Supplier; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabLaunchType; import org.chromium.chrome.browser.tab.TabStateAttributes; @@ -127,6 +126,7 @@ private boolean mShouldSaveForTesting; /** Tab level Request Desktop Site setting. */ private @TabUserAgent int mUserAgent; + private boolean mShouldSave; @VisibleForTesting public CriticalPersistedTabData(Tab tab) { @@ -183,6 +183,12 @@ deserializeAndLog(data); } + @VisibleForTesting + protected CriticalPersistedTabData( + Tab tab, PersistedTabDataStorage storage, String persistedTabDataId) { + super(tab, storage, persistedTabDataId); + } + @VisibleForTesting(otherwise = VisibleForTesting.PROTECTED) public CriticalPersistedTabData(Tab tab, SerializedCriticalPersistedTabData serialized) { this(tab, serialized.getUrl(), serialized.getTitle(), serialized.getParentId(), @@ -482,59 +488,77 @@ // TODO(crbug.com/1220678) Change PersistedTabData saves to use ByteBuffer instead of byte[] @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE) @Override - public Supplier<ByteBuffer> getSerializeSupplier() { - final WebContentsState webContentsState; - final ByteBuffer byteBuffer; - final String openerAppId; - final int parentId; - final int rootId; - final long timestampMillis; - final int webContentsStateVersion; - final int themeColor; - final int launchType; - final int userAgentType; - try (TraceEvent e = TraceEvent.scoped("CriticalPersistedTabData.PreSerialize")) { - webContentsState = mWebContentsState == null ? getWebContentsStateFromTab(mTab) - : mWebContentsState; - byteBuffer = webContentsState == null ? null : webContentsState.buffer(); - openerAppId = mOpenerAppId; - parentId = mParentId; - rootId = mRootId; - timestampMillis = mTimestampMillis; - webContentsStateVersion = mContentStateVersion; - themeColor = mThemeColor; - launchType = getLaunchType(mTabLaunchTypeAtCreation); - userAgentType = getUserAgentType(mUserAgent); - } - return () -> { - try (TraceEvent e = TraceEvent.scoped("CriticalPersistedTabData.Serialize")) { - ByteBuffer readOnlyByteBuffer = - byteBuffer == null ? null : byteBuffer.asReadOnlyBuffer(); - if (readOnlyByteBuffer != null) { - readOnlyByteBuffer.rewind(); - } - FlatBufferBuilder fbb = new FlatBufferBuilder(); - int wcs = CriticalPersistedTabDataFlatBuffer.createWebContentsStateBytesVector(fbb, - readOnlyByteBuffer == null ? ByteBuffer.allocate(0).put(new byte[] {}) - : readOnlyByteBuffer); - int oaid = - fbb.createString(mOpenerAppId == null ? NULL_OPENER_APP_ID : mOpenerAppId); - CriticalPersistedTabDataFlatBuffer.startCriticalPersistedTabDataFlatBuffer(fbb); - CriticalPersistedTabDataFlatBuffer.addParentId(fbb, parentId); - CriticalPersistedTabDataFlatBuffer.addRootId(fbb, rootId); - CriticalPersistedTabDataFlatBuffer.addTimestampMillis(fbb, timestampMillis); - CriticalPersistedTabDataFlatBuffer.addWebContentsStateBytes(fbb, wcs); - CriticalPersistedTabDataFlatBuffer.addContentStateVersion( - fbb, webContentsStateVersion); - CriticalPersistedTabDataFlatBuffer.addOpenerAppId(fbb, oaid); - CriticalPersistedTabDataFlatBuffer.addThemeColor(fbb, themeColor); - CriticalPersistedTabDataFlatBuffer.addLaunchTypeAtCreation(fbb, launchType); - CriticalPersistedTabDataFlatBuffer.addUserAgent(fbb, userAgentType); - int r = CriticalPersistedTabDataFlatBuffer.endCriticalPersistedTabDataFlatBuffer( - fbb); - fbb.finish(r); + public Serializer<ByteBuffer> getSerializer() { + return new Serializer<ByteBuffer>() { + private ByteBuffer mByteBufferSnapshot; + private String mOpenerAppIdSnapshot; + private int mParentIdSnapshot; + private int mRootIdSnapshot; + private long mTimestampMillisSnapshot; + private int mWebContentsStateVersionSnapshot; + private int mThemeColorSnapshot; + private int mLaunchTypeSnapshot; + private int mUserAgentTypeSnapshot; + private boolean mPreSerialized; - return fbb.dataBuffer(); + @Override + public ByteBuffer get() { + assert mPreSerialized + : "Must call preSerialize before get() on CriticalPersistedTabData Serializer"; + try (TraceEvent e = TraceEvent.scoped("CriticalPersistedTabData.Serialize")) { + ByteBuffer readOnlyByteBuffer = mByteBufferSnapshot == null + ? null + : mByteBufferSnapshot.asReadOnlyBuffer(); + if (readOnlyByteBuffer != null) { + readOnlyByteBuffer.rewind(); + } + FlatBufferBuilder fbb = new FlatBufferBuilder(); + int wcs = CriticalPersistedTabDataFlatBuffer.createWebContentsStateBytesVector( + fbb, + readOnlyByteBuffer == null ? ByteBuffer.allocate(0).put(new byte[] {}) + : readOnlyByteBuffer); + int oaid = + fbb.createString(mOpenerAppIdSnapshot == null ? NULL_OPENER_APP_ID + : mOpenerAppIdSnapshot); + CriticalPersistedTabDataFlatBuffer.startCriticalPersistedTabDataFlatBuffer(fbb); + CriticalPersistedTabDataFlatBuffer.addParentId(fbb, mParentIdSnapshot); + CriticalPersistedTabDataFlatBuffer.addRootId(fbb, mRootIdSnapshot); + CriticalPersistedTabDataFlatBuffer.addTimestampMillis( + fbb, mTimestampMillisSnapshot); + CriticalPersistedTabDataFlatBuffer.addWebContentsStateBytes(fbb, wcs); + CriticalPersistedTabDataFlatBuffer.addContentStateVersion( + fbb, mWebContentsStateVersionSnapshot); + CriticalPersistedTabDataFlatBuffer.addOpenerAppId(fbb, oaid); + CriticalPersistedTabDataFlatBuffer.addThemeColor(fbb, mThemeColorSnapshot); + CriticalPersistedTabDataFlatBuffer.addLaunchTypeAtCreation( + fbb, mLaunchTypeSnapshot); + CriticalPersistedTabDataFlatBuffer.addUserAgent(fbb, mUserAgentTypeSnapshot); + int r = CriticalPersistedTabDataFlatBuffer + .endCriticalPersistedTabDataFlatBuffer(fbb); + fbb.finish(r); + + return fbb.dataBuffer(); + } + } + + @Override + public void preSerialize() { + try (TraceEvent e = TraceEvent.scoped("CriticalPersistedTabData.PreSerialize")) { + WebContentsState webContentsState = mWebContentsState == null + ? getWebContentsStateFromTab(mTab) + : mWebContentsState; + mByteBufferSnapshot = + webContentsState == null ? null : webContentsState.buffer(); + mOpenerAppIdSnapshot = mOpenerAppId; + mParentIdSnapshot = mParentId; + mRootIdSnapshot = mRootId; + mTimestampMillisSnapshot = mTimestampMillis; + mWebContentsStateVersionSnapshot = mContentStateVersion; + mThemeColorSnapshot = mThemeColor; + mLaunchTypeSnapshot = getLaunchType(mTabLaunchTypeAtCreation); + mUserAgentTypeSnapshot = getUserAgentType(mUserAgent); + } + mPreSerialized = true; } }; } @@ -549,7 +573,7 @@ @Override public void save() { if (shouldSave()) { - super.save(); + super.save((res) -> { mShouldSave = false; }); } } @@ -568,6 +592,9 @@ if (mShouldSaveForTesting) { return true; } + if (!mShouldSave) { + return false; + } if (getUrl() == null || getUrl().isEmpty()) { return false; } @@ -788,6 +815,18 @@ } /** + * Indicates to {@link CriticalPersistedTabData} that a CriticalPersistedTabData + * file should be saved upon a persisted Tab attribute change. Will be reset + * when the save is complete. Not every time a Tab attribute changes, should the + * file be saved - for example, WebContents changes multiple times during + * a navigation and if a new save were initiated on every change, the UI thread + * would be filled with too many saves. + */ + public void setShouldSave() { + mShouldSave = true; + } + + /** * @return true if the serialized {@link CriticalPersistedTabData} is empty. */ public static boolean isEmptySerialization(
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/EmptyByteBufferPersistedTabDataStorage.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/EmptyByteBufferPersistedTabDataStorage.java index ebcefbb5..731ddc5c 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/EmptyByteBufferPersistedTabDataStorage.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/EmptyByteBufferPersistedTabDataStorage.java
@@ -5,7 +5,6 @@ package org.chromium.chrome.browser.tab.state; import org.chromium.base.Callback; -import org.chromium.base.supplier.Supplier; import org.chromium.base.task.PostTask; import org.chromium.content_public.browser.UiThreadTaskTraits; @@ -20,7 +19,13 @@ public class EmptyByteBufferPersistedTabDataStorage implements PersistedTabDataStorage { // Unused @Override - public void save(int tabId, String tabDataId, Supplier<ByteBuffer> dataSupplier) { + public void save(int tabId, String tabDataId, Serializer<ByteBuffer> serializer) { + assert false : "save is currently unused in EmptyByteBufferPersistedTabDataStorage"; + } + + @Override + public void save(int tabId, String tabDataId, Serializer<ByteBuffer> serializer, + Callback<Integer> callback) { assert false : "save is currently unused in EmptyByteBufferPersistedTabDataStorage"; }
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/EncryptedFilePersistedTabDataStorage.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/EncryptedFilePersistedTabDataStorage.java index e9a0202..d6c8097 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/EncryptedFilePersistedTabDataStorage.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/EncryptedFilePersistedTabDataStorage.java
@@ -7,14 +7,12 @@ import android.os.SystemClock; import androidx.annotation.MainThread; -import androidx.annotation.VisibleForTesting; import androidx.core.util.AtomicFile; import org.chromium.base.Callback; import org.chromium.base.Log; import org.chromium.base.StreamUtil; import org.chromium.base.metrics.RecordHistogram; -import org.chromium.base.supplier.Supplier; import org.chromium.chrome.browser.crypto.CipherFactory; import java.io.DataInputStream; @@ -51,15 +49,14 @@ @MainThread @Override - public void save(int tabId, String dataId, Supplier<ByteBuffer> dataSupplier) { - save(tabId, dataId, dataSupplier, NO_OP_CALLBACK); + public void save(int tabId, String dataId, Serializer<ByteBuffer> serializer) { + save(tabId, dataId, serializer, NO_OP_CALLBACK); } @MainThread @Override - @VisibleForTesting - protected void save( - int tabId, String dataId, Supplier<ByteBuffer> data, Callback<Integer> callback) { + public void save( + int tabId, String dataId, Serializer<ByteBuffer> data, Callback<Integer> callback) { addStorageRequestAndProcessNext( new EncryptedFileSaveRequest(tabId, dataId, data, callback)); } @@ -99,18 +96,18 @@ /** * @param tabId identifier for the {@link Tab} * @param dataId identifier for the {@link PersistedTabData} - * @param dataSupplier {@link Supplier} containing data to be saved + * @param serializer {@link Serializer} containing data to be saved */ - EncryptedFileSaveRequest(int tabId, String dataId, Supplier<ByteBuffer> dataSupplier, + EncryptedFileSaveRequest(int tabId, String dataId, Serializer<ByteBuffer> serializer, Callback<Integer> callback) { - super(tabId, dataId, dataSupplier, callback); + super(tabId, dataId, serializer, callback); } @Override public Void executeSyncTask() { - ByteBuffer data = mDataSupplier.get(); + ByteBuffer data = mSerializer.get(); if (data == null) { - mDataSupplier = null; + mSerializer = null; return null; } boolean success = false;
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/FilePersistedTabDataStorage.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/FilePersistedTabDataStorage.java index dd3166c..f420248 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/FilePersistedTabDataStorage.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/FilePersistedTabDataStorage.java
@@ -19,7 +19,6 @@ import org.chromium.base.StreamUtil; import org.chromium.base.StrictModeContext; import org.chromium.base.metrics.RecordHistogram; -import org.chromium.base.supplier.Supplier; import org.chromium.base.task.AsyncTask; import org.chromium.base.task.PostTask; import org.chromium.base.task.SequencedTaskRunner; @@ -78,17 +77,17 @@ @MainThread @Override - public void save(int tabId, String dataId, Supplier<ByteBuffer> dataSupplier) { - save(tabId, dataId, dataSupplier, NO_OP_CALLBACK); + public void save(int tabId, String dataId, Serializer<ByteBuffer> serializer) { + save(tabId, dataId, serializer, NO_OP_CALLBACK); } // Callback used for test synchronization between save, restore and delete operations @MainThread - @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) - protected void save(int tabId, String dataId, Supplier<ByteBuffer> dataSupplier, + @Override + public void save(int tabId, String dataId, Serializer<ByteBuffer> serializer, Callback<Integer> callback) { // TODO(crbug.com/1059637) we should introduce a retry mechanisms - addSaveRequest(new FileSaveRequest(tabId, dataId, dataSupplier, callback)); + addSaveRequest(new FileSaveRequest(tabId, dataId, serializer, callback)); processNextItemOnQueue(); } @@ -224,18 +223,18 @@ * Request to save {@link PersistedTabData} */ protected class FileSaveRequest extends StorageRequest<Void> { - protected Supplier<ByteBuffer> mDataSupplier; + protected Serializer<ByteBuffer> mSerializer; protected Callback<Integer> mCallback; /** * @param tabId identifier for the {@link Tab} * @param dataId identifier for the {@link PersistedTabData} - * @param dataSupplier {@link Supplier} containing data to be saved + * @param serializer {@link Serializer} containing data to be saved */ - FileSaveRequest(int tabId, String dataId, Supplier<ByteBuffer> dataSupplier, + FileSaveRequest(int tabId, String dataId, Serializer<ByteBuffer> serializer, Callback<Integer> callback) { super(tabId, dataId); - mDataSupplier = dataSupplier; + mSerializer = serializer; mCallback = callback; } @@ -243,14 +242,14 @@ public Void executeSyncTask() { ByteBuffer data = null; try { - data = mDataSupplier.get(); + data = mSerializer.get(); } catch (OutOfMemoryError e) { // Log and exit FileSaveRequest early on OutOfMemoryError. // Not saving a Tab is better than crashing the app. Log.e(TAG, "OutOfMemoryError. Details: " + e.getMessage()); } if (data == null) { - mDataSupplier = null; + mSerializer = null; return null; } FileOutputStream outputStream = null; @@ -298,6 +297,11 @@ public AsyncTask getAsyncTask() { return new AsyncTask<Void>() { @Override + protected void onPreExecute() { + mSerializer.preSerialize(); + } + + @Override protected Void doInBackground() { return executeSyncTask(); }
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/LevelDBPersistedTabDataStorage.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/LevelDBPersistedTabDataStorage.java index fe7ce6b..d8741e0 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/LevelDBPersistedTabDataStorage.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/LevelDBPersistedTabDataStorage.java
@@ -8,7 +8,6 @@ import androidx.annotation.VisibleForTesting; import org.chromium.base.Callback; -import org.chromium.base.supplier.Supplier; import org.chromium.chrome.browser.profiles.Profile; import java.nio.ByteBuffer; @@ -42,10 +41,17 @@ @MainThread @Override - public void save(int tabId, String dataId, Supplier<ByteBuffer> dataSupplier) { + public void save(int tabId, String dataId, Serializer<ByteBuffer> serializer) { // TODO(crbug.com/1221571) update LevelDB storage in native to use ByteBuffer instead // of byte[] to avoid conversion - mPersistedDataStorage.save(getKey(tabId, dataId), toByteArray(dataSupplier.get())); + serializer.preSerialize(); + mPersistedDataStorage.save(getKey(tabId, dataId), toByteArray(serializer.get())); + } + + @Override + public void save(int tabId, String dataId, Serializer<ByteBuffer> serializer, + Callback<Integer> callback) { + assert false : "save with callback unused in LevelDBPersistedTabDataStorage"; } private static byte[] toByteArray(ByteBuffer buffer) {
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/MockPersistedTabData.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/MockPersistedTabData.java index 1f90b780..929df31 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/MockPersistedTabData.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/MockPersistedTabData.java
@@ -6,7 +6,6 @@ import org.chromium.base.Callback; import org.chromium.base.annotations.DoNotClassMerge; -import org.chromium.base.supplier.Supplier; import org.chromium.chrome.browser.tab.Tab; import java.nio.ByteBuffer; @@ -69,7 +68,7 @@ } @Override - public Supplier<ByteBuffer> getSerializeSupplier() { + public Serializer<ByteBuffer> getSerializer() { ByteBuffer byteBuffer = ByteBuffer.allocate(4).putInt(mField); byteBuffer.rewind(); return () -> {
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/MockPersistedTabDataStorage.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/MockPersistedTabDataStorage.java index ea41655..3b901be 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/MockPersistedTabDataStorage.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/MockPersistedTabDataStorage.java
@@ -5,7 +5,6 @@ package org.chromium.chrome.browser.tab.state; import org.chromium.base.Callback; -import org.chromium.base.supplier.Supplier; import org.chromium.base.task.PostTask; import org.chromium.content_public.browser.UiThreadTaskTraits; @@ -24,14 +23,22 @@ private final Map<String, ByteBuffer> mStorage = new HashMap<>(); @Override - public void save(int tabId, String tabDataId, Supplier<ByteBuffer> dataSupplier) { - mStorage.put(getKey(tabId), dataSupplier.get()); + public void save(int tabId, String tabDataId, Serializer<ByteBuffer> serializer) { + serializer.preSerialize(); + mStorage.put(getKey(tabId), serializer.get()); if (mSemaphore != null) { mSemaphore.release(); } } @Override + public void save(int tabId, String dataId, Serializer<ByteBuffer> serializer, + Callback<Integer> callback) { + save(tabId, dataId, serializer); + callback.onResult(0); + } + + @Override public void restore(int tabId, String tabDataId, Callback<ByteBuffer> callback) { PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> { callback.onResult(
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/PersistedTabData.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/PersistedTabData.java index 58b4cfe..bda188c 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/PersistedTabData.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/PersistedTabData.java
@@ -249,7 +249,6 @@ /** * Save {@link PersistedTabData} to storage - * @param callback callback indicating success/failure */ @VisibleForTesting(otherwise = VisibleForTesting.PROTECTED) protected void save() { @@ -260,35 +259,55 @@ } /** + * Save {@link PersistedTabData} to storage + * @param callback called after save is completed + */ + @VisibleForTesting(otherwise = VisibleForTesting.PROTECTED) + public void save(Callback<Integer> onComplete) { + if (mIsTabSaveEnabledSupplier != null && mIsTabSaveEnabledSupplier.get()) { + mPersistedTabDataStorage.save( + mTab.getId(), mPersistedTabDataId, getOomAndMetricsWrapper(), onComplete); + } + } + + /** * @return {@link Supplier} for {@link PersistedTabData} in serialized form. */ - abstract Supplier<ByteBuffer> getSerializeSupplier(); + abstract Serializer<ByteBuffer> getSerializer(); @VisibleForTesting - protected Supplier<ByteBuffer> getOomAndMetricsWrapper() { - final Supplier<ByteBuffer> supplier = getSerializeSupplierWithOomSoftFallback(); - return () -> { - if (supplier == null) return null; - ByteBuffer res; - try (TraceEvent e = TraceEvent.scoped("PersistedTabData.Serialize")) { - res = supplier.get(); - } catch (OutOfMemoryError oe) { - Log.e(TAG, - "Out of memory error when attempting to save PersistedTabData. Details: " - + oe.getMessage()); - res = null; + protected Serializer<ByteBuffer> getOomAndMetricsWrapper() { + final Serializer<ByteBuffer> serializer = getSerializerWithOomSoftFallback(); + return new Serializer<ByteBuffer>() { + @Override + public ByteBuffer get() { + if (serializer == null) return null; + ByteBuffer res; + try (TraceEvent e = TraceEvent.scoped("PersistedTabData.Serialize")) { + res = serializer.get(); + } catch (OutOfMemoryError oe) { + Log.e(TAG, + "Out of memory error when attempting to save PersistedTabData." + + " Details: " + oe.getMessage()); + res = null; + } + // TODO(crbug.com/1162293) convert to enum histogram and differentiate null/not + // null/out of memory + RecordHistogram.recordBooleanHistogram( + "Tabs.PersistedTabData.Serialize." + getUmaTag(), res != null); + return res; } - // TODO(crbug.com/1162293) convert to enum histogram and differentiate null/not null/out - // of memory - RecordHistogram.recordBooleanHistogram( - "Tabs.PersistedTabData.Serialize." + getUmaTag(), res != null); - return res; + + @Override + public void preSerialize() { + serializer.preSerialize(); + } }; } - private Supplier<ByteBuffer> getSerializeSupplierWithOomSoftFallback() { + private Serializer<ByteBuffer> getSerializerWithOomSoftFallback() { try { - return getSerializeSupplier(); + return getSerializer(); } catch (OutOfMemoryError oe) { Log.e(TAG, "Out of memory error when attempting to save PersistedTabData "
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/PersistedTabDataStorage.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/PersistedTabDataStorage.java index 21ef39b..9a79757 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/PersistedTabDataStorage.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/PersistedTabDataStorage.java
@@ -5,7 +5,6 @@ package org.chromium.chrome.browser.tab.state; import org.chromium.base.Callback; -import org.chromium.base.supplier.Supplier; import java.nio.ByteBuffer; import java.util.List; @@ -17,9 +16,18 @@ /** * @param tabId identifier for the {@link Tab} * @param tabDataId unique identifier representing the type {@link PersistedTabData} - * @param dataSupplier {@link Supplier} for serialized {@link PersistedTabData} + * @param serializer {@link Serializer} for serialized {@link PersistedTabData} */ - void save(int tabId, String tabDataId, Supplier<ByteBuffer> dataSupplier); + void save(int tabId, String tabDataId, Serializer<ByteBuffer> serializer); + + /** + * @param tabId identifier for the {@link Tab} + * @param tabDataId unique identifier representing the type {@link PersistedTabData} + * @param serializer {@link Serializer} for serialized {@link PersistedTabData} + * @param onComplete {@link Callback} called after save is completed + */ + void save(int tabId, String tabDataId, Serializer<ByteBuffer> serializer, + Callback<Integer> onComplete); /** * @param tabId identifier for the {@link Tab}
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/Serializer.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/Serializer.java new file mode 100644 index 0000000..c0e2991 --- /dev/null +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/Serializer.java
@@ -0,0 +1,27 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.tab.state; + +import androidx.annotation.Nullable; + +/** + * Used for serializing {@link PersistedTabData}. + * @param <T> Return type of {@link Serializer} + */ +public interface Serializer<T> { + /** + * Acquires serialized {@link PersistedTabData}. Not all + * {@link PersistedTabData} clients require a pre-serialization + * step but if they do, get() assumes preSerialize() has been called + * Must be called from a background thread. + */ + @Nullable + T get(); + + /** + * Prepares data for serialization. Must be called from the UI thread. + */ + default void preSerialize() {} +} \ No newline at end of file
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabData.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabData.java index 5306868..8ab732a 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabData.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabData.java
@@ -17,7 +17,6 @@ import org.chromium.base.annotations.DoNotClassMerge; import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.supplier.ObservableSupplierImpl; -import org.chromium.base.supplier.Supplier; import org.chromium.base.task.PostTask; import org.chromium.base.task.TaskTraits; import org.chromium.chrome.browser.commerce.PriceUtils; @@ -937,7 +936,7 @@ } @Override - public Supplier<ByteBuffer> getSerializeSupplier() { + public Serializer<ByteBuffer> getSerializer() { ShoppingPersistedTabDataProto.Builder builder = ShoppingPersistedTabDataProto.newBuilder() .setPriceMicros(mPriceDropData.priceMicros)
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/StorePersistedTabData.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/StorePersistedTabData.java index 76e105d3..18fcf3d 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/StorePersistedTabData.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/StorePersistedTabData.java
@@ -15,7 +15,6 @@ import org.chromium.base.Callback; import org.chromium.base.Log; import org.chromium.base.annotations.DoNotClassMerge; -import org.chromium.base.supplier.Supplier; import org.chromium.chrome.browser.endpoint_fetcher.EndpointFetcher; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.Tab; @@ -240,7 +239,7 @@ } @Override - Supplier<ByteBuffer> getSerializeSupplier() { + Serializer<ByteBuffer> getSerializer() { StorePersistedTabDataProto.Builder builder = StorePersistedTabDataProto.newBuilder() .setOpeningTime(mStoreHours.mOpeningTime)
diff --git a/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoLoadHelper.java b/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoLoadHelper.java index 2a81e45..4fae4c39 100644 --- a/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoLoadHelper.java +++ b/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoLoadHelper.java
@@ -15,7 +15,6 @@ import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; import org.chromium.chrome.features.start_surface.StartSurfaceConfiguration; -import org.chromium.chrome.features.start_surface.StartSurfaceState; import org.chromium.content_public.browser.LoadUrlParams; /** @@ -47,9 +46,16 @@ /** * If it's on Start surface homepage, load search provider logo; If it's not on start surface * homepage, destroy mLogoDelegate. + * + * @param isStartSurfaceShown Whether Start surface homepage is shown. + * @param deprecatedStartSurfaceStateMarkedHidden Whether Start surface homepage is hidden. + * TODO(crbug.com/1315676): Remove this variable once the refactor is launched and + * StartSurfaceState is removed. Now we check this because there are some intermediate + * StartSurfaceStates, i.e. SHOWING_START. */ - public void maybeLoadSearchProviderLogoOnHomepage(@StartSurfaceState int startSurfaceState) { - if (startSurfaceState == StartSurfaceState.SHOWN_HOMEPAGE) { + public void maybeLoadSearchProviderLogoOnHomepage( + boolean isStartSurfaceShown, boolean deprecatedStartSurfaceStateMarkedHidden) { + if (isStartSurfaceShown) { if (mProfileSupplier.hasValue()) { loadSearchProviderLogo(/*animationEnabled=*/false); return; @@ -59,10 +65,7 @@ assert profile != null : "Unexpectedly null profile from TabModel."; loadSearchProviderLogo(/*animationEnabled=*/false); })); - } else if ((startSurfaceState == StartSurfaceState.NOT_SHOWN - || startSurfaceState == StartSurfaceState.SHOWN_TABSWITCHER - || startSurfaceState == StartSurfaceState.DISABLED) - && mLogoDelegate != null) { + } else if (deprecatedStartSurfaceStateMarkedHidden && mLogoDelegate != null) { mHasLogoLoadedForCurrentSearchEngine = false; // Destroy |mLogoDelegate| when hiding Start surface homepage to save memory. mLogoDelegate.destroy();
diff --git a/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoLoadHelperUnitTest.java b/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoLoadHelperUnitTest.java index eb3e34e..bdc0cd4 100644 --- a/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoLoadHelperUnitTest.java +++ b/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoLoadHelperUnitTest.java
@@ -35,7 +35,6 @@ import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactoryJni; import org.chromium.chrome.features.start_surface.StartSurfaceConfiguration; -import org.chromium.chrome.features.start_surface.StartSurfaceState; import org.chromium.components.search_engines.TemplateUrlService; import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.content_public.browser.test.util.TestThreadUtils; @@ -152,7 +151,8 @@ mLogoLoadHelper.setHasLogoLoadedForCurrentSearchEngineForTesting(false); doReturn(false).when(mTemplateUrlService).isDefaultSearchEngineGoogle(); - mLogoLoadHelper.maybeLoadSearchProviderLogoOnHomepage(StartSurfaceState.SHOWN_HOMEPAGE); + mLogoLoadHelper.maybeLoadSearchProviderLogoOnHomepage( + /*isStartSurfaceShown*/ true, /*isStartSurfaceHidden*/ false); verify(mLogoDelegate, times(1)).getSearchProviderLogo(any()); } @@ -162,7 +162,8 @@ mLogoLoadHelper.setHasLogoLoadedForCurrentSearchEngineForTesting(true); doReturn(false).when(mTemplateUrlService).isDefaultSearchEngineGoogle(); - mLogoLoadHelper.maybeLoadSearchProviderLogoOnHomepage(StartSurfaceState.SHOWN_HOMEPAGE); + mLogoLoadHelper.maybeLoadSearchProviderLogoOnHomepage( + /*isStartSurfaceShown*/ true, /*isStartSurfaceHidden*/ false); verify(mLogoDelegate, times(0)).getSearchProviderLogo(any()); }
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb index 35d646a..6032c68 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Kopiraj sliku</translation> <translation id="6674571176963658787">Da pokrenete sinhronizaciju, unesite pristupni izraz</translation> <translation id="6676840375528380067">Obrisati Chrome podatke s ovog uređaja?</translation> +<translation id="6676927815633975364">Prijavite se na ovu web-lokaciju i Chrome</translation> <translation id="6684809838922667136">Poboljšajte Chrome</translation> <translation id="670498945988402717">Provjereno jučer</translation> <translation id="6710213216561001401">Nazad</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb index 66f2f327..42109f9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Kopiér billede</translation> <translation id="6674571176963658787">Angiv din adgangssætning for at starte synkroniseringen</translation> <translation id="6676840375528380067">Vil du rydde dine Chrome-data på denne enhed?</translation> +<translation id="6676927815633975364">Log ind på dette website og Chrome</translation> <translation id="6684809838922667136">Gør Chrome bedre</translation> <translation id="670498945988402717">Tjekket i går</translation> <translation id="6710213216561001401">Forrige</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb index 356caea..0f1d3723 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Copier l'image</translation> <translation id="6674571176963658787">Pour lancer la synchronisation, entrez votre phrase de passe</translation> <translation id="6676840375528380067">Effacer vos données Chrome de cet appareil?</translation> +<translation id="6676927815633975364">Connectez-vous à ce site et à Chrome</translation> <translation id="6684809838922667136">Améliorer Chrome</translation> <translation id="670498945988402717">Dernière vérification : hier</translation> <translation id="6710213216561001401">Précédent</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 d00103f69..a76f751c 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
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Kopiraj sliku</translation> <translation id="6674571176963658787">Za pokretanje sinkronizacije unesite šifru</translation> <translation id="6676840375528380067">Želite li izbrisati svoje podatke iz Chromea s ovog uređaja?</translation> +<translation id="6676927815633975364">Prijavite se na ovu web-lokaciju i Chrome</translation> <translation id="6684809838922667136">Poboljšavanje Chromea</translation> <translation id="670498945988402717">Provjera je izvršena jučer</translation> <translation id="6710213216561001401">Prethodno</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb index a1d5b489..a4824f84 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Kép másolása</translation> <translation id="6674571176963658787">A szinkronizálás megkezdéséhez adja meg összetett jelszavát.</translation> <translation id="6676840375528380067">Törli Chrome-adatait az eszközről?</translation> +<translation id="6676927815633975364">Bejelentkezés erre a webhelyre és a Chrome-ba</translation> <translation id="6684809838922667136">A Chrome fejlesztése</translation> <translation id="670498945988402717">Tegnap volt ellenőrizve</translation> <translation id="6710213216561001401">Előző</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 bbb5e93..5e25b91 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
@@ -718,7 +718,7 @@ <translation id="4943703118917034429">Realtà virtuale</translation> <translation id="4943872375798546930">Nessun risultato</translation> <translation id="4950924971025849764">Quando hai eseguito l'accesso allo stesso Account Google, gli altri dispositivi possono utilizzare questo telefono come token di sicurezza.</translation> -<translation id="4957722034734105353">Ulteriori informazioni...</translation> +<translation id="4957722034734105353">Scopri di più...</translation> <translation id="4961107849584082341">Traduci questa pagina in qualsiasi lingua</translation> <translation id="4971735654804503942">Sistemi di protezione proattivi e più rapidi da estensioni, siti web e download pericolosi. Ricevi un avviso in caso di violazioni della password. Richiede l'invio dei dati di navigazione a Google.</translation> <translation id="497421865427891073">Avanti</translation> @@ -1375,7 +1375,7 @@ <translation id="8442258441309440798">Nessuna notizia disponibile</translation> <translation id="8443209985646068659">Imp. aggiornare Chrome</translation> <translation id="8445448999790540984">Impossibile esportare le password</translation> -<translation id="8446884382197647889">Ulteriori informazioni</translation> +<translation id="8446884382197647889">Scopri di più</translation> <translation id="8453310803815879010">Inizia il gioco Dino</translation> <translation id="8460448946170646641">Esamina i controlli per la privacy e la sicurezza più importanti</translation> <translation id="8461694314515752532">Cripta i dati sincronizzati con la tua passphrase di sincronizzazione</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 e2dc0348..7bcdbaf 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
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">გამოსახულების კოპირება</translation> <translation id="6674571176963658787">სინქრონიზაციის დასაწყებად შეიყვანეთ თქვენი საიდუმლო ფრაზა</translation> <translation id="6676840375528380067">გასუფთავდეს თქვენი Chrome მონაცემები ამ მოწყობილობიდან?</translation> +<translation id="6676927815633975364">შედით ამ საიტსა და Chrome-ში</translation> <translation id="6684809838922667136">გააუმჯობესეთ Chrome</translation> <translation id="670498945988402717">შემოწმდა გუშინ</translation> <translation id="6710213216561001401">წინა</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb index b6335ec..5e6fc032 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">ກັອບປີ້ຮູບ</translation> <translation id="6674571176963658787">ເພື່ອເລີ່ມຊິ້ງຂໍ້ມູນ, ໃຫ້ໃສ່ລະຫັດຜ່ານຂອງທ່ານ</translation> <translation id="6676840375528380067">ລຶບລ້າງຂໍ້ມູນ Chrome ຂອງທ່ານຈາກອຸປະກອນນີ້?</translation> +<translation id="6676927815633975364">ເຂົ້າສູ່ລະບົບຫາເວັບໄຊທ໌ນີ້ ແລະ Chrome</translation> <translation id="6684809838922667136">ເຮັດໃຫ້ Chrome ດີຂຶ້ນ</translation> <translation id="670498945988402717">ກວດແລ້ວມື້ວານນີ້</translation> <translation id="6710213216561001401">ຜ່ານມາ</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 d8d6da8..afc48ab3 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
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Копирај слика</translation> <translation id="6674571176963658787">За да започне синхронизацијата, внесете ја лозинката</translation> <translation id="6676840375528380067">Да се избришат податоците на Chrome од уредов?</translation> +<translation id="6676927815633975364">Најавете се на сајтов и на Chrome</translation> <translation id="6684809838922667136">Подобрете го Chrome</translation> <translation id="670498945988402717">Проверено вчера</translation> <translation id="6710213216561001401">Претходно</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb index 168ad315..bb77ae8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Salin imej</translation> <translation id="6674571176963658787">Untuk memulakan penyegerakan, masukkan ungkapan laluan anda</translation> <translation id="6676840375528380067">Kosongkan data Chrome anda daripada peranti ini?</translation> +<translation id="6676927815633975364">Log masuk ke laman ini dan Chrome</translation> <translation id="6684809838922667136">Jadikan Chrome lebih baik</translation> <translation id="670498945988402717">Disemak semalam</translation> <translation id="6710213216561001401">Sebelumnya</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb index 04ea9a7b..2f99b5a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb
@@ -1048,6 +1048,7 @@ <translation id="6671495933530132209">ပုံကို ကူးယူရန်</translation> <translation id="6674571176963658787">စင့်ခ်လုပ်ခြင်းစတင်ရန် သင်၏စကားဝှက်စာ ထည့်ပါ</translation> <translation id="6676840375528380067">ဤစက်မှ သင်၏ Chrome ဒေတာများကို ဖျက်လိုပါသလား။</translation> +<translation id="6676927815633975364">ဤဝဘ်ဆိုက်နှင့် Chrome သို့ လက်မှတ်ထိုးဝင်ပါ</translation> <translation id="6684809838922667136">Chrome ပိုကောင်းရန်လုပ်ခြင်း</translation> <translation id="670498945988402717">မနေ့က စစ်ဆေးခဲ့သည်</translation> <translation id="6710213216561001401">အရင်</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 c94094c2..85ef4e4 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
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">ਚਿੱਤਰ ਕਾਪੀ ਕਰੋ</translation> <translation id="6674571176963658787">ਸਿੰਕ ਸ਼ੁਰੂ ਕਰਨ ਲਈ, ਆਪਣਾ ਪਾਸਫਰੇਜ਼ ਦਾਖਲ ਕਰੋ</translation> <translation id="6676840375528380067">ਕੀ ਇਸ ਡੀਵਾਈਸ ਤੋਂ ਤੁਹਾਡਾ Chrome ਡਾਟਾ ਕਲੀਅਰ ਕਰਨਾ ਹੈ?</translation> +<translation id="6676927815633975364">ਇਸ ਸਾਈਟ ਅਤੇ Chrome ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰੋ</translation> <translation id="6684809838922667136">Chrome ਨੂੰ ਬਿਹਤਰ ਬਣਾਓ</translation> <translation id="670498945988402717">ਬੀਤੇ ਕੱਲ੍ਹ ਜਾਂਚ ਕੀਤੀ ਗਈ</translation> <translation id="6710213216561001401">ਪਿਛਲਾ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb index 9b10025..07da4a1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Copiar imagem</translation> <translation id="6674571176963658787">Para iniciar a sincronização, introduza a sua frase de acesso</translation> <translation id="6676840375528380067">Pretende limpar os dados do Chrome deste dispositivo?</translation> +<translation id="6676927815633975364">Inicie sessão neste site e no Chrome</translation> <translation id="6684809838922667136">Melhore o Chrome</translation> <translation id="670498945988402717">Última verificação ontem</translation> <translation id="6710213216561001401">Anterior</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 d11c0ec..208bdcc 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
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">చిత్రాన్ని కాపీ చేయి</translation> <translation id="6674571176963658787">సింక్ను ప్రారంభించడానికి, రహస్య పదబంధాన్ని ఎంటర్ చేయండి</translation> <translation id="6676840375528380067">ఈ పరికరం నుండి మీ Chrome డేటాను తీసివేయాలా?</translation> +<translation id="6676927815633975364">ఈ సైట్కు, అలాగే Chromeకు సైన్ ఇన్ చేయండి</translation> <translation id="6684809838922667136">Chromeను మెరుగుపరచండి</translation> <translation id="670498945988402717">నిన్న చెక్ చేసింది</translation> <translation id="6710213216561001401">మునుపటి</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb index 1b83f60..5165f87a6 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Rasmni nusxalash</translation> <translation id="6674571176963658787">Sinxronlashni boshlash uchun kodli iborani kiriting</translation> <translation id="6676840375528380067">Chrome maʼlumotlaringiz bu qurilmadan tozalansinmi?</translation> +<translation id="6676927815633975364">Bu sayt va Chrome hisobiga kiring</translation> <translation id="6684809838922667136">Chromeni yaxshilash</translation> <translation id="670498945988402717">Kecha tekshirilgan</translation> <translation id="6710213216561001401">Avvalgi</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 40c8d7f..2452b9b 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
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Sao chép ảnh</translation> <translation id="6674571176963658787">Để bắt đầu đồng bộ hóa, hãy nhập cụm mật khẩu của bạn</translation> <translation id="6676840375528380067">Xóa dữ liệu Chrome của bạn khỏi thiết bị này?</translation> +<translation id="6676927815633975364">Đăng nhập vào trang web này và Chrome</translation> <translation id="6684809838922667136">Cải thiện Chrome</translation> <translation id="670498945988402717">Đã kiểm tra hôm qua</translation> <translation id="6710213216561001401">Trước</translation>
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java index 6d802ce3..40b862f 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java
@@ -10,6 +10,7 @@ import android.view.ViewStub; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import org.chromium.base.Callback; @@ -17,6 +18,7 @@ import org.chromium.base.supplier.BooleanSupplier; import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.supplier.Supplier; +import org.chromium.chrome.browser.layouts.LayoutType; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tabmodel.IncognitoStateProvider; import org.chromium.chrome.browser.tabmodel.TabModelSelector; @@ -65,7 +67,7 @@ boolean isTabGroupsAndroidContinuationEnabled, BooleanSupplier isIncognitoModeEnabledSupplier, ObservableSupplier<Profile> profileSupplier, - Callback<LoadUrlParams> logoClickedCallback) { + Callback<LoadUrlParams> logoClickedCallback, boolean isRefactorEnabled) { mStub = startSurfaceToolbarStub; mPropertyModel = @@ -92,7 +94,7 @@ menuButtonCoordinator, identityDiscStateSupplier, identityDiscButtonSupplier, StartSurfaceConfiguration.TAB_COUNT_BUTTON_ON_START_SURFACE.getValue(), isTabGroupsAndroidContinuationEnabled, isIncognitoModeEnabledSupplier, - profileSupplier, logoClickedCallback); + profileSupplier, logoClickedCallback, isRefactorEnabled); mThemeColorProvider = provider; mMenuButtonCoordinator = menuButtonCoordinator; @@ -190,13 +192,18 @@ /** * Called when start surface state is changed. - * @param newState The new {@link StartSurfaceState}. + * @param newState The new {@link StartSurfaceState}. Should be removed after refactor is + * enabled. * @param shouldShowStartSurfaceToolbar Whether or not should show start surface toolbar. + * @param newLayoutType The new {@link LayoutType}. Only used when refactor is enabled. */ - void onStartSurfaceStateChanged( - @StartSurfaceState int newState, boolean shouldShowStartSurfaceToolbar) { + void onStartSurfaceStateChanged(@Nullable @StartSurfaceState Integer newState, + boolean shouldShowStartSurfaceToolbar, @Nullable @LayoutType Integer newLayoutType) { if (shouldShowStartSurfaceToolbar && !isInflated()) inflate(); - mToolbarMediator.onStartSurfaceStateChanged(newState, shouldShowStartSurfaceToolbar); + mToolbarMediator.onStartSurfaceStateChanged( + newState == null ? StartSurfaceState.NOT_SHOWN : newState, + shouldShowStartSurfaceToolbar, + newLayoutType == null ? LayoutType.NONE : newLayoutType); } /**
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator.java index cf2fd8f1..f8ff4755 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator.java
@@ -35,6 +35,7 @@ import org.chromium.base.supplier.BooleanSupplier; import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.supplier.Supplier; +import org.chromium.chrome.browser.layouts.LayoutType; import org.chromium.chrome.browser.logo.LogoLoadHelper; import org.chromium.chrome.browser.logo.LogoView; import org.chromium.chrome.browser.profiles.Profile; @@ -68,12 +69,15 @@ private final IncognitoTabModelObserver mIncognitoTabModelObserver; private final ObservableSupplier<Profile> mProfileSupplier; private final Callback<LoadUrlParams> mLogoClickedCallback; + private final boolean mIsRefactorEnabled; private TabModelSelector mTabModelSelector; private TabCountProvider mTabCountProvider; @StartSurfaceState private int mStartSurfaceState; + @LayoutType + private int mLayoutType; private boolean mDefaultSearchEngineHasLogo; private CallbackController mCallbackController = new CallbackController(); @@ -91,7 +95,7 @@ boolean isTabGroupsAndroidContinuationEnabled, BooleanSupplier isIncognitoModeEnabledSupplier, ObservableSupplier<Profile> profileSupplier, - Callback<LoadUrlParams> logoClickedCallback) { + Callback<LoadUrlParams> logoClickedCallback, boolean isRefactorEnabled) { mPropertyModel = model; mStartSurfaceState = StartSurfaceState.NOT_SHOWN; mShowIdentityIPHCallback = showIdentityIPHCallback; @@ -108,6 +112,7 @@ if (!canShowHint && !mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE)) return; updateIdentityDisc(mIdentityDiscButtonSupplier.get()); }); + mIsRefactorEnabled = isRefactorEnabled; mShouldShowTabSwitcherButtonOnHomepage = shouldShowTabSwitcherButtonOnHomepage; @@ -158,9 +163,10 @@ } } - void onStartSurfaceStateChanged( - @StartSurfaceState int newState, boolean shouldShowStartSurfaceToolbar) { + void onStartSurfaceStateChanged(@StartSurfaceState int newState, + boolean shouldShowStartSurfaceToolbar, @LayoutType int newLayoutType) { mStartSurfaceState = newState; + mLayoutType = newLayoutType; updateLogoVisibility(); updateTabSwitcherButtonVisibility(); updateIncognitoToggleTabVisibility(); @@ -204,12 +210,20 @@ /** Returns whether it's on the start surface homepage. */ boolean isOnHomepage() { - return mStartSurfaceState == StartSurfaceState.SHOWN_HOMEPAGE; + return mIsRefactorEnabled ? mLayoutType == LayoutType.START_SURFACE + : mStartSurfaceState == StartSurfaceState.SHOWN_HOMEPAGE; } /** Returns whether it's on a normal tab. */ private boolean isOnATab() { - return mStartSurfaceState == StartSurfaceState.NOT_SHOWN; + return mIsRefactorEnabled ? mLayoutType == LayoutType.BROWSING + : mStartSurfaceState == StartSurfaceState.NOT_SHOWN; + } + + /** Returns whether it's on grid tab switcher surface. */ + private boolean isOnGridTabSwitcher() { + return mIsRefactorEnabled ? mLayoutType == LayoutType.TAB_SWITCHER + : mStartSurfaceState == StartSurfaceState.SHOWN_TABSWITCHER; } /** @@ -263,8 +277,9 @@ } private void updateIncognitoToggleTabVisibility() { - if (mStartSurfaceState != StartSurfaceState.SHOWN_TABSWITCHER - && mStartSurfaceState != StartSurfaceState.SHOWING_TABSWITCHER) { + if ((mIsRefactorEnabled && mLayoutType != LayoutType.TAB_SWITCHER) + || (!mIsRefactorEnabled && mStartSurfaceState != StartSurfaceState.SHOWN_TABSWITCHER + && mStartSurfaceState != StartSurfaceState.SHOWING_TABSWITCHER)) { mPropertyModel.set(INCOGNITO_SWITCHER_VISIBLE, false); updateNewTabViewTextVisibility(); return; @@ -311,10 +326,11 @@ private void updateLogoVisibility() { if (mLogoLoadHelper != null) { - mLogoLoadHelper.maybeLoadSearchProviderLogoOnHomepage(mStartSurfaceState); + mLogoLoadHelper.maybeLoadSearchProviderLogoOnHomepage(isOnHomepage(), + isOnATab() || isOnGridTabSwitcher() + || mStartSurfaceState == StartSurfaceState.DISABLED); } - boolean shouldShowLogo = mStartSurfaceState == StartSurfaceState.SHOWN_HOMEPAGE - && mDefaultSearchEngineHasLogo; + boolean shouldShowLogo = isOnHomepage() && mDefaultSearchEngineHasLogo; mPropertyModel.set(LOGO_IS_VISIBLE, shouldShowLogo); } @@ -337,8 +353,7 @@ } private void updateNewTabViewVisibility() { - boolean isShownTabSwitcherState = mStartSurfaceState == StartSurfaceState.SHOWN_TABSWITCHER - || mStartSurfaceState == StartSurfaceState.SHOWING_TABSWITCHER; + boolean isShownTabSwitcherState = isOnGridTabSwitcher(); // New tab button is only shown for homepage when accessibility is enabled and // OverviewListLayout is shown as the tab switcher instead of the start surface. @@ -364,21 +379,18 @@ private void updateTabSwitcherButtonVisibility() { // This button should only be shown on homepage. On tab switcher page, new tab button is // shown. - boolean shouldShow = mShouldShowTabSwitcherButtonOnHomepage - && mStartSurfaceState == StartSurfaceState.SHOWN_HOMEPAGE; + boolean shouldShow = mShouldShowTabSwitcherButtonOnHomepage && isOnHomepage(); mPropertyModel.set(TAB_SWITCHER_BUTTON_IS_VISIBLE, shouldShow); // If tab switcher button is visible, we should move identity disc to the left. mPropertyModel.set(IDENTITY_DISC_AT_START, shouldShow); } private void updateAppMenuUpdateBadgeSuppression() { - mMenuButtonCoordinator.setAppMenuUpdateBadgeSuppressed( - mStartSurfaceState == StartSurfaceState.SHOWN_TABSWITCHER); + mMenuButtonCoordinator.setAppMenuUpdateBadgeSuppressed(isOnGridTabSwitcher()); } private void updateTranslationY(float transY) { - if (mStartSurfaceState == StartSurfaceState.SHOWN_HOMEPAGE - && !mPropertyModel.get(IS_INCOGNITO)) { + if (isOnHomepage() && !mPropertyModel.get(IS_INCOGNITO)) { // If it's on the non-incognito homepage, document the homepage translationY. mNonIncognitoHomepageTranslationY = transY; // Update the translationY of the toolbarView. @@ -394,4 +406,10 @@ int getOverviewModeStateForTesting() { return mStartSurfaceState; } + + @VisibleForTesting + @LayoutType + int getLayoutTypeForTesting() { + return mLayoutType; + } }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java index 98e9409..c669fbd8 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java
@@ -75,7 +75,7 @@ private final ToolbarLayout mToolbarLayout; - private final boolean mIsGridTabSwitcherEnabled; + private final boolean mIsStartSurfaceRefactorEnabled; /** * The coordinator for the tab switcher mode toolbar (phones only). This will be lazily created @@ -153,15 +153,16 @@ HistoryDelegate historyDelegate, BooleanSupplier partnerHomepageEnabledSupplier, OfflineDownloader offlineDownloader, boolean initializeWithIncognitoColors, ObservableSupplier<Profile> profileSupplier, - Callback<LoadUrlParams> startSurfaceLogoClickedCallback) { + Callback<LoadUrlParams> startSurfaceLogoClickedCallback, + boolean isStartSurfaceRefactorEnabled) { mControlContainer = controlContainer; mToolbarLayout = toolbarLayout; mMenuButtonCoordinator = browsingModeMenuButtonCoordinator; mOptionalButtonController = new OptionalBrowsingModeButtonController(buttonDataProviders, userEducationHelper, mToolbarLayout, () -> toolbarDataProvider.getTab()); mResourceManagerSupplier = resourceManagerSupplier; - mTabModelSelectorSupplier = tabModelSelectorSupplier; + mIsStartSurfaceRefactorEnabled = isStartSurfaceRefactorEnabled; if (mToolbarLayout instanceof ToolbarPhone && isStartSurfaceEnabled) { mStartSurfaceToolbarCoordinator = new StartSurfaceToolbarCoordinator(toolbarStub, @@ -169,14 +170,13 @@ overviewModeMenuButtonCoordinator, identityDiscButtonSupplier, isGridTabSwitcherEnabled, isTabGroupsAndroidContinuationEnabled, isIncognitoModeEnabledSupplier, profileSupplier, - startSurfaceLogoClickedCallback); + startSurfaceLogoClickedCallback, mIsStartSurfaceRefactorEnabled); } else if (mToolbarLayout instanceof ToolbarPhone || isTabletGridTabSwitcherEnabled()) { mTabSwitcherModeCoordinator = new TabSwitcherModeTTCoordinator(toolbarStub, fullscreenToolbarStub, overviewModeMenuButtonCoordinator, isGridTabSwitcherEnabled, isTabletGtsPolishEnabled, isTabToGtsAnimationEnabled, isIncognitoModeEnabledSupplier); } - mIsGridTabSwitcherEnabled = isGridTabSwitcherEnabled; controlContainer.setToolbar(this, initializeWithIncognitoColors); mToolbarLayout.initialize(toolbarDataProvider, tabController, mMenuButtonCoordinator, isProgressBarVisibleSupplier, historyDelegate, partnerHomepageEnabledSupplier, @@ -659,13 +659,16 @@ * @param newState New Start Surface State. * @param requestToShow Whether or not request showing the start surface toolbar. */ - public void updateStartSurfaceToolbarState( - @StartSurfaceState int newState, boolean requestToShow) { + public void updateStartSurfaceToolbarState(@Nullable @StartSurfaceState Integer newState, + boolean requestToShow, @Nullable @LayoutType Integer newLayoutType) { if (mStartSurfaceToolbarCoordinator == null || mToolbarLayout.getToolbarDataProvider() == null) { return; } - mStartSurfaceToolbarCoordinator.onStartSurfaceStateChanged(newState, requestToShow); + assert (mIsStartSurfaceRefactorEnabled && newLayoutType != null) + || (!mIsStartSurfaceRefactorEnabled && newState != null); + mStartSurfaceToolbarCoordinator.onStartSurfaceStateChanged( + newState, requestToShow, newLayoutType); updateToolbarLayoutVisibility(); }
diff --git a/chrome/browser/ui/ash/in_session_auth_token_provider_impl.cc b/chrome/browser/ui/ash/in_session_auth_token_provider_impl.cc index 994a9ffd..7f5da878 100644 --- a/chrome/browser/ui/ash/in_session_auth_token_provider_impl.cc +++ b/chrome/browser/ui/ash/in_session_auth_token_provider_impl.cc
@@ -30,9 +30,8 @@ quick_unlock_storage->CreateAuthToken(*user_context); auto token = quick_unlock_storage->GetAuthToken()->GetUnguessableToken(); DCHECK(token.has_value()); - std::move(callback).Run( - token.value(), - base::Seconds(quick_unlock::AuthToken::kTokenExpirationSeconds)); + std::move(callback).Run(token.value(), + quick_unlock::AuthToken::kTokenExpiration); } } // namespace ash
diff --git a/chrome/browser/ui/ash/network/network_state_notifier_unittest.cc b/chrome/browser/ui/ash/network/network_state_notifier_unittest.cc index 38fe919..35336e9 100644 --- a/chrome/browser/ui/ash/network/network_state_notifier_unittest.cc +++ b/chrome/browser/ui/ash/network/network_state_notifier_unittest.cc
@@ -176,7 +176,7 @@ shill::kTypeWifi, shill::kStateIdle, true); service_test->SetServiceProperty(kWiFi1ServicePath, shill::kSecurityClassProperty, - base::Value(shill::kSecurityWep)); + base::Value(shill::kSecurityClassWep)); service_test->SetServiceProperty( kWiFi1ServicePath, shill::kConnectableProperty, base::Value(true)); service_test->SetServiceProperty(
diff --git a/chrome/browser/ui/ui_features.cc b/chrome/browser/ui/ui_features.cc index fa3ec49..64215ff 100644 --- a/chrome/browser/ui/ui_features.cc +++ b/chrome/browser/ui/ui_features.cc
@@ -136,6 +136,10 @@ const base::Feature kSidePanelJourneys{"SidePanelJourneys", base::FEATURE_DISABLED_BY_DEFAULT}; +// If enabled, and the main flag is also enabled, the Journeys omnibox +// entrypoints open Journeys in Side Panel rather than the History WebUI. +const base::FeatureParam<bool> kSidePanelJourneysOpensFromOmnibox{ + &kSidePanelJourneys, "SidePanelJourneysOpensFromOmnibox", false}; // Enables tabs to scroll in the tabstrip. https://crbug.com/951078 const base::Feature kScrollableTabStrip{"ScrollableTabStrip",
diff --git a/chrome/browser/ui/ui_features.h b/chrome/browser/ui/ui_features.h index 2a177528..475d71e 100644 --- a/chrome/browser/ui/ui_features.h +++ b/chrome/browser/ui/ui_features.h
@@ -60,6 +60,7 @@ extern const base::Feature kSidePanelImprovedClobbering; extern const base::Feature kSidePanelJourneys; +extern const base::FeatureParam<bool> kSidePanelJourneysOpensFromOmnibox; extern const base::Feature kSideSearch; extern const base::Feature kSideSearchFeedback;
diff --git a/chrome/browser/ui/views/extensions/extension_install_friction_dialog_view.cc b/chrome/browser/ui/views/extensions/extension_install_friction_dialog_view.cc index 8e511a3..8263862 100644 --- a/chrome/browser/ui/views/extensions/extension_install_friction_dialog_view.cc +++ b/chrome/browser/ui/views/extensions/extension_install_friction_dialog_view.cc
@@ -76,9 +76,6 @@ namespace { -// NOTE: This should be a shared constant, but none exist at the moment. -constexpr int kWarningIconSize = 24; - // These values are persisted to logs. Entries should not be renumbered and // numeric values should never be reused. enum class ExtensionInstallFrictionDialogAction { @@ -183,9 +180,9 @@ // override ui::ImageModel ExtensionInstallFrictionDialogView::GetWindowIcon() { - return ui::ImageModel::FromVectorIcon(vector_icons::kGppMaybeIcon, - ui::kColorAlertMediumSeverity, - kWarningIconSize); + return ui::ImageModel::FromVectorIcon( + vector_icons::kGppMaybeIcon, ui::kColorAlertMediumSeverity, + extension_misc::EXTENSION_ICON_SMALLISH); } void ExtensionInstallFrictionDialogView::OnLearnMoreLinkClicked() {
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index 8f3c0071..6eab4b8 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -3125,6 +3125,9 @@ } void BrowserView::ReparentTopContainerForEndOfImmersive() { + if (top_container()->parent() == this) + return; + overlay_view_->SetVisible(false); top_container()->DestroyLayer(); AddChildViewAt(top_container(), 0); @@ -3342,16 +3345,12 @@ #if BUILDFLAG(IS_MAC) views::View* BrowserView::CreateMacOverlayView() { views::Widget::InitParams params; - // Keep around overlay_widget_ and overlay_view_ until this - // BrowserView is deconstructed. overlay_view_ is used during BrowserView - // deconstruction. - // TODO(bur): Refactor usage of WIDGET_OWNS_NATIVE_WIDGET. - params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.type = views::Widget::InitParams::TYPE_POPUP; params.child = true; params.parent = GetWidget()->GetNativeView(); - overlay_widget_ = std::make_unique<ThemeCopyingWidget>(GetWidget()); + overlay_widget_ = new ThemeCopyingWidget(GetWidget()); overlay_widget_->Init(std::move(params)); + overlay_widget_->SetNativeWindowProperty(kBrowserViewKey, this); std::unique_ptr<TopContainerOverlayView> overlay_view = std::make_unique<TopContainerOverlayView>(weak_ptr_factory_.GetWeakPtr());
diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h index b17718e..ad8bf6e 100644 --- a/chrome/browser/ui/views/frame/browser_view.h +++ b/chrome/browser/ui/views/frame/browser_view.h
@@ -982,14 +982,18 @@ // The Toolbar containing the navigation buttons, menus and the address bar. raw_ptr<ToolbarView> toolbar_ = nullptr; - // The OverlayView for the widget, which is used to host |top_container_| + // The OverlayView for the widget, which is used to host `top_container_` // during immersive reveal. + // On Aura, this view is owned by the browser frame. On mac, this view is + // owned by `overlay_widget_`. std::unique_ptr<views::ViewTargeterDelegate> overlay_view_targeter_; raw_ptr<views::View> overlay_view_ = nullptr; #if BUILDFLAG(IS_MAC) - // Used when calling CreateMacOverlayView(). - std::unique_ptr<views::Widget> overlay_widget_; + // Used when calling CreateMacOverlayView(). This widget owns `overlay_view_`. + // Its content NSView will be reparented to a NSToolbarFullScreenWindow + // during fullscreen. + raw_ptr<views::Widget> overlay_widget_; #endif // The Bookmark Bar View for this window. Lazily created. May be null for
diff --git a/chrome/browser/ui/views/frame/browser_view_layout.cc b/chrome/browser/ui/views/frame/browser_view_layout.cc index c920e2ca8..5f1e08e 100644 --- a/chrome/browser/ui/views/frame/browser_view_layout.cc +++ b/chrome/browser/ui/views/frame/browser_view_layout.cc
@@ -75,7 +75,6 @@ } // namespace constexpr int BrowserViewLayout::kMainBrowserContentsMinimumWidth; -constexpr int BrowserViewLayout::kMainWebContentsMinimumWidth; class BrowserViewLayout::WebContentsModalDialogHostViews : public WebContentsModalDialogHost { @@ -433,6 +432,10 @@ return gfx::Size(); } +int BrowserViewLayout::GetMinWebContentsWidthForTesting() const { + return GetMinWebContentsWidth(); +} + ////////////////////////////////////////////////////////////////////////////// // BrowserViewLayout, private: @@ -632,10 +635,11 @@ // should never force the web contents to be smaller than its intended // minimum. gfx::Rect side_panel_bounds = contents_container_bounds; - side_panel_bounds.set_width(std::min( - side_panel->GetPreferredSize().width(), - contents_container_bounds.width() - kMainWebContentsMinimumWidth - - side_panel_separator->GetPreferredSize().width())); + + side_panel_bounds.set_width( + std::min(side_panel->GetPreferredSize().width(), + contents_container_bounds.width() - GetMinWebContentsWidth() - + side_panel_separator->GetPreferredSize().width())); // Shrink container bounds to fit the side panel. contents_container_bounds.set_width( @@ -761,6 +765,15 @@ : toolbar_->y(); } +int BrowserViewLayout::GetMinWebContentsWidth() const { + int min_width = + kMainBrowserContentsMinimumWidth - + right_aligned_side_panel_->GetMinimumSize().width() - + right_aligned_side_panel_separator_->GetPreferredSize().width(); + DCHECK_GE(min_width, 0); + return min_width; +} + bool BrowserViewLayout::IsInfobarVisible() const { // NOTE: Can't check if the size IsEmpty() since it's always 0-width. return infobar_container_->GetPreferredSize().height() != 0;
diff --git a/chrome/browser/ui/views/frame/browser_view_layout.h b/chrome/browser/ui/views/frame/browser_view_layout.h index 58d53e4..4b21a2d 100644 --- a/chrome/browser/ui/views/frame/browser_view_layout.h +++ b/chrome/browser/ui/views/frame/browser_view_layout.h
@@ -47,10 +47,6 @@ // not specified). This value is used for the main browser window only, not // for popups. static constexpr int kMainBrowserContentsMinimumWidth = 500; - // The minimum width for the web contents area. This applies to web contents - // only, rather than the full browser contents which includes the side panel - // and other surfaces. - static constexpr int kMainWebContentsMinimumWidth = 150; // |browser_view| may be null in tests. BrowserViewLayout(std::unique_ptr<BrowserViewLayoutDelegate> delegate, @@ -118,6 +114,9 @@ gfx::Size GetMinimumSize(const views::View* host) const override; gfx::Size GetPreferredSize(const views::View* host) const override; + // Returns the minimum acceptable width for the browser web contents. + int GetMinWebContentsWidthForTesting() const; + // Returns true if an infobar is showing. bool IsInfobarVisible() const; @@ -160,6 +159,9 @@ // Returns the y coordinate of the client area. int GetClientAreaTop(); + // Returns the minimum acceptable width for the browser web contents. + int GetMinWebContentsWidth() const; + // The delegate interface. May be a mock in tests. const std::unique_ptr<BrowserViewLayoutDelegate> delegate_;
diff --git a/chrome/browser/ui/views/frame/immersive_mode_controller_mac.mm b/chrome/browser/ui/views/frame/immersive_mode_controller_mac.mm index 8277ac5..072b4635 100644 --- a/chrome/browser/ui/views/frame/immersive_mode_controller_mac.mm +++ b/chrome/browser/ui/views/frame/immersive_mode_controller_mac.mm
@@ -177,6 +177,12 @@ base::scoped_nsobject<ImmersiveModeTitlebarViewController> immersive_mode_titlebar_view_controller_; base::scoped_nsobject<ImmersiveModeMapper> immersive_mode_mapper_; + base::ScopedObservation<views::View, views::ViewObserver> + top_container_observation_{this}; + base::ScopedObservation<views::Widget, views::WidgetObserver> + browser_frame_observation_{this}; + base::ScopedObservation<views::Widget, views::WidgetObserver> + overlay_widget_observation_{this}; // Used to keep track of the update of kShowFullscreenToolbar preference. BooleanPrefMember show_fullscreen_toolbar_; @@ -247,8 +253,9 @@ enabled_ = enabled; if (enabled) { browser_view_->GetWidget()->GetFocusManager()->AddFocusChangeListener(this); - browser_view_->GetWidget()->AddObserver(this); - browser_view_->top_container()->AddObserver(this); + top_container_observation_.Observe(browser_view_->top_container()); + browser_frame_observation_.Observe(browser_view_->GetWidget()); + overlay_widget_observation_.Observe(browser_view_->overlay_widget()); // Create a new NSTitlebarAccessoryViewController that will host the // overlay_view_. @@ -297,8 +304,15 @@ } else { browser_view_->GetWidget()->GetFocusManager()->RemoveFocusChangeListener( this); - browser_view_->GetWidget()->RemoveObserver(this); - browser_view_->top_container()->RemoveObserver(this); + top_container_observation_.Reset(); + browser_frame_observation_.Reset(); + overlay_widget_observation_.Reset(); + + // Notify BrowserView about the fullscreen exit so that the top container + // can be reparented, otherwise it might be destroyed along with the + // overlay widget. + for (Observer& observer : observers_) + observer.OnImmersiveFullscreenExited(); // Rollback the view shuffling from enablement. browser_view_->overlay_widget()->Hide();
diff --git a/chrome/browser/ui/views/lens/lens_side_panel_helper.cc b/chrome/browser/ui/views/lens/lens_side_panel_helper.cc index a750cf0..d6dfbb2 100644 --- a/chrome/browser/ui/views/lens/lens_side_panel_helper.cc +++ b/chrome/browser/ui/views/lens/lens_side_panel_helper.cc
@@ -3,6 +3,7 @@ // found in the LICENSE file. #include "chrome/browser/ui/lens/lens_side_panel_helper.h" + #include "chrome/browser/ui/ui_features.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/frame/top_container_view.h" @@ -10,7 +11,6 @@ #include "chrome/browser/ui/views/lens/lens_side_panel_controller.h" #include "chrome/browser/ui/views/side_panel/lens/lens_side_panel_coordinator.h" #include "chrome/browser/ui/views/side_panel/side_panel_coordinator.h" -#include "chrome/browser/ui/views/toolbar/toolbar_view.h" #include "components/lens/lens_entrypoints.h" #include "components/lens/lens_features.h" #include "content/public/browser/navigation_handle.h" @@ -60,11 +60,10 @@ Browser* browser, base::OnceClosure close_callback, base::OnceClosure escape_callback) { - // Our anchor should be the browser view's toolbar so we can position under - // it and get appropriate coordinates when the toolbar is hidden and the web - // contents fill the entire page. + // Our anchor should be the browser view's top container view. This includes + // views such as the toolbar, tab strip, etc. views::View* anchor = - BrowserView::GetBrowserViewForBrowser(browser)->toolbar(); + BrowserView::GetBrowserViewForBrowser(browser)->top_container(); return views::BubbleDialogDelegateView::CreateBubble( std::make_unique<LensRegionSearchInstructionsView>( anchor, std::move(close_callback), std::move(escape_callback)));
diff --git a/chrome/browser/ui/views/side_panel/history_clusters/history_clusters_side_panel_coordinator.cc b/chrome/browser/ui/views/side_panel/history_clusters/history_clusters_side_panel_coordinator.cc index 16c000acd..5f5f2e5 100644 --- a/chrome/browser/ui/views/side_panel/history_clusters/history_clusters_side_panel_coordinator.cc +++ b/chrome/browser/ui/views/side_panel/history_clusters/history_clusters_side_panel_coordinator.cc
@@ -30,8 +30,7 @@ global_registry->Register(std::make_unique<SidePanelEntry>( SidePanelEntry::Id::kHistoryClusters, l10n_util::GetStringUTF16(IDS_HISTORY_CLUSTERS_JOURNEYS_TAB_LABEL), - ui::ImageModel::FromVectorIcon(kJourneysIcon, ui::kColorIcon, - /*icon_size=*/16), + ui::ImageModel::FromVectorIcon(kJourneysIcon, ui::kColorIcon), base::BindRepeating( &HistoryClustersSidePanelCoordinator::CreateHistoryClustersWebView, base::Unretained(this))));
diff --git a/chrome/browser/ui/views/side_panel/side_panel.cc b/chrome/browser/ui/views/side_panel/side_panel.cc index 2878313..c1e5b08 100644 --- a/chrome/browser/ui/views/side_panel/side_panel.cc +++ b/chrome/browser/ui/views/side_panel/side_panel.cc
@@ -179,7 +179,7 @@ // TODO(pbos): Reconsider if SetPanelWidth() should add borders, if so move // accounting for the border into SetPanelWidth(), otherwise remove this TODO. - SetPanelWidth(GetMinimumWidth()); + SetPanelWidth(GetMinimumSize().width()); SetBorder(views::CreateEmptyBorder(kBorderInsets)); @@ -207,9 +207,11 @@ return GetHorizontalAlignment() == kAlignRight; } -int SidePanel::GetMinimumWidth() { +gfx::Size SidePanel::GetMinimumSize() const { const int min_side_panel_contents_width = 320; - return min_side_panel_contents_width + kBorderInsets.width(); + const int min_height = 0; + return gfx::Size(min_side_panel_contents_width + kBorderInsets.width(), + min_height); } void SidePanel::ChildVisibilityChanged(View* child) { @@ -242,7 +244,7 @@ if (done_resizing) { starting_width_on_resize_ = -1; } - const int minimum_width = GetMinimumWidth(); + const int minimum_width = GetMinimumSize().width(); if (proposed_width < minimum_width) { proposed_width = minimum_width; }
diff --git a/chrome/browser/ui/views/side_panel/side_panel.h b/chrome/browser/ui/views/side_panel/side_panel.h index 0e0e2c6..ee4a525 100644 --- a/chrome/browser/ui/views/side_panel/side_panel.h +++ b/chrome/browser/ui/views/side_panel/side_panel.h
@@ -36,7 +36,7 @@ void SetHorizontalAlignment(HorizontalAlignment alignment); HorizontalAlignment GetHorizontalAlignment(); bool IsRightAligned(); - int GetMinimumWidth(); + gfx::Size GetMinimumSize() const override; // views::ResizeAreaDelegate: void OnResize(int resize_amount, bool done_resizing) override;
diff --git a/chrome/browser/ui/views/side_panel/side_panel_coordinator_unittest.cc b/chrome/browser/ui/views/side_panel/side_panel_coordinator_unittest.cc index 5dae7c7..7893abe 100644 --- a/chrome/browser/ui/views/side_panel/side_panel_coordinator_unittest.cc +++ b/chrome/browser/ui/views/side_panel/side_panel_coordinator_unittest.cc
@@ -179,13 +179,18 @@ const int large_increment = 1000000000; browser_view()->right_aligned_side_panel()->OnResize(large_increment, true); browser_view()->Layout(); - EXPECT_EQ(browser_view()->right_aligned_side_panel()->width(), - browser_view()->right_aligned_side_panel()->GetMinimumWidth()); + EXPECT_EQ( + browser_view()->right_aligned_side_panel()->width(), + browser_view()->right_aligned_side_panel()->GetMinimumSize().width()); browser_view()->right_aligned_side_panel()->OnResize(-large_increment, true); browser_view()->Layout(); + BrowserViewLayout* layout_manager = + static_cast<BrowserViewLayout*>(browser_view()->GetLayoutManager()); + const int min_web_contents_width = + layout_manager->GetMinWebContentsWidthForTesting(); EXPECT_EQ(browser_view()->contents_web_view()->width(), - BrowserViewLayout::kMainWebContentsMinimumWidth); + min_web_contents_width); } TEST_F(SidePanelCoordinatorTest, ChangeSidePanelAlignment) {
diff --git a/chrome/browser/ui/webui/apc_internals/apc_internals_handler.cc b/chrome/browser/ui/webui/apc_internals/apc_internals_handler.cc index 422ad52..5a0e0b8f 100644 --- a/chrome/browser/ui/webui/apc_internals/apc_internals_handler.cc +++ b/chrome/browser/ui/webui/apc_internals/apc_internals_handler.cc
@@ -114,23 +114,22 @@ AllowJavascript(); // Provide information for initial page creation. - FireWebUIListener("on-flags-information-received", - base::Value(GetAPCRelatedFlags())); + FireWebUIListener("on-flags-information-received", GetAPCRelatedFlags()); FireWebUIListener("on-script-fetching-information-received", - base::Value(GetPasswordScriptFetcherInformation())); + GetPasswordScriptFetcherInformation()); UpdateAutofillAssistantInformation(); OnRefreshScriptCacheRequested(base::Value::List()); } void APCInternalsHandler::UpdateAutofillAssistantInformation() { FireWebUIListener("on-autofill-assistant-information-received", - base::Value(GetAutofillAssistantInformation())); + GetAutofillAssistantInformation()); } void APCInternalsHandler::OnScriptCacheRequested( const base::Value::List& args) { FireWebUIListener("on-script-cache-received", - base::Value(GetPasswordScriptFetcherCache())); + GetPasswordScriptFetcherCache()); } void APCInternalsHandler::OnRefreshScriptCacheRequested( @@ -198,10 +197,10 @@ for (const auto& [param_name, param_state] : params) feature_params.Set(param_name, param_state); - feature_entry.Set("parameters", base::Value(std::move(feature_params))); + feature_entry.Set("parameters", std::move(feature_params)); } } - relevant_features.Append(base::Value(std::move(feature_entry))); + relevant_features.Append(std::move(feature_entry)); } return relevant_features; }
diff --git a/chrome/browser/ui/webui/browser_switch/browser_switch_ui.cc b/chrome/browser/ui/webui/browser_switch/browser_switch_ui.cc index 6ebf0b8..6180204 100644 --- a/chrome/browser/ui/webui/browser_switch/browser_switch_ui.cc +++ b/chrome/browser/ui/webui/browser_switch/browser_switch_ui.cc
@@ -447,7 +447,7 @@ RuleSetToDict(*service->sitelist()->GetExternalGreylist()); retval.Set("external_greylist", std::move(external_greylist_dict)); - ResolveJavascriptCallback(args[0], base::Value(std::move(retval))); + ResolveJavascriptCallback(args[0], retval); } void BrowserSwitchHandler::HandleGetDecision(const base::Value::List& args) { @@ -492,7 +492,7 @@ retval.Set("matching_rule", decision.matching_rule->ToString()); } - ResolveJavascriptCallback(args[0], base::Value(std::move(retval))); + ResolveJavascriptCallback(args[0], retval); } void BrowserSwitchHandler::HandleGetTimestamps(const base::Value::List& args) { @@ -510,7 +510,7 @@ retval.Set("last_fetch", downloader->last_refresh_time().ToJsTime()); retval.Set("next_fetch", downloader->next_refresh_time().ToJsTime()); - ResolveJavascriptCallback(args[0], base::Value(std::move(retval))); + ResolveJavascriptCallback(args[0], retval); } void BrowserSwitchHandler::HandleGetRulesetSources( @@ -531,7 +531,7 @@ // "browser_switcher.blah" as a key in the object, not a nested hierarchy. retval.Set(source.pref_name, std::move(val)); } - ResolveJavascriptCallback(args[0], base::Value(std::move(retval))); + ResolveJavascriptCallback(args[0], retval); } void BrowserSwitchHandler::HandleRefreshXml(const base::Value::List& args) {
diff --git a/chrome/browser/ui/webui/certificate_provisioning_ui_handler.cc b/chrome/browser/ui/webui/certificate_provisioning_ui_handler.cc index a74008f..85ce273 100644 --- a/chrome/browser/ui/webui/certificate_provisioning_ui_handler.cc +++ b/chrome/browser/ui/webui/certificate_provisioning_ui_handler.cc
@@ -231,33 +231,30 @@ void CertificateProvisioningUiHandler::GotStatus( std::vector<crosapi::mojom::CertProvisioningProcessStatusPtr> status) { - base::ListValue all_processes; + base::Value::List all_processes; for (auto& process : status) { - base::Value entry(base::Value::Type::DICTIONARY); - entry.SetStringKey("certProfileId", std::move(process->cert_profile_id)); - entry.SetStringKey("certProfileName", - std::move(process->cert_profile_name)); - entry.SetBoolKey("isDeviceWide", process->is_device_wide); - entry.SetStringKey("timeSinceLastUpdate", - GetTimeSinceLastUpdate(process->last_update_time)); - entry.SetStringKey( - "lastUnsuccessfulMessage", - GetMessageFromBackendError(process->last_backend_server_error)); - entry.SetIntKey("stateId", static_cast<int>(process->state)); - entry.SetStringKey("status", - MakeStatusMessage(process->did_fail, process->state, - process->failure_message)); - entry.SetStringKey("publicKey", - x509_certificate_model::ProcessRawSubjectPublicKeyInfo( - process->public_key)); + base::Value::Dict entry; + entry.Set("certProfileId", std::move(process->cert_profile_id)); + entry.Set("certProfileName", std::move(process->cert_profile_name)); + entry.Set("isDeviceWide", process->is_device_wide); + entry.Set("timeSinceLastUpdate", + GetTimeSinceLastUpdate(process->last_update_time)); + entry.Set("lastUnsuccessfulMessage", + GetMessageFromBackendError(process->last_backend_server_error)); + entry.Set("stateId", static_cast<int>(process->state)); + entry.Set("status", MakeStatusMessage(process->did_fail, process->state, + process->failure_message)); + entry.Set("publicKey", + x509_certificate_model::ProcessRawSubjectPublicKeyInfo( + process->public_key)); all_processes.Append(std::move(entry)); } ++ui_refresh_count_for_testing_; FireWebUIListener("certificate-provisioning-processes-changed", - std::move(all_processes)); + all_processes); } } // namespace chromeos::cert_provisioning
diff --git a/chrome/browser/ui/webui/certificate_viewer_webui.cc b/chrome/browser/ui/webui/certificate_viewer_webui.cc index 3ee056b..f0f5e32 100644 --- a/chrome/browser/ui/webui/certificate_viewer_webui.cc +++ b/chrome/browser/ui/webui/certificate_viewer_webui.cc
@@ -65,57 +65,56 @@ CertNodeBuilder& Payload(base::StringPiece payload); // Adds |child| in the list keyed "children". Can be called multiple times. - CertNodeBuilder& Child(std::unique_ptr<base::DictionaryValue> child); + CertNodeBuilder& Child(base::Value::Dict child); // Similar to Child, but if the argument is null, then this does not add // anything. - CertNodeBuilder& ChildIfNotNull(std::unique_ptr<base::DictionaryValue> child); + CertNodeBuilder& ChildIfNotNullopt(absl::optional<base::Value::Dict> child); - // Creates a DictionaryValue representation of the collected information. Only - // call this once. - std::unique_ptr<base::DictionaryValue> Build(); + // Creates a base::Value::Dict representation of the collected information. + // Only call this once. + base::Value::Dict Build(); private: - base::DictionaryValue node_; - base::ListValue children_; + base::Value::Dict node_; + base::Value::List children_; // |built_| is false until Build() is called. Once it is |true|, |node_| and // |children_| are no longer valid for use. bool built_ = false; }; CertNodeBuilder::CertNodeBuilder(base::StringPiece label) { - node_.SetStringKey("label", label); + node_.Set("label", label); } CertNodeBuilder::CertNodeBuilder(int label_id) : CertNodeBuilder(l10n_util::GetStringUTF8(label_id)) {} CertNodeBuilder& CertNodeBuilder::Payload(base::StringPiece payload) { - DCHECK(!node_.FindPath("payload.val")); - node_.SetStringPath("payload.val", payload); + DCHECK(!node_.FindByDottedPath("payload.val")); + node_.SetByDottedPath("payload.val", payload); return *this; } -CertNodeBuilder& CertNodeBuilder::Child( - std::unique_ptr<base::DictionaryValue> child) { - children_.Append(base::Value::FromUniquePtrValue(std::move(child))); +CertNodeBuilder& CertNodeBuilder::Child(base::Value::Dict child) { + children_.Append(std::move(child)); return *this; } -CertNodeBuilder& CertNodeBuilder::ChildIfNotNull( - std::unique_ptr<base::DictionaryValue> child) { +CertNodeBuilder& CertNodeBuilder::ChildIfNotNullopt( + absl::optional<base::Value::Dict> child) { if (child) - return Child(std::move(child)); + return Child(std::move(*child)); return *this; } -std::unique_ptr<base::DictionaryValue> CertNodeBuilder::Build() { +base::Value::Dict CertNodeBuilder::Build() { DCHECK(!built_); - if (!children_.GetListDeprecated().empty()) { - node_.SetKey("children", std::move(children_)); + if (!children_.empty()) { + node_.Set("children", std::move(children_)); } built_ = true; - return std::make_unique<base::DictionaryValue>(std::move(node_)); + return std::move(node_); } } // namespace @@ -257,11 +256,11 @@ // Certificate information. The keys in this dictionary's general key // correspond to the IDs in the Html page. - base::DictionaryValue cert_info; + base::Value::Dict cert_info; const x509_certificate_model::X509CertificateModel& model = certs_.front(); - cert_info.SetBoolean("isError", !model.is_valid()); - cert_info.SetStringPath( + cert_info.Set("isError", !model.is_valid()); + cert_info.SetByDottedPath( "general.title", l10n_util::GetStringFUTF8(IDS_CERT_INFO_DIALOG_TITLE, base::UTF8ToUTF16(model.GetTitle()))); @@ -272,21 +271,22 @@ l10n_util::GetStringUTF8(IDS_CERT_INFO_FIELD_NOT_PRESENT); // Issued to information. - cert_info.SetStringPath( + cert_info.SetByDottedPath( "general.issued-cn", HandleOptionalOrError(model.GetSubjectCommonName())); - cert_info.SetStringPath("general.issued-o", - HandleOptionalOrError(model.GetSubjectOrgName())); - cert_info.SetStringPath( + cert_info.SetByDottedPath("general.issued-o", + HandleOptionalOrError(model.GetSubjectOrgName())); + cert_info.SetByDottedPath( "general.issued-ou", HandleOptionalOrError(model.GetSubjectOrgUnitName())); // Issuer information. - cert_info.SetStringPath("general.issuer-cn", - HandleOptionalOrError(model.GetIssuerCommonName())); - cert_info.SetStringPath("general.issuer-o", - HandleOptionalOrError(model.GetIssuerOrgName())); - cert_info.SetStringPath( + cert_info.SetByDottedPath( + "general.issuer-cn", + HandleOptionalOrError(model.GetIssuerCommonName())); + cert_info.SetByDottedPath("general.issuer-o", + HandleOptionalOrError(model.GetIssuerOrgName())); + cert_info.SetByDottedPath( "general.issuer-ou", HandleOptionalOrError(model.GetIssuerOrgUnitName())); @@ -302,32 +302,32 @@ issued_str = alternative_text; expires_str = alternative_text; } - cert_info.SetStringPath("general.issue-date", issued_str); - cert_info.SetStringPath("general.expiry-date", expires_str); + cert_info.SetByDottedPath("general.issue-date", issued_str); + cert_info.SetByDottedPath("general.expiry-date", expires_str); } - cert_info.SetStringPath("general.sha256", - model.HashCertSHA256WithSeparators()); - cert_info.SetStringPath("general.sha1", model.HashCertSHA1WithSeparators()); + cert_info.SetByDottedPath("general.sha256", + model.HashCertSHA256WithSeparators()); + cert_info.SetByDottedPath("general.sha1", model.HashCertSHA1WithSeparators()); // Certificate hierarchy is constructed from bottom up. - base::Value children; + base::Value::List children; int index = 0; for (const auto& cert : certs_) { - base::Value cert_node(base::Value::Type::DICTIONARY); - cert_node.SetKey("label", base::Value(cert.GetTitle())); - cert_node.SetPath({"payload", "index"}, base::Value(index)); + base::Value::Dict cert_node; + cert_node.Set("label", base::Value(cert.GetTitle())); + cert_node.SetByDottedPath("payload.index", base::Value(index)); // Add the child from the previous iteration. - if (!children.is_none()) - cert_node.SetKey("children", std::move(children)); + if (!children.empty()) + cert_node.Set("children", std::move(children)); // Add this node to the children list for the next iteration. - children = base::Value(base::Value::Type::LIST); + children = base::Value::List(); children.Append(std::move(cert_node)); ++index; } // Set the last node as the top of the certificate hierarchy. - cert_info.SetKey("hierarchy", std::move(children)); + cert_info.Set("hierarchy", std::move(children)); base::JSONWriter::Write(cert_info, &data); @@ -423,7 +423,7 @@ l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_CRITICAL), l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_NON_CRITICAL)); - std::unique_ptr<base::DictionaryValue> details_extensions; + absl::optional<base::Value::Dict> details_extensions; if (!extensions.empty()) { CertNodeBuilder details_extensions_builder(IDS_CERT_DETAILS_EXTENSIONS); for (const x509_certificate_model::Extension& extension : extensions) { @@ -468,7 +468,7 @@ .Build()) .Build()) // Extensions. - .ChildIfNotNull(std::move(details_extensions)) + .ChildIfNotNullopt(std::move(details_extensions)) .Child(CertNodeBuilder(IDS_CERT_DETAILS_CERTIFICATE_SIG_ALG) .Payload(model.ProcessSecAlgorithmSignatureWrap()) .Build()) @@ -488,12 +488,11 @@ .Build()); base::Value::List root_list; - root_list.Append( - base::Value::FromUniquePtrValue(CertNodeBuilder(model.GetTitle()) - .Child(contents_builder.Build()) - .Build())); + root_list.Append(CertNodeBuilder(model.GetTitle()) + .Child(contents_builder.Build()) + .Build()); // Send certificate information to javascript. - ResolveJavascriptCallback(callback_id, base::Value(std::move(root_list))); + ResolveJavascriptCallback(callback_id, root_list); } int CertificateViewerDialogHandler::GetCertificateIndex(
diff --git a/chrome/browser/ui/webui/certificates_handler.cc b/chrome/browser/ui/webui/certificates_handler.cc index 6ac51bd..ae680f4 100644 --- a/chrome/browser/ui/webui/certificates_handler.cc +++ b/chrome/browser/ui/webui/certificates_handler.cc
@@ -92,19 +92,14 @@ bool operator()(const base::Value& a, const base::Value& b) const { DCHECK(a.type() == base::Value::Type::DICTIONARY); DCHECK(b.type() == base::Value::Type::DICTIONARY); - const base::DictionaryValue* a_dict; - bool a_is_dictionary = a.GetAsDictionary(&a_dict); - DCHECK(a_is_dictionary); - const base::DictionaryValue* b_dict; - bool b_is_dictionary = b.GetAsDictionary(&b_dict); - DCHECK(b_is_dictionary); + const base::Value::Dict& a_dict = a.GetDict(); + const base::Value::Dict& b_dict = b.GetDict(); std::u16string a_str; std::u16string b_str; - const std::string* ptr = - a_dict->GetDict().FindString(kCertificatesHandlerNameField); + const std::string* ptr = a_dict.FindString(kCertificatesHandlerNameField); if (ptr) a_str = base::UTF8ToUTF16(*ptr); - ptr = b_dict->GetDict().FindString(kCertificatesHandlerNameField); + ptr = b_dict.FindString(kCertificatesHandlerNameField); if (ptr) b_str = base::UTF8ToUTF16(*ptr); if (collator_ == nullptr) @@ -443,18 +438,17 @@ net::NSSCertDatabase::TrustBits trust_bits = certificate_manager_model_->cert_db()->GetCertTrust(cert_info->cert(), net::CA_CERT); - std::unique_ptr<base::DictionaryValue> ca_trust_info( - new base::DictionaryValue); - ca_trust_info->GetDict().Set( + base::Value::Dict ca_trust_info; + ca_trust_info.Set( kCertificatesHandlerSslField, static_cast<bool>(trust_bits & net::NSSCertDatabase::TRUSTED_SSL)); - ca_trust_info->GetDict().Set( + ca_trust_info.Set( kCertificatesHandlerEmailField, static_cast<bool>(trust_bits & net::NSSCertDatabase::TRUSTED_EMAIL)); - ca_trust_info->GetDict().Set( + ca_trust_info.Set( kCertificatesHandlerObjSignField, static_cast<bool>(trust_bits & net::NSSCertDatabase::TRUSTED_OBJ_SIGN)); - ResolveCallback(*ca_trust_info); + ResolveCallback(ca_trust_info); } void CertificatesHandler::HandleEditCATrust(const base::Value::List& args) { @@ -1070,18 +1064,16 @@ certificate_manager_model_->FilterAndBuildOrgGroupingMap(type, &org_grouping_map); - base::ListValue nodes; + base::Value::List nodes; for (auto& org_grouping_map_entry : org_grouping_map) { // Populate first level (org name). - base::DictionaryValue org_dict; - org_dict.GetDict().Set( - kCertificatesHandlerKeyField, - base::Value(OrgNameToId(org_grouping_map_entry.first))); - org_dict.GetDict().Set(kCertificatesHandlerNameField, - base::Value(org_grouping_map_entry.first)); + base::Value::Dict org_dict; + org_dict.Set(kCertificatesHandlerKeyField, + OrgNameToId(org_grouping_map_entry.first)); + org_dict.Set(kCertificatesHandlerNameField, org_grouping_map_entry.first); // Populate second level (certs). - base::ListValue subnodes; + base::Value::List subnodes; bool contains_policy_certs = false; for (auto& org_cert : org_grouping_map_entry.second) { // Move the CertInfo into |cert_info_id_map_|. @@ -1089,27 +1081,24 @@ std::string id = base::NumberToString(cert_info_id_map_.Add(std::move(org_cert))); - base::DictionaryValue cert_dict; - cert_dict.GetDict().Set(kCertificatesHandlerKeyField, base::Value(id)); - cert_dict.GetDict().Set(kCertificatesHandlerNameField, - base::Value(cert_info->name())); - cert_dict.GetDict().Set(kCertificatesHandlerCanBeDeletedField, - base::Value(CanDeleteCertificate(cert_info))); - cert_dict.GetDict().Set(kCertificatesHandlerCanBeEditedField, - base::Value(CanEditCertificate(cert_info))); - cert_dict.GetDict().Set(kCertificatesHandlerUntrustedField, - base::Value(cert_info->untrusted())); - cert_dict.GetDict().Set( - kCertificatesHandlerPolicyInstalledField, - base::Value(cert_info->source() == - CertificateManagerModel::CertInfo::Source::kPolicy)); - cert_dict.GetDict().Set(kCertificatesHandlerWebTrustAnchorField, - base::Value(cert_info->web_trust_anchor())); + base::Value::Dict cert_dict; + cert_dict.Set(kCertificatesHandlerKeyField, id); + cert_dict.Set(kCertificatesHandlerNameField, cert_info->name()); + cert_dict.Set(kCertificatesHandlerCanBeDeletedField, + CanDeleteCertificate(cert_info)); + cert_dict.Set(kCertificatesHandlerCanBeEditedField, + CanEditCertificate(cert_info)); + cert_dict.Set(kCertificatesHandlerUntrustedField, cert_info->untrusted()); + cert_dict.Set(kCertificatesHandlerPolicyInstalledField, + cert_info->source() == + CertificateManagerModel::CertInfo::Source::kPolicy); + cert_dict.Set(kCertificatesHandlerWebTrustAnchorField, + cert_info->web_trust_anchor()); // TODO(hshi): This should be determined by testing for PKCS #11 // CKA_EXTRACTABLE attribute. We may need to use the NSS function // PK11_ReadRawAttribute to do that. - cert_dict.GetDict().Set(kCertificatesHandlerExtractableField, - base::Value(!cert_info->hardware_backed())); + cert_dict.Set(kCertificatesHandlerExtractableField, + !cert_info->hardware_backed()); // TODO(mattm): Other columns. subnodes.Append(std::move(cert_dict)); @@ -1117,31 +1106,27 @@ cert_info->source() == CertificateManagerModel::CertInfo::Source::kPolicy; } - std::sort(subnodes.GetListDeprecated().begin(), - subnodes.GetListDeprecated().end(), comparator); + std::sort(subnodes.begin(), subnodes.end(), comparator); - org_dict.GetDict().Set(kCertificatesHandlerContainsPolicyCertsField, - base::Value(contains_policy_certs)); - org_dict.GetDict().Set(kCertificatesHandlerSubnodesField, - std::move(subnodes)); + org_dict.Set(kCertificatesHandlerContainsPolicyCertsField, + contains_policy_certs); + org_dict.Set(kCertificatesHandlerSubnodesField, std::move(subnodes)); nodes.Append(std::move(org_dict)); } - std::sort(nodes.GetListDeprecated().begin(), nodes.GetListDeprecated().end(), - comparator); + std::sort(nodes.begin(), nodes.end(), comparator); if (IsJavascriptAllowed()) { - FireWebUIListener("certificates-changed", base::Value(tab_name), - std::move(nodes)); + FireWebUIListener("certificates-changed", base::Value(tab_name), nodes); } } -void CertificatesHandler::ResolveCallback(const base::Value& response) { +void CertificatesHandler::ResolveCallback(const base::ValueView response) { DCHECK(!webui_callback_id_.empty()); ResolveJavascriptCallback(base::Value(webui_callback_id_), response); webui_callback_id_.clear(); } -void CertificatesHandler::RejectCallback(const base::Value& response) { +void CertificatesHandler::RejectCallback(const base::ValueView response) { DCHECK(!webui_callback_id_.empty()); RejectJavascriptCallback(base::Value(webui_callback_id_), response); webui_callback_id_.clear(); @@ -1149,10 +1134,10 @@ void CertificatesHandler::RejectCallbackWithError(const std::string& title, const std::string& error) { - std::unique_ptr<base::DictionaryValue> error_info(new base::DictionaryValue); - error_info->GetDict().Set(kCertificatesHandlerErrorTitle, title); - error_info->GetDict().Set(kCertificatesHandlerErrorDescription, error); - RejectCallback(*error_info); + base::Value::Dict error_info; + error_info.Set(kCertificatesHandlerErrorTitle, title); + error_info.Set(kCertificatesHandlerErrorDescription, error); + RejectCallback(error_info); } void CertificatesHandler::RejectCallbackWithImportError( @@ -1184,8 +1169,8 @@ error_info.Set(kCertificatesHandlerErrorTitle, title); error_info.Set(kCertificatesHandlerErrorDescription, error); error_info.Set(kCertificatesHandlerCertificateErrors, - base::Value(std::move(cert_error_list))); - RejectCallback(base::Value(std::move(error_info))); + std::move(cert_error_list)); + RejectCallback(error_info); } gfx::NativeWindow CertificatesHandler::GetParentWindow() {
diff --git a/chrome/browser/ui/webui/certificates_handler.h b/chrome/browser/ui/webui/certificates_handler.h index 1e754fc..93bb471 100644 --- a/chrome/browser/ui/webui/certificates_handler.h +++ b/chrome/browser/ui/webui/certificates_handler.h
@@ -179,8 +179,8 @@ // Populate the given tab's tree. void PopulateTree(const std::string& tab_name, net::CertType type); - void ResolveCallback(const base::Value& response); - void RejectCallback(const base::Value& response); + void ResolveCallback(const base::ValueView response); + void RejectCallback(const base::ValueView response); // Reject the pending JS callback with a generic error. void RejectCallbackWithError(const std::string& title,
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc index 1726a22..32824fe 100644 --- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc +++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -932,13 +932,15 @@ return &NewWebUI<chromeos::UrgentPasswordExpiryNotificationUI>; } if (url.host_piece() == chrome::kChromeUILockScreenStartReauthHost) { - if (!ash::features::IsSamlReauthenticationOnLockscreenEnabled()) { + if (!ash::features::IsSamlReauthenticationOnLockscreenEnabled() || + !ash::ProfileHelper::IsLockScreenProfile(profile)) { return nullptr; } return &NewWebUI<chromeos::LockScreenStartReauthUI>; } if (url.host_piece() == chrome::kChromeUILockScreenNetworkHost) { - if (!ash::features::IsSamlReauthenticationOnLockscreenEnabled()) { + if (!ash::features::IsSamlReauthenticationOnLockscreenEnabled() || + !ash::ProfileHelper::IsLockScreenProfile(profile)) { return nullptr; } return &NewWebUI<chromeos::LockScreenNetworkUI>;
diff --git a/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.cc b/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.cc index a45e6fea..016931d 100644 --- a/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.cc +++ b/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.cc
@@ -178,16 +178,13 @@ } parent_signin_callback_id_ = args[0].GetString(); - const base::DictionaryValue* parent = nullptr; - args[1].GetAsDictionary(&parent); - CHECK(parent); - const base::Value* obfuscated_gaia_id_value = - parent->GetDict().Find(kObfuscatedGaiaIdKey); - DCHECK(obfuscated_gaia_id_value); - std::string obfuscated_gaia_id = obfuscated_gaia_id_value->GetString(); + const base::Value::Dict& parent = args[1].GetDict(); + const std::string* obfuscated_gaia_id = + parent.FindString(kObfuscatedGaiaIdKey); + DCHECK(obfuscated_gaia_id); const std::string* password = args[2].GetIfString(); - FetchAccessToken(obfuscated_gaia_id, password ? *password : std::string()); + FetchAccessToken(*obfuscated_gaia_id, password ? *password : std::string()); } void EduAccountLoginHandler::FetchFamilyMembers() { @@ -205,7 +202,7 @@ } void EduAccountLoginHandler::FetchParentImages( - base::ListValue parents, + base::Value::List parents, std::map<std::string, GURL> profile_image_urls) { DCHECK(!profile_image_fetcher_); image_fetcher::ImageFetcher* fetcher = @@ -259,7 +256,7 @@ void EduAccountLoginHandler::OnGetFamilyMembersSuccess( const std::vector<FamilyInfoFetcher::FamilyMember>& members) { family_fetcher_.reset(); - base::ListValue parents; + base::Value::List parents; std::map<std::string, GURL> profile_image_urls; for (const auto& member : members) { @@ -268,10 +265,10 @@ continue; } - base::DictionaryValue parent; - parent.GetDict().Set("email", member.email); - parent.GetDict().Set("displayName", member.display_name); - parent.GetDict().Set(kObfuscatedGaiaIdKey, member.obfuscated_gaia_id); + base::Value::Dict parent; + parent.Set("email", member.email); + parent.Set("displayName", member.display_name); + parent.Set(kObfuscatedGaiaIdKey, member.obfuscated_gaia_id); parents.Append(std::move(parent)); profile_image_urls[member.obfuscated_gaia_id] = @@ -284,16 +281,16 @@ void EduAccountLoginHandler::OnFailure(FamilyInfoFetcher::ErrorCode error) { family_fetcher_.reset(); RejectJavascriptCallback(base::Value(get_parents_callback_id_), - base::ListValue()); + base::Value::List()); get_parents_callback_id_.clear(); } void EduAccountLoginHandler::OnParentProfileImagesFetched( - base::ListValue parents, + base::Value::List parents, std::map<std::string, gfx::Image> profile_images) { profile_image_fetcher_.reset(); - for (auto& parent : parents.GetListDeprecated()) { + for (auto& parent : parents) { const std::string* obfuscated_gaia_id = parent.GetDict().FindString(kObfuscatedGaiaIdKey); DCHECK(obfuscated_gaia_id); @@ -328,8 +325,8 @@ LOG(ERROR) << "Could not get access token to create ReAuthProofToken for parent" << error.ToString(); - base::DictionaryValue result; - result.GetDict().Set("isWrongPassword", false); + base::Value::Dict result; + result.Set("isWrongPassword", false); RejectJavascriptCallback(base::Value(parent_signin_callback_id_), result); parent_signin_callback_id_.clear(); return; @@ -353,10 +350,9 @@ << static_cast<int>(error); gaia_auth_fetcher_.reset(); - base::DictionaryValue result; - result.GetDict().Set( - "isWrongPassword", - error == GaiaAuthConsumer::ReAuthProofTokenStatus::kInvalidGrant); + base::Value::Dict result; + result.Set("isWrongPassword", + error == GaiaAuthConsumer::ReAuthProofTokenStatus::kInvalidGrant); RejectJavascriptCallback(base::Value(parent_signin_callback_id_), result); parent_signin_callback_id_.clear(); }
diff --git a/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.h b/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.h index 5f8350e..e6a97ad 100644 --- a/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.h +++ b/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.h
@@ -104,7 +104,7 @@ virtual void FetchFamilyMembers(); virtual void FetchParentImages( - base::ListValue parents, + base::Value::List parents, std::map<std::string, GURL> profile_image_urls); virtual void FetchAccessToken(const std::string& obfuscated_gaia_id, const std::string& password); @@ -121,7 +121,7 @@ // ProfileImageFetcher callback void OnParentProfileImagesFetched( - base::ListValue parents, + base::Value::List parents, std::map<std::string, gfx::Image> profile_images); // signin::PrimaryAccountAccessTokenFetcher callback
diff --git a/chrome/browser/ui/webui/chromeos/edu_account_login_handler_unittest.cc b/chrome/browser/ui/webui/chromeos/edu_account_login_handler_unittest.cc index 18dfe24..466c278 100644 --- a/chrome/browser/ui/webui/chromeos/edu_account_login_handler_unittest.cc +++ b/chrome/browser/ui/webui/chromeos/edu_account_login_handler_unittest.cc
@@ -85,29 +85,29 @@ }; } -base::ListValue GetFakeParentsWithoutImage() { - base::ListValue parents; +base::Value::List GetFakeParentsWithoutImage() { + base::Value::List parents; - base::DictionaryValue parent1; - parent1.GetDict().Set("email", "homer@simpson.com"); - parent1.GetDict().Set("displayName", "Homer Simpson"); - parent1.GetDict().Set("obfuscatedGaiaId", kFakeParentGaiaId); + base::Value::Dict parent1; + parent1.Set("email", "homer@simpson.com"); + parent1.Set("displayName", "Homer Simpson"); + parent1.Set("obfuscatedGaiaId", kFakeParentGaiaId); parents.Append(std::move(parent1)); - base::DictionaryValue parent2; - parent2.GetDict().Set("email", std::string()); - parent2.GetDict().Set("displayName", "Marge Simpson"); - parent2.GetDict().Set("obfuscatedGaiaId", kFakeParentGaiaId2); + base::Value::Dict parent2; + parent2.Set("email", std::string()); + parent2.Set("displayName", "Marge Simpson"); + parent2.Set("obfuscatedGaiaId", kFakeParentGaiaId2); parents.Append(std::move(parent2)); return parents; } -base::ListValue GetFakeParentsWithImage() { - base::ListValue parents = GetFakeParentsWithoutImage(); +base::Value::List GetFakeParentsWithImage() { + base::Value::List parents = GetFakeParentsWithoutImage(); std::map<std::string, gfx::Image> profile_images = GetFakeProfileImageMap(); - for (auto& parent : parents.GetListDeprecated()) { + for (auto& parent : parents) { const std::string* obfuscated_gaia_id = parent.GetDict().FindString("obfuscatedGaiaId"); DCHECK(obfuscated_gaia_id); @@ -129,12 +129,12 @@ return parents; } -base::DictionaryValue GetFakeParent() { - base::DictionaryValue parent; - parent.GetDict().Set("email", "homer@simpson.com"); - parent.GetDict().Set("displayName", "Homer Simpson"); - parent.GetDict().Set("profileImageUrl", "http://profile.url/homer/image"); - parent.GetDict().Set("obfuscatedGaiaId", kFakeParentGaiaId); +base::Value::Dict GetFakeParent() { + base::Value::Dict parent; + parent.Set("email", "homer@simpson.com"); + parent.Set("displayName", "Homer Simpson"); + parent.Set("profileImageUrl", "http://profile.url/homer/image"); + parent.Set("obfuscatedGaiaId", kFakeParentGaiaId); return parent; } @@ -159,7 +159,7 @@ (override)); MOCK_METHOD(void, FetchParentImages, - (base::ListValue parents, + (base::Value::List parents, (std::map<std::string, GURL> profile_image_urls)), (override)); }; @@ -276,7 +276,7 @@ const content::TestWebUI::CallData& data = *web_ui()->call_data().back(); VerifyJavascriptCallbackResolved(data, callback_id, false /*success*/); - ASSERT_EQ(base::ListValue(), *data.arg3()); + ASSERT_EQ(base::Value::List(), *data.arg3()); } TEST_F(EduAccountLoginHandlerTest, HandleParentSigninSuccess) { @@ -332,8 +332,8 @@ const content::TestWebUI::CallData& data = *web_ui()->call_data().back(); VerifyJavascriptCallbackResolved(data, callback_id, false /*success*/); - base::DictionaryValue result; - result.GetDict().Set("isWrongPassword", false); + base::Value::Dict result; + result.Set("isWrongPassword", false); ASSERT_EQ(result, *data.arg3()); } @@ -366,8 +366,8 @@ const content::TestWebUI::CallData& data = *web_ui()->call_data().back(); VerifyJavascriptCallbackResolved(data, callback_id, false); - base::DictionaryValue result; - result.GetDict().Set("isWrongPassword", true); + base::Value::Dict result; + result.Set("isWrongPassword", true); ASSERT_EQ(result, *data.arg3()); }
diff --git a/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.cc b/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.cc index c25605a..96ab005 100644 --- a/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.cc +++ b/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.cc
@@ -276,30 +276,28 @@ void EduCoexistenceLoginHandler::SendInitializeEduArgs() { DCHECK(oauth_access_token_.has_value()); DCHECK(initialize_edu_args_callback_.has_value()); - base::Value params(base::Value::Type::DICTIONARY); + base::Value::Dict params; const std::string& app_locale = g_browser_process->GetApplicationLocale(); - params.SetStringKey("hl", app_locale); + params.Set("hl", app_locale); - params.SetStringKey("url", GetEduCoexistenceURL()); + params.Set("url", GetEduCoexistenceURL()); - params.SetStringKey("clientId", - GaiaUrls::GetInstance()->oauth2_chrome_client_id()); - params.SetStringKey("sourceUi", GetSourceUI()); + params.Set("clientId", GaiaUrls::GetInstance()->oauth2_chrome_client_id()); + params.Set("sourceUi", GetSourceUI()); - params.SetStringKey("clientVersion", chrome::kChromeVersion); - params.SetStringKey("eduCoexistenceAccessToken", oauth_access_token_->token); - params.SetStringKey("eduCoexistenceId", GetOrCreateEduCoexistenceUserId()); - params.SetStringKey("platformVersion", - base::SysInfo::OperatingSystemVersion()); + params.Set("clientVersion", chrome::kChromeVersion); + params.Set("eduCoexistenceAccessToken", oauth_access_token_->token); + params.Set("eduCoexistenceId", GetOrCreateEduCoexistenceUserId()); + params.Set("platformVersion", base::SysInfo::OperatingSystemVersion()); // Extended stable channel is not supported on Chrome OS Ash. - params.SetStringKey("releaseChannel", chrome::GetChannelName( - chrome::WithExtendedStable(false))); - params.SetStringKey("deviceId", GetDeviceIdForActiveUserProfile()); + params.Set("releaseChannel", + chrome::GetChannelName(chrome::WithExtendedStable(false))); + params.Set("deviceId", GetDeviceIdForActiveUserProfile()); - params.SetDoubleKey("signinTime", GetSigninTime().ToJsTimeIgnoringNull()); + params.Set("signinTime", GetSigninTime().ToJsTimeIgnoringNull()); // TODO(crbug.com/1202135): Remove along with JS part. - params.SetBoolKey("newOobeLayoutEnabled", true); + params.Set("newOobeLayoutEnabled", true); // If the secondary edu account is being reauthenticated, the email address // will be provided via the url of the webcontent. Example @@ -309,18 +307,18 @@ const GURL& current_url = web_contents->GetURL(); std::string default_email; if (net::GetValueForKeyInQuery(current_url, "email", &default_email)) { - params.SetStringKey("email", default_email); + params.Set("email", default_email); std::string read_only_email; if (net::GetValueForKeyInQuery(current_url, "readOnlyEmail", &read_only_email)) { - params.SetStringKey("readOnlyEmail", read_only_email); + params.Set("readOnlyEmail", read_only_email); } } } ResolveJavascriptCallback(base::Value(initialize_edu_args_callback_.value()), - std::move(params)); + params); initialize_edu_args_callback_ = absl::nullopt; }
diff --git a/chrome/browser/ui/webui/chromeos/login/fingerprint_setup_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/fingerprint_setup_screen_handler.cc index c2eadac..ab28da9 100644 --- a/chrome/browser/ui/webui/chromeos/login/fingerprint_setup_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/fingerprint_setup_screen_handler.cc
@@ -14,13 +14,8 @@ namespace chromeos { -constexpr StaticOobeScreenId FingerprintSetupScreenView::kScreenId; - FingerprintSetupScreenHandler::FingerprintSetupScreenHandler() - : BaseScreenHandler(kScreenId) { - set_user_acted_method_path_deprecated( - "login.FingerprintSetupScreen.userActed"); -} + : BaseScreenHandler(kScreenId) {} FingerprintSetupScreenHandler::~FingerprintSetupScreenHandler() = default; @@ -127,15 +122,6 @@ } } -void FingerprintSetupScreenHandler::RegisterMessages() { - BaseScreenHandler::RegisterMessages(); -} - -void FingerprintSetupScreenHandler::Bind(FingerprintSetupScreen* screen) { - screen_ = screen; - BaseScreenHandler::SetBaseScreenDeprecated(screen); -} - void FingerprintSetupScreenHandler::Show() { auto* user_manager = user_manager::UserManager::Get(); base::Value::Dict data; @@ -143,21 +129,16 @@ ShowInWebUI(std::move(data)); } -void FingerprintSetupScreenHandler::Hide() {} - -void FingerprintSetupScreenHandler::InitializeDeprecated() {} - void FingerprintSetupScreenHandler::OnEnrollScanDone( device::mojom::ScanResult scan_result, bool enroll_session_complete, int percent_complete) { - CallJS("login.FingerprintSetupScreen.onEnrollScanDone", - static_cast<int>(scan_result), enroll_session_complete, - percent_complete); + CallExternalAPI("onEnrollScanDone", static_cast<int>(scan_result), + enroll_session_complete, percent_complete); } void FingerprintSetupScreenHandler::EnableAddAnotherFinger(bool enable) { - CallJS("login.FingerprintSetupScreen.enableAddAnotherFinger", enable); + CallExternalAPI("enableAddAnotherFinger", enable); } } // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/login/fingerprint_setup_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/fingerprint_setup_screen_handler.h index 0a71cfd..fb05c4a 100644 --- a/chrome/browser/ui/webui/chromeos/login/fingerprint_setup_screen_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/fingerprint_setup_screen_handler.h
@@ -5,32 +5,25 @@ #ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_FINGERPRINT_SETUP_SCREEN_HANDLER_H_ #define CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_FINGERPRINT_SETUP_SCREEN_HANDLER_H_ +#include "base/memory/weak_ptr.h" #include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h" #include "services/device/public/mojom/fingerprint.mojom.h" -namespace ash { -class FingerprintSetupScreen; -} - namespace chromeos { // Interface for dependency injection between FingerprintSetupScreen and its // WebUI representation. -class FingerprintSetupScreenView { +class FingerprintSetupScreenView + : public base::SupportsWeakPtr<FingerprintSetupScreenView> { public: - constexpr static StaticOobeScreenId kScreenId{"fingerprint-setup"}; + inline constexpr static StaticOobeScreenId kScreenId{ + "fingerprint-setup", "FingerprintSetupScreen"}; virtual ~FingerprintSetupScreenView() = default; - // Sets screen this view belongs to. - virtual void Bind(ash::FingerprintSetupScreen* screen) = 0; - // Shows the contents of the screen. virtual void Show() = 0; - // Hides the contents of the screen. - virtual void Hide() = 0; - // Enables adding new finger. virtual void EnableAddAnotherFinger(bool enable) = 0; @@ -57,22 +50,13 @@ // BaseScreenHandler: void DeclareLocalizedValues( ::login::LocalizedValuesBuilder* builder) override; - void RegisterMessages() override; // FingerprintSetupScreenView: - void Bind(ash::FingerprintSetupScreen* screen) override; void Show() override; - void Hide() override; void EnableAddAnotherFinger(bool enable) override; void OnEnrollScanDone(device::mojom::ScanResult scan_result, bool enroll_session_complete, int percent_complete) override; - - // BaseScreenHandler: - void InitializeDeprecated() override; - - private: - ash::FingerprintSetupScreen* screen_ = nullptr; }; } // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/login/guest_tos_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/guest_tos_screen_handler.cc index 8dc9f78..649d162 100644 --- a/chrome/browser/ui/webui/chromeos/login/guest_tos_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/guest_tos_screen_handler.cc
@@ -11,16 +11,9 @@ namespace chromeos { -constexpr StaticOobeScreenId GuestTosScreenView::kScreenId; +GuestTosScreenHandler::GuestTosScreenHandler() : BaseScreenHandler(kScreenId) {} -GuestTosScreenHandler::GuestTosScreenHandler() : BaseScreenHandler(kScreenId) { - set_user_acted_method_path_deprecated("login.GuestTosScreen.userActed"); -} - -GuestTosScreenHandler::~GuestTosScreenHandler() { - if (screen_) - screen_->OnViewDestroyed(this); -} +GuestTosScreenHandler::~GuestTosScreenHandler() = default; void GuestTosScreenHandler::DeclareLocalizedValues( ::login::LocalizedValuesBuilder* builder) { @@ -39,45 +32,12 @@ builder->Add("guestTosLoading", IDS_GUEST_TOS_LOADING); } -void GuestTosScreenHandler::InitializeDeprecated() { - if (show_on_init_) { - Show(google_eula_url_, cros_eula_url_); - show_on_init_ = false; - } -} - void GuestTosScreenHandler::Show(const std::string& google_eula_url, const std::string& cros_eula_url) { - google_eula_url_ = google_eula_url; - cros_eula_url_ = cros_eula_url; - if (!IsJavascriptAllowed()) { - show_on_init_ = true; - return; - } - base::Value::Dict data; data.Set("googleEulaUrl", google_eula_url); data.Set("crosEulaUrl", cros_eula_url); ShowInWebUI(std::move(data)); } -void GuestTosScreenHandler::Bind(GuestTosScreen* screen) { - screen_ = screen; - BaseScreenHandler::SetBaseScreenDeprecated(screen_); -} - -void GuestTosScreenHandler::Unbind() { - screen_ = nullptr; - BaseScreenHandler::SetBaseScreenDeprecated(nullptr); -} - -void GuestTosScreenHandler::RegisterMessages() { - BaseScreenHandler::RegisterMessages(); - AddCallback("GuestToSAccept", &GuestTosScreenHandler::HandleAccept); -} - -void GuestTosScreenHandler::HandleAccept(bool enable_usage_stats) { - if (screen_) - screen_->OnAccept(enable_usage_stats); -} } // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/login/guest_tos_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/guest_tos_screen_handler.h index 1180478..cc6bd923 100644 --- a/chrome/browser/ui/webui/chromeos/login/guest_tos_screen_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/guest_tos_screen_handler.h
@@ -5,26 +5,22 @@ #ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_GUEST_TOS_SCREEN_HANDLER_H_ #define CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_GUEST_TOS_SCREEN_HANDLER_H_ +#include "base/memory/weak_ptr.h" #include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h" -namespace ash { -class GuestTosScreen; -} - namespace chromeos { // Interface for dependency injection between GuestTosScreen and its // WebUI representation. -class GuestTosScreenView { +class GuestTosScreenView : public base::SupportsWeakPtr<GuestTosScreenView> { public: - constexpr static StaticOobeScreenId kScreenId{"guest-tos"}; + inline constexpr static StaticOobeScreenId kScreenId{"guest-tos", + "GuestTosScreen"}; virtual ~GuestTosScreenView() = default; virtual void Show(const std::string& google_eula_url, const std::string& cros_eula_url) = 0; - virtual void Bind(ash::GuestTosScreen* screen) = 0; - virtual void Unbind() = 0; }; class GuestTosScreenHandler : public GuestTosScreenView, @@ -41,21 +37,10 @@ // GuestTosScreenView void Show(const std::string& google_eula_url, const std::string& cros_eula_url) override; - void Bind(ash::GuestTosScreen* screen) override; - void Unbind() override; // BaseScreenHandler: void DeclareLocalizedValues( ::login::LocalizedValuesBuilder* builder) override; - void InitializeDeprecated() override; - void RegisterMessages() override; - - void HandleAccept(bool enable_usage_stats); - - ash::GuestTosScreen* screen_ = nullptr; - bool show_on_init_ = false; - std::string google_eula_url_; - std::string cros_eula_url_; }; } // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/login/testapi/oobe_test_api_handler.cc b/chrome/browser/ui/webui/chromeos/login/testapi/oobe_test_api_handler.cc index 8d082fc..52b1df4 100644 --- a/chrome/browser/ui/webui/chromeos/login/testapi/oobe_test_api_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/testapi/oobe_test_api_handler.cc
@@ -96,6 +96,9 @@ dict->Set("testapi_isOobeInTabletMode", ash::TabletMode::Get()->InTabletMode() || ash::switches::ShouldOobeUseTabletModeFirstRun()); + dict->Set("testapi_shouldSkipConsolidatedConsent", + !features::IsOobeConsolidatedConsentEnabled() || + !BUILDFLAG(GOOGLE_CHROME_BRANDING)); } void OobeTestAPIHandler::LoginWithPin(const std::string& username,
diff --git a/chrome/browser/ui/webui/crashes_ui.cc b/chrome/browser/ui/webui/crashes_ui.cc index 398f3c3..a436b98d 100644 --- a/chrome/browser/ui/webui/crashes_ui.cc +++ b/chrome/browser/ui/webui/crashes_ui.cc
@@ -229,8 +229,7 @@ result.Set("os", base::SysInfo::OperatingSystemName() + " " + base::SysInfo::OperatingSystemVersion()); result.Set("isGoogleAccount", is_internal); - FireWebUIListener(crash_reporter::kCrashesUIUpdateCrashList, - base::Value(std::move(result))); + FireWebUIListener(crash_reporter::kCrashesUIUpdateCrashList, result); } void CrashesDOMHandler::HandleRequestSingleCrashUpload(
diff --git a/chrome/browser/ui/webui/history/browsing_history_handler.cc b/chrome/browser/ui/webui/history/browsing_history_handler.cc index eea8c4c..d050337 100644 --- a/chrome/browser/ui/webui/history/browsing_history_handler.cc +++ b/chrome/browser/ui/webui/history/browsing_history_handler.cc
@@ -169,7 +169,7 @@ } // Converts `entry` to a base::Value::Dict to be owned by the caller. -base::Value HistoryEntryToValue( +base::Value::Dict HistoryEntryToValue( const BrowsingHistoryService::HistoryEntry& entry, BookmarkModel* bookmark_model, Profile* profile, @@ -196,7 +196,7 @@ result.Set("time", entry.time.ToJsTime()); // Pass the timestamps in a list. - base::Value timestamps(base::Value::Type::LIST); + base::Value::List timestamps; for (int64_t timestamp : entry.all_timestamps) { timestamps.Append(base::Time::FromInternalValue(timestamp).ToJsTime()); } @@ -273,7 +273,7 @@ result.Set("debug", std::move(debug)); } - return base::Value(std::move(result)); + return result; } } // namespace @@ -285,7 +285,7 @@ BrowsingHistoryHandler::~BrowsingHistoryHandler() = default; void BrowsingHistoryHandler::OnJavascriptAllowed() { - if (!browsing_history_service_ && initial_results_.is_none()) { + if (!browsing_history_service_ && !initial_results_) { // Page was refreshed, so need to call StartQueryHistory here StartQueryHistory(); } @@ -299,7 +299,7 @@ void BrowsingHistoryHandler::OnJavascriptDisallowed() { weak_factory_.InvalidateWeakPtrs(); browsing_history_service_ = nullptr; - initial_results_ = base::Value(); + initial_results_ = absl::nullopt; deferred_callbacks_.clear(); query_history_callback_id_.clear(); remove_visits_callback_.clear(); @@ -351,9 +351,9 @@ void BrowsingHistoryHandler::HandleQueryHistory(const base::Value::List& args) { AllowJavascript(); const base::Value& callback_id = args[0]; - if (!initial_results_.is_none()) { - ResolveJavascriptCallback(callback_id, std::move(initial_results_)); - initial_results_ = base::Value(); + if (initial_results_.has_value()) { + ResolveJavascriptCallback(callback_id, *initial_results_); + initial_results_ = absl::nullopt; return; } @@ -493,23 +493,23 @@ // Convert the result vector into a ListValue. DCHECK(tracker); - base::Value results_value(base::Value::Type::LIST); + base::Value::List results_value; for (const BrowsingHistoryService::HistoryEntry& entry : results) { results_value.Append( HistoryEntryToValue(entry, bookmark_model, profile, tracker, clock_)); } - base::Value results_info(base::Value::Type::DICTIONARY); + base::Value::Dict results_info; // The items which are to be written into results_info_value_ are also // described in chrome/browser/resources/history/history.js in @typedef for // HistoryQuery. Please update it whenever you add or remove any keys in // results_info_value_. - results_info.GetDict().Set("term", query_results_info.search_text); - results_info.GetDict().Set("finished", query_results_info.reached_beginning); + results_info.Set("term", query_results_info.search_text); + results_info.Set("finished", query_results_info.reached_beginning); - base::Value final_results(base::Value::Type::DICTIONARY); - final_results.GetDict().Set("info", std::move(results_info)); - final_results.GetDict().Set("value", std::move(results_value)); + base::Value::Dict final_results; + final_results.Set("info", std::move(results_info)); + final_results.Set("value", std::move(results_value)); if (query_history_callback_id_.empty()) { // This can happen if JS isn't ready yet when the first query comes back. @@ -518,7 +518,7 @@ } ResolveJavascriptCallback(base::Value(query_history_callback_id_), - std::move(final_results)); + final_results); query_history_callback_id_.clear(); }
diff --git a/chrome/browser/ui/webui/history/browsing_history_handler.h b/chrome/browser/ui/webui/history/browsing_history_handler.h index fa6635d..ed93611 100644 --- a/chrome/browser/ui/webui/history/browsing_history_handler.h +++ b/chrome/browser/ui/webui/history/browsing_history_handler.h
@@ -93,7 +93,7 @@ std::vector<base::OnceClosure> deferred_callbacks_; - base::Value initial_results_; + absl::optional<base::Value::Dict> initial_results_; std::string query_history_callback_id_;
diff --git a/chrome/browser/ui/webui/history/foreign_session_handler.cc b/chrome/browser/ui/webui/history/foreign_session_handler.cc index c00bb8f3..c4c1da4 100644 --- a/chrome/browser/ui/webui/history/foreign_session_handler.cc +++ b/chrome/browser/ui/webui/history/foreign_session_handler.cc
@@ -70,9 +70,10 @@ } // Helper method to create JSON compatible objects from Session objects. -base::Value SessionTabToValue(const ::sessions::SessionTab& tab) { +absl::optional<base::Value::Dict> SessionTabToValue( + const ::sessions::SessionTab& tab) { if (tab.navigations.empty()) - return base::Value(); + return absl::nullopt; int selected_index = std::min(tab.current_navigation_index, static_cast<int>(tab.navigations.size() - 1)); @@ -80,7 +81,7 @@ tab.navigations.at(selected_index); GURL tab_url = current_navigation.virtual_url(); if (!tab_url.is_valid() || tab_url.spec() == chrome::kChromeUINewTabURL) - return base::Value(); + return absl::nullopt; base::Value::Dict dictionary; NewTabUI::SetUrlTitleAndDirection(&dictionary, current_navigation.title(), @@ -94,42 +95,46 @@ // confusion with the ID corresponding to a session. Investigate all the // places (C++ and JS) where this is being used. (http://crbug.com/154865). dictionary.Set("sessionId", tab.tab_id.id()); - return base::Value(std::move(dictionary)); + return dictionary; } // Helper for initializing a boilerplate SessionWindow JSON compatible object. -base::Value BuildWindowData(base::Time modification_time, SessionID window_id) { - base::Value dictionary(base::Value::Type::DICTIONARY); +base::Value::Dict BuildWindowData(base::Time modification_time, + SessionID window_id) { + base::Value::Dict dictionary; // The items which are to be written into |dictionary| are also described in // chrome/browser/resources/ntp4/other_sessions.js in @typedef for WindowData. // Please update it whenever you add or remove any keys here. - dictionary.SetStringKey("type", "window"); - dictionary.SetDoubleKey("timestamp", modification_time.ToInternalValue()); + dictionary.Set("type", "window"); + dictionary.Set("timestamp", + static_cast<double>(modification_time.ToInternalValue())); - dictionary.SetIntKey("sessionId", window_id.id()); + dictionary.Set("sessionId", window_id.id()); return dictionary; } // Helper method to create JSON compatible objects from SessionWindow objects. -base::Value SessionWindowToValue(const ::sessions::SessionWindow& window) { +absl::optional<base::Value::Dict> SessionWindowToValue( + const ::sessions::SessionWindow& window) { if (window.tabs.empty()) - return base::Value(); + return absl::nullopt; - base::Value tab_values(base::Value::Type::LIST); + base::Value::List tab_values; // Calculate the last |modification_time| for all entries within a window. base::Time modification_time = window.timestamp; for (const std::unique_ptr<sessions::SessionTab>& tab : window.tabs) { - base::Value tab_value = SessionTabToValue(*tab.get()); - if (!tab_value.is_none()) { + auto tab_value = SessionTabToValue(*tab.get()); + if (tab_value.has_value()) { modification_time = std::max(modification_time, tab->timestamp); - tab_values.Append(std::move(tab_value)); + tab_values.Append(std::move(*tab_value)); } } - if (tab_values.GetListDeprecated().empty()) - return base::Value(); + if (tab_values.empty()) + return absl::nullopt; - base::Value dictionary = BuildWindowData(window.timestamp, window.window_id); - dictionary.SetKey("tabs", std::move(tab_values)); + base::Value::Dict dictionary = + BuildWindowData(window.timestamp, window.window_id); + dictionary.Set("tabs", std::move(tab_values)); return dictionary; } @@ -242,7 +247,7 @@ void ForeignSessionHandler::OnJavascriptAllowed() { // This can happen if the page is refreshed. - if (initial_session_list_.is_none()) + if (!initial_session_list_) initial_session_list_ = GetForeignSessions(); Profile* profile = Profile::FromWebUI(web_ui()); @@ -290,65 +295,65 @@ void ForeignSessionHandler::HandleGetForeignSessions( const base::Value::List& args) { AllowJavascript(); - CHECK(!initial_session_list_.is_none()); + CHECK(initial_session_list_); const base::Value& callback_id = args[0]; - ResolveJavascriptCallback(callback_id, std::move(initial_session_list_)); + ResolveJavascriptCallback(callback_id, *initial_session_list_); // Clear the initial list so that it will be reset in AllowJavascript if the // page is refreshed. - initial_session_list_ = base::Value(base::Value::Type::NONE); + initial_session_list_ = absl::nullopt; } -base::Value ForeignSessionHandler::GetForeignSessions() { +base::Value::List ForeignSessionHandler::GetForeignSessions() { sync_sessions::OpenTabsUIDelegate* open_tabs = GetOpenTabsUIDelegate(web_ui()); std::vector<const sync_sessions::SyncedSession*> sessions; - base::Value session_list(base::Value::Type::LIST); + base::Value::List session_list; if (open_tabs && open_tabs->GetAllForeignSessions(&sessions)) { // Use a pref to keep track of sessions that were collapsed by the user. // To prevent the pref from accumulating stale sessions, clear it each time // and only add back sessions that are still current. DictionaryPrefUpdate pref_update(Profile::FromWebUI(web_ui())->GetPrefs(), prefs::kNtpCollapsedForeignSessions); - base::Value* current_collapsed_sessions = pref_update.Get(); - base::Value collapsed_sessions = current_collapsed_sessions->Clone(); - current_collapsed_sessions->DictClear(); + base::Value::Dict& current_collapsed_sessions = + pref_update.Get()->GetDict(); + base::Value::Dict collapsed_sessions = current_collapsed_sessions.Clone(); + current_collapsed_sessions.clear(); // Note: we don't own the SyncedSessions themselves. for (size_t i = 0; i < sessions.size() && i < kMaxSessionsToShow; ++i) { const sync_sessions::SyncedSession* session = sessions[i]; const std::string& session_tag = session->session_tag; - base::Value session_data(base::Value::Type::DICTIONARY); + base::Value::Dict session_data; // The items which are to be written into |session_data| are also // described in chrome/browser/resources/history/externs.js // @typedef for ForeignSession. Please update it whenever you add or // remove any keys here. - session_data.SetStringKey("tag", session_tag); - session_data.SetStringKey("name", session->session_name); - session_data.SetStringKey("deviceType", - DeviceTypeToString(session->device_type)); - session_data.SetStringKey("modifiedTime", - FormatSessionTime(session->modified_time)); - session_data.SetDoubleKey("timestamp", session->modified_time.ToJsTime()); + session_data.Set("tag", session_tag); + session_data.Set("name", session->session_name); + session_data.Set("deviceType", DeviceTypeToString(session->device_type)); + session_data.Set("modifiedTime", + FormatSessionTime(session->modified_time)); + session_data.Set("timestamp", session->modified_time.ToJsTime()); - bool is_collapsed = collapsed_sessions.FindKey(session_tag); - session_data.SetBoolKey("collapsed", is_collapsed); + bool is_collapsed = collapsed_sessions.Find(session_tag); + session_data.Set("collapsed", is_collapsed); if (is_collapsed) - current_collapsed_sessions->SetBoolKey(session_tag, true); + current_collapsed_sessions.Set(session_tag, true); - base::Value window_list(base::Value::Type::LIST); + base::Value::List window_list; // Order tabs by visual order within window. for (const auto& window_pair : session->windows) { - base::Value window_data = + auto window_data = SessionWindowToValue(window_pair.second->wrapped_window); - if (!window_data.is_none()) { - window_list.Append(std::move(window_data)); + if (window_data.has_value()) { + window_list.Append(std::move(*window_data)); } } - session_data.SetKey("windows", std::move(window_list)); + session_data.Set("windows", std::move(window_list)); session_list.Append(std::move(session_data)); } } @@ -448,9 +453,9 @@ PrefService* prefs = Profile::FromWebUI(web_ui())->GetPrefs(); DictionaryPrefUpdate update(prefs, prefs::kNtpCollapsedForeignSessions); if (is_collapsed) - update.Get()->SetBoolKey(session_tag, true); + update.Get()->GetDict().Set(session_tag, true); else - update.Get()->RemoveKey(session_tag); + update.Get()->GetDict().Remove(session_tag); } } // namespace browser_sync
diff --git a/chrome/browser/ui/webui/history/foreign_session_handler.h b/chrome/browser/ui/webui/history/foreign_session_handler.h index 2442397..4c4b045 100644 --- a/chrome/browser/ui/webui/history/foreign_session_handler.h +++ b/chrome/browser/ui/webui/history/foreign_session_handler.h
@@ -82,7 +82,7 @@ private: void OnForeignSessionUpdated(); - base::Value GetForeignSessions(); + base::Value::List GetForeignSessions(); // Returns a string used to show the user when a session was last modified. std::u16string FormatSessionTime(const base::Time& time); @@ -105,7 +105,7 @@ void HandleSetForeignSessionCollapsed(const base::Value::List& args); - base::Value initial_session_list_; + absl::optional<base::Value::List> initial_session_list_; base::CallbackListSubscription foreign_session_updated_subscription_; };
diff --git a/chrome/browser/ui/webui/identity_internals_ui.cc b/chrome/browser/ui/webui/identity_internals_ui.cc index ca623fa..f96b416 100644 --- a/chrome/browser/ui/webui/identity_internals_ui.cc +++ b/chrome/browser/ui/webui/identity_internals_ui.cc
@@ -243,8 +243,7 @@ results.Append(GetInfoForToken(key_tokens.first, token)); } } - ResolveJavascriptCallback(base::Value(callback_id), - base::Value(std::move(results))); + ResolveJavascriptCallback(base::Value(callback_id), results); } void IdentityInternalsUIMessageHandler::RegisterMessages() {
diff --git a/chrome/browser/ui/webui/managed_ui_handler.cc b/chrome/browser/ui/webui/managed_ui_handler.cc index f9da8625..a4512f2 100644 --- a/chrome/browser/ui/webui/managed_ui_handler.cc +++ b/chrome/browser/ui/webui/managed_ui_handler.cc
@@ -111,13 +111,11 @@ base::Value::Dict ManagedUIHandler::GetDataSourceUpdate() const { base::Value::Dict update; - update.Set("browserManagedByOrg", - base::Value(chrome::GetManagedUiWebUILabel(profile_))); + update.Set("browserManagedByOrg", chrome::GetManagedUiWebUILabel(profile_)); #if BUILDFLAG(IS_CHROMEOS_ASH) - update.Set("deviceManagedByOrg", - base::Value(chrome::GetDeviceManagedUiWebUILabel())); + update.Set("deviceManagedByOrg", chrome::GetDeviceManagedUiWebUILabel()); #endif - update.Set("isManaged", base::Value(managed_)); + update.Set("isManaged", managed_); return update; }
diff --git a/chrome/browser/ui/webui/memory_internals_ui.cc b/chrome/browser/ui/webui/memory_internals_ui.cc index b789161..6ee5804 100644 --- a/chrome/browser/ui/webui/memory_internals_ui.cc +++ b/chrome/browser/ui/webui/memory_internals_ui.cc
@@ -101,10 +101,10 @@ } // Generates one row of the returned process info. -base::Value MakeProcessInfo(int pid, std::string description) { - base::Value result(base::Value::Type::LIST); - result.Append(base::Value(pid)); - result.Append(base::Value(std::move(description))); +base::Value::List MakeProcessInfo(int pid, std::string description) { + base::Value::List result; + result.Append(pid); + result.Append(std::move(description)); return result; } @@ -152,7 +152,7 @@ private: void ReturnProcessListOnUIThread(const std::string& callback_id, - std::vector<base::Value> children, + std::vector<base::Value::List> children, std::vector<base::ProcessId> profiled_pids); // SelectFileDialog::Listener implementation: @@ -209,7 +209,7 @@ AllowJavascript(); std::string callback_id = args[0].GetString(); - std::vector<base::Value> result; + std::vector<base::Value::List> result; // The only non-renderer child processes that currently support out-of-process // heap profiling are GPU and UTILITY. @@ -299,7 +299,7 @@ void MemoryInternalsDOMHandler::ReturnProcessListOnUIThread( const std::string& callback_id, - std::vector<base::Value> children, + std::vector<base::Value::List> children, std::vector<base::ProcessId> profiled_pids) { // This function will be called with the child processes that are not // renderers. It will fill in the browser and renderer processes on the UI @@ -346,8 +346,7 @@ result.Set("message", GetMessageString()); result.Set("processes", std::move(process_list)); - ResolveJavascriptCallback(base::Value(callback_id), - base::Value(std::move(result))); + ResolveJavascriptCallback(base::Value(callback_id), result); } void MemoryInternalsDOMHandler::FileSelected(const base::FilePath& path,
diff --git a/chrome/browser/ui/webui/nacl_ui.cc b/chrome/browser/ui/webui/nacl_ui.cc index ed5fa10..a6415c1 100644 --- a/chrome/browser/ui/webui/nacl_ui.cc +++ b/chrome/browser/ui/webui/nacl_ui.cc
@@ -105,7 +105,7 @@ // Helper for MaybeRespondToPage -- called after enough information // is gathered. - void PopulatePageInformation(base::DictionaryValue* naclInfo); + base::Value::Dict GetPageInformation(); // Returns whether the specified plugin is enabled. bool isPluginEnabled(size_t plugin_index); @@ -314,8 +314,7 @@ MaybeRespondToPage(); } -void NaClDomHandler::PopulatePageInformation(base::DictionaryValue* naclInfo) { - DCHECK(pnacl_path_validated_); +base::Value::Dict NaClDomHandler::GetPageInformation() { // Store Key-Value pairs of about-information. base::ListValue list; // Display the operating system and chrome version information. @@ -327,7 +326,9 @@ // Display information relevant to NaCl (non-portable. AddNaClInfo(&list); // naclInfo will take ownership of list, and clean it up on destruction. - naclInfo->SetKey("naclInfo", std::move(list)); + base::Value::Dict dict; + dict.Set("naclInfo", std::move(list)); + return dict; } void NaClDomHandler::DidCheckPathAndVersion(const std::string* version, @@ -383,9 +384,7 @@ return; } - base::DictionaryValue naclInfo; - PopulatePageInformation(&naclInfo); - ResolveJavascriptCallback(base::Value(callback_id_), naclInfo); + ResolveJavascriptCallback(base::Value(callback_id_), GetPageInformation()); callback_id_.clear(); }
diff --git a/chrome/browser/ui/webui/settings/chromeos/about_section.cc b/chrome/browser/ui/webui/settings/chromeos/about_section.cc index 736865e7..117a53a 100644 --- a/chrome/browser/ui/webui/settings/chromeos/about_section.cc +++ b/chrome/browser/ui/webui/settings/chromeos/about_section.cc
@@ -251,6 +251,7 @@ {"aboutFirmwareUpdates", IDS_SETTINGS_ABOUT_PAGE_FIRMWARE_UPDATES}, {"aboutRelaunch", IDS_SETTINGS_ABOUT_PAGE_RELAUNCH}, {"aboutUpgradeCheckStarted", IDS_SETTINGS_ABOUT_UPGRADE_CHECK_STARTED}, + {"aboutUpgradeNotUpToDate", IDS_SETTINGS_UPGRADE_NOT_UP_TO_DATE}, {"aboutUpgradeRelaunch", IDS_SETTINGS_UPGRADE_SUCCESSFUL_RELAUNCH}, {"aboutUpgradeUpdating", IDS_SETTINGS_UPGRADE_UPDATING}, {"aboutUpgradeUpdatingPercent", IDS_SETTINGS_UPGRADE_UPDATING_PERCENT}, @@ -274,6 +275,8 @@ IDS_SETTINGS_ABOUT_TPM_FIRMWARE_UPDATE_TITLE}, {"aboutTPMFirmwareUpdateDescription", IDS_SETTINGS_ABOUT_TPM_FIRMWARE_UPDATE_DESCRIPTION}, + {"aboutDeferredUpdate", + IDS_SETTINGS_ABOUT_PAGE_DEFERRED_UPDATE_DESCRIPTION}, // About page, channel switcher dialog. {"aboutChangeChannel", IDS_SETTINGS_ABOUT_PAGE_CHANGE_CHANNEL},
diff --git a/chrome/browser/ui/webui/settings/chromeos/change_picture_handler.cc b/chrome/browser/ui/webui/settings/chromeos/change_picture_handler.cc index ff0495f..e0eb27b 100644 --- a/chrome/browser/ui/webui/settings/chromeos/change_picture_handler.cc +++ b/chrome/browser/ui/webui/settings/chromeos/change_picture_handler.cc
@@ -126,12 +126,9 @@ } void ChangePictureHandler::SendDefaultImages() { - base::DictionaryValue result; - std::unique_ptr<base::ListValue> current_default_images = - default_user_image::GetCurrentImageSetAsListValue(); - result.SetKey( - "current_default_images", - base::Value::FromUniquePtrValue(std::move(current_default_images))); + base::Value::Dict result; + result.Set("current_default_images", + default_user_image::GetCurrentImageSetAsListValue()); FireWebUIListener("default-images-changed", result); } @@ -238,17 +235,17 @@ previous_image_bytes_ = nullptr; previous_image_format_ = user_manager::UserImage::FORMAT_UNKNOWN; - base::DictionaryValue result; - result.SetStringPath( - "url", default_user_image::GetDefaultImageUrl(previous_image_index_) + base::Value::Dict result; + result.Set("url", + default_user_image::GetDefaultImageUrl(previous_image_index_) .spec()); auto source_info = default_user_image::GetDefaultImageSourceInfo( previous_image_index_); if (source_info.has_value()) { - result.SetStringPath("author", l10n_util::GetStringUTF16(std::move( - source_info.value().author_id))); - result.SetStringPath("website", l10n_util::GetStringUTF16(std::move( - source_info.value().website_id))); + result.Set("author", l10n_util::GetStringUTF16( + std::move(source_info.value().author_id))); + result.Set("website", l10n_util::GetStringUTF16( + std::move(source_info.value().website_id))); } FireWebUIListener("preview-deprecated-image", result); }
diff --git a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc index 22c5f0d6..4ae582a 100644 --- a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc +++ b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
@@ -118,19 +118,19 @@ // CupsPrinterInfo representation. If any of the required fields are missing, // returns nullptr. std::unique_ptr<chromeos::Printer> DictToPrinter( - const base::DictionaryValue& printer_dict) { - const std::string* printer_id = printer_dict.FindStringKey("printerId"); - const std::string* printer_name = printer_dict.FindStringKey("printerName"); + const base::Value::Dict& printer_dict) { + const std::string* printer_id = printer_dict.FindString("printerId"); + const std::string* printer_name = printer_dict.FindString("printerName"); const std::string* printer_description = - printer_dict.FindStringKey("printerDescription"); + printer_dict.FindString("printerDescription"); const std::string* printer_make_and_model = - printer_dict.FindStringKey("printerMakeAndModel"); + printer_dict.FindString("printerMakeAndModel"); const std::string* printer_address = - printer_dict.FindStringKey("printerAddress"); + printer_dict.FindString("printerAddress"); const std::string* printer_protocol = - printer_dict.FindStringKey("printerProtocol"); + printer_dict.FindString("printerProtocol"); const std::string* print_server_uri = - printer_dict.FindStringKey("printServerUri"); + printer_dict.FindString("printServerUri"); if (!printer_id || !printer_name || !printer_description || !printer_make_and_model || !printer_address || !printer_protocol || !print_server_uri) { @@ -140,7 +140,7 @@ std::string printer_queue; // The protocol "socket" does not allow path. if (*printer_protocol != "socket") { - if (const std::string* ptr = printer_dict.FindStringKey("printerQueue")) { + if (const std::string* ptr = printer_dict.FindString("printerQueue")) { printer_queue = *ptr; // Path must start from '/' character. if (!printer_queue.empty() && printer_queue.front() != '/') @@ -197,25 +197,23 @@ } // Assumes |info| is a dictionary. -void SetPpdReference(const Printer::PpdReference& ppd_ref, base::Value* info) { +void SetPpdReference(const Printer::PpdReference& ppd_ref, + base::Value::Dict* info) { if (!ppd_ref.user_supplied_ppd_url.empty()) { - info->SetKey("ppdRefUserSuppliedPpdUrl", - base::Value(ppd_ref.user_supplied_ppd_url)); + info->Set("ppdRefUserSuppliedPpdUrl", ppd_ref.user_supplied_ppd_url); } else if (!ppd_ref.effective_make_and_model.empty()) { - info->SetKey("ppdRefEffectiveMakeAndModel", - base::Value(ppd_ref.effective_make_and_model)); + info->Set("ppdRefEffectiveMakeAndModel", ppd_ref.effective_make_and_model); } else { // Must be autoconf, shouldn't be possible NOTREACHED() << "Succeeded in PPD matching without emm"; } } -Printer::PpdReference GetPpdReference(const base::Value* info) { - const char ppd_ref_pathname[] = "printerPpdReference"; +Printer::PpdReference GetPpdReference(const base::Value::Dict* info) { auto* user_supplied_ppd_url = - info->FindPath({ppd_ref_pathname, "userSuppliedPPDUrl"}); + info->FindByDottedPath("printerPpdReference.userSuppliedPPDUrl"); auto* effective_make_and_model = - info->FindPath({ppd_ref_pathname, "effectiveMakeAndModel"}); - auto* autoconf = info->FindPath({ppd_ref_pathname, "autoconf"}); + info->FindByDottedPath("printerPpdReference.effectiveMakeAndModel"); + auto* autoconf = info->FindByDottedPath("printerPpdReference.autoconf"); Printer::PpdReference ret; @@ -383,7 +381,7 @@ printers_manager_->GetPrinters(PrinterClass::kSaved); ResolveJavascriptCallback(base::Value(callback_id), - base::Value(BuildCupsPrintersList(printers))); + BuildCupsPrintersList(printers)); } void CupsPrintersHandler::HandleGetCupsEnterprisePrintersList( @@ -397,7 +395,7 @@ printers_manager_->GetPrinters(PrinterClass::kEnterprise); ResolveJavascriptCallback(base::Value(callback_id), - base::Value(BuildCupsPrintersList(printers))); + BuildCupsPrintersList(printers)); } void CupsPrintersHandler::HandleUpdateCupsPrinter( @@ -466,20 +464,19 @@ NOTREACHED() << "Dictionary missing"; return; } - const base::DictionaryValue& printer_dict = - base::Value::AsDictionaryValue(printer_value); + const base::Value::Dict& printer_dict = printer_value.GetDict(); AllowJavascript(); const std::string* printer_address = - printer_dict.FindStringKey("printerAddress"); + printer_dict.FindString("printerAddress"); if (!printer_address) { NOTREACHED() << "Address missing"; return; } std::string printer_queue; - if (const std::string* ptr = printer_dict.FindStringKey("printerQueue")) { + if (const std::string* ptr = printer_dict.FindString("printerQueue")) { printer_queue = *ptr; // Path must start from '/' character. if (!printer_queue.empty() && printer_queue.front() != '/') @@ -487,7 +484,7 @@ } const std::string* printer_protocol = - printer_dict.FindStringKey("printerProtocol"); + printer_dict.FindString("printerProtocol"); if (!printer_protocol) { NOTREACHED() << "Protocol missing"; return; @@ -549,7 +546,7 @@ // the rest. PRINTER_LOG(EVENT) << "Could not query printer. Fallback to asking the user"; RejectJavascriptCallback(base::Value(callback_id), - base::Value(GetCupsPrinterInfo(printer))); + GetCupsPrinterInfo(printer)); } void CupsPrintersHandler::OnAutoconfQueried( @@ -585,12 +582,12 @@ << ")"; // Bundle printer metadata - base::Value info(base::Value::Type::DICTIONARY); - info.SetKey("makeAndModel", base::Value(make_and_model)); - info.SetKey("autoconf", base::Value(ipp_everywhere)); + base::Value::Dict info; + info.Set("makeAndModel", make_and_model); + info.Set("autoconf", ipp_everywhere); if (ipp_everywhere) { - info.SetKey("ppdReferenceResolved", base::Value(true)); + info.Set("ppdReferenceResolved", true); ResolveJavascriptCallback(base::Value(callback_id), info); return; } @@ -609,18 +606,18 @@ } void CupsPrintersHandler::OnPpdResolved(const std::string& callback_id, - base::Value info, + base::Value::Dict info, PpdProvider::CallbackResultCode res, const Printer::PpdReference& ppd_ref, const std::string& usb_manufacturer) { if (res != PpdProvider::CallbackResultCode::SUCCESS) { - info.SetKey("ppdReferenceResolved", base::Value(false)); + info.Set("ppdReferenceResolved", false); ResolveJavascriptCallback(base::Value(callback_id), info); return; } SetPpdReference(ppd_ref, &info); - info.SetKey("ppdReferenceResolved", base::Value(true)); + info.Set("ppdReferenceResolved", true); ResolveJavascriptCallback(base::Value(callback_id), info); } @@ -641,8 +638,7 @@ std::string callback_id = args[0].GetString(); const base::Value& printer_value = args[1]; CHECK(printer_value.is_dict()); - const base::DictionaryValue& printer_dict = - base::Value::AsDictionaryValue(printer_value); + const base::Value::Dict& printer_dict = printer_value.GetDict(); std::unique_ptr<Printer> printer = DictToPrinter(printer_dict); if (!printer) { @@ -685,12 +681,12 @@ // Read PPD selection if it was used. const std::string* ppd_manufacturer = - printer_dict.FindStringKey("ppdManufacturer"); - const std::string* ppd_model = printer_dict.FindStringKey("ppdModel"); + printer_dict.FindString("ppdManufacturer"); + const std::string* ppd_model = printer_dict.FindString("ppdModel"); // Read user provided PPD if it was used. const std::string* printer_ppd_path = - printer_dict.FindStringKey("printerPPDPath"); + printer_dict.FindString("printerPPDPath"); // Check if the printer already has a valid ppd_reference. Printer::PpdReference ppd_ref = GetPpdReference(&printer_dict); @@ -810,7 +806,7 @@ "Fall back to manual."; // Could not set up printer. Asking user for manufacturer data. RejectJavascriptCallback(base::Value(callback_id), - base::Value(GetCupsPrinterInfo(printer))); + GetCupsPrinterInfo(printer)); } } @@ -865,8 +861,7 @@ base::Value::Dict response; response.Set("success", true); response.Set("models", base::Value::List()); - ResolveJavascriptCallback(base::Value(callback_id), - base::Value(std::move(response))); + ResolveJavascriptCallback(base::Value(callback_id), response); return; } @@ -919,8 +914,7 @@ base::Value::Dict response; response.Set("success", result_code == PpdProvider::SUCCESS); response.Set("manufacturers", std::move(manufacturers_value)); - ResolveJavascriptCallback(base::Value(callback_id), - base::Value(std::move(response))); + ResolveJavascriptCallback(base::Value(callback_id), response); } void CupsPrintersHandler::ResolvePrintersDone( @@ -938,8 +932,7 @@ base::Value::Dict response; response.Set("success", result_code == PpdProvider::SUCCESS); response.Set("models", std::move(printers_value)); - ResolveJavascriptCallback(base::Value(callback_id), - base::Value(std::move(response))); + ResolveJavascriptCallback(base::Value(callback_id), response); } void CupsPrintersHandler::FileSelected(const base::FilePath& path, @@ -1007,8 +1000,7 @@ const base::Value& printer_value = args[0]; CHECK(printer_value.is_dict()); - std::unique_ptr<Printer> printer = - DictToPrinter(base::Value::AsDictionaryValue(printer_value)); + std::unique_ptr<Printer> printer = DictToPrinter(printer_value.GetDict()); if (printer) { printers_manager_->RecordSetupAbandoned(*printer); } @@ -1028,12 +1020,12 @@ break; case PrinterClass::kSaved: { FireWebUIListener("on-saved-printers-changed", - base::Value(BuildCupsPrintersList(printers))); + BuildCupsPrintersList(printers)); break; } case PrinterClass::kEnterprise: FireWebUIListener("on-enterprise-printers-changed", - base::Value(BuildCupsPrintersList(printers))); + BuildCupsPrintersList(printers)); break; } } @@ -1055,9 +1047,8 @@ PRINTER_LOG(DEBUG) << "Discovered printers updating. Automatic: " << automatic_printers_list.size() << " Discovered: " << discovered_printers_list.size(); - FireWebUIListener("on-nearby-printers-changed", - base::Value(std::move(automatic_printers_list)), - base::Value(std::move(discovered_printers_list))); + FireWebUIListener("on-nearby-printers-changed", automatic_printers_list, + discovered_printers_list); } void CupsPrintersHandler::HandleAddDiscoveredPrinter( @@ -1105,7 +1096,7 @@ // directly, so we have to fall back to manual configuration here. if (printer->IsUsbProtocol()) { RejectJavascriptCallback(base::Value(callback_id), - base::Value(GetCupsPrinterInfo(*printer))); + GetCupsPrinterInfo(*printer)); return; } @@ -1233,7 +1224,7 @@ PRINTER_LOG(EVENT) << "Request make and model from user"; // If it's not an IPP printer, the user must choose a PPD. RejectJavascriptCallback(base::Value(callback_id), - base::Value(GetCupsPrinterInfo(printer))); + GetCupsPrinterInfo(printer)); } void CupsPrintersHandler::HandleQueryPrintServer( @@ -1314,7 +1305,7 @@ // Create result value and finish the callback. ResolveJavascriptCallback(base::Value(callback_id), - base::Value(BuildCupsPrintersList(printers))); + BuildCupsPrintersList(printers)); } void CupsPrintersHandler::HandleOpenPrintManagementApp(
diff --git a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h index a271068..62b64a3 100644 --- a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h +++ b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h
@@ -108,7 +108,7 @@ // Callback for PPD matching attempts; void OnPpdResolved(const std::string& callback_id, - base::Value info, + base::Value::Dict info, PpdProvider::CallbackResultCode res, const Printer::PpdReference& ppd_ref, const std::string& usb_manufacturer);
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 ca0ff361..ff6067a 100644 --- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -749,8 +749,7 @@ {"searchLanguages", IDS_SETTINGS_LANGUAGE_SEARCH}, {"languagesExpandA11yLabel", IDS_SETTINGS_LANGUAGES_EXPAND_ACCESSIBILITY_LABEL}, - {"preferredLanguagesDesc", - IDS_SETTINGS_LANGUAGES_PREFERRED_LANGUAGES_DESC}, + {"preferredLanguagesDesc", IDS_SETTINGS_LANGUAGES_PREFERRED_LANGUAGES_DESC}, {"moveToTop", IDS_SETTINGS_LANGUAGES_LANGUAGES_LIST_MOVE_TO_TOP}, {"moveUp", IDS_SETTINGS_LANGUAGES_LANGUAGES_LIST_MOVE_UP}, {"moveDown", IDS_SETTINGS_LANGUAGES_LANGUAGES_LIST_MOVE_DOWN}, @@ -767,6 +766,7 @@ {"offerToEnableTranslate", IDS_SETTINGS_LANGUAGES_OFFER_TO_ENABLE_TRANSLATE}, {"noLanguagesAdded", IDS_SETTINGS_LANGUAGES_NO_LANGUAGES_ADDED}, + {"translatePageTitle", IDS_SETTINGS_TRANSLATE_PAGE_TITLE}, {"automaticallyTranslateLanguages", IDS_SETTINGS_LANGUAGES_AUTOMATIC_TRANSLATE}, {"neverTranslateLanguages", IDS_SETTINGS_LANGUAGES_NEVER_LANGUAGES}, @@ -809,7 +809,7 @@ #endif // !BUILDFLAG(IS_CHROMEOS_ASH) #if BUILDFLAG(IS_CHROMEOS_ASH) {"openChromeOSLanguagesSettingsLabel", - IDS_SETTINGS_LANGUAGES_OPEN_CHROME_OS_SETTINGS_LABEL}, + IDS_SETTINGS_LANGUAGES_OPEN_CHROME_OS_SETTINGS_LABEL}, #endif }; html_source->AddLocalizedStrings(kLocalizedStrings);
diff --git a/chrome/browser/ui/webui/signin/profile_customization_ui.cc b/chrome/browser/ui/webui/signin/profile_customization_ui.cc index a4061e1..21b9730 100644 --- a/chrome/browser/ui/webui/signin/profile_customization_ui.cc +++ b/chrome/browser/ui/webui/signin/profile_customization_ui.cc
@@ -15,6 +15,7 @@ #include "chrome/browser/signin/signin_features.h" #include "chrome/browser/ui/webui/customize_themes/chrome_customize_themes_handler.h" #include "chrome/browser/ui/webui/signin/profile_customization_handler.h" +#include "chrome/browser/ui/webui/signin/signin_url_utils.h" #include "chrome/browser/ui/webui/webui_util.h" #include "chrome/common/webui_url_constants.h" #include "chrome/grit/chromium_strings.h" @@ -84,8 +85,12 @@ source->AddBoolean( "profileCustomizationInDialogDesign", base::FeatureList::IsEnabled(kSyncPromoAfterSigninIntercept)); + const GURL& url = web_ui->GetWebContents()->GetVisibleURL(); + source->AddBoolean("isLocalProfileCreation", + GetProfileCustomizationStyle(url) == + ProfileCustomizationStyle::kLocalProfileCreation); - if (web_ui->GetWebContents()->GetVisibleURL().query() == "debug") { + if (url.query() == "debug") { // Not intended to be hooked to anything. The bubble will not initialize it // so we force it here. Initialize(base::DoNothing());
diff --git a/chrome/browser/ui/webui/signin/signin_url_utils.cc b/chrome/browser/ui/webui/signin/signin_url_utils.cc index 6b28424..f804a19 100644 --- a/chrome/browser/ui/webui/signin/signin_url_utils.cc +++ b/chrome/browser/ui/webui/signin/signin_url_utils.cc
@@ -14,7 +14,8 @@ namespace { -// Query parameter names of the sync confirmtaion URL. +// Query parameter names of the sync confirmation and the profile customization +// URL. const char kStyleParamKey[] = "style"; // Query parameter names of the reauth confirmation URL. @@ -66,3 +67,24 @@ base::NumberToString(static_cast<int>(access_point))); return url; } + +#if BUILDFLAG(ENABLE_DICE_SUPPORT) || BUILDFLAG(IS_CHROMEOS_LACROS) +ProfileCustomizationStyle GetProfileCustomizationStyle(const GURL& url) { + std::string style_str; + int style_int; + // Default style if the parameter is missing. + ProfileCustomizationStyle style = ProfileCustomizationStyle::kDefault; + if (net::GetValueForKeyInQuery(url, kStyleParamKey, &style_str) && + base::StringToInt(style_str, &style_int)) { + style = static_cast<ProfileCustomizationStyle>(style_int); + } + return style; +} + +GURL AppendProfileCustomizationQueryParams(const GURL& url, + ProfileCustomizationStyle style) { + GURL url_with_params = net::AppendQueryParameter( + url, kStyleParamKey, base::NumberToString(static_cast<int>(style))); + return url_with_params; +} +#endif // BUILDFLAG(ENABLE_DICE_SUPPORT) || BUILDFLAG(IS_CHROMEOS_LACROS)
diff --git a/chrome/browser/ui/webui/signin/signin_url_utils.h b/chrome/browser/ui/webui/signin/signin_url_utils.h index 4f78f488..7912ad9c 100644 --- a/chrome/browser/ui/webui/signin/signin_url_utils.h +++ b/chrome/browser/ui/webui/signin/signin_url_utils.h
@@ -6,6 +6,7 @@ #define CHROME_BROWSER_UI_WEBUI_SIGNIN_SIGNIN_URL_UTILS_H_ #include "chrome/browser/ui/webui/signin/sync_confirmation_ui.h" +#include "components/signin/public/base/signin_buildflags.h" #include "components/signin/public/base/signin_metrics.h" #include "url/gurl.h" @@ -20,10 +21,7 @@ // dialog, the signin intercept modal dialog version or as a window. SyncConfirmationStyle GetSyncConfirmationStyle(const GURL& url); -// Adds the following URL query parameters to `url`. -// `is_modal` specifies whether the style for modal dialog is used. -// `is_signin_intercept` specifies whether the style for the signin intercept is -// used. +// Adds the `style` URL query parameters to `url` for the sync confirmation. GURL AppendSyncConfirmationQueryParams(const GURL& url, SyncConfirmationStyle style); @@ -36,4 +34,19 @@ // triggered by |access_point|. GURL GetReauthConfirmationURL(signin_metrics::ReauthAccessPoint access_point); +#if BUILDFLAG(ENABLE_DICE_SUPPORT) || BUILDFLAG(IS_CHROMEOS_LACROS) +enum class ProfileCustomizationStyle { + kDefault = 0, + kLocalProfileCreation = 1 +}; + +// Returns which style the profile customization page is using, as the default +// profile customization page or the local profile creation page. +ProfileCustomizationStyle GetProfileCustomizationStyle(const GURL& url); + +// Adds the `style` URL query parameters to `url` for the profile customization. +GURL AppendProfileCustomizationQueryParams(const GURL& url, + ProfileCustomizationStyle style); +#endif // BUILDFLAG(ENABLE_DICE_SUPPORT) || BUILDFLAG(IS_CHROMEOS_LACROS) + #endif // CHROME_BROWSER_UI_WEBUI_SIGNIN_SIGNIN_URL_UTILS_H_
diff --git a/chrome/browser/ui/webui/signin/signin_url_utils_unittest.cc b/chrome/browser/ui/webui/signin/signin_url_utils_unittest.cc index b00fc0d..04da60e 100644 --- a/chrome/browser/ui/webui/signin/signin_url_utils_unittest.cc +++ b/chrome/browser/ui/webui/signin/signin_url_utils_unittest.cc
@@ -6,6 +6,7 @@ #include "chrome/browser/ui/webui/signin/sync_confirmation_ui.h" #include "chrome/common/webui_url_constants.h" +#include "components/signin/public/base/signin_buildflags.h" #include "components/signin/public/base/signin_metrics.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -46,6 +47,34 @@ EXPECT_EQ(SyncConfirmationStyle::kWindow, GetSyncConfirmationStyle(url)); } +#if BUILDFLAG(ENABLE_DICE_SUPPORT) || BUILDFLAG(IS_CHROMEOS_LACROS) +TEST(SigninURLUtilsTest, ParseParameterlessProfileCustomizationURL) { + GURL url = GURL(chrome::kChromeUIProfileCustomizationURL); + EXPECT_EQ(ProfileCustomizationStyle::kDefault, + GetProfileCustomizationStyle(url)); +} + +TEST(SigninURLUtilsProfileCustomizationURLTest, GetAndParseURL) { + // Default version. + GURL url = AppendProfileCustomizationQueryParams( + GURL(chrome::kChromeUIProfileCustomizationURL), + ProfileCustomizationStyle::kDefault); + EXPECT_TRUE(url.is_valid()); + EXPECT_EQ(url.host(), chrome::kChromeUIProfileCustomizationHost); + EXPECT_EQ(ProfileCustomizationStyle::kDefault, + GetProfileCustomizationStyle(url)); + + // Profile Creation version. + url = AppendProfileCustomizationQueryParams( + GURL(chrome::kChromeUIProfileCustomizationURL), + ProfileCustomizationStyle::kLocalProfileCreation); + EXPECT_TRUE(url.is_valid()); + EXPECT_EQ(url.host(), chrome::kChromeUIProfileCustomizationHost); + EXPECT_EQ(ProfileCustomizationStyle::kLocalProfileCreation, + GetProfileCustomizationStyle(url)); +} +#endif // BUILDFLAG(ENABLE_DICE_SUPPORT) || BUILDFLAG(IS_CHROMEOS_LACROS) + class SigninURLUtilsReauthConfirmationURLTest : public ::testing::TestWithParam<int> {};
diff --git a/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.cc b/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.cc index 9a3d27a..928a174e 100644 --- a/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.cc +++ b/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.cc
@@ -180,13 +180,13 @@ DCHECK(args.empty()); AllowJavascript(); - DictionaryValue event_details; - base::Value type_list(base::Value::Type::LIST); + base::Value::Dict event_details; + base::Value::List type_list; syncer::ModelTypeSet protocol_types = syncer::ProtocolTypes(); for (syncer::ModelType type : protocol_types) { type_list.Append(ModelTypeToDebugString(type)); } - event_details.SetKey(syncer::sync_ui_util::kTypes, std::move(type_list)); + event_details.Set(syncer::sync_ui_util::kTypes, std::move(type_list)); FireWebUIListener(syncer::sync_ui_util::kOnReceivedListOfTypes, event_details); } @@ -196,9 +196,9 @@ DCHECK(args.empty()); AllowJavascript(); - DictionaryValue value; - value.SetBoolKey(syncer::sync_ui_util::kIncludeSpecifics, - GetIncludeSpecificsInitialState()); + base::Value::Dict value; + value.Set(syncer::sync_ui_util::kIncludeSpecifics, + GetIncludeSpecificsInitialState()); FireWebUIListener( syncer::sync_ui_util::kOnReceivedIncludeSpecificsInitialState, value); @@ -308,8 +308,8 @@ void SyncInternalsMessageHandler::OnReceivedAllNodes( const std::string& callback_id, - std::unique_ptr<base::ListValue> nodes) { - ResolveJavascriptCallback(base::Value(callback_id), *nodes); + base::Value::List nodes) { + ResolveJavascriptCallback(base::Value(callback_id), nodes); } void SyncInternalsMessageHandler::OnStateChanged(SyncService* sync) { @@ -318,8 +318,8 @@ void SyncInternalsMessageHandler::OnProtocolEvent( const syncer::ProtocolEvent& event) { - std::unique_ptr<DictionaryValue> value(event.ToValue(include_specifics_)); - FireWebUIListener(syncer::sync_ui_util::kOnProtocolEvent, *value); + FireWebUIListener(syncer::sync_ui_util::kOnProtocolEvent, + event.ToValue(include_specifics_)); } void SyncInternalsMessageHandler::OnInvalidationReceived( @@ -329,7 +329,7 @@ return; } - base::Value data_types_list(base::Value::Type::LIST); + base::Value::List data_types_list; for (const auto& data_type_invalidation : payload_message.data_type_invalidations()) { const int field_number = data_type_invalidation.data_type_id(); @@ -345,10 +345,10 @@ } void SyncInternalsMessageHandler::SendAboutInfoAndEntityCounts() { - std::unique_ptr<DictionaryValue> value = about_sync_data_delegate_.Run( + base::Value::Dict value = about_sync_data_delegate_.Run( GetSyncService(), chrome::GetChannelName(chrome::WithExtendedStable(true))); - FireWebUIListener(syncer::sync_ui_util::kOnAboutInfoUpdated, *value); + FireWebUIListener(syncer::sync_ui_util::kOnAboutInfoUpdated, value); if (SyncService* service = GetSyncService()) { service->GetEntityCountsForDebugging( @@ -361,23 +361,21 @@ void SyncInternalsMessageHandler::OnGotEntityCounts( const std::vector<syncer::TypeEntitiesCount>& entity_counts) { - base::Value count_list(base::Value::Type::LIST); + base::Value::List count_list; for (const syncer::TypeEntitiesCount& count : entity_counts) { - DictionaryValue count_dictionary; - count_dictionary.SetStringPath(syncer::sync_ui_util::kModelType, - ModelTypeToDebugString(count.type)); - count_dictionary.SetIntPath(syncer::sync_ui_util::kEntities, - count.entities); - count_dictionary.SetIntPath(syncer::sync_ui_util::kNonTombstoneEntities, - count.non_tombstone_entities); + base::Value::Dict count_dictionary; + count_dictionary.Set(syncer::sync_ui_util::kModelType, + ModelTypeToDebugString(count.type)); + count_dictionary.Set(syncer::sync_ui_util::kEntities, count.entities); + count_dictionary.Set(syncer::sync_ui_util::kNonTombstoneEntities, + count.non_tombstone_entities); count_list.Append(std::move(count_dictionary)); } - DictionaryValue event_details; - event_details.SetKey(syncer::sync_ui_util::kEntityCounts, - std::move(count_list)); + base::Value::Dict event_details; + event_details.Set(syncer::sync_ui_util::kEntityCounts, std::move(count_list)); FireWebUIListener(syncer::sync_ui_util::kOnEntityCountsUpdated, - std::move(event_details)); + event_details); } SyncService* SyncInternalsMessageHandler::GetSyncService() {
diff --git a/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.h b/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.h index a8007091..d2c8e78 100644 --- a/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.h +++ b/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.h
@@ -73,7 +73,7 @@ // Callback used in GetAllNodes. void OnReceivedAllNodes(const std::string& callback_id, - std::unique_ptr<base::ListValue> nodes); + base::Value::List nodes); // syncer::SyncServiceObserver implementation. void OnStateChanged(syncer::SyncService* sync) override; @@ -86,9 +86,8 @@ protected: using AboutSyncDataDelegate = - base::RepeatingCallback<std::unique_ptr<base::DictionaryValue>( - syncer::SyncService* service, - const std::string& channel)>; + base::RepeatingCallback<base::Value::Dict(syncer::SyncService* service, + const std::string& channel)>; // Constructor used for unit testing to override dependencies. explicit SyncInternalsMessageHandler(
diff --git a/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler_unittest.cc b/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler_unittest.cc index 7f1a7a0..8f728a7a 100644 --- a/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler_unittest.cc +++ b/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler_unittest.cc
@@ -53,8 +53,7 @@ } void GetAllNodesForDebugging( - base::OnceCallback<void(std::unique_ptr<base::ListValue>)> callback) - override { + base::OnceCallback<void(base::Value::List)> callback) override { get_all_nodes_callback_ = std::move(callback); } @@ -67,16 +66,14 @@ int add_observer_count() const { return add_observer_count_; } int remove_observer_count() const { return remove_observer_count_; } - base::OnceCallback<void(std::unique_ptr<base::ListValue>)> - get_all_nodes_callback() { + base::OnceCallback<void(base::Value::List)> get_all_nodes_callback() { return std::move(get_all_nodes_callback_); } private: int add_observer_count_ = 0; int remove_observer_count_ = 0; - base::OnceCallback<void(std::unique_ptr<base::ListValue>)> - get_all_nodes_callback_; + base::OnceCallback<void(base::Value::List)> get_all_nodes_callback_; }; static std::unique_ptr<KeyedService> BuildTestSyncService( @@ -103,7 +100,7 @@ void SetUp() override { ChromeRenderViewHostTestHarness::SetUp(); - about_information_.SetStringKey("some_sync_state", "some_value"); + about_information_.Set("some_sync_state", "some_value"); web_ui_.set_web_contents(web_contents()); test_sync_service_ = static_cast<TestSyncService*>( @@ -127,13 +124,11 @@ } // Returns copies of the same constant dictionary, |about_information_|. - std::unique_ptr<DictionaryValue> ConstructFakeAboutInformation( - SyncService* service, - const std::string& channel) { + base::Value::Dict ConstructFakeAboutInformation(SyncService* service, + const std::string& channel) { ++about_sync_data_delegate_call_count_; last_delegate_sync_service_ = service; - return base::DictionaryValue::From( - base::Value::ToUniquePtrValue(about_information_.Clone())); + return about_information_.Clone(); } void ValidateAboutInfoCall() { @@ -200,7 +195,7 @@ int about_sync_data_delegate_call_count_ = 0; raw_ptr<SyncService> last_delegate_sync_service_ = nullptr; // Fake return value for sync_ui_util::ConstructAboutInformation(). - base::DictionaryValue about_information_; + base::Value::Dict about_information_; }; TEST_F(SyncInternalsMessageHandlerTest, AddRemoveObservers) { @@ -244,28 +239,25 @@ } TEST_F(SyncInternalsMessageHandlerTest, HandleGetAllNodes) { - base::Value args(base::Value::Type::LIST); + base::Value::List args; args.Append("getAllNodes_0"); - handler()->HandleGetAllNodes(args.GetList()); - test_sync_service()->get_all_nodes_callback().Run( - std::make_unique<base::ListValue>()); + handler()->HandleGetAllNodes(args); + test_sync_service()->get_all_nodes_callback().Run(base::Value::List()); EXPECT_EQ(1, CallCountWithName("cr.webUIResponse")); - base::Value args2(base::Value::Type::LIST); + base::Value::List args2; args2.Append("getAllNodes_1"); - handler()->HandleGetAllNodes(args2.GetList()); + handler()->HandleGetAllNodes(args2); // This breaks the weak ref the callback is hanging onto. Which results in // the call count not incrementing. handler()->DisallowJavascript(); - test_sync_service()->get_all_nodes_callback().Run( - std::make_unique<base::ListValue>()); + test_sync_service()->get_all_nodes_callback().Run(base::Value::List()); EXPECT_EQ(1, CallCountWithName("cr.webUIResponse")); - base::Value args3(base::Value::Type::LIST); + base::Value::List args3; args3.Append("getAllNodes_2"); - handler()->HandleGetAllNodes(args3.GetList()); - test_sync_service()->get_all_nodes_callback().Run( - std::make_unique<base::ListValue>()); + handler()->HandleGetAllNodes(args3); + test_sync_service()->get_all_nodes_callback().Run(base::Value::List()); EXPECT_EQ(2, CallCountWithName("cr.webUIResponse")); } @@ -290,10 +282,10 @@ } TEST_F(SyncInternalsMessageHandlerTest, WriteUserEvent) { - base::Value args(base::Value::Type::LIST); + base::Value::List args; args.Append("1000000000000000000"); args.Append("-1"); - handler()->HandleWriteUserEvent(args.GetList()); + handler()->HandleWriteUserEvent(args); ASSERT_EQ(1u, fake_user_event_service()->GetRecordedUserEvents().size()); const UserEventSpecifics& event = @@ -304,10 +296,10 @@ } TEST_F(SyncInternalsMessageHandlerTest, WriteUserEventBadParse) { - base::Value args(base::Value::Type::LIST); + base::Value::List args; args.Append("123abc"); args.Append("abcdefghijklmnopqrstuvwxyz"); - handler()->HandleWriteUserEvent(args.GetList()); + handler()->HandleWriteUserEvent(args); ASSERT_EQ(1u, fake_user_event_service()->GetRecordedUserEvents().size()); const UserEventSpecifics& event = @@ -318,10 +310,10 @@ } TEST_F(SyncInternalsMessageHandlerTest, WriteUserEventBlank) { - base::Value args(base::Value::Type::LIST); + base::Value::List args; args.Append(""); args.Append(""); - handler()->HandleWriteUserEvent(args.GetList()); + handler()->HandleWriteUserEvent(args); ASSERT_EQ(1u, fake_user_event_service()->GetRecordedUserEvents().size()); const UserEventSpecifics& event = @@ -335,10 +327,10 @@ } TEST_F(SyncInternalsMessageHandlerTest, WriteUserEventZero) { - base::Value args(base::Value::Type::LIST); + base::Value::List args; args.Append("0"); args.Append("0"); - handler()->HandleWriteUserEvent(args.GetList()); + handler()->HandleWriteUserEvent(args); ASSERT_EQ(1u, fake_user_event_service()->GetRecordedUserEvents().size()); const UserEventSpecifics& event =
diff --git a/chrome/browser/ui/webui/system_info_ui.cc b/chrome/browser/ui/webui/system_info_ui.cc index 0b2e16b..412c332 100644 --- a/chrome/browser/ui/webui/system_info_ui.cc +++ b/chrome/browser/ui/webui/system_info_ui.cc
@@ -140,8 +140,7 @@ val.Set("statValue", it->second); data.Append(std::move(val)); } - ResolveJavascriptCallback(base::Value(callback_id_), - base::Value(std::move(data))); + ResolveJavascriptCallback(base::Value(callback_id_), data); callback_id_.clear(); }
diff --git a/chrome/browser/ui/webui/theme_handler.cc b/chrome/browser/ui/webui/theme_handler.cc index a98b4db..760c66b 100644 --- a/chrome/browser/ui/webui/theme_handler.cc +++ b/chrome/browser/ui/webui/theme_handler.cc
@@ -79,8 +79,8 @@ bool has_custom_bg = ThemeService::GetThemeProviderForProfile(GetProfile()) .HasCustomImage(IDR_THEME_NTP_BACKGROUND); // TODO(dbeam): why does this need to be a dictionary? - base::DictionaryValue dictionary; - dictionary.SetBoolKey("hasCustomBackground", has_custom_bg); + base::Value::Dict dictionary; + dictionary.Set("hasCustomBackground", has_custom_bg); FireWebUIListener("theme-changed", dictionary); }
diff --git a/chrome/browser/ui/webui/webapks/OWNERS b/chrome/browser/ui/webui/webapks/OWNERS new file mode 100644 index 0000000..3fa3f22 --- /dev/null +++ b/chrome/browser/ui/webui/webapks/OWNERS
@@ -0,0 +1 @@ +file://components/webapk/OWNERS
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 30e2fd1..122f3aa 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1659505904-cb9abb091024ee19865c95d562f565a4ed60f6da.profdata +chrome-linux-main-1659549585-998f2a348263bf80f8e6b9bf998d9380e9afb578.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 5de04ee..9b30a0d 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1659505904-83e0fdaf4082098625a4e221f09c10556f9d6c2f.profdata +chrome-win32-main-1659517197-9ea12a2575a72436c0ac57d2fcb150844b7cc228.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index c6e1e91..60f5b2d 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1659505904-f391b83b373a0e16fcf7d6f7f71e33eefc87dab9.profdata +chrome-win64-main-1659517197-7cf67731ce3ab090e62d83e3d26d824f1f46d75f.profdata
diff --git a/chrome/common/chrome_content_client.cc b/chrome/common/chrome_content_client.cc index 37dc334..bdd746c 100644 --- a/chrome/common/chrome_content_client.cc +++ b/chrome/common/chrome_content_client.cc
@@ -88,9 +88,11 @@ #include "components/pdf/common/internal_plugin_helpers.h" #endif +#if BUILDFLAG(ENABLE_LIBRARY_CDMS) #if BUILDFLAG(ENABLE_CDM_HOST_VERIFICATION) #include "chrome/common/media/cdm_host_file_path.h" #endif +#endif #if BUILDFLAG(IS_ANDROID) #include "chrome/common/media/chrome_media_drm_bridge_client.h" @@ -225,10 +227,12 @@ if (cdms) RegisterCdmInfo(cdms); +#if BUILDFLAG(ENABLE_LIBRARY_CDMS) #if BUILDFLAG(ENABLE_CDM_HOST_VERIFICATION) if (cdm_host_file_paths) AddCdmHostFilePaths(cdm_host_file_paths); #endif +#endif } // New schemes by which content can be retrieved should almost certainly be
diff --git a/chrome/renderer/cart/commerce_hint_agent.cc b/chrome/renderer/cart/commerce_hint_agent.cc index 0ae3e3f5..99dc734 100644 --- a/chrome/renderer/cart/commerce_hint_agent.cc +++ b/chrome/renderer/cart/commerce_hint_agent.cc
@@ -425,6 +425,8 @@ if (pattern_from_component && kSkipPattern.Get() == kSkipPattern.default_value) { DVLOG(1) << "SkipPattern = " << pattern_from_component->pattern(); + CommerceHeuristicsDataMetricsHelper::RecordSkipProductPatternSource( + CommerceHeuristicsDataMetricsHelper::HeuristicsSource::FROM_COMPONENT); return *pattern_from_component; } static base::NoDestructor<re2::RE2> instance([] { @@ -432,6 +434,9 @@ DVLOG(1) << "SkipPattern = " << pattern; return pattern; }()); + CommerceHeuristicsDataMetricsHelper::RecordSkipProductPatternSource( + CommerceHeuristicsDataMetricsHelper::HeuristicsSource:: + FROM_FEATURE_PARAMETER); return *instance; }
diff --git a/chrome/renderer/cart/commerce_hint_agent_unittest.cc b/chrome/renderer/cart/commerce_hint_agent_unittest.cc index 342cad8..2b81c8d 100644 --- a/chrome/renderer/cart/commerce_hint_agent_unittest.cc +++ b/chrome/renderer/cart/commerce_hint_agent_unittest.cc
@@ -1055,6 +1055,18 @@ for (auto* str : kNotSkipText) { EXPECT_FALSE(CommerceHintAgent::ShouldSkip(str)) << str; } + int match_times = (sizeof(kSkipText) / sizeof(*kSkipText)) + + (sizeof(kNotSkipText) / sizeof(*kNotSkipText)); + ASSERT_EQ(histogram_tester_.GetBucketCount( + "Commerce.Heuristics.SkipProductPatternSource", + CommerceHeuristicsDataMetricsHelper::HeuristicsSource:: + FROM_FEATURE_PARAMETER), + match_times); + ASSERT_EQ(histogram_tester_.GetBucketCount( + "Commerce.Heuristics.SkipProductPatternSource", + CommerceHeuristicsDataMetricsHelper::HeuristicsSource:: + FROM_COMPONENT), + 0); } TEST_F(CommerceHintAgentUnitTest, ShouldSkipFromComponent) { @@ -1072,6 +1084,18 @@ for (auto* str : kNotSkipText) { EXPECT_FALSE(CommerceHintAgent::ShouldSkip(str)) << str; } + int match_times = (sizeof(kSkipText) / sizeof(*kSkipText)) + + (sizeof(kNotSkipText) / sizeof(*kNotSkipText)); + ASSERT_EQ(histogram_tester_.GetBucketCount( + "Commerce.Heuristics.SkipProductPatternSource", + CommerceHeuristicsDataMetricsHelper::HeuristicsSource:: + FROM_FEATURE_PARAMETER), + 0); + ASSERT_EQ(histogram_tester_.GetBucketCount( + "Commerce.Heuristics.SkipProductPatternSource", + CommerceHeuristicsDataMetricsHelper::HeuristicsSource:: + FROM_COMPONENT), + match_times); } TEST_F(CommerceHintAgentUnitTest, ShouldSkip_Priority) {
diff --git a/chrome/services/sharing/nearby/platform/bluetooth_adapter.cc b/chrome/services/sharing/nearby/platform/bluetooth_adapter.cc index 200234cd..474f4cf 100644 --- a/chrome/services/sharing/nearby/platform/bluetooth_adapter.cc +++ b/chrome/services/sharing/nearby/platform/bluetooth_adapter.cc
@@ -67,6 +67,14 @@ } bool BluetoothAdapter::SetName(absl::string_view name) { + return SetName(name, /*persist=*/true); +} + +bool BluetoothAdapter::SetName(absl::string_view name, bool persist) { + // The persist parameter is not used by ChromeOS. The function was created + // in the base class to support Windows. For ChromeOS, we will always pass + // true. If this capability is needed later on, the reference can be found + // at b/234135746. bool set_name_success = false; bool call_success = adapter_->SetName(name.data(), &set_name_success);
diff --git a/chrome/services/sharing/nearby/platform/bluetooth_adapter.h b/chrome/services/sharing/nearby/platform/bluetooth_adapter.h index 9326953..065e77c3 100644 --- a/chrome/services/sharing/nearby/platform/bluetooth_adapter.h +++ b/chrome/services/sharing/nearby/platform/bluetooth_adapter.h
@@ -33,6 +33,7 @@ ScanMode GetScanMode() const override; bool SetScanMode(ScanMode scan_mode) override; std::string GetName() const override; + bool SetName(absl::string_view name, bool persist) override; bool SetName(absl::string_view name) override; std::string GetMacAddress() const override;
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 5dd2bc55..4b6e88ff 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -1476,7 +1476,6 @@ "//media:media_buildflags", "//media:test_support", "//media/cast:test_support", - "//media/cdm:cdm_paths", "//media/mojo/services", "//mojo/core/embedder", "//mojo/public/cpp/system", @@ -4366,6 +4365,8 @@ sources -= [ "../browser/media/encrypted_media_browsertest.cc" ] } if (enable_library_cdms) { + deps += [ "//media/cdm:cdm_paths" ] + # Runtime dependencies. data_deps += [ "//media/cdm/library_cdm/clear_key_cdm", @@ -7460,6 +7461,7 @@ "../browser/lacros/prefs_ash_observer_unittest.cc", "../browser/lacros/remote_apps/remote_apps_proxy_lacros_unittest.cc", "../browser/lacros/sync/sync_explicit_passphrase_client_lacros_unittest.cc", + "../browser/lacros/sync/sync_user_settings_client_lacros_unittest.cc", "../browser/metrics/lacros_metrics_provider_unittest.cc", "../browser/notifications/notification_platform_bridge_lacros_unittest.cc", "../browser/policy/restricted_mgs_policy_provider_lacros_unittest.cc", @@ -10231,7 +10233,6 @@ "//base", "//base/test:test_support_perf", "//media:media_buildflags", - "//media/cdm:cdm_paths", "//testing/gtest", "//testing/perf", "//third_party/widevine/cdm:buildflags",
diff --git a/chrome/test/data/extensions/api_test/webrequest_persistent/background.js b/chrome/test/data/extensions/api_test/webrequest_persistent/background.js new file mode 100644 index 0000000..89f940b --- /dev/null +++ b/chrome/test/data/extensions/api_test/webrequest_persistent/background.js
@@ -0,0 +1,41 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +let storageComplete = undefined; +let isUsingStorage = false; + +// Waits for any pending load to complete to avoid raciness in the test. +async function flushStorage() { + console.assert(!storageComplete); + if (!isUsingStorage) + return; + await new Promise((resolve) => { + storageComplete = resolve; + }); + storageComplete = undefined; +} + +// Increments a counter storing the number of seen events. +function beforeRequestListener() { + isUsingStorage = true; + chrome.storage.local.get( + {requestCount: 0}, + (result) => { + let currentCount = result.requestCount; + chrome.test.assertTrue(typeof currentCount == 'number'); + chrome.test.assertTrue(currentCount >= 0); + ++currentCount; + chrome.storage.local.set( + {requestCount: currentCount}, + () => { + isUsingStorage = false; + if (storageComplete) + storageComplete(); + }); + }); +} + +chrome.webRequest.onBeforeRequest.addListener( + beforeRequestListener, + {urls: ["*://example.com/*"], types: ['main_frame']});
diff --git a/chrome/test/data/extensions/api_test/webrequest_persistent/manifest.json b/chrome/test/data/extensions/api_test/webrequest_persistent/manifest.json new file mode 100644 index 0000000..be65a67c --- /dev/null +++ b/chrome/test/data/extensions/api_test/webrequest_persistent/manifest.json
@@ -0,0 +1,10 @@ +{ + "name": "Web Request Persistence", + "version": "0.1", + "manifest_version": 2, + "background": { + "scripts": ["background.js"], + "persistent": true + }, + "permissions": ["webRequest", "storage", "http://example.com/*"] +}
diff --git a/chrome/test/data/webui/chromeos/personalization_app/BUILD.gn b/chrome/test/data/webui/chromeos/personalization_app/BUILD.gn index ebbb905..778747db 100644 --- a/chrome/test/data/webui/chromeos/personalization_app/BUILD.gn +++ b/chrome/test/data/webui/chromeos/personalization_app/BUILD.gn
@@ -50,6 +50,7 @@ "wallpaper_grid_item_element_test.ts", "wallpaper_images_element_test.ts", "wallpaper_observer_test.ts", + "ambient_observer_test.ts", "wallpaper_preview_element_test.ts", "wallpaper_selected_element_test.ts", ]
diff --git a/chrome/test/data/webui/chromeos/personalization_app/ambient_observer_test.ts b/chrome/test/data/webui/chromeos/personalization_app/ambient_observer_test.ts new file mode 100644 index 0000000..2dd2ebaa --- /dev/null +++ b/chrome/test/data/webui/chromeos/personalization_app/ambient_observer_test.ts
@@ -0,0 +1,100 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'chrome://personalization/strings.m.js'; +import 'chrome://webui-test/mojo_webui_test_support.js'; + +import {AmbientActionName, AmbientModeAlbum, AmbientObserver, emptyState, SetAlbumsAction, TopicSource} from 'chrome://personalization/js/personalization_app.js'; +import {assertDeepEquals, assertEquals} from 'chrome://webui-test/chai_assert.js'; + +import {baseSetup} from './personalization_app_test_utils.js'; +import {TestAmbientProvider} from './test_ambient_interface_provider.js'; +import {TestPersonalizationStore} from './test_personalization_store.js'; + +suite('AmbientObserverTest', function() { + let ambientProvider: TestAmbientProvider; + let personalizationStore: TestPersonalizationStore; + + setup(() => { + const mocks = baseSetup(); + ambientProvider = mocks.ambientProvider; + personalizationStore = mocks.personalizationStore; + AmbientObserver.initAmbientObserverIfNeeded(); + }); + + teardown(() => { + AmbientObserver.shutdown(); + }); + + test('requests fetchSettingsAndAlbums on first load', async () => { + await ambientProvider.whenCalled('fetchSettingsAndAlbums'); + }); + + test('sets albums in store', async () => { + personalizationStore.setReducersEnabled(true); + // Make sure state starts as expected. + assertDeepEquals(emptyState(), personalizationStore.data); + assertEquals(null, personalizationStore.data.ambient.albums); + + personalizationStore.expectAction(AmbientActionName.SET_ALBUMS); + ambientProvider.ambientObserverRemote!.onAlbumsChanged( + ambientProvider.albums); + + const {albums} = await personalizationStore.waitForAction( + AmbientActionName.SET_ALBUMS) as SetAlbumsAction; + + assertDeepEquals(ambientProvider.albums, albums); + }); + + test('keeps recent highlights preview image', async () => { + const initialAlbums: AmbientModeAlbum[] = [ + { + id: 'RecentHighlights', + checked: false, + numberOfPhotos: 210, + title: 'Recent Highlights title', + description: 'Recent Highlights description', + topicSource: TopicSource.kGooglePhotos, + url: {url: 'asdf'}, + }, + { + id: 'abcdef', + checked: false, + numberOfPhotos: 3, + title: 'Another album', + description: 'Another album description', + topicSource: TopicSource.kGooglePhotos, + url: {url: 'qwerty'}, + }, + ]; + personalizationStore.data.ambient.albums = initialAlbums; + + personalizationStore.expectAction(AmbientActionName.SET_ALBUMS); + + ambientProvider.ambientObserverRemote!.onAlbumsChanged([ + { + ...initialAlbums[0]!, + url: { + url: 'new-recent-highlights-url', + }, + }, + { + ...initialAlbums[1]!, + url: { + url: 'new-regular-album-url', + }, + }, + ]); + + const {albums} = await personalizationStore.waitForAction( + AmbientActionName.SET_ALBUMS) as SetAlbumsAction; + + assertEquals('RecentHighlights', albums[0]!.id); + assertEquals( + 'asdf', albums[0]!.url.url, 'kept original url for recent highlights'); + assertEquals( + 'new-regular-album-url', albums[1]!.url.url, + 'used updated regular album url'); + }); +});
diff --git a/chrome/test/data/webui/chromeos/personalization_app/personalization_app_component_browsertest.js b/chrome/test/data/webui/chromeos/personalization_app/personalization_app_component_browsertest.js index 53c6e5c..11bb1f1 100644 --- a/chrome/test/data/webui/chromeos/personalization_app/personalization_app_component_browsertest.js +++ b/chrome/test/data/webui/chromeos/personalization_app/personalization_app_component_browsertest.js
@@ -38,7 +38,8 @@ } }; -[['AmbientPreviewTest', 'ambient_preview_element_test.js'], +[['AmbientObserverTest', 'ambient_observer_test.js'], + ['AmbientPreviewTest', 'ambient_preview_element_test.js'], ['AmbientSubpageTest', 'ambient_subpage_element_test.js'], ['AvatarCameraTest', 'avatar_list_element_test.js'], ['AvatarListTest', 'avatar_list_element_test.js'],
diff --git a/chrome/test/data/webui/chromeos/personalization_app/test_ambient_interface_provider.ts b/chrome/test/data/webui/chromeos/personalization_app/test_ambient_interface_provider.ts index 75aefb9..d6c502b1 100644 --- a/chrome/test/data/webui/chromeos/personalization_app/test_ambient_interface_provider.ts +++ b/chrome/test/data/webui/chromeos/personalization_app/test_ambient_interface_provider.ts
@@ -64,6 +64,7 @@ 'setTopicSource', 'setTemperatureUnit', 'setAlbumSelected', + 'fetchSettingsAndAlbums', ]); } @@ -117,4 +118,8 @@ setPageViewed() { this.methodCalled('setPageViewed'); } + + fetchSettingsAndAlbums() { + this.methodCalled('fetchSettingsAndAlbums'); + } }
diff --git a/chrome/test/data/webui/chromeos/personalization_app/test_wallpaper_interface_provider.ts b/chrome/test/data/webui/chromeos/personalization_app/test_wallpaper_interface_provider.ts index c5cbd3c1..795bdc35 100644 --- a/chrome/test/data/webui/chromeos/personalization_app/test_wallpaper_interface_provider.ts +++ b/chrome/test/data/webui/chromeos/personalization_app/test_wallpaper_interface_provider.ts
@@ -102,7 +102,7 @@ layout: WallpaperLayout.kCenter, key: '1', type: WallpaperType.kOnline, - url: {url: 'https://images.googleusercontent.com/0'}, + url: {url: 'data:image/png;base64somedataurl/0'}, }; }
diff --git a/chrome/test/data/webui/chromeos/personalization_app/wallpaper_preview_element_test.ts b/chrome/test/data/webui/chromeos/personalization_app/wallpaper_preview_element_test.ts index 872c7f5c..8d12cd4 100644 --- a/chrome/test/data/webui/chromeos/personalization_app/wallpaper_preview_element_test.ts +++ b/chrome/test/data/webui/chromeos/personalization_app/wallpaper_preview_element_test.ts
@@ -86,9 +86,7 @@ await waitAfterNextRender(wallpaperPreviewElement); const img = wallpaperPreviewElement.shadowRoot!.querySelector('img'); - assertEquals( - `chrome://image/?${wallpaperProvider.currentWallpaper.url.url}`, - img!.src); + assertEquals(wallpaperProvider.currentWallpaper.url.url, img!.src); }); test('shows placeholders when image fails to load', async () => {
diff --git a/chrome/test/data/webui/chromeos/personalization_app/wallpaper_selected_element_test.ts b/chrome/test/data/webui/chromeos/personalization_app/wallpaper_selected_element_test.ts index d332804..aebf5e5 100644 --- a/chrome/test/data/webui/chromeos/personalization_app/wallpaper_selected_element_test.ts +++ b/chrome/test/data/webui/chromeos/personalization_app/wallpaper_selected_element_test.ts
@@ -91,9 +91,7 @@ await waitAfterNextRender(wallpaperSelectedElement); const img = wallpaperSelectedElement.shadowRoot!.querySelector('img'); - assertEquals( - `chrome://image/?${wallpaperProvider.currentWallpaper.url.url}`, - img!.src); + assertEquals(wallpaperProvider.currentWallpaper.url.url, img!.src); const textContainerElements = wallpaperSelectedElement.shadowRoot!.querySelectorAll( @@ -134,21 +132,6 @@ title!.textContent!.trim()); }); - test('removes high resolution suffix from image url', async () => { - personalizationStore.data.wallpaper.currentSelected = { - url: {url: 'https://images.googleusercontent.com/abc12=w456'}, - attribution: [], - assetId: BigInt(100), - }; - personalizationStore.data.wallpaper.loading.selected = false; - wallpaperSelectedElement = initElement(WallpaperSelected); - await waitAfterNextRender(wallpaperSelectedElement); - - const img = wallpaperSelectedElement.shadowRoot!.querySelector('img'); - assertEquals( - 'chrome://image/?https://images.googleusercontent.com/abc12', img!.src); - }); - test('updates image when store is updated', async () => { personalizationStore.data.wallpaper.currentSelected = wallpaperProvider.currentWallpaper; @@ -159,19 +142,17 @@ const img = wallpaperSelectedElement.shadowRoot!.querySelector('img') as HTMLImageElement; - assertEquals( - `chrome://image/?${wallpaperProvider.currentWallpaper.url.url}`, - img.src); + assertEquals(wallpaperProvider.currentWallpaper.url.url, img.src); personalizationStore.data.wallpaper.currentSelected = { - url: {url: 'https://testing'}, + url: {url: 'data:image/png;base64_some_new_data'}, attribution: ['New attribution'], assetId: BigInt(100), }; personalizationStore.notifyObservers(); await waitAfterNextRender(wallpaperSelectedElement); - assertEquals('chrome://image/?https://testing', img.src); + assertEquals('data:image/png;base64_some_new_data', img.src); }); test('shows placeholders when image fails to load', async () => {
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/onboarding_select_components_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/onboarding_select_components_page_test.js index b01976a..bc83b542 100644 --- a/chrome/test/data/webui/chromeos/shimless_rma/onboarding_select_components_page_test.js +++ b/chrome/test/data/webui/chromeos/shimless_rma/onboarding_select_components_page_test.js
@@ -3,7 +3,6 @@ // found in the LICENSE file. import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js'; -import {getDeepActiveElement} from 'chrome://resources/js/util.m.js'; import {fakeComponentsForRepairStateTest} from 'chrome://shimless-rma/fake_data.js'; import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js'; import {setShimlessRmaServiceForTesting} from 'chrome://shimless-rma/mojo_interface_provider.js'; @@ -129,7 +128,7 @@ const components = getComponentRepairStateList(); assertNotEquals(fakeComponentsForRepairStateTest, components); - fakeComponentsForRepairStateTest[1].state = ComponentRepairStatus.kReplaced; + fakeComponentsForRepairStateTest[0].state = ComponentRepairStatus.kReplaced; assertDeepEquals(fakeComponentsForRepairStateTest, components); }); @@ -196,110 +195,4 @@ assertEquals(0, callCounter); }); - - test('SelectComponentsPageKeyboardNavigationWorks', async () => { - await initializeComponentSelectPage(fakeComponentsForRepairStateTest); - - const componentCameraButton = - component.shadowRoot.querySelector('#componentCamera') - .shadowRoot.querySelector('#componentButton'); - const componentTouchpadButton = - component.shadowRoot.querySelector('#componentTouchpad') - .shadowRoot.querySelector('#componentButton'); - const componentNetworkButton = - component.shadowRoot.querySelector('#componentNetwork') - .shadowRoot.querySelector('#componentButton'); - // There are two cameras, so we can only get the first one by the id. We get - // the second one by the unique id. - const componentSecondCameraButton = - component.shadowRoot.querySelector('[unique-id="7"]') - .shadowRoot.querySelector('#componentButton'); - - await flushTasks(); - - // At the beginning we should be focused on the first clickable component, - // which is the camera. - assertDeepEquals(componentCameraButton, getDeepActiveElement()); - // We are at the beginning of the list, so left arrow should do nothing. - window.dispatchEvent(new KeyboardEvent('keydown', {key: 'ArrowLeft'})); - await flushTasks(); - assertDeepEquals(componentCameraButton, getDeepActiveElement()); - - // Skip the battery because it's missing. - window.dispatchEvent(new KeyboardEvent('keydown', {key: 'ArrowRight'})); - await flushTasks(); - assertDeepEquals(componentTouchpadButton, getDeepActiveElement()); - - // Skip two components. - window.dispatchEvent(new KeyboardEvent('keydown', {key: 'ArrowRight'})); - await flushTasks(); - assertDeepEquals(componentNetworkButton, getDeepActiveElement()); - - // If the next component is good, we don't skip it. - window.dispatchEvent(new KeyboardEvent('keydown', {key: 'ArrowRight'})); - await flushTasks(); - assertDeepEquals(componentSecondCameraButton, getDeepActiveElement()); - - // We have reached the end of the list, so we can't go any further. - window.dispatchEvent(new KeyboardEvent('keydown', {key: 'ArrowRight'})); - await flushTasks(); - assertDeepEquals(componentSecondCameraButton, getDeepActiveElement()); - - // Check that we can go backwards the same way. - window.dispatchEvent(new KeyboardEvent('keydown', {key: 'ArrowLeft'})); - await flushTasks(); - assertDeepEquals(componentNetworkButton, getDeepActiveElement()); - window.dispatchEvent(new KeyboardEvent('keydown', {key: 'ArrowLeft'})); - await flushTasks(); - assertDeepEquals(componentTouchpadButton, getDeepActiveElement()); - window.dispatchEvent(new KeyboardEvent('keydown', {key: 'ArrowLeft'})); - await flushTasks(); - assertDeepEquals(componentCameraButton, getDeepActiveElement()); - - // Check that the down button navigates down the column. It should skip the - // network component, because it is in a different column. - window.dispatchEvent(new KeyboardEvent('keydown', {key: 'ArrowDown'})); - await flushTasks(); - assertDeepEquals(componentTouchpadButton, getDeepActiveElement()); - window.dispatchEvent(new KeyboardEvent('keydown', {key: 'ArrowDown'})); - await flushTasks(); - assertDeepEquals(componentSecondCameraButton, getDeepActiveElement()); - window.dispatchEvent(new KeyboardEvent('keydown', {key: 'ArrowDown'})); - await flushTasks(); - assertDeepEquals(componentSecondCameraButton, getDeepActiveElement()); - - // The up button should work in a similar way. - window.dispatchEvent(new KeyboardEvent('keydown', {key: 'ArrowUp'})); - await flushTasks(); - assertDeepEquals(componentTouchpadButton, getDeepActiveElement()); - window.dispatchEvent(new KeyboardEvent('keydown', {key: 'ArrowUp'})); - await flushTasks(); - assertDeepEquals(componentCameraButton, getDeepActiveElement()); - window.dispatchEvent(new KeyboardEvent('keydown', {key: 'ArrowUp'})); - await flushTasks(); - assertDeepEquals(componentCameraButton, getDeepActiveElement()); - - // Click on the touchpad button. It should come into focus. - componentTouchpadButton.click(); - await flushTasks(); - assertDeepEquals(componentTouchpadButton, getDeepActiveElement()); - - // Click on the battery button. It's disabled, so we shouldn't focus on it. - const componentBatteryButton = - component.shadowRoot.querySelector('#componentBattery') - .shadowRoot.querySelector('#componentButton'); - componentBatteryButton.click(); - await flushTasks(); - assertDeepEquals(componentTouchpadButton, getDeepActiveElement()); - - // Make sure we can bring both cameras into focus, even though they have the - // same id. - componentCameraButton.click(); - await flushTasks(); - assertDeepEquals(componentCameraButton, getDeepActiveElement()); - - componentSecondCameraButton.click(); - await flushTasks(); - assertDeepEquals(componentSecondCameraButton, getDeepActiveElement()); - }); }
diff --git a/chrome/test/data/webui/settings/BUILD.gn b/chrome/test/data/webui/settings/BUILD.gn index cec9d13..a8291588 100644 --- a/chrome/test/data/webui/settings/BUILD.gn +++ b/chrome/test/data/webui/settings/BUILD.gn
@@ -37,7 +37,7 @@ "test_languages_browser_proxy.ts", "spell_check_page_tests.ts", "languages_page_metrics_test_browser.ts", - "spell_check_page_metrics_test_browser.ts", + "translate_page_metrics_test_browser.ts", ] } @@ -156,12 +156,13 @@ } else { non_preprocessed_files += [ "fake_language_settings_private.ts", - "languages_page_details_tests.ts", + "translate_page_tests.ts", "languages_page_tests.ts", "languages_tests.ts", "metrics_reporting_tests.ts", "people_page_manage_profile_test.ts", "relaunch_confirmation_dialog_test.ts", + "test_languages_settings_metrics_proxy.ts", ] }
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js index 3cd5106..cb2fbdb6d 100644 --- a/chrome/test/data/webui/settings/cr_settings_browsertest.js +++ b/chrome/test/data/webui/settings/cr_settings_browsertest.js
@@ -127,28 +127,24 @@ mocha.grep(languages_page_tests.TestNames.LanguageMenu).run(); }); -var CrSettingsLanguagesPageDetailedTest = - class extends CrSettingsBrowserTest { +var CrSettingsTranslatePageTest = class extends CrSettingsBrowserTest { /** @override */ get browsePreload() { - return 'chrome://settings/test_loader.html?module=settings/languages_page_details_tests.js'; + return 'chrome://settings/test_loader.html?module=settings/translate_page_tests.js'; } }; -TEST_F( - 'CrSettingsLanguagesPageDetailedTest', 'AlwaysTranslateDialog', - function() { - mocha - .grep(languages_page_details_tests.TestNames.AlwaysTranslateDialog) - .run(); - }); +TEST_F('CrSettingsTranslatePageTest', 'AlwaysTranslateDialog', function() { + mocha.grep(translate_page_tests.TestNames.AlwaysTranslateDialog).run(); +}); -TEST_F( - 'CrSettingsLanguagesPageDetailedTest', 'NeverTranslateDialog', - function() { - mocha.grep(languages_page_details_tests.TestNames.NeverTranslateDialog) - .run(); - }); +TEST_F('CrSettingsTranslatePageTest', 'NeverTranslateDialog', function() { + mocha.grep(translate_page_tests.TestNames.NeverTranslateDialog).run(); +}); + +TEST_F('CrSettingsTranslatePageTest', 'TranslateToggle', function() { + mocha.grep(translate_page_tests.TestNames.TranslateToggle).run(); +}); var CrSettingsLanguagesPageMetricsTest = class extends CrSettingsBrowserTest { /** @override */ @@ -163,28 +159,18 @@ runMochaSuite('LanguagesPageMetricsBrowser'); }); -var CrSettingsSpellCheckPageMetricsTest = class extends CrSettingsBrowserTest { +var CrSettingsTranslatePageMetricsTest = class extends CrSettingsBrowserTest { /** @override */ get browsePreload() { - return 'chrome://settings/test_loader.html?module=settings/spell_check_page_metrics_test_browser.js'; + return 'chrome://settings/test_loader.html?module=settings/translate_page_metrics_test_browser.js'; } }; -TEST_F('CrSettingsSpellCheckPageMetricsTest', 'SpellCheckMetrics', function() { - mocha.grep(spell_check_page_metrics_test_browser.TestNames.SpellCheckMetrics).run(); -}); - -GEN('#if BUILDFLAG(GOOGLE_CHROME_BRANDING)'); -TEST_F('CrSettingsSpellCheckPageMetricsTest', 'SpellCheckMetricsOfficialBuild', function() { - mocha.grep(spell_check_page_metrics_test_browser.TestNames.SpellCheckMetricsOfficialBuild).run(); -}); -GEN('#endif'); - -GEN('#if !BUILDFLAG(IS_MAC)'); -TEST_F('CrSettingsSpellCheckPageMetricsTest', 'SpellCheckMetricsNotMacOSx', function() { - mocha.grep(spell_check_page_metrics_test_browser.TestNames.SpellCheckMetricsNotMacOSx).run(); -}); -GEN('#endif'); +TEST_F( + 'CrSettingsTranslatePageMetricsTest', 'TranslatePageMetricsBrowser', + function() { + runMochaSuite('TranslatePageMetricsBrowser'); + }); GEN('#endif // !BUILDFLAG(IS_CHROMEOS_ASH)');
diff --git a/chrome/test/data/webui/settings/languages_page_details_tests.ts b/chrome/test/data/webui/settings/languages_page_details_tests.ts deleted file mode 100644 index 47ff05484..0000000 --- a/chrome/test/data/webui/settings/languages_page_details_tests.ts +++ /dev/null
@@ -1,235 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// clang-format off -import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js'; -import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {LanguageHelper, LanguagesBrowserProxyImpl, SettingsAddLanguagesDialogElement, SettingsLanguagesPageElement} from 'chrome://settings/lazy_load.js'; -import {CrSettingsPrefs, loadTimeData} from 'chrome://settings/settings.js'; -import {assertDeepEquals, assertEquals, assertTrue} from 'chrome://webui-test/chai_assert.js'; -import {eventToPromise, fakeDataBind} from 'chrome://webui-test/test_util.js'; - -import {FakeLanguageSettingsPrivate, getFakeLanguagePrefs} from './fake_language_settings_private.js'; -import {FakeSettingsPrivate} from './fake_settings_private.js'; -import {TestLanguagesBrowserProxy} from './test_languages_browser_proxy.js'; - -// clang-format on - -const languages_page_details_tests = { - TestNames: { - AlwaysTranslateDialog: 'always translate dialog', - NeverTranslateDialog: 'never translate dialog', - }, -}; - -Object.assign(window, {languages_page_details_tests}); - -suite('languages page detailed settings', function() { - let languageHelper: LanguageHelper; - let languagesPage: SettingsLanguagesPageElement; - let browserProxy: TestLanguagesBrowserProxy; - - // Always Translate language pref name for the platform. - const alwaysTranslatePref = 'translate_allowlists'; - const neverTranslatePref = 'translate_blocked_languages'; - - suiteSetup(function() { - loadTimeData.overrideValues({ - enableDesktopDetailedLanguageSettings: true, - }); - document.body.innerHTML = ''; - CrSettingsPrefs.deferInitialization = true; - }); - - setup(function() { - const settingsPrefs = document.createElement('settings-prefs'); - const settingsPrivate = new FakeSettingsPrivate(getFakeLanguagePrefs()); - settingsPrefs.initialize( - settingsPrivate as unknown as typeof chrome.settingsPrivate); - document.body.appendChild(settingsPrefs); - return CrSettingsPrefs.initialized.then(function() { - // Set up test browser proxy. - browserProxy = new TestLanguagesBrowserProxy(); - LanguagesBrowserProxyImpl.setInstance(browserProxy); - - // Set up fake languageSettingsPrivate API. - const languageSettingsPrivate = - browserProxy.getLanguageSettingsPrivate() as unknown as - FakeLanguageSettingsPrivate; - languageSettingsPrivate.setSettingsPrefs(settingsPrefs); - - const settingsLanguages = document.createElement('settings-languages'); - settingsLanguages.prefs = settingsPrefs.prefs; - fakeDataBind(settingsPrefs, settingsLanguages, 'prefs'); - document.body.appendChild(settingsLanguages); - - languagesPage = document.createElement('settings-languages-page'); - - languagesPage.prefs = settingsPrefs.prefs; - fakeDataBind(settingsPrefs, languagesPage, 'prefs'); - - languagesPage.languageHelper = settingsLanguages.languageHelper; - fakeDataBind(settingsLanguages, languagesPage, 'language-helper'); - - languagesPage.languages = settingsLanguages.languages; - fakeDataBind(settingsLanguages, languagesPage, 'languages'); - - document.body.appendChild(languagesPage); - flush(); - - languageHelper = languagesPage.languageHelper; - return languageHelper.whenReady(); - }); - }); - - teardown(function() { - document.body.innerHTML = ''; - }); - - suite( - languages_page_details_tests.TestNames.AlwaysTranslateDialog, - function() { - let dialog: SettingsAddLanguagesDialogElement; - let dialogClosedResolver: PromiseResolver<void>; - let dialogClosedObserver: MutationObserver; - - // Resolves the PromiseResolver if the mutation includes removal of the - // settings-add-languages-dialog. - // TODO(michaelpg): Extract into a common method similar to - // whenAttributeIs for use elsewhere. - function onMutation( - mutations: MutationRecord[], observer: MutationObserver) { - if (mutations.some(function(mutation) { - return mutation.type === 'childList' && - Array.from(mutation.removedNodes).includes(dialog); - })) { - // Sanity check: the dialog should no longer be in the DOM. - assertEquals( - null, - languagesPage.shadowRoot!.querySelector( - 'settings-add-languages-dialog')); - observer.disconnect(); - assertTrue(!!dialogClosedResolver); - dialogClosedResolver.resolve(); - } - } - - setup(function() { - const addLanguagesButton = - languagesPage.shadowRoot!.querySelector<HTMLElement>( - '#addAlwaysTranslate'); - const whenDialogOpen = - eventToPromise('cr-dialog-open', languagesPage); - assertTrue(!!addLanguagesButton); - addLanguagesButton.click(); - - // The page stamps the dialog, registers listeners, and populates the - // iron-list asynchronously at microtask timing, so wait for a new - // task. - return whenDialogOpen.then(() => { - dialog = languagesPage.shadowRoot!.querySelector( - 'settings-add-languages-dialog')!; - assertTrue(!!dialog); - assertEquals(dialog.id, 'alwaysTranslateDialog'); - - // Observe the removal of the dialog via MutationObserver since the - // HTMLDialogElement 'close' event fires at an unpredictable time. - dialogClosedResolver = new PromiseResolver(); - dialogClosedObserver = new MutationObserver(onMutation); - dialogClosedObserver.observe( - languagesPage.shadowRoot!, {childList: true}); - - flush(); - }); - }); - - teardown(function() { - dialogClosedObserver.disconnect(); - }); - - test('add languages and confirm', function() { - dialog.dispatchEvent( - new CustomEvent('languages-added', {detail: ['en', 'no']})); - dialog.$.dialog.close(); - assertDeepEquals( - ['en', 'no'], - languagesPage.getPref(alwaysTranslatePref).value); - - return dialogClosedResolver.promise; - }); - }); - - suite( - languages_page_details_tests.TestNames.NeverTranslateDialog, - function() { - let dialog: SettingsAddLanguagesDialogElement; - let dialogClosedResolver: PromiseResolver<void>; - let dialogClosedObserver: MutationObserver; - - // Resolves the PromiseResolver if the mutation includes removal of the - // settings-add-languages-dialog. - // TODO(michaelpg): Extract into a common method similar to - // whenAttributeIs for use elsewhere. - function onMutation( - mutations: MutationRecord[], observer: MutationObserver) { - if (mutations.some(function(mutation) { - return mutation.type === 'childList' && - Array.from(mutation.removedNodes).includes(dialog); - })) { - // Sanity check: the dialog should no longer be in the DOM. - assertEquals( - null, - languagesPage.shadowRoot!.querySelector( - 'settings-add-languages-dialog')); - observer.disconnect(); - assertTrue(!!dialogClosedResolver); - dialogClosedResolver.resolve(); - } - } - - setup(function() { - const addLanguagesButton = - languagesPage.shadowRoot!.querySelector<HTMLElement>( - '#addNeverTranslate'); - const whenDialogOpen = - eventToPromise('cr-dialog-open', languagesPage); - assertTrue(!!addLanguagesButton); - addLanguagesButton.click(); - - // The page stamps the dialog, registers listeners, and populates the - // iron-list asynchronously at microtask timing, so wait for a new - // task. - return whenDialogOpen.then(() => { - dialog = languagesPage.shadowRoot!.querySelector( - 'settings-add-languages-dialog')!; - assertTrue(!!dialog); - assertEquals(dialog.id, 'neverTranslateDialog'); - - // Observe the removal of the dialog via MutationObserver since the - // HTMLDialogElement 'close' event fires at an unpredictable time. - dialogClosedResolver = new PromiseResolver(); - dialogClosedObserver = new MutationObserver(onMutation); - dialogClosedObserver.observe( - languagesPage.shadowRoot!, {childList: true}); - - flush(); - }); - }); - - teardown(function() { - dialogClosedObserver.disconnect(); - }); - - test('add languages and confirm', function() { - dialog.dispatchEvent( - new CustomEvent('languages-added', {detail: ['sw', 'no']})); - dialog.$.dialog.close(); - assertDeepEquals( - ['en-US', 'sw', 'no'], - languagesPage.getPref(neverTranslatePref).value); - - return dialogClosedResolver.promise; - }); - }); -});
diff --git a/chrome/test/data/webui/settings/languages_page_metrics_test_browser.ts b/chrome/test/data/webui/settings/languages_page_metrics_test_browser.ts index 1e3fc920..1c82587 100644 --- a/chrome/test/data/webui/settings/languages_page_metrics_test_browser.ts +++ b/chrome/test/data/webui/settings/languages_page_metrics_test_browser.ts
@@ -4,33 +4,15 @@ import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {LanguageHelper, LanguagesBrowserProxyImpl, LanguageSettingsActionType, LanguageSettingsMetricsProxy, LanguageSettingsMetricsProxyImpl, LanguageSettingsPageImpressionType, SettingsLanguagesPageElement} from 'chrome://settings/lazy_load.js'; +import {LanguageHelper, LanguagesBrowserProxyImpl, LanguageSettingsActionType, LanguageSettingsMetricsProxyImpl, LanguageSettingsPageImpressionType, SettingsLanguagesPageElement} from 'chrome://settings/lazy_load.js'; import {CrSettingsPrefs} from 'chrome://settings/settings.js'; import {assertEquals, assertTrue} from 'chrome://webui-test/chai_assert.js'; -import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js'; import {fakeDataBind} from 'chrome://webui-test/test_util.js'; import {FakeLanguageSettingsPrivate, getFakeLanguagePrefs} from './fake_language_settings_private.js'; import {FakeSettingsPrivate} from './fake_settings_private.js'; import {TestLanguagesBrowserProxy} from './test_languages_browser_proxy.js'; - -/** - * A test version of LanguageSettingsMetricsProxy. - */ -class TestLanguageSettingsMetricsProxy extends TestBrowserProxy implements - LanguageSettingsMetricsProxy { - constructor() { - super(['recordSettingsMetric', 'recordPageImpressionMetric']); - } - - recordSettingsMetric(interaction: LanguageSettingsActionType) { - this.methodCalled('recordSettingsMetric', interaction); - } - - recordPageImpressionMetric(interaction: LanguageSettingsPageImpressionType) { - this.methodCalled('recordPageImpressionMetric', interaction); - } -} +import {TestLanguageSettingsMetricsProxy} from './test_languages_settings_metrics_proxy.js'; suite('LanguagesPageMetricsBrowser', function() { let languageHelper: LanguageHelper; @@ -39,6 +21,9 @@ let languageSettingsMetricsProxy: TestLanguageSettingsMetricsProxy; suiteSetup(function() { + loadTimeData.overrideValues({ + enableDesktopDetailedLanguageSettings: false, + }); CrSettingsPrefs.deferInitialization = true; });
diff --git a/chrome/test/data/webui/settings/spell_check_page_metrics_test_browser.ts b/chrome/test/data/webui/settings/spell_check_page_metrics_test_browser.ts deleted file mode 100644 index 9902d56..0000000 --- a/chrome/test/data/webui/settings/spell_check_page_metrics_test_browser.ts +++ /dev/null
@@ -1,209 +0,0 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {LanguageHelper, LanguagesBrowserProxyImpl, LanguageSettingsActionType, LanguageSettingsMetricsProxy, LanguageSettingsMetricsProxyImpl, LanguageSettingsPageImpressionType, SettingsSpellCheckPageElement} from 'chrome://settings/lazy_load.js'; -import {CrSettingsPrefs} from 'chrome://settings/settings.js'; -import {assertEquals, assertTrue} from 'chrome://webui-test/chai_assert.js'; -import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js'; -import {fakeDataBind} from 'chrome://webui-test/test_util.js'; - -import {FakeLanguageSettingsPrivate, getFakeLanguagePrefs} from './fake_language_settings_private.js'; -import {FakeSettingsPrivate} from './fake_settings_private.js'; -import {TestLanguagesBrowserProxy} from './test_languages_browser_proxy.js'; - -const spell_check_page_metrics_test_browser = { - TestNames: { - SpellCheckMetrics: 'spell_check_metrics_all', - // <if expr="_google_chrome"> - SpellCheckMetricsOfficialBuild: 'spell_check_metrics_official', - // </if> - // <if expr="not is_macosx"> - SpellCheckMetricsNotMacOSx: 'spell_check_not_macosx', - // </if> - }, -}; - -Object.assign(window, {spell_check_page_metrics_test_browser}); - -/** - * A test version of LanguageSettingsMetricsProxy. - */ -class TestSpellCheckSettingsMetricsProxy extends TestBrowserProxy implements - LanguageSettingsMetricsProxy { - constructor() { - super(['recordSettingsMetric', 'recordPageImpressionMetric']); - } - - recordSettingsMetric(interaction: LanguageSettingsActionType) { - this.methodCalled('recordSettingsMetric', interaction); - } - - recordPageImpressionMetric(interaction: LanguageSettingsPageImpressionType) { - this.methodCalled('recordPageImpressionMetric', interaction); - } -} - -suite('SpellCheckPageMetricsBrowser', function() { - let languageHelper: LanguageHelper; - let spellCheckPage: SettingsSpellCheckPageElement; - let browserProxy: TestLanguagesBrowserProxy; - let languageSettingsMetricsProxy: TestSpellCheckSettingsMetricsProxy; - - suiteSetup(function() { - CrSettingsPrefs.deferInitialization = true; - }); - - setup(function() { - document.body.innerHTML = ''; - const settingsPrefs = document.createElement('settings-prefs'); - const settingsPrivate = new FakeSettingsPrivate(getFakeLanguagePrefs()) as - unknown as typeof chrome.settingsPrivate; - settingsPrefs.initialize(settingsPrivate); - document.body.appendChild(settingsPrefs); - return CrSettingsPrefs.initialized.then(function() { - // Sets up test browser proxy. - browserProxy = new TestLanguagesBrowserProxy(); - LanguagesBrowserProxyImpl.setInstance(browserProxy); - - // Sets up test browser proxy. - languageSettingsMetricsProxy = new TestSpellCheckSettingsMetricsProxy(); - LanguageSettingsMetricsProxyImpl.setInstance( - languageSettingsMetricsProxy); - - // Sets up fake languageSettingsPrivate API. - const languageSettingsPrivate = browserProxy.getLanguageSettingsPrivate(); - (languageSettingsPrivate as unknown as FakeLanguageSettingsPrivate) - .setSettingsPrefs(settingsPrefs); - - const settingsLanguages = document.createElement('settings-languages'); - settingsLanguages.prefs = settingsPrefs.prefs; - fakeDataBind(settingsPrefs, settingsLanguages, 'prefs'); - document.body.appendChild(settingsLanguages); - - spellCheckPage = document.createElement('settings-spell-check-page'); - - // Prefs would normally be data-bound to settings-languages-page. - spellCheckPage.prefs = settingsLanguages.prefs; - fakeDataBind(settingsLanguages, spellCheckPage, 'prefs'); - - spellCheckPage.languageHelper = settingsLanguages.languageHelper; - fakeDataBind(settingsLanguages, spellCheckPage, 'language-helper'); - - spellCheckPage.languages = settingsLanguages.languages; - fakeDataBind(settingsLanguages, spellCheckPage, 'languages'); - - document.body.appendChild(spellCheckPage); - languageHelper = spellCheckPage.languageHelper; - return languageHelper.whenReady(); - }); - }); - - teardown(function() { - document.body.innerHTML = ''; - }); - - suite(spell_check_page_metrics_test_browser.TestNames.SpellCheckMetrics, function() { - test('records when disabling spellCheck globally', async () => { - spellCheckPage.setPrefValue('browser.enable_spellchecking', true); - const spellCheckToggle = spellCheckPage.shadowRoot! - .querySelector<HTMLElement>('#enableSpellcheckingToggle'); - assertTrue(!!spellCheckToggle, 'no spellCheckToggle'); - spellCheckToggle.click(); - flush(); - - assertEquals( - LanguageSettingsActionType.DISABLE_SPELL_CHECK_GLOBALLY, - await languageSettingsMetricsProxy.whenCalled('recordSettingsMetric')); - }); - - test('records when enabling spellCheck globally', async () => { - spellCheckPage.setPrefValue('browser.enable_spellchecking', false); - - const spellCheckToggle = spellCheckPage.shadowRoot! - .querySelector<HTMLElement>('#enableSpellcheckingToggle'); - assertTrue(!!spellCheckToggle); - spellCheckToggle.click(); - flush(); - - assertEquals( - LanguageSettingsActionType.ENABLE_SPELL_CHECK_GLOBALLY, - await languageSettingsMetricsProxy.whenCalled('recordSettingsMetric')); - }); - }); - - // <if expr="_google_chrome"> - suite(spell_check_page_metrics_test_browser.TestNames.SpellCheckMetricsOfficialBuild, function() { - test('records when selecing basic spell check', async () => { - spellCheckPage.setPrefValue('spellcheck.use_spelling_service', true); - const basicServiceSelect = spellcheckPage.shadowRoot! - .querySelector<HTMLElement>('#spellingServiceDisable'); - assertTrue(!!basicServiceSelect); - basicServiceSelect.click(); - flush(); - - assertEquals( - LanguageSettingsActionType.SELECT_BASIC_SPELL_CHECK, - await languageSettingsMetricsProxy.whenCalled('recordSettingsMetric')); - }); - - test('records when selecing enhanced spell check', async () => { - spellCheckPage.setPrefValue('spellcheck.use_spelling_service', false); - const enhancedServiceSelect = spellcheckPage.shadowRoot! - .querySelector<HTMLElement>('#spellingServiceEnable'); - assertTrue(!!enhancedServiceSelect); - enhancedServiceSelect.click(); - flush(); - - assertEquals( - LanguageSettingsActionType.SELECT_ENHANCED_SPELL_CHECK, - await languageSettingsMetricsProxy.whenCalled('recordSettingsMetric')); - }); - }); - // </if> - - // <if expr="not is_macosx"> - suite(spell_check_page_metrics_test_browser.TestNames.SpellCheckMetricsNotMacOSx, function() { - test('records when enabling spellCheck for a language', async () => { - spellCheckPage.setPrefValue('browser.enable_spellchecking', true); - // enable language with support for spell check - spellCheckPage.setPrefValue('spellcheck.dictionaries', ['en']); - spellCheckPage.setPrefValue('spellcheck.dictionaries', ['nb']); - - const spellCheckLanguagesList = spellCheckPage.shadowRoot! - .querySelector<HTMLElement>('#spellCheckLanguagesList'); - assertTrue(!!spellCheckLanguagesList); - const spellCheckLanguageItem = spellCheckLanguagesList - .querySelectorAll<HTMLElement>('.list-item')[1]; - assertTrue(!!spellCheckLanguageItem); - spellCheckLanguageItem.querySelector('cr-toggle')!.click(); - flush(); - - assertEquals( - LanguageSettingsActionType.ENABLE_SPELL_CHECK_FOR_LANGUAGE, - await languageSettingsMetricsProxy.whenCalled('recordSettingsMetric')); - }); - - test('records when disabling spellCheck for a language', async () => { - spellCheckPage.setPrefValue('browser.enable_spellchecking', true); - // enable language with support for spell check - languageHelper.enableLanguage('en'); - languageHelper.enableLanguage('af'); - - const spellCheckLanguagesList = spellCheckPage.shadowRoot! - .querySelector<HTMLElement>('#spellCheckLanguagesList'); - assertTrue(!!spellCheckLanguagesList); - const spellCheckLanguageItem = spellCheckLanguagesList - .querySelectorAll<HTMLElement>('.list-item')[1]; - assertTrue(!!spellCheckLanguageItem); - spellCheckLanguageItem.querySelector('cr-toggle')!.click(); - flush(); - - assertEquals( - LanguageSettingsActionType.DISABLE_SPELL_CHECK_FOR_LANGUAGE, - await languageSettingsMetricsProxy.whenCalled('recordSettingsMetric')); - }); - }); - // </if> -});
diff --git a/chrome/test/data/webui/settings/test_languages_settings_metrics_proxy.ts b/chrome/test/data/webui/settings/test_languages_settings_metrics_proxy.ts new file mode 100644 index 0000000..be7c49b9 --- /dev/null +++ b/chrome/test/data/webui/settings/test_languages_settings_metrics_proxy.ts
@@ -0,0 +1,24 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// clang-format off +import {LanguageSettingsMetricsProxy, LanguageSettingsActionType, LanguageSettingsPageImpressionType} from 'chrome://settings/lazy_load.js'; +import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js'; + +// clang-format on + +export class TestLanguageSettingsMetricsProxy extends TestBrowserProxy + implements LanguageSettingsMetricsProxy { + constructor() { + super(['recordSettingsMetric', 'recordPageImpressionMetric']); + } + + recordSettingsMetric(interaction: LanguageSettingsActionType) { + this.methodCalled('recordSettingsMetric', interaction); + } + + recordPageImpressionMetric(interaction: LanguageSettingsPageImpressionType) { + this.methodCalled('recordPageImpressionMetric', interaction); + } +}
diff --git a/chrome/test/data/webui/settings/translate_page_metrics_test_browser.ts b/chrome/test/data/webui/settings/translate_page_metrics_test_browser.ts new file mode 100644 index 0000000..43c771f --- /dev/null +++ b/chrome/test/data/webui/settings/translate_page_metrics_test_browser.ts
@@ -0,0 +1,95 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {LanguageHelper, LanguagesBrowserProxyImpl, LanguageSettingsActionType, LanguageSettingsMetricsProxyImpl, SettingsTranslatePageElement} from 'chrome://settings/lazy_load.js'; +import {CrSettingsPrefs, loadTimeData} from 'chrome://settings/settings.js'; +import {assertEquals} from 'chrome://webui-test/chai_assert.js'; +import {fakeDataBind} from 'chrome://webui-test/test_util.js'; + +import {FakeLanguageSettingsPrivate, getFakeLanguagePrefs} from './fake_language_settings_private.js'; +import {FakeSettingsPrivate} from './fake_settings_private.js'; +import {TestLanguagesBrowserProxy} from './test_languages_browser_proxy.js'; +import {TestLanguageSettingsMetricsProxy} from './test_languages_settings_metrics_proxy.js'; + +suite('TranslatePageMetricsBrowser', function() { + let languageHelper: LanguageHelper; + let translatePage: SettingsTranslatePageElement; + let browserProxy: TestLanguagesBrowserProxy; + let languageSettingsMetricsProxy: TestLanguageSettingsMetricsProxy; + + suiteSetup(function() { + loadTimeData.overrideValues({ + enableDesktopDetailedLanguageSettings: true, + }); + CrSettingsPrefs.deferInitialization = true; + }); + + setup(function() { + document.body.innerHTML = ''; + const settingsPrefs = document.createElement('settings-prefs'); + const settingsPrivate = new FakeSettingsPrivate(getFakeLanguagePrefs()) as + unknown as typeof chrome.settingsPrivate; + settingsPrefs.initialize(settingsPrivate); + document.body.appendChild(settingsPrefs); + return CrSettingsPrefs.initialized.then(function() { + // Sets up test browser proxy. + browserProxy = new TestLanguagesBrowserProxy(); + LanguagesBrowserProxyImpl.setInstance(browserProxy); + + // Sets up test browser proxy. + languageSettingsMetricsProxy = new TestLanguageSettingsMetricsProxy(); + LanguageSettingsMetricsProxyImpl.setInstance( + languageSettingsMetricsProxy); + + // Sets up fake languageSettingsPrivate API. + const languageSettingsPrivate = browserProxy.getLanguageSettingsPrivate(); + (languageSettingsPrivate as unknown as FakeLanguageSettingsPrivate) + .setSettingsPrefs(settingsPrefs); + + const settingsLanguages = document.createElement('settings-languages'); + settingsLanguages.prefs = settingsPrefs.prefs; + fakeDataBind(settingsPrefs, settingsLanguages, 'prefs'); + document.body.appendChild(settingsLanguages); + + translatePage = document.createElement('settings-translate-page'); + + // Prefs would normally be data-bound to settings-languages-page. + translatePage.prefs = settingsLanguages.prefs; + fakeDataBind(settingsLanguages, translatePage, 'prefs'); + + translatePage.languageHelper = settingsLanguages.languageHelper; + fakeDataBind(settingsLanguages, translatePage, 'language-helper'); + + translatePage.languages = settingsLanguages.languages; + fakeDataBind(settingsLanguages, translatePage, 'languages'); + + document.body.appendChild(translatePage); + languageHelper = translatePage.languageHelper; + return languageHelper.whenReady(); + }); + }); + + test('records when disabling translate.enable toggle', async () => { + translatePage.setPrefValue('translate.enabled', true); + translatePage.shadowRoot! + .querySelector<HTMLElement>('#offerTranslateOtherLanguages')!.click(); + flush(); + + assertEquals( + LanguageSettingsActionType.DISABLE_TRANSLATE_GLOBALLY, + await languageSettingsMetricsProxy.whenCalled('recordSettingsMetric')); + }); + + test('records when enabling translate.enable toggle', async () => { + translatePage.setPrefValue('translate.enabled', false); + translatePage.shadowRoot! + .querySelector<HTMLElement>('#offerTranslateOtherLanguages')!.click(); + flush(); + + assertEquals( + LanguageSettingsActionType.ENABLE_TRANSLATE_GLOBALLY, + await languageSettingsMetricsProxy.whenCalled('recordSettingsMetric')); + }); +});
diff --git a/chrome/test/data/webui/settings/translate_page_tests.ts b/chrome/test/data/webui/settings/translate_page_tests.ts new file mode 100644 index 0000000..ffabde9 --- /dev/null +++ b/chrome/test/data/webui/settings/translate_page_tests.ts
@@ -0,0 +1,248 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// clang-format off +import { PromiseResolver } from 'chrome://resources/js/promise_resolver.m.js'; +import { flush } from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import { LanguageHelper, LanguagesBrowserProxyImpl, SettingsAddLanguagesDialogElement, SettingsTranslatePageElement } from 'chrome://settings/lazy_load.js'; +import { CrSettingsPrefs, loadTimeData } from 'chrome://settings/settings.js'; +import { assertDeepEquals, assertEquals, assertTrue, assertFalse } from 'chrome://webui-test/chai_assert.js'; +import { eventToPromise, fakeDataBind } from 'chrome://webui-test/test_util.js'; + +import { FakeLanguageSettingsPrivate, getFakeLanguagePrefs } from './fake_language_settings_private.js'; +import { FakeSettingsPrivate } from './fake_settings_private.js'; +import { TestLanguagesBrowserProxy } from './test_languages_browser_proxy.js'; + +// clang-format on + +const translate_page_tests = { + TestNames: { + AlwaysTranslateDialog: 'always translate dialog', + NeverTranslateDialog: 'never translate dialog', + TranslateToggle: 'offer to translate toggle', + }, +}; + +Object.assign(window, {translate_page_tests}); + +suite('translate page settings', function() { + let languageHelper: LanguageHelper; + let translatePage: SettingsTranslatePageElement; + let browserProxy: TestLanguagesBrowserProxy; + + // Always Translate language pref name for the platform. + const alwaysTranslatePref = 'translate_allowlists'; + const neverTranslatePref = 'translate_blocked_languages'; + + suiteSetup(function() { + loadTimeData.overrideValues({ + enableDesktopDetailedLanguageSettings: true, + }); + document.body.innerHTML = ''; + CrSettingsPrefs.deferInitialization = true; + }); + + setup(function() { + const settingsPrefs = document.createElement('settings-prefs'); + const settingsPrivate = new FakeSettingsPrivate(getFakeLanguagePrefs()); + settingsPrefs.initialize( + settingsPrivate as unknown as typeof chrome.settingsPrivate); + document.body.appendChild(settingsPrefs); + return CrSettingsPrefs.initialized.then(function() { + // Set up test browser proxy. + browserProxy = new TestLanguagesBrowserProxy(); + LanguagesBrowserProxyImpl.setInstance(browserProxy); + + // Set up fake languageSettingsPrivate API. + const languageSettingsPrivate = + browserProxy.getLanguageSettingsPrivate() as unknown as + FakeLanguageSettingsPrivate; + languageSettingsPrivate.setSettingsPrefs(settingsPrefs); + + const settingsLanguages = document.createElement('settings-languages'); + settingsLanguages.prefs = settingsPrefs.prefs; + fakeDataBind(settingsPrefs, settingsLanguages, 'prefs'); + document.body.appendChild(settingsLanguages); + + translatePage = document.createElement('settings-translate-page'); + + translatePage.prefs = settingsPrefs.prefs; + fakeDataBind(settingsPrefs, translatePage, 'prefs'); + + translatePage.languageHelper = settingsLanguages.languageHelper; + fakeDataBind(settingsLanguages, translatePage, 'language-helper'); + + translatePage.languages = settingsLanguages.languages; + fakeDataBind(settingsLanguages, translatePage, 'languages'); + + document.body.appendChild(translatePage); + flush(); + + languageHelper = translatePage.languageHelper; + return languageHelper.whenReady(); + }); + }); + + teardown(function() { + document.body.innerHTML = ''; + }); + + suite(translate_page_tests.TestNames.TranslateToggle, function() { + test('test translate.enable toggle', function() { + const settingsToggle = + translatePage.shadowRoot!.querySelector<HTMLElement>( + '#offerTranslateOtherLanguages'); + assertTrue(!!settingsToggle); + + // Clicking on the toggle switches it to false. + settingsToggle.click(); + let newToggleValue = translatePage.getPref('translate.enabled').value; + assertFalse(newToggleValue); + + // Clicking on the toggle switches it to true again. + settingsToggle.click(); + newToggleValue = translatePage.getPref('translate.enabled').value; + assertTrue(newToggleValue); + }); + }); + + suite(translate_page_tests.TestNames.AlwaysTranslateDialog, function() { + let dialog: SettingsAddLanguagesDialogElement; + let dialogClosedResolver: PromiseResolver<void>; + let dialogClosedObserver: MutationObserver; + + // Resolves the PromiseResolver if the mutation includes removal of the + // settings-add-languages-dialog. + // TODO(michaelpg): Extract into a common method similar to + // whenAttributeIs for use elsewhere. + function onMutation( + mutations: MutationRecord[], observer: MutationObserver) { + if (mutations.some(function(mutation) { + return mutation.type === 'childList' && + Array.from(mutation.removedNodes).includes(dialog); + })) { + // Sanity check: the dialog should no longer be in the DOM. + assertEquals( + null, + translatePage.shadowRoot!.querySelector( + 'settings-add-languages-dialog')); + observer.disconnect(); + assertTrue(!!dialogClosedResolver); + dialogClosedResolver.resolve(); + } + } + + setup(function() { + const addLanguagesButton = + translatePage.shadowRoot!.querySelector<HTMLElement>( + '#addAlwaysTranslate'); + const whenDialogOpen = eventToPromise('cr-dialog-open', translatePage); + assertTrue(!!addLanguagesButton); + addLanguagesButton.click(); + + // The page stamps the dialog, registers listeners, and populates the + // iron-list asynchronously at microtask timing, so wait for a new + // task. + return whenDialogOpen.then(() => { + dialog = translatePage.shadowRoot!.querySelector( + 'settings-add-languages-dialog')!; + assertTrue(!!dialog); + assertEquals(dialog.id, 'alwaysTranslateDialog'); + + // Observe the removal of the dialog via MutationObserver since the + // HTMLDialogElement 'close' event fires at an unpredictable time. + dialogClosedResolver = new PromiseResolver(); + dialogClosedObserver = new MutationObserver(onMutation); + dialogClosedObserver.observe( + translatePage.shadowRoot!, {childList: true}); + + flush(); + }); + }); + + teardown(function() { + dialogClosedObserver.disconnect(); + }); + + test('add languages and confirm', function() { + dialog.dispatchEvent( + new CustomEvent('languages-added', {detail: ['en', 'no']})); + dialog.$.dialog.close(); + assertDeepEquals( + ['en', 'no'], translatePage.getPref(alwaysTranslatePref).value); + + return dialogClosedResolver.promise; + }); + }); + + suite(translate_page_tests.TestNames.NeverTranslateDialog, function() { + let dialog: SettingsAddLanguagesDialogElement; + let dialogClosedResolver: PromiseResolver<void>; + let dialogClosedObserver: MutationObserver; + + // Resolves the PromiseResolver if the mutation includes removal of the + // settings-add-languages-dialog. + // TODO(michaelpg): Extract into a common method similar to + // whenAttributeIs for use elsewhere. + function onMutation( + mutations: MutationRecord[], observer: MutationObserver) { + if (mutations.some(function(mutation) { + return mutation.type === 'childList' && + Array.from(mutation.removedNodes).includes(dialog); + })) { + // Sanity check: the dialog should no longer be in the DOM. + assertEquals( + null, + translatePage.shadowRoot!.querySelector( + 'settings-add-languages-dialog')); + observer.disconnect(); + assertTrue(!!dialogClosedResolver); + dialogClosedResolver.resolve(); + } + } + + setup(function() { + const addLanguagesButton = + translatePage.shadowRoot!.querySelector<HTMLElement>( + '#addNeverTranslate'); + const whenDialogOpen = eventToPromise('cr-dialog-open', translatePage); + assertTrue(!!addLanguagesButton); + addLanguagesButton.click(); + + // The page stamps the dialog, registers listeners, and populates the + // iron-list asynchronously at microtask timing, so wait for a new + // task. + return whenDialogOpen.then(() => { + dialog = translatePage.shadowRoot!.querySelector( + 'settings-add-languages-dialog')!; + assertTrue(!!dialog); + assertEquals(dialog.id, 'neverTranslateDialog'); + + // Observe the removal of the dialog via MutationObserver since the + // HTMLDialogElement 'close' event fires at an unpredictable time. + dialogClosedResolver = new PromiseResolver(); + dialogClosedObserver = new MutationObserver(onMutation); + dialogClosedObserver.observe( + translatePage.shadowRoot!, {childList: true}); + + flush(); + }); + }); + + teardown(function() { + dialogClosedObserver.disconnect(); + }); + + test('add languages and confirm', function() { + dialog.dispatchEvent( + new CustomEvent('languages-added', {detail: ['sw', 'no']})); + dialog.$.dialog.close(); + assertDeepEquals( + ['en-US', 'sw', 'no'], + translatePage.getPref(neverTranslatePref).value); + + return dialogClosedResolver.promise; + }); + }); +});
diff --git a/chrome/updater/app/server/win/BUILD.gn b/chrome/updater/app/server/win/BUILD.gn index adb966a..657001a 100644 --- a/chrome/updater/app/server/win/BUILD.gn +++ b/chrome/updater/app/server/win/BUILD.gn
@@ -83,21 +83,21 @@ # Google-specific Legacy GUIDs that Omaha 4 supports. defines = [ "UPDATER_LEGACY_LIB_UUID=69464FF0-D9EC-4037-A35F-8AE4358106CC", - "GOOGLEUPDATE3WEBUSERCLASS_CLSID=22181302-A8A6-4f84-A541-E5CBFC70CC43", + "GOOGLEUPDATE3WEBUSERCLASS_CLSID=22181302-A8A6-4F84-A541-E5CBFC70CC43", "GOOGLEUPDATE3WEBSYSTEMCLASS_CLSID=8A1D4361-2C08-4700-A351-3EAA9CBFF5E4", "POLICYSTATUSUSERCLASS_CLSID=6DDCE70D-A4AE-4E97-908C-BE7B2DB750AD", "POLICYSTATUSSYSTEMCLASS_CLSID=521FDB42-7130-4806-822A-FC5163FAD983", - "PROCESSLAUNCHERCLASS_CLSID=ABC01078-F197-4b0b-ADBC-CFE684B39C82", + "PROCESSLAUNCHERCLASS_CLSID=ABC01078-F197-4B0B-ADBC-CFE684B39C82", "ICURRENTSTATE_IID=247954F9-9EDC-4E68-8CC3-150C2B89EADF", "IGOOGLEUPDATE3WEB_IID=494B20CF-282E-4BDD-9F5D-B70CB09D351E", - "IAPPBUNDLEWEB_IID=DD42475D-6D46-496a-924E-BD5630B4CBBA", - "IAPPWEB_IID=18D0F672-18B4-48e6-AD36-6E6BF01DBBC4", + "IAPPBUNDLEWEB_IID=DD42475D-6D46-496A-924E-BD5630B4CBBA", + "IAPPWEB_IID=18D0F672-18B4-48E6-AD36-6E6BF01DBBC4", "IAPPCOMMANDWEB_IID=8476CE12-AE1F-4198-805C-BA0F9B783F57", "IPOLICYSTATUS_IID=F63F6F8B-ACD5-413C-A44B-0409136D26CB", "IPOLICYSTATUS2_IID=34527502-D3DB-4205-A69B-789B27EE0414", "IPOLICYSTATUS3_IID=05A30352-EB25-45B6-8449-BCA7B0542CE5", "IPOLICYSTATUSVALUE_IID=27634814-8E41-4C35-8577-980134A96544", - "IPROCESSLAUNCHER_IID=128C2DA6-2BC0-44c0-B3F6-4EC22E647964", + "IPROCESSLAUNCHER_IID=128C2DA6-2BC0-44C0-B3F6-4EC22E647964", "IPROCESSLAUNCHER2_IID=D106AB5F-A70E-400E-A21B-96208C1D8DBB", ] } else {
diff --git a/chromeos/ash/components/network/metrics/network_metrics_helper_unittest.cc b/chromeos/ash/components/network/metrics/network_metrics_helper_unittest.cc index df5429d9..af10c92 100644 --- a/chromeos/ash/components/network/metrics/network_metrics_helper_unittest.cc +++ b/chromeos/ash/components/network/metrics/network_metrics_helper_unittest.cc
@@ -458,9 +458,9 @@ shill_service_client_->AddService(kTestServicePath, kTestGuid, kTestName, shill::kTypeWifi, shill::kStateIdle, /*visible=*/true); - shill_service_client_->SetServiceProperty(kTestServicePath, - shill::kSecurityClassProperty, - base::Value(shill::kSecurityNone)); + shill_service_client_->SetServiceProperty( + kTestServicePath, shill::kSecurityClassProperty, + base::Value(shill::kSecurityClassNone)); base::RunLoop().RunUntilIdle(); NetworkMetricsHelper::LogAllConnectionResult(kTestGuid, @@ -491,9 +491,9 @@ shill_service_client_->AddService(kTestServicePath, kTestGuid, kTestName, shill::kTypeWifi, shill::kStateIdle, /*visible=*/true); - shill_service_client_->SetServiceProperty(kTestServicePath, - shill::kSecurityClassProperty, - base::Value(shill::kSecurityPsk)); + shill_service_client_->SetServiceProperty( + kTestServicePath, shill::kSecurityClassProperty, + base::Value(shill::kSecurityClassPsk)); base::RunLoop().RunUntilIdle(); NetworkMetricsHelper::LogAllConnectionResult(kTestGuid, @@ -524,9 +524,9 @@ shill_service_client_->AddService(kTestServicePath, kTestGuid, kTestName, shill::kTypeEthernet, shill::kStateIdle, /*visible=*/true); - shill_service_client_->SetServiceProperty(kTestServicePath, - shill::kSecurityClassProperty, - base::Value(shill::kSecurityNone)); + shill_service_client_->SetServiceProperty( + kTestServicePath, shill::kSecurityClassProperty, + base::Value(shill::kSecurityClassNone)); base::RunLoop().RunUntilIdle(); NetworkMetricsHelper::LogAllConnectionResult(kTestGuid, @@ -568,9 +568,9 @@ shill_service_client_->SetServiceProperty( kTestServicePath, shill::kStateProperty, base::Value(shill::kStateReady)); - shill_service_client_->SetServiceProperty(kTestServicePath, - shill::kSecurityClassProperty, - base::Value(shill::kSecurity8021x)); + shill_service_client_->SetServiceProperty( + kTestServicePath, shill::kSecurityClassProperty, + base::Value(shill::kSecurityClass8021x)); device_test->SetDeviceProperty(kTestDevicePath, shill::kEapAuthenticationCompletedProperty,
diff --git a/chromeos/ash/components/network/network_cert_migrator.cc b/chromeos/ash/components/network/network_cert_migrator.cc index 0f7b2b53..9df59fb 100644 --- a/chromeos/ash/components/network/network_cert_migrator.cc +++ b/chromeos/ash/components/network/network_cert_migrator.cc
@@ -47,7 +47,7 @@ // Request properties for each network that could be configured with a // client certificate. for (const NetworkState* network : networks) { - if (network->security_class() != shill::kSecurity8021x && + if (network->security_class() != shill::kSecurityClass8021x && network->type() != shill::kTypeVPN && network->type() != shill::kTypeEthernetEap) { continue;
diff --git a/chromeos/ash/components/network/network_cert_migrator_unittest.cc b/chromeos/ash/components/network/network_cert_migrator_unittest.cc index 5433de75..82175f7b 100644 --- a/chromeos/ash/components/network/network_cert_migrator_unittest.cc +++ b/chromeos/ash/components/network/network_cert_migrator_unittest.cc
@@ -142,8 +142,9 @@ base::Value(cert_id)); if (wifi) { - service_test_->SetServiceProperty(name, shill::kSecurityClassProperty, - base::Value(shill::kSecurity8021x)); + service_test_->SetServiceProperty( + name, shill::kSecurityClassProperty, + base::Value(shill::kSecurityClass8021x)); } }
diff --git a/chromeos/ash/components/network/network_configuration_handler_unittest.cc b/chromeos/ash/components/network/network_configuration_handler_unittest.cc index 6a6dcdb..2701d4a 100644 --- a/chromeos/ash/components/network/network_configuration_handler_unittest.cc +++ b/chromeos/ash/components/network/network_configuration_handler_unittest.cc
@@ -761,7 +761,8 @@ network_configuration_observer->HasUpdatedConfiguration(service_path)); base::Value properties(base::Value::Type::DICTIONARY); - properties.SetKey(shill::kSecurityProperty, base::Value(shill::kSecurityPsk)); + properties.SetKey(shill::kSecurityClassProperty, + base::Value(shill::kSecurityClassPsk)); properties.SetKey(shill::kPassphraseProperty, base::Value("secret")); network_configuration_handler_->SetShillProperties(
diff --git a/chromeos/ash/components/network/network_connect_unittest.cc b/chromeos/ash/components/network/network_connect_unittest.cc index 3c916bf..2076007 100644 --- a/chromeos/ash/components/network/network_connect_unittest.cc +++ b/chromeos/ash/components/network/network_connect_unittest.cc
@@ -152,7 +152,7 @@ add_to_visible); service_test_->SetServiceProperty(kWiFi1ServicePath, shill::kSecurityClassProperty, - base::Value(shill::kSecurityWep)); + base::Value(shill::kSecurityClassWep)); service_test_->SetServiceProperty( kWiFi1ServicePath, shill::kConnectableProperty, base::Value(true)); service_test_->SetServiceProperty( @@ -165,7 +165,7 @@ add_to_visible); service_test_->SetServiceProperty(kWiFiUnconfiguredServicePath, shill::kSecurityClassProperty, - base::Value(shill::kSecurityWep)); + base::Value(shill::kSecurityClassWep)); service_test_->SetServiceProperty(kWiFiUnconfiguredServicePath, shill::kConnectableProperty, base::Value(false));
diff --git a/chromeos/ash/components/network/network_connection_handler_impl.cc b/chromeos/ash/components/network/network_connection_handler_impl.cc index e2d2fc2..7bf7137 100644 --- a/chromeos/ash/components/network/network_connection_handler_impl.cc +++ b/chromeos/ash/components/network/network_connection_handler_impl.cc
@@ -726,7 +726,7 @@ } else if (*type == shill::kTypeWifi) { const std::string* security_class = properties->FindStringKey(shill::kSecurityClassProperty); - if (security_class && *security_class == shill::kSecurity8021x) + if (security_class && *security_class == shill::kSecurityClass8021x) client_cert_type = client_cert::ConfigType::kEap; }
diff --git a/chromeos/ash/components/network/network_event_log_unittest.cc b/chromeos/ash/components/network/network_event_log_unittest.cc index 143ce93..4332de02 100644 --- a/chromeos/ash/components/network/network_event_log_unittest.cc +++ b/chromeos/ash/components/network/network_event_log_unittest.cc
@@ -65,21 +65,21 @@ add_to_visible); service_test->SetServiceProperty("/service/2", shill::kSecurityClassProperty, - base::Value(shill::kSecurityNone)); + base::Value(shill::kSecurityClassNone)); service_test->AddService("/service/3", "wifi3_guid", "wifi3", shill::kTypeWifi, shill::kStateIdle, add_to_visible); service_test->SetServiceProperty("/service/3", shill::kSecurityClassProperty, - base::Value(shill::kSecurityWep)); + base::Value(shill::kSecurityClassWep)); service_test->AddService("/service/4", "wifi4_guid", "wifi4", shill::kTypeWifi, shill::kStateIdle, add_to_visible); service_test->SetServiceProperty("/service/4", shill::kSecurityClassProperty, - base::Value(shill::kSecurity8021x)); + base::Value(shill::kSecurityClass8021x)); // VPN service_test->AddService("/service/5", "vpn5_guid", "vpn5", shill::kTypeVPN,
diff --git a/chromeos/ash/components/network/network_metadata_store_unittest.cc b/chromeos/ash/components/network/network_metadata_store_unittest.cc index 83593be7..48d612b7 100644 --- a/chromeos/ash/components/network/network_metadata_store_unittest.cc +++ b/chromeos/ash/components/network/network_metadata_store_unittest.cc
@@ -309,7 +309,8 @@ ASSERT_EQ(0, metadata_observer()->GetNumberOfUpdates(kGuid)); base::Value properties(base::Value::Type::DICTIONARY); - properties.SetKey(shill::kSecurityProperty, base::Value(shill::kSecurityPsk)); + properties.SetKey(shill::kSecurityClassProperty, + base::Value(shill::kSecurityClassPsk)); properties.SetKey(shill::kPassphraseProperty, base::Value("secret")); network_configuration_handler()->SetShillProperties(
diff --git a/chromeos/ash/components/network/network_state.cc b/chromeos/ash/components/network/network_state.cc index 9ad1e14..d899e8a 100644 --- a/chromeos/ash/components/network/network_state.cc +++ b/chromeos/ash/components/network/network_state.cc
@@ -365,8 +365,8 @@ bool NetworkState::SecurityRequiresPassphraseOnly() const { return type() == shill::kTypeWifi && - (security_class_ == shill::kSecurityPsk || - security_class_ == shill::kSecurityWep); + (security_class_ == shill::kSecurityClassPsk || + security_class_ == shill::kSecurityClassWep); } const std::string& NetworkState::GetError() const { @@ -572,11 +572,11 @@ if (IsDynamicWep()) return SecurityType::kWep8021x; - if (security_class_ == shill::kSecurityWep) + if (security_class_ == shill::kSecurityClassWep) return SecurityType::kWepPsk; - if (security_class_ == shill::kSecurityPsk) + if (security_class_ == shill::kSecurityClassPsk) return SecurityType::kWpaPsk; - if (security_class_ == shill::kSecurity8021x) + if (security_class_ == shill::kSecurityClass8021x) return SecurityType::kWpaEap; NET_LOG(ERROR) << "Unsupported shill security class: " << security_class_; return SecurityType::kNone;
diff --git a/chromeos/ash/components/network/onc/onc_translation_tables.cc b/chromeos/ash/components/network/onc/onc_translation_tables.cc index 428dc59c..15e56567 100644 --- a/chromeos/ash/components/network/onc/onc_translation_tables.cc +++ b/chromeos/ash/components/network/onc/onc_translation_tables.cc
@@ -371,11 +371,11 @@ {nullptr}}; const StringTranslationEntry kWiFiSecurityTable[] = { - {::onc::wifi::kSecurityNone, shill::kSecurityNone}, - {::onc::wifi::kWEP_PSK, shill::kSecurityWep}, - {::onc::wifi::kWPA_PSK, shill::kSecurityPsk}, - {::onc::wifi::kWPA_EAP, shill::kSecurity8021x}, - {::onc::wifi::kWEP_8021X, shill::kSecurityWep}, + {::onc::wifi::kSecurityNone, shill::kSecurityClassNone}, + {::onc::wifi::kWEP_PSK, shill::kSecurityClassWep}, + {::onc::wifi::kWPA_PSK, shill::kSecurityClassPsk}, + {::onc::wifi::kWPA_EAP, shill::kSecurityClass8021x}, + {::onc::wifi::kWEP_8021X, shill::kSecurityClassWep}, {nullptr}}; const StringTranslationEntry kEAPOuterTable[] = {
diff --git a/chromeos/ash/components/network/onc/onc_translator_shill_to_onc.cc b/chromeos/ash/components/network/onc/onc_translator_shill_to_onc.cc index cd5bdfc5..a69cba5 100644 --- a/chromeos/ash/components/network/onc/onc_translator_shill_to_onc.cc +++ b/chromeos/ash/components/network/onc/onc_translator_shill_to_onc.cc
@@ -458,7 +458,7 @@ shill_dictionary_->FindStringKey(shill::kSecurityClassProperty); const std::string* shill_key_mgmt = shill_dictionary_->FindStringKey(shill::kEapKeyMgmtProperty); - if (shill_security && *shill_security == shill::kSecurityWep && + if (shill_security && *shill_security == shill::kSecurityClassWep && shill_key_mgmt && *shill_key_mgmt == shill::kKeyManagementIEEE8021X) { onc_object_.SetKey(::onc::wifi::kSecurity, base::Value(::onc::wifi::kWEP_8021X));
diff --git a/chromeos/components/sync_wifi/network_identifier_unittest.cc b/chromeos/components/sync_wifi/network_identifier_unittest.cc index e329039..7e514b72 100644 --- a/chromeos/components/sync_wifi/network_identifier_unittest.cc +++ b/chromeos/components/sync_wifi/network_identifier_unittest.cc
@@ -31,11 +31,11 @@ }; TEST_F(NetworkIdentifierTest, FromProto) { - NetworkIdentifier expected_id(kHexSsid, shill::kSecurityPsk); + NetworkIdentifier expected_id(kHexSsid, shill::kSecurityClassPsk); NetworkIdentifier id = NetworkIdentifier::FromProto(GenerateTestWifiSpecifics(expected_id)); EXPECT_EQ(kHexSsid, id.hex_ssid()); - EXPECT_EQ(shill::kSecurityPsk, id.security_type()); + EXPECT_EQ(shill::kSecurityClassPsk, id.security_type()); EXPECT_EQ(expected_id, id); } @@ -43,31 +43,31 @@ std::string string_id("0123456789ABCDEF<||>psk"); NetworkIdentifier id = NetworkIdentifier::DeserializeFromString(string_id); EXPECT_EQ(kHexSsid, id.hex_ssid()); - EXPECT_EQ(shill::kSecurityPsk, id.security_type()); + EXPECT_EQ(shill::kSecurityClassPsk, id.security_type()); } TEST_F(NetworkIdentifierTest, DifferentHexFormats) { - NetworkIdentifier id("0x2f", shill::kSecurityPsk); + NetworkIdentifier id("0x2f", shill::kSecurityClassPsk); EXPECT_EQ("2F", id.hex_ssid()); - id = NetworkIdentifier("0X2F", shill::kSecurityPsk); + id = NetworkIdentifier("0X2F", shill::kSecurityClassPsk); EXPECT_EQ("2F", id.hex_ssid()); - id = NetworkIdentifier("2f", shill::kSecurityPsk); + id = NetworkIdentifier("2f", shill::kSecurityClassPsk); EXPECT_EQ("2F", id.hex_ssid()); } TEST_F(NetworkIdentifierTest, Equality) { - NetworkIdentifier first_id("0x2f", shill::kSecurityPsk); - NetworkIdentifier second_id("0x2f", shill::kSecurityPsk); + NetworkIdentifier first_id("0x2f", shill::kSecurityClassPsk); + NetworkIdentifier second_id("0x2f", shill::kSecurityClassPsk); EXPECT_EQ(first_id, second_id); - first_id = NetworkIdentifier("0x2f", shill::kSecurityPsk); - second_id = NetworkIdentifier("0xff", shill::kSecurityPsk); + first_id = NetworkIdentifier("0x2f", shill::kSecurityClassPsk); + second_id = NetworkIdentifier("0xff", shill::kSecurityClassPsk); EXPECT_NE(first_id, second_id); - first_id = NetworkIdentifier("0x2f", shill::kSecurityPsk); - second_id = NetworkIdentifier("0x2f", shill::kSecurityWep); + first_id = NetworkIdentifier("0x2f", shill::kSecurityClassPsk); + second_id = NetworkIdentifier("0x2f", shill::kSecurityClassWep); EXPECT_NE(first_id, second_id); } @@ -76,8 +76,8 @@ NetworkIdentifier similar_invalid_id("0x2f", ""); EXPECT_NE(invalid_id, similar_invalid_id); - invalid_id = NetworkIdentifier("", shill::kSecurityPsk); - similar_invalid_id = NetworkIdentifier("", shill::kSecurityPsk); + invalid_id = NetworkIdentifier("", shill::kSecurityClassPsk); + similar_invalid_id = NetworkIdentifier("", shill::kSecurityClassPsk); EXPECT_NE(invalid_id, similar_invalid_id); invalid_id = NetworkIdentifier("", "");
diff --git a/chromeos/components/sync_wifi/network_type_conversions.cc b/chromeos/components/sync_wifi/network_type_conversions.cc index 4f6ff58..ee870d6 100644 --- a/chromeos/components/sync_wifi/network_type_conversions.cc +++ b/chromeos/components/sync_wifi/network_type_conversions.cc
@@ -49,9 +49,9 @@ const network_config::mojom::SecurityType& security_type) { switch (security_type) { case network_config::mojom::SecurityType::kWpaPsk: - return shill::kSecurityPsk; + return shill::kSecurityClassPsk; case network_config::mojom::SecurityType::kWepPsk: - return shill::kSecurityWep; + return shill::kSecurityClassWep; default: // Only PSK and WEP secured networks are supported by sync. return ""; @@ -62,7 +62,7 @@ const sync_pb::WifiConfigurationSpecifics_SecurityType& security_type) { switch (security_type) { case sync_pb::WifiConfigurationSpecifics::SECURITY_TYPE_PSK: - return shill::kSecurityPsk; + return shill::kSecurityClassPsk; case sync_pb::WifiConfigurationSpecifics::SECURITY_TYPE_WEP: return shill::kSecurityWep; default:
diff --git a/chromeos/components/sync_wifi/test_data_generator.cc b/chromeos/components/sync_wifi/test_data_generator.cc index f4a95a1..e27d58f 100644 --- a/chromeos/components/sync_wifi/test_data_generator.cc +++ b/chromeos/components/sync_wifi/test_data_generator.cc
@@ -14,7 +14,7 @@ NetworkIdentifier GeneratePskNetworkId(const std::string& ssid) { return NetworkIdentifier(base::HexEncode(ssid.data(), ssid.size()), - shill::kSecurityPsk); + shill::kSecurityClassPsk); } sync_pb::WifiConfigurationSpecifics GenerateTestWifiSpecifics( @@ -24,10 +24,10 @@ sync_pb::WifiConfigurationSpecifics specifics; specifics.set_hex_ssid(id.hex_ssid()); - if (id.security_type() == shill::kSecurityPsk) { + if (id.security_type() == shill::kSecurityClassPsk) { specifics.set_security_type( sync_pb::WifiConfigurationSpecifics::SECURITY_TYPE_PSK); - } else if (id.security_type() == shill::kSecurityWep) { + } else if (id.security_type() == shill::kSecurityClassWep) { specifics.set_security_type( sync_pb::WifiConfigurationSpecifics::SECURITY_TYPE_WEP); } else {
diff --git a/chromeos/crosapi/mojom/BUILD.gn b/chromeos/crosapi/mojom/BUILD.gn index d435394..60676db 100644 --- a/chromeos/crosapi/mojom/BUILD.gn +++ b/chromeos/crosapi/mojom/BUILD.gn
@@ -48,6 +48,7 @@ "identity_manager.mojom", "idle_service.mojom", "image_writer.mojom", + "in_session_auth.mojom", "keystore_error.mojom", "keystore_service.mojom", "kiosk_session_service.mojom",
diff --git a/chromeos/crosapi/mojom/crosapi.mojom b/chromeos/crosapi/mojom/crosapi.mojom index 64c231e..7070b34 100644 --- a/chromeos/crosapi/mojom/crosapi.mojom +++ b/chromeos/crosapi/mojom/crosapi.mojom
@@ -44,6 +44,7 @@ import "chromeos/crosapi/mojom/identity_manager.mojom"; import "chromeos/crosapi/mojom/idle_service.mojom"; import "chromeos/crosapi/mojom/image_writer.mojom"; +import "chromeos/crosapi/mojom/in_session_auth.mojom"; import "chromeos/crosapi/mojom/keystore_service.mojom"; import "chromeos/crosapi/mojom/launcher_search.mojom"; import "chromeos/crosapi/mojom/local_printer.mojom"; @@ -122,8 +123,8 @@ // please note the milestone when you added it, to help us reason about // compatibility between the client applications and older ash-chrome binaries. // -// Next version: 92 -// Next method id: 96 +// Next version: 93 +// Next method id: 97 [Stable, Uuid="8b79c34f-2bf8-4499-979a-b17cac522c1e", RenamedFrom="crosapi.mojom.AshChromeService"] interface Crosapi { @@ -351,6 +352,12 @@ [MinVersion=37] BindImageWriter@42(pending_receiver<ImageWriter> receiver); + // Binds the InSessionAuth interface for authenticating users in session + // on ChromeOS + // Added in M106. + [MinVersion=92] + BindInSessionAuth@96(pending_receiver<InSessionAuth> receiver); + // Binds the NetworkSettingsService interface for reading and observing // network changes. // Added in M93.
diff --git a/chromeos/crosapi/mojom/in_session_auth.mojom b/chromeos/crosapi/mojom/in_session_auth.mojom new file mode 100644 index 0000000..1d1027d --- /dev/null +++ b/chromeos/crosapi/mojom/in_session_auth.mojom
@@ -0,0 +1,40 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +module crosapi.mojom; + +import "mojo/public/mojom/base/time.mojom"; + +[Stable] +struct RequestTokenReply { + // The authentication token that is returned, to use for sensitive + // operations. + string token@0; + + // The length of time for which the token is valid. + mojo_base.mojom.TimeDelta timeout@1; +}; + +[Stable, Extensible] +enum Reason { + [Default] kAccessPasswordManager = 0, + kModifyAuthFactors, + kModifyAuthFactorsMultidevice, +}; + +// An interface implemented by Ash to expose Ash's authentication capabilities. +// Used by Lacros for extension API authentication in Settings. +[Stable, Uuid="7d4bb0d8-f1fa-46bf-a7a6-b7117526ea63"] +interface InSessionAuth { + // Instructs Ash to summon a native authentication dialog to authenticate + // the currently active user. Returns a prerishable authentication token on + // success. RequestTokenReply in null if authentication was aborted. + RequestToken@0(Reason reason) => (RequestTokenReply? reply); + + // Check the validity of the token for sensitive operations. + CheckToken@1(Reason reason, string token) => (bool valid); + + // Release the token when no longer needed, rendering it invalid. + InvalidateToken@2(string token); +};
diff --git a/chromeos/dbus/shill/fake_shill_manager_client.cc b/chromeos/dbus/shill/fake_shill_manager_client.cc index b714305..8090e97 100644 --- a/chromeos/dbus/shill/fake_shill_manager_client.cc +++ b/chromeos/dbus/shill/fake_shill_manager_client.cc
@@ -126,13 +126,13 @@ } int GetSecurityOrder(const base::Value& dict) { - std::string security = GetStringValue(dict, shill::kSecurityProperty); + std::string security = GetStringValue(dict, shill::kSecurityClassProperty); // No security is listed last. - if (security == shill::kSecurityNone) + if (security == shill::kSecurityClassNone) return 3; // 8021x is listed first. - if (security == shill::kSecurity8021x) + if (security == shill::kSecurityClass8021x) return 1; // All other security types are equal priority. @@ -888,7 +888,7 @@ services->AddService(kWifi1Path, "wifi1_guid", "wifi1" /* name */, shill::kTypeWifi, state, add_to_visible); services->SetServiceProperty(kWifi1Path, shill::kSecurityClassProperty, - base::Value(shill::kSecurityWep)); + base::Value(shill::kSecurityClassWep)); services->SetServiceProperty(kWifi1Path, shill::kConnectableProperty, base::Value(true)); profiles->AddService(shared_profile, kWifi1Path); @@ -899,7 +899,7 @@ shill::kTypeWifi, shill::kStateIdle, add_to_visible); if (s_dynamic_wep) { services->SetServiceProperty(kWifi2Path, shill::kSecurityClassProperty, - base::Value(shill::kSecurityWep)); + base::Value(shill::kSecurityClassWep)); services->SetServiceProperty(kWifi2Path, shill::kEapKeyMgmtProperty, base::Value(shill::kKeyManagementIEEE8021X)); services->SetServiceProperty(kWifi2Path, shill::kEapMethodProperty, @@ -908,7 +908,7 @@ base::Value("John Doe")); } else { services->SetServiceProperty(kWifi2Path, shill::kSecurityClassProperty, - base::Value(shill::kSecurityPsk)); + base::Value(shill::kSecurityClassPsk)); } services->SetServiceProperty(kWifi2Path, shill::kConnectableProperty, base::Value(false)); @@ -932,7 +932,7 @@ shill::kStateIdle, add_to_visible); services->SetServiceProperty(kPortaledWifiPath, shill::kSecurityClassProperty, - base::Value(shill::kSecurityNone)); + base::Value(shill::kSecurityClassNone)); services->SetConnectBehavior( kPortaledWifiPath, base::BindRepeating(&UpdatePortaledWifiState, kPortaledWifiPath));
diff --git a/chromeos/dbus/shill/fake_shill_service_client.cc b/chromeos/dbus/shill/fake_shill_service_client.cc index 4a0674c..f696fe7 100644 --- a/chromeos/dbus/shill/fake_shill_service_client.cc +++ b/chromeos/dbus/shill/fake_shill_service_client.cc
@@ -56,26 +56,35 @@ std::string GetSecurityClass(const base::Value& service_properties) { // Mimics shill's WiFiProvider::GetServiceParametersFromStorage with - // WiFiService::ComputeSecurityClass . + // WiFiService::ComputeSecurityClass. const std::string* security_class = service_properties.FindStringKey(shill::kSecurityClassProperty); - const std::string* security = - service_properties.FindStringKey(shill::kSecurityProperty); - if (security_class && security && *security_class != *security) { - LOG(ERROR) << "Mismatch between SecurityClass " << *security_class - << " and Security " << *security; - } if (security_class) return *security_class; - if (security) { - if (*security == shill::kSecurityRsn || *security == shill::kSecurityWpa) - return shill::kSecurityPsk; - return *security; - } + const std::string* security = + service_properties.FindStringKey(shill::kSecurityProperty); - return shill::kSecurityNone; + if (!security) + return shill::kSecurityClassNone; + + static const std::array<std::string, 6> psk_securities = { + shill::kSecurityWpa, shill::kSecurityWpaWpa2, shill::kSecurityWpaAll, + shill::kSecurityWpa2, shill::kSecurityWpa2Wpa3, shill::kSecurityWpa3}; + if (base::Contains(psk_securities, *security)) + return shill::kSecurityClassPsk; + + static const std::array<std::string, 6> eap_securities = { + shill::kSecurityWpaEnterprise, shill::kSecurityWpaWpa2Enterprise, + shill::kSecurityWpaAllEnterprise, shill::kSecurityWpa2Enterprise, + shill::kSecurityWpa2Wpa3Enterprise, shill::kSecurityWpa3Enterprise}; + if (base::Contains(eap_securities, *security)) + return shill::kSecurityClass8021x; + + // Neither PSK nor 8021x so it is either "wep" or "none" securities which + // are the same as their SecurityClass names. + return *security; } // Returns true if both |template_service_properties| and |service_properties| @@ -475,7 +484,7 @@ properties->SetKey(shill::kVisibleProperty, base::Value(visible)); if (type == shill::kTypeWifi) { properties->SetKey(shill::kSecurityClassProperty, - base::Value(shill::kSecurityNone)); + base::Value(shill::kSecurityClassNone)); properties->SetKey(shill::kModeProperty, base::Value(shill::kModeManaged)); } @@ -537,7 +546,7 @@ base::Value(false)); base::Value* security = dict->FindKey(shill::kSecurityClassProperty); if (security && security->is_string() && - security->GetString() == shill::kSecurityPsk) { + security->GetString() == shill::kSecurityClassPsk) { new_properties.SetKey(shill::kConnectableProperty, base::Value(true)); } }
diff --git a/chromeos/dbus/shill/shill_client_unittest_base.cc b/chromeos/dbus/shill/shill_client_unittest_base.cc index 692e7871..328c3c1 100644 --- a/chromeos/dbus/shill/shill_client_unittest_base.cc +++ b/chromeos/dbus/shill/shill_client_unittest_base.cc
@@ -305,7 +305,7 @@ properties.SetKey(shill::kWifiHexSsid, base::Value(base::HexEncode(ssid.c_str(), ssid.size()))); properties.SetKey(shill::kSecurityClassProperty, - base::Value(shill::kSecurityPsk)); + base::Value(shill::kSecurityClassPsk)); return properties; }
diff --git a/chromeos/lacros/lacros_service.cc b/chromeos/lacros/lacros_service.cc index 174923e..1f5fff5d 100644 --- a/chromeos/lacros/lacros_service.cc +++ b/chromeos/lacros/lacros_service.cc
@@ -52,6 +52,7 @@ #include "chromeos/crosapi/mojom/holding_space_service.mojom.h" #include "chromeos/crosapi/mojom/identity_manager.mojom.h" #include "chromeos/crosapi/mojom/image_writer.mojom.h" +#include "chromeos/crosapi/mojom/in_session_auth.mojom.h" #include "chromeos/crosapi/mojom/keystore_service.mojom.h" #include "chromeos/crosapi/mojom/kiosk_session_service.mojom.h" #include "chromeos/crosapi/mojom/launcher_search.mojom.h" @@ -350,6 +351,9 @@ ConstructRemote<crosapi::mojom::ImageWriter, &crosapi::mojom::Crosapi::BindImageWriter, Crosapi::MethodMinVersions::kBindImageWriterMinVersion>(); + ConstructRemote<crosapi::mojom::InSessionAuth, + &crosapi::mojom::Crosapi::BindInSessionAuth, + Crosapi::MethodMinVersions::kBindInSessionAuthMinVersion>(); ConstructRemote<crosapi::mojom::KeystoreService, &crosapi::mojom::Crosapi::BindKeystoreService, Crosapi::MethodMinVersions::kBindKeystoreServiceMinVersion>();
diff --git a/chromeos/profiles/orderfile.newest.txt b/chromeos/profiles/orderfile.newest.txt index e003250..18e5212 100644 --- a/chromeos/profiles/orderfile.newest.txt +++ b/chromeos/profiles/orderfile.newest.txt
@@ -1 +1 @@ -chromeos-chrome-orderfile-field-105-5187.0-1658746147-benchmark-105.0.5195.11-r1.orderfile.xz +chromeos-chrome-orderfile-field-105-5187.0-1658746147-benchmark-105.0.5195.13-r1.orderfile.xz
diff --git a/chromeos/strings/chromeos_strings_as.xtb b/chromeos/strings/chromeos_strings_as.xtb index 1d76cf6c..39f918e 100644 --- a/chromeos/strings/chromeos_strings_as.xtb +++ b/chromeos/strings/chromeos_strings_as.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">প্রকাৰ</translation> <translation id="2461822463642141190">বৰ্তমান</translation> <translation id="2480034874476596812">মেনুৱেলী অফ কৰক</translation> +<translation id="248546197012830854">ডিভাইচটো অফলাইন হৈ আছে। সহায় বিষয়ক সমল চাবলৈ ৱাই-ফাই নেটৱৰ্কৰ সৈতে সংযুক্ত হওক।</translation> <translation id="2491955442992294626">আপুনি আন এখন ৱিণ্ড’ ব্যৱহাৰ কৰি থাকোঁতে কীসমূহ পৰীক্ষা কৰা নহয়</translation> <translation id="2493126929778606526">স্বয়ংক্ৰিয়ভাৱে বাছনি কৰা আপোনাৰ শ্ৰেষ্ঠ ফট’সমূহ</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -661,6 +662,7 @@ <translation id="6611280807952151149"><ph name="DEVICE_TYPE" /> মেৰামতি কৰাৰ পৰা বাহিৰ হওক</translation> <translation id="6618744767048954150">চলি আছে</translation> <translation id="6620487321149975369">প্ৰিণ্টিঙৰ কামসমূহ মেনুৱেলভাৱে আঁতৰাই নিদিয়ালৈকে সেইসমূহ ইতিহাসত দেখা পোৱা যাব</translation> +<translation id="6624819909909965616">১০ এমবিতকৈ ডাঙৰ ফাইল আপল’ড কৰিব নোৱাৰি</translation> <translation id="6643016212128521049">মচক</translation> <translation id="6644568396961840069">ফাইলটো ছেভ কৰিব পৰা নগ’ল। বেলেগ এটা বাহ্যিক ষ্ট’ৰেজত প্লাগ ইন কৰি চাওক অথবা পাছত পুনৰ চেষ্টা কাৰক।</translation> <translation id="6647510110698214773">এনক্ৰিপশ্বনৰ এলগ’ৰিডম</translation> @@ -696,6 +698,7 @@ <translation id="6965382102122355670">ঠিক আছে</translation> <translation id="6977381486153291903">ফাৰ্মৱেৰৰ পুনৰীক্ষণ</translation> <translation id="6995564396478647735">ৰাইট কৰিব নোৱৰাকৈ সুৰক্ষিত কৰাটো অন হৈ থকাটো নিশ্চিত কৰক</translation> +<translation id="7005833343836210400">ডিভাইচটো অফলাইন হৈ আছে</translation> <translation id="7028979494427204405"><ph name="MANAGER" />এ এই ডিভাইচটো পৰিচালনা কৰে আৰু চোৱা ৱেবপৃষ্ঠা, পাছৱৰ্ড আৰু ইমেইলকে ধৰি ব্যৱহাৰকাৰীৰ আটাইবোৰ কাৰ্যকলাপ এক্সেছ কৰিব পাৰে।</translation> <translation id="7040230719604914234">অপাৰেটৰ</translation> <translation id="7041549558901442110">ডিভাইচটো সংযোগ কৰা হোৱা নাই।</translation> @@ -809,6 +812,7 @@ <translation id="8075838845814659848">বাকী থকা চাৰ্জ</translation> <translation id="8082366717211101304">Android এপৰ পৰা DNS সমাধান কৰিব নোৱাৰি</translation> <translation id="808894953321890993">পাছৱৰ্ড সলনি কৰক</translation> +<translation id="8094062939584182041">Googleক এই সমস্যাটোৰ বিষয়ে আপোনালৈ ইমেইল কৰিবলৈ দিয়ক</translation> <translation id="8104083085214006426">আপুনি এটা মুক্ত আৰু অসুৰক্ষিত নেটৱৰ্ক ব্যৱহাৰ কৰি আছে</translation> <translation id="8109786307828817014">বিফল হোৱা কেলিব্ৰে’শ্বনৰ সৈতে আগবাঢ়িবনে?</translation> <translation id="811820734797650957">(Android) গে’টৱে’ পিং কৰিব পাৰি</translation>
diff --git a/chromeos/strings/chromeos_strings_ca.xtb b/chromeos/strings/chromeos_strings_ca.xtb index 27b8e1d..cb77e4b 100644 --- a/chromeos/strings/chromeos_strings_ca.xtb +++ b/chromeos/strings/chromeos_strings_ca.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">Tipus</translation> <translation id="2461822463642141190">Actual</translation> <translation id="2480034874476596812">Desactiva manualment</translation> +<translation id="248546197012830854">El dispositiu no té connexió. Connecta'l a la xarxa Wi-Fi per veure el contingut d'ajuda.</translation> <translation id="2491955442992294626">Les tecles no es proven quan fas servir una altra finestra</translation> <translation id="2493126929778606526">Les teves millors fotos, seleccionades automàticament</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> (<ph name="SOURCE_LANGUAGE_NAME" />)</translation> @@ -661,6 +662,7 @@ <translation id="6611280807952151149">Surt de la reparació del <ph name="DEVICE_TYPE" /></translation> <translation id="6618744767048954150">Comprovació en curs</translation> <translation id="6620487321149975369">Les tasques d'impressió es mostraran a l'historial tret que se suprimeixin manualment</translation> +<translation id="6624819909909965616">No es pot penjar un fitxer de més de 10 MB</translation> <translation id="6643016212128521049">Esborra</translation> <translation id="6644568396961840069">El fitxer no s'ha pogut desar. Prova de connectar-lo a un altre emmagatzematge extern o torna-ho a provar més tard.</translation> <translation id="6647510110698214773">Algoritme d'encriptació</translation> @@ -696,6 +698,7 @@ <translation id="6965382102122355670">D'acord</translation> <translation id="6977381486153291903">Revisió de microprogramari</translation> <translation id="6995564396478647735">Assegura't que la protecció contra l'escriptura estigui activada</translation> +<translation id="7005833343836210400">El dispositiu no té connexió</translation> <translation id="7028979494427204405"><ph name="MANAGER" /> gestiona aquest dispositiu i té accés a tota l'activitat dels usuaris, com ara les pàgines web visitades, les contrasenyes i el correu electrònic.</translation> <translation id="7040230719604914234">Operador</translation> <translation id="7041549558901442110">El dispositiu no està connectat.</translation> @@ -809,6 +812,7 @@ <translation id="8075838845814659848">Càrrega restant</translation> <translation id="8082366717211101304">No es pot resoldre el DNS des d'aplicacions d'Android</translation> <translation id="808894953321890993">Canvia la contrasenya</translation> +<translation id="8094062939584182041">Permet que Google t'enviï un correu electrònic sobre aquest problema</translation> <translation id="8104083085214006426">Estàs utilitzant una xarxa oberta i no segura</translation> <translation id="8109786307828817014">Vols continuar amb les calibracions fallides?</translation> <translation id="811820734797650957">(Android) Es pot fer ping a la passarel·la</translation>
diff --git a/chromeos/strings/chromeos_strings_cs.xtb b/chromeos/strings/chromeos_strings_cs.xtb index 66f1fca..106dd81 100644 --- a/chromeos/strings/chromeos_strings_cs.xtb +++ b/chromeos/strings/chromeos_strings_cs.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">Typ</translation> <translation id="2461822463642141190">Aktuální</translation> <translation id="2480034874476596812">Vypnout ručně</translation> +<translation id="248546197012830854">Zařízení je offline. Pokud chcete zobrazit obsah nápovědy, připojte se k síti Wi-Fi.</translation> <translation id="2491955442992294626">Když používáte jiné okno, klíče nejsou testovány</translation> <translation id="2493126929778606526">Vaše nejlepší fotky, vybrané automaticky</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -661,6 +662,7 @@ <translation id="6611280807952151149">Ukončit opravu zařízení <ph name="DEVICE_TYPE" /></translation> <translation id="6618744767048954150">Probíhá</translation> <translation id="6620487321149975369">Tiskové úlohy se budou zobrazovat v historii, pokud je ručně neodstraníte</translation> +<translation id="6624819909909965616">Nelze nahrát soubor větší než 10 MB</translation> <translation id="6643016212128521049">Vymazat</translation> <translation id="6644568396961840069">Soubor se nepodařilo uložit. Zkuste připojit jiné externí úložiště nebo to zkuste znovu později.</translation> <translation id="6647510110698214773">Šifrovací algoritmus</translation> @@ -696,6 +698,7 @@ <translation id="6965382102122355670">OK</translation> <translation id="6977381486153291903">Revize firmwaru</translation> <translation id="6995564396478647735">Zkontrolujte, zda je zapnutá ochrana proti zápisu</translation> +<translation id="7005833343836210400">Zařízení je offline</translation> <translation id="7028979494427204405">Toto zařízení je spravováno doménou <ph name="MANAGER" />, která má přístup k veškeré uživatelské aktivitě, včetně navštívených webových stránek, hesel a e‑mailu.</translation> <translation id="7040230719604914234">Operátor</translation> <translation id="7041549558901442110">Zařízení není připojeno.</translation> @@ -809,6 +812,7 @@ <translation id="8075838845814659848">Zbývající kapacita</translation> <translation id="8082366717211101304">Z aplikací pro Android nelze přeložit záznamy DNS</translation> <translation id="808894953321890993">Změnit heslo</translation> +<translation id="8094062939584182041">Povolit Googlu informovat vás o problému e-mailem</translation> <translation id="8104083085214006426">Používáte otevřenou, nezabezpečenou síť</translation> <translation id="8109786307828817014">Pokračovat s neúspěšnými kalibracemi?</translation> <translation id="811820734797650957">(Android) Pingnutí brány</translation>
diff --git a/chromeos/strings/chromeos_strings_cy.xtb b/chromeos/strings/chromeos_strings_cy.xtb index 765b066..de61ec2 100644 --- a/chromeos/strings/chromeos_strings_cy.xtb +++ b/chromeos/strings/chromeos_strings_cy.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">Math</translation> <translation id="2461822463642141190">Presennol</translation> <translation id="2480034874476596812">Diffodd yn bwrpasol</translation> +<translation id="248546197012830854">Mae'r ddyfais all-lein. Cysylltwch â rhwydwaith Wi-Fi i weld cynnwys cymorth.</translation> <translation id="2491955442992294626">Nid yw allweddi'n cael eu profi pan fyddwch yn defnyddio ffenestr arall</translation> <translation id="2493126929778606526">Eich lluniau gorau, wedi'u dewis yn awtomatig</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -661,6 +662,7 @@ <translation id="6611280807952151149">Gadael atgyweirio <ph name="DEVICE_TYPE" /></translation> <translation id="6618744767048954150">wrthi'n rhedeg</translation> <translation id="6620487321149975369">Bydd tasgau argraffu yn ymddangos yn yr hanes oni bai eu bod yn cael eu tynnu'n bwrpasol</translation> +<translation id="6624819909909965616">Methu ag uwchlwytho ffeil sy'n fwy na 10 MB</translation> <translation id="6643016212128521049">Clirio</translation> <translation id="6644568396961840069">Nid oedd modd cadw'r ffeil. Rhowch gynnig ar blygio storfa allanol wahanol i mewn, neu rhowch gynnig arall arni'n nes ymlaen.</translation> <translation id="6647510110698214773">Algorithm amgryptio</translation> @@ -696,6 +698,7 @@ <translation id="6965382102122355670">Iawn</translation> <translation id="6977381486153291903">Adolygiad cadarnwedd</translation> <translation id="6995564396478647735">Gwnewch yn siŵr bod Diogelu Ysgrifennu ymlaen</translation> +<translation id="7005833343836210400">Mae'r ddyfais all-lein</translation> <translation id="7028979494427204405">Mae <ph name="MANAGER" /> yn rheoli'r ddyfais hon ac mae ganddo fynediad at holl weithgarwch y defnyddiwr, gan gynnwys tudalennau gwe yr ymwelwyd â nhw, cyfrineiriau, ac e-byst.</translation> <translation id="7040230719604914234">Gweithredydd</translation> <translation id="7041549558901442110">Nid yw'r ddyfais wedi'i chysylltu.</translation> @@ -809,6 +812,7 @@ <translation id="8075838845814659848">Faint o fatri sy'n weddill</translation> <translation id="8082366717211101304">Methu â datrys DNS o apiau Android</translation> <translation id="808894953321890993">Newid cyfrinair</translation> +<translation id="8094062939584182041">Caniatáu i Google anfon e-bost atoch am y broblem hon</translation> <translation id="8104083085214006426">Rydych yn defnyddio rhwydwaith agored anniogel</translation> <translation id="8109786307828817014">Parhau er bod calibradu rhai cydrannau wedi methu?</translation> <translation id="811820734797650957">Gall porth gael ei Bingio (Android)</translation>
diff --git a/chromeos/strings/chromeos_strings_el.xtb b/chromeos/strings/chromeos_strings_el.xtb index 686812e..84c5106 100644 --- a/chromeos/strings/chromeos_strings_el.xtb +++ b/chromeos/strings/chromeos_strings_el.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">Τύπος</translation> <translation id="2461822463642141190">Τρέχουσα</translation> <translation id="2480034874476596812">Μη αυτόματη απενεργοποίηση</translation> +<translation id="248546197012830854">Η συσκευή είναι εκτός σύνδεσης. Συνδεθείτε στο δίκτυο Wi-Fi για να δείτε περιεχόμενο βοήθειας.</translation> <translation id="2491955442992294626">Η δοκιμή των πλήκτρων δεν πραγματοποιείται όταν χρησιμοποιείτε άλλο παράθυρο</translation> <translation id="2493126929778606526">Οι καλύτερες αυτόματα επιλεγμένες φωτογραφίες σας</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -661,6 +662,7 @@ <translation id="6611280807952151149">Έξοδος από επισκευή <ph name="DEVICE_TYPE" /></translation> <translation id="6618744767048954150">Σε εξέλιξη</translation> <translation id="6620487321149975369">Οι εργασίες εκτύπωσης θα εμφανίζονται στο ιστορικό, εκτός εάν καταργηθούν μη αυτόματα.</translation> +<translation id="6624819909909965616">Δεν είναι δυνατή η μεταφόρτωση αρχείου που υπερβαίνει τα 10 MB</translation> <translation id="6643016212128521049">Διαγραφή</translation> <translation id="6644568396961840069">Δεν ήταν δυνατή η αποθήκευση του αρχείου. Δοκιμάστε να συνδέσετε διαφορετικό εξωτερικό αποθηκευτικό χώρο ή δοκιμάστε ξανά αργότερα.</translation> <translation id="6647510110698214773">Αλγόριθμος κρυπτογράφησης</translation> @@ -696,6 +698,7 @@ <translation id="6965382102122355670">OK</translation> <translation id="6977381486153291903">Έκδοση υλικολογισμικού</translation> <translation id="6995564396478647735">Βεβαιωθείτε ότι η Προστασία εγγραφής είναι ενεργοποιημένη.</translation> +<translation id="7005833343836210400">Η συσκευή είναι εκτός σύνδεσης</translation> <translation id="7028979494427204405">Ο τομέας <ph name="MANAGER" /> διαχειρίζεται αυτήν τη συσκευή και έχει πρόσβαση σε όλη τη δραστηριότητα των χρηστών, συμπεριλαμβανομένων των ιστοσελίδων που επισκέπτεστε, των κωδικών πρόσβασης και του ηλεκτρονικού ταχυδρομείου.</translation> <translation id="7040230719604914234">Χειριστής</translation> <translation id="7041549558901442110">Η συσκευή δεν είναι συνδεδεμένη.</translation> @@ -809,6 +812,7 @@ <translation id="8075838845814659848">Υπόλοιπο φόρτισης</translation> <translation id="8082366717211101304">Δεν είναι δυνατή η επίλυση DNS από εφαρμογές Android.</translation> <translation id="808894953321890993">Αλλαγή κωδικού πρόσβασης</translation> +<translation id="8094062939584182041">Επιτρέψτε στην Google να σας στέλνει μηνύματα ηλεκτρονικού ταχυδρομείου σχετικά με αυτό το ζήτημα</translation> <translation id="8104083085214006426">Χρησιμοποιείτε ένα ανοιχτό και μη ασφαλές δίκτυο.</translation> <translation id="8109786307828817014">Συνέχιση με βαθμονομήσεις που έχουν αποτύχει;</translation> <translation id="811820734797650957">(Android) Η πύλη λαμβάνει ping</translation>
diff --git a/chromeos/strings/chromeos_strings_et.xtb b/chromeos/strings/chromeos_strings_et.xtb index 2af7be5..9c983b8e 100644 --- a/chromeos/strings/chromeos_strings_et.xtb +++ b/chromeos/strings/chromeos_strings_et.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">Tüüp</translation> <translation id="2461822463642141190">Praegune</translation> <translation id="2480034874476596812">Käsitsi väljalülitamine</translation> +<translation id="248546197012830854">Seade on võrguühenduseta. Abimaterjalide nägemiseks looge ühendus WiFi-võrguga.</translation> <translation id="2491955442992294626">Klahve ei testita, kui kasutate teist akent</translation> <translation id="2493126929778606526">Teie parimad fotod, valitud automaatselt</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -661,6 +662,7 @@ <translation id="6611280807952151149">Välju seadme <ph name="DEVICE_TYPE" /> remondivoost</translation> <translation id="6618744767048954150">Pooleli</translation> <translation id="6620487321149975369">Prinditööd kuvatakse ajaloos, kui neid käsitsi ei eemaldata</translation> +<translation id="6624819909909965616">Ei saa üles laadida faile, mis on suuremad kui 10 MB</translation> <translation id="6643016212128521049">Tühjenda</translation> <translation id="6644568396961840069">Faili ei õnnestunud salvestada. Ühendage mõne teise välise salvestusseadmega või proovige hiljem uuesti.</translation> <translation id="6647510110698214773">Krüpteerimise algoritm</translation> @@ -696,6 +698,7 @@ <translation id="6965382102122355670">OK</translation> <translation id="6977381486153291903">Püsivara redaktsioon</translation> <translation id="6995564396478647735">Veenduge, et kirjutuskaitse oleks sisse lülitatud</translation> +<translation id="7005833343836210400">Seade on võrguühenduseta</translation> <translation id="7028979494427204405"><ph name="MANAGER" /> haldab seda seadet ja sellel on juurdepääs kogu kasutaja tegevusele. sealhulgas külastatud veebilehed, paroolid ja e-post.</translation> <translation id="7040230719604914234">Operaator</translation> <translation id="7041549558901442110">Seade pole ühendatud.</translation> @@ -809,6 +812,7 @@ <translation id="8075838845814659848">Aku laetuse tase</translation> <translation id="8082366717211101304">Ei saa Androidi rakendustest DNS-i lahendada</translation> <translation id="808894953321890993">Muuda parooli</translation> +<translation id="8094062939584182041">Luban Google'il endale selle teema kohta meile saata</translation> <translation id="8104083085214006426">Kasutate avatud ja ebaturvalist võrku</translation> <translation id="8109786307828817014">Kas jätkata ebaõnnestunud kalibreerimistega?</translation> <translation id="811820734797650957">(Android) Lüüsi saab pingida</translation>
diff --git a/chromeos/strings/chromeos_strings_eu.xtb b/chromeos/strings/chromeos_strings_eu.xtb index b28ef4f..4715048 100644 --- a/chromeos/strings/chromeos_strings_eu.xtb +++ b/chromeos/strings/chromeos_strings_eu.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">Mota</translation> <translation id="2461822463642141190">Oraingo kontsumoa</translation> <translation id="2480034874476596812">Desaktibatu eskuz</translation> +<translation id="248546197012830854">Gailua deskonektatuta dago. Konektatu wifi-sarera laguntza-edukia ikusteko.</translation> <translation id="2491955442992294626">Teklei ez zaie probarik egingo beste leiho bat erabili bitartean</translation> <translation id="2493126929778606526">Zure argazkirik onenak, automatikoki hautatuta</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -661,6 +662,7 @@ <translation id="6611280807952151149">Irten <ph name="DEVICE_TYPE" /> gailuaren konponketatik</translation> <translation id="6618744767048954150">Abian</translation> <translation id="6620487321149975369">Inprimatze-lanak historian agertuko dira, eskuz kendu ezean</translation> +<translation id="6624819909909965616">Ezin da kargatu 10 MB baino gehiagoko fitxategirik</translation> <translation id="6643016212128521049">Garbitu</translation> <translation id="6644568396961840069">Ezin izan da gorde fitxategia. Saiatu kanpoko memoria bat entxufatzen edo saiatu berriro geroago.</translation> <translation id="6647510110698214773">Enkriptatze-algoritmoa</translation> @@ -696,6 +698,7 @@ <translation id="6965382102122355670">Ados</translation> <translation id="6977381486153291903">Firmwarearen berrikuspena</translation> <translation id="6995564396478647735">Ziurtatu idazketaren aurkako babesa aktibatuta dagoela</translation> +<translation id="7005833343836210400">Deskonektatuta dago gailua</translation> <translation id="7028979494427204405"><ph name="MANAGER" /> domeinuak kudeatzen du gailu hau, eta erabiltzaileen jarduera guztiak atzi ditzake; besteak beste, bisitatutako webguneak, erabilitako pasahitzak eta posta elektronikoa.</translation> <translation id="7040230719604914234">Operadorea</translation> <translation id="7041549558901442110">Gailua ez dago konektatuta.</translation> @@ -809,6 +812,7 @@ <translation id="8075838845814659848">Geratzen den bateria</translation> <translation id="8082366717211101304">Ezin da ebatzi DNS Android-erako aplikazioetatik</translation> <translation id="808894953321890993">Aldatu pasahitza</translation> +<translation id="8094062939584182041">Eman arazo honi buruzko mezu elektronikoak bidaltzeko baimena Google-ri</translation> <translation id="8104083085214006426">Segurua ez den sare ireki bat ari zara erabiltzen</translation> <translation id="8109786307828817014">Aurrera egin nahi duzu huts egin duten kalibrazioekin?</translation> <translation id="811820734797650957">Ping egin dakioke atebideari (Android)</translation>
diff --git a/chromeos/strings/chromeos_strings_fa.xtb b/chromeos/strings/chromeos_strings_fa.xtb index d20f62b..85dae8b 100644 --- a/chromeos/strings/chromeos_strings_fa.xtb +++ b/chromeos/strings/chromeos_strings_fa.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">نوع</translation> <translation id="2461822463642141190">فعلی</translation> <translation id="2480034874476596812">خاموش کردن بهصورت دستی</translation> +<translation id="248546197012830854">دستگاه آفلاین است. برای دیدن محتوای راهنما، به شبکه Wi-Fi متصل شوید.</translation> <translation id="2491955442992294626">وقتی درحال استفاده از پنجره دیگری هستید، کلیدها آزمایش نمیشوند</translation> <translation id="2493126929778606526">بهترین عکسهایتان که بهطور خودکار انتخاب شدهاند</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -661,6 +662,7 @@ <translation id="6611280807952151149">خروج از تعمیر <ph name="DEVICE_TYPE" /></translation> <translation id="6618744767048954150">درحال اجرا</translation> <translation id="6620487321149975369">کارهای چاپ تا زمانیکه بهطور دستی برداشته نشوند در سابقه نشان داده میشوند</translation> +<translation id="6624819909909965616">امکان بارگذاری فایلهای بزرگتر از ۱۰ مگابایت وجود ندارد</translation> <translation id="6643016212128521049">پاک کردن</translation> <translation id="6644568396961840069">فایل ذخیره نشد. فضای ذخیرهسازی خارجی دیگری را وصل کنید یا بعداً دوباره امتحان کنید.</translation> <translation id="6647510110698214773">الگوریتم رمزگذاری</translation> @@ -696,6 +698,7 @@ <translation id="6965382102122355670">قبول</translation> <translation id="6977381486153291903">بازبینی سفتافزار</translation> <translation id="6995564396478647735">مطمئن شوید «محافظت دربرابر نوشتن» روشن باشد</translation> +<translation id="7005833343836210400">دستگاه آفلاین است</translation> <translation id="7028979494427204405"><ph name="MANAGER" /> این دستگاه را مدیریت میکند و به همه فعالیتهای کاربر، ازجمله صفحههای وب بازدیدشده، گذرواژهها، و ایمیل دسترسی دارد.</translation> <translation id="7040230719604914234">اپراتور</translation> <translation id="7041549558901442110">دستگاه متصل نشده است.</translation> @@ -809,6 +812,7 @@ <translation id="8075838845814659848">شارژ باقیمانده</translation> <translation id="8082366717211101304">نمیتوان ساناد را از برنامههای Android حلوفصل کرد</translation> <translation id="808894953321890993">تغییر گذرواژه</translation> +<translation id="8094062939584182041">اجازه دادن به Google برای ارسال ایمیل درباره این مشکل</translation> <translation id="8104083085214006426">از شبکهای باز و ناامن استفاده میکنید</translation> <translation id="8109786307828817014">با وجود واسنجیهای ناموفق، ادامه میدهید؟</translation> <translation id="811820734797650957">(Android) دروازه را میتوان پینگ کرد</translation>
diff --git a/chromeos/strings/chromeos_strings_hr.xtb b/chromeos/strings/chromeos_strings_hr.xtb index 743d675..7b8215f 100644 --- a/chromeos/strings/chromeos_strings_hr.xtb +++ b/chromeos/strings/chromeos_strings_hr.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">Vrsta</translation> <translation id="2461822463642141190">Trenutačno</translation> <translation id="2480034874476596812">Ručno isključivanje</translation> +<translation id="248546197012830854">Uređaj je offline. Povežite se s Wi-Fi mrežom da biste vidjeli sadržaj pomoći.</translation> <translation id="2491955442992294626">Tipke se ne testiraju kada upotrebljavate drugi prozor</translation> <translation id="2493126929778606526">Vaše najbolje automatski odabrane fotografije</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -661,6 +662,7 @@ <translation id="6611280807952151149">Napusti popravak uređaja <ph name="DEVICE_TYPE" /></translation> <translation id="6618744767048954150">U tijeku</translation> <translation id="6620487321149975369">Zadaci ispisa prikazivat će se u povijesti ako se ne uklone ručno</translation> +<translation id="6624819909909965616">Nije moguće prenijeti datoteku veću od 10 MB</translation> <translation id="6643016212128521049">Izbriši</translation> <translation id="6644568396961840069">Datoteka se ne može spremiti. Priključite neku drugu vanjsku pohranu ili pokušajte ponovo kasnije.</translation> <translation id="6647510110698214773">Algoritam šifriranja</translation> @@ -696,6 +698,7 @@ <translation id="6965382102122355670">U redu</translation> <translation id="6977381486153291903">Revizija opreme</translation> <translation id="6995564396478647735">Provjerite je li zaštita od pisanja isključena</translation> +<translation id="7005833343836210400">Uređaj je offline</translation> <translation id="7028979494427204405">Uređajem upravlja <ph name="MANAGER" /> i taj upravitelj ima pristup svim aktivnostima korisnika, uključujući posjećene web-stranice, zaporke i e-poštu.</translation> <translation id="7040230719604914234">Mobilni operater</translation> <translation id="7041549558901442110">Uređaj nije povezan.</translation> @@ -809,6 +812,7 @@ <translation id="8075838845814659848">Preostala razina napunjenosti</translation> <translation id="8082366717211101304">Razrješavanje DNS-a iz Android aplikacija nije uspjelo</translation> <translation id="808894953321890993">Promjena zaporke</translation> +<translation id="8094062939584182041">Dopustite Googleu da vam pošalje e-poruku o tom problemu</translation> <translation id="8104083085214006426">Upotrebljavate otvorenu i nesigurnu mrežu</translation> <translation id="8109786307828817014">Želite li nastaviti s neuspjelim kalibracijama?</translation> <translation id="811820734797650957">(Android) Pristupnik se može pingati</translation>
diff --git a/chromeos/strings/chromeos_strings_hu.xtb b/chromeos/strings/chromeos_strings_hu.xtb index 77c88f1..c022304 100644 --- a/chromeos/strings/chromeos_strings_hu.xtb +++ b/chromeos/strings/chromeos_strings_hu.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">Típus</translation> <translation id="2461822463642141190">Jelenlegi</translation> <translation id="2480034874476596812">Manuális kikapcsolás</translation> +<translation id="248546197012830854">Az eszköz offline állapotú. A súgótartalom megtekintéséhez csatlakozzon Wi-Fi-hálózathoz.</translation> <translation id="2491955442992294626">A rendszer nem teszteli a billentyűket, amikor másik ablakot használ</translation> <translation id="2493126929778606526">A legjobb, automatikusan kiválasztott fotók</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -661,6 +662,7 @@ <translation id="6611280807952151149">A(z) <ph name="DEVICE_TYPE" /> javításának megszakítása</translation> <translation id="6618744767048954150">Ellenőrzés folyamatban</translation> <translation id="6620487321149975369">A nyomtatási feladatok láthatók az előzmények között, ha nem távolítják el őket manuálisan</translation> +<translation id="6624819909909965616">Nem lehet 10 MB-nál nagyobb fájlt feltölteni</translation> <translation id="6643016212128521049">Törlés</translation> <translation id="6644568396961840069">Nem sikerült menteni a fájlt. Próbálkozzon másik külső tárhely csatlakoztatásával, vagy próbálja újra később.</translation> <translation id="6647510110698214773">Titkosítási algoritmus</translation> @@ -696,6 +698,7 @@ <translation id="6965382102122355670">OK</translation> <translation id="6977381486153291903">Firmware ellenőrzése</translation> <translation id="6995564396478647735">Győződjön meg arról, hogy az Írásvédelem funkció be van kapcsolva</translation> +<translation id="7005833343836210400">Az eszköz offline állapotú</translation> <translation id="7028979494427204405">A(z) <ph name="MANAGER" /> kezeli ezt az eszközt, ezért hozzáfér az összes felhasználói tevékenységhez, köztük a felkeresett webhelyekhez, a jelszavakhoz és az e-mailekhez.</translation> <translation id="7040230719604914234">Szolgáltató</translation> <translation id="7041549558901442110">Az eszköz nincs csatlakoztatva.</translation> @@ -809,6 +812,7 @@ <translation id="8075838845814659848">Töltöttségi szint</translation> <translation id="8082366717211101304">Nem sikerült feloldani a DNS-t androidos alkalmazásokról</translation> <translation id="808894953321890993">Jelszó módosítása</translation> +<translation id="8094062939584182041">A problémáról szóló e-mail küldésének engedélyezése a Google számára</translation> <translation id="8104083085214006426">Ön nyílt és nem biztonságos hálózatot használ</translation> <translation id="8109786307828817014">Folytatja a sikertelen kalibrálásokkal együtt?</translation> <translation id="811820734797650957">(Android) Az átjáró pingelhető</translation>
diff --git a/chromeos/strings/chromeos_strings_id.xtb b/chromeos/strings/chromeos_strings_id.xtb index 6b72e6e9..1ee264ed 100644 --- a/chromeos/strings/chromeos_strings_id.xtb +++ b/chromeos/strings/chromeos_strings_id.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">Jenis</translation> <translation id="2461822463642141190">Arus</translation> <translation id="2480034874476596812">Nonaktifkan secara manual</translation> +<translation id="248546197012830854">Perangkat sedang offline. Hubungkan ke jaringan Wi-Fi untuk melihat konten bantuan.</translation> <translation id="2491955442992294626">Tombol tidak diuji saat Anda sedang menggunakan jendela lain</translation> <translation id="2493126929778606526">Foto terbaik Anda, dipilih otomatis</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -661,6 +662,7 @@ <translation id="6611280807952151149">Keluar dari perbaikan <ph name="DEVICE_TYPE" /></translation> <translation id="6618744767048954150">Sedang berjalan</translation> <translation id="6620487321149975369">Tugas pencetakan akan muncul di histori, kecuali dihapus secara manual</translation> +<translation id="6624819909909965616">Tidak dapat mengupload file yang lebih besar dari 10 MB</translation> <translation id="6643016212128521049">Hapus</translation> <translation id="6644568396961840069">File tidak dapat disimpan. Coba colokkan penyimpanan eksternal lain, atau coba lagi nanti.</translation> <translation id="6647510110698214773">Algoritme enkripsi</translation> @@ -696,6 +698,7 @@ <translation id="6965382102122355670">Oke</translation> <translation id="6977381486153291903">Revisi firmware</translation> <translation id="6995564396478647735">Pastikan Proteksi Tulis aktif</translation> +<translation id="7005833343836210400">Perangkat sedang offline</translation> <translation id="7028979494427204405"><ph name="MANAGER" /> akan mengelola perangkat ini dan memiliki akses ke semua aktivitas pengguna, termasuk halaman yang dikunjungi, sandi, dan email.</translation> <translation id="7040230719604914234">Operator</translation> <translation id="7041549558901442110">Perangkat tidak terhubung.</translation> @@ -809,6 +812,7 @@ <translation id="8075838845814659848">Sisa daya baterai</translation> <translation id="8082366717211101304">Tidak dapat me-resolve DNS dari aplikasi Android</translation> <translation id="808894953321890993">Ubah sandi</translation> +<translation id="8094062939584182041">Izinkan Google mengirim email kepada Anda tentang masalah ini</translation> <translation id="8104083085214006426">Anda menggunakan jaringan terbuka dan tidak aman</translation> <translation id="8109786307828817014">Lanjutkan dengan kalibrasi yang gagal?</translation> <translation id="811820734797650957">(Android) Gateway Dapat Di-ping</translation>
diff --git a/chromeos/strings/chromeos_strings_it.xtb b/chromeos/strings/chromeos_strings_it.xtb index e21abbda..422d160c 100644 --- a/chromeos/strings/chromeos_strings_it.xtb +++ b/chromeos/strings/chromeos_strings_it.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">Tipo</translation> <translation id="2461822463642141190">Attuale</translation> <translation id="2480034874476596812">Disattiva manualmente</translation> +<translation id="248546197012830854">Il dispositivo è offline. Connettiti alla rete Wi-Fi per vedere i contenuti di assistenza.</translation> <translation id="2491955442992294626">I tasti non vengono testati quando utilizzi un'altra finestra</translation> <translation id="2493126929778606526">Le tue foto migliori selezionate automaticamente</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -606,7 +607,7 @@ <translation id="6137767437444130246">Certificato utente</translation> <translation id="6146993107019042706">Per terminare, inserisci la nuova password</translation> <translation id="6147514244879357420">PNG</translation> -<translation id="6165508094623778733">Ulteriori informazioni</translation> +<translation id="6165508094623778733">Scopri di più</translation> <translation id="6184793017104303157">B4</translation> <translation id="6189418609903030344">La capacità della batteria si riduce con l'utilizzo</translation> <translation id="6191293864534840972">formato dei server dei nomi non valido</translation> @@ -661,6 +662,7 @@ <translation id="6611280807952151149">Esci dalla riparazione di <ph name="DEVICE_TYPE" /></translation> <translation id="6618744767048954150">In corso</translation> <translation id="6620487321149975369">I processi di stampa verranno mostrati nella cronologia a meno che non vengano rimossi manualmente</translation> +<translation id="6624819909909965616">Impossibile caricare file di dimensioni superiori a 10 MB</translation> <translation id="6643016212128521049">Cancella</translation> <translation id="6644568396961840069">Impossibile salvare il file. Prova a collegare un dispositivo di archiviazione esterno diverso oppure riprova più tardi.</translation> <translation id="6647510110698214773">Algoritmo di crittografia</translation> @@ -696,6 +698,7 @@ <translation id="6965382102122355670">OK</translation> <translation id="6977381486153291903">Revisione firmware</translation> <translation id="6995564396478647735">Assicurati che la protezione della scrittura sia attiva</translation> +<translation id="7005833343836210400">Il dispositivo è offline</translation> <translation id="7028979494427204405"><ph name="MANAGER" /> gestisce questo dispositivo e ha accesso a tutta l'attività utente, tra cui le pagine web visitate, le password e le email.</translation> <translation id="7040230719604914234">Operatore</translation> <translation id="7041549558901442110">Il dispositivo non è collegato.</translation> @@ -809,6 +812,7 @@ <translation id="8075838845814659848">Carica rimanente</translation> <translation id="8082366717211101304">Impossibile risolvere la richiesta DNS da app Android</translation> <translation id="808894953321890993">Cambia password</translation> +<translation id="8094062939584182041">Consenti a Google di inviarti email relative a questo problema</translation> <translation id="8104083085214006426">Stai usando una rete aperta e non protetta</translation> <translation id="8109786307828817014">Vuoi procedere anche se alcune calibrazioni non sono andate a buon fine?</translation> <translation id="811820734797650957">(Android) È possibile inviare un ping al gateway</translation>
diff --git a/chromeos/strings/chromeos_strings_ja.xtb b/chromeos/strings/chromeos_strings_ja.xtb index 7edba3b1..f330602 100644 --- a/chromeos/strings/chromeos_strings_ja.xtb +++ b/chromeos/strings/chromeos_strings_ja.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">種類</translation> <translation id="2461822463642141190">現在</translation> <translation id="2480034874476596812">手動で無効にする</translation> +<translation id="248546197012830854">デバイスはオフラインです。ヘルプ コンテンツを表示するには、Wi-Fi ネットワークに接続してください。</translation> <translation id="2491955442992294626">別のウィンドウを使用している場合、キーはテストされません。</translation> <translation id="2493126929778606526">自動的に選択されたベストショットです</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -661,6 +662,7 @@ <translation id="6611280807952151149"><ph name="DEVICE_TYPE" /> の修復を終了</translation> <translation id="6618744767048954150">実行中</translation> <translation id="6620487321149975369">印刷ジョブは、手動で削除するまで履歴に表示されます</translation> +<translation id="6624819909909965616">10 MB を超えるファイルはアップロードできません</translation> <translation id="6643016212128521049">削除</translation> <translation id="6644568396961840069">ファイルを保存できませんでした。別の外部ストレージに接続するか、しばらくしてからもう一度お試しください。</translation> <translation id="6647510110698214773">暗号化アルゴリズム</translation> @@ -696,6 +698,7 @@ <translation id="6965382102122355670">OK</translation> <translation id="6977381486153291903">ファームウェア リビジョン</translation> <translation id="6995564396478647735">書き込み保護がオンになっていることを確認してください</translation> +<translation id="7005833343836210400">デバイスはオフラインです</translation> <translation id="7028979494427204405"><ph name="MANAGER" /> はこのデバイスを管理しており、閲覧したウェブページ、パスワード、メールなど、すべてのユーザー アクティビティにアクセスできます。</translation> <translation id="7040230719604914234">携帯通信会社</translation> <translation id="7041549558901442110">デバイスは接続されていません。</translation> @@ -809,6 +812,7 @@ <translation id="8075838845814659848">バッテリー残量</translation> <translation id="8082366717211101304">Android アプリから DNS を解決できません</translation> <translation id="808894953321890993">パスワードの変更</translation> +<translation id="8094062939584182041">この問題に関するメールの送信を Google に許可する</translation> <translation id="8104083085214006426">保護されていないオープン ネットワークを使用しています</translation> <translation id="8109786307828817014">キャリブレーションに失敗しましたが続行しますか?</translation> <translation id="811820734797650957">(Android)ゲートウェイへの ping</translation>
diff --git a/chromeos/strings/chromeos_strings_ka.xtb b/chromeos/strings/chromeos_strings_ka.xtb index fe803b5..ac4f0a0 100644 --- a/chromeos/strings/chromeos_strings_ka.xtb +++ b/chromeos/strings/chromeos_strings_ka.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">ტიპი</translation> <translation id="2461822463642141190">ამჟამინდელი</translation> <translation id="2480034874476596812">ხელით გამორთვა</translation> +<translation id="248546197012830854">მოწყობილობა ხაზგარეშე რეჟიმშია. დამხმარე კონტენტის სანახავად დაუკავშირდით Wi-Fi ქსელს.</translation> <translation id="2491955442992294626">კლავიშების ტესტირება ვერ მოხერხდება, როცა სხვა ფანჯარას იყენებთ</translation> <translation id="2493126929778606526">ავტომატურად არჩეული თქვენი საუკეთესო ფოტოები</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -661,6 +662,7 @@ <translation id="6611280807952151149"><ph name="DEVICE_TYPE" />-ის შეკეთებიდან გასვლა</translation> <translation id="6618744767048954150">მიმდინარეობს</translation> <translation id="6620487321149975369">ბეჭდვის დავალებები გამოჩნდება ისტორიაში, თუ მათ ხელით არ ამოშლით</translation> +<translation id="6624819909909965616">10 მბაიტზე დიდი ზომის ფაილის ატვირთვა ვერ მოხერხდება</translation> <translation id="6643016212128521049">გასუფთავება</translation> <translation id="6644568396961840069">ფაილის შენახვა ვერ მოხერხდა. ცადეთ სხვა გარე მეხსიერების მიერთება, ან ცადეთ მოგვიანებით.</translation> <translation id="6647510110698214773">დაშიფვრის ალგორითმი</translation> @@ -696,6 +698,7 @@ <translation id="6965382102122355670">კარგი</translation> <translation id="6977381486153291903">მიკროპროგრამის ვერსია</translation> <translation id="6995564396478647735">დარწმუნდით, რომ ჩაწერისგან დაცვა ჩართულია</translation> +<translation id="7005833343836210400">მოწყობილობა ხაზგარეშე რეჟიმშია</translation> <translation id="7028979494427204405"><ph name="MANAGER" /> მართავს ამ მოწყობილობას და აქვს წვდომა მომხმარებლების ნებისმიერ აქტივობაზე, მათ შორის, მონახულებულ ვებგვერდებზე, პაროლებსა და ელფოსტაზე.</translation> <translation id="7040230719604914234">ოპერატორი</translation> <translation id="7041549558901442110">მოწყობილობა დაკავშირებული არ არის.</translation> @@ -809,6 +812,7 @@ <translation id="8075838845814659848">დარჩენილი მუხტი</translation> <translation id="8082366717211101304">DNS-ის დარეგულირება ვერ მოხერხდა Android აპებიდან</translation> <translation id="808894953321890993">პაროლის შეცვლა</translation> +<translation id="8094062939584182041">ამ პრობლემის თაობაზე ელფოსტით დაკავშირების დაშვება Google-ისთვის</translation> <translation id="8104083085214006426">თქვენ ღია და არასტაბილური ქსელით სარგებლობთ</translation> <translation id="8109786307828817014">გსურთ წარუმატებელი კალიბრაციით გაგრძელება?</translation> <translation id="811820734797650957">(Android) გეითვეის ping-მეთოდით ტესტირება</translation>
diff --git a/chromeos/strings/chromeos_strings_kk.xtb b/chromeos/strings/chromeos_strings_kk.xtb index b01fbb4..bf5e20e 100644 --- a/chromeos/strings/chromeos_strings_kk.xtb +++ b/chromeos/strings/chromeos_strings_kk.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">Түрі</translation> <translation id="2461822463642141190">Қазіргі</translation> <translation id="2480034874476596812">Қолмен өшіру</translation> +<translation id="248546197012830854">Құрылғы офлайн режимде. Анықтамалық мазмұнды көру үшін Wi-Fi желісіне қосылыңыз.</translation> <translation id="2491955442992294626">Басқа терезе ашық тұрған кезде, пернетақта тексерілмейді.</translation> <translation id="2493126929778606526">Сіздің ең әдемі фотосуреттеріңіз автоматты түрде таңдалады</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -660,6 +661,7 @@ <translation id="6611280807952151149"><ph name="DEVICE_TYPE" /> құрылғысын жөндеу бетінен шығу</translation> <translation id="6618744767048954150">Жұмыс істеп тұр</translation> <translation id="6620487321149975369">Қолмен өшірмесеңіз, баспа жұмыстары тарихта сақтала береді.</translation> +<translation id="6624819909909965616">10 МБ-тан үлкен файлды жүктеп салу мүмкін емес.</translation> <translation id="6643016212128521049">Тазалау</translation> <translation id="6644568396961840069">Файл сақталмады. Басқа сыртқы жадты қосып көріңіз немесе әрекетті кейінірек қайталаңыз.</translation> <translation id="6647510110698214773">Шифрлау алгоритмі</translation> @@ -695,6 +697,7 @@ <translation id="6965382102122355670">Жарайды</translation> <translation id="6977381486153291903">Микробағдарлама нұсқасы</translation> <translation id="6995564396478647735">Write Protect функциясы қосулы екеніне көз жеткізіңіз</translation> +<translation id="7005833343836210400">Құрылғы офлайн режимде.</translation> <translation id="7028979494427204405"><ph name="MANAGER" /> осы құрылғыны басқарады және пайдаланушының барлық әрекетін (мысалы, кірген веб-сайттары, құпия сөздері және электрондық поштасы) көре алады.</translation> <translation id="7040230719604914234">Оператор</translation> <translation id="7041549558901442110">Құрылғы жалғанбаған.</translation> @@ -808,6 +811,7 @@ <translation id="8075838845814659848">Қалған заряд</translation> <translation id="8082366717211101304">Android қолданбаларынан DNS-ті анықтау мүмкін емес.</translation> <translation id="808894953321890993">Кұпия сөзді өзгерту</translation> +<translation id="8094062939584182041">Google-ға осы мәселе туралы электрондық хат жіберуге рұқсат ету</translation> <translation id="8104083085214006426">Ашық әрі қауіпті желіні қолданып жатырсыз.</translation> <translation id="8109786307828817014">Калибрленбеген құрамдастармен жалғастыра бересіз бе?</translation> <translation id="811820734797650957">Шлюз байланысы тексеріледі (Android)</translation>
diff --git a/chromeos/strings/chromeos_strings_kn.xtb b/chromeos/strings/chromeos_strings_kn.xtb index 8167f48..3220e69 100644 --- a/chromeos/strings/chromeos_strings_kn.xtb +++ b/chromeos/strings/chromeos_strings_kn.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">ಪ್ರಕಾರ</translation> <translation id="2461822463642141190">ಪ್ರಸ್ತುತ</translation> <translation id="2480034874476596812">ಹಸ್ತಚಾಲಿತವಾಗಿ ಆಫ್ ಮಾಡಿ</translation> +<translation id="248546197012830854">ಸಾಧನ ಆಫ್ಲೈನ್ನಲ್ಲಿದೆ. ಸಹಾಯ ವಿಷಯವನ್ನು ನೋಡಲು ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗೆ ಕನೆಕ್ಟ್ ಮಾಡಿ.</translation> <translation id="2491955442992294626">ನೀವು ಇನ್ನೊಂದು ವಿಂಡೋವನ್ನು ಬಳಸುತ್ತಿರುವಾಗ ಕೀಗಳನ್ನು ಪರೀಕ್ಷಿಸಲಾಗುವುದಿಲ್ಲ</translation> <translation id="2493126929778606526">ನಿಮ್ಮ ಅತ್ಯುತ್ತಮ ಫೋಟೋಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಆಯ್ಕೆಮಾಡಲಾಗುತ್ತದೆ</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -660,6 +661,7 @@ <translation id="6611280807952151149"><ph name="DEVICE_TYPE" /> ದುರಸ್ತಿಯಿಂದ ನಿರ್ಗಮಿಸಿ</translation> <translation id="6618744767048954150">ರನ್ ಆಗುತ್ತಿದೆ</translation> <translation id="6620487321149975369">ಮುದ್ರಣ ಕಾರ್ಯಗಳನ್ನು ಹಸ್ತಚಾಲಿತವಾಗಿ ತೆಗೆದುಹಾಕದ ಹೊರತು, ಅವು ಇತಿಹಾಸದಲ್ಲಿ ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತವೆ</translation> +<translation id="6624819909909965616">10 MB ಗಿಂತ ಹೆಚ್ಚಿನ ಫೈಲ್ ಅನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> <translation id="6643016212128521049">ತೆರವುಗೊಳಿಸಿ</translation> <translation id="6644568396961840069">ಫೈಲ್ ಅನ್ನು ಉಳಿಸಲಾಗಲಿಲ್ಲ. ಬೇರೆ ಬಾಹ್ಯ ಸಂಗ್ರಹಣೆಯಲ್ಲಿ ಪ್ಲಗ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ ಅಥವಾ ನಂತರ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="6647510110698214773">ಎನ್ಕ್ರಿಪ್ಶನ್ ಅಲ್ಗಾರಿದಮ್</translation> @@ -695,6 +697,7 @@ <translation id="6965382102122355670">ಸರಿ</translation> <translation id="6977381486153291903">ಫರ್ಮ್ವೇರ್ ಮರುಪರಿಶೀಲನೆ</translation> <translation id="6995564396478647735">ರೈಟ್ ಪ್ರೊಟೆಕ್ಟ್ ಆನ್ ಆಗಿದೆಯೇ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ</translation> +<translation id="7005833343836210400">ಸಾಧನ ಆಫ್ಲೈನ್ ಆಗಿದೆ</translation> <translation id="7028979494427204405">ಈ ಸಾಧನವನ್ನು <ph name="MANAGER" /> ನಿರ್ವಹಿಸುತ್ತದೆ ಮತ್ತು ಬಳಕೆದಾರರು ಭೇಟಿ ನೀಡಿದ ವೆಬ್ಪುಟಗಳು, ಪಾಸ್ವರ್ಡ್ಗಳು ಹಾಗೂ ಇಮೇಲ್ ಸೇರಿದಂತೆ ಅವರ ಎಲ್ಲಾ ಚಟುವಟಿಕೆಗಳಿಗೆ ಪ್ರವೇಶ ಹೊಂದಿರುತ್ತದೆ.</translation> <translation id="7040230719604914234">ಆಪರೇಟರ್</translation> <translation id="7041549558901442110">ಸಾಧನವು ಕನೆಕ್ಟ್ ಆಗಿಲ್ಲ.</translation> @@ -808,6 +811,7 @@ <translation id="8075838845814659848">ಉಳಿದಿರುವ ಚಾರ್ಜ್</translation> <translation id="8082366717211101304">Android ಆ್ಯಪ್ಗಳ ಮೂಲಕ DNS ಅನ್ನು ಬಗೆಹರಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ</translation> <translation id="808894953321890993">ಪಾಸ್ವರ್ಡ್ ಬದಲಿಸಿ</translation> +<translation id="8094062939584182041">ಈ ಸಮಸ್ಯೆಯ ಕುರಿತು ನಿಮಗೆ ಇಮೇಲ್ ಮಾಡಲು Google ಗೆ ಅನುಮತಿಸಿ</translation> <translation id="8104083085214006426">ನೀವು ಓಪನ್ ಮತ್ತು ಸುರಕ್ಷಿತವಲ್ಲದ ನೆಟ್ವರ್ಕ್ ಅನ್ನು ಬಳಸುತ್ತಿರುವಿರಿ</translation> <translation id="8109786307828817014">ವಿಫಲವಾದ ಕ್ಯಾಲಿಬ್ರೇಶನ್ಗಳ ಮೂಲಕ ಮುಂದುವರಿಯುವುದೇ?</translation> <translation id="811820734797650957">(Android) ಗೇಟ್ವೇ ಅನ್ನು ಪಿಂಗ್ ಮಾಡಬಹುದು</translation>
diff --git a/chromeos/strings/chromeos_strings_ko.xtb b/chromeos/strings/chromeos_strings_ko.xtb index 722c50c..fc86b66 100644 --- a/chromeos/strings/chromeos_strings_ko.xtb +++ b/chromeos/strings/chromeos_strings_ko.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">유형</translation> <translation id="2461822463642141190">현재</translation> <translation id="2480034874476596812">수동으로 사용 중지</translation> +<translation id="248546197012830854">기기가 오프라인 상태입니다. 도움말 콘텐츠를 보려면 Wi-Fi 네트워크에 연결하세요.</translation> <translation id="2491955442992294626">다른 창을 사용 중일 때는 키가 테스트되지 않습니다.</translation> <translation id="2493126929778606526">가장 잘 나온 사진이 자동으로 선별됩니다.</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" />, <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -661,6 +662,7 @@ <translation id="6611280807952151149"><ph name="DEVICE_TYPE" /> 수리 종료</translation> <translation id="6618744767048954150">실행 중</translation> <translation id="6620487321149975369">수동으로 삭제하지 않으면 인쇄 작업이 기록에 나타납니다.</translation> +<translation id="6624819909909965616">10MB를 초과하는 파일은 업로드할 수 없습니다.</translation> <translation id="6643016212128521049">삭제</translation> <translation id="6644568396961840069">파일을 저장할 수 없습니다. 다른 외부 저장소에 연결해 보거나 나중에 다시 시도해 주세요.</translation> <translation id="6647510110698214773">암호화 알고리즘</translation> @@ -696,6 +698,7 @@ <translation id="6965382102122355670">확인</translation> <translation id="6977381486153291903">펌웨어 버전</translation> <translation id="6995564396478647735">쓰기 방지가 사용 설정되어 있는지 확인</translation> +<translation id="7005833343836210400">기기가 오프라인 상태입니다.</translation> <translation id="7028979494427204405"><ph name="MANAGER" />에서 이 기기를 관리하고 방문한 웹페이지, 비밀번호, 이메일을 비롯한 모든 사용자 활동에 액세스합니다.</translation> <translation id="7040230719604914234">운영자</translation> <translation id="7041549558901442110">기기가 연결되어 있지 않습니다.</translation> @@ -809,6 +812,7 @@ <translation id="8075838845814659848">배터리 잔량</translation> <translation id="8082366717211101304">Android 앱에서 DNS를 변환할 수 없습니다.</translation> <translation id="808894953321890993">비밀번호 변경</translation> +<translation id="8094062939584182041">Google에서 이 문제에 관한 이메일을 보내도록 허용</translation> <translation id="8104083085214006426">안전하지 않은 개방형 네트워크를 사용하고 있습니다.</translation> <translation id="8109786307828817014">보정에 실패해도 계속할까요?</translation> <translation id="811820734797650957">(Android) 핑할 수 있는 게이트웨이</translation>
diff --git a/chromeos/strings/chromeos_strings_ky.xtb b/chromeos/strings/chromeos_strings_ky.xtb index cd60109..dbc881c 100644 --- a/chromeos/strings/chromeos_strings_ky.xtb +++ b/chromeos/strings/chromeos_strings_ky.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">Түрү</translation> <translation id="2461822463642141190">Учурда</translation> <translation id="2480034874476596812">Кол менен өчүрүү</translation> +<translation id="248546197012830854">Түзмөк офлайн режиминде. Жардам берүү бөлүмүнө өтүү үчүн Wi-Fi тармагына туташыңыз.</translation> <translation id="2491955442992294626">Башка терезени колдонуп жатканда баскычтар сыналбайт</translation> <translation id="2493126929778606526">Автоматтык түрдө тандалган мыкты сүрөттөрүңүз</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -661,6 +662,7 @@ <translation id="6611280807952151149"><ph name="DEVICE_TYPE" /> түзмөгүн оңдоодон чыгуу</translation> <translation id="6618744767048954150">Иштеп жатат</translation> <translation id="6620487321149975369">Басып чыгаруу тапшырмаларын кол менен өчүрмөйүнчө, алар таржымалда сакталат</translation> +<translation id="6624819909909965616">10 Мб ашуун файлды жүктөөгө болбойт</translation> <translation id="6643016212128521049">Тазалоо</translation> <translation id="6644568396961840069">Файл сакталган жок. Башка тышкы сактагычты сайып көрүңүз же кийинчерээк кайталаңыз.</translation> <translation id="6647510110698214773">Шифрлөөнүн алгоритми</translation> @@ -696,6 +698,7 @@ <translation id="6965382102122355670">OK</translation> <translation id="6977381486153291903">Орнотулган программаны оңдоо</translation> <translation id="6995564396478647735">Жазуудан коргоонун күйгүзүлгөнүн текшериңиз</translation> +<translation id="7005833343836210400">Түзмөк офлайн режиминде</translation> <translation id="7028979494427204405"><ph name="MANAGER" /> бул түзмөктү башкарып, андагы колдонуучунун бардык аракеттерине, анын ичинде баш баккан веб-барактарга, сырсөздөргө жана электрондук каттарга кирүү мүмкүнчүлүгү бар.</translation> <translation id="7040230719604914234">Оператор</translation> <translation id="7041549558901442110">Түзмөк туташкан жок.</translation> @@ -809,6 +812,7 @@ <translation id="8075838845814659848">Батареянын кубаты</translation> <translation id="8082366717211101304">Android колдонмолорунан DNS чечилбей жатат</translation> <translation id="808894953321890993">Сызсөздү өзгөртүү</translation> +<translation id="8094062939584182041">Google'га бул маселе жөнүндө сизге электрондук кат жөнөтүүгө уруксат берүү</translation> <translation id="8104083085214006426">Ачык жана кооптуу тармакты колдонуп жатасыз</translation> <translation id="8109786307828817014">Курамдык бөлүктөр калибрленсинби?</translation> <translation id="811820734797650957">(Android) Шлюздун байланышын текшерүүгө болот</translation>
diff --git a/chromeos/strings/chromeos_strings_ml.xtb b/chromeos/strings/chromeos_strings_ml.xtb index b767ddf..b6f18a5 100644 --- a/chromeos/strings/chromeos_strings_ml.xtb +++ b/chromeos/strings/chromeos_strings_ml.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">തരം</translation> <translation id="2461822463642141190">നിലവിൽ</translation> <translation id="2480034874476596812">നേരിട്ട് ഓഫാക്കുക</translation> +<translation id="248546197012830854">ഉപകരണം ഓഫ്ലൈനാണ്. സഹായ ഉള്ളടക്കം കാണാൻ വൈഫൈ നെറ്റ്വർക്കിലേക്ക് കണക്റ്റ് ചെയ്യുക.</translation> <translation id="2491955442992294626">നിങ്ങൾ മറ്റൊരു വിൻഡോ ഉപയോഗിക്കുമ്പോൾ കീകൾ പരിശോധിക്കില്ല</translation> <translation id="2493126929778606526">സ്വയമേവ തിരഞ്ഞെടുത്ത നിങ്ങളുടെ ഏറ്റവും മികച്ച ഫോട്ടോകൾ</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -660,6 +661,7 @@ <translation id="6611280807952151149"><ph name="DEVICE_TYPE" /> റിപ്പയറിൽ നിന്ന് പുറത്തുകടക്കുക</translation> <translation id="6618744767048954150">റൺ ചെയ്യുന്നു</translation> <translation id="6620487321149975369">നേരിട്ട് നീക്കം ചെയ്തില്ലെങ്കിൽ പ്രിന്റ് ജോലികൾ ചരിത്രത്തിൽ ദൃശ്യമാകും</translation> +<translation id="6624819909909965616">10 MB-യിൽ കൂടുതലുള്ള ഫയൽ അപ്ലോഡ് ചെയ്യാനാകില്ല</translation> <translation id="6643016212128521049">മായ്ക്കുക</translation> <translation id="6644568396961840069">ഫയൽ സംരക്ഷിക്കാനായില്ല. മറ്റൊരു ബാഹ്യ സ്റ്റോറേജ് പ്ലഗ് ഇൻ ചെയ്ത് ശ്രമിക്കുക, അല്ലെങ്കിൽ പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="6647510110698214773">എൻക്രിപ്ഷൻ അൽഗോരിതം</translation> @@ -695,6 +697,7 @@ <translation id="6965382102122355670">ശരി</translation> <translation id="6977381486153291903">ഫേംവെയർ പുനഃപരിശോധന</translation> <translation id="6995564396478647735">റൈറ്റ് പരിരക്ഷ ഓണാണെന്ന് ഉറപ്പാക്കുക</translation> +<translation id="7005833343836210400">ഉപകരണം ഓഫ്ലൈനാണ്</translation> <translation id="7028979494427204405"><ph name="MANAGER" /> ഈ ഉപകരണം മാനേജ് ചെയ്യുന്നു, സന്ദർശിച്ച വെബ്പേജുകൾ, പാസ്വേഡുകൾ, ഇമെയിൽ എന്നിവയുൾപ്പെടെ ഉപയോക്താവിന്റെ എല്ലാ ആക്റ്റിവിറ്റികളിലേക്കും ആക്സസും ഉണ്ടായിരിക്കും.</translation> <translation id="7040230719604914234">ഓപ്പറേറ്റർ</translation> <translation id="7041549558901442110">ഉപകരണം കണക്റ്റ് ചെയ്തിട്ടില്ല.</translation> @@ -808,6 +811,7 @@ <translation id="8075838845814659848">ശേഷിക്കുന്ന ചാർജ്</translation> <translation id="8082366717211101304">Android ആപ്പുകളിൽ നിന്ന് DNS പരിഹരിക്കാനാകില്ല</translation> <translation id="808894953321890993">പാസ്വേഡ് മാറ്റുക</translation> +<translation id="8094062939584182041">ഈ പ്രശ്നത്തെ കുറിച്ച് നിങ്ങൾക്ക് ഇമെയിൽ അയയ്ക്കാൻ Google-നെ അനുവദിക്കുക</translation> <translation id="8104083085214006426">ഓപ്പണും സുരക്ഷിതമല്ലാത്തതുമായ നെറ്റ്വർക്ക് ആണ് നിങ്ങൾ ഉപയോഗിക്കുന്നത്</translation> <translation id="8109786307828817014">പരാജയപ്പെട്ട കാലിബ്രേഷനുകളുമായി മുന്നോട്ടുപോകണോ?</translation> <translation id="811820734797650957">(Android) ഗേറ്റ്വേ പിംഗ് ചെയ്യാനാകും</translation>
diff --git a/chromeos/strings/chromeos_strings_ms.xtb b/chromeos/strings/chromeos_strings_ms.xtb index bc75ae0..3be3c1f 100644 --- a/chromeos/strings/chromeos_strings_ms.xtb +++ b/chromeos/strings/chromeos_strings_ms.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">Jenis</translation> <translation id="2461822463642141190">Semasa</translation> <translation id="2480034874476596812">Matikan secara manual</translation> +<translation id="248546197012830854">Peranti di luar talian. Sambung kepada rangkaian Wi-Fi untuk melihat kandungan bantuan.</translation> <translation id="2491955442992294626">Kekunci tidak diuji apabila anda menggunakan tetingkap lain</translation> <translation id="2493126929778606526">Foto terbaik anda, dipilih secara automatik</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -661,6 +662,7 @@ <translation id="6611280807952151149">Keluar pembaikan <ph name="DEVICE_TYPE" /></translation> <translation id="6618744767048954150">Berjalan</translation> <translation id="6620487321149975369">Tugas cetak akan dipaparkan dalam sejarah melainkan dialih keluar secara manual</translation> +<translation id="6624819909909965616">Tidak dapat memuat naik fail yang lebih besar daripada 10 MB</translation> <translation id="6643016212128521049">Kosongkan</translation> <translation id="6644568396961840069">Fail tidak dapat disimpan. Cuba palamkan storan luaran yang lain atau cuba lagi nanti.</translation> <translation id="6647510110698214773">Algoritma penyulitan</translation> @@ -696,6 +698,7 @@ <translation id="6965382102122355670">OK</translation> <translation id="6977381486153291903">Semakan perisian tegar</translation> <translation id="6995564396478647735">Pastikan Write Protect dihidupkan</translation> +<translation id="7005833343836210400">Peranti di luar talian</translation> <translation id="7028979494427204405"><ph name="MANAGER" /> mengurus peranti ini dan mempunyai akses kepada semua aktiviti pengguna, termasuk halaman web yang dilawati, kata laluan dan e-mel.</translation> <translation id="7040230719604914234">Pengendali</translation> <translation id="7041549558901442110">Peranti tidak disambungkan.</translation> @@ -809,6 +812,7 @@ <translation id="8075838845814659848">Baki cas</translation> <translation id="8082366717211101304">Tidak dapat menyelesaikan DNS daripada apl Android</translation> <translation id="808894953321890993">Tukar kata laluan</translation> +<translation id="8094062939584182041">Benarkan Google menghantar e-mel tentang isu ini kepada anda</translation> <translation id="8104083085214006426">Anda sedang menggunakan rangkaian terbuka dan tidak selamat</translation> <translation id="8109786307828817014">Teruskan dengan penentukuran yang gagal?</translation> <translation id="811820734797650957">Get laluan boleh Diping (Android)</translation>
diff --git a/chromeos/strings/chromeos_strings_my.xtb b/chromeos/strings/chromeos_strings_my.xtb index 8a249a7..6bc79957 100644 --- a/chromeos/strings/chromeos_strings_my.xtb +++ b/chromeos/strings/chromeos_strings_my.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">ပုံစံ</translation> <translation id="2461822463642141190">လက်ရှိ</translation> <translation id="2480034874476596812">ကိုယ်တိုင်ပိတ်ပါ</translation> +<translation id="248546197012830854">စက်အော့ဖ်လိုင်းဖြစ်နေသည်။ အကူအညီ အကြောင်းအရာကြည့်ရန် Wi-Fi ကွန်ရက်သို့ ချိတ်ဆက်ပါ။</translation> <translation id="2491955442992294626">အခြားဝင်းဒိုးတစ်ခုကို သင်သုံးနေစဉ် ကီးများကို စမ်းသပ်ခြင်း မပြုပါ</translation> <translation id="2493126929778606526">အလိုအလျောက်ရွေးထားသော သင်၏ အကောင်းဆုံးဓာတ်ပုံများ</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -660,6 +661,7 @@ <translation id="6611280807952151149"><ph name="DEVICE_TYPE" /> ပြုပြင်ခြင်းမှ ထွက်ရန်</translation> <translation id="6618744767048954150">လုပ်ဆောင်နေသည်</translation> <translation id="6620487321149975369">ပရင့်ထုတ်ရန်ဖိုင်များကို ကိုယ်တိုင်မဖယ်ရှားပါက မှတ်တမ်းတွင် ပြပါမည်</translation> +<translation id="6624819909909965616">၁၀ MB ထက်ကြီးသောဖိုင်များကို အပ်လုဒ် မလုပ်နိုင်ပါ</translation> <translation id="6643016212128521049">ရှင်းရန်</translation> <translation id="6644568396961840069">ဖိုင်ကို သိမ်း၍မရပါ။ အခြားပြင်ပသိုလှောင်ခန်းတစ်ခုကို ပလတ်တပ်ကြည့်ပါ (သို့) နောက်မှထပ်စမ်းကြည့်ပါ။</translation> <translation id="6647510110698214773">အသွင်ဝှက်ခြင်း လုပ်နည်းစနစ်</translation> @@ -695,6 +697,7 @@ <translation id="6965382102122355670">OK</translation> <translation id="6977381486153291903">ဖာမ်းဝဲ ပြန်လည်စိစစ်ခြင်း</translation> <translation id="6995564396478647735">‘ပြင်ခွင့်မရှိမုဒ်’ ဖွင့်ထားကြောင်း သေချာပါစေ</translation> +<translation id="7005833343836210400">စက်အော့ဖ်လိုင်းဖြစ်နေသည်</translation> <translation id="7028979494427204405"><ph name="MANAGER" /> က ဤကိရိယာကို စီမံခန့်ခွဲပြီး ဝင်ကြည့်ထားသည့် ဝဘ်စာမျက်နှာများ၊ စကားဝှက်များနှင့် အီးမေးလ်အပါအဝင် အသုံးပြုသူ၏ လုပ်ဆောင်ချက်အားလုံးကို အသုံးပြုခွင့်ရှိပါသည်။</translation> <translation id="7040230719604914234">မိုဘိုင်းဝန်ဆောင်မှုပေးသူ</translation> <translation id="7041549558901442110">ကိရိယာကို ကွန်ရက်ချိတ်မထားပါ။</translation> @@ -808,6 +811,7 @@ <translation id="8075838845814659848">ကျန်ရှိသော အားပမာဏ</translation> <translation id="8082366717211101304">Android အက်ပ်များမှ DNS ဖြေရှင်း၍မရပါ</translation> <translation id="808894953321890993">စကားဝှက် ပြောင်းရန်</translation> +<translation id="8094062939584182041">ဤပြဿနာအကြောင်း အီးမေးလ်ပို့ခွင့် Google ကိုပေးရန်</translation> <translation id="8104083085214006426">သင်သည် အများသုံးဖြစ်ပြီး မလုံခြုံသောကွန်ရက်ကို သုံးနေသည်</translation> <translation id="8109786307828817014">အောင်မြင်မှုမရှိသော ချိန်ညှိမှုများဖြင့် ရှေ့ဆက်မလား။</translation> <translation id="811820734797650957">(Android) ကွန်ရက်ဂိတ်ဝကို ပင်လုပ်နိုင်သည်</translation>
diff --git a/chromeos/strings/chromeos_strings_ne.xtb b/chromeos/strings/chromeos_strings_ne.xtb index 45d49f187..c1af478 100644 --- a/chromeos/strings/chromeos_strings_ne.xtb +++ b/chromeos/strings/chromeos_strings_ne.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">प्रकार</translation> <translation id="2461822463642141190">हालको</translation> <translation id="2480034874476596812">म्यानुअल रूपमा अफ गरियोस्</translation> +<translation id="248546197012830854">डिभाइस अफलाइन छ। मद्दतसम्बन्धी सामग्री हेर्न Wi-Fi नेटवर्कमा कनेक्ट गर्नुहोस्।</translation> <translation id="2491955442992294626">तपाईंले अर्को विन्डो प्रयोग गरिरहेका बेला कीहरू परीक्षण गरिँदैन</translation> <translation id="2493126929778606526">स्वतः चयन गरिएका तपाईंका उत्कृष्ट फोटोहरू</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -660,6 +661,7 @@ <translation id="6611280807952151149"><ph name="DEVICE_TYPE" /> मर्मत गर्ने प्रक्रियाबाट बाहिरिनुहोस्</translation> <translation id="6618744767048954150">जाँच हुँदै छ</translation> <translation id="6620487321149975369">तपाईंले प्रिन्टसम्बन्धी कार्यहरू नहटाउँदासम्म ती कार्यहरू इतिहासमा देखिने छन्</translation> +<translation id="6624819909909965616">१० एम.बि. भन्दा ठुलो फाइल अपलोड गर्न मिल्दैन।</translation> <translation id="6643016212128521049">खालि गर्नुहोस्</translation> <translation id="6644568396961840069">फाइल सेभ गर्न सकिएन। अर्कै बाह्य भण्डारण घुसाई हेर्नुहोस् वा पछि फेरि प्रयास गर्नुहोस्।</translation> <translation id="6647510110698214773">इन्क्रिप्सनसम्बन्धी एल्गोरिदम</translation> @@ -695,6 +697,7 @@ <translation id="6965382102122355670">ठिक छ</translation> <translation id="6977381486153291903">फर्मवेयरको पुनरावृत्ति</translation> <translation id="6995564396478647735">राइट प्रोटेक्ट अन छ भन्ने कुरा सुनिश्चित गर्नुहोस्</translation> +<translation id="7005833343836210400">डिभाइस अफलाइन छ</translation> <translation id="7028979494427204405"><ph name="MANAGER" /> ले यो डिभाइस व्यवस्थापन गर्छ र यसले हेरिएका वेबपेज, पासवर्ड र इमेललगायत प्रयोगकर्ताले गर्ने सबै क्रियाकलाप हेर्न सक्छ।</translation> <translation id="7040230719604914234">सेवा प्रदायक</translation> <translation id="7041549558901442110">डिभाइस कनेक्ट गरिएको छैन।</translation> @@ -808,6 +811,7 @@ <translation id="8075838845814659848">बाँकी ब्याट्री</translation> <translation id="8082366717211101304">Android एपहरूबाट DNS समाधान गर्न सकिएन</translation> <translation id="808894953321890993">पासवर्ड परिवर्तन गर्नुहोस्</translation> +<translation id="8094062939584182041">Google लाई तपाईंलाई यो समस्याका बारेमा इमेल पठाउने अनुमति दिनुहोस्</translation> <translation id="8104083085214006426">तपाईं खुला र असुरक्षित नेटवर्क प्रयोग गर्दै हुनुहुन्छ</translation> <translation id="8109786307828817014">क्यालिब्रेट नगरिकन अगाडि बढ्ने हो?</translation> <translation id="811820734797650957">(Android) गेटवे पिङ गर्न सकिन्छ</translation>
diff --git a/chromeos/strings/chromeos_strings_or.xtb b/chromeos/strings/chromeos_strings_or.xtb index 910bc9f..ec3d6c0 100644 --- a/chromeos/strings/chromeos_strings_or.xtb +++ b/chromeos/strings/chromeos_strings_or.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">ପ୍ରକାର</translation> <translation id="2461822463642141190">ବର୍ତ୍ତମାନର</translation> <translation id="2480034874476596812">ମାନୁଆଲୀ ବନ୍ଦ କରନ୍ତୁ</translation> +<translation id="248546197012830854">ଡିଭାଇସ ଅଫଲାଇନ ଅଛି। ସହାୟତା ବିଷୟବସ୍ତୁ ଦେଖିବାକୁ ୱାଇ-ଫାଇ ନେଟୱାର୍କ ସହ କନେକ୍ଟ କରନ୍ତୁ।</translation> <translation id="2491955442992294626">ଆପଣ ଅନ୍ୟ ୱିଣ୍ଡୋ ବ୍ୟବହାର କରିବା ବେଳେ କୀ'ଗୁଡ଼ିକୁ ପରୀକ୍ଷା କରାଯାଏ ନାହିଁ</translation> <translation id="2493126929778606526">ସ୍ୱଚାଳିତ ଭାବେ ଚୟନିତ, ଆପଣଙ୍କର ଶ୍ରେଷ୍ଠ ଫଟୋଗୁଡ଼ିକ</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -661,6 +662,7 @@ <translation id="6611280807952151149"><ph name="DEVICE_TYPE" />ର ମରାମତି କରିବାର ପ୍ରକ୍ରିୟାରୁ ବାହାରି ଯାଆନ୍ତୁ</translation> <translation id="6618744767048954150">ଚାଲୁଛି</translation> <translation id="6620487321149975369">ପ୍ରିଣ୍ଟ କାର୍ଯ୍ୟଗୁଡ଼ିକୁ ମାନୁଆଲୀ କାଢ଼ି ନଦିଆଯିବା ପର୍ଯ୍ୟନ୍ତ ସେଗୁଡ଼ିକ ଇତିହାସରେ ଦେଖାଯିବ</translation> +<translation id="6624819909909965616">10 MBରୁ ବଡ଼ ଫାଇଲ ଅପଲୋଡ କରାଯାଇପାରିବ ନାହିଁ</translation> <translation id="6643016212128521049">ଖାଲି କରନ୍ତୁ</translation> <translation id="6644568396961840069">ଫାଇଲ ସେଭ କରାଯାଇପାରିଲା ନାହିଁ। ଏକ ଭିନ୍ନ ଏକ୍ସଟର୍ନଲ ଷ୍ଟୋରେଜରେ ପ୍ଲଗ ଇନ କରିବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ କିମ୍ବା ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation> <translation id="6647510110698214773">ଏନକ୍ରିପସନ ଆଲଗୋରିଦମ</translation> @@ -696,6 +698,7 @@ <translation id="6965382102122355670">ଓକେ ବଟନ୍</translation> <translation id="6977381486153291903">ଫାର୍ମୱେର୍ ପୁନରାବୃତ୍ତି</translation> <translation id="6995564396478647735">ରାଇଟ ପ୍ରୋଟେକ୍ଟ ଚାଲୁ ଥିବା ସୁନିଶ୍ଚିତ କରନ୍ତୁ</translation> +<translation id="7005833343836210400">ଡିଭାଇସ ଅଫଲାଇନ ଅଛି</translation> <translation id="7028979494427204405"><ph name="MANAGER" /> ଏହି ଡିଭାଇସକୁ ପରିଚାଳନା କରେ ଏବଂ ଏହା ପାଖରେ ଭିଜିଟ୍ କରାଯାଇଥିବା ୱେବପୃଷ୍ଠା, ପାସୱାର୍ଡ ଏବଂ ଇମେଲ୍ ସମେତ ସମସ୍ତ ଉପଯୋଗକର୍ତ୍ତା କାର୍ଯ୍ୟକଳାପକୁ ଆକ୍ସେସ୍ ଅଛି।</translation> <translation id="7040230719604914234">ଅପରେଟର୍</translation> <translation id="7041549558901442110">ଡିଭାଇସଟି ସଂଯୋଗ ହୋଇନାହିଁ।</translation> @@ -809,6 +812,7 @@ <translation id="8075838845814659848">ବାକି ଥିବା ଚାର୍ଜ</translation> <translation id="8082366717211101304">Android ଆପଗୁଡ଼ିକରୁ DNSର ସମାଧାନ କରାଯାଇପାରିବ ନାହିଁ</translation> <translation id="808894953321890993">ପାସ୍ୱାର୍ଡ ବଦଳାନ୍ତୁ</translation> +<translation id="8094062939584182041">ଏହି ସମସ୍ୟା ବିଷୟରେ ଆପଣଙ୍କୁ ଇମେଲ କରିବା ପାଇଁ Googleକୁ ଅନୁମତି ଦିଅନ୍ତୁ</translation> <translation id="8104083085214006426">ଆପଣ ଏକ ଖୋଲା ଏବଂ ଅସୁରକ୍ଷିତ ନେଟୱାର୍କ ବ୍ୟବହାର କରୁଛନ୍ତି</translation> <translation id="8109786307828817014">ବିଫଳ ହୋଇଥିବା କାଲିବ୍ରେସନ ସହ ଆଗକୁ ବଢ଼ିବେ?</translation> <translation id="811820734797650957">(Android) ଗେଟୱେକୁ ପିଙ୍ଗ୍ କରାଯାଇପାରିବ</translation>
diff --git a/chromeos/strings/chromeos_strings_pa.xtb b/chromeos/strings/chromeos_strings_pa.xtb index 0809fda..5d9128f 100644 --- a/chromeos/strings/chromeos_strings_pa.xtb +++ b/chromeos/strings/chromeos_strings_pa.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">ਟਾਈਪ ਕਰੋ</translation> <translation id="2461822463642141190">ਮੌਜੂਦਾ</translation> <translation id="2480034874476596812">ਹੱਥੀਂ ਬੰਦ ਕਰੋ</translation> +<translation id="248546197012830854">ਡੀਵਾਈਸ ਆਫ਼ਲਾਈਨ ਹੈ। ਮਦਦ ਸਮੱਗਰੀ ਦੇਖਣ ਲਈ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਕਰੋ।</translation> <translation id="2491955442992294626">ਜਦੋਂ ਤੁਸੀਂ ਕਿਸੇ ਹੋਰ ਵਿੰਡੋ ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੇ ਹੋਵੋ, ਤਾਂ ਕੁੰਜੀਆਂ ਦੀ ਜਾਂਚ ਨਹੀਂ ਕੀਤੀ ਜਾਂਦੀ</translation> <translation id="2493126929778606526">ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਚੁਣੀਆਂ ਗਈਆਂ, ਤੁਹਾਡੀਆਂ ਬਿਹਤਰੀਨ ਫ਼ੋਟੋਆਂ</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -660,6 +661,7 @@ <translation id="6611280807952151149"><ph name="DEVICE_TYPE" /> ਦੀ ਮੁਰੰਮਤ ਤੋਂ ਬਾਹਰ ਜਾਓ</translation> <translation id="6618744767048954150">ਚੱਲ ਰਿਹਾ ਹੈ</translation> <translation id="6620487321149975369">ਪ੍ਰਿੰਟ ਜੌਬਾਂ ਉਦੋਂ ਤੱਕ ਇਤਿਹਾਸ ਵਿੱਚ ਦਿਸਣਗੀਆਂ, ਜਦੋਂ ਤੱਕ ਉਹਨਾਂ ਨੂੰ ਹੱਥੀਂ ਨਹੀਂ ਹਟਾਇਆ ਜਾਂਦਾ</translation> +<translation id="6624819909909965616">10 MB ਤੋਂ ਵੱਡੀ ਫ਼ਾਈਲ ਅੱਪਲੋਡ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ</translation> <translation id="6643016212128521049">ਹਟਾਓ</translation> <translation id="6644568396961840069">ਫ਼ਾਈਲ ਨੂੰ ਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਵੱਖਰੀ ਬਾਹਰੀ ਸਟੋਰੇਜ ਨੂੰ ਪਲੱਗ-ਇਨ ਕਰ ਕੇ ਦੇਖੋ ਜਾਂ ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="6647510110698214773">ਇਨਕ੍ਰਿਪਸ਼ਨ ਐਲਗੋਰਿਦਮ</translation> @@ -695,6 +697,7 @@ <translation id="6965382102122355670">ਠੀਕ</translation> <translation id="6977381486153291903">ਫਰਮਵੇਅਰ ਸੁਧਾਈ</translation> <translation id="6995564396478647735">ਪੱਕਾ ਕਰੋ ਕਿ ਲਿਖਣ ਸੰਬੰਧੀ ਸੁਰੱਖਿਆ ਚਾਲੂ ਹੈ</translation> +<translation id="7005833343836210400">ਡੀਵਾਈਸ ਆਫ਼ਲਾਈਨ ਹੈ</translation> <translation id="7028979494427204405"><ph name="MANAGER" /> ਇਸ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਦਾ ਹੈ ਅਤੇ ਇਸਨੂੰ ਦੇਖੇ ਗਏ ਵੈੱਬ-ਪੰਨਿਆਂ, ਪਾਸਵਰਡਾਂ ਅਤੇ ਈਮੇਲ ਸਮੇਤ ਵਰਤੋਂਕਾਰ ਦੀਆਂ ਸਾਰੀਆਂ ਸਰਗਰਮੀਆਂ ਤੱਕ ਪਹੁੰਚ ਹਾਸਲ ਹੈ।</translation> <translation id="7040230719604914234">ਓਪਰੇਟਰ</translation> <translation id="7041549558901442110">ਡੀਵਾਈਸ ਕਨੈਕਟ ਨਹੀਂ ਹੈ।</translation> @@ -808,6 +811,7 @@ <translation id="8075838845814659848">ਬਾਕੀ ਚਾਰਜ</translation> <translation id="8082366717211101304">Android ਐਪਾਂ ਤੋਂ DNS ਸੰਬੰਧੀ ਸਮੱਸਿਆ ਨੂੰ ਹੱਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ</translation> <translation id="808894953321890993">ਪਾਸਵਰਡ ਬਦਲੋ</translation> +<translation id="8094062939584182041">Google ਨੂੰ ਇਸ ਸਮੱਸਿਆ ਬਾਰੇ ਤੁਹਾਨੂੰ ਈਮੇਲ ਭੇਜਣ ਦੀ ਆਗਿਆ ਦਿਓ</translation> <translation id="8104083085214006426">ਤੁਸੀਂ ਕੋਈ ਖੁੱਲ੍ਹਾ ਅਤੇ ਅਸੁਰੱਖਿਅਤ ਨੈੱਟਵਰਕ ਵਰਤ ਰਹੇ ਹੋ</translation> <translation id="8109786307828817014">ਕੀ ਅਸਫਲ ਕੈਲੀਬਰੇਸ਼ਨਾਂ ਨਾਲ ਅੱਗੇ ਵਧਣਾ ਹੈ?</translation> <translation id="811820734797650957">(Android) ਗੇਟਵੇ ਨੂੰ ਪਿੰਗ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ</translation>
diff --git a/chromeos/strings/chromeos_strings_pt-BR.xtb b/chromeos/strings/chromeos_strings_pt-BR.xtb index c0ede01..808e061 100644 --- a/chromeos/strings/chromeos_strings_pt-BR.xtb +++ b/chromeos/strings/chromeos_strings_pt-BR.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">Tipo</translation> <translation id="2461822463642141190">Atual</translation> <translation id="2480034874476596812">Desativar manualmente</translation> +<translation id="248546197012830854">O dispositivo está off-line. Conecte-se à rede Wi-Fi para ver o conteúdo de ajuda.</translation> <translation id="2491955442992294626">As chaves não são testadas enquanto você usa outra janela</translation> <translation id="2493126929778606526">Suas melhores fotos, selecionadas automaticamente</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -661,6 +662,7 @@ <translation id="6611280807952151149">Sair do reparo do <ph name="DEVICE_TYPE" /></translation> <translation id="6618744767048954150">Em execução</translation> <translation id="6620487321149975369">Os trabalhos de impressão aparecerão no histórico, a menos que sejam removidos manualmente</translation> +<translation id="6624819909909965616">Não é possível fazer upload de arquivos com mais de 10 MB</translation> <translation id="6643016212128521049">Limpar</translation> <translation id="6644568396961840069">Não foi possível salvar o arquivo. Conecte outro tipo armazenamento externo ou tente novamente mais tarde.</translation> <translation id="6647510110698214773">Algoritmo de criptografia</translation> @@ -696,6 +698,7 @@ <translation id="6965382102122355670">OK</translation> <translation id="6977381486153291903">Revisão do firmware</translation> <translation id="6995564396478647735">Confira se a proteção contra gravação está ativada</translation> +<translation id="7005833343836210400">O dispositivo está off-line</translation> <translation id="7028979494427204405"><ph name="MANAGER" /> gerencia este dispositivo e tem acesso a todas as atividades do usuário, incluindo páginas visitadas, senhas e e-mail.</translation> <translation id="7040230719604914234">Operador</translation> <translation id="7041549558901442110">Dispositivo não conectado.</translation> @@ -809,6 +812,7 @@ <translation id="8075838845814659848">Carga restante</translation> <translation id="8082366717211101304">Não foi possível resolver o DNS em apps Android</translation> <translation id="808894953321890993">Alterar senha</translation> +<translation id="8094062939584182041">Permitir que o Google envie um e-mail para você sobre esse problema</translation> <translation id="8104083085214006426">Você está usando uma rede aberta e não segura</translation> <translation id="8109786307828817014">Continuar com as calibragens que falharam?</translation> <translation id="811820734797650957">(Android) O gateway pode receber um ping</translation>
diff --git a/chromeos/strings/chromeos_strings_sk.xtb b/chromeos/strings/chromeos_strings_sk.xtb index 4406a6dc..8b2f99e 100644 --- a/chromeos/strings/chromeos_strings_sk.xtb +++ b/chromeos/strings/chromeos_strings_sk.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">Typ</translation> <translation id="2461822463642141190">Aktuálna</translation> <translation id="2480034874476596812">Manuálnym vypnutím</translation> +<translation id="248546197012830854">Zariadenie je offline. Ak chcete zobraziť pomocný obsah, pripojte ho k sieti Wi‐Fi.</translation> <translation id="2491955442992294626">Klávesy nie sú testované, keď používate iné okno</translation> <translation id="2493126929778606526">Vaše najlepšie fotky, vybrané automaticky</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -661,6 +662,7 @@ <translation id="6611280807952151149">Ukončiť opravu zariadenia <ph name="DEVICE_TYPE" /></translation> <translation id="6618744767048954150">Beží</translation> <translation id="6620487321149975369">Tlačové úlohy sa budú zobrazovať v histórii, dokým ich neodstránite ručne</translation> +<translation id="6624819909909965616">Súbor väčší než 10 MB sa nedá nahrať</translation> <translation id="6643016212128521049">Vymazať</translation> <translation id="6644568396961840069">Súbor sa nepodarilo uložiť. Skúste pripojiť iné externé úložisko alebo to zopakujte neskôr.</translation> <translation id="6647510110698214773">Algoritmus šifrovania</translation> @@ -696,6 +698,7 @@ <translation id="6965382102122355670">OK</translation> <translation id="6977381486153291903">Revízia firmvéru</translation> <translation id="6995564396478647735">Skontrolujte, či je zapnutá ochrana proti zápisu</translation> +<translation id="7005833343836210400">Zariadenie je offline</translation> <translation id="7028979494427204405"><ph name="MANAGER" /> spravuje toto zariadenie a má prístup k všetkým aktivitám používateľa vrátane navštívených webových stránok, hesiel a pošty.</translation> <translation id="7040230719604914234">Operátor</translation> <translation id="7041549558901442110">Zariadenie nie je pripojené.</translation> @@ -809,6 +812,7 @@ <translation id="8075838845814659848">Zostávajúca úroveň batérie</translation> <translation id="8082366717211101304">DNS sa nedá preložiť v aplikáciách pre Android</translation> <translation id="808894953321890993">Zmeniť heslo</translation> +<translation id="8094062939584182041">Povoliť Googlu posielať e‐maily týkajúce sa tohto problému</translation> <translation id="8104083085214006426">Používate otvorenú a nezabezpečenú sieť</translation> <translation id="8109786307828817014">Chcete pokračovať bez týchto kalibrácií?</translation> <translation id="811820734797650957">(Android) Je možné testovať dostupnosť (ping) brány</translation>
diff --git a/chromeos/strings/chromeos_strings_sl.xtb b/chromeos/strings/chromeos_strings_sl.xtb index 5f0a143..a3fd68d 100644 --- a/chromeos/strings/chromeos_strings_sl.xtb +++ b/chromeos/strings/chromeos_strings_sl.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">Vrsta</translation> <translation id="2461822463642141190">Trenutno</translation> <translation id="2480034874476596812">Ročno izklopi</translation> +<translation id="248546197012830854">Naprava nima vzpostavljene povezave. Če si želite ogledati vsebino s pomočjo, vzpostavite povezavo z omrežjem Wi-Fi.</translation> <translation id="2491955442992294626">Tipke se ne preizkušajo, če uporabljate drugo okno.</translation> <translation id="2493126929778606526">Vaše najboljše fotografije, izbrane samodejno</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -661,6 +662,7 @@ <translation id="6611280807952151149">Zapri popravilo naprave <ph name="DEVICE_TYPE" /></translation> <translation id="6618744767048954150">Preverjanje poteka</translation> <translation id="6620487321149975369">Tiskalna opravila bodo prikazana v zgodovini, razen če jih ročno odstranite</translation> +<translation id="6624819909909965616">Datoteke, večje od 10 MB, ni mogoče naložiti.</translation> <translation id="6643016212128521049">Izbriši</translation> <translation id="6644568396961840069">Datoteke ni bilo mogoče shraniti. Poskusite priključiti drugo zunanjo shrambo ali poskusite znova pozneje.</translation> <translation id="6647510110698214773">Algoritem šifriranja</translation> @@ -696,6 +698,7 @@ <translation id="6965382102122355670">V redu</translation> <translation id="6977381486153291903">Različica vdelane programske opreme</translation> <translation id="6995564396478647735">Prepričajte se, da je zaščita pred pisanjem vklopljena</translation> +<translation id="7005833343836210400">Naprava nima vzpostavljene povezave</translation> <translation id="7028979494427204405"><ph name="MANAGER" /> upravlja to napravo in ima dostop do vse dejavnosti uporabnika, vključno z obiskanimi spletnimi mesti, gesli in e-pošto.</translation> <translation id="7040230719604914234">Operater</translation> <translation id="7041549558901442110">Naprava ni povezana.</translation> @@ -809,6 +812,7 @@ <translation id="8075838845814659848">Preostanek polnjenja</translation> <translation id="8082366717211101304">Iz aplikacij za Android ni mogoče razrešiti DNS-ja.</translation> <translation id="808894953321890993">Sprememba gesla</translation> +<translation id="8094062939584182041">Googlu dovolite, da se po e-pošti obrne na vas glede te težave</translation> <translation id="8104083085214006426">Uporabljate odprto omrežje, ki ni varno.</translation> <translation id="8109786307828817014">Želite nadaljevati z neuspešnimi umerjanji?</translation> <translation id="811820734797650957">Prehod je mogoče preveriti (Android)</translation>
diff --git a/chromeos/strings/chromeos_strings_sr-Latn.xtb b/chromeos/strings/chromeos_strings_sr-Latn.xtb index 0dbf6dbb..93e271b 100644 --- a/chromeos/strings/chromeos_strings_sr-Latn.xtb +++ b/chromeos/strings/chromeos_strings_sr-Latn.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">Tip</translation> <translation id="2461822463642141190">Aktuelno</translation> <translation id="2480034874476596812">Ručno isključivanje</translation> +<translation id="248546197012830854">Uređaj je oflajn. Povežite se na WiFi mrežu da biste videli sadržaj pomoći.</translation> <translation id="2491955442992294626">Tasteri se ne testiraju kada koristite drugi prozor</translation> <translation id="2493126929778606526">Najbolje automatski izabrane slike</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -661,6 +662,7 @@ <translation id="6611280807952151149">Zatvori popravku uređaja <ph name="DEVICE_TYPE" /></translation> <translation id="6618744767048954150">U toku je</translation> <translation id="6620487321149975369">Zadaci štampanja će se pojaviti u istoriji ako ih ne uklonite ručno</translation> +<translation id="6624819909909965616">Ne možete da otpremite fajl veći od 10 MB</translation> <translation id="6643016212128521049">Obriši</translation> <translation id="6644568396961840069">Čuvanje fajla nije uspelo. Priključite drugu spoljnu memoriju ili probajte ponovo kasnije.</translation> <translation id="6647510110698214773">Algoritam šifrovanja</translation> @@ -696,6 +698,7 @@ <translation id="6965382102122355670">Potvrdi</translation> <translation id="6977381486153291903">Revizija firmvera</translation> <translation id="6995564396478647735">Uverite se da je zaštita od upisivanja uključena</translation> +<translation id="7005833343836210400">Uređaj je oflajn</translation> <translation id="7028979494427204405"><ph name="MANAGER" /> upravlja ovim uređajem i ima pristup svim aktivnostima korisnika, uključujući posećene veb-stranice, lozinke i imejlove.</translation> <translation id="7040230719604914234">Mobilni operater</translation> <translation id="7041549558901442110">Uređaj nije povezan.</translation> @@ -809,6 +812,7 @@ <translation id="8075838845814659848">Preostali nivo napunjenosti baterije</translation> <translation id="8082366717211101304">DNS ne može da se razreši iz Android aplikacija</translation> <translation id="808894953321890993">Promeni lozinku</translation> +<translation id="8094062939584182041">Dozvolite Google-u da vam pošalje imejl o ovom problemu</translation> <translation id="8104083085214006426">Koristite otvorenu i neobezbeđenu mrežu</translation> <translation id="8109786307828817014">Želite da nastavite sa kalibracijom koja nije uspela?</translation> <translation id="811820734797650957">(Android) Mrežni prolaz može da se pinguje</translation>
diff --git a/chromeos/strings/chromeos_strings_sr.xtb b/chromeos/strings/chromeos_strings_sr.xtb index 19727af..a873e032 100644 --- a/chromeos/strings/chromeos_strings_sr.xtb +++ b/chromeos/strings/chromeos_strings_sr.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">Тип</translation> <translation id="2461822463642141190">Актуелно</translation> <translation id="2480034874476596812">Ручно искључивање</translation> +<translation id="248546197012830854">Уређај је офлајн. Повежите се на WiFi мрежу да бисте видели садржај помоћи.</translation> <translation id="2491955442992294626">Тастери се не тестирају када користите други прозор</translation> <translation id="2493126929778606526">Најбоље аутоматски изабране слике</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -661,6 +662,7 @@ <translation id="6611280807952151149">Затвори поправку уређаја <ph name="DEVICE_TYPE" /></translation> <translation id="6618744767048954150">У току је</translation> <translation id="6620487321149975369">Задаци штампања ће се појавити у историји ако их не уклоните ручно</translation> +<translation id="6624819909909965616">Не можете да отпремите фајл већи од 10 MB</translation> <translation id="6643016212128521049">Обриши</translation> <translation id="6644568396961840069">Чување фајла није успело. Прикључите другу спољну меморију или пробајте поново касније.</translation> <translation id="6647510110698214773">Алгоритам шифровања</translation> @@ -696,6 +698,7 @@ <translation id="6965382102122355670">Потврди</translation> <translation id="6977381486153291903">Ревизија фирмвера</translation> <translation id="6995564396478647735">Уверите се да је заштита од уписивања укључена</translation> +<translation id="7005833343836210400">Уређај је офлајн</translation> <translation id="7028979494427204405"><ph name="MANAGER" /> управља овим уређајем и има приступ свим активностима корисника, укључујући посећене веб-странице, лозинке и имејлове.</translation> <translation id="7040230719604914234">Мобилни оператер</translation> <translation id="7041549558901442110">Уређај није повезан.</translation> @@ -809,6 +812,7 @@ <translation id="8075838845814659848">Преостали ниво напуњености батерије</translation> <translation id="8082366717211101304">DNS не може да се разреши из Android апликација</translation> <translation id="808894953321890993">Промени лозинку</translation> +<translation id="8094062939584182041">Дозволите Google-у да вам пошаље имејл о овом проблему</translation> <translation id="8104083085214006426">Користите отворену и необезбеђену мрежу</translation> <translation id="8109786307828817014">Желите да наставите са калибрацијом која није успела?</translation> <translation id="811820734797650957">(Android) Мрежни пролаз може да се пингује</translation>
diff --git a/chromeos/strings/chromeos_strings_uk.xtb b/chromeos/strings/chromeos_strings_uk.xtb index 85489ea..6fed1da 100644 --- a/chromeos/strings/chromeos_strings_uk.xtb +++ b/chromeos/strings/chromeos_strings_uk.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">Тип</translation> <translation id="2461822463642141190">Енергоспоживання</translation> <translation id="2480034874476596812">Вимкнути вручну</translation> +<translation id="248546197012830854">Пристрій не підключено до Інтернету. Щоб переглянути довідковий контент, підключіться до мережі Wi-Fi.</translation> <translation id="2491955442992294626">Якщо відкрити інше вікно, клавіші не будуть перевірятися</translation> <translation id="2493126929778606526">Ваші найкращі фото, вибрані автоматично</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -661,6 +662,7 @@ <translation id="6611280807952151149">Закрити сторінку ремонту пристрою <ph name="DEVICE_TYPE" /></translation> <translation id="6618744767048954150">Виконується</translation> <translation id="6620487321149975369">Завдання друку відображатимуться в історії, доки ви не вилучите їх вручну</translation> +<translation id="6624819909909965616">Не можна завантажити файл, розмір якого перевищує 10 МБ</translation> <translation id="6643016212128521049">Очистити</translation> <translation id="6644568396961840069">Не вдалося зберегти файл. Підключіть інший зовнішній носій або спробуйте пізніше.</translation> <translation id="6647510110698214773">Алгоритм шифрування</translation> @@ -696,6 +698,7 @@ <translation id="6965382102122355670">OK</translation> <translation id="6977381486153291903">Мікропрограма</translation> <translation id="6995564396478647735">Переконайтеся, що захист від запису ввімкнено</translation> +<translation id="7005833343836210400">Пристрій не підключено до Інтернету</translation> <translation id="7028979494427204405"><ph name="MANAGER" /> керує цим пристроєм і має доступ до всіх дій користувача, зокрема відвіданих веб-сторінок, паролів і електронних листів.</translation> <translation id="7040230719604914234">Оператор</translation> <translation id="7041549558901442110">Пристрій не підключено.</translation> @@ -809,6 +812,7 @@ <translation id="8075838845814659848">Рівень заряду</translation> <translation id="8082366717211101304">Не вдається перетворити DNS із додатків для Android</translation> <translation id="808894953321890993">Змінити пароль</translation> +<translation id="8094062939584182041">Дозволити Google надсилати вам електронні листи щодо цієї проблеми</translation> <translation id="8104083085214006426">Ви використовуєте відкриту та незахищену мережу</translation> <translation id="8109786307828817014">Продовжити з невдалим калібруванням?</translation> <translation id="811820734797650957">Шлюз можна перевірити (Android)</translation>
diff --git a/chromeos/strings/chromeos_strings_vi.xtb b/chromeos/strings/chromeos_strings_vi.xtb index ebaa644..0e64e32 100644 --- a/chromeos/strings/chromeos_strings_vi.xtb +++ b/chromeos/strings/chromeos_strings_vi.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">Loại</translation> <translation id="2461822463642141190">Hiện tại</translation> <translation id="2480034874476596812">Tắt theo cách thủ công</translation> +<translation id="248546197012830854">Thiết bị hiện không có kết nối mạng. Hãy kết nối với mạng Wi-Fi để xem nội dung trợ giúp.</translation> <translation id="2491955442992294626">Không thể thử phím khi bạn đang dùng một cửa sổ khác</translation> <translation id="2493126929778606526">Những ảnh đẹp nhất của bạn được chọn tự động</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -661,6 +662,7 @@ <translation id="6611280807952151149">Thoát khỏi việc sửa <ph name="DEVICE_TYPE" /></translation> <translation id="6618744767048954150">Đang chạy</translation> <translation id="6620487321149975369">Lệnh in sẽ xuất hiện trong lịch sử in trừ phi bạn tự xóa</translation> +<translation id="6624819909909965616">Không thể tải tệp lên nếu tệp lớn hơn 10 MB</translation> <translation id="6643016212128521049">Xóa</translation> <translation id="6644568396961840069">Không thể lưu tệp. Hãy thử sử dụng một bộ nhớ ngoài khác hoặc thử lại sau.</translation> <translation id="6647510110698214773">Thuật toán mã hoá</translation> @@ -696,6 +698,7 @@ <translation id="6965382102122355670">OK</translation> <translation id="6977381486153291903">Hiệu chỉnh chương trình cơ sở</translation> <translation id="6995564396478647735">Hãy đảm bảo rằng bạn đã bật tính năng Chống ghi</translation> +<translation id="7005833343836210400">Thiết bị hiện không có kết nối mạng</translation> <translation id="7028979494427204405"><ph name="MANAGER" /> quản lý thiết bị này và có quyền truy cập vào tất cả hoạt động của người dùng, bao gồm cả các trang web đã truy cập, mật khẩu và email.</translation> <translation id="7040230719604914234">Nhà mạng</translation> <translation id="7041549558901442110">Thiết bị chưa được kết nối.</translation> @@ -809,6 +812,7 @@ <translation id="8075838845814659848">Mức pin còn lại</translation> <translation id="8082366717211101304">Không thể phân giải DNS từ các ứng dụng Android</translation> <translation id="808894953321890993">Đổi mật khẩu</translation> +<translation id="8094062939584182041">Cho phép Google gửi email về vấn đề này cho bạn</translation> <translation id="8104083085214006426">Bạn đang dùng mạng mở và không an toàn</translation> <translation id="8109786307828817014">Tiếp tục kể cả khi có thành phần không hiệu chỉnh được?</translation> <translation id="811820734797650957">(Android) Có thể ping cổng vào</translation>
diff --git a/components/autofill/content/renderer/form_autofill_util.cc b/components/autofill/content/renderer/form_autofill_util.cc index 195bd20..216d945 100644 --- a/components/autofill/content/renderer/form_autofill_util.cc +++ b/components/autofill/content/renderer/form_autofill_util.cc
@@ -1052,7 +1052,8 @@ WebFormControlElement& element = *it; - element.SetAutofillSection(WebString::FromUTF8(data.fields[i].section)); + element.SetAutofillSection( + WebString::FromUTF8(data.fields[i].section.ToString())); // Only autofill empty fields (or those with the field's default value // attribute) and the field that initiated the filling, i.e. the field the
diff --git a/components/autofill/core/browser/autofill_form_test_utils.cc b/components/autofill/core/browser/autofill_form_test_utils.cc index e943a5a..92f5273 100644 --- a/components/autofill/core/browser/autofill_form_test_utils.cc +++ b/components/autofill/core/browser/autofill_form_test_utils.cc
@@ -160,7 +160,7 @@ static_cast<int>(form_structure->autofill_count())); } if (test_case.form_flags.section_count) { - std::set<std::string> section_names; + std::set<Section> section_names; for (const auto& field : *form_structure) section_names.insert(field->section); EXPECT_EQ(*test_case.form_flags.section_count,
diff --git a/components/autofill/core/browser/field_types.h b/components/autofill/core/browser/field_types.h index c946456..496ab51 100644 --- a/components/autofill/core/browser/field_types.h +++ b/components/autofill/core/browser/field_types.h
@@ -9,6 +9,7 @@ #include "base/strings/string_piece_forward.h" #include "components/autofill/core/common/dense_set.h" +#include "components/autofill/core/common/html_field_types.h" namespace autofill { @@ -245,99 +246,6 @@ MAX_VALID_FIELD_TYPE = 126, }; -// The list of all HTML autocomplete field type hints supported by Chrome. -// See [ http://is.gd/whatwg_autocomplete ] for the full list of specced hints. -enum HtmlFieldType { - // Default type. - HTML_TYPE_UNSPECIFIED, - - // Name types. - HTML_TYPE_NAME, - HTML_TYPE_HONORIFIC_PREFIX, - HTML_TYPE_GIVEN_NAME, - HTML_TYPE_ADDITIONAL_NAME, - HTML_TYPE_FAMILY_NAME, - - // Business types. - HTML_TYPE_ORGANIZATION, - - // Address types. - HTML_TYPE_STREET_ADDRESS, - HTML_TYPE_ADDRESS_LINE1, - HTML_TYPE_ADDRESS_LINE2, - HTML_TYPE_ADDRESS_LINE3, - HTML_TYPE_ADDRESS_LEVEL1, // For U.S. addresses, corresponds to the state. - HTML_TYPE_ADDRESS_LEVEL2, // For U.S. addresses, corresponds to the city. - HTML_TYPE_ADDRESS_LEVEL3, // An area that is more specific than LEVEL2. - HTML_TYPE_COUNTRY_CODE, // The ISO 3166-1-alpha-2 country code. - HTML_TYPE_COUNTRY_NAME, // The localized country name. - HTML_TYPE_POSTAL_CODE, - HTML_TYPE_FULL_ADDRESS, // The complete address, formatted for display. - - // Credit card types. - HTML_TYPE_CREDIT_CARD_NAME_FULL, - HTML_TYPE_CREDIT_CARD_NAME_FIRST, - HTML_TYPE_CREDIT_CARD_NAME_LAST, - HTML_TYPE_CREDIT_CARD_NUMBER, - HTML_TYPE_CREDIT_CARD_EXP, - HTML_TYPE_CREDIT_CARD_EXP_MONTH, - HTML_TYPE_CREDIT_CARD_EXP_YEAR, - HTML_TYPE_CREDIT_CARD_VERIFICATION_CODE, - HTML_TYPE_CREDIT_CARD_TYPE, - - // Phone number types. - HTML_TYPE_TEL, - HTML_TYPE_TEL_COUNTRY_CODE, - HTML_TYPE_TEL_NATIONAL, - HTML_TYPE_TEL_AREA_CODE, - HTML_TYPE_TEL_LOCAL, - HTML_TYPE_TEL_LOCAL_PREFIX, - HTML_TYPE_TEL_LOCAL_SUFFIX, - HTML_TYPE_TEL_EXTENSION, - - // Email. - HTML_TYPE_EMAIL, - - // Birthdate. - HTML_TYPE_BIRTHDATE_DAY, - HTML_TYPE_BIRTHDATE_MONTH, - HTML_TYPE_BIRTHDATE_YEAR, - - // Transaction details. - HTML_TYPE_TRANSACTION_AMOUNT, - HTML_TYPE_TRANSACTION_CURRENCY, - - // Variants of type hints specified in the HTML specification that are - // inferred based on a field's 'maxlength' attribute. - // TODO(isherman): Remove these types, in favor of understanding maxlength - // when filling fields. - HTML_TYPE_ADDITIONAL_NAME_INITIAL, - HTML_TYPE_CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR, - HTML_TYPE_CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR, - HTML_TYPE_CREDIT_CARD_EXP_2_DIGIT_YEAR, - HTML_TYPE_CREDIT_CARD_EXP_4_DIGIT_YEAR, - - // Universal Payment Interface - Virtual Payment Address. - HTML_TYPE_UPI_VPA, - - // Phone number verification one-time-codes. - HTML_TYPE_ONE_TIME_CODE, - - // Promo code for merchant sites. - HTML_TYPE_MERCHANT_PROMO_CODE, - - // Non-standard autocomplete types. - HTML_TYPE_UNRECOGNIZED, -}; - -// The list of all HTML autocomplete field mode hints supported by Chrome. -// See [ http://is.gd/whatwg_autocomplete ] for the full list of specced hints. -enum HtmlFieldMode { - HTML_MODE_NONE, - HTML_MODE_BILLING, - HTML_MODE_SHIPPING, -}; - enum class FieldTypeGroup { kNoGroup, kName,
diff --git a/components/autofill/core/browser/form_data_importer.cc b/components/autofill/core/browser/form_data_importer.cc index 52508b4..6093231 100644 --- a/components/autofill/core/browser/form_data_importer.cc +++ b/components/autofill/core/browser/form_data_importer.cc
@@ -416,13 +416,13 @@ << "Form is empty." << CTag{}; } else { // Relevant sections for address fields. - std::set<std::string> sections; + std::set<Section> sections; for (const auto& field : form) { if (field->Type().group() != FieldTypeGroup::kCreditCard) sections.insert(field->section); } - for (const std::string& section : sections) { + for (const Section& section : sections) { if (num_complete_profiles == kMaxNumAddressProfilesSaved) break; // Log the output from a section in a separate div for readability. @@ -446,7 +446,7 @@ AutofillMetrics::AddressProfileImportStatusMetric::REGULAR_IMPORT); } else if (sections.size() > 1) { // Try to import by combining all sections. - if (ImportAddressProfileForSection(form, "", import_candidates, + if (ImportAddressProfileForSection(form, absl::nullopt, import_candidates, &import_log_buffer)) { num_complete_profiles++; AutofillMetrics::LogAddressFormImportStatusMetric( @@ -471,7 +471,7 @@ bool FormDataImporter::ImportAddressProfileForSection( const FormStructure& form, - const std::string& section, + const absl::optional<Section>& section, std::vector<AddressProfileImportCandidate>& import_candidates, LogBuffer* import_log_buffer) { // The candidate for profile import. There are many ways for the candidate to @@ -511,8 +511,8 @@ // Go through each |form| field and attempt to constitute a valid profile. for (const auto& field : form) { // Reject fields that are not within the specified |section|. - // If section is empty, use all fields. - if (field->section != section && !section.empty()) + // If no section is passed, use all fields. + if (section && field->section != *section) continue; std::u16string value;
diff --git a/components/autofill/core/browser/form_data_importer.h b/components/autofill/core/browser/form_data_importer.h index ea5653f2..5a27bb32 100644 --- a/components/autofill/core/browser/form_data_importer.h +++ b/components/autofill/core/browser/form_data_importer.h
@@ -162,11 +162,11 @@ std::vector<AddressProfileImportCandidate>& import_candidates); // Helper method for ImportAddressProfiles which only considers the fields for - // a specified |section|. If |section| is the empty string, the import is - // performed on the union of all sections. + // a specified |section|. If no section is passed, the import is performed on + // the union of all sections. bool ImportAddressProfileForSection( const FormStructure& form, - const std::string& section, + const absl::optional<Section>& section, std::vector<AddressProfileImportCandidate>& import_candidates, LogBuffer* import_log_buffer);
diff --git a/components/autofill/core/browser/form_data_importer_unittest.cc b/components/autofill/core/browser/form_data_importer_unittest.cc index f09abde..0254675 100644 --- a/components/autofill/core/browser/form_data_importer_unittest.cc +++ b/components/autofill/core/browser/form_data_importer_unittest.cc
@@ -1207,7 +1207,7 @@ ConstructDefaultProfileFormStructure(); // Assign the address field another section than the other fields. - form_structure->field(4)->section = "another_section"; + form_structure->field(4)->section.set_prefix("another_section"); ImportAddressProfileAndVerifyImportOfDefaultProfile(*form_structure); }
diff --git a/components/autofill/core/browser/form_processing/autocomplete_attribute_processing_util.cc b/components/autofill/core/browser/form_processing/autocomplete_attribute_processing_util.cc index 726ab89..5a24c39 100644 --- a/components/autofill/core/browser/form_processing/autocomplete_attribute_processing_util.cc +++ b/components/autofill/core/browser/form_processing/autocomplete_attribute_processing_util.cc
@@ -295,13 +295,4 @@ autocomplete == "false"; } -base::StringPiece HtmlFieldModeToStringPiece(HtmlFieldMode mode) { - if (mode == HTML_MODE_BILLING) - return "billing"; - if (mode == HTML_MODE_SHIPPING) - return "shipping"; - NOTREACHED(); - return ""; -} - } // namespace autofill
diff --git a/components/autofill/core/browser/form_processing/autocomplete_attribute_processing_util.h b/components/autofill/core/browser/form_processing/autocomplete_attribute_processing_util.h index d257bc1..2dc88ce 100644 --- a/components/autofill/core/browser/form_processing/autocomplete_attribute_processing_util.h +++ b/components/autofill/core/browser/form_processing/autocomplete_attribute_processing_util.h
@@ -40,10 +40,6 @@ // currently ignored by Autofill. bool ShouldIgnoreAutocompleteAttribute(base::StringPiece autocomplete); -// Maps HTML_MODE_BILLING and HTML_MODE_SHIPPING to their string constants, as -// specified in the autocomplete standard. -base::StringPiece HtmlFieldModeToStringPiece(HtmlFieldMode mode); - } // namespace autofill #endif // COMPONENTS_AUTOFILL_CORE_BROWSER_FORM_PROCESSING_AUTOCOMPLETE_ATTRIBUTE_PROCESSING_UTIL_H_
diff --git a/components/autofill/core/browser/form_structure.cc b/components/autofill/core/browser/form_structure.cc index d582507..a3f09721 100644 --- a/components/autofill/core/browser/form_structure.cc +++ b/components/autofill/core/browser/form_structure.cc
@@ -74,9 +74,6 @@ namespace { -// Default section name for the fields. -constexpr char kDefaultSection[] = "-default"; - // Returns true if the scheme given by |url| is one for which autofill is // allowed to activate. By default this only returns true for HTTP and HTTPS. bool HasAllowedScheme(const GURL& url) { @@ -308,7 +305,7 @@ } } -// Creates a unique name for the section that starts with |field|. +// Creates a uniquely named section that starts with `field`. // // The section name is a string of the form "%s_%u_%u", where the first string // is the field's name and the two integers are the field's frame ID and its @@ -323,14 +320,15 @@ // because frame tokens should not be sent to a renderer. // // TODO(crbug.com/1257141): Remove special handling of FrameTokens. -std::u16string GetSectionName( - const AutofillField& field, - base::flat_map<LocalFrameToken, size_t>& frame_token_ids) { +Section GetSection(const AutofillField& field, + base::flat_map<LocalFrameToken, size_t>& frame_token_ids) { size_t id = frame_token_ids.emplace(field.host_frame, frame_token_ids.size()) .first->second; - return base::StrCat( - {field.name, u"_", base::NumberToString16(id), u"_", - base::NumberToString16(field.unique_renderer_id.value())}); + Section section; + section.set_prefix(base::StrCat( + {base::UTF16ToUTF8(field.name), "_", base::NumberToString(id), "_", + base::NumberToString(field.unique_renderer_id.value())})); + return section; } } // namespace @@ -741,7 +739,7 @@ annotated_field.overall_type = field->Type().ToString(); annotated_field.parseable_name = base::UTF16ToUTF8(field->parseable_name()); - annotated_field.section = field->section; + annotated_field.section = field->section.ToString(); form.fields.push_back(annotated_field); } @@ -1289,8 +1287,7 @@ // in the default section. These default section names will be overridden // by subsequent heuristic parsing steps if there are no author-specified // section names. - field->section = kDefaultSection; - + field->section = Section(); auto parsing_result = ParseAutocompleteAttribute(*field); if (!parsing_result) continue; @@ -1310,16 +1307,11 @@ } // Compute a section name based on the specified hints and apply the result. - field->section = - parsing_result->section + - (parsing_result->mode != HTML_MODE_NONE - ? "-" + - std::string(HtmlFieldModeToStringPiece(parsing_result->mode)) - : kDefaultSection); - field->SetHtmlType(parsing_result->field_type, parsing_result->mode); - - if (field->section != kDefaultSection) + if (field->section.SetPrefixFromAutocomplete(parsing_result->section, + parsing_result->mode)) { has_author_specified_sections_ = true; + } + field->SetHtmlType(parsing_result->field_type, parsing_result->mode); } was_parsed_for_autocomplete_attributes_ = true; } @@ -1603,8 +1595,7 @@ } } -void FormStructure::RationalizePhoneNumbersInSection( - const std::string& section) { +void FormStructure::RationalizePhoneNumbersInSection(const Section& section) { if (phone_rationalized_[section]) return; std::vector<AutofillField*> fields; @@ -2073,8 +2064,7 @@ features::kAutofillSectionUponRedundantNameInfo); base::flat_map<LocalFrameToken, size_t> frame_token_ids; - std::u16string current_section = - GetSectionName(*fields_.front(), frame_token_ids); + Section current_section = GetSection(*fields_.front(), frame_token_ids); // Keep track of the types we've seen in this section. ServerFieldTypeSet seen_types; @@ -2085,13 +2075,13 @@ bool previous_autocomplete_section_present = false; bool is_hidden_section = false; - std::u16string last_visible_section; + Section last_visible_section; for (const auto& field : fields_) { const ServerFieldType current_type = field->Type().GetStorableType(); // All credit card fields belong to the same section that's different // from address sections. if (AutofillType(current_type).group() == FieldTypeGroup::kCreditCard) { - field->section = "credit-card"; + field->section.set_prefix("credit-card"); continue; } @@ -2144,8 +2134,7 @@ // Boolean flag that is set to true when the |field| has // autocomplete-section attribute defined. - bool autocomplete_section_attribute_present = - (field->section != kDefaultSection); + bool autocomplete_section_attribute_present = field->section != Section(); // Boolean flag that is set to true when the |field| has // autocomplete-section attribute defined and is different than the @@ -2178,20 +2167,19 @@ // autocomplete section, then change the section attribute of all the // parsed fields in the current section to |field->section|. int i = static_cast<int>(field_index - 1); - while (i >= 0 && - base::UTF8ToUTF16(fields_[i]->section) == current_section) { + while (i >= 0 && fields_[i]->section == current_section) { fields_[i]->section = field->section; i--; } } // The end of a section, so start a new section. - current_section = GetSectionName(*field, frame_token_ids); + current_section = GetSection(*field, frame_token_ids); // The section described in the autocomplete section attribute // overrides the value determined by the heuristic. if (autocomplete_section_attribute_present) - current_section = base::UTF8ToUTF16(field->section); + current_section = field->section; previous_autocomplete_section_present = autocomplete_section_attribute_present; @@ -2210,17 +2198,17 @@ is_hidden_section = false; } - field->section = base::UTF16ToUTF8(current_section); + field->section = current_section; } // Ensure that credit card and address fields are in separate sections. // This simplifies the section-aware logic in autofill_manager.cc. for (const auto& field : fields_) { FieldTypeGroup field_type_group = field->Type().group(); - if (field_type_group == FieldTypeGroup::kCreditCard) - field->section = field->section + "-cc"; - else - field->section = field->section + "-default"; + field->section.set_field_type_group( + field_type_group == FieldTypeGroup::kCreditCard + ? Section::FieldTypeGroupSuffix::kCreditCard + : Section::FieldTypeGroupSuffix::kDefault); } // Since this function has changed the sections, subsequent calls to @@ -2245,21 +2233,20 @@ if (!has_author_specified_sections) { base::flat_map<LocalFrameToken, size_t> frame_token_ids; - std::u16string current_section = - GetSectionName(*fields_.front(), frame_token_ids); + Section current_section = GetSection(*fields_.front(), frame_token_ids); // Keep track of the types we've seen in this section. ServerFieldTypeSet seen_types; ServerFieldType previous_type = UNKNOWN_TYPE; bool is_hidden_section = false; - std::u16string last_visible_section; + Section last_visible_section; for (const auto& field : fields_) { const ServerFieldType current_type = field->Type().GetStorableType(); // All credit card fields belong to the same section that's different // from address sections. if (AutofillType(current_type).group() == FieldTypeGroup::kCreditCard) { - field->section = "credit-card"; + field->section.set_prefix("credit-card"); continue; } @@ -2324,7 +2311,7 @@ seen_types.clear(); // The end of a section, so start a new section. - current_section = GetSectionName(*field, frame_token_ids); + current_section = GetSection(*field, frame_token_ids); } // Only consider a type "seen" if it was not ignored. Some forms have @@ -2340,7 +2327,7 @@ is_hidden_section = false; } - field->section = base::UTF16ToUTF8(current_section); + field->section = current_section; } } @@ -2348,10 +2335,10 @@ // This simplifies the section-aware logic in autofill_manager.cc. for (const auto& field : fields_) { FieldTypeGroup field_type_group = field->Type().group(); - if (field_type_group == FieldTypeGroup::kCreditCard) - field->section = field->section + "-cc"; - else - field->section = field->section + "-default"; + field->section.set_field_type_group( + field_type_group == FieldTypeGroup::kCreditCard + ? Section::FieldTypeGroupSuffix::kCreditCard + : Section::FieldTypeGroupSuffix::kDefault); } // Since this function has changed the sections, subsequent calls to
diff --git a/components/autofill/core/browser/form_structure.h b/components/autofill/core/browser/form_structure.h index f126f252..f7e6083 100644 --- a/components/autofill/core/browser/form_structure.h +++ b/components/autofill/core/browser/form_structure.h
@@ -25,6 +25,7 @@ #include "components/autofill/core/browser/metrics/form_interactions_counter.h" #include "components/autofill/core/browser/proto/api_v1.pb.h" #include "components/autofill/core/common/dense_set.h" +#include "components/autofill/core/common/form_field_data.h" #include "components/autofill/core/common/language_code.h" #include "components/autofill/core/common/mojom/autofill_types.mojom.h" #include "components/autofill/core/common/unique_ids.h" @@ -247,7 +248,7 @@ // Rationalize phone number fields in a given section, that is only fill // the fields that are considered composing a first complete phone number. - void RationalizePhoneNumbersInSection(const std::string& section); + void RationalizePhoneNumbersInSection(const Section& section); // Overrides server predictions with specific heuristic predictions: // * NAME_LAST_SECOND heuristic predictions are unconditionally used. @@ -668,7 +669,7 @@ base::TimeTicks form_parsed_timestamp_; // If phone number rationalization has been performed for a given section. - std::map<std::string, bool> phone_rationalized_; + std::map<Section, bool> phone_rationalized_; // True iff the form is a password form and the user has seen the password // value before accepting the prompt to save. Used for crowdsourcing.
diff --git a/components/autofill/core/browser/form_structure_test_api.h b/components/autofill/core/browser/form_structure_test_api.h index d582651f..940547d 100644 --- a/components/autofill/core/browser/form_structure_test_api.h +++ b/components/autofill/core/browser/form_structure_test_api.h
@@ -66,7 +66,7 @@ form_structure_->IdentifySections(has_author_specified_sections); } - bool phone_rationalized(const std::string& section) const { + bool phone_rationalized(const Section& section) const { auto it = form_structure_->phone_rationalized_.find(section); return it != form_structure_->phone_rationalized_.end() && it->second; }
diff --git a/components/autofill/core/browser/form_structure_unittest.cc b/components/autofill/core/browser/form_structure_unittest.cc index fbe09a5..d72515f 100644 --- a/components/autofill/core/browser/form_structure_unittest.cc +++ b/components/autofill/core/browser/form_structure_unittest.cc
@@ -1322,7 +1322,7 @@ // All of the fields in this form should be parsed as belonging to different // sections. - std::set<std::string> section_names; + std::set<Section> section_names; for (size_t i = 0; i < 9; ++i) { section_names.insert(form_structure.field(i)->section); } @@ -1376,7 +1376,7 @@ // All of the fields in this form should be parsed as belonging to the same // section. - std::set<std::string> section_names; + std::set<Section> section_names; for (size_t i = 0; i < 6; ++i) { section_names.insert(form_structure.field(i)->section); } @@ -1410,7 +1410,7 @@ // All of the fields in this form should be parsed as belonging to the same // section. - std::set<std::string> section_names; + std::set<Section> section_names; for (size_t i = 0; i < 2; ++i) { section_names.insert(form_structure.field(i)->section); } @@ -6260,12 +6260,12 @@ FormStructure::ParseApiQueryResponse(response_string, forms, test::GetEncodedSignatures(forms), nullptr, nullptr); - - EXPECT_FALSE( - test_api(&form_structure).phone_rationalized("fullName_0_11-default")); - form_structure.RationalizePhoneNumbersInSection("fullName_0_11-default"); - EXPECT_TRUE( - test_api(&form_structure).phone_rationalized("fullName_0_11-default")); + Section s; + s.set_prefix("fullName_0_11"); + s.set_field_type_group(Section::FieldTypeGroupSuffix::kDefault); + EXPECT_FALSE(test_api(&form_structure).phone_rationalized(s)); + form_structure.RationalizePhoneNumbersInSection(s); + EXPECT_TRUE(test_api(&form_structure).phone_rationalized(s)); ASSERT_EQ(1U, forms.size()); ASSERT_EQ(4U, forms[0]->field_count()); EXPECT_EQ(NAME_FULL, forms[0]->field(0)->server_type()); @@ -6591,37 +6591,37 @@ field.label = u"Full Name"; field.name = u"fullName"; - field.section = "Billing"; + field.section.set_prefix("Billing"); field.unique_renderer_id = MakeFieldRendererId(); form.fields.push_back(field); field.label = u"Address"; field.name = u"address"; - field.section = "Billing"; + field.section.set_prefix("Billing"); field.unique_renderer_id = MakeFieldRendererId(); form.fields.push_back(field); field.label = u"City"; field.name = u"city"; - field.section = "Billing"; + field.section.set_prefix("Billing"); field.unique_renderer_id = MakeFieldRendererId(); form.fields.push_back(field); field.label = u"Full Name"; field.name = u"fullName"; - field.section = "Shipping"; + field.section.set_prefix("Shipping"); field.unique_renderer_id = MakeFieldRendererId(); form.fields.push_back(field); field.label = u"Address"; field.name = u"address"; - field.section = "Shipping"; + field.section.set_prefix("Shipping"); field.unique_renderer_id = MakeFieldRendererId(); form.fields.push_back(field); field.label = u"City"; field.name = u"city"; - field.section = "Shipping"; + field.section.set_prefix("Shipping"); field.unique_renderer_id = MakeFieldRendererId(); form.fields.push_back(field); @@ -6678,93 +6678,93 @@ // Shipping field.label = u"Full Name"; field.name = u"fullName"; - field.section = "Shipping"; + field.section.set_prefix("Shipping"); field.unique_renderer_id = MakeFieldRendererId(); form.fields.push_back(field); field.label = u"Address"; field.name = u"address"; - field.section = "Shipping"; + field.section.set_prefix("Shipping"); field.unique_renderer_id = MakeFieldRendererId(); form.fields.push_back(field); field.label = u"Address"; field.name = u"address"; - field.section = "Shipping"; + field.section.set_prefix("Shipping"); field.unique_renderer_id = MakeFieldRendererId(); form.fields.push_back(field); field.label = u"City"; field.name = u"city"; - field.section = "Shipping"; + field.section.set_prefix("Shipping"); field.unique_renderer_id = MakeFieldRendererId(); form.fields.push_back(field); // Billing field.label = u"Full Name"; field.name = u"fullName"; - field.section = "Billing"; + field.section.set_prefix("Billing"); field.unique_renderer_id = MakeFieldRendererId(); form.fields.push_back(field); field.label = u"Address"; field.name = u"address"; - field.section = "Billing"; + field.section.set_prefix("Billing"); field.unique_renderer_id = MakeFieldRendererId(); form.fields.push_back(field); field.label = u"Address"; field.name = u"address"; - field.section = "Billing"; + field.section.set_prefix("Billing"); field.unique_renderer_id = MakeFieldRendererId(); form.fields.push_back(field); field.label = u"Address"; field.name = u"address"; - field.section = "Billing"; + field.section.set_prefix("Billing"); field.unique_renderer_id = MakeFieldRendererId(); form.fields.push_back(field); field.label = u"City"; field.name = u"city"; - field.section = "Billing"; + field.section.set_prefix("Billing"); field.unique_renderer_id = MakeFieldRendererId(); form.fields.push_back(field); // Work address (not realistic) field.label = u"Full Name"; field.name = u"fullName"; - field.section = "Work"; + field.section.set_prefix("Work"); field.unique_renderer_id = MakeFieldRendererId(); form.fields.push_back(field); field.label = u"Address"; field.name = u"address"; - field.section = "Work"; + field.section.set_prefix("Work"); field.unique_renderer_id = MakeFieldRendererId(); form.fields.push_back(field); field.label = u"Address"; field.name = u"address"; - field.section = "Work"; + field.section.set_prefix("Work"); field.unique_renderer_id = MakeFieldRendererId(); form.fields.push_back(field); field.label = u"Address"; field.name = u"address"; - field.section = "Work"; + field.section.set_prefix("Work"); field.unique_renderer_id = MakeFieldRendererId(); form.fields.push_back(field); field.label = u"Address"; field.name = u"address"; - field.section = "Work"; + field.section.set_prefix("Work"); field.unique_renderer_id = MakeFieldRendererId(); form.fields.push_back(field); field.label = u"City"; field.name = u"city"; - field.section = "Work"; + field.section.set_prefix("Work"); field.unique_renderer_id = MakeFieldRendererId(); form.fields.push_back(field); @@ -7137,7 +7137,7 @@ field.form_control_type = "text"; field.max_length = 10000; - field.section = "shipping"; + field.section.set_prefix("shipping"); field.label = u"Full Name"; field.name = u"fullName"; @@ -7159,7 +7159,7 @@ field.unique_renderer_id = MakeFieldRendererId(); form.fields.push_back(field); - field.section = "billing"; + field.section.set_prefix("billing"); field.label = u"Country"; field.name = u"country2"; @@ -7208,7 +7208,7 @@ field.unique_renderer_id = MakeFieldRendererId(); form.fields.push_back(field); - field.section = "billing-2"; + field.section.set_prefix("billing-2"); field.label = u"Country"; field.name = u"country"; @@ -7445,7 +7445,7 @@ field.form_control_type = "text"; field.max_length = 10000; - field.section = "billing"; + field.section.set_prefix("billing"); field.label = u"Country"; field.name = u"country"; @@ -7514,7 +7514,7 @@ field.form_control_type = "text"; field.max_length = 10000; - field.section = "billing"; + field.section.set_prefix("billing"); field.label = u"Country"; field.name = u"country"; @@ -8175,13 +8175,18 @@ // Assert the correct number of fields. ASSERT_EQ(6U, form_structure.field_count()); - - EXPECT_EQ("fullName_0_11-default", form_structure.field(0)->section); - EXPECT_EQ("fullName_0_11-default", form_structure.field(1)->section); - EXPECT_EQ("fullName_0_11-default", form_structure.field(2)->section); - EXPECT_EQ("fullName_0_14-default", form_structure.field(3)->section); - EXPECT_EQ("fullName_0_14-default", form_structure.field(4)->section); - EXPECT_EQ("fullName_0_14-default", form_structure.field(5)->section); + EXPECT_EQ("fullName_0_11-default", + form_structure.field(0)->section.ToString()); + EXPECT_EQ("fullName_0_11-default", + form_structure.field(1)->section.ToString()); + EXPECT_EQ("fullName_0_11-default", + form_structure.field(2)->section.ToString()); + EXPECT_EQ("fullName_0_14-default", + form_structure.field(3)->section.ToString()); + EXPECT_EQ("fullName_0_14-default", + form_structure.field(4)->section.ToString()); + EXPECT_EQ("fullName_0_14-default", + form_structure.field(5)->section.ToString()); } // Tests that the immediate recurrence of the |PHONE_HOME_NUMBER| type does not @@ -8251,13 +8256,20 @@ // Assert the correct number of fields. ASSERT_EQ(7U, form_structure.field_count()); - EXPECT_EQ("blue-billing-default", form_structure.field(0)->section); - EXPECT_EQ("blue-billing-default", form_structure.field(1)->section); - EXPECT_EQ("blue-billing-default", form_structure.field(2)->section); - EXPECT_EQ("blue-billing-default", form_structure.field(3)->section); - EXPECT_EQ("blue-billing-default", form_structure.field(4)->section); - EXPECT_EQ("blue-billing-default", form_structure.field(5)->section); - EXPECT_EQ("blue-billing-default", form_structure.field(6)->section); + EXPECT_EQ("blue-billing-default", + form_structure.field(0)->section.ToString()); + EXPECT_EQ("blue-billing-default", + form_structure.field(1)->section.ToString()); + EXPECT_EQ("blue-billing-default", + form_structure.field(2)->section.ToString()); + EXPECT_EQ("blue-billing-default", + form_structure.field(3)->section.ToString()); + EXPECT_EQ("blue-billing-default", + form_structure.field(4)->section.ToString()); + EXPECT_EQ("blue-billing-default", + form_structure.field(5)->section.ToString()); + EXPECT_EQ("blue-billing-default", + form_structure.field(6)->section.ToString()); } // Tests if a new logical form is started with the second appearance of a field @@ -8310,10 +8322,14 @@ // Assert the correct number of fields. ASSERT_EQ(4U, form_structure.field_count()); - EXPECT_EQ("blue-shipping-default", form_structure.field(0)->section); - EXPECT_EQ("blue-shipping-default", form_structure.field(1)->section); - EXPECT_EQ("blue-shipping-default", form_structure.field(2)->section); - EXPECT_EQ("country_0_14-default", form_structure.field(3)->section); + EXPECT_EQ("blue-shipping-default", + form_structure.field(0)->section.ToString()); + EXPECT_EQ("blue-shipping-default", + form_structure.field(1)->section.ToString()); + EXPECT_EQ("blue-shipping-default", + form_structure.field(2)->section.ToString()); + EXPECT_EQ("country_0_14-default", + form_structure.field(3)->section.ToString()); } // Tests if a new logical form is started with the second appearance of a field @@ -8369,10 +8385,14 @@ // Assert the correct number of fields. ASSERT_EQ(4U, form_structure.field_count()); - EXPECT_EQ("blue-shipping-default", form_structure.field(0)->section); - EXPECT_EQ("blue-billing-default", form_structure.field(1)->section); - EXPECT_EQ("blue-billing-default", form_structure.field(2)->section); - EXPECT_EQ("country_0_14-default", form_structure.field(3)->section); + EXPECT_EQ("blue-shipping-default", + form_structure.field(0)->section.ToString()); + EXPECT_EQ("blue-billing-default", + form_structure.field(1)->section.ToString()); + EXPECT_EQ("blue-billing-default", + form_structure.field(2)->section.ToString()); + EXPECT_EQ("country_0_14-default", + form_structure.field(3)->section.ToString()); } // Tests if a new logical form is started with the second appearance of a field @@ -8426,10 +8446,14 @@ // Assert the correct number of fields. ASSERT_EQ(4U, form_structure.field_count()); - EXPECT_EQ("blue-shipping-default", form_structure.field(0)->section); - EXPECT_EQ("blue-shipping-default", form_structure.field(1)->section); - EXPECT_EQ("blue-billing-default", form_structure.field(2)->section); - EXPECT_EQ("blue-billing-default", form_structure.field(3)->section); + EXPECT_EQ("blue-shipping-default", + form_structure.field(0)->section.ToString()); + EXPECT_EQ("blue-shipping-default", + form_structure.field(1)->section.ToString()); + EXPECT_EQ("blue-billing-default", + form_structure.field(2)->section.ToString()); + EXPECT_EQ("blue-billing-default", + form_structure.field(3)->section.ToString()); } // Tests if a new logical form is started with the second appearance of a field @@ -8484,10 +8508,14 @@ // Assert the correct number of fields. ASSERT_EQ(4U, form_structure.field_count()); - EXPECT_EQ("blue-shipping-default", form_structure.field(0)->section); - EXPECT_EQ("blue-shipping-default", form_structure.field(1)->section); - EXPECT_EQ("blue-billing-default", form_structure.field(2)->section); - EXPECT_EQ("blue-billing-default", form_structure.field(3)->section); + EXPECT_EQ("blue-shipping-default", + form_structure.field(0)->section.ToString()); + EXPECT_EQ("blue-shipping-default", + form_structure.field(1)->section.ToString()); + EXPECT_EQ("blue-billing-default", + form_structure.field(2)->section.ToString()); + EXPECT_EQ("blue-billing-default", + form_structure.field(3)->section.ToString()); } // Tests if all the fields in the form belong to the same section when the @@ -8526,8 +8554,10 @@ // Assert the correct number of fields. ASSERT_EQ(2U, form_structure.field_count()); - EXPECT_EQ("blue-shipping-default", form_structure.field(0)->section); - EXPECT_EQ("blue-shipping-default", form_structure.field(1)->section); + EXPECT_EQ("blue-shipping-default", + form_structure.field(0)->section.ToString()); + EXPECT_EQ("blue-shipping-default", + form_structure.field(1)->section.ToString()); } // Tests if all the fields in the form belong to the same section when one of @@ -8575,9 +8605,9 @@ // Assert the correct number of fields. ASSERT_EQ(3U, form_structure.field_count()); - EXPECT_EQ("-shipping-default", form_structure.field(0)->section); - EXPECT_EQ("-shipping-default", form_structure.field(1)->section); - EXPECT_EQ("-shipping-default", form_structure.field(2)->section); + EXPECT_EQ("-shipping-default", form_structure.field(0)->section.ToString()); + EXPECT_EQ("-shipping-default", form_structure.field(1)->section.ToString()); + EXPECT_EQ("-shipping-default", form_structure.field(2)->section.ToString()); } TEST_F(FormStructureTestImpl, FindFieldsEligibleForManualFilling) {
diff --git a/components/autofill/core/common/BUILD.gn b/components/autofill/core/common/BUILD.gn index 77b2d6d..32c9af5 100644 --- a/components/autofill/core/common/BUILD.gn +++ b/components/autofill/core/common/BUILD.gn
@@ -40,6 +40,8 @@ "form_field_data_predictions.h", "gaia_id_hash.cc", "gaia_id_hash.h", + "html_field_types.cc", + "html_field_types.h", "language_code.h", "logging/log_buffer.cc", "logging/log_buffer.h",
diff --git a/components/autofill/core/common/form_field_data.cc b/components/autofill/core/common/form_field_data.cc index 3099e4e..5404f674 100644 --- a/components/autofill/core/common/form_field_data.cc +++ b/components/autofill/core/common/form_field_data.cc
@@ -7,6 +7,7 @@ #include <algorithm> #include <tuple> +#include "base/notreached.h" #include "base/pickle.h" #include "base/strings/strcat.h" #include "base/strings/string_piece.h" @@ -245,6 +246,62 @@ } // namespace +bool operator==(const Section& a, const Section& b) { + return std::tie(a.field_type_group_, a.prefix_) == + std::tie(b.field_type_group_, b.prefix_); +} + +bool operator!=(const Section& a, const Section& b) { + return !(a == b); +} + +bool operator<(const Section& a, const Section& b) { + return std::tie(a.field_type_group_, a.prefix_) < + std::tie(b.field_type_group_, b.prefix_); +} + +void Section::set_field_type_group(FieldTypeGroupSuffix field_type_group) { + field_type_group_ = field_type_group; +} + +void Section::set_prefix(std::string prefix) { + prefix_ = std::move(prefix); +} + +bool Section::SetPrefixFromAutocomplete(const std::string& autocomplete_section, + HtmlFieldMode autocomplete_mode) { + if (autocomplete_section.empty() && autocomplete_mode == HTML_MODE_NONE) + return false; + + prefix_ = + autocomplete_section + + (autocomplete_mode != HTML_MODE_NONE + ? "-" + std::string(HtmlFieldModeToStringPiece(autocomplete_mode)) + : kDefaultSection); + return true; +} + +std::string Section::ToString() const { + std::string section_name = prefix_.empty() ? kDefaultSection : prefix_; + switch (field_type_group_) { + case FieldTypeGroupSuffix::kNoGroup: + return section_name; + case FieldTypeGroupSuffix::kDefault: + return section_name + kDefaultSection; + case FieldTypeGroupSuffix::kCreditCard: + return section_name + "-cc"; + } + NOTREACHED(); +} + +LogBuffer& operator<<(LogBuffer& buffer, const Section& section) { + return buffer << section.ToString(); +} + +std::ostream& operator<<(std::ostream& os, const Section& section) { + return os << section.ToString(); +} + FormFieldData::FormFieldData() = default; FormFieldData::FormFieldData(const FormFieldData&) = default;
diff --git a/components/autofill/core/common/form_field_data.h b/components/autofill/core/common/form_field_data.h index f051d83..082e6116 100644 --- a/components/autofill/core/common/form_field_data.h +++ b/components/autofill/core/common/form_field_data.h
@@ -14,6 +14,7 @@ #include "base/i18n/rtl.h" #include "build/build_config.h" +#include "components/autofill/core/common/html_field_types.h" #include "components/autofill/core/common/mojom/autofill_types.mojom-shared.h" #include "components/autofill/core/common/signatures.h" #include "components/autofill/core/common/unique_ids.h" @@ -63,6 +64,46 @@ std::u16string content; }; +// Stores information about the section of the field. +class Section { + public: + // In the second pass of `FormStructure::IdentifySections()`, a suffix is + // added to the legacy section string based on the field type group. + enum class FieldTypeGroupSuffix : uint8_t { kNoGroup, kDefault, kCreditCard }; + + friend bool operator==(const Section& a, const Section& b); + friend bool operator!=(const Section& a, const Section& b); + friend bool operator<(const Section& a, const Section& b); + + void set_field_type_group(FieldTypeGroupSuffix field_type_group); + void set_prefix(std::string prefix); + bool SetPrefixFromAutocomplete(const std::string& autocomplete_section, + HtmlFieldMode autocomplete_mode); + + // Reconstructs `this` to a string. The string representation of the section + // is used in the renderer. + // TODO(crbug/1257141): Remove when fixed. + std::string ToString() const; + + private: + friend struct mojo::StructTraits<autofill::mojom::SectionDataView, + autofill::Section>; + + // Default section name for the fields. + static constexpr char kDefaultSection[] = "-default"; + + // The `kNoGroup` is assigned in the beginning, as + // `FormStructure::IdentifySections()` was not run yet. + FieldTypeGroupSuffix field_type_group_ = FieldTypeGroupSuffix::kNoGroup; + + // Represents the prefix of the section's name. It is either derived from the + // autocomplete attribute or by the sectioning algorithm. + std::string prefix_; +}; + +LogBuffer& operator<<(LogBuffer& buffer, const Section& section); +std::ostream& operator<<(std::ostream& os, const Section& section); + // Stores information about a field in a form. Read more about forms and fields // at FormData. struct FormFieldData { @@ -220,7 +261,7 @@ // The unique identifier of the section (e.g. billing vs. shipping address) // of this field. - std::string section; + Section section; // Note: we use uint64_t instead of size_t because this struct is sent over // IPC which could span 32 & 64 bit processes. We chose uint64_t instead of
diff --git a/components/autofill/core/common/html_field_types.cc b/components/autofill/core/common/html_field_types.cc new file mode 100644 index 0000000..d54928a --- /dev/null +++ b/components/autofill/core/common/html_field_types.cc
@@ -0,0 +1,23 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#include "components/autofill/core/common/html_field_types.h" + +#include "base/notreached.h" +#include "base/strings/string_piece.h" + +namespace autofill { + +base::StringPiece HtmlFieldModeToStringPiece(HtmlFieldMode mode) { + switch (mode) { + case HTML_MODE_NONE: + return ""; + case HTML_MODE_BILLING: + return "billing"; + case HTML_MODE_SHIPPING: + return "shipping"; + } + NOTREACHED(); +} + +} // namespace autofill
diff --git a/components/autofill/core/common/html_field_types.h b/components/autofill/core/common/html_field_types.h new file mode 100644 index 0000000..8c61822 --- /dev/null +++ b/components/autofill/core/common/html_field_types.h
@@ -0,0 +1,111 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_AUTOFILL_CORE_COMMON_HTML_FIELD_TYPES_H_ +#define COMPONENTS_AUTOFILL_CORE_COMMON_HTML_FIELD_TYPES_H_ + +#include "base/strings/string_piece_forward.h" + +namespace autofill { + +// The list of all HTML autocomplete field type hints supported by Chrome. +// See [ http://is.gd/whatwg_autocomplete ] for the full list of specced hints. +enum HtmlFieldType { + // Default type. + HTML_TYPE_UNSPECIFIED, + + // Name types. + HTML_TYPE_NAME, + HTML_TYPE_HONORIFIC_PREFIX, + HTML_TYPE_GIVEN_NAME, + HTML_TYPE_ADDITIONAL_NAME, + HTML_TYPE_FAMILY_NAME, + + // Business types. + HTML_TYPE_ORGANIZATION, + + // Address types. + HTML_TYPE_STREET_ADDRESS, + HTML_TYPE_ADDRESS_LINE1, + HTML_TYPE_ADDRESS_LINE2, + HTML_TYPE_ADDRESS_LINE3, + HTML_TYPE_ADDRESS_LEVEL1, // For U.S. addresses, corresponds to the state. + HTML_TYPE_ADDRESS_LEVEL2, // For U.S. addresses, corresponds to the city. + HTML_TYPE_ADDRESS_LEVEL3, // An area that is more specific than LEVEL2. + HTML_TYPE_COUNTRY_CODE, // The ISO 3166-1-alpha-2 country code. + HTML_TYPE_COUNTRY_NAME, // The localized country name. + HTML_TYPE_POSTAL_CODE, + HTML_TYPE_FULL_ADDRESS, // The complete address, formatted for display. + + // Credit card types. + HTML_TYPE_CREDIT_CARD_NAME_FULL, + HTML_TYPE_CREDIT_CARD_NAME_FIRST, + HTML_TYPE_CREDIT_CARD_NAME_LAST, + HTML_TYPE_CREDIT_CARD_NUMBER, + HTML_TYPE_CREDIT_CARD_EXP, + HTML_TYPE_CREDIT_CARD_EXP_MONTH, + HTML_TYPE_CREDIT_CARD_EXP_YEAR, + HTML_TYPE_CREDIT_CARD_VERIFICATION_CODE, + HTML_TYPE_CREDIT_CARD_TYPE, + + // Phone number types. + HTML_TYPE_TEL, + HTML_TYPE_TEL_COUNTRY_CODE, + HTML_TYPE_TEL_NATIONAL, + HTML_TYPE_TEL_AREA_CODE, + HTML_TYPE_TEL_LOCAL, + HTML_TYPE_TEL_LOCAL_PREFIX, + HTML_TYPE_TEL_LOCAL_SUFFIX, + HTML_TYPE_TEL_EXTENSION, + + // Email. + HTML_TYPE_EMAIL, + + // Birthdate. + HTML_TYPE_BIRTHDATE_DAY, + HTML_TYPE_BIRTHDATE_MONTH, + HTML_TYPE_BIRTHDATE_YEAR, + + // Transaction details. + HTML_TYPE_TRANSACTION_AMOUNT, + HTML_TYPE_TRANSACTION_CURRENCY, + + // Variants of type hints specified in the HTML specification that are + // inferred based on a field's 'maxlength' attribute. + // TODO(isherman): Remove these types, in favor of understanding maxlength + // when filling fields. See also: AutofillField::phone_part_. + HTML_TYPE_ADDITIONAL_NAME_INITIAL, + HTML_TYPE_CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR, + HTML_TYPE_CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR, + HTML_TYPE_CREDIT_CARD_EXP_2_DIGIT_YEAR, + HTML_TYPE_CREDIT_CARD_EXP_4_DIGIT_YEAR, + + // Universal Payment Interface - Virtual Payment Address. + HTML_TYPE_UPI_VPA, + + // Phone number verification one-time-codes. + HTML_TYPE_ONE_TIME_CODE, + + // Promo code for merchant sites. + HTML_TYPE_MERCHANT_PROMO_CODE, + + // Non-standard autocomplete types. + HTML_TYPE_UNRECOGNIZED, +}; + +// The list of all HTML autocomplete field mode hints supported by Chrome. +// See [ http://is.gd/whatwg_autocomplete ] for the full list of specced hints. +enum HtmlFieldMode { + HTML_MODE_NONE, + HTML_MODE_BILLING, + HTML_MODE_SHIPPING, +}; + +// Maps HTML_MODE_BILLING and HTML_MODE_SHIPPING to their string constants, as +// specified in the autocomplete standard. +base::StringPiece HtmlFieldModeToStringPiece(HtmlFieldMode mode); + +} // namespace autofill + +#endif // COMPONENTS_AUTOFILL_CORE_COMMON_HTML_FIELD_TYPES_H_
diff --git a/components/autofill/core/common/mojom/autofill_types.mojom b/components/autofill/core/common/mojom/autofill_types.mojom index 609485f..a2b6870 100644 --- a/components/autofill/core/common/mojom/autofill_types.mojom +++ b/components/autofill/core/common/mojom/autofill_types.mojom
@@ -137,6 +137,13 @@ mojo_base.mojom.String16 content; }; +// autofill::Section (components/autofill/core/common/form_field_data.h) +struct Section { + // autofill::Section::FieldTypeGroupSuffix + uint8 field_type_group; + string prefix; +}; + // autofill::FormFieldData (components/autofill/core/common/form_field_data.h) struct FormFieldData { enum CheckStatus { @@ -186,7 +193,7 @@ uint64 max_length; bool is_autofilled; - string section; + Section section; CheckStatus check_status; bool is_focusable; bool is_visible;
diff --git a/components/autofill/core/common/mojom/autofill_types_mojom_traits.cc b/components/autofill/core/common/mojom/autofill_types_mojom_traits.cc index 88fe33bc..15d70fd 100644 --- a/components/autofill/core/common/mojom/autofill_types_mojom_traits.cc +++ b/components/autofill/core/common/mojom/autofill_types_mojom_traits.cc
@@ -69,6 +69,20 @@ } // static +bool StructTraits<autofill::mojom::SectionDataView, autofill::Section>::Read( + autofill::mojom::SectionDataView data, + autofill::Section* out) { + static_assert(sizeof(data.field_type_group()) <= + sizeof(autofill::Section::FieldTypeGroupSuffix)); + out->field_type_group_ = static_cast<autofill::Section::FieldTypeGroupSuffix>( + data.field_type_group()); + + if (!data.ReadPrefix(&out->prefix_)) + return false; + return true; +} + +// static bool StructTraits< autofill::mojom::FormFieldDataDataView, autofill::FormFieldData>::Read(autofill::mojom::FormFieldDataDataView data,
diff --git a/components/autofill/core/common/mojom/autofill_types_mojom_traits.h b/components/autofill/core/common/mojom/autofill_types_mojom_traits.h index 9060cf6..fc79f7f7 100644 --- a/components/autofill/core/common/mojom/autofill_types_mojom_traits.h +++ b/components/autofill/core/common/mojom/autofill_types_mojom_traits.h
@@ -92,6 +92,21 @@ }; template <> +struct StructTraits<autofill::mojom::SectionDataView, autofill::Section> { + static uint8_t field_type_group(const autofill::Section& r) { + static_assert(sizeof(r.field_type_group_) <= sizeof(uint8_t)); + return static_cast<uint8_t>(r.field_type_group_); + } + + static const std::string& prefix(const autofill::Section& r) { + return r.prefix_; + } + + static bool Read(autofill::mojom::SectionDataView data, + autofill::Section* out); +}; + +template <> struct StructTraits<autofill::mojom::FormFieldDataDataView, autofill::FormFieldData> { static const std::u16string& label(const autofill::FormFieldData& r) { @@ -168,7 +183,7 @@ return r.is_autofilled; } - static const std::string& section(const autofill::FormFieldData& r) { + static const autofill::Section& section(const autofill::FormFieldData& r) { return r.section; }
diff --git a/components/autofill/core/common/mojom/autofill_types_mojom_traits_unittest.cc b/components/autofill/core/common/mojom/autofill_types_mojom_traits_unittest.cc index b3f8d8f..85f644f 100644 --- a/components/autofill/core/common/mojom/autofill_types_mojom_traits_unittest.cc +++ b/components/autofill/core/common/mojom/autofill_types_mojom_traits_unittest.cc
@@ -264,6 +264,10 @@ input.properties_mask = FieldPropertiesFlags::kHadFocus; input.user_input = u"TestTypedValue"; input.bounds = gfx::RectF(1, 2, 10, 100); + input.section = Section(); + input.section.set_prefix("random"); + input.section.set_field_type_group( + Section::FieldTypeGroupSuffix::kCreditCard); EXPECT_FALSE(input.host_frame.is_empty()); base::RunLoop loop;
diff --git a/components/autofill/ios/browser/autofill_agent.mm b/components/autofill/ios/browser/autofill_agent.mm index d21c17fb..16ed948 100644 --- a/components/autofill/ios/browser/autofill_agent.mm +++ b/components/autofill/ios/browser/autofill_agent.mm
@@ -501,7 +501,7 @@ base::Value fieldData(base::Value::Type::DICTIONARY); fieldData.SetKey("value", base::Value(field.value)); - fieldData.SetKey("section", base::Value(field.section)); + fieldData.SetKey("section", base::Value(field.section.ToString())); fieldsData.SetKey(NumberToString(field.unique_renderer_id.value()), std::move(fieldData)); }
diff --git a/components/autofill/ios/browser/autofill_agent_unittests.mm b/components/autofill/ios/browser/autofill_agent_unittests.mm index 049f7f0..075109b 100644 --- a/components/autofill/ios/browser/autofill_agent_unittests.mm +++ b/components/autofill/ios/browser/autofill_agent_unittests.mm
@@ -179,10 +179,10 @@ fillFormData:form inFrame:fake_web_state_.GetWebFramesManager()->GetMainWebFrame()]; fake_web_state_.WasShown(); - EXPECT_EQ(u"__gCrWeb.autofill.fillForm({\"fields\":{\"2\":{\"section\":\"\"," - "\"value\":\"number_value\"}," - "\"3\":{\"section\":\"\",\"value\":\"name_value\"}}," - "\"formName\":\"CC form\",\"formRendererID\":1}, 0);", + EXPECT_EQ(u"__gCrWeb.autofill.fillForm({\"fields\":{\"2\":{\"section\":\"-" + u"default\",\"value\":\"number_value\"},\"3\":{\"section\":\"-" + u"default\",\"value\":\"name_value\"}},\"formName\":\"CC " + u"form\",\"formRendererID\":1}, 0);", fake_main_frame_->GetLastJavaScriptCall()); }
diff --git a/components/autofill_assistant/android/BUILD.gn b/components/autofill_assistant/android/BUILD.gn index 2eaeeca..69f0cf0 100644 --- a/components/autofill_assistant/android/BUILD.gn +++ b/components/autofill_assistant/android/BUILD.gn
@@ -141,6 +141,7 @@ "java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayImage.java", "java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayModel.java", "java/src/org/chromium/components/autofill_assistant/qr_code/AssistantQrCodeCameraScanModelWrapper.java", + "java/src/org/chromium/components/autofill_assistant/qr_code/AssistantQrCodeImagePickerModelWrapper.java", "java/src/org/chromium/components/autofill_assistant/qr_code/AssistantQrCodeNativeDelegate.java", "java/src/org/chromium/components/autofill_assistant/qr_code/AssistantQrCodeUtil.java", "java/src/org/chromium/components/autofill_assistant/trigger_scripts/AssistantTriggerScript.java", @@ -308,6 +309,7 @@ "java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayDelegate.java", "java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayModel.java", "java/src/org/chromium/components/autofill_assistant/qr_code/AssistantQrCodeCameraScanModelWrapper.java", + "java/src/org/chromium/components/autofill_assistant/qr_code/AssistantQrCodeImagePickerModelWrapper.java", "java/src/org/chromium/components/autofill_assistant/qr_code/AssistantQrCodeNativeDelegate.java", "java/src/org/chromium/components/autofill_assistant/qr_code/AssistantQrCodeUtil.java", "java/src/org/chromium/components/autofill_assistant/trigger_scripts/AssistantTriggerScriptBridge.java",
diff --git a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantModel.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantModel.java index 042e07b0..05ebfe9c 100644 --- a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantModel.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantModel.java
@@ -13,6 +13,8 @@ import org.chromium.components.autofill_assistant.header.AssistantHeaderModel; import org.chromium.components.autofill_assistant.infobox.AssistantInfoBoxModel; import org.chromium.components.autofill_assistant.overlay.AssistantOverlayModel; +import org.chromium.components.autofill_assistant.qr_code.AssistantQrCodeCameraScanModelWrapper; +import org.chromium.components.autofill_assistant.qr_code.AssistantQrCodeImagePickerModelWrapper; import org.chromium.components.autofill_assistant.user_data.AssistantCollectUserDataModel; import org.chromium.content_public.browser.WebContents; import org.chromium.ui.modelutil.PropertyModel; @@ -44,6 +46,10 @@ private final AssistantHeaderModel mHeaderModel = new AssistantHeaderModel(); private final AssistantDetailsModel mDetailsModel = new AssistantDetailsModel(); private final AssistantInfoBoxModel mInfoBoxModel = new AssistantInfoBoxModel(); + private final AssistantQrCodeCameraScanModelWrapper mQrCodeCameraScanModelWrapper = + new AssistantQrCodeCameraScanModelWrapper(); + private final AssistantQrCodeImagePickerModelWrapper mQrCodeImagePickerModelWrapper = + new AssistantQrCodeImagePickerModelWrapper(); private final AssistantCollectUserDataModel mCollectUserDataModel = new AssistantCollectUserDataModel(); private final AssistantFormModel mFormModel = new AssistantFormModel(); @@ -83,6 +89,16 @@ } @CalledByNative + public AssistantQrCodeCameraScanModelWrapper getQrCodeCameraScanModelWrapper() { + return mQrCodeCameraScanModelWrapper; + } + + @CalledByNative + public AssistantQrCodeImagePickerModelWrapper getQrCodeImagePickerModelWrapper() { + return mQrCodeImagePickerModelWrapper; + } + + @CalledByNative public AssistantCollectUserDataModel getCollectUserDataModel() { return mCollectUserDataModel; }
diff --git a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/qr_code/AssistantQrCodeCameraScanModelWrapper.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/qr_code/AssistantQrCodeCameraScanModelWrapper.java index 83dde71a..ba2fae6 100644 --- a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/qr_code/AssistantQrCodeCameraScanModelWrapper.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/qr_code/AssistantQrCodeCameraScanModelWrapper.java
@@ -19,7 +19,6 @@ /** * The AssistantQrCodeCameraScanWrapperModel constructor. */ - @CalledByNative public AssistantQrCodeCameraScanModelWrapper() { mCameraScanModel = new AssistantQrCodeCameraScanModel(); }
diff --git a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/qr_code/AssistantQrCodeImagePickerModelWrapper.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/qr_code/AssistantQrCodeImagePickerModelWrapper.java new file mode 100644 index 0000000..4b4e146 --- /dev/null +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/qr_code/AssistantQrCodeImagePickerModelWrapper.java
@@ -0,0 +1,62 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.components.autofill_assistant.qr_code; + +import org.chromium.base.annotations.CalledByNative; +import org.chromium.base.annotations.JNINamespace; +import org.chromium.components.autofill_assistant.guided_browsing.qr_code.image_picker.AssistantQrCodeImagePickerModel; + +/** + * Wrapper around the |AssistantQrCodeImagePickerModel| to manage the state for the QR Code Image + * Picker UI from the native code. + */ +@JNINamespace("autofill_assistant") +public class AssistantQrCodeImagePickerModelWrapper { + private final AssistantQrCodeImagePickerModel mImagePickerModel; + + /** + * The AssistantQrCodeImagePickerWrapperModel constructor. + */ + public AssistantQrCodeImagePickerModelWrapper() { + mImagePickerModel = new AssistantQrCodeImagePickerModel(); + } + + /** + * Returns the underlying AssistantQrCodeImagePickerModel object. + */ + AssistantQrCodeImagePickerModel getImagePickerModel() { + return mImagePickerModel; + } + + @CalledByNative + private void setDelegate(AssistantQrCodeNativeDelegate delegate) { + mImagePickerModel.setDelegate(delegate); + } + + @CalledByNative + private void setToolbarTitle(String text) { + mImagePickerModel.setToolbarTitle(text); + } + + @CalledByNative + private void setPermissionText(String text) { + mImagePickerModel.setPermissionText(text); + } + + @CalledByNative + private void setPermissionButtonText(String text) { + mImagePickerModel.setPermissionButtonText(text); + } + + @CalledByNative + private void setOpenSettingsText(String text) { + mImagePickerModel.setOpenSettingsText(text); + } + + @CalledByNative + private void setOpenSettingsButtonText(String text) { + mImagePickerModel.setOpenSettingsButtonText(text); + } +}
diff --git a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/qr_code/AssistantQrCodeUtil.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/qr_code/AssistantQrCodeUtil.java index b2d97833..8993673 100644 --- a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/qr_code/AssistantQrCodeUtil.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/qr_code/AssistantQrCodeUtil.java
@@ -15,11 +15,19 @@ */ @JNINamespace("autofill_assistant") public class AssistantQrCodeUtil { - /** Prompts the user for QR Code Scanning. */ + /** Prompts the user for QR Code Scanning via Camera Preview. */ @CalledByNative private static void promptQrCodeCameraScan(AssistantDependencies dependencies, AssistantQrCodeCameraScanModelWrapper cameraScanModelWrapper) { AssistantQrCodeController.promptQrCodeCameraScan(dependencies.getActivity(), dependencies.getWindowAndroid(), cameraScanModelWrapper.getCameraScanModel()); } + + /** Prompts the user for QR Code Scanning via Image Picker. */ + @CalledByNative + private static void promptQrCodeImagePicker(AssistantDependencies dependencies, + AssistantQrCodeImagePickerModelWrapper imagePickerModelWrapper) { + AssistantQrCodeController.promptQrCodeImagePicker(dependencies.getActivity(), + dependencies.getWindowAndroid(), imagePickerModelWrapper.getImagePickerModel()); + } }
diff --git a/components/autofill_assistant/browser/actions/prompt_qr_code_scan_action.cc b/components/autofill_assistant/browser/actions/prompt_qr_code_scan_action.cc index 24b49a71..c4b9da1 100644 --- a/components/autofill_assistant/browser/actions/prompt_qr_code_scan_action.cc +++ b/components/autofill_assistant/browser/actions/prompt_qr_code_scan_action.cc
@@ -34,17 +34,31 @@ } // Validate that all UI strings are available. - const PromptQrCodeScanProto_CameraScanUiStrings* camera_scan_ui_strings = - &proto_.prompt_qr_code_scan().camera_scan_ui_strings(); - if (camera_scan_ui_strings->title_text().empty() || - camera_scan_ui_strings->permission_text().empty() || - camera_scan_ui_strings->permission_button_text().empty() || - camera_scan_ui_strings->open_settings_text().empty() || - camera_scan_ui_strings->open_settings_button_text().empty() || - camera_scan_ui_strings->camera_preview_instruction_text().empty()) { - VLOG(1) << "Invalid action: camera_scan_ui_strings not set"; - EndAction(ClientStatus(INVALID_ACTION), /* value= */ absl::nullopt); - return; + if (proto_.prompt_qr_code_scan().use_gallery()) { + const PromptQrCodeScanProto::ImagePickerUiStrings& image_picker_ui_strings = + proto_.prompt_qr_code_scan().image_picker_ui_strings(); + if (image_picker_ui_strings.title_text().empty() || + image_picker_ui_strings.permission_text().empty() || + image_picker_ui_strings.permission_button_text().empty() || + image_picker_ui_strings.open_settings_text().empty() || + image_picker_ui_strings.open_settings_button_text().empty()) { + VLOG(1) << "Invalid action: one or more image_picker_ui_strings not set"; + EndAction(ClientStatus(INVALID_ACTION), /* value= */ absl::nullopt); + return; + } + } else { + const PromptQrCodeScanProto::CameraScanUiStrings& camera_scan_ui_strings = + proto_.prompt_qr_code_scan().camera_scan_ui_strings(); + if (camera_scan_ui_strings.title_text().empty() || + camera_scan_ui_strings.permission_text().empty() || + camera_scan_ui_strings.permission_button_text().empty() || + camera_scan_ui_strings.open_settings_text().empty() || + camera_scan_ui_strings.open_settings_button_text().empty() || + camera_scan_ui_strings.camera_preview_instruction_text().empty()) { + VLOG(1) << "Invalid action: one or more camera_scan_ui_strings not set"; + EndAction(ClientStatus(INVALID_ACTION), /* value= */ absl::nullopt); + return; + } } delegate_->Prompt(/* user_actions = */ nullptr,
diff --git a/components/autofill_assistant/browser/actions/prompt_qr_code_scan_action_unittest.cc b/components/autofill_assistant/browser/actions/prompt_qr_code_scan_action_unittest.cc index 4af525a..1790fac 100644 --- a/components/autofill_assistant/browser/actions/prompt_qr_code_scan_action_unittest.cc +++ b/components/autofill_assistant/browser/actions/prompt_qr_code_scan_action_unittest.cc
@@ -58,38 +58,66 @@ "Camera preview instruction text"); } + void setImagePickerUiStrings() { + proto_.mutable_image_picker_ui_strings()->set_title_text("Title text"); + proto_.mutable_image_picker_ui_strings()->set_permission_text( + "Permission text"); + proto_.mutable_image_picker_ui_strings()->set_permission_button_text( + "Permission button text"); + proto_.mutable_image_picker_ui_strings()->set_open_settings_text( + "Open settings text"); + proto_.mutable_image_picker_ui_strings()->set_open_settings_button_text( + "Open settings button text"); + } + + void testQrCodeSuccessfullyPromptsAndGetsScanResult() { + InSequence seq; + EXPECT_CALL(mock_action_delegate_, Prompt).Times(1); + EXPECT_CALL(mock_action_delegate_, ShowQrCodeScanUi) + .WillOnce(RunOnceCallback<1>( + ClientStatus(ACTION_APPLIED), + SimpleValue(std::string(kDefaultQrCodeScanResult), + /* is_client_side_only= */ true))); + + EXPECT_CALL(mock_action_delegate_, ClearQrCodeScanUi).Times(1); + EXPECT_CALL(mock_action_delegate_, CleanUpAfterPrompt).Times(1); + EXPECT_CALL( + callback_, + Run(Pointee(Property(&ProcessedActionProto::status, ACTION_APPLIED)))); + + Run(); + + EXPECT_EQ(*user_model_.GetValue(kDefaultOutputClientMemoryKey), + SimpleValue(std::string(kDefaultQrCodeScanResult), + /* is_client_side_only= */ true)); + } + UserModel user_model_; MockActionDelegate mock_action_delegate_; base::MockCallback<Action::ProcessActionCallback> callback_; PromptQrCodeScanProto proto_; }; -TEST_F(PromptQrCodeScanActionTest, SuccessfullyPromptsAndGetQrCodeScanResult) { +TEST_F(PromptQrCodeScanActionTest, + SuccessfullyPromptsAndGetQrCodeCameraScanResult) { + proto_.set_use_gallery(false); proto_.set_output_client_memory_key(kDefaultOutputClientMemoryKey); setCameraScanUiStrings(); - InSequence seq; - EXPECT_CALL(mock_action_delegate_, Prompt).Times(1); - EXPECT_CALL(mock_action_delegate_, ShowQrCodeScanUi) - .WillOnce( - RunOnceCallback<1>(ClientStatus(ACTION_APPLIED), - SimpleValue(std::string(kDefaultQrCodeScanResult), - /* is_client_side_only= */ true))); + testQrCodeSuccessfullyPromptsAndGetsScanResult(); +} - EXPECT_CALL(mock_action_delegate_, ClearQrCodeScanUi).Times(1); - EXPECT_CALL(mock_action_delegate_, CleanUpAfterPrompt).Times(1); - EXPECT_CALL( - callback_, - Run(Pointee(Property(&ProcessedActionProto::status, ACTION_APPLIED)))); +TEST_F(PromptQrCodeScanActionTest, + SuccessfullyPromptsAndGetQrCodeImagePickerResult) { + proto_.set_use_gallery(true); + proto_.set_output_client_memory_key(kDefaultOutputClientMemoryKey); + setImagePickerUiStrings(); - Run(); - - EXPECT_EQ(*user_model_.GetValue(kDefaultOutputClientMemoryKey), - SimpleValue(std::string(kDefaultQrCodeScanResult), - /* is_client_side_only= */ true)); + testQrCodeSuccessfullyPromptsAndGetsScanResult(); } TEST_F(PromptQrCodeScanActionTest, FailsWhenOutputClientMemoryKeyIsNotSet) { + proto_.set_use_gallery(false); setCameraScanUiStrings(); EXPECT_CALL( @@ -100,7 +128,23 @@ } TEST_F(PromptQrCodeScanActionTest, FailsWhenCameraScanUiStringsAreNotSet) { + proto_.set_use_gallery(false); proto_.set_output_client_memory_key(kDefaultOutputClientMemoryKey); + // Should be ignored because use_gallery=false. + setImagePickerUiStrings(); + + EXPECT_CALL( + callback_, + Run(Pointee(Property(&ProcessedActionProto::status, INVALID_ACTION)))); + + Run(); +} + +TEST_F(PromptQrCodeScanActionTest, FailsWhenImagePickerUiStringsAreNotSet) { + proto_.set_use_gallery(true); + proto_.set_output_client_memory_key(kDefaultOutputClientMemoryKey); + // Should be ignored because use_gallery=true. + setCameraScanUiStrings(); EXPECT_CALL( callback_,
diff --git a/components/autofill_assistant/browser/android/BUILD.gn b/components/autofill_assistant/browser/android/BUILD.gn index 5d44c2e13..df4d0d09 100644 --- a/components/autofill_assistant/browser/android/BUILD.gn +++ b/components/autofill_assistant/browser/android/BUILD.gn
@@ -18,6 +18,10 @@ "assistant_header_model.h", "assistant_overlay_delegate.cc", "assistant_overlay_delegate.h", + "assistant_qr_code_camera_scan_model_wrapper.cc", + "assistant_qr_code_camera_scan_model_wrapper.h", + "assistant_qr_code_image_picker_model_wrapper.cc", + "assistant_qr_code_image_picker_model_wrapper.h", "assistant_qr_code_native_delegate.cc", "assistant_qr_code_native_delegate.h", "client_android.cc",
diff --git a/components/autofill_assistant/browser/android/assistant_qr_code_camera_scan_model_wrapper.cc b/components/autofill_assistant/browser/android/assistant_qr_code_camera_scan_model_wrapper.cc new file mode 100644 index 0000000..ae853924 --- /dev/null +++ b/components/autofill_assistant/browser/android/assistant_qr_code_camera_scan_model_wrapper.cc
@@ -0,0 +1,75 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/autofill_assistant/browser/android/assistant_qr_code_camera_scan_model_wrapper.h" + +#include "base/android/jni_string.h" +#include "components/autofill_assistant/android/jni_headers/AssistantQrCodeCameraScanModelWrapper_jni.h" + +using base::android::AttachCurrentThread; +using base::android::ConvertUTF8ToJavaString; + +namespace autofill_assistant { + +AssistantQrCodeCameraScanModelWrapper::AssistantQrCodeCameraScanModelWrapper( + const base::android::ScopedJavaLocalRef<jobject>& + java_assistant_camera_scan_model_wrapper) { + jni_env_ = AttachCurrentThread(); + java_assistant_camera_scan_model_wrapper_ = + java_assistant_camera_scan_model_wrapper; +} + +AssistantQrCodeCameraScanModelWrapper:: + ~AssistantQrCodeCameraScanModelWrapper() = default; + +void AssistantQrCodeCameraScanModelWrapper::SetDelegate( + const base::android::ScopedJavaGlobalRef<jobject>& + java_qr_code_native_delegate) { + Java_AssistantQrCodeCameraScanModelWrapper_setDelegate( + jni_env_, java_assistant_camera_scan_model_wrapper_, + java_qr_code_native_delegate); +} + +void AssistantQrCodeCameraScanModelWrapper::SetToolbarTitle( + const std::string& title_text) { + Java_AssistantQrCodeCameraScanModelWrapper_setToolbarTitle( + jni_env_, java_assistant_camera_scan_model_wrapper_, + ConvertUTF8ToJavaString(jni_env_, title_text)); +} + +void AssistantQrCodeCameraScanModelWrapper::SetPermissionText( + const std::string& permission_text) { + Java_AssistantQrCodeCameraScanModelWrapper_setPermissionText( + jni_env_, java_assistant_camera_scan_model_wrapper_, + ConvertUTF8ToJavaString(jni_env_, permission_text)); +} + +void AssistantQrCodeCameraScanModelWrapper::SetPermissionButtonText( + const std::string& permission_button_text) { + Java_AssistantQrCodeCameraScanModelWrapper_setPermissionButtonText( + jni_env_, java_assistant_camera_scan_model_wrapper_, + ConvertUTF8ToJavaString(jni_env_, permission_button_text)); +} + +void AssistantQrCodeCameraScanModelWrapper::SetOpenSettingsText( + const std::string& open_settings_text) { + Java_AssistantQrCodeCameraScanModelWrapper_setOpenSettingsText( + jni_env_, java_assistant_camera_scan_model_wrapper_, + ConvertUTF8ToJavaString(jni_env_, open_settings_text)); +} + +void AssistantQrCodeCameraScanModelWrapper::SetOpenSettingsButtonText( + const std::string& open_settings_button_text) { + Java_AssistantQrCodeCameraScanModelWrapper_setOpenSettingsButtonText( + jni_env_, java_assistant_camera_scan_model_wrapper_, + ConvertUTF8ToJavaString(jni_env_, open_settings_button_text)); +} + +void AssistantQrCodeCameraScanModelWrapper::SetCameraPreviewInstructionText( + const std::string& camera_preview_instruction_text) { + Java_AssistantQrCodeCameraScanModelWrapper_setOverlayTitle( + jni_env_, java_assistant_camera_scan_model_wrapper_, + ConvertUTF8ToJavaString(jni_env_, camera_preview_instruction_text)); +} +} // namespace autofill_assistant \ No newline at end of file
diff --git a/components/autofill_assistant/browser/android/assistant_qr_code_camera_scan_model_wrapper.h b/components/autofill_assistant/browser/android/assistant_qr_code_camera_scan_model_wrapper.h new file mode 100644 index 0000000..c695fc5 --- /dev/null +++ b/components/autofill_assistant/browser/android/assistant_qr_code_camera_scan_model_wrapper.h
@@ -0,0 +1,42 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_ANDROID_ASSISTANT_QR_CODE_CAMERA_SCAN_MODEL_WRAPPER_H_ +#define COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_ANDROID_ASSISTANT_QR_CODE_CAMERA_SCAN_MODEL_WRAPPER_H_ + +#include <string> + +#include "base/android/jni_android.h" +#include "base/android/scoped_java_ref.h" +#include "components/autofill_assistant/browser/android/assistant_qr_code_native_delegate.h" + +namespace autofill_assistant { + +// C++ equivalent to java-side |AssistantQrCodeCameraScanModelWrapper|. +class AssistantQrCodeCameraScanModelWrapper { + public: + explicit AssistantQrCodeCameraScanModelWrapper( + const base::android::ScopedJavaLocalRef<jobject>& + java_assistant_camera_scan_model_wrapper); + ~AssistantQrCodeCameraScanModelWrapper(); + + void SetDelegate(const base::android::ScopedJavaGlobalRef<jobject>& + java_qr_code_native_delegate); + void SetToolbarTitle(const std::string& title_text); + void SetPermissionText(const std::string& permission_text); + void SetPermissionButtonText(const std::string& permission_button_text); + void SetOpenSettingsText(const std::string& open_settings_text); + void SetOpenSettingsButtonText(const std::string& open_settings_button_text); + void SetCameraPreviewInstructionText( + const std::string& camera_preview_instruction_text); + + private: + JNIEnv* jni_env_; + // Java-side AssistantQrCodeCameraScanModelWrapper object. + base::android::ScopedJavaLocalRef<jobject> + java_assistant_camera_scan_model_wrapper_; +}; +} // namespace autofill_assistant + +#endif // COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_ANDROID_ASSISTANT_QR_CODE_CAMERA_SCAN_MODEL_WRAPPER_H_ \ No newline at end of file
diff --git a/components/autofill_assistant/browser/android/assistant_qr_code_image_picker_model_wrapper.cc b/components/autofill_assistant/browser/android/assistant_qr_code_image_picker_model_wrapper.cc new file mode 100644 index 0000000..5f281e7 --- /dev/null +++ b/components/autofill_assistant/browser/android/assistant_qr_code_image_picker_model_wrapper.cc
@@ -0,0 +1,68 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/autofill_assistant/browser/android/assistant_qr_code_image_picker_model_wrapper.h" + +#include "base/android/jni_string.h" +#include "components/autofill_assistant/android/jni_headers/AssistantQrCodeImagePickerModelWrapper_jni.h" + +using base::android::AttachCurrentThread; +using base::android::ConvertUTF8ToJavaString; + +namespace autofill_assistant { + +AssistantQrCodeImagePickerModelWrapper::AssistantQrCodeImagePickerModelWrapper( + const base::android::ScopedJavaLocalRef<jobject>& + java_assistant_image_picker_model_wrapper) { + jni_env_ = AttachCurrentThread(); + java_assistant_image_picker_model_wrapper_ = + java_assistant_image_picker_model_wrapper; +} + +AssistantQrCodeImagePickerModelWrapper:: + ~AssistantQrCodeImagePickerModelWrapper() = default; + +void AssistantQrCodeImagePickerModelWrapper::SetDelegate( + const base::android::ScopedJavaGlobalRef<jobject>& + java_qr_code_native_delegate) { + Java_AssistantQrCodeImagePickerModelWrapper_setDelegate( + jni_env_, java_assistant_image_picker_model_wrapper_, + java_qr_code_native_delegate); +} + +void AssistantQrCodeImagePickerModelWrapper::SetToolbarTitle( + const std::string& title_text) { + Java_AssistantQrCodeImagePickerModelWrapper_setToolbarTitle( + jni_env_, java_assistant_image_picker_model_wrapper_, + ConvertUTF8ToJavaString(jni_env_, title_text)); +} + +void AssistantQrCodeImagePickerModelWrapper::SetPermissionText( + const std::string& permission_text) { + Java_AssistantQrCodeImagePickerModelWrapper_setPermissionText( + jni_env_, java_assistant_image_picker_model_wrapper_, + ConvertUTF8ToJavaString(jni_env_, permission_text)); +} + +void AssistantQrCodeImagePickerModelWrapper::SetPermissionButtonText( + const std::string& permission_button_text) { + Java_AssistantQrCodeImagePickerModelWrapper_setPermissionButtonText( + jni_env_, java_assistant_image_picker_model_wrapper_, + ConvertUTF8ToJavaString(jni_env_, permission_button_text)); +} + +void AssistantQrCodeImagePickerModelWrapper::SetOpenSettingsText( + const std::string& open_settings_text) { + Java_AssistantQrCodeImagePickerModelWrapper_setOpenSettingsText( + jni_env_, java_assistant_image_picker_model_wrapper_, + ConvertUTF8ToJavaString(jni_env_, open_settings_text)); +} + +void AssistantQrCodeImagePickerModelWrapper::SetOpenSettingsButtonText( + const std::string& open_settings_button_text) { + Java_AssistantQrCodeImagePickerModelWrapper_setOpenSettingsButtonText( + jni_env_, java_assistant_image_picker_model_wrapper_, + ConvertUTF8ToJavaString(jni_env_, open_settings_button_text)); +} +} // namespace autofill_assistant \ No newline at end of file
diff --git a/components/autofill_assistant/browser/android/assistant_qr_code_image_picker_model_wrapper.h b/components/autofill_assistant/browser/android/assistant_qr_code_image_picker_model_wrapper.h new file mode 100644 index 0000000..e1c6c57 --- /dev/null +++ b/components/autofill_assistant/browser/android/assistant_qr_code_image_picker_model_wrapper.h
@@ -0,0 +1,40 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_ANDROID_ASSISTANT_QR_CODE_IMAGE_PICKER_MODEL_WRAPPER_H_ +#define COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_ANDROID_ASSISTANT_QR_CODE_IMAGE_PICKER_MODEL_WRAPPER_H_ + +#include <string> + +#include "base/android/jni_android.h" +#include "base/android/scoped_java_ref.h" +#include "components/autofill_assistant/browser/android/assistant_qr_code_native_delegate.h" + +namespace autofill_assistant { + +// C++ equivalent to java-side |AssistantQrCodeImagePickerModelWrapper|. +class AssistantQrCodeImagePickerModelWrapper { + public: + explicit AssistantQrCodeImagePickerModelWrapper( + const base::android::ScopedJavaLocalRef<jobject>& + java_assistant_image_picker_model_wrapper); + ~AssistantQrCodeImagePickerModelWrapper(); + + void SetDelegate(const base::android::ScopedJavaGlobalRef<jobject>& + java_qr_code_native_delegate); + void SetToolbarTitle(const std::string& title_text); + void SetPermissionText(const std::string& permission_text); + void SetPermissionButtonText(const std::string& permission_button_text); + void SetOpenSettingsText(const std::string& open_settings_text); + void SetOpenSettingsButtonText(const std::string& open_settings_button_text); + + private: + JNIEnv* jni_env_; + // Java-side AssistantQrCodeImagePickerModelWrapper object. + base::android::ScopedJavaLocalRef<jobject> + java_assistant_image_picker_model_wrapper_; +}; +} // namespace autofill_assistant + +#endif // COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_ANDROID_ASSISTANT_QR_CODE_IMAGE_PICKER_MODEL_WRAPPER_H_ \ No newline at end of file
diff --git a/components/autofill_assistant/browser/android/assistant_qr_code_native_delegate.cc b/components/autofill_assistant/browser/android/assistant_qr_code_native_delegate.cc index e66a4b5..c2461ad 100644 --- a/components/autofill_assistant/browser/android/assistant_qr_code_native_delegate.cc +++ b/components/autofill_assistant/browser/android/assistant_qr_code_native_delegate.cc
@@ -40,29 +40,26 @@ void AssistantQrCodeNativeDelegate::OnScanCancelled( JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller) { - // TODO(b/238079150): Add custom ClientStatus - ui_controller_->OnQrCodeScanFinished(ClientStatus(OTHER_ACTION_STATUS), + ui_controller_->OnQrCodeScanFinished(ClientStatus(QR_CODE_SCAN_CANCELLED), absl::nullopt); } void AssistantQrCodeNativeDelegate::OnScanFailure( JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller) { - // TODO(b/238079150): Add custom ClientStatus - ui_controller_->OnQrCodeScanFinished(ClientStatus(OTHER_ACTION_STATUS), + ui_controller_->OnQrCodeScanFinished(ClientStatus(QR_CODE_SCAN_FAILURE), absl::nullopt); } void AssistantQrCodeNativeDelegate::OnCameraError( JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller) { - // TODO(b/238079150): Add custom ClientStatus - ui_controller_->OnQrCodeScanFinished(ClientStatus(OTHER_ACTION_STATUS), + ui_controller_->OnQrCodeScanFinished(ClientStatus(QR_CODE_SCAN_CAMERA_ERROR), absl::nullopt); } base::android::ScopedJavaGlobalRef<jobject> -AssistantQrCodeNativeDelegate::GetJavaObject() { +AssistantQrCodeNativeDelegate::GetJavaObject() const { return java_assistant_qr_code_native_delegate_; }
diff --git a/components/autofill_assistant/browser/android/assistant_qr_code_native_delegate.h b/components/autofill_assistant/browser/android/assistant_qr_code_native_delegate.h index a3199ea..6a97a11 100644 --- a/components/autofill_assistant/browser/android/assistant_qr_code_native_delegate.h +++ b/components/autofill_assistant/browser/android/assistant_qr_code_native_delegate.h
@@ -42,7 +42,7 @@ void OnCameraError(JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller); - base::android::ScopedJavaGlobalRef<jobject> GetJavaObject(); + base::android::ScopedJavaGlobalRef<jobject> GetJavaObject() const; private: raw_ptr<UiControllerAndroid> ui_controller_;
diff --git a/components/autofill_assistant/browser/android/ui_controller_android.cc b/components/autofill_assistant/browser/android/ui_controller_android.cc index 9a69998..8321159c 100644 --- a/components/autofill_assistant/browser/android/ui_controller_android.cc +++ b/components/autofill_assistant/browser/android/ui_controller_android.cc
@@ -29,7 +29,6 @@ #include "components/autofill_assistant/android/jni_headers/AssistantModel_jni.h" #include "components/autofill_assistant/android/jni_headers/AssistantOverlayModel_jni.h" #include "components/autofill_assistant/android/jni_headers/AssistantPlaceholdersConfiguration_jni.h" -#include "components/autofill_assistant/android/jni_headers/AssistantQrCodeCameraScanModelWrapper_jni.h" #include "components/autofill_assistant/android/jni_headers/AssistantQrCodeUtil_jni.h" #include "components/autofill_assistant/android/jni_headers/AutofillAssistantUiController_jni.h" #include "components/autofill_assistant/browser/android/client_android.h" @@ -204,6 +203,84 @@ return input_result.selection().selected(selection_index); } +/* + * Sets the QR Code delegate object and the UI strings for java side + * AssistantQrCodeImagePickerModelWrapper. It then triggers java util function + * to prompt QR Code Scanning via Image Picker. + */ +void PromptQrCodeImagePicker( + JNIEnv* env, + base::android::ScopedJavaGlobalRef<jobject> + java_ui_controller_android_object, + const PromptQrCodeScanProto_ImagePickerUiStrings* image_picker_ui_strings, + base::android::ScopedJavaLocalRef<jobject> + java_qr_code_image_picker_model_wrapper, + base::android::ScopedJavaGlobalRef<jobject> java_qr_code_native_delegate) { + AssistantQrCodeImagePickerModelWrapper qr_code_image_picker_model_wrapper( + java_qr_code_image_picker_model_wrapper); + + // Register delegate for the QR Code Image Picker UI + qr_code_image_picker_model_wrapper.SetDelegate(java_qr_code_native_delegate); + + // Set UI strings in model + qr_code_image_picker_model_wrapper.SetToolbarTitle( + image_picker_ui_strings->title_text()); + qr_code_image_picker_model_wrapper.SetPermissionText( + image_picker_ui_strings->permission_text()); + qr_code_image_picker_model_wrapper.SetPermissionButtonText( + image_picker_ui_strings->permission_button_text()); + qr_code_image_picker_model_wrapper.SetOpenSettingsText( + image_picker_ui_strings->open_settings_text()); + qr_code_image_picker_model_wrapper.SetOpenSettingsButtonText( + image_picker_ui_strings->open_settings_button_text()); + + Java_AssistantQrCodeUtil_promptQrCodeImagePicker( + env, + Java_AutofillAssistantUiController_getDependencies( + env, java_ui_controller_android_object), + java_qr_code_image_picker_model_wrapper); +} + +/* + * Sets the QR Code delegate object and the UI strings for java side + * AssistantQrCodeCameraScanModelWrapper. It then triggers java util function + * to prompt QR Code Scanning via Camera Preview. + */ +void PromptQrCodeCameraScan( + JNIEnv* env, + base::android::ScopedJavaGlobalRef<jobject> + java_ui_controller_android_object, + const PromptQrCodeScanProto_CameraScanUiStrings* camera_scan_ui_strings, + base::android::ScopedJavaLocalRef<jobject> + java_qr_code_camera_scan_model_wrapper, + base::android::ScopedJavaGlobalRef<jobject> java_qr_code_native_delegate) { + AssistantQrCodeCameraScanModelWrapper qr_code_camera_scan_model_wrapper( + java_qr_code_camera_scan_model_wrapper); + + // Register delegate for the QR Code Camera Scan UI + qr_code_camera_scan_model_wrapper.SetDelegate(java_qr_code_native_delegate); + + // Set UI strings in model + qr_code_camera_scan_model_wrapper.SetToolbarTitle( + camera_scan_ui_strings->title_text()); + qr_code_camera_scan_model_wrapper.SetPermissionText( + camera_scan_ui_strings->permission_text()); + qr_code_camera_scan_model_wrapper.SetPermissionButtonText( + camera_scan_ui_strings->permission_button_text()); + qr_code_camera_scan_model_wrapper.SetOpenSettingsText( + camera_scan_ui_strings->open_settings_text()); + qr_code_camera_scan_model_wrapper.SetOpenSettingsButtonText( + camera_scan_ui_strings->open_settings_button_text()); + qr_code_camera_scan_model_wrapper.SetCameraPreviewInstructionText( + camera_scan_ui_strings->camera_preview_instruction_text()); + + Java_AssistantQrCodeUtil_promptQrCodeCameraScan( + env, + Java_AutofillAssistantUiController_getDependencies( + env, java_ui_controller_android_object), + java_qr_code_camera_scan_model_wrapper); +} + // Analog to // PersonalDataManagerAndroid::GetShippingAddressLabelForPaymentRequest. base::android::ScopedJavaLocalRef<jstring> GetShippingAddressLabel( @@ -1866,45 +1943,27 @@ qr_code_native_delegate_ = std::make_unique<AssistantQrCodeNativeDelegate>(this); - const auto java_assistant_camera_scan_model_wrapper = - Java_AssistantQrCodeCameraScanModelWrapper_Constructor(env); + base::android::ScopedJavaGlobalRef<jobject> java_qr_code_native_delegate = + qr_code_native_delegate_->GetJavaObject(); - // Register qr_code_native_delegate_ as delegate for the QR Code Camera Scan - // UI - Java_AssistantQrCodeCameraScanModelWrapper_setDelegate( - env, java_assistant_camera_scan_model_wrapper, - qr_code_native_delegate_->GetJavaObject()); + if (qr_code_scan->use_gallery()) { + // Create a model to manage state of QR Code Scanning via Image Picker. + const auto java_assistant_image_picker_model_wrapper = + Java_AssistantModel_getQrCodeImagePickerModelWrapper(env, GetModel()); - // Set UI strings in model - const PromptQrCodeScanProto_CameraScanUiStrings* camera_scan_ui_strings = - &qr_code_scan->camera_scan_ui_strings(); - Java_AssistantQrCodeCameraScanModelWrapper_setToolbarTitle( - env, java_assistant_camera_scan_model_wrapper, - ConvertUTF8ToJavaString(env, camera_scan_ui_strings->title_text())); - Java_AssistantQrCodeCameraScanModelWrapper_setPermissionText( - env, java_assistant_camera_scan_model_wrapper, - ConvertUTF8ToJavaString(env, camera_scan_ui_strings->permission_text())); - Java_AssistantQrCodeCameraScanModelWrapper_setPermissionButtonText( - env, java_assistant_camera_scan_model_wrapper, - ConvertUTF8ToJavaString( - env, camera_scan_ui_strings->permission_button_text())); - Java_AssistantQrCodeCameraScanModelWrapper_setOpenSettingsText( - env, java_assistant_camera_scan_model_wrapper, - ConvertUTF8ToJavaString(env, - camera_scan_ui_strings->open_settings_text())); - Java_AssistantQrCodeCameraScanModelWrapper_setOpenSettingsButtonText( - env, java_assistant_camera_scan_model_wrapper, - ConvertUTF8ToJavaString( - env, camera_scan_ui_strings->open_settings_button_text())); - Java_AssistantQrCodeCameraScanModelWrapper_setOverlayTitle( - env, java_assistant_camera_scan_model_wrapper, - ConvertUTF8ToJavaString( - env, camera_scan_ui_strings->camera_preview_instruction_text())); + PromptQrCodeImagePicker(env, java_object_, + &qr_code_scan->image_picker_ui_strings(), + java_assistant_image_picker_model_wrapper, + java_qr_code_native_delegate); + } else { + // Create a model to manage state of QR Code Scanning via Camera Preview. + const auto java_assistant_camera_scan_model_wrapper = + Java_AssistantModel_getQrCodeCameraScanModelWrapper(env, GetModel()); - Java_AssistantQrCodeUtil_promptQrCodeCameraScan( - env, - Java_AutofillAssistantUiController_getDependencies(env, java_object_), - java_assistant_camera_scan_model_wrapper); + PromptQrCodeCameraScan( + env, java_object_, &qr_code_scan->camera_scan_ui_strings(), + java_assistant_camera_scan_model_wrapper, java_qr_code_native_delegate); + } } void UiControllerAndroid::OnGenericUserInterfaceChanged(
diff --git a/components/autofill_assistant/browser/android/ui_controller_android.h b/components/autofill_assistant/browser/android/ui_controller_android.h index 450afc5..b4640cb 100644 --- a/components/autofill_assistant/browser/android/ui_controller_android.h +++ b/components/autofill_assistant/browser/android/ui_controller_android.h
@@ -19,6 +19,8 @@ #include "components/autofill_assistant/browser/android/assistant_header_delegate.h" #include "components/autofill_assistant/browser/android/assistant_header_model.h" #include "components/autofill_assistant/browser/android/assistant_overlay_delegate.h" +#include "components/autofill_assistant/browser/android/assistant_qr_code_camera_scan_model_wrapper.h" +#include "components/autofill_assistant/browser/android/assistant_qr_code_image_picker_model_wrapper.h" #include "components/autofill_assistant/browser/android/assistant_qr_code_native_delegate.h" #include "components/autofill_assistant/browser/android/dependencies_android.h" #include "components/autofill_assistant/browser/chip.h" @@ -257,7 +259,6 @@ base::android::ScopedJavaLocalRef<jobject> GetDetailsModel(); base::android::ScopedJavaLocalRef<jobject> GetInfoBoxModel(); base::android::ScopedJavaLocalRef<jobject> GetCollectUserDataModel(); - base::android::ScopedJavaLocalRef<jobject> GetQrCodeCameraScanWrapperModel(); base::android::ScopedJavaLocalRef<jobject> GetFormModel(); base::android::ScopedJavaLocalRef<jobject> GetGenericUiModel(); base::android::ScopedJavaLocalRef<jobject> GetPersistentGenericUiModel();
diff --git a/components/autofill_assistant/browser/client_status.cc b/components/autofill_assistant/browser/client_status.cc index 3aca1ba3..a2001dcc 100644 --- a/components/autofill_assistant/browser/client_status.cc +++ b/components/autofill_assistant/browser/client_status.cc
@@ -170,6 +170,15 @@ case ProcessedActionStatusProto::JS_FORCED_ROUNDTRIP: out << "JS_FORCED_ROUNDTRIP"; break; + case ProcessedActionStatusProto::QR_CODE_SCAN_CANCELLED: + out << "QR_CODE_SCAN_CANCELLED"; + break; + case ProcessedActionStatusProto::QR_CODE_SCAN_FAILURE: + out << "QR_CODE_SCAN_FAILURE"; + break; + case ProcessedActionStatusProto::QR_CODE_SCAN_CAMERA_ERROR: + out << "QR_CODE_SCAN_CAMERA_ERROR"; + break; // Intentionally no default case to make compilation fail if a new value // was added to the enum but not to this list.
diff --git a/components/autofill_assistant/browser/model.proto b/components/autofill_assistant/browser/model.proto index 37e90ce1..b188033 100644 --- a/components/autofill_assistant/browser/model.proto +++ b/components/autofill_assistant/browser/model.proto
@@ -87,7 +87,7 @@ // a boolean field would have. message Empty {} -// Next Id: 40 +// Next Id: 43 enum ProcessedActionStatusProto { UNKNOWN_ACTION_STATUS = 0; @@ -241,6 +241,19 @@ // The js flow action forced an additional roundtrip. JS_FORCED_ROUNDTRIP = 39; + // The QR code scan returned without populating data in client memory. + // Possible causes: + // - The user did not give an image with a valid QR code. + QR_CODE_SCAN_FAILURE = 40; + + // The QR code scan was cancelled by the user. + // Possible causes: + // - The user pressed back button or clicked on cancel icon. + QR_CODE_SCAN_CANCELLED = 41; + + // The QR code scan failed because of some camera issues. + QR_CODE_SCAN_CAMERA_ERROR = 42; + reserved 15, 23, 25, 32, 36; }
diff --git a/components/autofill_assistant/browser/service.proto b/components/autofill_assistant/browser/service.proto index a1e9a9648..cc9395c 100644 --- a/components/autofill_assistant/browser/service.proto +++ b/components/autofill_assistant/browser/service.proto
@@ -1865,9 +1865,34 @@ optional string camera_preview_instruction_text = 6; } + // UI strings shown to the user during QR Code Scanning via Image Picker. + message ImagePickerUiStrings { + // Text to be displayed as title on Toolbar. + optional string title_text = 1; + + // Text to ask users to grant permission to access images. + optional string permission_text = 2; + + // Text on action button while asking users to grant permission to + // access images. + optional string permission_button_text = 3; + + // Text to ask users to grant media permissions by going into system + // settings. + optional string open_settings_text = 4; + + // Text on action button while asking users to grant media permissions + // by going into system settings. + optional string open_settings_button_text = 5; + } + // UI strings shown during camera scan. This is a mandatory field when QR Code // Scanning via Camera Preview is to be triggered. optional CameraScanUiStrings camera_scan_ui_strings = 3; + + // UI strings shown during image picker. This is a mandatory field when QR + // Code Scanning via Image Picker is to be triggered. + optional ImagePickerUiStrings image_picker_ui_strings = 4; } // Contain a localized text message from the server.
diff --git a/components/bookmarks/browser/bookmark_model.cc b/components/bookmarks/browser/bookmark_model.cc index e7b24c9..db913823 100644 --- a/components/bookmarks/browser/bookmark_model.cc +++ b/components/bookmarks/browser/bookmark_model.cc
@@ -154,11 +154,12 @@ expanded_state_tracker_ = std::make_unique<BookmarkExpandedStateTracker>(this, pref_service); - store_ = std::make_unique<BookmarkStorage>(this, profile_path); + const base::FilePath file_path = profile_path.Append(kBookmarksFileName); + + store_ = std::make_unique<BookmarkStorage>(this, file_path); // Creating ModelLoader schedules the load on a backend task runner. model_loader_ = ModelLoader::Create( - profile_path.Append(kBookmarksFileName), - std::make_unique<BookmarkLoadDetails>(client_.get()), + file_path, std::make_unique<BookmarkLoadDetails>(client_.get()), base::BindOnce(&BookmarkModel::DoneLoading, AsWeakPtr())); }
diff --git a/components/bookmarks/browser/bookmark_storage.cc b/components/bookmarks/browser/bookmark_storage.cc index 915b967..ff9508e 100644 --- a/components/bookmarks/browser/bookmark_storage.cc +++ b/components/bookmarks/browser/bookmark_storage.cc
@@ -22,7 +22,6 @@ #include "components/bookmarks/browser/bookmark_codec.h" #include "components/bookmarks/browser/bookmark_model.h" #include "components/bookmarks/browser/bookmark_node.h" -#include "components/bookmarks/common/bookmark_constants.h" #include "components/bookmarks/common/bookmark_metrics.h" namespace bookmarks { @@ -43,15 +42,12 @@ constexpr base::TimeDelta BookmarkStorage::kSaveDelay; BookmarkStorage::BookmarkStorage(BookmarkModel* model, - const base::FilePath& profile_path) + const base::FilePath& file_path) : model_(model), backend_task_runner_(base::ThreadPool::CreateSequencedTaskRunner( {base::MayBlock(), base::TaskPriority::BEST_EFFORT, base::TaskShutdownBehavior::BLOCK_SHUTDOWN})), - writer_(profile_path.Append(kBookmarksFileName), - backend_task_runner_, - kSaveDelay, - "BookmarkStorage"), + writer_(file_path, backend_task_runner_, kSaveDelay, "BookmarkStorage"), last_scheduled_save_(base::TimeTicks::Now()) {} BookmarkStorage::~BookmarkStorage() {
diff --git a/components/bookmarks/browser/bookmark_storage.h b/components/bookmarks/browser/bookmark_storage.h index e858258..81a518b 100644 --- a/components/bookmarks/browser/bookmark_storage.h +++ b/components/bookmarks/browser/bookmark_storage.h
@@ -36,9 +36,10 @@ static constexpr base::TimeDelta kSaveDelay = base::Milliseconds(2500); // Creates a BookmarkStorage for the specified model. The data will saved to a - // location derived from |profile_path|. The disk writes will be executed as a - // task in a backend task runner. - BookmarkStorage(BookmarkModel* model, const base::FilePath& profile_path); + // file using the specified |file_path|. A backup file may be generated using + // a name derived from |file_path| (appending suffix kBackupExtension). All + // disk writes will be executed as a task in a backend task runner. + BookmarkStorage(BookmarkModel* model, const base::FilePath& file_path); BookmarkStorage(const BookmarkStorage&) = delete; BookmarkStorage& operator=(const BookmarkStorage&) = delete;
diff --git a/components/bookmarks/browser/bookmark_storage_unittest.cc b/components/bookmarks/browser/bookmark_storage_unittest.cc index c20ec55..d88c805 100644 --- a/components/bookmarks/browser/bookmark_storage_unittest.cc +++ b/components/bookmarks/browser/bookmark_storage_unittest.cc
@@ -13,7 +13,6 @@ #include "base/test/task_environment.h" #include "base/time/time.h" #include "components/bookmarks/browser/bookmark_model.h" -#include "components/bookmarks/common/bookmark_constants.h" #include "components/bookmarks/test/test_bookmark_client.h" #include "testing/gtest/include/gtest/gtest.h" @@ -36,28 +35,30 @@ std::unique_ptr<BookmarkModel> model = CreateModelWithOneBookmark(); base::ScopedTempDir temp_dir; ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + const base::FilePath bookmarks_file_path = + temp_dir.GetPath().Append(FILE_PATH_LITERAL("TestBookmarks")); base::test::TaskEnvironment task_environment{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; - BookmarkStorage storage(model.get(), temp_dir.GetPath()); + BookmarkStorage storage(model.get(), bookmarks_file_path); ASSERT_FALSE(storage.HasScheduledSaveForTesting()); - ASSERT_FALSE(base::PathExists(temp_dir.GetPath().Append(kBookmarksFileName))); + ASSERT_FALSE(base::PathExists(bookmarks_file_path)); storage.ScheduleSave(); EXPECT_TRUE(storage.HasScheduledSaveForTesting()); - EXPECT_FALSE(base::PathExists(temp_dir.GetPath().Append(kBookmarksFileName))); + EXPECT_FALSE(base::PathExists(bookmarks_file_path)); // Advance clock until immediately before saving takes place. task_environment.FastForwardBy(BookmarkStorage::kSaveDelay - base::Milliseconds(10)); EXPECT_TRUE(storage.HasScheduledSaveForTesting()); - EXPECT_FALSE(base::PathExists(temp_dir.GetPath().Append(kBookmarksFileName))); + EXPECT_FALSE(base::PathExists(bookmarks_file_path)); // Advance clock past the saving moment. task_environment.FastForwardBy(base::Milliseconds(20)); EXPECT_FALSE(storage.HasScheduledSaveForTesting()); - EXPECT_TRUE(base::PathExists(temp_dir.GetPath().Append(kBookmarksFileName))); + EXPECT_TRUE(base::PathExists(bookmarks_file_path)); histogram_tester.ExpectTotalCount( "Bookmarks.Storage.TimeSinceLastScheduledSave", 1); } @@ -66,21 +67,22 @@ std::unique_ptr<BookmarkModel> model = CreateModelWithOneBookmark(); base::ScopedTempDir temp_dir; ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + const base::FilePath bookmarks_file_path = + temp_dir.GetPath().Append(FILE_PATH_LITERAL("TestBookmarks")); { base::test::TaskEnvironment task_environment{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; - BookmarkStorage storage(model.get(), temp_dir.GetPath()); + BookmarkStorage storage(model.get(), bookmarks_file_path); storage.ScheduleSave(); ASSERT_TRUE(storage.HasScheduledSaveForTesting()); - ASSERT_FALSE( - base::PathExists(temp_dir.GetPath().Append(kBookmarksFileName))); + ASSERT_FALSE(base::PathExists(bookmarks_file_path)); } // TaskEnvironment and BookmarkStorage both have been destroyed, mimic-ing a // browser shutdown. - EXPECT_TRUE(base::PathExists(temp_dir.GetPath().Append(kBookmarksFileName))); + EXPECT_TRUE(base::PathExists(bookmarks_file_path)); } TEST(BookmarkStorageTest, ShouldGenerateBackupFileUponFirstSave) { @@ -88,7 +90,7 @@ base::ScopedTempDir temp_dir; ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); const base::FilePath bookmarks_file_path = - temp_dir.GetPath().Append(kBookmarksFileName); + temp_dir.GetPath().Append(FILE_PATH_LITERAL("TestBookmarks")); const base::FilePath backup_file_path = bookmarks_file_path.ReplaceExtension(FILE_PATH_LITERAL("bak")); @@ -97,7 +99,7 @@ base::test::TaskEnvironment task_environment{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; - BookmarkStorage storage(model.get(), temp_dir.GetPath()); + BookmarkStorage storage(model.get(), bookmarks_file_path); // The backup file should be created upon first save, not earlier. task_environment.RunUntilIdle(); @@ -124,13 +126,15 @@ std::unique_ptr<BookmarkModel> model = CreateModelWithOneBookmark(); base::ScopedTempDir temp_dir; ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + const base::FilePath bookmarks_file_path = + temp_dir.GetPath().Append(FILE_PATH_LITERAL("TestBookmarks")); base::test::TaskEnvironment task_environment{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; - BookmarkStorage storage(model.get(), temp_dir.GetPath()); + BookmarkStorage storage(model.get(), bookmarks_file_path); ASSERT_FALSE(storage.HasScheduledSaveForTesting()); - ASSERT_FALSE(base::PathExists(temp_dir.GetPath().Append(kBookmarksFileName))); + ASSERT_FALSE(base::PathExists(bookmarks_file_path)); storage.ScheduleSave(); @@ -139,12 +143,12 @@ task_environment.FastForwardBy(delay_ms); storage.ScheduleSave(); EXPECT_TRUE(storage.HasScheduledSaveForTesting()); - EXPECT_FALSE(base::PathExists(temp_dir.GetPath().Append(kBookmarksFileName))); + EXPECT_FALSE(base::PathExists(bookmarks_file_path)); // Advance clock past the saving moment. task_environment.FastForwardBy(BookmarkStorage::kSaveDelay + delay_ms); EXPECT_FALSE(storage.HasScheduledSaveForTesting()); - EXPECT_TRUE(base::PathExists(temp_dir.GetPath().Append(kBookmarksFileName))); + EXPECT_TRUE(base::PathExists(bookmarks_file_path)); histogram_tester.ExpectTotalCount( "Bookmarks.Storage.TimeSinceLastScheduledSave", 2); histogram_tester.ExpectTimeBucketCount(
diff --git a/components/bookmarks/browser/model_loader.cc b/components/bookmarks/browser/model_loader.cc index eb8a749..74f3719 100644 --- a/components/bookmarks/browser/model_loader.cc +++ b/components/bookmarks/browser/model_loader.cc
@@ -95,7 +95,7 @@ // static scoped_refptr<ModelLoader> ModelLoader::Create( - const base::FilePath& profile_path, + const base::FilePath& file_path, std::unique_ptr<BookmarkLoadDetails> details, LoadCallback callback) { // Note: base::MakeRefCounted is not available here, as ModelLoader's @@ -108,9 +108,8 @@ model_loader->backend_task_runner_->PostTaskAndReplyWithResult( FROM_HERE, - base::BindOnce( - &ModelLoader::DoLoadOnBackgroundThread, model_loader, profile_path, - std::move(details)), + base::BindOnce(&ModelLoader::DoLoadOnBackgroundThread, model_loader, + file_path, std::move(details)), std::move(callback)); return model_loader; } @@ -126,9 +125,9 @@ ModelLoader::~ModelLoader() = default; std::unique_ptr<BookmarkLoadDetails> ModelLoader::DoLoadOnBackgroundThread( - const base::FilePath& profile_path, + const base::FilePath& file_path, std::unique_ptr<BookmarkLoadDetails> details) { - LoadBookmarks(profile_path, details.get()); + LoadBookmarks(file_path, details.get()); history_bookmark_model_ = details->url_index(); loaded_signal_.Signal(); return details;
diff --git a/components/bookmarks/browser/model_loader.h b/components/bookmarks/browser/model_loader.h index b40c03a..2de7eec 100644 --- a/components/bookmarks/browser/model_loader.h +++ b/components/bookmarks/browser/model_loader.h
@@ -32,7 +32,7 @@ // Creates the ModelLoader, and schedules loading on a backend task runner. // |callback| is run once loading completes (on the main thread). static scoped_refptr<ModelLoader> Create( - const base::FilePath& profile_path, + const base::FilePath& file_path, std::unique_ptr<BookmarkLoadDetails> details, LoadCallback callback); @@ -56,7 +56,7 @@ // Performs the load on a background thread. std::unique_ptr<BookmarkLoadDetails> DoLoadOnBackgroundThread( - const base::FilePath& profile_path, + const base::FilePath& file_path, std::unique_ptr<BookmarkLoadDetails> details); scoped_refptr<base::SequencedTaskRunner> backend_task_runner_;
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb index 02d0fb7..8f2455f 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb
@@ -236,6 +236,7 @@ <translation id="6367753977865761591">Blokirajte prijavu trećih stana za određenu web lokaciju.</translation> <translation id="6388207532828177975">Obriši i vrati na zadano</translation> <translation id="6398765197997659313">Napusti prikaz preko cijelog ekrana</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Blokira web lokacijama korištenje uređaja i podataka virtuelne realnosti</translation> <translation id="6447842834002726250">Kolačići</translation> <translation id="6527303717912515753">Dijeli</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb index 5404edfb..74912c29 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb
@@ -236,6 +236,7 @@ <translation id="6367753977865761591">Bloker tredjepartslogin for et bestemt website.</translation> <translation id="6388207532828177975">Ryd og nulstil</translation> <translation id="6398765197997659313">Afslut fuld skærm</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Bloker websites fra at benytte dine virtual reality-enheder og -data</translation> <translation id="6447842834002726250">Cookies</translation> <translation id="6527303717912515753">Del</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb index df2e25f..911bfdbf 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb
@@ -236,6 +236,7 @@ <translation id="6367753977865761591">Bloquez la connexion de tiers pour un site particulier.</translation> <translation id="6388207532828177975">Effacer et réinitialiser</translation> <translation id="6398765197997659313">Quitter le mode plein écran</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Empêcher les sites d'utiliser vos appareils et vos données de réalité virtuelle</translation> <translation id="6447842834002726250">Témoins</translation> <translation id="6527303717912515753">Partager</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb index 7ac650d..d26dc2d 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb
@@ -236,6 +236,7 @@ <translation id="6367753977865761591">Blokiraj prijavu treće strane za određenu web-lokaciju.</translation> <translation id="6388207532828177975">Izbriši i poništi</translation> <translation id="6398765197997659313">Izađi iz cijelog zaslona</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Onemogući web-lokacijama da koriste uređaj i podatke virtualne stvarnosti</translation> <translation id="6447842834002726250">Kolačići</translation> <translation id="6527303717912515753">Podijeli</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb index 2a95491..2a0844f 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb
@@ -236,6 +236,7 @@ <translation id="6367753977865761591">Letilthatja a harmadik félen keresztüli bejelentkezést adott webhelyeken.</translation> <translation id="6388207532828177975">Törlés és visszaállítás</translation> <translation id="6398765197997659313">Kilépés a teljes képernyős módból</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">A virtuálisvalóság-eszközök és -adatok használatának letiltása a webhelyek számára</translation> <translation id="6447842834002726250">Cookie-k</translation> <translation id="6527303717912515753">Megosztás</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb index e347045..997c7ae 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb
@@ -220,7 +220,7 @@ <translation id="6040143037577758943">Chiudi</translation> <translation id="6042308850641462728">Altro</translation> <translation id="6064125863973209585">Download completati</translation> -<translation id="6165508094623778733">Ulteriori informazioni</translation> +<translation id="6165508094623778733">Scopri di più</translation> <translation id="6177111841848151710">Bloccata per il motore di ricerca corrente</translation> <translation id="6177128806592000436">La tua connessione a questo sito non è sicura</translation> <translation id="6181444274883918285">Aggiungi eccezione per un sito</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb index c2497c57..baffca288 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb
@@ -236,6 +236,7 @@ <translation id="6367753977865761591">მესამე მხარის მეშვეობით სისტემაში შესვლის დაბლოკვა კონკრეტული საიტისთვის.</translation> <translation id="6388207532828177975">გასუფთავება & აღდგენა</translation> <translation id="6398765197997659313">სრულეკრანიანი რეჟიმიდან გამოსვლა</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">საიტებისთვის თქვენი ვირტუალური რეალობის მოწყობილობების/მონაცემების გამოყენების დაბლოკვა</translation> <translation id="6447842834002726250">ქუქი ფაილები</translation> <translation id="6527303717912515753">გაზიარება</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb index 3c772c7ef..79cdf87 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb
@@ -236,6 +236,7 @@ <translation id="6367753977865761591">ບລັອກການເຂົ້າສູ່ລະບົບພາກສ່ວນທີສາມສຳລັບເວັບໄຊສະເພາະໃດໜຶ່ງ.</translation> <translation id="6388207532828177975">ລຶບ ແລະຕັ້ງຄ່າຄືນໃໝ່</translation> <translation id="6398765197997659313">ອອກຈາກເຕັມໜ້າຈໍ</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">ບລັອກບໍ່ໃຫ້ເວັບໄຊໃຊ້ອຸປະກອນ ແລະ ຂໍ້ມູນເວີຊົວ ຣິອາລິຕີຂອງທ່ານ</translation> <translation id="6447842834002726250">ຄຸກກີ້</translation> <translation id="6527303717912515753">ແຊຣ໌</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb index 9ded15c8..e780e56c 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb
@@ -236,6 +236,7 @@ <translation id="6367753977865761591">Блокирајте најавување на трети лица за конкретен сајт.</translation> <translation id="6388207532828177975">Исчисти и ресетирај</translation> <translation id="6398765197997659313">Излези од цел екран</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Не дозволувај сајтовите да ги користат уредот и податоците за виртуелна реалност</translation> <translation id="6447842834002726250">Колачиња</translation> <translation id="6527303717912515753">Сподели</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb index f87ffe7..fdd24f3 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb
@@ -236,6 +236,7 @@ <translation id="6367753977865761591">Sekat log masuk pihak ketiga untuk laman tertentu.</translation> <translation id="6388207532828177975">Kosongkan & tetapkan semula</translation> <translation id="6398765197997659313">Keluar daripada skrin penuh</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Sekat tapak daripada menggunakan peranti dan data realiti maya anda</translation> <translation id="6447842834002726250">Kuki</translation> <translation id="6527303717912515753">Kongsi</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb index ab2241b..bd03186 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb
@@ -236,6 +236,7 @@ <translation id="6367753977865761591">သတ်မှတ်ဝဘ်ဆိုက်အတွက် ပြင်ပအဖွဲ့အစည်းသို့ လက်မှတ်ထိုးဝင်ခြင်းကို ပိတ်နိုင်သည်။</translation> <translation id="6388207532828177975">ရှင်းလင်းပြီး ပြန်လည်သတ်မှတ်မည်</translation> <translation id="6398765197997659313">မျက်နှာပြင် အပြည့်မှ ထွက်ရန်</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">သင်၏ပကတိအသွင်စက်နှင့် ဒေတာများကို ဝဘ်ဆိုက်များက အသုံးမပြုနိုင်အောင် ပိတ်ထားရန်</translation> <translation id="6447842834002726250">ကူကီးများ</translation> <translation id="6527303717912515753">မျှဝေရန်</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb index d644e6a..ae34b36 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb
@@ -236,6 +236,7 @@ <translation id="6367753977865761591">ਕਿਸੇ ਖਾਸ ਸਾਈਟ ਲਈ ਤੀਜੀ-ਧਿਰ ਦੇ ਸਾਈਨ-ਇਨ ਨੂੰ ਬਲਾਕ ਕਰੋ।</translation> <translation id="6388207532828177975">ਹਟਾਓ & ਰੀਸੈਟ ਕਰੋ</translation> <translation id="6398765197997659313">ਪੂਰੀ ਸਕ੍ਰੀਨ ਤੋਂ ਬਾਹਰ ਜਾਓ</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">ਸਾਈਟਾਂ ਨੂੰ ਤੁਹਾਡੇ ਆਭਾਸੀ ਵਾਸਤਵਿਕਤਾ ਡੀਵਾਈਸ ਅਤੇ ਡਾਟੇ ਨੂੰ ਵਰਤਣ ਤੋਂ ਬਲਾਕ ਕਰੋ</translation> <translation id="6447842834002726250">ਕੁਕੀਜ਼</translation> <translation id="6527303717912515753">ਸ਼ੇਅਰ ਕਰੋ</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb index 9e3d870..116abf1 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb
@@ -236,6 +236,7 @@ <translation id="6367753977865761591">Bloqueie o início de sessão de terceiros para um site específico.</translation> <translation id="6388207532828177975">Limpar e repor</translation> <translation id="6398765197997659313">Sair do modo de ecrã inteiro</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Impedir que os sites utilizem aos seus dados e dispositivo de realidade virtual</translation> <translation id="6447842834002726250">Cookies</translation> <translation id="6527303717912515753">Partilhar</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb index c17dcab..d61c5db 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb
@@ -236,6 +236,7 @@ <translation id="6367753977865761591">నిర్దిష్ట సైట్ కోసం థర్డ్-పార్టీ సైన్-ఇన్ను బ్లాక్ చేస్తుంది.</translation> <translation id="6388207532828177975">క్లియర్ చేసి, రీసెట్ చేయి</translation> <translation id="6398765197997659313">ఫుల్-స్క్రీన్ నుండి నిష్క్రమించండి</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">మీ వర్చువల్ రియాలిటీ పరికరాన్ని, డేటాను ఉపయోగించనివ్వకుండా సైట్లను బ్లాక్ చేస్తుంది</translation> <translation id="6447842834002726250">కుక్కీలు</translation> <translation id="6527303717912515753">షేర్ చేయండి</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb index 7bd091f..59f2f7b 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb
@@ -236,6 +236,7 @@ <translation id="6367753977865761591">Muayyan sayt uchun tashqi xizmatga kirishni bloklang.</translation> <translation id="6388207532828177975">Tozalash va asl holiga qaytarish</translation> <translation id="6398765197997659313">To‘liq ekran rejimidan chiqish</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Saytlarga virtual reallik qurilmalari yoki maʼlumotlaridan foydalanishni taqiqlash</translation> <translation id="6447842834002726250">Cookie fayllari</translation> <translation id="6527303717912515753">Ulashish</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb index f6c59070..94737d3 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb
@@ -236,6 +236,7 @@ <translation id="6367753977865761591">Chặn đăng nhập của bên thứ ba đối với một trang web cụ thể.</translation> <translation id="6388207532828177975">Xóa và đặt lại</translation> <translation id="6398765197997659313">Thoát khỏi chế độ toàn màn hình</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Không cho các trang web sử dụng dữ liệu và thiết bị thực tế ảo của bạn</translation> <translation id="6447842834002726250">Cookie</translation> <translation id="6527303717912515753">Chia sẻ</translation>
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimCoordinator.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimCoordinator.java index 54df93e..cdd4328e 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimCoordinator.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimCoordinator.java
@@ -29,6 +29,8 @@ * {@link #hideScrim(boolean)} should be called. */ public class ScrimCoordinator { + /** The duration for the scrim animation. */ + private static final int ANIM_DURATION_MS = 300; /** * A delegate to expose functionality that changes the scrim over the system UI. */ @@ -107,13 +109,13 @@ // Ensure the previous scrim is hidden before showing the new one. This logic should be in // the mediator, but it depends on the old view and binder being available which are // replaced prior to mediator#showScrim being called. - if (mMediator.isActive()) mMediator.hideScrim(false); + if (mMediator.isActive()) mMediator.hideScrim(false, ANIM_DURATION_MS); if (mChangeProcessor != null) mChangeProcessor.destroy(); mView = mScrimViewBuilder.get(); mChangeProcessor = PropertyModelChangeProcessor.create(model, mView, ScrimViewBinder::bind); - mMediator.showScrim(model); + mMediator.showScrim(model, ANIM_DURATION_MS); } /** @@ -121,7 +123,16 @@ * @param animate Whether the scrim should animate and fade out. */ public void hideScrim(boolean animate) { - mMediator.hideScrim(animate); + hideScrim(animate, ANIM_DURATION_MS); + } + + /** + * Hide the scrim. + * @param animate Whether the scrim should animate and fade out. + * @param duration Duration for animation. + */ + public void hideScrim(boolean animate, int duration) { + mMediator.hideScrim(animate, duration); } /** @return Whether the scrim is being shown. */
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimMediator.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimMediator.java index 73d0e5b..328b7a8 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimMediator.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimMediator.java
@@ -18,9 +18,6 @@ /** This class holds the animation and related business logic for the scrim. */ class ScrimMediator implements ScrimCoordinator.TouchEventDelegate { - /** The duration for the fading animation. */ - private static final int FADE_DURATION_MS = 300; - /** A callback that is run when the scrim has completely hidden. */ private final Runnable mScrimHiddenRunnable; @@ -36,9 +33,6 @@ /** The active animator (if any). */ private Animator mOverlayAnimator; - /** The duration for the fading animation. This can be overridden for testing. */ - private int mFadeDurationMs; - /** The model for the scrim component. */ private PropertyModel mModel; @@ -50,6 +44,7 @@ /** Whether the scrim is in the process of hiding or is currently hidden. */ private boolean mIsHidingOrHidden; + private boolean mDisableAnimationForTesting; /** * @param scrimHiddenRunnable A mechanism for hiding the scrim. @@ -59,11 +54,10 @@ ScrimCoordinator.SystemUiScrimDelegate systemUiScrimDelegate) { mScrimHiddenRunnable = scrimHiddenRunnable; mSystemUiScrimDelegate = systemUiScrimDelegate; - mFadeDurationMs = FADE_DURATION_MS; } /** Triggers a fade in of the scrim creating a new animation if necessary. */ - void showScrim(@NonNull PropertyModel model) { + void showScrim(@NonNull PropertyModel model, int animDurationMs) { // ALPHA is a protected property for this component that will only get added to the model // if ScrimProperties is used to build it. assert model.getAllProperties().contains(ScrimProperties.ALPHA) @@ -76,13 +70,14 @@ mModel = model; mIsHidingOrHidden = false; + int fadeDurationMs = getAnimationDuration(animDurationMs); // Make sure alpha is reset to 0 since the model may be reused. setAlphaInternal(0); if (mOverlayFadeInAnimator == null) { mOverlayFadeInAnimator = ValueAnimator.ofFloat(0, 1); - mOverlayFadeInAnimator.setDuration(mFadeDurationMs); + mOverlayFadeInAnimator.setDuration(fadeDurationMs); mOverlayFadeInAnimator.setInterpolator(BakedBezierInterpolator.FADE_IN_CURVE); mOverlayFadeInAnimator.addListener(new CancelAwareAnimatorListener() { @Override @@ -101,20 +96,27 @@ runFadeAnimation(mOverlayFadeInAnimator); } + private int getAnimationDuration(int animDurationMs) { + return mDisableAnimationForTesting ? 0 : animDurationMs; + } + /** * Triggers a fade out of the scrim creating a new animation if necessary. * @param animate Whether the scrim should fade out. + * @param animDurationMs Duration for animation run. */ - void hideScrim(boolean animate) { + void hideScrim(boolean animate, int animDurationMs) { assert mModel != null : "#hideScrim(...) was called on an inactive scrim!"; if (mIsHidingOrHidden) { if (mOverlayAnimator != null && !animate) mOverlayAnimator.end(); return; } + int fadeDurationMs = getAnimationDuration(animDurationMs); + if (mOverlayFadeOutAnimator == null) { mOverlayFadeOutAnimator = ValueAnimator.ofFloat(1, 0); - mOverlayFadeOutAnimator.setDuration(mFadeDurationMs); + mOverlayFadeOutAnimator.setDuration(fadeDurationMs); mOverlayFadeOutAnimator.setInterpolator(BakedBezierInterpolator.FADE_OUT_CURVE); mOverlayFadeOutAnimator.addListener(new CancelAwareAnimatorListener() { @Override @@ -204,7 +206,7 @@ @VisibleForTesting void disableAnimationForTesting(boolean disable) { - mFadeDurationMs = disable ? 0 : FADE_DURATION_MS; + mDisableAnimationForTesting = disable; } @VisibleForTesting
diff --git a/components/cast_streaming/browser/BUILD.gn b/components/cast_streaming/browser/BUILD.gn index a69837fa..f39e778 100644 --- a/components/cast_streaming/browser/BUILD.gn +++ b/components/cast_streaming/browser/BUILD.gn
@@ -87,7 +87,6 @@ "//mojo/public/cpp/system", "//third_party/openscreen/src/cast/common:public", "//third_party/openscreen/src/cast/streaming:receiver", - "//third_party/openscreen/src/util", ] public_deps = [ "//components/cast/message_port" ] visibility = [ ":*" ] @@ -113,7 +112,6 @@ "//media/mojo/mojom", "//mojo/public/cpp/system", "//third_party/openscreen/src/platform:api", - "//third_party/openscreen/src/util", ] public_deps = [ "//base", @@ -145,7 +143,6 @@ "//third_party/openscreen/src/cast/common:public", "//third_party/openscreen/src/cast/streaming:receiver", "//third_party/openscreen/src/platform:api", - "//third_party/openscreen/src/util", ] visibility = [ ":*" ] sources = [
diff --git a/components/cast_streaming/browser/rpc_demuxer_stream_handler.cc b/components/cast_streaming/browser/rpc_demuxer_stream_handler.cc index 4aba944..38614650 100644 --- a/components/cast_streaming/browser/rpc_demuxer_stream_handler.cc +++ b/components/cast_streaming/browser/rpc_demuxer_stream_handler.cc
@@ -4,6 +4,8 @@ #include "components/cast_streaming/browser/rpc_demuxer_stream_handler.h" +#include <sstream> + #include "base/bind.h" #include "base/logging.h" #include "components/cast_streaming/public/remoting_message_factories.h" @@ -58,6 +60,33 @@ } } +void RpcDemuxerStreamHandler::OnRpcEnableBitstreamConverterCallback( + openscreen::cast::RpcMessenger::Handle handle, + bool succeeded) { + if (audio_message_processor_ && + handle == audio_message_processor_->local_handle()) { + audio_message_processor_->OnBitstreamConverterEnabled(succeeded); + } else if (video_message_processor_ && + handle == video_message_processor_->local_handle()) { + video_message_processor_->OnBitstreamConverterEnabled(succeeded); + } else { + std::stringstream logstream; + logstream + << "OnRpcEnableBitstreamConverterCallback received for invalid handle " + << handle << ". Valid handles are"; + if (audio_message_processor_) { + logstream << " '" << audio_message_processor_->local_handle() + << "'' for audio"; + } + if (video_message_processor_) { + logstream << " '" << video_message_processor_->local_handle() + << "'' for video"; + } + + LOG(WARNING) << logstream.str(); + } +} + void RpcDemuxerStreamHandler::OnRpcInitializeCallback( openscreen::cast::RpcMessenger::Handle handle, absl::optional<media::AudioDecoderConfig> audio_config,
diff --git a/components/cast_streaming/browser/rpc_demuxer_stream_handler.h b/components/cast_streaming/browser/rpc_demuxer_stream_handler.h index e27f35e..f09b680 100644 --- a/components/cast_streaming/browser/rpc_demuxer_stream_handler.h +++ b/components/cast_streaming/browser/rpc_demuxer_stream_handler.h
@@ -145,6 +145,9 @@ absl::optional<media::AudioDecoderConfig> audio_config, absl::optional<media::VideoDecoderConfig> video_config, uint32_t total_frames_received) override; + void OnRpcEnableBitstreamConverterCallback( + openscreen::cast::RpcMessenger::Handle handle, + bool succeeded) override; const raw_ptr<Client> client_; HandleFactory handle_factory_;
diff --git a/components/cast_streaming/browser/rpc_demuxer_stream_handler_unittests.cc b/components/cast_streaming/browser/rpc_demuxer_stream_handler_unittests.cc index 3e0e57c..9ef562f 100644 --- a/components/cast_streaming/browser/rpc_demuxer_stream_handler_unittests.cc +++ b/components/cast_streaming/browser/rpc_demuxer_stream_handler_unittests.cc
@@ -131,6 +131,13 @@ MOCK_METHOD1(OnBitstreamConverterEnabled, void(bool)); + void OnRpcBitstreamConverterEnabled( + openscreen::cast::RpcMessenger::Handle handle, + bool success) { + static_cast<RpcDemuxerStreamCBMessageHandler*>(&stream_handler_) + ->OnRpcEnableBitstreamConverterCallback(handle, success); + } + void OnRpcInitializeCallback( openscreen::cast::RpcMessenger::Handle handle, absl::optional<media::AudioDecoderConfig> audio_config, @@ -261,6 +268,18 @@ uint32_t{1}); } +TEST_F(RpcDemuxerStreamHandlerTest, EnableBitstreamConverterKnownHandle) { + EXPECT_CALL(*this, SendMessage(_, _)) + .WillOnce(CheckEnableBistreamConverterCall(video_remote_handle_)); + EXPECT_CALL(*this, OnBitstreamConverterEnabled(true)); + EnableVideoBitstreamConverter(); + OnRpcBitstreamConverterEnabled(video_local_handle_, true); +} + +TEST_F(RpcDemuxerStreamHandlerTest, EnableBitstreamConverterUnknownHandle) { + OnRpcBitstreamConverterEnabled(42, true); +} + TEST_F(RpcDemuxerStreamHandlerTest, RequestMoreAudioBuffers) { EXPECT_CALL(client_, OnNewAudioConfig(_)) .WillOnce([this](media::AudioDecoderConfig config) {
diff --git a/components/cast_streaming/public/rpc_call_message_handler.cc b/components/cast_streaming/public/rpc_call_message_handler.cc index b9560f3..ddcb264a 100644 --- a/components/cast_streaming/public/rpc_call_message_handler.cc +++ b/components/cast_streaming/public/rpc_call_message_handler.cc
@@ -185,6 +185,15 @@ total_frames_received); return true; } + case openscreen::cast::RpcMessage:: + RPC_DS_ENABLEBITSTREAMCONVERTER_CALLBACK: { + if (!message->has_boolean_value()) { + return false; + } + client->OnRpcEnableBitstreamConverterCallback(message->handle(), + message->boolean_value()); + return true; + } default: return false; }
diff --git a/components/cast_streaming/public/rpc_call_message_handler.h b/components/cast_streaming/public/rpc_call_message_handler.h index 7623983..2f7ffff 100644 --- a/components/cast_streaming/public/rpc_call_message_handler.h +++ b/components/cast_streaming/public/rpc_call_message_handler.h
@@ -58,6 +58,9 @@ absl::optional<media::AudioDecoderConfig> audio_config, absl::optional<media::VideoDecoderConfig> video_config, uint32_t total_frames_received) = 0; + virtual void OnRpcEnableBitstreamConverterCallback( + openscreen::cast::RpcMessenger::Handle handle, + bool succeeded) = 0; }; // Processes the incoming |message| and forwards it to the appropriate |client|
diff --git a/components/cast_streaming/public/rpc_call_message_handler_unittest.cc b/components/cast_streaming/public/rpc_call_message_handler_unittest.cc index d2949fd..51e2d35e 100644 --- a/components/cast_streaming/public/rpc_call_message_handler_unittest.cc +++ b/components/cast_streaming/public/rpc_call_message_handler_unittest.cc
@@ -58,6 +58,7 @@ absl::optional<media::AudioDecoderConfig>, absl::optional<media::VideoDecoderConfig>, uint32_t)); + MOCK_METHOD2(OnRpcEnableBitstreamConverterCallback, void(int, bool)); }; RpcCallMessageHandlerTest() = default; @@ -311,5 +312,18 @@ DispatchDemuxerStreamCBRpcCall(rpc.get(), &demuxer_stream_client_)); } +TEST_F(RpcCallMessageHandlerTest, OnRpcEnableBitstreamConverterCallback) { + constexpr int kHandle = 123; + auto rpc = std::make_unique<openscreen::cast::RpcMessage>(); + rpc->set_proc( + openscreen::cast::RpcMessage::RPC_DS_ENABLEBITSTREAMCONVERTER_CALLBACK); + rpc->set_handle(kHandle); + rpc->set_boolean_value(true); + EXPECT_CALL(demuxer_stream_client_, + OnRpcEnableBitstreamConverterCallback(kHandle, true)); + EXPECT_TRUE( + DispatchDemuxerStreamCBRpcCall(rpc.get(), &demuxer_stream_client_)); +} + } // namespace remoting } // namespace cast_streaming
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json index bcb9045..3cebb4f 100644 --- a/components/certificate_transparency/data/log_list.json +++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@ { - "version": "10.61", - "log_list_timestamp": "2022-08-02T12:58:13Z", + "version": "10.62", + "log_list_timestamp": "2022-08-03T12:54:52Z", "operators": [ { "name": "Google",
diff --git a/components/commerce/core/BUILD.gn b/components/commerce/core/BUILD.gn index 703538d0..3509d48b 100644 --- a/components/commerce/core/BUILD.gn +++ b/components/commerce/core/BUILD.gn
@@ -197,6 +197,8 @@ testonly = true sources = [ + "mock_shopping_service.cc", + "mock_shopping_service.h", "shopping_service_test_base.cc", "shopping_service_test_base.h", ]
diff --git a/components/commerce/core/commerce_feature_list.cc b/components/commerce/core/commerce_feature_list.cc index 87dc7548..98089593 100644 --- a/components/commerce/core/commerce_feature_list.cc +++ b/components/commerce/core/commerce_feature_list.cc
@@ -11,6 +11,7 @@ #if !BUILDFLAG(IS_ANDROID) #include "components/commerce/core/commerce_heuristics_data.h" #endif // !BUILDFLAG(IS_ANDROID) +#include "components/commerce/core/commerce_heuristics_data_metrics_helper.h" #include "third_party/re2/src/re2/re2.h" namespace commerce { @@ -34,6 +35,8 @@ .GetRuleDiscountPartnerMerchantPattern(); if (pattern_from_component && kRulePartnerMerchantPattern.Get() == kRulePartnerMerchantPattern.default_value) { + CommerceHeuristicsDataMetricsHelper::RecordPartnerMerchantPatternSource( + CommerceHeuristicsDataMetricsHelper::HeuristicsSource::FROM_COMPONENT); return *pattern_from_component; } #endif // !BUILDFLAG(IS_ANDROID) @@ -41,6 +44,9 @@ options.set_case_sensitive(false); static base::NoDestructor<re2::RE2> instance( kRulePartnerMerchantPattern.Get(), options); + CommerceHeuristicsDataMetricsHelper::RecordPartnerMerchantPatternSource( + CommerceHeuristicsDataMetricsHelper::HeuristicsSource:: + FROM_FEATURE_PARAMETER); return *instance; }
diff --git a/components/commerce/core/commerce_feature_list_unittest.cc b/components/commerce/core/commerce_feature_list_unittest.cc index d3d4898..b2009d0 100644 --- a/components/commerce/core/commerce_feature_list_unittest.cc +++ b/components/commerce/core/commerce_feature_list_unittest.cc
@@ -3,9 +3,11 @@ // found in the LICENSE file. #include "components/commerce/core/commerce_feature_list.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "build/buildflag.h" #include "components/commerce/core/commerce_heuristics_data.h" +#include "components/commerce/core/commerce_heuristics_data_metrics_helper.h" #include "testing/gtest/include/gtest/gtest.h" namespace { @@ -35,6 +37,7 @@ protected: base::test::ScopedFeatureList features_; + base::HistogramTester histogram_tester_; }; #if !BUILDFLAG(IS_ANDROID) @@ -52,6 +55,14 @@ GURL(kCouponFeatureParamPartnerMerchantURL))); ASSERT_FALSE(commerce::IsCouponDiscountPartnerMerchant( GURL(kRuleFeatureParamPartnerMerchantURL))); + histogram_tester_.ExpectBucketCount( + "Commerce.Heuristics.PartnerMerchantPatternSource", + CommerceHeuristicsDataMetricsHelper::HeuristicsSource:: + FROM_FEATURE_PARAMETER, + 2); + histogram_tester_.ExpectBucketCount( + "Commerce.Heuristics.PartnerMerchantPatternSource", + CommerceHeuristicsDataMetricsHelper::HeuristicsSource::FROM_COMPONENT, 0); } TEST_F(CommerceFeatureListTest, TestRulePartnerMerchant_FromComponent) { @@ -67,6 +78,14 @@ GURL(kCouponComponentPartnerMerchantURL))); ASSERT_FALSE(commerce::IsCouponDiscountPartnerMerchant( GURL(kRuleComponentPartnerMerchantURL))); + histogram_tester_.ExpectBucketCount( + "Commerce.Heuristics.PartnerMerchantPatternSource", + CommerceHeuristicsDataMetricsHelper::HeuristicsSource:: + FROM_FEATURE_PARAMETER, + 0); + histogram_tester_.ExpectBucketCount( + "Commerce.Heuristics.PartnerMerchantPatternSource", + CommerceHeuristicsDataMetricsHelper::HeuristicsSource::FROM_COMPONENT, 2); } TEST_F(CommerceFeatureListTest, TestCouponPartnerMerchant_Priority) {
diff --git a/components/commerce/core/commerce_heuristics_data_metrics_helper.cc b/components/commerce/core/commerce_heuristics_data_metrics_helper.cc index 6ecf844..4594dcf 100644 --- a/components/commerce/core/commerce_heuristics_data_metrics_helper.cc +++ b/components/commerce/core/commerce_heuristics_data_metrics_helper.cc
@@ -23,3 +23,15 @@ base::UmaHistogramEnumeration( "Commerce.Heuristics.CartExtractionScriptSource", source); } + +void CommerceHeuristicsDataMetricsHelper::RecordPartnerMerchantPatternSource( + HeuristicsSource source) { + base::UmaHistogramEnumeration( + "Commerce.Heuristics.PartnerMerchantPatternSource", source); +} + +void CommerceHeuristicsDataMetricsHelper::RecordSkipProductPatternSource( + HeuristicsSource source) { + base::UmaHistogramEnumeration("Commerce.Heuristics.SkipProductPatternSource", + source); +}
diff --git a/components/commerce/core/commerce_heuristics_data_metrics_helper.h b/components/commerce/core/commerce_heuristics_data_metrics_helper.h index 1fcf05c..0f258e15 100644 --- a/components/commerce/core/commerce_heuristics_data_metrics_helper.h +++ b/components/commerce/core/commerce_heuristics_data_metrics_helper.h
@@ -5,11 +5,11 @@ #ifndef COMPONENTS_COMMERCE_CORE_COMMERCE_HEURISTICS_DATA_METRICS_HELPER_H_ #define COMPONENTS_COMMERCE_CORE_COMMERCE_HEURISTICS_DATA_METRICS_HELPER_H_ -// These values are persisted to logs. Entries should not be renumbered and -// numeric values should never be reused. class CommerceHeuristicsDataMetricsHelper { public: - // Represent the source of commerce heuristics. + // These values are persisted to logs. Entries should not be renumbered and + // numeric values should never be reused. Represent the source of commerce + // heuristics. enum class HeuristicsSource { // Heuristics are from component updater. FROM_COMPONENT = 0, @@ -33,6 +33,15 @@ // Gets called when we try to get the cart extraction script to record the // source of this script data. static void RecordCartExtractionScriptSource(HeuristicsSource source); + + // Gets called when we try to get the pattern to decide which merchant is a + // partner merchant. Record the source of the pattern data. + static void RecordPartnerMerchantPatternSource(HeuristicsSource source); + + // Gets called when we try to get the pattern to decide whether we should + // skip a product from the extraction results. Record the source of the + // pattern data. + static void RecordSkipProductPatternSource(HeuristicsSource source); }; #endif // COMPONENTS_COMMERCE_CORE_COMMERCE_HEURISTICS_DATA_METRICS_HELPER_H_
diff --git a/components/commerce/core/mock_shopping_service.cc b/components/commerce/core/mock_shopping_service.cc new file mode 100644 index 0000000..680557b --- /dev/null +++ b/components/commerce/core/mock_shopping_service.cc
@@ -0,0 +1,35 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/commerce/core/mock_shopping_service.h" + +namespace commerce { + +MockShoppingService::MockShoppingService() + : commerce::ShoppingService(nullptr, nullptr, nullptr, nullptr, nullptr) {} + +MockShoppingService::~MockShoppingService() = default; + +void MockShoppingService::GetProductInfoForUrl( + const GURL& url, + commerce::ProductInfoCallback callback) { + std::move(callback).Run(url, product_info_); +} + +void MockShoppingService::SetResponseForGetProductInfoForUrl( + absl::optional<commerce::ProductInfo> product_info) { + product_info_ = product_info; +} + +void MockShoppingService::GetMerchantInfoForUrl(const GURL& url, + MerchantInfoCallback callback) { + std::move(callback).Run(url, std::move(merchant_info_)); +} + +void MockShoppingService::SetResponseForGetMerchantInfoForUrl( + absl::optional<commerce::MerchantInfo> merchant_info) { + merchant_info_ = std::move(merchant_info); +} + +} // namespace commerce \ No newline at end of file
diff --git a/components/commerce/core/mock_shopping_service.h b/components/commerce/core/mock_shopping_service.h new file mode 100644 index 0000000..0894d026 --- /dev/null +++ b/components/commerce/core/mock_shopping_service.h
@@ -0,0 +1,39 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_COMMERCE_CORE_MOCK_SHOPPING_SERVICE_H_ +#define COMPONENTS_COMMERCE_CORE_MOCK_SHOPPING_SERVICE_H_ + +#include <memory> + +#include "components/commerce/core/shopping_service.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" + +namespace commerce { + +// A mock ShoppingService that allows us to decide the response. +class MockShoppingService : public commerce::ShoppingService { + public: + MockShoppingService(); + ~MockShoppingService() override; + + // commerce::ShoppingService overrides. + void GetProductInfoForUrl(const GURL& url, + commerce::ProductInfoCallback callback) override; + void GetMerchantInfoForUrl(const GURL& url, + MerchantInfoCallback callback) override; + + void SetResponseForGetProductInfoForUrl( + absl::optional<commerce::ProductInfo> product_info); + void SetResponseForGetMerchantInfoForUrl( + absl::optional<commerce::MerchantInfo> merchant_info); + + private: + absl::optional<commerce::ProductInfo> product_info_; + absl::optional<commerce::MerchantInfo> merchant_info_; +}; + +} // namespace commerce + +#endif // COMPONENTS_COMMERCE_CORE_MOCK_SHOPPING_SERVICE_H_
diff --git a/components/commerce/core/shopping_service.h b/components/commerce/core/shopping_service.h index 4253c1b..990ced3 100644 --- a/components/commerce/core/shopping_service.h +++ b/components/commerce/core/shopping_service.h
@@ -154,25 +154,32 @@ // passes the payload back to the caller via |callback|. At minimum, this // API will wait for data from the backend but may provide a "partial" result // that doesn't include information from the page on-device. - void GetProductInfoForUrl(const GURL& url, ProductInfoCallback callback); + virtual void GetProductInfoForUrl(const GURL& url, + ProductInfoCallback callback); // This API returns whatever product information is currently available for // the specified |url|. This method is less reliable than GetProductInfoForUrl // above as it may return an empty or partial result prior to the page being // processed or information being available from the backend. - absl::optional<ProductInfo> GetAvailableProductInfoForUrl(const GURL& url); + virtual absl::optional<ProductInfo> GetAvailableProductInfoForUrl( + const GURL& url); - void GetMerchantInfoForUrl(const GURL& url, MerchantInfoCallback callback); + // This API fetches information about a merchant for the provided |url| and + // passes the payload back to the caller via |callback|. Call will run after + // the fetch is completed. The merchant info object will be null if there is + // none available. + virtual void GetMerchantInfoForUrl(const GURL& url, + MerchantInfoCallback callback); // Create new subscriptions in batch if needed, and will notify |callback| if // the operation completes successfully. - void Subscribe( + virtual void Subscribe( std::unique_ptr<std::vector<CommerceSubscription>> subscriptions, base::OnceCallback<void(bool)> callback); // Delete existing subscriptions in batch if needed, and will notify // |callback| if the operation completes successfully. - void Unsubscribe( + virtual void Unsubscribe( std::unique_ptr<std::vector<CommerceSubscription>> subscriptions, base::OnceCallback<void(bool)> callback);
diff --git a/components/content_settings/core/browser/host_content_settings_map.cc b/components/content_settings/core/browser/host_content_settings_map.cc index 71000d9..9dd9c007 100644 --- a/components/content_settings/core/browser/host_content_settings_map.cc +++ b/components/content_settings/core/browser/host_content_settings_map.cc
@@ -685,6 +685,26 @@ } } +base::Time HostContentSettingsMap::GetExpirationForTesting( + GURL& primary_url, + GURL& secondary_url, + ContentSettingsType content_type) { + content_settings::PatternPair patterns = GetPatternsForContentSettingsType( + primary_url, secondary_url, content_type); + + std::unique_ptr<content_settings::RuleIterator> iterator = + pref_provider_->GetRuleIterator(content_type, /* off_the_record */ false); + while (iterator->HasNext()) { + content_settings::Rule rule = iterator->Next(); + if (rule.primary_pattern == patterns.first && + rule.secondary_pattern == patterns.second) { + return rule.expiration; + } + } + + return base::Time(); +} + void HostContentSettingsMap::AddObserver(content_settings::Observer* observer) { observers_.AddObserver(observer); }
diff --git a/components/content_settings/core/browser/host_content_settings_map.h b/components/content_settings/core/browser/host_content_settings_map.h index b0fabd75..74e3bdf 100644 --- a/components/content_settings/core/browser/host_content_settings_map.h +++ b/components/content_settings/core/browser/host_content_settings_map.h
@@ -333,6 +333,13 @@ allow_invalid_secondary_pattern_for_testing_ = allow; } + // Retrieves the expiration time associated with the given setting granted + // for the |primary_url|, |secondary_url|, and |content_type| in the default + // scope. Null time means no expiration. Only use for testing. + base::Time GetExpirationForTesting(GURL& primary_url, + GURL& secondary_url, + ContentSettingsType content_type); + private: friend class base::RefCountedThreadSafe<HostContentSettingsMap>; friend class content_settings::TestUtils;
diff --git a/components/enterprise/common/proto/connectors.proto b/components/enterprise/common/proto/connectors.proto index c06cf29..e54e27f 100644 --- a/components/enterprise/common/proto/connectors.proto +++ b/components/enterprise/common/proto/connectors.proto
@@ -195,3 +195,24 @@ // Reserved to make sure there is no overlap with DeepScanningClientResponse. reserved 2 to 3; } + +// An Acknowledgement is sent by the browser following the receipt of a response +// from the agent. +message ContentAnalysisAcknowledgement { + // Token used to correlate with the corresponding request and response. + optional string request_token = 1; + + // The action taken by google Chrome with the content analysis response. + enum Status { + // The response was handled as specified by the agent. + SUCCESS = 1; + + // The response from the agent was not properly formatted. + INVALID_RESPONSE = 2; + + // The response from the agent was too late and Google Chrome took the + // default action. + TOO_LATE = 3; + }; + optional Status status = 2; +}
diff --git a/components/exo/shell_surface_base.cc b/components/exo/shell_surface_base.cc index b054b012..d9e794a 100644 --- a/components/exo/shell_surface_base.cc +++ b/components/exo/shell_surface_base.cc
@@ -1357,7 +1357,7 @@ // is done. Without the fix, window_state can be null when it is tooltip and // the parent window is menu, so add null check of `window_state` here. if (!is_menu_ && window_state) - InitializeWindowState(ash::WindowState::Get(window)); + InitializeWindowState(window_state); SetShellUseImmersiveForFullscreen(window, immersive_implied_by_fullscreen_);
diff --git a/components/exo/shell_surface_unittest.cc b/components/exo/shell_surface_unittest.cc index f7a0d9f..0931ce4 100644 --- a/components/exo/shell_surface_unittest.cc +++ b/components/exo/shell_surface_unittest.cc
@@ -89,6 +89,15 @@ return popup_shell_surface; } +std::unique_ptr<ShellSurface> CreateMenuShellSurface(Surface* popup_surface, + ShellSurface* parent, + const gfx::Point& origin) { + auto popup_shell_surface = + CreatePopupShellSurface(popup_surface, parent, origin); + popup_shell_surface->SetMenu(); + return popup_shell_surface; +} + std::unique_ptr<ShellSurface> CreateX11TransientShellSurface( ShellSurface* parent, const gfx::Size& size, @@ -1424,6 +1433,117 @@ } } +TEST_F(ShellSurfaceTest, Menu) { + std::unique_ptr<ShellSurface> root_shell_surface = + test::ShellSurfaceBuilder({256, 256}).BuildShellSurface(); + EXPECT_TRUE(root_shell_surface->GetWidget()->IsVisible()); + + std::unique_ptr<ShellSurface> menu_shell_surface = + test::ShellSurfaceBuilder({256, 256}) + .SetAsMenu() + .SetParent(root_shell_surface.get()) + .BuildShellSurface(); + EXPECT_TRUE(menu_shell_surface->GetWidget()->IsVisible()); + EXPECT_EQ(aura::client::WINDOW_TYPE_MENU, + menu_shell_surface->GetWidget()->GetNativeWindow()->GetType()); +} + +TEST_F(ShellSurfaceTest, MenuOnPopup) { + std::unique_ptr<ShellSurface> root_shell_surface = + test::ShellSurfaceBuilder({256, 256}).BuildShellSurface(); + EXPECT_TRUE(root_shell_surface->GetWidget()->IsVisible()); + + std::unique_ptr<ShellSurface> popup_shell_surface = + test::ShellSurfaceBuilder({256, 256}) + .SetAsPopup() + .SetParent(root_shell_surface.get()) + .BuildShellSurface(); + EXPECT_TRUE(popup_shell_surface->GetWidget()->IsVisible()); + EXPECT_EQ(aura::client::WINDOW_TYPE_POPUP, + popup_shell_surface->GetWidget()->GetNativeWindow()->GetType()); + + std::unique_ptr<ShellSurface> menu_shell_surface = + test::ShellSurfaceBuilder({256, 256}) + .SetAsMenu() + .SetParent(popup_shell_surface.get()) + .BuildShellSurface(); + EXPECT_TRUE(menu_shell_surface->GetWidget()->IsVisible()); + EXPECT_EQ(aura::client::WINDOW_TYPE_MENU, + menu_shell_surface->GetWidget()->GetNativeWindow()->GetType()); +} + +TEST_F(ShellSurfaceTest, PopupOnMenu) { + std::unique_ptr<ShellSurface> root_shell_surface = + test::ShellSurfaceBuilder({256, 256}).BuildShellSurface(); + EXPECT_TRUE(root_shell_surface->GetWidget()->IsVisible()); + + std::unique_ptr<ShellSurface> menu_shell_surface = + test::ShellSurfaceBuilder({256, 256}) + .SetAsMenu() + .SetParent(root_shell_surface.get()) + .BuildShellSurface(); + EXPECT_TRUE(menu_shell_surface->GetWidget()->IsVisible()); + EXPECT_EQ(aura::client::WINDOW_TYPE_MENU, + menu_shell_surface->GetWidget()->GetNativeWindow()->GetType()); + + std::unique_ptr<ShellSurface> popup_shell_surface = + test::ShellSurfaceBuilder({256, 256}) + .SetAsPopup() + .SetParent(menu_shell_surface.get()) + .BuildShellSurface(); + EXPECT_TRUE(popup_shell_surface->GetWidget()->IsVisible()); + EXPECT_EQ(aura::client::WINDOW_TYPE_POPUP, + popup_shell_surface->GetWidget()->GetNativeWindow()->GetType()); +} + +TEST_F(ShellSurfaceTest, PopupOnPopup) { + std::unique_ptr<ShellSurface> root_shell_surface = + test::ShellSurfaceBuilder({256, 256}).BuildShellSurface(); + EXPECT_TRUE(root_shell_surface->GetWidget()->IsVisible()); + + std::unique_ptr<ShellSurface> popup_shell_surface_1 = + test::ShellSurfaceBuilder({256, 256}) + .SetAsPopup() + .SetParent(root_shell_surface.get()) + .BuildShellSurface(); + EXPECT_TRUE(popup_shell_surface_1->GetWidget()->IsVisible()); + EXPECT_EQ(aura::client::WINDOW_TYPE_POPUP, + popup_shell_surface_1->GetWidget()->GetNativeWindow()->GetType()); + + std::unique_ptr<ShellSurface> popup_shell_surface_2 = + test::ShellSurfaceBuilder({256, 256}) + .SetAsPopup() + .SetParent(popup_shell_surface_1.get()) + .BuildShellSurface(); + EXPECT_TRUE(popup_shell_surface_2->GetWidget()->IsVisible()); + EXPECT_EQ(aura::client::WINDOW_TYPE_POPUP, + popup_shell_surface_2->GetWidget()->GetNativeWindow()->GetType()); +} + +TEST_F(ShellSurfaceTest, MenuOnMenu) { + std::unique_ptr<ShellSurface> root_shell_surface = + test::ShellSurfaceBuilder({256, 256}).BuildShellSurface(); + EXPECT_TRUE(root_shell_surface->GetWidget()->IsVisible()); + + std::unique_ptr<ShellSurface> menu_shell_surface_1 = + test::ShellSurfaceBuilder({256, 256}) + .SetAsMenu() + .SetParent(root_shell_surface.get()) + .BuildShellSurface(); + EXPECT_TRUE(menu_shell_surface_1->GetWidget()->IsVisible()); + EXPECT_EQ(aura::client::WINDOW_TYPE_MENU, + menu_shell_surface_1->GetWidget()->GetNativeWindow()->GetType()); + + std::unique_ptr<ShellSurface> menu_shell_surface_2 = + test::ShellSurfaceBuilder({256, 256}) + .SetAsMenu() + .SetParent(menu_shell_surface_1.get()) + .BuildShellSurface(); + EXPECT_TRUE(menu_shell_surface_2->GetWidget()->IsVisible()); + EXPECT_EQ(aura::client::WINDOW_TYPE_MENU, + menu_shell_surface_2->GetWidget()->GetNativeWindow()->GetType()); +} + TEST_F(ShellSurfaceTest, PopupWithInputRegion) { gfx::Size buffer_size(256, 256); std::unique_ptr<Buffer> buffer(
diff --git a/components/exo/test/shell_surface_builder.cc b/components/exo/test/shell_surface_builder.cc index 22aeebd7..4b9ea65 100644 --- a/components/exo/test/shell_surface_builder.cc +++ b/components/exo/test/shell_surface_builder.cc
@@ -233,6 +233,12 @@ return *this; } +ShellSurfaceBuilder& ShellSurfaceBuilder::SetAsMenu() { + DCHECK(!built_); + menu_ = true; + return SetAsPopup(); +} + ShellSurfaceBuilder& ShellSurfaceBuilder::SetWindowState( chromeos::WindowStateType window_state) { DCHECK(!built_); @@ -285,6 +291,8 @@ shell_surface->SetParent(parent_shell_surface_); if (popup_) shell_surface->SetPopup(); + if (menu_) + shell_surface->SetMenu(); SetCommonPropertiesAndCommitIfNecessary(shell_surface.get());
diff --git a/components/exo/test/shell_surface_builder.h b/components/exo/test/shell_surface_builder.h index 8c21d5e..f7c6595 100644 --- a/components/exo/test/shell_surface_builder.h +++ b/components/exo/test/shell_surface_builder.h
@@ -58,6 +58,7 @@ // Sets parameters defined in ShellSurface. ShellSurfaceBuilder& SetParent(ShellSurface* shell_surface); ShellSurfaceBuilder& SetAsPopup(); + ShellSurfaceBuilder& SetAsMenu(); // Sets parameters defined in ClientControlledShellSurface. ShellSurfaceBuilder& SetWindowState(chromeos::WindowStateType window_state); @@ -104,6 +105,7 @@ // ShellSurface-specific parameters. ShellSurface* parent_shell_surface_ = nullptr; bool popup_ = false; + bool menu_ = false; // ClientControlledShellSurface-specific parameters. absl::optional<chromeos::WindowStateType> window_state_;
diff --git a/components/feed/core/v2/api_test/feed_api_test.cc b/components/feed/core/v2/api_test/feed_api_test.cc index e0a2730..26e4f50 100644 --- a/components/feed/core/v2/api_test/feed_api_test.cc +++ b/components/feed/core/v2/api_test/feed_api_test.cc
@@ -906,6 +906,9 @@ bool FeedApiTest::IsAutoplayEnabled() { return false; } +TabGroupEnabledState FeedApiTest::GetTabGroupEnabledState() { + return TabGroupEnabledState::kNone; +} void FeedApiTest::ClearAll() { if (on_clear_all_) on_clear_all_.Run();
diff --git a/components/feed/core/v2/api_test/feed_api_test.h b/components/feed/core/v2/api_test/feed_api_test.h index 96e452b..6bfd93f 100644 --- a/components/feed/core/v2/api_test/feed_api_test.h +++ b/components/feed/core/v2/api_test/feed_api_test.h
@@ -465,6 +465,7 @@ DisplayMetrics GetDisplayMetrics() override; std::string GetLanguageTag() override; bool IsAutoplayEnabled() override; + TabGroupEnabledState GetTabGroupEnabledState() override; void ClearAll() override; AccountInfo GetAccountInfo() override; void PrefetchImage(const GURL& url) override;
diff --git a/components/feed/core/v2/feed_stream.cc b/components/feed/core/v2/feed_stream.cc index 8ecc0b0..a553c03 100644 --- a/components/feed/core/v2/feed_stream.cc +++ b/components/feed/core/v2/feed_stream.cc
@@ -934,6 +934,7 @@ result.notice_card_acknowledged = privacy_notice_card_tracker_.HasAcknowledgedNoticeCard(); result.autoplay_enabled = delegate_->IsAutoplayEnabled(); + result.tab_group_enabled_state = delegate_->GetTabGroupEnabledState(); if (signed_in_request) { result.client_instance_id = prefs::GetClientInstanceId(*profile_prefs_);
diff --git a/components/feed/core/v2/feed_stream.h b/components/feed/core/v2/feed_stream.h index 4f5bbf5..8355744 100644 --- a/components/feed/core/v2/feed_stream.h +++ b/components/feed/core/v2/feed_stream.h
@@ -79,6 +79,7 @@ virtual DisplayMetrics GetDisplayMetrics() = 0; virtual std::string GetLanguageTag() = 0; virtual bool IsAutoplayEnabled() = 0; + virtual TabGroupEnabledState GetTabGroupEnabledState() = 0; virtual void ClearAll() = 0; virtual AccountInfo GetAccountInfo() = 0; virtual void PrefetchImage(const GURL& url) = 0;
diff --git a/components/feed/core/v2/proto_util.cc b/components/feed/core/v2/proto_util.cc index 079acb37..e3301a1a 100644 --- a/components/feed/core/v2/proto_util.cc +++ b/components/feed/core/v2/proto_util.cc
@@ -132,10 +132,10 @@ for (Capability capability : {Capability::CARD_MENU, Capability::LOTTIE_ANIMATIONS, Capability::LONG_PRESS_CARD_MENU, Capability::SHARE, - Capability::OPEN_IN_TAB, Capability::OPEN_IN_INCOGNITO, - Capability::DISMISS_COMMAND, Capability::INFINITE_FEED, - Capability::PREFETCH_METADATA, Capability::REQUEST_SCHEDULE, - Capability::UI_THEME_V2, Capability::UNDO_FOR_DISMISS_COMMAND}) { + Capability::OPEN_IN_INCOGNITO, Capability::DISMISS_COMMAND, + Capability::INFINITE_FEED, Capability::PREFETCH_METADATA, + Capability::REQUEST_SCHEDULE, Capability::UI_THEME_V2, + Capability::UNDO_FOR_DISMISS_COMMAND}) { feed_request.add_client_capability(capability); } @@ -178,6 +178,19 @@ Capability::INFO_CARD_ACKNOWLEDGEMENT_TRACKING); } + switch (request_metadata.tab_group_enabled_state) { + case TabGroupEnabledState::kNone: + feed_request.add_client_capability(Capability::OPEN_IN_TAB); + break; + case TabGroupEnabledState::kReplaced: + feed_request.add_client_capability(Capability::OPEN_IN_NEW_TAB_IN_GROUP); + break; + case TabGroupEnabledState::kBoth: + feed_request.add_client_capability(Capability::OPEN_IN_TAB); + feed_request.add_client_capability(Capability::OPEN_IN_NEW_TAB_IN_GROUP); + break; + } + *feed_request.mutable_client_info() = CreateClientInfo(request_metadata); feedwire::FeedQuery& query = *feed_request.mutable_feed_query(); query.set_reason(request_reason);
diff --git a/components/feed/core/v2/proto_util_unittest.cc b/components/feed/core/v2/proto_util_unittest.cc index 984a9be5..0ae2e63 100644 --- a/components/feed/core/v2/proto_util_unittest.cc +++ b/components/feed/core/v2/proto_util_unittest.cc
@@ -281,5 +281,37 @@ Contains(feedwire::Capability::INFO_CARD_ACKNOWLEDGEMENT_TRACKING)); } +TEST(ProtoUtilTest, TabGroupsEnabledForReplaced) { + RequestMetadata request_metadata; + request_metadata.tab_group_enabled_state = TabGroupEnabledState::kReplaced; + + feedwire::FeedRequest request = + CreateFeedQueryRefreshRequest( + kForYouStream, feedwire::FeedQuery::MANUAL_REFRESH, request_metadata, + /*consistency_token=*/std::string()) + .feed_request(); + + ASSERT_THAT(request.client_capability(), + Contains(feedwire::Capability::OPEN_IN_NEW_TAB_IN_GROUP)); + ASSERT_THAT(request.client_capability(), + Not(Contains(feedwire::Capability::OPEN_IN_TAB))); +} + +TEST(ProtoUtilTest, TabGroupsEnabledForBoth) { + RequestMetadata request_metadata; + request_metadata.tab_group_enabled_state = TabGroupEnabledState::kBoth; + + feedwire::FeedRequest request = + CreateFeedQueryRefreshRequest( + kForYouStream, feedwire::FeedQuery::MANUAL_REFRESH, request_metadata, + /*consistency_token=*/std::string()) + .feed_request(); + + ASSERT_THAT(request.client_capability(), + Contains(feedwire::Capability::OPEN_IN_NEW_TAB_IN_GROUP)); + ASSERT_THAT(request.client_capability(), + Contains(feedwire::Capability::OPEN_IN_TAB)); +} + } // namespace } // namespace feed
diff --git a/components/feed/core/v2/public/feed_service.cc b/components/feed/core/v2/public/feed_service.cc index 089197e..c1dbeee 100644 --- a/components/feed/core/v2/public/feed_service.cc +++ b/components/feed/core/v2/public/feed_service.cc
@@ -149,6 +149,9 @@ bool IsAutoplayEnabled() override { return service_delegate_->IsAutoplayEnabled(); } + TabGroupEnabledState GetTabGroupEnabledState() override { + return service_delegate_->GetTabGroupEnabledState(); + } void ClearAll() override { service_delegate_->ClearAll(); } void PrefetchImage(const GURL& url) override { service_delegate_->PrefetchImage(url);
diff --git a/components/feed/core/v2/public/feed_service.h b/components/feed/core/v2/public/feed_service.h index 04f6a68..5f81d1bd 100644 --- a/components/feed/core/v2/public/feed_service.h +++ b/components/feed/core/v2/public/feed_service.h
@@ -67,6 +67,8 @@ virtual DisplayMetrics GetDisplayMetrics() = 0; // Returns true if autoplay is enabled. virtual bool IsAutoplayEnabled() = 0; + // Returns how the tab group feature is enabled. + virtual TabGroupEnabledState GetTabGroupEnabledState() = 0; // Clear all stored data. virtual void ClearAll() = 0; // Fetch the image and store it in the disk cache.
diff --git a/components/feed/core/v2/public/types.h b/components/feed/core/v2/public/types.h index 36d230a7..928d884 100644 --- a/components/feed/core/v2/public/types.h +++ b/components/feed/core/v2/public/types.h
@@ -266,6 +266,17 @@ kNewTabInGroup = 2, }; +// Describes how tab group feature is enabled. +// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.feed +enum class TabGroupEnabledState : int { + // No tab group is enabled. + kNone = 0, + // "Open in new tab in group" replaces "Open in new tab". + kReplaced = 1, + // Both "Open in new tab in group" and "Open in new tab" are shown. + kBoth = 2, +}; + } // namespace feed #endif // COMPONENTS_FEED_CORE_V2_PUBLIC_TYPES_H_
diff --git a/components/feed/core/v2/types.h b/components/feed/core/v2/types.h index 7b7df67..c5a4da9 100644 --- a/components/feed/core/v2/types.h +++ b/components/feed/core/v2/types.h
@@ -58,6 +58,7 @@ ContentOrder content_order = ContentOrder::kUnspecified; bool notice_card_acknowledged = false; bool autoplay_enabled = false; + TabGroupEnabledState tab_group_enabled_state = TabGroupEnabledState::kNone; int followed_from_web_page_menu_count = 0; std::vector<feedwire::InfoCardTrackingState> info_card_tracking_states; };
diff --git a/components/history/core/browser/history_backend_db_unittest.cc b/components/history/core/browser/history_backend_db_unittest.cc index 2ed38f9..519a461 100644 --- a/components/history/core/browser/history_backend_db_unittest.cc +++ b/components/history/core/browser/history_backend_db_unittest.cc
@@ -2723,6 +2723,63 @@ } } +TEST_F(HistoryBackendDBTest, MigrateClustersAddColumns) { + ASSERT_NO_FATAL_FAILURE(CreateDBVersion(56)); + + sql::Database db; + ASSERT_TRUE(db.Open(history_dir_.Append(kHistoryFilename))); + + // Confirm the old 'clusters' columns exist. + ASSERT_TRUE(db.DoesColumnExist("clusters", "cluster_id")); + ASSERT_TRUE(db.DoesColumnExist("clusters", "score")); + + // Confirm the new 'clusters' columns don't exist. + ASSERT_FALSE( + db.DoesColumnExist("clusters", "should_show_on_prominent_ui_surfaces")); + ASSERT_FALSE(db.DoesColumnExist("clusters", "label")); + ASSERT_FALSE(db.DoesColumnExist("clusters", "raw_label")); + + // Confirm the old 'clusters_and_visits' columns exist. + ASSERT_TRUE(db.DoesColumnExist("clusters_and_visits", "cluster_id")); + ASSERT_TRUE(db.DoesColumnExist("clusters_and_visits", "visit_id")); + ASSERT_TRUE(db.DoesColumnExist("clusters_and_visits", "score")); + + // Confirm the new 'clusters_and_visits' columns don't exist. + ASSERT_FALSE(db.DoesColumnExist("clusters_and_visits", "engagement_score")); + ASSERT_FALSE(db.DoesColumnExist("clusters_and_visits", "url_for_deduping")); + ASSERT_FALSE(db.DoesColumnExist("clusters_and_visits", "normalized_url")); + ASSERT_FALSE(db.DoesColumnExist("clusters_and_visits", "url_for_display")); + + // Re-open the db, triggering migration. + CreateBackendAndDatabase(); + + // The version should have been updated. + ASSERT_GE(HistoryDatabase::GetCurrentVersion(), 57); + + // Confirm the tables still exist. + ASSERT_TRUE(db.DoesTableExist("clusters")); + ASSERT_TRUE(db.DoesTableExist("clusters_and_visits")); + + // Confirm the new 'clusters' columns exist. + ASSERT_TRUE(db.DoesColumnExist("clusters", "cluster_id")); + ASSERT_TRUE( + db.DoesColumnExist("clusters", "should_show_on_prominent_ui_surfaces")); + ASSERT_TRUE(db.DoesColumnExist("clusters", "label")); + ASSERT_TRUE(db.DoesColumnExist("clusters", "raw_label")); + + // Confirm 'score' column was removed from 'clusters'. + ASSERT_FALSE(db.DoesColumnExist("clusters", "score")); + + // Confirm the new 'clusters_and_visits' columns exist. + ASSERT_TRUE(db.DoesColumnExist("clusters_and_visits", "cluster_id")); + ASSERT_TRUE(db.DoesColumnExist("clusters_and_visits", "visit_id")); + ASSERT_TRUE(db.DoesColumnExist("clusters_and_visits", "score")); + ASSERT_TRUE(db.DoesColumnExist("clusters_and_visits", "engagement_score")); + ASSERT_TRUE(db.DoesColumnExist("clusters_and_visits", "url_for_deduping")); + ASSERT_TRUE(db.DoesColumnExist("clusters_and_visits", "normalized_url")); + ASSERT_TRUE(db.DoesColumnExist("clusters_and_visits", "url_for_display")); +} + bool FilterURL(const GURL& url) { return url.SchemeIsHTTPOrHTTPS(); }
diff --git a/components/history/core/browser/history_database.cc b/components/history/core/browser/history_database.cc index 6a3be37..a68f634 100644 --- a/components/history/core/browser/history_database.cc +++ b/components/history/core/browser/history_database.cc
@@ -38,7 +38,7 @@ // Current version number. We write databases at the "current" version number, // but any previous version that can read the "compatible" one can make do with // our database without *too* many bad effects. -const int kCurrentVersionNumber = 56; +const int kCurrentVersionNumber = 57; const int kCompatibleVersionNumber = 16; const char kEarlyExpirationThresholdKey[] = "early_expiration_threshold"; @@ -795,6 +795,13 @@ meta_table_.SetVersionNumber(cur_version); } + if (cur_version == 56) { + if (!MigrateClustersAddColumns()) + return LogMigrationFailure(56); + cur_version++; + meta_table_.SetVersionNumber(cur_version); + } + // ========================= ^^ new migration code goes here ^^ // ADDING NEW MIGRATION CODE // =========================
diff --git a/components/history/core/browser/history_types.h b/components/history/core/browser/history_types.h index 9521c82..197e421c 100644 --- a/components/history/core/browser/history_types.h +++ b/components/history/core/browser/history_types.h
@@ -867,13 +867,14 @@ float score = 0.0; // Flagged as true if this cluster visit matches the user's search query. - // This value depends on the user's search query, and is not meant to be ever - // persisted. It's a UI-state-specific flag that's convenient to buffer here. + // This depends on the user's search query, and should not be persisted. It's + // a UI-state-specific flag that's convenient to buffer here. bool matches_search_query = false; // A list of visits that have been de-duplicated into this visit. The parent // visit is considered the best visit among all the duplicates, and the worse // visits are now contained here. + // TODO(manukh): Persist to db. std::vector<ClusterVisit> duplicate_visits; // The site engagement score of the URL associated with this visit. This @@ -890,7 +891,7 @@ // that combines this with the page title as a deduping key. GURL url_for_deduping; - // The normalized URL for the visit (i.e. a SRP URL normalized based on the + // The normalized URL for the visit (i.e. an SRP URL normalized based on the // user's default search provider). GURL normalized_url; @@ -898,13 +899,15 @@ // a consistent experience between WebUI and Mobile. std::u16string url_for_display; - // Which positions matched the search query in various fields. + // Which positions matched the search query in various fields. This depends on + // the user's search query, and should not be persisted. query_parser::Snippet::MatchPositions title_match_positions; query_parser::Snippet::MatchPositions url_for_display_match_positions; // If true, the visit should be "below the fold" and not initially shown in // any UI. It is still included in the cluster so that it can be queried over, - // as well as deleted when the whole cluster is deleted. + // as well as deleted when the whole cluster is deleted. This is computed in + // the UI code, and should not be persisted. bool hidden = false; }; @@ -980,10 +983,9 @@ int64_t cluster_id = 0; std::vector<ClusterVisit> visits; - // TODO(manukh): retrieve and persist `keyword_to_data_map`, - // `should_show_on_prominent_ui_surfaces, and `label`. // A map of keywords to additional data. + // TODO(manukh): Persist to db. base::flat_map<std::u16string, ClusterKeywordData> keyword_to_data_map; // Whether the cluster should be shown prominently on UI surfaces. @@ -998,17 +1000,19 @@ absl::optional<std::u16string> raw_label; // The positions within the label that match the search query, if it exists. + // This depends on the user's search query, and should not be persisted. query_parser::Snippet::MatchPositions label_match_positions; // The vector of related searches for the whole cluster. This is derived from // the related searches of the constituent visits, and computed in - // cross-platform code so we have a consistent set across platforms. + // cross-platform code so it's consistent across platforms. Should not be + // persisted. std::vector<std::string> related_searches; // A floating point score that's positive if the cluster matches the user's - // search query, and zero otherwise. This score changes depending on the - // entered search query, so this should never be persisted. It's a - // UI-state-specific score that's convenient to buffer here. + // search query, and zero otherwise. This depends on the user's search query, + // and should not be persisted. It's a UI-state-specific score that's + // convenient to buffer here. float search_match_score = 0.0; };
diff --git a/components/history/core/browser/visit_annotations_database.cc b/components/history/core/browser/visit_annotations_database.cc index 34e7a2d8..b1d75e60c 100644 --- a/components/history/core/browser/visit_annotations_database.cc +++ b/components/history/core/browser/visit_annotations_database.cc
@@ -185,29 +185,15 @@ return false; } - if (!GetDB().Execute("CREATE TABLE IF NOT EXISTS clusters(" - "cluster_id INTEGER PRIMARY KEY," - "score NUMERIC NOT NULL)")) { + if (!CreateClustersTable()) return false; - } // Represents the many-to-many relationship of `Cluster`s and `Visit`s. // `score` here is unique to the visit/cluster combination; i.e. the same // visit in another cluster or another visit in the same cluster may have // different scores. - if (!GetDB().Execute("CREATE TABLE IF NOT EXISTS clusters_and_visits(" - "cluster_id INTEGER NOT NULL," - "visit_id INTEGER NOT NULL," - "score NUMERIC NOT NULL," - "PRIMARY KEY(cluster_id,visit_id))" - "WITHOUT ROWID")) { + if (!CreateClustersAndVisitsTableAndIndex()) return false; - } - - if (!GetDB().Execute("CREATE INDEX IF NOT EXISTS clusters_for_visit ON " - "clusters_and_visits(visit_id)")) { - return false; - } return true; } @@ -411,39 +397,52 @@ void VisitAnnotationsDatabase::AddClusters( const std::vector<Cluster>& clusters) { DCHECK(!clusters.empty()); - // TODO(manukh) Persist scores once we have them. sql::Statement clusters_statement(GetDB().GetCachedStatement( - SQL_FROM_HERE, "INSERT INTO clusters(score)VALUES(0)")); + SQL_FROM_HERE, + "INSERT INTO clusters" + "(should_show_on_prominent_ui_surfaces,label,raw_label)" + "VALUES(?,?,?)")); sql::Statement clusters_and_visits_statement(GetDB().GetCachedStatement( SQL_FROM_HERE, - "INSERT INTO clusters_and_visits(cluster_id,visit_id,score)" - "VALUES(?,?,0)")); + "INSERT INTO " + "clusters_and_visits(cluster_id,visit_id,score," + "engagement_score,url_for_deduping,normalized_url,url_for_display)" + "VALUES(?,?,?,?,?,?,?)")); for (const auto& cluster : clusters) { if (cluster.visits.empty()) continue; - clusters_statement.Reset(false); + clusters_statement.Reset(true); + clusters_statement.BindBool(0, + cluster.should_show_on_prominent_ui_surfaces); + clusters_statement.BindString16(1, cluster.label.value_or(u"")); + clusters_statement.BindString16(2, cluster.raw_label.value_or(u"")); if (!clusters_statement.Run()) { DVLOG(0) << "Failed to execute 'clusters' insert statement"; continue; } const int64_t cluster_id = GetDB().GetLastInsertRowId(); DCHECK(cluster_id); - base::ranges::for_each( - cluster.visits, - [&](const auto& annotated_visit) { - clusters_and_visits_statement.Reset(true); - clusters_and_visits_statement.BindInt64(0, cluster_id); - clusters_and_visits_statement.BindInt64( - 1, annotated_visit.visit_row.visit_id); - if (!clusters_and_visits_statement.Run()) { - DVLOG(0) - << "Failed to execute 'clusters_and_visits' insert statement: " - << "cluster_id = " << cluster_id - << ", visit_id = " << annotated_visit.visit_row.visit_id; - } - }, - &ClusterVisit::annotated_visit); + base::ranges::for_each(cluster.visits, [&](const auto& cluster_visit) { + const auto visit_id = cluster_visit.annotated_visit.visit_row.visit_id; + clusters_and_visits_statement.Reset(true); + clusters_and_visits_statement.BindInt64(0, cluster_id); + clusters_and_visits_statement.BindInt64(1, visit_id); + clusters_and_visits_statement.BindDouble(2, cluster_visit.score); + clusters_and_visits_statement.BindDouble(3, + cluster_visit.engagement_score); + clusters_and_visits_statement.BindString( + 4, cluster_visit.url_for_deduping.spec()); + clusters_and_visits_statement.BindString( + 5, cluster_visit.normalized_url.spec()); + clusters_and_visits_statement.BindString16(6, + cluster_visit.url_for_display); + if (!clusters_and_visits_statement.Run()) { + DVLOG(0) + << "Failed to execute 'clusters_and_visits' insert statement: " + << "cluster_id = " << cluster_id << ", visit_id = " << visit_id; + } + }); } } @@ -692,4 +691,40 @@ "ADD COLUMN alternative_title"); } +bool VisitAnnotationsDatabase::MigrateClustersAddColumns() { + // Don't need to actually copy values from the previous table; it was never + // populated + return (!GetDB().DoesTableExist("clusters") || + GetDB().Execute("DROP TABLE clusters")) && + (!GetDB().DoesTableExist("clusters_and_visits") || + GetDB().Execute("DROP TABLE clusters_and_visits")) && + CreateClustersTable() && CreateClustersAndVisitsTableAndIndex(); +} + +bool VisitAnnotationsDatabase::CreateClustersTable() { + return GetDB().Execute( + "CREATE TABLE IF NOT EXISTS clusters(" + "cluster_id INTEGER PRIMARY KEY," + "should_show_on_prominent_ui_surfaces BOOLEAN NOT NULL," + "label VARCHAR NOT NULL," + "raw_label VARCHAR NOT NULL)"); +} + +bool VisitAnnotationsDatabase::CreateClustersAndVisitsTableAndIndex() { + return GetDB().Execute( + "CREATE TABLE IF NOT EXISTS clusters_and_visits(" + "cluster_id INTEGER NOT NULL," + "visit_id INTEGER NOT NULL," + "score NUMERIC NOT NULL," + "engagement_score NUMERIC NOT NULL," + "url_for_deduping LONGVARCHAR NOT NULL," + "normalized_url LONGVARCHAR NOT NULL," + "url_for_display LONGVARCHAR NOT NULL," + "PRIMARY KEY(cluster_id,visit_id))" + "WITHOUT ROWID") && + GetDB().Execute( + "CREATE INDEX IF NOT EXISTS clusters_for_visit ON " + "clusters_and_visits(visit_id)"); +} + } // namespace history
diff --git a/components/history/core/browser/visit_annotations_database.h b/components/history/core/browser/visit_annotations_database.h index cf8b305..79b5a16 100644 --- a/components/history/core/browser/visit_annotations_database.h +++ b/components/history/core/browser/visit_annotations_database.h
@@ -140,6 +140,18 @@ // Called by the derived classes to migrate the older content_annotations // table by adding the alternative_title column. bool MigrateContentAnnotationsAddAlternativeTitle(); + + // Called by the derived classes to delete the 'clusters' and + // 'clusters_and_visits' tables so they can be recreated with updated columns. + bool MigrateClustersAddColumns(); + + private: + // Helper to create the 'clusters' table and avoid duplicating the code. + bool CreateClustersTable(); + + // Helper to create the 'clusters_and_visits' table and avoid duplicating the + // code. + bool CreateClustersAndVisitsTableAndIndex(); }; } // namespace history
diff --git a/components/mirroring/service/mirroring_service.cc b/components/mirroring/service/mirroring_service.cc index bd31cf9..7f247b6 100644 --- a/components/mirroring/service/mirroring_service.cc +++ b/components/mirroring/service/mirroring_service.cc
@@ -34,6 +34,13 @@ std::move(params), max_resolution, std::move(observer), std::move(resource_provider), std::move(outbound_channel), std::move(inbound_channel), io_task_runner_); + + // We could put a waitable event here and wait till initialization completed + // before exiting Start(). But that would actually be just waste of effort, + // because Session will not send anything over the channels until + // initialization is completed, hence no outer calls to the session + // will be made. + session_->AsyncInitialize(Session::AsyncInitializeDoneCB()); } void MirroringService::OnDisconnect() {
diff --git a/components/mirroring/service/session.cc b/components/mirroring/service/session.cc index 7f86cda..29f21f4c 100644 --- a/components/mirroring/service/session.cc +++ b/components/mirroring/service/session.cc
@@ -36,8 +36,6 @@ #include "components/mirroring/service/udp_socket_client.h" #include "components/mirroring/service/video_capture_client.h" #include "crypto/random.h" -#include "gpu/config/gpu_feature_info.h" -#include "gpu/ipc/client/gpu_channel_host.h" #include "media/audio/audio_input_device.h" #include "media/base/audio_capturer_source.h" #include "media/base/bind_to_current_loop.h" @@ -359,15 +357,13 @@ mojo::PendingReceiver<mojom::CastMessageChannel> inbound_channel, scoped_refptr<base::SingleThreadTaskRunner> io_task_runner) : session_params_(*session_params), - state_(MIRRORING), observer_(std::move(observer)), resource_provider_(std::move(resource_provider)), message_dispatcher_(std::make_unique<MessageDispatcher>( std::move(outbound_channel), std::move(inbound_channel), base::BindRepeating(&Session::OnResponseParsingError, - base::Unretained(this)))), - gpu_channel_host_(nullptr) { + base::Unretained(this)))) { DCHECK(resource_provider_); mirror_settings_.SetResolutionConstraints(max_resolution.width(), max_resolution.height()); @@ -391,26 +387,41 @@ setup_querier_ = std::make_unique<ReceiverSetupQuerier>( session_params_.receiver_address, std::move(url_loader_factory)); +} - if (gpu_) { - gpu_channel_host_ = gpu_->EstablishGpuChannelSync(); - if (gpu_channel_host_ && - gpu_channel_host_->gpu_feature_info().status_values - [gpu::GPU_FEATURE_TYPE_ACCELERATED_VIDEO_ENCODE] == - gpu::kGpuFeatureStatusEnabled) { - supported_profiles_ = - media::GpuVideoAcceleratorUtil::ConvertGpuToMediaEncodeProfiles( - gpu_channel_host_->gpu_info() - .video_encode_accelerator_supported_profiles); - } +void Session::AsyncInitialize(AsyncInitializeDoneCB done_cb) { + init_done_cb_ = std::move(done_cb); + if (!gpu_) { + // Post OnAsyncInitializeDone() instead of calling it directly to make sure + // that CreateAndSendOffer() is always called asynchronously. This kind of + // consistency is good for testing and reliability. + auto runner = base::ThreadTaskRunnerHandle::Get(); + SupportedProfiles empty_profiles; + runner->PostTask(FROM_HERE, base::BindOnce(&Session::OnAsyncInitializeDone, + weak_factory_.GetWeakPtr(), + std::move(empty_profiles))); + return; } - if (supported_profiles_.empty()) { + gpu_->CreateVideoEncodeAcceleratorProvider( + vea_provider_.BindNewPipeAndPassReceiver()); + vea_provider_->GetVideoEncodeAcceleratorSupportedProfiles(base::BindOnce( + &Session::OnAsyncInitializeDone, weak_factory_.GetWeakPtr())); +} + +void Session::OnAsyncInitializeDone(const SupportedProfiles& profiles) { + if (profiles.empty()) { // HW encoding is not supported. - gpu_channel_host_ = nullptr; gpu_.reset(); + } else { + supported_profiles_ = profiles; } + DCHECK_EQ(state_, INITIALIZING); + state_ = MIRRORING; + CreateAndSendOffer(); + if (!init_done_cb_.is_null()) + std::move(init_done_cb_).Run(); } Session::~Session() { @@ -476,7 +487,6 @@ video_encode_thread_ = nullptr; video_capture_client_.reset(); resource_provider_.reset(); - gpu_channel_host_ = nullptr; gpu_.reset(); if (observer_) { observer_->DidStop(); @@ -512,17 +522,13 @@ } } -media::VideoEncodeAccelerator::SupportedProfiles -Session::GetSupportedVeaProfiles() { - return supported_profiles_; -} - void Session::CreateVideoEncodeAccelerator( media::cast::ReceiveVideoEncodeAcceleratorCallback callback) { + DCHECK_NE(state_, INITIALIZING); if (callback.is_null()) return; std::unique_ptr<media::VideoEncodeAccelerator> mojo_vea; - if (gpu_ && gpu_channel_host_ && !supported_profiles_.empty()) { + if (gpu_ && !supported_profiles_.empty()) { if (!vea_provider_) { gpu_->CreateVideoEncodeAcceleratorProvider( vea_provider_.BindNewPipeAndPassReceiver()); @@ -808,7 +814,8 @@ // TODO(issuetracker.google.com/159352836): Refactor to use libcast's // OFFER message format. void Session::CreateAndSendOffer() { - DCHECK(state_ != STOPPED); + DCHECK_NE(state_, STOPPED); + DCHECK_NE(state_, INITIALIZING); // The random AES key and initialization vector pair used by all streams in // this session. @@ -844,7 +851,7 @@ // First, check if hardware VP8 and H264 are available. if (media::cast::ExternalVideoEncoder::IsRecommended( Codec::CODEC_VIDEO_VP8, session_params_.receiver_model_name, - GetSupportedVeaProfiles())) { + supported_profiles_)) { FrameSenderConfig config = MirrorSettings::GetDefaultVideoConfig( RtpPayloadType::VIDEO_VP8, Codec::CODEC_VIDEO_VP8); config.use_external_encoder = true; @@ -855,7 +862,7 @@ } if (media::cast::ExternalVideoEncoder::IsRecommended( Codec::CODEC_VIDEO_H264, session_params_.receiver_model_name, - GetSupportedVeaProfiles())) { + supported_profiles_)) { FrameSenderConfig config = MirrorSettings::GetDefaultVideoConfig( RtpPayloadType::VIDEO_H264, Codec::CODEC_VIDEO_H264); config.use_external_encoder = true;
diff --git a/components/mirroring/service/session.h b/components/mirroring/service/session.h index 41e8f30..fceb835fa 100644 --- a/components/mirroring/service/session.h +++ b/components/mirroring/service/session.h
@@ -34,10 +34,6 @@ } // namespace cast } // namespace media -namespace gpu { -class GpuChannelHost; -} // namespace gpu - namespace viz { class Gpu; } // namespace viz @@ -71,7 +67,10 @@ ~Session() override; - // RtpStreamClient implemenation. + using AsyncInitializeDoneCB = base::OnceCallback<void()>; + void AsyncInitialize(AsyncInitializeDoneCB done_cb); + + // RtpStreamClient implementation. void OnError(const std::string& message) override; void RequestRefreshFrame() override; void CreateVideoEncodeAccelerator( @@ -112,6 +111,7 @@ private: class AudioCapturingCallback; + using SupportedProfiles = media::VideoEncodeAccelerator::SupportedProfiles; // MediaRemoter::Client implementation. void ConnectToRemotingSource( @@ -145,26 +145,30 @@ // Callback by media::cast::VideoSender to report resource utilization. void ProcessFeedback(const media::VideoCaptureFeedback& feedback); - media::VideoEncodeAccelerator::SupportedProfiles GetSupportedVeaProfiles(); - // Create and send OFFER message. void CreateAndSendOffer(); // Send GET_CAPABILITIES message. void QueryCapabilitiesForRemoting(); + void OnAsyncInitializeDone(const SupportedProfiles& profiles); + // Provided by client. const mojom::SessionParameters session_params_; // State transition: + // INITIALIZING + // | + // \./ // MIRRORING <-------> REMOTING // | | // .---> STOPPED <----. enum { - MIRRORING, // A mirroring streaming session is starting or started. - REMOTING, // A remoting streaming session is starting or started. - STOPPED, // The session is stopped due to user's request or errors. - } state_; + INITIALIZING, // The session is initializing, and can't be used yet. + MIRRORING, // A mirroring streaming session is starting or started. + REMOTING, // A remoting streaming session is starting or started. + STOPPED, // The session is stopped due to user's request or errors. + } state_ = INITIALIZING; mojo::Remote<mojom::SessionObserver> observer_; mojo::Remote<mojom::ResourceProvider> resource_provider_; @@ -188,10 +192,12 @@ scoped_refptr<media::AudioInputDevice> audio_input_device_; std::unique_ptr<MediaRemoter> media_remoter_; std::unique_ptr<viz::Gpu> gpu_; - scoped_refptr<gpu::GpuChannelHost> gpu_channel_host_; - media::VideoEncodeAccelerator::SupportedProfiles supported_profiles_; + SupportedProfiles supported_profiles_; mojo::Remote<media::mojom::VideoEncodeAcceleratorProvider> vea_provider_; + // A callback to call after initialization is completed + AsyncInitializeDoneCB init_done_cb_; + base::WeakPtrFactory<Session> weak_factory_{this}; };
diff --git a/components/mirroring/service/session_unittest.cc b/components/mirroring/service/session_unittest.cc index a4c4041..65918d5 100644 --- a/components/mirroring/service/session_unittest.cc +++ b/components/mirroring/service/session_unittest.cc
@@ -125,6 +125,8 @@ // Called when sends an outbound message. MOCK_METHOD1(OnOutboundMessage, void(const std::string& message_type)); + MOCK_METHOD0(OnInitDone, void()); + // mojom::CastMessageHandler implementation. For outbound messages. void Send(mojom::CastMessagePtr message) override { EXPECT_TRUE(message->message_namespace == mojom::kWebRtcNamespace || @@ -231,6 +233,10 @@ task_environment_.RunUntilIdle(); } + Session::AsyncInitializeDoneCB MakeInitDoneCB() { + return base::BindOnce(&SessionTest::OnInitDone, base::Unretained(this)); + } + // Create a mirroring session. Expect to send OFFER message. void CreateSession(SessionType session_type) { session_type_ = session_type; @@ -257,11 +263,14 @@ EXPECT_CALL(*this, OnGetNetworkContext()).Times(1); EXPECT_CALL(*this, OnError(_)).Times(0); EXPECT_CALL(*this, OnOutboundMessage("OFFER")).Times(1); + EXPECT_CALL(*this, OnInitDone()).Times(1); + session_ = std::make_unique<Session>( std::move(session_params), gfx::Size(1920, 1080), std::move(session_observer_remote), std::move(resource_provider_remote), std::move(outbound_channel_remote), inbound_channel_.BindNewPipeAndPassReceiver(), nullptr); + session_->AsyncInitialize(MakeInitDoneCB()); task_environment_.RunUntilIdle(); Mock::VerifyAndClear(this); }
diff --git a/components/ntp_snippets/remote/remote_suggestions_provider_impl.cc b/components/ntp_snippets/remote/remote_suggestions_provider_impl.cc index 7ba5b48..69a338d 100644 --- a/components/ntp_snippets/remote/remote_suggestions_provider_impl.cc +++ b/components/ntp_snippets/remote/remote_suggestions_provider_impl.cc
@@ -18,6 +18,7 @@ #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/utf_string_conversions.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/default_clock.h" #include "base/time/time.h" @@ -1559,25 +1560,25 @@ const base::Value::List& list = pref_service_->GetValueList(prefs::kRemoteSuggestionCategories); for (const base::Value& entry : list) { - const base::DictionaryValue* dict = nullptr; - if (!entry.GetAsDictionary(&dict)) { + if (!entry.is_dict()) { DLOG(WARNING) << "Invalid category pref value: " << entry; continue; } - absl::optional<int> id = dict->FindIntKey(kCategoryContentId); + const base::Value::Dict& dict = entry.GetDict(); + absl::optional<int> id = dict.FindInt(kCategoryContentId); if (!id) { DLOG(WARNING) << "Invalid category pref value, missing '" << kCategoryContentId << "': " << entry; continue; } - std::u16string title; - if (!dict->GetString(kCategoryContentTitle, &title)) { + const std::string* title = dict.FindString(kCategoryContentTitle); + if (!title) { DLOG(WARNING) << "Invalid category pref value, missing '" << kCategoryContentTitle << "': " << entry; continue; } absl::optional<bool> included_in_last_server_response = - dict->FindBoolKey(kCategoryContentProvidedByServer); + dict.FindBool(kCategoryContentProvidedByServer); if (!included_in_last_server_response) { DLOG(WARNING) << "Invalid category pref value, missing '" << kCategoryContentProvidedByServer << "': " << entry; @@ -1585,7 +1586,7 @@ } // This wasn't always around, so it's okay if it's missing. bool allow_fetching_more_results = - dict->FindBoolKey(kCategoryContentAllowFetchingMore).value_or(false); + dict.FindBool(kCategoryContentAllowFetchingMore).value_or(false); Category category = Category::FromIDValue(*id); // The ranker may not persist the order of remote categories. @@ -1599,7 +1600,8 @@ CategoryInfo info = category == articles_category_ ? BuildArticleCategoryInfo(absl::nullopt) - : BuildRemoteCategoryInfo(title, allow_fetching_more_results); + : BuildRemoteCategoryInfo(base::UTF8ToUTF16(*title), + allow_fetching_more_results); CategoryContent* content = UpdateCategoryInfo(category, info); content->included_in_last_server_response = included_in_last_server_response.value();
diff --git a/components/omnibox/browser/actions/history_clusters_action.cc b/components/omnibox/browser/actions/history_clusters_action.cc index 9c15f78..e29827b2 100644 --- a/components/omnibox/browser/actions/history_clusters_action.cc +++ b/components/omnibox/browser/actions/history_clusters_action.cc
@@ -141,6 +141,15 @@ "PageEntityCollection", collection, collection_label, executed); } +void HistoryClustersAction::Execute(ExecutionContext& context) const { + if (context.client_.OpenJourneys()) { + // If the client opens Journeys in the Side Panel, we are done. + return; + } + // Otherwise call the superclass, which will open the WebUI URL. + OmniboxAction::Execute(context); +} + int32_t HistoryClustersAction::GetID() const { return static_cast<int32_t>(OmniboxActionId::HISTORY_CLUSTERS); }
diff --git a/components/omnibox/browser/actions/history_clusters_action.h b/components/omnibox/browser/actions/history_clusters_action.h index dff1ae4..7689c945 100644 --- a/components/omnibox/browser/actions/history_clusters_action.h +++ b/components/omnibox/browser/actions/history_clusters_action.h
@@ -28,6 +28,7 @@ const history::ClusterKeywordData& matched_keyword_data); void RecordActionShown(size_t position, bool executed) const override; + void Execute(ExecutionContext& context) const override; int32_t GetID() const override; #if defined(SUPPORT_PEDALS_VECTOR_ICONS) const gfx::VectorIcon& GetVectorIcon() const override;
diff --git a/components/omnibox/browser/actions/omnibox_action.cc b/components/omnibox/browser/actions/omnibox_action.cc index bd78a6b8a..7d07b5b 100644 --- a/components/omnibox/browser/actions/omnibox_action.cc +++ b/components/omnibox/browser/actions/omnibox_action.cc
@@ -31,8 +31,6 @@ OmniboxAction::LabelStrings::~LabelStrings() = default; -// ============================================================================= - namespace base { namespace trace_event { size_t EstimateMemoryUsage(const OmniboxAction::LabelStrings& self) { @@ -48,6 +46,12 @@ // ============================================================================= +bool OmniboxAction::Client::OpenJourneys() { + return false; +} + +// ============================================================================= + OmniboxAction::ExecutionContext::ExecutionContext( Client& client, OpenUrlCallback callback,
diff --git a/components/omnibox/browser/actions/omnibox_action.h b/components/omnibox/browser/actions/omnibox_action.h index 56ac0d2..4961701 100644 --- a/components/omnibox/browser/actions/omnibox_action.h +++ b/components/omnibox/browser/actions/omnibox_action.h
@@ -77,6 +77,11 @@ // Presents translation prompt for current tab web contents. virtual void PromptPageTranslation() = 0; + + // Opens Journeys in an embedder-specific way. If this returns true, that + // means that the embedder successfully opened Journeys, and the caller can + // early exit. If this returns false, the caller should open the WebUI. + virtual bool OpenJourneys(); }; // ExecutionContext provides the necessary structure for Action
diff --git a/components/page_info/core/features.cc b/components/page_info/core/features.cc index 44a59de..54c807e 100644 --- a/components/page_info/core/features.cc +++ b/components/page_info/core/features.cc
@@ -52,6 +52,10 @@ const base::Feature kPageInfoCookiesSubpage{"PageInfoCookiesSubpage", base::FEATURE_DISABLED_BY_DEFAULT}; + +const base::Feature kPageSpecificSiteDataDialog{ + "PageSpecificSiteDataDialog", base::FEATURE_DISABLED_BY_DEFAULT}; + #endif } // namespace page_info
diff --git a/components/page_info/core/features.h b/components/page_info/core/features.h index 9dd0242..c5bfc690f 100644 --- a/components/page_info/core/features.h +++ b/components/page_info/core/features.h
@@ -43,16 +43,15 @@ #if !BUILDFLAG(IS_ANDROID) // Enables the history section for Page Info on desktop. extern const base::Feature kPageInfoHistoryDesktop; -#endif -#if !BUILDFLAG(IS_ANDROID) // Hides site settings row. extern const base::Feature kPageInfoHideSiteSettings; -#endif -#if !BUILDFLAG(IS_ANDROID) // Enables Cookies Subpage. For implementation phase. extern const base::Feature kPageInfoCookiesSubpage; + +// Enables the new page specific site data dialog. +extern const base::Feature kPageSpecificSiteDataDialog; #endif } // namespace page_info
diff --git a/components/password_manager/core/browser/sync/password_sync_bridge.cc b/components/password_manager/core/browser/sync/password_sync_bridge.cc index f1870be..a7d7ca4 100644 --- a/components/password_manager/core/browser/sync/password_sync_bridge.cc +++ b/components/password_manager/core/browser/sync/password_sync_bridge.cc
@@ -902,11 +902,17 @@ sync_pb::EntitySpecifics PasswordSyncBridge::TrimRemoteSpecificsForCaching( const sync_pb::EntitySpecifics& entity_specifics) const { DCHECK(entity_specifics.has_password()); - sync_pb::EntitySpecifics trimmed_entity_specifics; - *trimmed_entity_specifics.mutable_password() - ->mutable_client_only_encrypted_data() = + + const sync_pb::PasswordSpecificsData trimmed_password_specifics_data = TrimPasswordSpecificsDataForCaching( entity_specifics.password().client_only_encrypted_data()); + if (trimmed_password_specifics_data.ByteSizeLong() == 0u) { + return sync_pb::EntitySpecifics(); + } + + sync_pb::EntitySpecifics trimmed_entity_specifics; + *trimmed_entity_specifics.mutable_password() + ->mutable_client_only_encrypted_data() = trimmed_password_specifics_data; return trimmed_entity_specifics; }
diff --git a/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc b/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc index 7ef08d57..e6a2551c 100644 --- a/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc +++ b/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc
@@ -1628,4 +1628,15 @@ specifics_with_only_unknown_fields.SerializeAsString()); } +TEST_F(PasswordSyncBridgeTest, + TrimRemoteSpecificsReturnsEmptyProtoWhenAllFieldsAreSupported) { + sync_pb::EntitySpecifics specifics; + sync_pb::PasswordSpecificsData* password_data = + specifics.mutable_password()->mutable_client_only_encrypted_data(); + password_data->set_username_value("username_value"); + + EXPECT_EQ(bridge()->TrimRemoteSpecificsForCaching(specifics).ByteSizeLong(), + 0u); +} + } // namespace password_manager
diff --git a/components/permissions/features.cc b/components/permissions/features.cc index f72beec..cace91d 100644 --- a/components/permissions/features.cc +++ b/components/permissions/features.cc
@@ -87,6 +87,12 @@ const base::Feature kPermissionsPostPromptSurvey{ "PermissionsPostPromptSurvey", base::FEATURE_DISABLED_BY_DEFAULT}; +// When enabled, permissions grants with a durable session model will have +// an expiration date set. The interpretation of the expiration date +// is not handled by this component, but left to the embedding browser. +const base::Feature kRecordPermissionExpirationTimestamps{ + "RecordPermissionExpirationTimestamps", base::FEATURE_ENABLED_BY_DEFAULT}; + #endif // BUILDFLAG(IS_ANDROID) } // namespace features
diff --git a/components/permissions/features.h b/components/permissions/features.h index 33796bcf..b9708eb 100644 --- a/components/permissions/features.h +++ b/components/permissions/features.h
@@ -62,6 +62,9 @@ COMPONENT_EXPORT(PERMISSIONS_COMMON) extern const base::Feature kPermissionsPostPromptSurvey; +COMPONENT_EXPORT(PERMISSIONS_COMMON) +extern const base::Feature kRecordPermissionExpirationTimestamps; + #endif // BUILDFLAG(IS_ANDROID) } // namespace features
diff --git a/components/permissions/permission_context_base.cc b/components/permissions/permission_context_base.cc index f3ea3f8..87393ec 100644 --- a/components/permissions/permission_context_base.cc +++ b/components/permissions/permission_context_base.cc
@@ -531,15 +531,40 @@ DCHECK(content_setting == CONTENT_SETTING_ALLOW || content_setting == CONTENT_SETTING_BLOCK); - using Constraints = content_settings::ContentSettingConstraints; + content_settings::ContentSettingConstraints constraints = { + base::Time(), is_one_time ? content_settings::SessionModel::OneTime + : content_settings::SessionModel::Durable}; + +#if !BUILDFLAG(IS_ANDROID) + if (base::FeatureList::IsEnabled( + features::kRecordPermissionExpirationTimestamps)) { + // The Permissions module in Safety check will revoke permissions after + // a finite amount of time. + // We're only interested in expiring permissions that: + // 1. Are ALLOWed. + // 2. Fall back to ASK. + // 3. Are not already a one-time grant. + if (content_setting == CONTENT_SETTING_ALLOW && !is_one_time) { + // For #2, by definition, that should be all of them. If that changes in + // the future, consider whether revocation for such permission makes + // sense, and/or change this to an early return so that we don't + // unnecessarily record timestamps where we don't need them. + DCHECK(content_settings::ContentSettingsRegistry::GetInstance() + ->Get(content_settings_type_) + ->GetInitialDefaultSetting() == CONTENT_SETTING_ASK); + + // To avoid inadvertently recording a history entry that a permission was + // granted at a certain exact time, the timer is fuzzed. + constraints.expiration = base::Time::Now() + base::Days(60 + rand() % 7); + } + } +#endif // !BUILDFLAG(IS_ANDROID) + PermissionsClient::Get() ->GetSettingsMap(browser_context_) - ->SetContentSettingDefaultScope( - requesting_origin, embedding_origin, content_settings_type_, - content_setting, - is_one_time ? Constraints{base::Time(), - content_settings::SessionModel::OneTime} - : Constraints()); + ->SetContentSettingDefaultScope(requesting_origin, embedding_origin, + content_settings_type_, content_setting, + constraints); } bool PermissionContextBase::PermissionAllowedByPermissionsPolicy(
diff --git a/components/permissions/permission_context_base_unittest.cc b/components/permissions/permission_context_base_unittest.cc index d1be7a2..134d7ff 100644 --- a/components/permissions/permission_context_base_unittest.cc +++ b/components/permissions/permission_context_base_unittest.cc
@@ -905,4 +905,45 @@ PermissionStatusSource::UNSPECIFIED); } +#if !BUILDFLAG(IS_ANDROID) +TEST_F(PermissionContextBaseTests, ExpirationAllow) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitWithFeatures( + {features::kRecordPermissionExpirationTimestamps}, {}); + + base::Time now = base::Time::Now(); + TestAskAndDecide_TestContent(ContentSettingsType::NOTIFICATIONS, + CONTENT_SETTING_ALLOW); + + GURL primary_url("https://www.google.com"); + GURL secondary_url; + auto* hcsm = PermissionsClient::Get()->GetSettingsMap(browser_context()); + base::Time expiration = hcsm->GetExpirationForTesting( + primary_url, secondary_url, ContentSettingsType::NOTIFICATIONS); + + // The expiration date should lie between two months and up to one more week. + int delta_days = (expiration - now).InDays(); + EXPECT_GE(delta_days, 60); + EXPECT_LE(delta_days, 67); +} + +TEST_F(PermissionContextBaseTests, ExpirationBlock) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitWithFeatures( + {features::kRecordPermissionExpirationTimestamps}, {}); + + TestAskAndDecide_TestContent(ContentSettingsType::NOTIFICATIONS, + CONTENT_SETTING_BLOCK); + + GURL primary_url("https://www.google.com"); + GURL secondary_url; + auto* hcsm = PermissionsClient::Get()->GetSettingsMap(browser_context()); + base::Time expiration = hcsm->GetExpirationForTesting( + primary_url, secondary_url, ContentSettingsType::NOTIFICATIONS); + + // Expiration is not set for BLOCKed permissions. + EXPECT_EQ(base::Time(), expiration); +} +#endif // !BUILDFLAG(IS_ANDROID) + } // namespace permissions
diff --git a/components/policy/core/browser/configuration_policy_handler.cc b/components/policy/core/browser/configuration_policy_handler.cc index cf35260..80d04e0 100644 --- a/components/policy/core/browser/configuration_policy_handler.cc +++ b/components/policy/core/browser/configuration_policy_handler.cc
@@ -72,17 +72,36 @@ bool TypeCheckingPolicyHandler::CheckPolicySettings(const PolicyMap& policies, PolicyErrorMap* errors) { const base::Value* value = nullptr; - return CheckAndGetValue(policies, errors, &value); + return CheckAndGetValue(policy_name(), value_type_, + policies.Get(policy_name()), errors, &value); +} + +bool TypeCheckingPolicyHandler::CheckPolicySettings( + const char* policy, + base::Value::Type value_type, + const PolicyMap::Entry* entry, + PolicyErrorMap* errors) { + const base::Value* value = nullptr; + return CheckAndGetValue(policy, value_type, entry, errors, &value); } bool TypeCheckingPolicyHandler::CheckAndGetValue(const PolicyMap& policies, PolicyErrorMap* errors, const base::Value** value) { - // It is safe to use `GetValueUnsafe()` as multiple policy types are handled. - *value = policies.GetValueUnsafe(policy_name()); - if (*value && (*value)->type() != value_type_) { - errors->AddError(policy_name(), IDS_POLICY_TYPE_ERROR, - base::Value::GetTypeName(value_type_)); + return CheckAndGetValue(policy_name(), value_type_, + policies.Get(policy_name()), errors, value); +} + +bool TypeCheckingPolicyHandler::CheckAndGetValue(const char* policy, + base::Value::Type value_type, + const PolicyMap::Entry* entry, + PolicyErrorMap* errors, + const base::Value** value) { + // It is safe to use `value_unsafe()` as multiple policy types are handled. + *value = entry ? entry->value_unsafe() : nullptr; + if (*value && (*value)->type() != value_type) { + errors->AddError(policy, IDS_POLICY_TYPE_ERROR, + base::Value::GetTypeName(value_type)); return false; } return true;
diff --git a/components/policy/core/browser/configuration_policy_handler.h b/components/policy/core/browser/configuration_policy_handler.h index 4b2326be..da49eeaa 100644 --- a/components/policy/core/browser/configuration_policy_handler.h +++ b/components/policy/core/browser/configuration_policy_handler.h
@@ -12,6 +12,7 @@ #include "base/callback.h" #include "base/compiler_specific.h" #include "base/values.h" +#include "components/policy/core/common/policy_map.h" #include "components/policy/core/common/schema.h" #include "components/policy/policy_export.h" @@ -79,6 +80,7 @@ // subclassed to handle policies that have a name. class POLICY_EXPORT NamedPolicyHandler : public ConfigurationPolicyHandler { public: + // TODO: migrate named policy handlers from char* to base::StringPiece explicit NamedPolicyHandler(const char* policy_name); ~NamedPolicyHandler() override; NamedPolicyHandler(const NamedPolicyHandler&) = delete; @@ -106,12 +108,23 @@ bool CheckPolicySettings(const PolicyMap& policies, PolicyErrorMap* errors) override; + static bool CheckPolicySettings(const char* policy, + base::Value::Type value_type, + const PolicyMap::Entry* entry, + PolicyErrorMap* errors); + protected: // Runs policy checks and returns the policy value if successful. bool CheckAndGetValue(const PolicyMap& policies, PolicyErrorMap* errors, const base::Value** value); + static bool CheckAndGetValue(const char* policy, + base::Value::Type value_type, + const PolicyMap::Entry* entry, + PolicyErrorMap* errors, + const base::Value** value); + private: // The type the value of the policy should have. base::Value::Type value_type_;
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index 9d2bd60..9357e65 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb
@@ -1297,7 +1297,6 @@ Genaue Informationen zu gültigen <ph name="URL_LABEL" />-Mustern finden Sie unter https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. „<ph name="WILDCARD_VALUE" />“ ist kein akzeptierter Wert für diese Richtlinie.</translation> <translation id="2299220924812062390">Liste der aktivierten Plug-ins angeben</translation> -<translation id="2301048990069984110">Unterstützung für Chrome-Apps unter Windows, Mac und Linux verlängern.</translation> <translation id="2303795211377219696">„Automatisches Ausfüllen“ für Kreditkarten aktivieren</translation> <translation id="2304009805995145854">Seit <ph name="PRODUCT_NAME" />-Version 67 ist die Website-Isolierung auf allen Desktop-Plattformen standardmäßig aktiviert. Dadurch wird jede Website in einem eigenen Prozess ausgeführt. Eine Website ist ein Protokoll plus eTLD+1 (z. B. https://beispiel.de). Wenn diese Richtlinie aktiviert ist, verändert sich dieses Verhalten nicht. Es wird lediglich verhindert, dass Nutzer die Einstellung ändern können und z. B. „Disable site isolation“ in chrome://flags verwenden. Seit <ph name="PRODUCT_NAME" />-Version 76 wird die Website-Isolierung nicht deaktiviert, wenn die Richtlinie deaktiviert oder nicht konfiguriert wird. Nutzer können sie stattdessen selbst deaktivieren. @@ -6522,10 +6521,6 @@ <translation id="8099880303030573137">Inaktivitätsverzögerung im Akkubetrieb</translation> <translation id="8101381354936029836">Atomische Richtlinien-Gruppe:</translation> <translation id="8102913158860568230">Standardeinstellung für MediaStream</translation> -<translation id="8103563905615378194">Gibt an, ob der Ladevorgang durch ein adaptives Lademodell angehalten werden kann, um die Akkulaufzeit zu verlängern. - - Wenn das Gerät im Netzbetrieb ist, prüft das adaptive Lademodell, ob der Ladevorgang angehalten werden sollte, um die Akkulaufzeit zu verlängern. Wenn der Ladevorgang durch das adaptive Lademodell angehalten wird, wird der Akkustand auf einem bestimmten Level gehalten, z. B. bei 80 %. Wenn der Nutzer das Gerät später benötigt, wird der Akku vollständig aufgeladen. - Wenn die Richtlinie auf „True“ gesetzt oder nicht konfiguriert ist, wird das adaptive Lademodell aktiviert und der Ladevorgang kann angehalten werden, um die Akkulaufzeit zu verlängern. Wenn die Richtlinie auf „False“ gesetzt ist, wird der Ladevorgang durch das adaptive Lademodell nicht beeinflusst.</translation> <translation id="8104962233214241919">Client-Zertifikate für diese Websites automatisch auswählen</translation> <translation id="8114382167597081590">Eingeschränkten Modus auf YouTube nicht erzwingen</translation> <translation id="8117921351531866504">Mit dieser Richtlinie kannst du Websites erlauben zu prüfen, ob ein Nutzer Zahlungsmethoden gespeichert hat. @@ -7362,10 +7357,6 @@ <translation id="8951350807133946005">Datenträger-Cache-Verzeichnis festlegen</translation> <translation id="8955719471735800169">Zurück nach oben</translation> <translation id="8956312248048980644">Diese Richtlinie erlaubt standardmäßig das an Ursprünge gebundene Agent-Clustering.</translation> -<translation id="8967125680876068695">Chrome-Apps wurden für Windows, Mac und Linux eingestellt. - Wenn diese Richtlinie aktiviert wird, erlaubt <ph name="PRODUCT_NAME" /> es, dass Chrome-Apps bis zu dem Datum im Juni 2022, an dem die Unterstützung für Chrome-Apps auf allen Plattformen beendet wird, auf diesen Plattformen ausgeführt werden. - Wenn diese Richtlinie deaktiviert oder nicht eingerichtet ist, dürfen Chrome-Apps unter Umständen nicht ausgeführt werden, je nach dem Status des Einstellungs-Roll-outs. - In beiden Fällen sind Chrome-Apps zulässig, deren Installation durch die Richtlinie erzwungen wird.</translation> <translation id="8970205333161758602">Hinweis auf Einstellung von <ph name="PRODUCT_FRAME_NAME" /> unterdrücken</translation> <translation id="8976248126101463034">Gnubby-Authentifizierung für Remotezugriff-Hosts zulassen</translation> <translation id="8976531594979650914">Standarddrucker des Betriebssystems als Standardeinstellung verwenden</translation>
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb index 31d9267e..ae3cc6cf 100644 --- a/components/policy/resources/policy_templates_es-419.xtb +++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -1320,7 +1320,6 @@ Para obtener información detallada sobre los patrones de <ph name="URL_LABEL" /> válidos, consulta https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> no es un valor aceptado para esta política.</translation> <translation id="2299220924812062390">Especificar una lista de complementos habilitados</translation> -<translation id="2301048990069984110">Extender la compatibilidad de las Apps de Chrome en Windows, Mac y Linux</translation> <translation id="2303795211377219696">Habilitar la función Autocompletar para tarjetas de crédito</translation> <translation id="2304009805995145854">A partir de <ph name="PRODUCT_NAME" /> 67, se habilitó el aislamiento de sitios de forma predeterminada en todas las plataformas de escritorio, lo que hace que los sitios se ejecuten en su propio proceso. Un sitio es un esquema más eTLD+1 (p. ej., https://example.com). Si habilitas esta política, no se modificará ese comportamiento; solo evita que los usuarios cambien la configuración (p. ej., inhabilitar el aislamiento de sitios en chrome://flags). A partir de <ph name="PRODUCT_NAME" /> 76, si inhabilitas la política o no la estableces, no se desactivará el aislamiento de sitios, pero los usuarios podrán inhabilitar esta configuración. @@ -6600,10 +6599,6 @@ <translation id="8099880303030573137">Demora de inactividad con batería</translation> <translation id="8101381354936029836">Grupo atómico de la política:</translation> <translation id="8102913158860568230">Configuración de mediastream predeterminada</translation> -<translation id="8103563905615378194">Especifica si se permite que un modelo de carga adaptable detenga el proceso de carga para extender la duración de la batería. - - Cuando el dispositivo funciona con CA, el modelo de carga adaptable evalúa si el proceso de carga se debe detener para extender la duración de la batería. Si el modelo de carga adaptable detiene el proceso de carga, la batería se mantendrá en cierto nivel (p. ej., al 80%) y luego cargará el dispositivo hasta el 100% cuando el usuario lo necesite. - Si estableces esta política como verdadera o no la configuras, el modelo de carga adaptable se habilitará y podrá detener el proceso de carga para extender la duración de la batería. Si la estableces como falsa, el modelo de carga adaptable no modificará el proceso de carga.</translation> <translation id="8104962233214241919">Seleccionar automáticamente certificados de clientes para estos sitios</translation> <translation id="8114382167597081590">No aplicar el modo restringido en YouTube</translation> <translation id="8117921351531866504">Te permite establecer si los sitios web están autorizados a verificar que el usuario tenga formas de pago guardadas. @@ -7448,10 +7443,6 @@ <translation id="8951350807133946005">Configurar el directorio de caché de disco</translation> <translation id="8955719471735800169">Volver al principio</translation> <translation id="8956312248048980644">Permitir el agrupamiento en clústeres de agentes con clave de origen de forma predeterminada</translation> -<translation id="8967125680876068695">Las Apps de Chrome dejaron de estar disponibles en Windows, Mac y Linux. - Si se habilita esta política, <ph name="PRODUCT_NAME" /> seguirá permitiendo que se ejecuten las Apps de Chrome en estas plataformas hasta la fecha final en la que se quite su compatibilidad con todas las plataformas (junio de 2022). - Si se inhabilita esta política o no se establece, es posible que no se puedan ejecutar las Apps de Chrome (en función del estado del lanzamiento de la desactivación). - En cualquier caso, las Apps de Chrome que están instaladas de manera automática por la política seguirán habilitadas.</translation> <translation id="8970205333161758602">Elimina el mensaje de desactivación de <ph name="PRODUCT_FRAME_NAME" />.</translation> <translation id="8976248126101463034">Permitir autenticación gnubby para hosts de acceso remoto</translation> <translation id="8976531594979650914">Usar la impresora predeterminada del sistema como predeterminada</translation>
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb index 5a5292a..4c489cb8 100644 --- a/components/policy/resources/policy_templates_es.xtb +++ b/components/policy/resources/policy_templates_es.xtb
@@ -1323,7 +1323,6 @@ Para obtener información detallada sobre los patrones de <ph name="URL_LABEL" /> válidos, consulta https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Esta política no acepta el valor <ph name="WILDCARD_VALUE" />.</translation> <translation id="2299220924812062390">Especificar una lista de complementos habilitados</translation> -<translation id="2301048990069984110">Amplía la compatibilidad de aplicaciones de Chrome en Windows, Mac y Linux.</translation> <translation id="2303795211377219696">Habilitar la función Autocompletar para tarjetas de crédito</translation> <translation id="2304009805995145854">Desde <ph name="PRODUCT_NAME" /> 67, el aislamiento de sitios web ha estado habilitado de forma predeterminada en todas las versiones para ordenador, lo que hace que todos los sitios se ejecuten en su propio proceso. Un sitio consiste en un esquema más el eTLD+1 (por ejemplo, https://example.com). Si se habilita esta política, no cambia ese comportamiento. Solo evita que los usuarios cambien esta opción (por ejemplo, inhabilitando el aislamiento de sitio web de chrome://flags). Desde <ph name="PRODUCT_NAME" /> 76, si se inhabilita la política o no se establece, no se desactiva el aislamiento de sitios web, pero los usuarios pueden inhabilitar esta opción. @@ -5168,7 +5167,7 @@ <translation id="6553143066970470539">Porcentaje de brillo de la pantalla</translation> <translation id="6555557921186817432">Programa un reinicio automático después de que se haya aplicado una actualización de <ph name="PRODUCT_OS_NAME" />. - Si se le asigna el valor true a esta política, se programará un reinicio automático cuando se haya aplicado una actualización de <ph name="PRODUCT_OS_NAME" /> y sea necesario reiniciar para completar el proceso de actualización. El reinicio se programará automáticamente, pero puede retrasarse en el dispositivo hasta 24 horas si un usuario lo está usando en ese momento. + Si se le asigna el valor true a esta política, se programará un reinicio automático cuando se haya aplicado una actualización de <ph name="PRODUCT_OS_NAME" /> y sea necesario reiniciar para completar el proceso de actualización. El reinicio se programará inmediatamente, pero puede retrasarse en el dispositivo hasta 24 horas si un usuario lo está usando en ese momento. Si se le asigna el valor false a está política, no se programará ningún reinicio automático tras aplicar una actualización de <ph name="PRODUCT_OS_NAME" />. El proceso de actualización se completará cuando el usuario reinicie el dispositivo. @@ -6619,10 +6618,6 @@ <translation id="8099880303030573137">Retraso de inactividad cuando el dispositivo funciona con la batería</translation> <translation id="8101381354936029836">Grupo atómico de la política:</translation> <translation id="8102913158860568230">Opción predeterminada de MediaStream</translation> -<translation id="8103563905615378194">Especifica si se permite que el modelo de Carga inteligente suspenda el proceso de carga para prolongar la duración de la batería. - - Cuando el dispositivo está conectado a la red eléctrica, el modelo de Carga inteligente evalúa si se debe suspender el proceso de carga para aumentar la duración de la batería. Si el modelo de Carga inteligente suspende el proceso de carga, mantendrá la batería a un determinado nivel (por ejemplo, al 80 %) y, después, cargará el dispositivo al 100 % cuando el usuario lo necesite. - Si se le asigna el valor True a esta política o no se establece, el modelo de Carga inteligente se habilitará y se permitirá que suspenda el proceso de carga para prolongar la duración de la batería. Si se le asigna el valor False, el modelo de Carga inteligente no influirá en el proceso de carga.</translation> <translation id="8104962233214241919">Seleccionar automáticamente certificados de cliente de estos sitios</translation> <translation id="8114382167597081590">No aplicar el modo restringido en YouTube</translation> <translation id="8117921351531866504">Permite establecer si los sitios web pueden comprobar si el usuario tiene algún método de pago guardado. @@ -7450,10 +7445,6 @@ <translation id="8951350807133946005">Establecer directorio de caché de disco</translation> <translation id="8955719471735800169">Volver al principio</translation> <translation id="8956312248048980644">Permite los clústeres de agentes con clave de origen de forma predeterminada.</translation> -<translation id="8967125680876068695">Las aplicaciones de Chrome ya no están disponibles en Windows, Mac y Linux. - Si se habilita esta política, <ph name="PRODUCT_NAME" /> seguirá permitiendo que se ejecuten aplicaciones de Chrome en esas plataformas hasta la fecha límite en la que se eliminará la compatibilidad con todas las plataformas (junio del 2022). - Si esta política se inhabilita o no se establece, es posible que no se puedan ejecutar aplicaciones de Chrome, según la fase de desactivación en que se encuentren. - En cualquiera de estos casos, las aplicaciones de Chrome cuya instalación sea forzada mediante una política seguirán estando permitidas.</translation> <translation id="8970205333161758602">Eliminar el mensaje de desactivación de <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8976248126101463034">Permitir la autenticación gnubby para los hosts de acceso remoto</translation> <translation id="8976531594979650914">Usar impresora predeterminada del sistema como opción predeterminada</translation>
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb index a14c59c..72e0265 100644 --- a/components/policy/resources/policy_templates_fr.xtb +++ b/components/policy/resources/policy_templates_fr.xtb
@@ -1316,7 +1316,6 @@ Pour en savoir plus sur les formats <ph name="URL_LABEL" /> valides, veuillez consulter https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. La valeur <ph name="WILDCARD_VALUE" /> n'est pas acceptée pour cette règle.</translation> <translation id="2299220924812062390">Indiquer une liste de plug-ins activés</translation> -<translation id="2301048990069984110">Étendre la compatibilité pour les applis Chrome sur Windows, Mac et Linux.</translation> <translation id="2303795211377219696">Activer la saisie automatique pour les cartes de crédit</translation> <translation id="2304009805995145854">Depuis <ph name="PRODUCT_NAME" /> 67, l'isolation de sites a été activée par défaut sur toutes les plates-formes de bureau. Chaque site exécute ainsi son propre processus. Un site est un schéma avec eTLD+1 (ex. : https://example.com). Activer cette règle ne change pas ce comportement. Cela empêche seulement les utilisateurs de s'y soustraire (par exemple, via l'option "Désactiver l'isolation de sites" sur chrome://flags). Depuis <ph name="PRODUCT_NAME" /> 76, si cette règle est désactivée ou qu'elle n'est pas configurée, l'isolation de sites n'est pas désactivée, mais les utilisateurs peuvent s'y soustraire. @@ -6562,10 +6561,6 @@ <translation id="8099880303030573137">Délai d'inactivité (batterie)</translation> <translation id="8101381354936029836">Groupe atomique de la règle :</translation> <translation id="8102913158860568230">Paramètre MediaStream par défaut</translation> -<translation id="8103563905615378194">Indique si un modèle de recharge adaptative est autorisé pour suspendre le processus de charge et allonger la durée de vie de la batterie. - - Lorsque l'appareil est branché sur le secteur, le modèle de recharge adaptative évalue la nécessité de suspendre le processus de charge pour allonger la durée de vie de la batterie. Si le modèle de recharge adaptative suspend le processus de charge, il maintient la batterie à un certain niveau (par ex. 80 %), puis il la charge à 100 % lorsque l'utilisateur en a besoin. - Si cette règle est définie sur "True" ou si elle n'est pas définie, le modèle de recharge adaptative sera activé et autorisé à suspendre le processus de charge pour allonger la durée de vie de la batterie. Si cette règle est configurée sur "False", le modèle de recharge adaptative sera sans effet sur le processus de charge.</translation> <translation id="8104962233214241919">Sélectionner automatiquement des certificats client pour ces sites</translation> <translation id="8114382167597081590">Ne pas appliquer le mode restreint sur YouTube</translation> <translation id="8117921351531866504">Permet de définir si les sites Web sont autorisés à vérifier si l'utilisateur a enregistré des modes de paiement. @@ -7381,10 +7376,6 @@ <translation id="8951350807133946005">Définir le répertoire du cache disque</translation> <translation id="8955719471735800169">Haut de page</translation> <translation id="8956312248048980644">Autorise par défaut le clustering d'agents selon l'origine.</translation> -<translation id="8967125680876068695">Les applis Chrome sont obsolètes sur Windows, Mac et Linux. - Si cette règle est activée, <ph name="PRODUCT_NAME" /> permettra toujours aux applis Chrome de s'exécuter sur ces plates-formes jusqu'en juin 2022, date à laquelle elles ne seront plus compatibles sur aucune plate-forme. - Si cette règle est désactivée ou qu'elle n'est pas configurée, il se peut que les applis Chrome ne soient pas autorisées à s'exécuter, selon l'état d'avancement du processus d'abandon. - Dans les deux cas, les applis Chrome qui sont installées d'office par cette règle seront toujours autorisées.</translation> <translation id="8970205333161758602">Supprimer l'invite de fermeture de <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8976248126101463034">Autoriser l'authentification gnubby pour les hôtes d'accès à distance</translation> <translation id="8976531594979650914">Utiliser l'imprimante système par défaut</translation>
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index a7c03dc7..6df43ab 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -100,6 +100,7 @@ <translation id="1095209545735032039">Memblokir Serial API di situs ini</translation> <translation id="1096105751829466145">Penyedia penelusuran default</translation> <translation id="1099282607296956954">Aktifkan Isolasi Situs untuk setiap situs</translation> +<translation id="1100840127293327071">Jangan centang opsi untuk menyimpan data penjelajahan yang ada secara default</translation> <translation id="1105572260329131950">Gunakan ikon default untuk koneksi aman</translation> <translation id="1107538157073168076">Nonaktifkan ekstensi insight</translation> <translation id="1110426799149444997">Nonaktifkan penelusuran region <ph name="GOOGLE_LENS_PRODUCT_NAME" />.</translation> @@ -747,6 +748,14 @@ <translation id="1781356041596378058">Kebijakan ini juga mengontrol akses ke Opsi Developer Android. Jika Anda menyetel kebijakan ini ke true, pengguna tidak dapat mengakses Opsi Developer. Jika Anda menyetel kebijakan ini ke false atau tidak menyetel kebijakan ini, pengguna dapat mengakses Opsi Developer dengan mengetuk tujuh kali nomor versi di aplikasi setelan Android.</translation> <translation id="1787790976045065845">Kebijakan ini hanya berlaku jika kebijakan <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_POLICY_NAME" /> disetel ke <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_LOCK" /> atau <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_LOGOUT" />, dan pengguna yang melakukan autentikasi melalui smart card menghapus smart card tersebut. Kemudian, kebijakan ini menentukan berapa detik notifikasi yang memberi tahu pengguna tentang tindakan mendatang akan ditampilkan. Notifikasi ini memblokir layar. Tindakan hanya akan dilakukan setelah notifikasi ini berakhir. Pengguna dapat mencegah tindakan terjadi dengan memasukkan kembali smart card sebelum notifikasi berakhir. Jika kebijakan ini disetel ke nol, tidak akan ada notifikasi yang ditampilkan dan tindakan akan segera dilakukan.</translation> <translation id="1793346220873697538">Nonaktifkan pencetakan PIN secara default</translation> +<translation id="1794457906032475749">Jika kebijakan ini disetel ke Aktif, opsi untuk menyimpan data penjelajahan yang ada saat membuat profil perusahaan akan dicentang secara default. + +Jika kebijakan ini tidak disetel atau disetel ke Nonaktif, opsi untuk menyimpan data penjelajahan yang ada saat membuat profil perusahaan tidak akan dicentang secara default. + +Apa pun nilai yang dipilih, pengguna akan dapat memutuskan apakah akan menyimpan data penjelajahan yang ada saat membuat profil perusahaan. + +Kebijakan ini tidak akan berpengaruh jika opsi untuk menyimpan data penjelajahan yang ada tidak tersedia; hal ini terjadi jika pemisahan profil perusahaan diterapkan secara ketat, atau jika data berasal dari profil yang sudah dikelola. +</translation> <translation id="179694024208061102">Jika kebijakan disetel ke Aktif, <ph name="PRODUCT_NAME" /> akan mencoba membuka beberapa URL dalam browser alternatif, seperti <ph name="IE_PRODUCT_NAME" />. Fitur ini disetel menggunakan kebijakan dalam grup <ph name="LEGACY_BROWSER_SUPPORT_POLICY_GROUP" />. Jika kebijakan disetel ke Nonaktif atau tidak disetel, <ph name="PRODUCT_NAME" /> tidak akan mencoba membuka URL yang ditetapkan dalam browser alternatif.</translation> @@ -1323,7 +1332,6 @@ Untuk informasi selengkapnya tentang pola <ph name="URL_LABEL" /> yang valid, lihat https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> bukanlah nilai yang diterima untuk kebijakan ini.</translation> <translation id="2299220924812062390">Tentukan daftar plugin yang diaktifkan</translation> -<translation id="2301048990069984110">Memperluas dukungan untuk Aplikasi Chrome di Windows, Mac, dan Linux.</translation> <translation id="2303795211377219696">Mengaktifkan IsiOtomatis untuk kartu kredit</translation> <translation id="2304009805995145854">Sejak <ph name="PRODUCT_NAME" /> 67, isolasi situs telah diaktifkan secara default di semua platform Desktop, yang menyebabkan setiap situs berjalan dalam prosesnya sendiri. Situs adalah skema plus eTLD+1 (misalnya, https://example.com). Menyetel kebijakan ke Aktif tidak mengubah perilaku tersebut; hanya mencegah pengguna menonaktifkannya (misalnya, menggunakan Nonaktifkan isolasi situs di chrome://flags). Sejak <ph name="PRODUCT_NAME" /> 76, menyetel kebijakan ini ke Nonaktif atau membiarkannya tanpa disetel tidak akan menonaktifkan isolasi situs, tetapi memungkinkan pengguna untuk menonaktifkannya. @@ -1645,6 +1653,7 @@ Di <ph name="MS_WIN_NAME" />, fungsi ini hanya tersedia di instance yang dihubungkan ke domain <ph name="MS_AD_NAME" />, dijalankan di Windows 10 Pro, atau didaftarkan di Pengelolaan Cloud Browser Chrome. Di <ph name="MAC_OS_NAME" />, fungsi ini hanya tersedia di instance yang dikelola melalui MDM, atau dihubungkan ke domain melalui MCX.</translation> <translation id="2623014935069176671">Tunggu aktivitas pengguna awal</translation> +<translation id="2625026032335150744">Centang opsi untuk menyimpan data penjelajahan yang ada secara default</translation> <translation id="2625398797484317969">Mengontrol setelan untuk Jawaban Instan.</translation> <translation id="262740370354162807">Aktifkan penyerahan dokumen ke <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="2633084400146331575">Aktifkan respons lisan</translation> @@ -2067,6 +2076,7 @@ Untuk informasi selengkapnya tentang pola <ph name="URL_LABEL" /> yang valid, lihat https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> bukanlah nilai yang diterima untuk kebijakan ini.</translation> <translation id="305106159605171619">Pengurangan Agen Pengguna dinonaktifkan, dan tidak diaktifkan oleh Uji Coba Kolom atau Uji Coba Asal.</translation> <translation id="3053265701996417839">Microsoft Windows 7</translation> +<translation id="3063302084011279315">Nonaktifkan Screencast</translation> <translation id="3064530882228745118">Gunakan pencarian CNAME selama autentikasi Kerberos</translation> <translation id="3066446511111537292">Izinkan pengguna terafiliasi di perangkat ini untuk menggunakan sideload ADB</translation> <translation id="3070119171976169951">Cegah gambar pihak ketiga menampilkan perintah autentikasi</translation> @@ -2284,6 +2294,7 @@ <translation id="3255762580838224124">Jika kebijakan disetel, tiap tampilan akan diputar sesuai dengan setelan orientasi layar setiap kali mulai ulang dan saat pertama kali terhubung setelah nilai kebijakan berubah. Pengguna dapat mengubah rotasi tampilan melalui halaman setelan setelah login, tetapi tampilan akan kembali berubah saat mulai ulang berikutnya. Kebijakan ini akan berlaku untuk tampilan utama dan sekunder. Jika tidak disetel, nilai default adalah 0 derajat dan pengguna bebas mengubahnya. Dalam hal ini, nilai default tidak diterapkan kembali saat mulai ulang.</translation> +<translation id="3257786863492892609">Mengontrol kebijakan untuk Screencast.</translation> <translation id="3258380413685430793">Jalankan semua konten <ph name="FLASH_PLUGIN_NAME" /></translation> <translation id="325883417142483505">Menyetel kebijakan akan menetapkan daftar URL Login perusahaan (hanya protokol HTTP dan HTTPS). Layanan perlindungan sandi akan merekam hash sandi yang dilengkapi salt di URL ini dan menggunakannya untuk deteksi penggunaan ulang sandi. Agar <ph name="PRODUCT_NAME" /> dapat merekam hash sandi yang dilengkapi salt dengan benar, pastikan halaman login mengikuti pedoman ( https://www.chromium.org/developers/design-documents/create-amazing-password-forms ). @@ -3264,6 +3275,7 @@ <translation id="441686537793821907">Blokir penginstalan ekstensi eksternal</translation> <translation id="4423597592074154136">Tentukan setelan proxy secara manual</translation> <translation id="4424004842303301809">Nonaktifkan pelaporan peristiwa pencegahan kebocoran data</translation> +<translation id="4426601693403743089">Nonaktifkan dogfood Screencast untuk pengguna Family Link</translation> <translation id="4427173305799125784">Penampil PDF tidak dapat menganotasi PDF</translation> <translation id="4432762137771104529">Aktifkan Pelaporan Lengkap Safe Browsing</translation> <translation id="443454694385851356">Lama (tidak aman)</translation> @@ -4878,6 +4890,7 @@ Setiap item daftar kebijakan merupakan string yang memuat ID ekstensi dan, terkadang, URL "update" yang dipisahkan titik koma (<ph name="SEMICOLON" />). ID ekstensi adalah string 32 huruf yang ditemukan misalnya di <ph name="CHROME_EXTENSIONS_LINK" /> saat dalam mode developer. Jika URL "update" ditentukan, URL ini akan mengarah ke dokumen XML manifes update seperti yang dijelaskan di <ph name="LINK_TO_EXTENSION_DOC1" />. Secara default, URL update Chrome Web Store akan digunakan (yang saat ini adalah "https://clients2.google.com/service/update2/crx"). Perlu diketahui, URL "update" yang ditetapkan dalam kebijakan ini hanya digunakan untuk penginstalan awal; sedangkan update ekstensi berikutnya akan menggunakan URL update yang ditunjukkan dalam manifes ekstensi. Misalnya, <ph name="LOGIN_SCREEN_EXTENSION_POLICY_EXAMPLE" /> akan menginstal aplikasi <ph name="SMART_CARD_CONNECTOR_APP_NAME" /> dari URL "update" Chrome Web Store standar. Untuk informasi selengkapnya terkait ekstensi hosting, lihat: <ph name="LINK_TO_EXTENSION_DOC2" /></translation> +<translation id="6274202259872570803">Screencast</translation> <translation id="6275497712828649588">Sembunyikan peringatan keamanan saat tanda command line yang berpotensi berbahaya digunakan</translation> <translation id="6275833043726517413">Menggunakan implementasi <ph name="CORS" /> lama, bukan <ph name="CORS" /> baru. @@ -4911,7 +4924,15 @@ Menyetel <ph name="CHROME_OS_RELEASE_CHANNEL_POLICY_NAME" /> hanya akan berpengaruh jika <ph name="CHROME_OS_RELEASE_CHANNEL_DELEGATED_POLICY_NAME" /> disetel ke Salah (False).</translation> <translation id="6305373713165475629">Jika kebijakan disetel, mode warna persentase cetakan default akan ditimpa. Jika mode ini tidak tersedia, kebijakan ini akan diabaikan.</translation> +<translation id="6308109234708949641">Kebijakan ini mengaktifkan fitur Screencast bagi pengguna Family Link dan memberi Screencast izin untuk membuat dan mentranskripsikan rekaman layar serta mengupload ke Drive. + Kebijakan ini tidak memengaruhi jenis pengguna lain. + Kebijakan ini tidak memengaruhi kebijakan <ph name="PROJECTOR_ENABLED_POLICY_NAME" /> bagi pengguna versi bisnis. + + Jika kebijakan ini disetel ke aktif, dogfood Screencast akan diaktifkan untuk pengguna Family Link. + Jika kebijakan ini disetel ke nonaktif, dogfood Screencast akan dinonaktifkan untuk pengguna Family Link. + Jika kebijakan ini tidak disetel, dogfood Screencast akan dinonaktifkan secara default untuk pengguna Family Link.</translation> <translation id="6310223829319187614">Mengaktifkan pelengkapan otomatis nama domain saat pengguna login</translation> +<translation id="6310756730808079944">Aktifkan Screencast</translation> <translation id="631081324835911099">Memaksa pengguna logout saat token autentikasi akun utama mereka menjadi tidak valid. Kebijakan ini dapat melindungi pengguna dari akses ke konten yang dibatasi di properti web Google. Jika kebijakan ini ditetapkan ke True, pengguna akan langsung logout saat token autentikasinya menjadi tidak valid dan upaya untuk memulihkan token ini gagal. @@ -5299,6 +5320,12 @@ Jika disetel ke false atau tidak dikonfigurasi, pembuatan dan proses masuk pengguna yang dilindungi akan dinonaktifkan. Semua pengguna diawasi yang sudah ada akan tersembunyi. CATATAN: Perilaku default untuk perangkat pelanggan dan perusahaan berbeda: pada perangkat pelanggan, pengguna yang dilindungi diaktifkan secara default, namun pada perangkat perusahaan, pengguna yang dilindungi dinonaktifkan secara default.</translation> +<translation id="6648746349186337075">Kebijakan ini memberi Screencast izin untuk membuat dan mentranskripsikan rekaman layar dan mengupload ke Drive bagi pengguna versi bisnis. + Kebijakan ini tidak memengaruhi pengguna Family Link. + Kebijakan ini tidak memengaruhi kebijakan <ph name="PROJECTOR_DOGFOOD_FOR_FAMILY_LINK_ENABLED_POLICY_NAME" /> bagi pengguna Family Link. + + Jika kebijakan ini disetel ke aktif atau tidak disetel, Screencast akan diaktifkan. + Jika kebijakan ini disetel ke nonaktif, Screencast akan dinonaktifkan.</translation> <translation id="665023848306499203">Mengizinkan perangkat memilih untuk mengupdate ke versi tertentu</translation> <translation id="6652197835259177259">Setelan pengguna yang dikelola secara lokal</translation> <translation id="6653897159826215341">Jika kebijakan disetel ke Aktif, <ph name="PRODUCT_NAME" /> akan membuka dialog cetak sistem, bukan pratinjau cetak bawaan saat pengguna meminta hasil cetak. @@ -6201,6 +6228,7 @@ Jika kebijakan ini disetel ke aktif atau tidak disetel, konversi unit Jawaban Instan akan diaktifkan. Jika kebijakan ini disetel ke nonaktif, konversi unit Jawaban Instan akan dinonaktifkan.</translation> <translation id="7587345076013230465">Minta pengguna memilih sertifikat klien setiap kali kebijakan pemilihan otomatis cocok dengan beberapa sertifikat di layar login</translation> +<translation id="7587921466180902617">Aktifkan dogfood Screencast untuk pengguna Family Link</translation> <translation id="759957074386651883">Setelan Safe Browsing</translation> <translation id="7604169113182304895">Aplikasi Android dapat memilih untuk menerima daftar ini secara sukarela. Anda tidak dapat memaksa aplikasi untuk menerimanya.</translation> <translation id="7612157962821894603">Tanda di seluruh sistem yang akan diterapkan pada waktu mulai <ph name="PRODUCT_NAME" /></translation> @@ -6448,6 +6476,7 @@ Rekomendasi: Kunci layar saat tidak ada aktivitas dengan mengaktifkan penguncian layar selama penangguhan dan menangguhkan <ph name="PRODUCT_OS_NAME" /> setelah penundaan waktu tidak ada aktivitas. Hanya gunakan kebijakan ini jika penguncian layar terjadi pada waktu yang jauh lebih awal daripada penangguhan, atau jika Anda tidak ingin penangguhan saat tidak ada aktivitas.</translation> <translation id="7895553628261067384">Akses jarak jauh</translation> +<translation id="7900469325540540107">Menyimpan data penjelajahan saat membuat profil perusahaan secara default</translation> <translation id="7902040092815978832">Menampilkan keyboard numerik untuk sandi</translation> <translation id="7904177352786629708">Jika kebijakan disetel ke Aktif, CNAME lookup akan dilewati. Nama server akan digunakan sebagaimana dimasukkan saat menghasilkan SPN Kerberos. @@ -6610,10 +6639,6 @@ <translation id="8099880303030573137">Menunda waktu menganggur saat menggunakan daya baterai</translation> <translation id="8101381354936029836">Grup atom kebijakan:</translation> <translation id="8102913158860568230">Setelan streaming media default</translation> -<translation id="8103563905615378194">Menentukan apakah model pengisian daya adaptif akan diizinkan untuk menunda proses pengisian daya guna memperpanjang masa pakai baterai. - - Jika perangkat mengaktifkan AC (pengisian daya adaptif), model pengisian daya adaptif akan mengevaluasi apakah proses pengisian daya harus ditunda untuk memperpanjang masa pakai baterai. Jika proses pengisian daya ditunda, model pengisian daya adaptif akan menghentikan proses pengisian daya pada level tertentu (misalnya 80%), lalu kembali mengisi daya perangkat sampai 100% saat pengguna memerlukannya. - Jika kebijakan ini disetel ke Benar (True) atau tidak disetel, model pengisian daya adaptif akan diaktifkan dan diizinkan untuk menunda proses pengisian daya guna memperpanjang masa pakai baterai. Jika kebijakan ini disetel ke Salah (False), model pengisian daya adaptif tidak akan memengaruhi proses pengisian daya.</translation> <translation id="8104962233214241919">Memilih sertifikat klien untuk situs ini secara otomatis</translation> <translation id="8114382167597081590">Jangan terapkan Mode Terbatas di YouTube</translation> <translation id="8117921351531866504">Memungkinkan Anda menentukan situs diizinkan atau tidak untuk memeriksa apakah pengguna telah menyimpan metode pembayaran. @@ -7436,10 +7461,6 @@ <translation id="8951350807133946005">Setel direktori cache disk</translation> <translation id="8955719471735800169">Kembali ke atas</translation> <translation id="8956312248048980644">Mengizinkan pengelompokan cluster agen dengan kunci asal secara default.</translation> -<translation id="8967125680876068695">Aplikasi Chrome tidak digunakan lagi di Windows, Mac, dan Linux. - Jika kebijakan ini diaktifkan, <ph name="PRODUCT_NAME" /> akan terus mengizinkan Aplikasi Chrome dijalankan di platform berikut hingga tanggal akhir saat dukungan Aplikasi Chrome dihapus di semua platform, yakni Juni 2022. - Jika kebijakan ini dinonaktifkan atau tidak disetel, Aplikasi Chrome mungkin tidak diizinkan berjalan, bergantung pada status peluncuran penghentian. - Dalam kasus apa pun, Aplikasi Chrome yang diinstal otomatis oleh kebijakan akan terus diizinkan.</translation> <translation id="8970205333161758602">Tindas permintaan penghentian <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8976248126101463034">Izinkan autentikasi gnubby untuk host akses jarak jauh</translation> <translation id="8976531594979650914">Menggunakan Printer Default Sistem sebagai Default</translation>
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb index ea6ce53..950d750 100644 --- a/components/policy/resources/policy_templates_it.xtb +++ b/components/policy/resources/policy_templates_it.xtb
@@ -101,6 +101,7 @@ <translation id="1096105751829466145">Provider di ricerca predefinito</translation> <translation id="1099282607296956954">Attiva isolamento dei siti per ogni sito </translation> +<translation id="1100840127293327071">Non selezionare l'opzione per mantenere i dati di navigazione esistenti per impostazione predefinita</translation> <translation id="1105572260329131950">Vengono usate icone predefinite per le connessioni sicure</translation> <translation id="1107538157073168076">Disattiva estensione Insights</translation> <translation id="1110426799149444997">Disattiva la ricerca per sezione di <ph name="GOOGLE_LENS_PRODUCT_NAME" />.</translation> @@ -744,6 +745,14 @@ <translation id="1781356041596378058">Questa norma controlla anche l'accesso alle Opzioni sviluppatore di Android. Se la norma viene impostata su true, gli utenti non possono accedere alle Opzioni sviluppatore. Se la norma viene impostata su false o non viene impostata, gli utenti possono accedere alle Opzioni sviluppatore toccando sette volte il numero di build nell'app Impostazioni di Android.</translation> <translation id="1787790976045065845">Questo criterio viene applicato soltanto se il criterio <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_POLICY_NAME" /> è impostato su <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_LOCK" /> o <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_LOGOUT" /> e un utente che effettua l'autenticazione tramite smart card rimuove quest'ultima. Consente inoltre di specificare per quanti secondi viene visualizzata una notifica che informa l'utente dell'azione imminente. Questa notifica blocca lo schermo. L'azione viene compiuta soltanto allo scadere della notifica. L'utente può impedire l'azione inserendo di nuovo la smart card prima della scadenza della notifica. Se questo criterio viene impostato su 0, non viene visualizzata alcuna notifica e l'azione viene compiuta immediatamente.</translation> <translation id="1793346220873697538">Disattiva la stampa PIN per impostazione predefinita</translation> +<translation id="1794457906032475749">Se questo criterio viene attivato, l'opzione per mantenere i dati di navigazione esistenti durante la creazione di un profilo aziendale sarà selezionata per impostazione predefinita. + +Se questo criterio viene disattivato o se non viene configurato, l'opzione per mantenere i dati di navigazione esistenti durante la creazione di un profilo aziendale non sarà selezionata per impostazione predefinita. + +Indipendentemente dal valore, l'utente potrà decidere se mantenere o meno i dati di navigazione esistenti durante la creazione di un profilo aziendale. + +Questo criterio non ha effetto se l'opzione per mantenere i dati di navigazione esistenti non è disponibile. Questo accade se viene applicata in modo forzato la separazione dei profili aziendali o se i dati provengono da un profilo già gestito. +</translation> <translation id="179694024208061102">Se il criterio viene impostato su Attivato, <ph name="PRODUCT_NAME" /> proverà ad avviare alcuni URL in un browser alternativo, ad esempio <ph name="IE_PRODUCT_NAME" />. Questa funzionalità viene impostata con i criteri del gruppo <ph name="LEGACY_BROWSER_SUPPORT_POLICY_GROUP" />. Se il criterio viene impostato su Disattivato o se non viene impostato, <ph name="PRODUCT_NAME" /> non proverà ad avviare gli URL impostati in un browser alternativo.</translation> @@ -1318,7 +1327,6 @@ Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio.</translation> <translation id="2299220924812062390">Consente di specificare un elenco dei plug-in attivati</translation> -<translation id="2301048990069984110">Estendi il supporto delle app di Chrome su Windows, Mac e Linux</translation> <translation id="2303795211377219696">Attiva la Compilazione automatica per le carte di credito</translation> <translation id="2304009805995145854">A partire da <ph name="PRODUCT_NAME" /> 67, l'isolamento dei siti è stato attivato per impostazione predefinita su tutte le piattaforme desktop, così che ogni sito venga eseguito nel proprio processo. Ogni sito è uno schema più eTLD+1 (ad es. https://example.com). Se il criterio viene impostato su Attivato, il comportamento non cambia; impedisce solo la disattivazione da parte degli utenti (ad esempio, utilizzando la voce "Disattiva l'isolamento dei siti" in chrome://flags). A partire da <ph name="PRODUCT_NAME" /> 76, se il criterio viene impostato su Disattivato o se non viene configurato, l'isolamento dei siti non viene disattivato, ma è consentita la disattivazione da parte degli utenti. @@ -1640,6 +1648,7 @@ Su <ph name="MS_WIN_NAME" />, questa funzionalità è disponibile soltanto sulle istanze che fanno parte di un dominio <ph name="MS_AD_NAME" />, sono in esecuzione su Windows 10 Pro o sono registrate in Chrome Browser Cloud Management. Su <ph name="MAC_OS_NAME" />, questa funzionalità è disponibile soltanto sulle istanze gestite tramite MDM o aggiunte a un dominio tramite MCX.</translation> <translation id="2623014935069176671">Attesa dell'attività iniziale dell'utente</translation> +<translation id="2625026032335150744">Seleziona l'opzione per mantenere i dati di navigazione esistenti per impostazione predefinita</translation> <translation id="2625398797484317969">Controlla le impostazioni di Risposte rapide.</translation> <translation id="262740370354162807">Attiva l'invio di documenti a <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="2633084400146331575">Attiva la funzione di lettura vocale</translation> @@ -2062,6 +2071,7 @@ Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio.</translation> <translation id="305106159605171619">Riduzione dello user agent disattivata e non attivata da Field-Trials o Origin-Trials.</translation> <translation id="3053265701996417839">Microsoft Windows 7</translation> +<translation id="3063302084011279315">Disattiva Registra schermo</translation> <translation id="3064530882228745118">Utilizza ricerca CNAME durante l'autenticazione Kerberos</translation> <translation id="3066446511111537292">Consenti agli utenti affiliati di questo dispositivo di utilizzare il processo sideload ADB</translation> <translation id="3070119171976169951">Impedisci la visualizzazione di immagini di terze parti in un prompt di autenticazione</translation> @@ -2278,6 +2288,7 @@ <translation id="3255762580838224124">La configurazione del criterio comporta la rotazione di ogni display nell'orientamento specificato a ogni riavvio e la prima volta che viene eseguita la connessione del display dopo la modifica del valore del criterio. Gli utenti possono modificare la rotazione del display tramite la pagina delle impostazioni dopo aver effettuato l'accesso, ma la rotazione tornerà allo stato precedente al riavvio successivo. Questo criterio si applica ai display primari e secondari. Se non viene configurato, il valore predefinito è 0 e gli utenti sono liberi di modificarlo. In questo caso, il valore predefinito non viene applicato nuovamente al riavvio.</translation> +<translation id="3257786863492892609">Controlla i criteri relativi alla funzionalità Registra schermo.</translation> <translation id="3258380413685430793">Esegui tutti i contenuti di <ph name="FLASH_PLUGIN_NAME" /></translation> <translation id="325883417142483505">La configurazione del criterio consente di impostare un elenco di URL di accesso aziendale (solo protocolli HTTP e HTTPS). Il servizio di protezione tramite password acquisisce gli hash con salt delle password in questi URL e li utilizza per il rilevamento del riutilizzo delle password. Per consentire a <ph name="PRODUCT_NAME" /> di acquisire correttamente gli hash con salt della password, assicurati che le pagine di accesso seguano queste linee guida (https://www.chromium.org/developers/design-documents/create-amazing-password-forms). @@ -3241,6 +3252,7 @@ <translation id="441686537793821907">Blocca l'installazione di estensioni esterne</translation> <translation id="4423597592074154136">Specifica manualmente le impostazioni proxy</translation> <translation id="4424004842303301809">Disattiva la generazione di rapporti sugli eventi di prevenzione di fughe di dati</translation> +<translation id="4426601693403743089">Disattiva la versione sperimentale di Registra schermo per gli utenti di Family Link</translation> <translation id="4427173305799125784">Il visualizzatore PDF non può aggiungere annotazioni nei PDF</translation> <translation id="4432762137771104529">Attiva rapporti estesi su Navigazione sicura</translation> <translation id="443454694385851356">Precedente (non sicuro)</translation> @@ -4845,6 +4857,7 @@ Ogni elemento nell'elenco del criterio è una stringa contenente un ID estensione e, facoltativamente, un URL "di aggiornamento" separati da punto e virgola (<ph name="SEMICOLON" />). L'ID estensione è la stringa di 32 lettere che si trova, ad esempio, all'indirizzo <ph name="CHROME_EXTENSIONS_LINK" /> quando è attiva la modalità sviluppatore. L'URL "di aggiornamento", se specificato, deve indirizzare a un documento XML manifest di aggiornamento come descritto all'indirizzo <ph name="LINK_TO_EXTENSION_DOC1" />. Per impostazione predefinita, viene utilizzato l'URL di aggiornamento del Chrome Web Store (che attualmente è "https://clients2.google.com/service/update2/crx"). Tieni presente che l'URL "di aggiornamento" impostato in questo criterio viene utilizzato esclusivamente per l'installazione iniziale; per i successivi aggiornamenti dell'estensione viene utilizzato l'URL di aggiornamento indicato nel file manifest dell'estensione. Ad esempio, <ph name="LOGIN_SCREEN_EXTENSION_POLICY_EXAMPLE" /> installa l'app <ph name="SMART_CARD_CONNECTOR_APP_NAME" /> dall'URL "di aggiornamento" standard del Chrome Web Store. Ulteriori informazioni sulle estensioni in hosting sono disponibili all'indirizzo: <ph name="LINK_TO_EXTENSION_DOC2" />.</translation> +<translation id="6274202259872570803">Registra schermo</translation> <translation id="6275497712828649588">Nascondi avvisi di sicurezza quando vengono usati flag della riga di comando potenzialmente pericolosi</translation> <translation id="6275833043726517413">Consente di usare l'implementazione <ph name="CORS" /> legacy anziché la nuova implementazione <ph name="CORS" />. @@ -4878,7 +4891,15 @@ L'impostazione di <ph name="CHROME_OS_RELEASE_CHANNEL_POLICY_NAME" /> ha effetto solo se <ph name="CHROME_OS_RELEASE_CHANNEL_DELEGATED_POLICY_NAME" /> è impostato su False.</translation> <translation id="6305373713165475629">La configurazione di questo criterio consente di sostituire la modalità di stampa a colori predefinita. Se la modalità non è disponibile, questo criterio viene ignorato.</translation> +<translation id="6308109234708949641">Questo criterio consente di attivare la funzionalità Registra schermo per gli utenti di Family Link e la autorizza a creare e trascrivere la registrazione dello schermo e a caricarla su Drive. + Questo criterio non influisce su altri tipi di utenti. + Questo criterio non influisce sul criterio <ph name="PROJECTOR_ENABLED_POLICY_NAME" /> per gli utenti aziendali. + + Se il criterio viene attivato, la versione sperimentale di Registra schermo verrà attivata per gli utenti di Family Link. + Se viene disattivato, la versione sperimentale di Registra schermo verrà disattivata per gli utenti di Family Link. + Se non viene configurato, la versione sperimentale di Registra schermo sarà disattivata per impostazione predefinita per gli utenti di Family Link.</translation> <translation id="6310223829319187614">Consente il completamento automatico del nome di dominio durante l'accesso dell'utente</translation> +<translation id="6310756730808079944">Attiva Registra schermo</translation> <translation id="631081324835911099">Consente di forzare la disconnessione dell'utente quando il token di autenticazione del suo account principale non è più valido. Questo criterio può proteggere l'utente dall'accesso a contenuti con limitazioni sulle proprietà web di Google. Se questo criterio viene impostato su True, l'utente sarà disconnesso dall'account non appena il suo token di autenticazione non sarà più valido e se i tentativi di ripristinarlo non andranno a buon fine. @@ -5255,6 +5276,12 @@ Se questa norma è impostata su false o non è configurata, la creazione di utenti supervisionati e il relativo accesso saranno disattivati. Tutti gli utenti supervisionati esistenti saranno nascosti. NOTA. Il comportamento predefinito per dispositivi consumer ed enterprise è diverso: sui dispositivi consumer, gli utenti supervisionati sono abilitati per impostazione predefinita, mentre sui dispositivi enterprise sono disabilitati per impostazione predefinita.</translation> +<translation id="6648746349186337075">Questo criterio consente di autorizzare Registra schermo a creare e trascrivere la registrazione dello schermo e a caricarla su Drive per gli utenti aziendali. + Questo criterio non influisce sugli utenti di Family Link. + Questo criterio non influisce sul criterio <ph name="PROJECTOR_DOGFOOD_FOR_FAMILY_LINK_ENABLED_POLICY_NAME" /> per gli utenti di Family Link. + + Se il criterio viene attivato o se non viene configurato, la funzionalità Registra schermo verrà attivata. + Se il criterio viene disattivato, la funzionalità Registra schermo verrà disattivata.</translation> <translation id="665023848306499203">Consenti ai dispositivi di selezionare una versione specifica per l'aggiornamento</translation> <translation id="6652197835259177259">Impostazioni degli utenti gestiti localmente</translation> <translation id="6653897159826215341">Se il criterio viene impostato su Attivato, in <ph name="PRODUCT_NAME" /> viene aperta la finestra di dialogo di stampa di sistema anziché l'anteprima di stampa integrata quando un utente richiede una stampa. @@ -6158,6 +6185,7 @@ Se il criterio è attivato o non impostato, la funzionalità di conversione delle unità di Risposte rapide sarà attiva. Se il criterio è disattivato, la funzionalità di conversione delle unità di Risposte rapide sarà disattivata.</translation> <translation id="7587345076013230465">Richiedi all'utente di selezionare il certificato client quando il criterio di selezione automatica corrisponde a più certificati nella schermata di accesso</translation> +<translation id="7587921466180902617">Attiva la versione sperimentale di Registra schermo per gli utenti di Family Link</translation> <translation id="759957074386651883">Impostazioni di Navigazione sicura</translation> <translation id="7604169113182304895">Le app Android potrebbero decidere volontariamente se rispettare o meno questo elenco. Non è possibile imporre il rispetto dell'elenco.</translation> <translation id="7612157962821894603">Contrassegni a livello di sistema da applicare all'avvio di <ph name="PRODUCT_NAME" /></translation> @@ -6405,6 +6433,7 @@ Consiglio: blocca lo schermo in caso di inattività attivando il blocco schermo in caso di sospensione e fai in modo che <ph name="PRODUCT_OS_NAME" /> entri in sospensione dopo il ritardo di inattività. Usa questo criterio soltanto quando il blocco dello schermo dovrebbe avvenire molto tempo prima della sospensione o quando non vuoi che venga attivata la sospensione in caso di inattività.</translation> <translation id="7895553628261067384">Accesso remoto</translation> +<translation id="7900469325540540107">Mantieni i dati di navigazione per impostazione predefinita durante la creazione di un profilo aziendale</translation> <translation id="7902040092815978832">Mostra la tastiera numerica per la password</translation> <translation id="7904177352786629708">Impostando il criterio su Attivato, la ricerca CNAME viene saltata. Il nome del server viene utilizzato come valore inserito durante la generazione del Kerberos SPN. @@ -6567,10 +6596,6 @@ <translation id="8099880303030573137">Ritardo inattività in caso di utilizzo della batteria</translation> <translation id="8101381354936029836">Gruppo atomico di criteri:</translation> <translation id="8102913158860568230">Impostazione stream multimediale predefinito</translation> -<translation id="8103563905615378194">Consente di specificare se un modello di ricarica adattiva può sospendere la procedura di ricarica per prolungare la durata della batteria. - - Quando per il dispositivo viene usata l'alimentazione CA, il modello di ricarica adattiva valuta se sospendere o meno la procedura di ricarica per prolungare la durata della batteria. Se il modello di ricarica adattiva sospende la procedura di ricarica, mantiene la batteria a un determinato livello (ossia 80%), dopodiché ricarica il dispositivo fino al 100% quando l'utente ne ha bisogno. - Se questo criterio viene impostato su True o se non viene configurato, il modello di ricarica adattiva verrà attivato e potrà sospendere la procedura di ricarica per prolungare la durata della batteria. Se questo criterio viene impostato su False, il modello di ricarica adattiva non influirà sulla procedura di ricarica.</translation> <translation id="8104962233214241919">Seleziona automaticamente i certificati client per questi siti</translation> <translation id="8114382167597081590">Non imporre la Modalità con restrizioni su YouTube</translation> <translation id="8117921351531866504">Consente di stabilire se consentire o meno ai siti web di controllare se l'utente ha salvato dei metodi di pagamento. @@ -7385,10 +7410,6 @@ <translation id="8951350807133946005">Impostazione directory della cache su disco</translation> <translation id="8955719471735800169">Torna all'inizio</translation> <translation id="8956312248048980644">Consente per impostazione predefinita il clustering di agenti in base all'origine.</translation> -<translation id="8967125680876068695">Le app di Chrome sono state ritirate su Windows, Mac e Linux. - Se questo criterio viene attivato, <ph name="PRODUCT_NAME" /> continuerà a consentire l'esecuzione delle app di Chrome su queste piattaforme fino alla data ultima del ritiro del supporto di queste app su tutte le piattaforme, vale a dire giugno 2022. - Se questo criterio viene disattivato o se non viene configurato, potrebbe non essere consentita l'esecuzione delle app di Chrome, in base allo stato del ritiro graduale. - In ogni caso, continueranno a essere consentite le app di Chrome con installazione forzata in base al criterio.</translation> <translation id="8970205333161758602">Eliminazione del messaggio di richiesta di turndown di <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8976248126101463034">Consenti l'autenticazione Gnubby per gli host di accesso remoto</translation> <translation id="8976531594979650914">Usa stampante di sistema come predefinita</translation>
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb index f52b78c5..9c5b82f 100644 --- a/components/policy/resources/policy_templates_ja.xtb +++ b/components/policy/resources/policy_templates_ja.xtb
@@ -96,6 +96,7 @@ <translation id="1095209545735032039">シリアル API をブロックするサイトを指定します</translation> <translation id="1096105751829466145">デフォルトの検索プロバイダ</translation> <translation id="1099282607296956954">すべてのサイトに対してサイト分離を有効にする</translation> +<translation id="1100840127293327071">既存の閲覧データを保持するオプションをデフォルトでオンにしない</translation> <translation id="1105572260329131950">安全な接続にデフォルトのアイコンを使用する</translation> <translation id="1107538157073168076">分析情報の拡張機能を無効にする</translation> <translation id="1110426799149444997"><ph name="GOOGLE_LENS_PRODUCT_NAME" /> の地域検索を無効にする。</translation> @@ -721,6 +722,14 @@ <translation id="1781356041596378058">このポリシーでは、Android 開発者向けオプションへのアクセスも管理できます。このポリシーを true に設定した場合、ユーザーは開発者向けオプションにアクセスできません。このポリシーを false に設定するか未設定のままにした場合、ユーザーは Android 設定アプリのビルド番号を 7 回タップすれば開発者向けオプションにアクセスできます。</translation> <translation id="1787790976045065845">このポリシーは、<ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_POLICY_NAME" /> ポリシーが <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_LOCK" /> または <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_LOGOUT" /> に設定されている場合に、スマートカードで認証を行うユーザーがスマートカードを取り出したときにのみ適用されます。このポリシーでは、行われる処理の通知を何秒間表示するかを指定できます。この通知は画面を占拠して表示され、指定した表示時間が経過して通知が非表示になった後に処理が行われます。ユーザーは、通知が非表示になる前にスマートカードを入れ直すことで、処理が行われないようにすることができます。このポリシーを 0 に設定すると、通知は表示されず、処理がすぐに行われます。</translation> <translation id="1793346220873697538">デフォルトで PIN の印刷を無効にします</translation> +<translation id="1794457906032475749">このポリシーを有効に設定した場合、企業プロファイルの作成時に既存の閲覧データを保持するオプションがデフォルトでオンになります。 + +このポリシーを未設定のままにするか無効にした場合は、企業プロファイルの作成時に既存の閲覧データを保持するオプションがデフォルトでオンになりません。 + +このポリシーで設定した値に関係なく、ユーザーは企業プロファイルの作成時に既存の閲覧データを保持するかどうかを選択できます。 + +既存の閲覧データを保持するオプションが利用できない場合、このポリシーは無視されます。たとえば、企業プロファイルの分離が厳密に行われている場合やデータがすでに管理対象プロファイルにある場合などです。 +</translation> <translation id="179694024208061102">このポリシーを有効に設定した場合、<ph name="PRODUCT_NAME" /> は一部の URL に対して <ph name="IE_PRODUCT_NAME" /> などの代替ブラウザの起動を試みます。この機能は、<ph name="LEGACY_BROWSER_SUPPORT_POLICY_GROUP" /> グループのポリシーを使って設定します。 このポリシーを無効に設定するか未設定のままにした場合、<ph name="PRODUCT_NAME" /> は指定された URL に対して代替ブラウザを起動しません。</translation> @@ -1231,7 +1240,6 @@ 有効な <ph name="URL_LABEL" /> パターンについて詳しくは、https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns をご覧ください。このポリシーの値に「<ph name="WILDCARD_VALUE" />」は使用できません。</translation> <translation id="2299220924812062390">有効なプラグインのリストを指定する</translation> -<translation id="2301048990069984110">Windows、Mac、Linux で Chrome アプリを使用できるようサポートを拡張する。</translation> <translation id="2303795211377219696">クレジット カードの自動入力を有効にする</translation> <translation id="2304009805995145854"><ph name="PRODUCT_NAME" /> 67 以降、サイト分離はすべてのデスクトップ プラットフォームでデフォルトで有効になっており、すべてのサイトが独自のプロセスで実行されます。サイトは、スキームと eTLD+1 で構成されます(例: https://example.com)。このポリシーを有効にしても、ユーザーによる無効化(サイト分離を無効にする chrome://flags の使用など)ができなくなる点以外に、動作の変更はありません。<ph name="PRODUCT_NAME" /> 76 以降では、このポリシーを無効に設定するか未設定のままにしても、サイト分離は依然として有効のままですが、ユーザーが無効にできるようになります。<ph name="ISOLATE_ORIGINS_POLICY_NAME" /> を使用して、サイト単位でなく、より細かいレベルで発行元を指定して分離することもできます(例: https://a.example.com)。<ph name="PRODUCT_OS_NAME" /> バージョン 76 以前では、<ph name="DEVICE_LOGIN_SCREEN_SITE_PER_PROCESS_POLICY_NAME" /> デバイス ポリシーを同じ値に設定してください(値が異なる場合、ユーザー セッションの開始時に遅延が生じる可能性があります)。注: Android では代わりに <ph name="SITE_PER_PROCESS_ANDROID_POLICY_NAME" /> ポリシーを使用してください。</translation> <translation id="2306505001667207184">自動選択ポリシーが複数の証明書と一致した場合に常にクライアント証明書を選択するよう求めるメッセージがユーザーに表示されます。</translation> @@ -1523,6 +1531,7 @@ <ph name="MS_WIN_NAME" /> では、この機能は <ph name="MS_AD_NAME" /> ドメインに追加されたインスタンス、Windows 10 Pro で実行されているインスタンス、Chrome ブラウザ クラウド管理に登録されているインスタンスでのみ使用できます。<ph name="MAC_OS_NAME" /> では、この機能は MDM を介して管理されるか MCX を介してドメインに追加されたインスタンスでのみ使用できます。</translation> <translation id="2623014935069176671">最初のユーザー操作を待機する</translation> +<translation id="2625026032335150744">既存の閲覧データを保持するオプションをデフォルトでオンにする</translation> <translation id="2625398797484317969">クイック アンサーの設定を管理します。</translation> <translation id="262740370354162807"><ph name="CLOUD_PRINT_NAME" /> へのドキュメントの送信を有効にします。</translation> <translation id="2633084400146331575">音声フィードバックを有効にする</translation> @@ -1937,6 +1946,7 @@ 有効な <ph name="URL_LABEL" /> パターンについて詳しくは、https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns をご覧ください。このポリシーの値に「<ph name="WILDCARD_VALUE" />」は使用できません。</translation> <translation id="305106159605171619">ユーザー エージェントの削減を無効にして、フィールド トライアルやオリジン トライアルによる有効化を許可しない。</translation> <translation id="3053265701996417839">Microsoft Windows 7</translation> +<translation id="3063302084011279315">スクリーンキャストを無効にする</translation> <translation id="3064530882228745118">Kerberos 認証時に CNAME 検索を使用する</translation> <translation id="3066446511111537292">このデバイスの関連ユーザーに ADB サイドローディングの使用を許可します</translation> <translation id="3070119171976169951">サードパーティの画像による認証プロンプトの表示を許可しない</translation> @@ -2140,6 +2150,7 @@ <translation id="3255762580838224124">このポリシーを設定した場合、各ディスプレイは再起動のたびに指定した方向に回転します。ポリシーの値を変更した後、初めて接続したときにも、指定した方向に回転します。ユーザーはログイン後に設定ページからディスプレイの回転方法を変更することができますが、次に再起動したときにはポリシーの値に戻ります。このポリシーは、メインと予備のディスプレイに適用されます。 このポリシーを設定しない場合、デフォルト値として 0 度が使用され、ユーザーはこの値を自由に変更できます。この場合、再起動時にデフォルト値が再適用されることはありません。</translation> +<translation id="3257786863492892609">スクリーンキャストのポリシーを管理します。</translation> <translation id="3258380413685430793">すべての <ph name="FLASH_PLUGIN_NAME" /> コンテンツを実行する</translation> <translation id="325883417142483505">このポリシーでは、企業のログイン URL のリストを設定できます(HTTP と HTTPS プロトコルのみ)。パスワード保護サービスでは、これらの URL で入力されたパスワードのソルトハッシュを取得し、パスワードの再利用を検出する目的で使用します。<ph name="PRODUCT_NAME" /> でパスワードのソルトハッシュが適切に取得されるようにするには、ログインページが https://www.chromium.org/developers/design-documents/create-amazing-password-forms のガイドラインに沿っていることを確認します。 @@ -3088,6 +3099,7 @@ <translation id="441686537793821907">外部の拡張機能のインストールを許可しない</translation> <translation id="4423597592074154136">プロキシ設定を手動で指定する</translation> <translation id="4424004842303301809">データ漏洩防止イベントのレポートを無効にする</translation> +<translation id="4426601693403743089">ファミリー リンクのユーザーに対してスクリーンキャスト dogfood を無効にする</translation> <translation id="4427173305799125784">PDF ビューアで PDF に注釈を追加できない</translation> <translation id="4432762137771104529">セーフ ブラウジングの詳細レポートを有効にする</translation> <translation id="443454694385851356">以前の暗号化タイプ(安全ではありません)</translation> @@ -4599,6 +4611,7 @@ このポリシーの各リスト項目には、拡張機能 ID と「更新」URL(省略可)をセミコロン(<ph name="SEMICOLON" />)で区切った文字列を指定します。拡張機能 ID は 32 文字の文字列で、たとえばデベロッパー モードで <ph name="CHROME_EXTENSIONS_LINK" /> を開くと確認できます。「更新」URL を指定する場合は、更新マニフェスト XML ドキュメントを指定する必要があります(<ph name="LINK_TO_EXTENSION_DOC1" /> の説明をご覧ください)。デフォルトでは Chrome ウェブストアの更新 URL(現時点では「https://clients2.google.com/service/update2/crx」)が使用されます。なお、このポリシーで設定された「更新」URL は初回のインストールでのみ使用され、その後の拡張機能の更新には、拡張機能のマニフェストで指定されている更新 URL が使用されます。 たとえば、<ph name="LOGIN_SCREEN_EXTENSION_POLICY_EXAMPLE" /> では、標準の Chrome ウェブストアの「更新」URL から <ph name="SMART_CARD_CONNECTOR_APP_NAME" /> アプリがインストールされます。拡張機能のホスティングについて詳しくは、<ph name="LINK_TO_EXTENSION_DOC2" /> をご確認ください。</translation> +<translation id="6274202259872570803">スクリーンキャスト</translation> <translation id="6275497712828649588">危険性のあるコマンドライン フラグが使用されたときにセキュリティ警告を表示しない</translation> <translation id="6275833043726517413">新しい <ph name="CORS" /> の実装ではなく以前の <ph name="CORS" /> の実装を使用します。 @@ -4632,7 +4645,9 @@ <ph name="CHROME_OS_RELEASE_CHANNEL_POLICY_NAME" /> の設定は、<ph name="CHROME_OS_RELEASE_CHANNEL_DELEGATED_POLICY_NAME" /> が False に設定されている場合にのみ適用されます。</translation> <translation id="6305373713165475629">このポリシーでは、デフォルトのカラー印刷モードをオーバーライドできます。このモードを使用できない場合、このポリシーは無視されます。</translation> +<translation id="6308109234708949641">ファミリー リンクのユーザーの場合は、このポリシーがスクリーンキャストの機能を有効にし、画面録画の作成および文字起こしと Google ドライブへのアップロードの権限をスクリーンキャストに付与します。ファミリー リンク以外のユーザーには影響しません。企業ユーザーに対する <ph name="PROJECTOR_ENABLED_POLICY_NAME" /> ポリシーには影響しません。このポリシーを有効にすると、ファミリー リンクのユーザーに対してスクリーンキャスト dogfood が有効になります。このポリシーを無効にすると、ファミリー リンクのユーザーに対してスクリーンキャスト dogfood が無効になります。このポリシーを設定しないと、ファミリー リンクのユーザーに対してスクリーンキャスト dogfood がデフォルトで無効になります。</translation> <translation id="6310223829319187614">ユーザーのログイン中にドメイン名のオートコンプリートを有効にする</translation> +<translation id="6310756730808079944">スクリーンキャストを有効にする</translation> <translation id="631081324835911099">ユーザーのメインのアカウントの認証トークンが無効になると、強制的にログアウトします。 これにより、Google ウェブ プロパティの制限付きコンテンツにユーザーがアクセスしないよう保護できます。 このポリシーを True に設定した場合、認証トークンが無効になったユーザーは即座にログアウトされ、このトークンの復元の試行は失敗します。 @@ -4980,6 +4995,12 @@ false に設定されている場合や未設定の場合は、監視対象ユーザーの作成とログインはできません。既存の監視対象ユーザーはすべて非表示になります。 注: デフォルトの動作は、個人向けのデバイスと企業向けのデバイスとで異なります。個人向けデバイスでは、監視対象ユーザーはデフォルトで有効になっていますが、企業向けデバイスではそうではありません。</translation> +<translation id="6648746349186337075">企業ユーザーの場合は、このポリシーが画面録画の作成および文字起こしと Google ドライブへのアップロードの権限をスクリーンキャストに付与します。 + ファミリー リンクのユーザーには影響しません。 + ファミリー リンクのユーザー向けの <ph name="PROJECTOR_DOGFOOD_FOR_FAMILY_LINK_ENABLED_POLICY_NAME" /> ポリシーには影響しません。 + + ポリシーを未設定のままにするか有効にすると、スクリーンキャストが有効になります。 + このポリシーを無効にすると、スクリーンキャストが無効になります。</translation> <translation id="665023848306499203">どのバージョンに更新するかの選択をデバイスに許可する</translation> <translation id="6652197835259177259">ローカルの管理対象ユーザーの設定</translation> <translation id="6653897159826215341">このポリシーを有効に設定した場合、<ph name="PRODUCT_NAME" /> ではユーザーが印刷をリクエストしたときに組み込みの印刷プレビューではなくシステムの印刷ダイアログが開きます。 @@ -5842,6 +5863,7 @@ このポリシーを有効にした場合、または設定しない場合、クイック アンサーの単位変換が有効になります。 このポリシーを無効にした場合、クイック アンサーの単位変換が無効になります。</translation> <translation id="7587345076013230465">ログイン画面で自動選択ポリシーが複数の証明書と一致した場合に、クライアント証明書を選択するよう求めるメッセージを常にユーザーに表示する</translation> +<translation id="7587921466180902617">ファミリー リンクのユーザーに対してスクリーンキャスト dogfood を有効にする</translation> <translation id="759957074386651883">セーフ ブラウジングの設定</translation> <translation id="7604169113182304895">このリストを使用するかどうかは Android アプリ側の選択となります。Android アプリにリストの使用を強制することはできません。</translation> <translation id="7612157962821894603"><ph name="PRODUCT_NAME" /> 起動時にシステム全体のフラグを適用</translation> @@ -6075,6 +6097,7 @@ 推奨: 停止時の画面ロックを有効にしてアイドル時に画面がロックされるようにし、アイドル時間経過後に <ph name="PRODUCT_OS_NAME" /> を停止します。このポリシーは、停止状態になるのを待たずに画面をロックする場合、またはアイドル時の停止を希望しない場合にのみ使用してください。</translation> <translation id="7895553628261067384">リモート アクセス</translation> +<translation id="7900469325540540107">企業プロファイルの作成時にデフォルトで閲覧データを保持する</translation> <translation id="7902040092815978832">パスワード入力用に数字キーボードを表示する</translation> <translation id="7904177352786629708">このポリシーを有効に設定した場合、CNAME 検索はスキップされます。Kerberos SPN の生成時には、入力されたサーバー名が使用されます。 @@ -6227,10 +6250,6 @@ <translation id="8099880303030573137">アイドル状態になるまでの時間(バッテリー電源での実行時)</translation> <translation id="8101381354936029836">ポリシーの最小単位グループ:</translation> <translation id="8102913158860568230">デフォルトのメディアストリームの設定</translation> -<translation id="8103563905615378194">アダプティブ充電モデルを有効にして、バッテリー寿命を延ばすため充電プロセスを保留するかどうかを指定します。 - - アダプティブ充電モデルでは、デバイスが AC 電源に接続されている場合、バッテリー寿命を延ばすため充電プロセスを保留すべきかどうかを評価します。アダプティブ充電モデルで充電プロセスを保留する場合、バッテリーを一定の残量(80% など)に維持し、ユーザーが必要とするときは 100% まで充電します。 - このポリシーを True に設定するか未設定のままにした場合、アダプティブ充電モデルを有効にして、バッテリー寿命を延ばすため充電プロセスを保留します。このポリシーを False に設定した場合、アダプティブ充電モデルは充電プロセスに適用されません。</translation> <translation id="8104962233214241919">これらのサイトのクライアント証明書を自動的に選択する</translation> <translation id="8114382167597081590">YouTube で制限モードを強制適用しない</translation> <translation id="8117921351531866504">保存されているお支払い方法の確認をウェブサイトに許可するかどうかを設定します。 @@ -7027,10 +7046,6 @@ <translation id="8951350807133946005">ディスクのキャッシュ ディレクトリの設定</translation> <translation id="8955719471735800169">トップへ戻る</translation> <translation id="8956312248048980644">オリジンキー エージェント クラスタリングをデフォルトで許可します。</translation> -<translation id="8967125680876068695">Chrome アプリは、Windows、Mac、Linux でのサポートが終了しています。 - このポリシーを有効に設定した場合、2022 年 6 月にすべてのプラットフォームで Chrome アプリのサポートが廃止される日まで、これらのプラットフォームでは引き続き <ph name="PRODUCT_NAME" /> で Chrome アプリを実行できます。 - このポリシーを無効に設定するか未設定のままにした場合、サポート終了の段階に応じて、一部の Chrome アプリは実行できなくなります。 - いずれの場合も、ポリシーにより自動インストールされた Chrome アプリについては引き続き実行できます。</translation> <translation id="8970205333161758602"><ph name="PRODUCT_FRAME_NAME" /> のサポート終了メッセージを抑制する</translation> <translation id="8976248126101463034">リモート アクセス ホストに対して gnubby 認証を許可する</translation> <translation id="8976531594979650914">システムのデフォルト プリンタをデフォルトとして使用</translation>
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index 20efe9e..06cfa77 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -100,6 +100,7 @@ <translation id="1095209545735032039">이 사이트에서 Serial API 차단</translation> <translation id="1096105751829466145">기본 검색 공급자</translation> <translation id="1099282607296956954">모든 사이트에 사이트 격리 사용 설정</translation> +<translation id="1100840127293327071">기본적으로 기존 인터넷 사용 기록을 유지하는 옵션 선택 안함</translation> <translation id="1105572260329131950">보안 연결일 경우 기본 아이콘 표시</translation> <translation id="1107538157073168076">통계 확장 프로그램 사용 안함</translation> <translation id="1110426799149444997"><ph name="GOOGLE_LENS_PRODUCT_NAME" /> 영역 검색을 사용 중지합니다.</translation> @@ -748,6 +749,14 @@ <translation id="1781356041596378058">이 정책은 Android 개발자 옵션 액세스 권한도 제어합니다. 이 정책을 true로 설정하는 경우 사용자는 개발자 옵션에 액세스할 수 없습니다. 이 정책을 false로 설정하거나 설정하지 않은 채로 두는 경우 Android 설정 앱에서 빌드 번호를 7번 탭하면 개발자 옵션에 액세스할 수 있습니다.</translation> <translation id="1787790976045065845">이 정책은 <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_POLICY_NAME" /> 정책이 <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_LOCK" /> 또는 <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_LOGOUT" />으로 설정되어 있으며 스마트 카드를 통해 인증하는 사용자가 해당 스마트 카드를 삭제하는 경우에만 적용됩니다. 그런 다음 이 정책은 사용자에게 곧 실행될 작업에 관해 알리는 알림을 몇 초 동안 표시할지 지정합니다. 이 알림은 화면을 가립니다. 작업은 알림이 만료된 후에만 실행됩니다. 사용자는 알림이 만료되기 전에 스마트 카드를 다시 삽입하여 작업이 시작되지 않도록 할 수 있습니다. 정책이 0으로 설정되어 있으면 알림이 표시되지 않으며 작업이 즉시 실행됩니다.</translation> <translation id="1793346220873697538">기본적으로 PIN 인쇄를 사용하지 않습니다.</translation> +<translation id="1794457906032475749">정책이 사용 설정되면 기업 프로필 생성 시 기존 인터넷 사용 기록을 유지하는 옵션이 기본적으로 선택됩니다. + +정책을 설정하지 않거나 사용 중지하면 기업 프로필 생성 시 기존 인터넷 사용 기록을 유지하는 옵션이 기본적으로 선택되지 않습니다. + +이 값과 관계없이 사용자는 기업 프로필을 만들 때 기존 인터넷 사용 기록을 유지할지 여부를 결정할 수 있습니다. + +기존 인터넷 사용 기록을 유지하는 옵션을 사용할 수 없는 경우 이 정책은 적용되지 않습니다. 이는 기업 프로필 분리가 엄격하게 적용되거나 데이터가 이미 관리된 프로필의 데이터인 경우에 발생합니다. +</translation> <translation id="179694024208061102">이 정책을 사용으로 설정하면 <ph name="PRODUCT_NAME" />에서 일부 URL을 대체 브라우저(예: <ph name="IE_PRODUCT_NAME" />)에서 열려고 시도합니다. 이 기능은 <ph name="LEGACY_BROWSER_SUPPORT_POLICY_GROUP" /> 그룹의 정책을 사용해 설정됩니다. 정책을 사용 안함으로 설정하거나 설정하지 않으면 <ph name="PRODUCT_NAME" />에서 지정된 URL을 대체 브라우저에서 열려고 시도하지 않습니다.</translation> @@ -1321,7 +1330,6 @@ 유효한 <ph name="URL_LABEL" /> 패턴에 관해 자세히 알아보려면 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns를 참고하세요. <ph name="WILDCARD_VALUE" />는 이 정책에 허용되는 값이 아닙니다.</translation> <translation id="2299220924812062390">사용 설정한 플러그인 목록 지정</translation> -<translation id="2301048990069984110">Windows, Mac, Linux에서 Chrome 앱 지원을 확장합니다.</translation> <translation id="2303795211377219696">신용카드 정보 자동 완성 사용</translation> <translation id="2304009805995145854"><ph name="PRODUCT_NAME" /> 67부터 모든 데스크톱 플랫폼에서 사이트 격리가 기본적으로 사용 설정되므로 모든 사이트가 자체 프로세스로 실행됩니다. 사이트는 url 프로토콜과 최상위 도메인 즉 eTLD+1의 조합(예: https://example.com)으로 이루어집니다. 이 정책을 사용 설정해도 동작은 변경되지 않으며, 사용자가 정책을 선택 해제할 수 없을 뿐입니다(예: chrome://flags에서 사이트 격리 사용 안함). <ph name="PRODUCT_NAME" /> 76부터 이 정책을 사용 안함으로 설정하거나 설정하지 않아도 사이트 격리는 사용 중지되지 않으며 대신 사용자가 선택 해제할 수 있습니다. @@ -1643,6 +1651,7 @@ <ph name="MS_WIN_NAME" />의 경우 이 기능은 <ph name="MS_AD_NAME" /> 도메인에 연결된 인스턴스, Windows 10 Pro에서 실행되는 인스턴스, Chrome 브라우저 클라우드 관리에 등록된 인스턴스에서만 사용할 수 있습니다. <ph name="MAC_OS_NAME" />의 경우 이 기능은 MDM을 통해 관리되는 인스턴스 또는 MCX를 통해 도메인에 연결된 인스턴스에서만 사용할 수 있습니다.</translation> <translation id="2623014935069176671">첫 번째 사용자 활동 기다리기</translation> +<translation id="2625026032335150744">기본적으로 기존 인터넷 사용 기록을 유지하는 옵션 선택</translation> <translation id="2625398797484317969">빠른 답변 관련 설정을 제어합니다.</translation> <translation id="262740370354162807"><ph name="CLOUD_PRINT_NAME" />(으)로 문서 제출 사용</translation> <translation id="2633084400146331575">음성 피드백 사용</translation> @@ -2065,6 +2074,7 @@ 유효한 <ph name="URL_LABEL" /> 패턴에 관해 자세히 알아보려면 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns를 참고하세요. <ph name="WILDCARD_VALUE" />는 이 정책에 허용되는 값이 아닙니다.</translation> <translation id="305106159605171619">사용자 에이전트 축소가 사용 중지되고 필드 트라이얼 또는 오리진 트라이얼을 통해 이를 사용 설정할 수 없습니다.</translation> <translation id="3053265701996417839">Microsoft Windows 7</translation> +<translation id="3063302084011279315">스크린캐스트 사용 안함</translation> <translation id="3064530882228745118">Kerberos 인증 시 CNAME 검색 사용</translation> <translation id="3066446511111537292">기기의 연결된 사용자가 ADB 사이드로드를 사용하도록 허용</translation> <translation id="3070119171976169951">타사 이미지가 인증 프롬프트를 표시하지 못하도록 차단</translation> @@ -2282,6 +2292,7 @@ <translation id="3255762580838224124">이 정책을 설정하면 정책 값을 변경한 후 처음 연결할 때와 재부팅할 때마다 지정된 방향으로 각 화면이 회전합니다. 사용자는 로그인한 후 설정 페이지를 통해 화면 회전을 변경할 수 있으나, 다음 재부팅 시 원래 설정으로 다시 변경됩니다. 이 정책은 기본 및 보조 화면에 적용됩니다. 설정하지 않으면 기본값은 0도이며 사용자가 자유롭게 변경할 수 있습니다. 이 경우 다시 시작할 때 기본값이 재적용되지 않습니다.</translation> +<translation id="3257786863492892609">스크린캐스트 정책을 제어합니다.</translation> <translation id="3258380413685430793">모든 <ph name="FLASH_PLUGIN_NAME" /> 콘텐츠 실행</translation> <translation id="325883417142483505">정책을 설정하면 엔터프라이즈 로그인 URL(HTTP 및 HTTPS 프로토콜만 해당) 목록이 설정됩니다. 비밀번호 보호 서비스는 이러한 URL에서 비밀번호의 솔트 처리된 해시를 캡처하여 비밀번호 재사용 감지에 사용합니다. <ph name="PRODUCT_NAME" />이 비밀번호의 솔트 처리된 해시를 제대로 캡처하려면 로그인 페이지가 https://www.chromium.org/developers/design-documents/create-amazing-password-forms에 설명된 가이드라인을 준수해야 합니다. @@ -3260,6 +3271,7 @@ <translation id="441686537793821907">외부 확장 프로그램 설치 차단</translation> <translation id="4423597592074154136">프록시 설정을 수동으로 지정</translation> <translation id="4424004842303301809">데이터 유출 방지 이벤트 보고 사용 안 함</translation> +<translation id="4426601693403743089">Family Link 사용자용 스크린캐스트 dogfood 사용 안함</translation> <translation id="4427173305799125784">PDF 뷰어에서 PDF에 주석 작성 불가능</translation> <translation id="4432762137771104529">세이프 브라우징 확장 보고 사용 설정</translation> <translation id="443454694385851356">이전(안전하지 않음)</translation> @@ -4871,6 +4883,7 @@ 이 정책의 각 항목은 세미콜론(<ph name="SEMICOLON" />)으로 구분된 확장 프로그램 ID 및 '업데이트' URL(선택사항)로 구성된 문자열입니다. 확장 프로그램 ID는 32자리 문자열로, 예를 들어 개발자 모드일 때 <ph name="CHROME_EXTENSIONS_LINK" />에서 확인할 수 있습니다. '업데이트' URL을 지정하는 경우 <ph name="LINK_TO_EXTENSION_DOC1" />에 명시된 것과 같이 업데이트 매니페스트 XML 문서로 연결되어야 합니다. 기본적으로 Chrome 웹 스토어의 업데이트 URL(현재 'https://clients2.google.com/service/update2/crx')이 사용됩니다. 이 정책에서 설정된 '업데이트' URL은 최초 설치 시에만 사용되며 이후에 확장 프로그램 업데이트에서는 확장 프로그램의 매니페스트에 명시된 업데이트 URL이 사용됩니다. 예를 들어 <ph name="LOGIN_SCREEN_EXTENSION_POLICY_EXAMPLE" />의 경우 표준 Chrome 웹 스토어의 '업데이트' URL에서 <ph name="SMART_CARD_CONNECTOR_APP_NAME" /> 앱을 설치합니다. 확장 프로그램 호스팅에 관한 자세한 내용은 다음 페이지를 참조하세요. <ph name="LINK_TO_EXTENSION_DOC2" /></translation> +<translation id="6274202259872570803">스크린캐스트</translation> <translation id="6275497712828649588">잠재적으로 위험한 명령줄 플래그가 사용될 경우 보안 경고 숨기기</translation> <translation id="6275833043726517413">새 <ph name="CORS" /> 대신 기존 <ph name="CORS" /> 구현을 사용합니다. @@ -4904,7 +4917,15 @@ <ph name="CHROME_OS_RELEASE_CHANNEL_POLICY_NAME" /> 설정은 <ph name="CHROME_OS_RELEASE_CHANNEL_DELEGATED_POLICY_NAME" />를 False로 설정하는 경우에만 적용됩니다.</translation> <translation id="6305373713165475629">정책을 설정하면 기본 컬러 인쇄 모드가 재정의됩니다. 이 모드를 사용할 수 없는 경우 정책은 무시됩니다.</translation> +<translation id="6308109234708949641">이 정책은 Family Link 사용자가 스크린캐스트 기능을 사용하도록 설정하고, 스크린캐스트에 화면 녹화 파일을 만들고, 스크립트를 작성하고, 이러한 항목을 Drive에 업로드하는 권한을 부여합니다. + 이 정책은 다른 유형의 사용자에게 영향을 주지 않습니다. + 이 정책은 기업 사용자를 위한 <ph name="PROJECTOR_ENABLED_POLICY_NAME" /> 정책에 영향을 주지 않습니다. + + 정책을 사용 설정하면 Family Link 사용자에 대해 스크린캐스트 dogfood가 사용 설정됩니다. + 정책을 사용 중지하면 Family Link 사용자에 대해 스크린캐스트 dogfood가 사용 중지됩니다. + 정책을 설정하지 않으면 Family Link 사용자에 대해 스크린캐스트 dogfood가 기본적으로 사용 중지됩니다.</translation> <translation id="6310223829319187614">사용자가 로그인할 때 도메인 이름 자동완성 기능을 사용합니다.</translation> +<translation id="6310756730808079944">스크린캐스트 사용 설정</translation> <translation id="631081324835911099">기본 계정의 인증 토큰이 무효화되면 사용자를 강제로 로그아웃합니다. 이 정책을 사용하면 Google 웹 서비스의 제한된 콘텐츠에 사용자가 액세스하지 못하게 할 수 있습니다. 정책이 True로 설정되면 인증 토큰이 무효화되었을 때 사용자가 토큰 복구를 시도하는 즉시 로그아웃됩니다. @@ -5280,6 +5301,12 @@ false로 설정하거나 설정하지 않으면 관리 대상 사용자 생성 및 로그인이 사용 중지됩니다. 기존의 모든 관리 대상 사용자는 숨겨집니다. 참고: 일반 소비자용과 기업용 기기는 기본 동작에 차이가 있습니다. 일반 소비자용 기기는 관리 대상 사용자를 기본적으로 사용하도록 설정되어 있으나, 기업용 기기에서는 기본적으로 사용 중지되어 있습니다.</translation> +<translation id="6648746349186337075">이 정책은 화면 녹화 파일을 만들고, 스크립트를 작성하고, 이러한 항목을 Drive에 업로드하는 스크린캐스트 권한을 기업 사용자에게 부여합니다. + 이 정책은 Family Link 사용자에게 영향을 주지 않습니다. + 이 정책은 Family Link 사용자를 위한 <ph name="PROJECTOR_DOGFOOD_FOR_FAMILY_LINK_ENABLED_POLICY_NAME" /> 정책에 영향을 주지 않습니다. + + 정책을 설정하지 않거나 사용 설정하면 스크린캐스트가 사용 설정됩니다. + 정책을 사용 중지하면 스크린캐스트가 사용 중지됩니다.</translation> <translation id="665023848306499203">기기에서 업데이트할 특정 버전을 선택하도록 허용</translation> <translation id="6652197835259177259">로컬 관리 사용자 설정</translation> <translation id="6653897159826215341">정책을 사용 설정하면 사용자가 인쇄를 요청할 때 <ph name="PRODUCT_NAME" />에서 내장 인쇄 미리보기 대신 시스템 인쇄 대화상자가 열립니다. @@ -6185,6 +6212,7 @@ 정책을 사용 설정하거나 설정하지 않으면 빠른 답변 단위 변환이 사용 설정됩니다. 정책을 사용 중지하면 빠른 답변 단위 변환이 사용 중지됩니다.</translation> <translation id="7587345076013230465">자동 선택 정책과 일치하는 인증서가 여러 개 있을 때마다 로그인 화면에서 사용자에게 클라이언트 인증서를 선택하라는 메시지 표시</translation> +<translation id="7587921466180902617">Family Link 사용자용 스크린캐스트 dogfood 사용 설정</translation> <translation id="759957074386651883">세이프 브라우징 설정</translation> <translation id="7604169113182304895">Android 앱이 자발적으로 이 목록을 사용하도록 선택할 수 있습니다. 강제로 Android 앱에서 이 목록을 사용하도록 할 수 없습니다.</translation> <translation id="7612157962821894603"><ph name="PRODUCT_NAME" /> 시작 시 시스템 전체 플래그 적용</translation> @@ -6432,6 +6460,7 @@ 일시중지 시 화면 잠금을 사용 설정하여 유휴 상태에서 화면을 잠그고 유휴 지연 시간 후에는 <ph name="PRODUCT_OS_NAME" />에서 기기를 일시중지하도록 하는 것이 좋습니다. 일시중지보다 훨씬 일찍 화면을 잠가야 하거나 유휴 상태에서 일시중지하기를 원하지 않을 때만 이 정책을 사용합니다.</translation> <translation id="7895553628261067384">원격 액세스</translation> +<translation id="7900469325540540107">기본적으로 기업 프로필 생성 시 인터넷 사용 기록 유지</translation> <translation id="7902040092815978832">비밀번호 입력 시 숫자 키보드 표시</translation> <translation id="7904177352786629708">정책을 사용으로 설정하면 CNAME 조회를 건너뜁니다. 서버 이름은 Kerberos SPN 생성 시 입력한 이름으로 사용됩니다. @@ -6599,10 +6628,6 @@ <translation id="8099880303030573137">배터리 전원으로 실행할 때 유휴 지연</translation> <translation id="8101381354936029836">정책 전체 그룹:</translation> <translation id="8102913158860568230">기본 mediastream 설정</translation> -<translation id="8103563905615378194">배터리 수명 연장을 위해 충전 프로세스를 보류하는 자동 조절 충전 모델 사용 여부를 지정합니다. - - 기기가 AC 전원을 사용하는 경우 자동 조절 충전 모델이 배터리 수명 연장을 위해 충전 프로세스를 보류해야 할지 결정합니다. 자동 조절 충전 모델이 충전 프로세스를 보류하면 배터리를 특정 수준(예: 80%)으로 유지했다가 사용자가 필요할 때 100%까지 충전합니다. - 정책을 True로 설정하거나 설정하지 않으면 자동 조절 충전 모델이 사용 설정되어 배터리 수명 연장을 위한 충전 프로세스 보류가 허용됩니다. 정책을 False로 설정하면 자동 조절 충전 모델이 충전 프로세스에 영향을 주지 않습니다.</translation> <translation id="8104962233214241919">이 사이트에 대해 클라이언트 인증서를 자동으로 선택합니다.</translation> <translation id="8114382167597081590">YouTube에 제한 모드 사용 안함</translation> <translation id="8117921351531866504">웹사이트에서 사용자의 결제 수단 저장 여부를 확인하도록 허용할지 선택할 수 있습니다. @@ -7426,10 +7451,6 @@ <translation id="8951350807133946005">디스크 캐시 디렉터리 설정</translation> <translation id="8955719471735800169">맨위로</translation> <translation id="8956312248048980644">기본적으로 출처 관련 에이전트 클러스터링을 허용합니다.</translation> -<translation id="8967125680876068695">Windows, Mac, Linux에서 Chrome 앱의 지원이 중단되었습니다. - 정책을 사용 설정하면 Chrome 앱 지원이 모든 플랫폼에서 삭제되는 2022년 6월의 마지막 날짜까지 <ph name="PRODUCT_NAME" />에서 Chrome 앱이 이러한 플랫폼에서 실행되도록 허용합니다. - 정책을 사용 안함으로 설정하거나 설정하지 않으면 지원 중단 출시 상태에 따라 Chrome 앱이 실행되지 않을 수도 있습니다. - 어떤 경우이건 간에 정책에 의해 강제 설치된 Chrome 앱은 계속 허용됩니다.</translation> <translation id="8970205333161758602"><ph name="PRODUCT_FRAME_NAME" /> 종료 프롬프트를 표시하지 않음</translation> <translation id="8976248126101463034">원격 액세스 호스트에 대한 gnubby 인증 허용</translation> <translation id="8976531594979650914">시스템 기본 프린터를 기본값으로 사용</translation>
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index fbd1761..01a54608 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -1291,7 +1291,6 @@ Ga naar https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns voor gedetailleerde informatie over geldige <ph name="URL_LABEL" />-patronen. <ph name="WILDCARD_VALUE" /> is geen geaccepteerde waarde voor dit beleid.</translation> <translation id="2299220924812062390">Lijst met aangezette plug-ins specificeren</translation> -<translation id="2301048990069984110">Breid de ondersteuning uit voor Chrome-apps op Windows, Mac en Linux.</translation> <translation id="2303795211377219696">Automatisch invullen aanzetten voor creditcards</translation> <translation id="2304009805995145854">Sinds <ph name="PRODUCT_NAME" /> 67 staat site-isolatie standaard aan op alle desktopplatforms, waardoor elke site zijn eigen proces uitvoert. Een site is een schema plus eTLD+1 (bijvoorbeeld https://example.com). Dit gedrag verandert niet als je dit beleid toepast, maar het verhindert wel dat gebruikers deze functie kunnen uitzetten (bijvoorbeeld door site-isolatie uit te zetten in chrome://flags). Sinds <ph name="PRODUCT_NAME" /> 76 wordt site-isolatie niet uitgezet als je het beleid niet toepast of niet instelt, maar kunnen gebruikers deze functie zelf uitzetten. @@ -6533,10 +6532,6 @@ <translation id="8099880303030573137">Inactieve vertraging wanneer op de batterij wordt gewerkt</translation> <translation id="8101381354936029836">Beleid van atomische groep:</translation> <translation id="8102913158860568230">Standaardinstelling voor mediastreams</translation> -<translation id="8103563905615378194">Geeft aan of een model voor aangepast opladen het oplaadproces mag onderbreken om de batterijduur te verlengen. - - Als het apparaat gebruikmaakt van wisselstroom, evalueert het model voor aangepast opladen of het oplaadproces moet worden onderbroken om de batterijduur te verlengen. Onderbreekt het model voor aangepast opladen het oplaadproces, dan wordt de batterij op een bepaald niveau gehouden (bijv. 80%) en wordt het apparaat helemaal opgeladen als de gebruiker dat nodig heeft. - Als je dit beleid toepast of niet instelt, wordt het model voor aangepast opladen aangezet en mag dit het oplaadproces onderbreken om de batterijduur te verlengen. Als je dit beleid niet toepast, is het model voor aangepast opladen niet van invloed op het oplaadproces.</translation> <translation id="8104962233214241919">Clientcertificaten automatisch selecteren voor deze sites</translation> <translation id="8114382167597081590">'Beperkte modus' niet afdwingen op YouTube</translation> <translation id="8117921351531866504">Hiermee kun je instellen of websites controleren of de gebruiker betaalmethoden heeft opgeslagen. @@ -7350,10 +7345,6 @@ <translation id="8951350807133946005">Directory voor schijfcache instellen</translation> <translation id="8955719471735800169">Bovenkant pagina</translation> <translation id="8956312248048980644">Staat origin-keyed agentclustering standaard toe.</translation> -<translation id="8967125680876068695">Chrome-apps worden beëindigd voor Windows, Mac en Linux. - Als je dit beleid aanzet, staat <ph name="PRODUCT_NAME" /> nog steeds toe dat Chrome-apps worden uitgevoerd op deze platforms, tot de einddatum van juni 2022. Op dat moment wordt ondersteuning voor Chrome-apps op alle platforms verwijderd. - Als je dit beleid uitzet of niet instelt, kunnen Chrome-apps misschien niet worden uitgevoerd, afhankelijk van de status van de uitrol van de beëindiging. - In beide gevallen zijn Chrome-apps die door het beleid afgedwongen worden geïnstalleerd, nog steeds toegestaan.</translation> <translation id="8970205333161758602">De prompt <ph name="PRODUCT_FRAME_NAME" /> negeren</translation> <translation id="8976248126101463034">Gnubby-verificatie toestaan voor hosts voor externe toegang</translation> <translation id="8976531594979650914">Standaardprinter van systeem gebruiken als standaard</translation>
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index ed749303..bc054d3 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -100,6 +100,7 @@ <translation id="1095209545735032039">Bloquear a API Serial nesses sites</translation> <translation id="1096105751829466145">Provedor de pesquisa padrão</translation> <translation id="1099282607296956954">Ativar o isolamento de todos os sites</translation> +<translation id="1100840127293327071">Não marcar a opção para manter os dados de navegação existentes por padrão</translation> <translation id="1105572260329131950">Usar os ícones padrão em conexões seguras</translation> <translation id="1107538157073168076">Desativar extensão de insights</translation> <translation id="1110426799149444997">Desativar a pesquisa por região do <ph name="GOOGLE_LENS_PRODUCT_NAME" />.</translation> @@ -740,6 +741,14 @@ <translation id="1781356041596378058">Esta política também controla o acesso às Opções do desenvolvedor Android. Se você configurar essa política como true, os usuários não poderão acessar as Opções do desenvolvedor. Se configurá-la como false ou deixá-la sem definição, os usuários poderão acessar as Opções do desenvolvedor tocado sete vezes no número da versão no app Config. do Android.</translation> <translation id="1787790976045065845">Esta política só terá efeito quando a <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_POLICY_NAME" /> estiver definida como <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_LOCK" /> ou <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_LOGOUT" /> e um usuário que faz a autenticação por um cartão inteligente remover o cartão. Esta política especificará por quantos segundos uma notificação que informa o usuário sobre a ação futura será exibida. Essa notificação bloqueia a tela, e a ação só acontecerá depois que a notificação expirar. O usuário pode evitar o acontecimento da ação reinserindo o cartão inteligente antes que a notificação expire. Se esta política for definida como zero, nenhuma notificação será exibida e a ação acontecerá imediatamente.</translation> <translation id="1793346220873697538">Desativar impressão com PIN como padrão</translation> +<translation id="1794457906032475749">Se esta política for ativada, a opção de manter os dados de navegação existentes ao criar um perfil de trabalho vai ser marcada por padrão. + +Se a política for desativada ou deixada sem definição, a opção de manter os dados de navegação existentes ao criar um perfil de trabalho não vai ser marcada por padrão. + +Seja qual for o valor, o usuário vai poder decidir se quer ou não manter os dados de navegação existentes ao criar um perfil corporativo. + +Esta política não vai ter efeito se a opção de manter os dados de navegação existentes não estiver disponível. Isso acontece quando a separação de perfil corporativo é aplicada de forma rigorosa ou quando os dados são de um perfil já gerenciado. +</translation> <translation id="179694024208061102">Se a política for definida como ativada, o <ph name="PRODUCT_NAME" /> tentará abrir alguns URLs em um navegador alternativo, como o <ph name="IE_PRODUCT_NAME" />. Esse recurso é configurado por meio das políticas no grupo do <ph name="LEGACY_BROWSER_SUPPORT_POLICY_GROUP" />. Se a política for definida como desativada ou não for definida, o <ph name="PRODUCT_NAME" /> não tentará abrir URLs designados em um navegador alternativo.</translation> @@ -1316,7 +1325,6 @@ Para informações detalhadas sobre padrões de <ph name="URL_LABEL" /> válidos, consulte https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. O valor <ph name="WILDCARD_VALUE" /> não é aceito para esta política.</translation> <translation id="2299220924812062390">Especifica uma lista de plug-ins ativados</translation> -<translation id="2301048990069984110">Oferecer suporte para apps do Chrome no Windows, Mac e Linux.</translation> <translation id="2303795211377219696">Ativar o preenchimento automático para cartões de crédito</translation> <translation id="2304009805995145854">Desde o <ph name="PRODUCT_NAME" /> 67, o isolamento de sites é ativado por padrão em todas as plataformas para computador, obrigando cada site a executar um processo próprio. Um site é um esquema + eTLD+1 (por exemplo, https://example.com). Se a política for ativada, esse comportamento não mudará. Ela apenas evita que usuários possam escolher outra opção (por exemplo, desativar o isolamento de sites em chrome://flags). Desde o <ph name="PRODUCT_NAME" /> 76, desativar esta política ou deixá-la sem definição não desativa o isolamento de sites, mas permite que os usuários escolham outra opção. @@ -1638,6 +1646,7 @@ No <ph name="MS_WIN_NAME" />, essa funcionalidade está disponível apenas em instâncias associadas a um domínio do <ph name="MS_AD_NAME" />, executadas no Windows 10 Pro ou registradas no Gerenciamento de nuvem do navegador Chrome. No <ph name="MAC_OS_NAME" />, essa funcionalidade está disponível apenas em instâncias gerenciadas por MDM ou associadas a um domínio via MCX.</translation> <translation id="2623014935069176671">Aguardar atividade inicial do usuário</translation> +<translation id="2625026032335150744">Marcar a opção para manter os dados de navegação existentes por padrão</translation> <translation id="2625398797484317969">Controla as configurações das Respostas rápidas.</translation> <translation id="262740370354162807">Ativar o envio de documentos para <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="2633084400146331575">Ativar resposta falada</translation> @@ -2060,6 +2069,7 @@ Para informações detalhadas sobre padrões de <ph name="URL_LABEL" /> válidos, consulte https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns (link em inglês). <ph name="WILDCARD_VALUE" /> não é um valor aceitável para esta política.</translation> <translation id="305106159605171619">A redução do user agent foi desativada e não foi ativada por testes de campo e de origem.</translation> <translation id="3053265701996417839">Microsoft Windows 7</translation> +<translation id="3063302084011279315">Desativar o Screencast</translation> <translation id="3064530882228745118">Usar a consulta CNAME ao negociar a autenticação do Kerberos</translation> <translation id="3066446511111537292">Permite que usuários afiliados deste dispositivo usem sideload com adb</translation> <translation id="3070119171976169951">Impedir que imagens de terceiros enviem um prompt de autenticação</translation> @@ -2277,6 +2287,7 @@ <translation id="3255762580838224124">A definição da política faz com que cada tela gire para a orientação especificada em todas as reinicializações e na primeira vez que ela for conectada depois que o valor da política mudar. O usuário pode mudar a rotação da tela na página de configurações depois de fazer login, mas as mudanças serão revertidas após a próxima reinicialização. Esta política se aplica às telas primária e secundária. Se ela não for definida, o valor padrão será 0 graus e o usuário poderá mudá-lo. Neste caso, o valor padrão não será reaplicado após a reinicialização.</translation> +<translation id="3257786863492892609">Controla as políticas do Screencast.</translation> <translation id="3258380413685430793">Executar todo o conteúdo do <ph name="FLASH_PLUGIN_NAME" /></translation> <translation id="325883417142483505">Se a política for definida, será possível definir uma lista de URLs de login corporativos (apenas protocolos HTTP e HTTPS). O serviço de proteção de senhas capturará hashes com sal de senhas nesses URLs e os usará para detectar a reutilização. Para que o <ph name="PRODUCT_NAME" /> capture hashes com sal de senhas corretamente, verifique se a página de login segue estas diretrizes (https://www.chromium.org/developers/design-documents/create-amazing-password-forms). @@ -3250,6 +3261,7 @@ <translation id="441686537793821907">Bloquear a instalação de extensões externas</translation> <translation id="4423597592074154136">Especificar manualmente as configurações de proxy</translation> <translation id="4424004842303301809">Desativar relatórios de eventos para prevenção de vazamento de dados</translation> +<translation id="4426601693403743089">Desativar o dogfood do Screencast para usuários do Family Link</translation> <translation id="4427173305799125784">O visualizador de PDF não pode fazer anotações em PDFs</translation> <translation id="4432762137771104529">Ativar relatórios estendidos do Navegação segura</translation> <translation id="443454694385851356">Legado (não seguro)</translation> @@ -4854,6 +4866,7 @@ Cada item da lista da política é uma string que contém um ID de extensão e, opcionalmente, um URL de "atualização" separados por ponto e vírgula (<ph name="SEMICOLON" />). O ID de extensão é a string de 32 letras encontrada, por exemplo, em <ph name="CHROME_EXTENSIONS_LINK" /> no modo de desenvolvedor. O URL de "atualização", se especificado, apontará para um documento XML de manifesto de atualização, conforme descrito em <ph name="LINK_TO_EXTENSION_DOC1" />. Por padrão, o URL de "atualização" da Chrome Web Store é usado (atualmente, https://clients2.google.com/service/update2/crx). O URL de "atualização" definido nesta política só é usado na instalação inicial. As atualizações subsequentes da extensão empregam o URL de "atualização" indicado no manifesto da extensão. Por exemplo, <ph name="LOGIN_SCREEN_EXTENSION_POLICY_EXAMPLE" /> instala o app <ph name="SMART_CARD_CONNECTOR_APP_NAME" /> a partir do URL de "atualização" padrão da Chrome Web Store. Para ver mais informações sobre hospedagem de extensões, consulte <ph name="LINK_TO_EXTENSION_DOC2" />.</translation> +<translation id="6274202259872570803">Screencast</translation> <translation id="6275497712828649588">Ocultar avisos de segurança quando sinalizações de linha de comando potencialmente perigosa forem usadas</translation> <translation id="6275833043726517413">Use a implementação legada de <ph name="CORS" /> em vez do novo <ph name="CORS" />. @@ -4887,7 +4900,15 @@ A configuração <ph name="CHROME_OS_RELEASE_CHANNEL_POLICY_NAME" /> só terá efeito se <ph name="CHROME_OS_RELEASE_CHANNEL_DELEGATED_POLICY_NAME" /> for definida como falsa.</translation> <translation id="6305373713165475629">A definição da política substitui o modo de cor de impressão padrão. Se o modo não estiver disponível, a política será ignorada.</translation> +<translation id="6308109234708949641">Esta política ativa o recurso do Screencast para usuários do Family Link e permite criar e transcrever gravações da tela e fazer upload delas no Drive. + Esta política não afeta outros tipos de usuários. + Esta política não afeta a <ph name="PROJECTOR_ENABLED_POLICY_NAME" /> para usuários corporativos. + + Se ela estiver ativada, o dogfood do Screencast vai ficar ativado para usuários do Family Link. + Se ela estiver desativada, o dogfood do Screencast vai ficar desativado para esses usuários. + Se ela não for definida, o dogfood do Screencast vai ficar desativado por padrão para esses usuários.</translation> <translation id="6310223829319187614">Ativar preenchimento automático do nome de domínio durante login do usuário</translation> +<translation id="6310756730808079944">Ativar o Screencast</translation> <translation id="631081324835911099">Força a saída do usuário quando o token de autenticação da conta principal se torna inválido. Esta política pode proteger o usuário de acesso a conteúdo restrito em propriedades da Web do Google. Se ela for definida como verdadeira, o usuário será desconectado assim que o token de autenticação se tornar inválido e as tentativas de restauração dele falharem. @@ -5275,6 +5296,11 @@ Se definida como falsa ou não configurada, a criação e o login de usuários supervisionados serão desativados. Todos os usuários supervisionados existentes serão ocultos. OBSERVAÇÃO: há uma diferença entre o comportamento padrão em dispositivos corporativos e de consumidores: em dispositivos de consumidores, os usuários supervisionados são ativados por padrão. Já em dispositivos corporativos, o padrão é os usuários supervisionados estarem desativados.</translation> +<translation id="6648746349186337075">Esta política permite que o Screencast crie, transcreva e faça upload de gravações de tela no Drive para usuários corporativos. + Ela não afeta usuários do Family Link nem a política <ph name="PROJECTOR_DOGFOOD_FOR_FAMILY_LINK_ENABLED_POLICY_NAME" /> para esses usuários. + + Se a política for deixada sem definição, o Screencast vai ser ativado. + Se ela for desativada, o Screencast também vai ser desativado.</translation> <translation id="665023848306499203">Permitir que dispositivos selecionem uma versão de atualização específica</translation> <translation id="6652197835259177259">Configurações de usuários gerenciados localmente</translation> <translation id="6653897159826215341">Se a política for definida como "Ativada", o <ph name="PRODUCT_NAME" /> abrirá a caixa de diálogo de impressão do sistema em vez da integrada quando os usuários solicitarem uma impressão. @@ -5614,7 +5640,7 @@ Se a opção U2F for selecionada, o segundo fator integrado se comportará de acordo com a especificação FIDO U2F. 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="6998179760789945134">Desativar o WebSQL em contextos não seguros, a menos que ele seja ativado pela Sinalização do Chrome.</translation> +<translation id="6998179760789945134">Desativar o WebSQL em contextos não seguros, a menos que ele seja ativado pela Flag do Chrome.</translation> <translation id="6999948519306285655">Esta política está obsoleta. Use a <ph name="PROXY_SETTINGS_POLICY_NAME" />. Se a política for definida, você poderá especificar um URL de um arquivo proxy .pac. Esta política só terá efeito se a <ph name="PROXY_SETTINGS_POLICY_NAME" /> não tiver sido especificada e você tiver selecionado <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> com <ph name="PROXY_MODE_POLICY_NAME" />. @@ -6013,7 +6039,7 @@ Se a política não for definida, a ação padrão será a de suspensão. Observação: se a ação for a de suspender, o <ph name="PRODUCT_OS_NAME" /> poderá ser configurado separadamente para bloquear ou não a tela antes da suspensão.</translation> -<translation id="7477149584454865826">Sinalização booleana indicando se o IPP Everywhere deve ser usado ou não para configurar a impressora.</translation> +<translation id="7477149584454865826">Flag booleana indicando se o IPP Everywhere deve ser usado ou não para configurar a impressora.</translation> <translation id="7477231245051133709">Ativar o recurso de acessibilidade de áudio mono</translation> <translation id="7477526482439041787">Configura uma lista de regras para prevenir vazamentos de dados no <ph name="PRODUCT_OS_NAME" />. Os vazamentos podem acontecer ao copiar e colar dados, transferir arquivos, imprimir, compartilhar ou capturar a tela etc. @@ -6174,6 +6200,7 @@ Se ela estiver ativada ou for deixada sem definição, a conversão de unidades das Respostas rápidas ficará ativada. Se a política for desativada, a conversão de unidades das Respostas rápidas ficará desativada.</translation> <translation id="7587345076013230465">Pedir para o usuário selecionar o certificado do cliente sempre que a política de seleção automática corresponder a vários certificados na tela de login</translation> +<translation id="7587921466180902617">Ativar o dogfood do Screencast para usuários do Family Link</translation> <translation id="759957074386651883">Configurações da política Safe Browsing</translation> <translation id="7604169113182304895">Os apps Android podem optar voluntariamente por respeitar essa lista. Não é possível forçá-los a respeitá-la.</translation> <translation id="7612157962821894603">Sinalizações amplas do sistema que devem ser aplicadas na inicialização do <ph name="PRODUCT_NAME" /></translation> @@ -6422,6 +6449,7 @@ Recomendação: ative o bloqueio de tela depois de um período de inatividade quando o dispositivo estiver suspenso e suspenda o <ph name="PRODUCT_OS_NAME" /> depois do intervalo de inatividade. Use esta política apenas quando o bloqueio de tela ocorrer muito antes da suspensão ou quando você não quiser a suspensão por inatividade.</translation> <translation id="7895553628261067384">Acesso remoto</translation> +<translation id="7900469325540540107">Manter os dados de navegação por padrão ao criar um perfil corporativo</translation> <translation id="7902040092815978832">Mostrar teclado numérico para senha</translation> <translation id="7904177352786629708">Definir a política como "Ativada" faz com que a pesquisa CNAME seja ignorada. O nome do servidor é usado conforme inserido ao gerar o SPN do Kerberos. @@ -6580,14 +6608,10 @@ <translation id="8080200590486938727">Desativar o localizador de plug-ins</translation> <translation id="8089200718228084417">Ativar a impressão com o protocolo Privet suspenso</translation> <translation id="8089236320223488328">Usar o comportamento padrão ao determinar se sites não seguros podem fazer solicitações para qualquer endpoint da rede</translation> -<translation id="8091982561085048989">Sinalização booleana indicando se o IPP Everywhere deve ser usado ou não para configurar a impressora. Essa sinalização é compatível com o <ph name="PRODUCT_OS_NAME" /> 76 ou versão mais recente.</translation> +<translation id="8091982561085048989">Flag booleana indicando se o IPP Everywhere deve ser usado ou não para configurar a impressora. Essa sinalização é compatível com o <ph name="PRODUCT_OS_NAME" /> 76 ou versão mais recente.</translation> <translation id="8099880303030573137">Intervalo de inatividade no funcionamento com energia da bateria</translation> <translation id="8101381354936029836">Grupo atômico de políticas:</translation> <translation id="8102913158860568230">Configuração padrão mediastream</translation> -<translation id="8103563905615378194">Especifica se um modelo de carregamento adaptável tem permissão para controlar o processo de carregamento e prolongar a duração da bateria. - - Quando o dispositivo está no carregamento adaptável, o modelo avalia se o processo de carregamento precisa ser controlado para prolongar a duração da bateria. Quando o modelo controla o processo de carregamento, ele mantém a bateria carregada até certo nível, como 80%, e carrega o dispositivo até 100% quando o usuário precisa. - Se esta política for definida como verdadeira ou for deixada sem definição, o modelo de carregamento adaptável será ativado e terá permissão para controlar o processo de carregamento e prolongar a duração da bateria. Se esta política for definida como falsa, o modelo de carregamento adaptável não vai influenciar no processo de carregamento.</translation> <translation id="8104962233214241919">Selecionar certificados de cliente automaticamente para estes sites</translation> <translation id="8114382167597081590">Não aplicar o Modo restrito no YouTube</translation> <translation id="8117921351531866504">Permite que você defina se os sites têm permissão de verificar se os usuários salvaram formas de pagamento. @@ -7410,10 +7434,6 @@ <translation id="8951350807133946005">Definir o diretório de cache de disco</translation> <translation id="8955719471735800169">Voltar ao início</translation> <translation id="8956312248048980644">Permite o clustering do agente com origin-key por padrão.</translation> -<translation id="8967125680876068695">Os apps do Chrome foram descontinuados no Windows, Mac e Linux. - Se esta política for ativada, o <ph name="PRODUCT_NAME" /> continuará permitindo a execução de apps do Chrome nessas plataformas até que o suporte a eles seja removido de todas as plataformas na data final, em junho de 2022. - Se esta política for desativada ou deixada sem definição, a execução de apps do Chrome poderá ser bloqueada, dependendo do status da descontinuação. - Nos dois casos, a execução dos apps do Chrome que forem instalados à força por políticas ainda será permitida.</translation> <translation id="8970205333161758602">Remover a solicitação de recusa do <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8976248126101463034">Permitir autenticação gnubby para hosts de acesso remoto</translation> <translation id="8976531594979650914">Usar a impressora padrão do sistema como padrão</translation>
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index 5fa590e6a9..a728386 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -1310,7 +1310,6 @@ Подробнее о допустимых шаблонах <ph name="URL_LABEL" />: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Значение <ph name="WILDCARD_VALUE" /> не поддерживается для этого правила.</translation> <translation id="2299220924812062390">Определить список включенных плагинов</translation> -<translation id="2301048990069984110">Включить поддержку для приложений Chrome в Windows, macOS и Linux</translation> <translation id="2303795211377219696">Включить автозаполнение данных кредитных карт</translation> <translation id="2304009805995145854">Начиная с <ph name="PRODUCT_NAME" /> версии 67, на всех компьютерах по умолчанию включена изоляция сайтов, в результате чего для каждого из них запускается отдельный процесс. Сайт описывается при помощи протокола и домена первого и второго уровня, например https://example.com. Если текущее правило включено, оно не влияет на такой режим работы, а только запрещает пользователям отключать эту настройку, например с помощью экспериментального параметра Disable site isolation (Отключить изоляцию сайтов) на странице chrome://flags. Начиная с <ph name="PRODUCT_NAME" /> версии 76, если правило отключено или не настроено, изоляция сайтов остается активной, но пользователи могут отказаться от нее. @@ -6580,10 +6579,6 @@ <translation id="8099880303030573137">Задержка перехода в спящий режим при работе от батареи</translation> <translation id="8101381354936029836">Мини-группа правила:</translation> <translation id="8102913158860568230">Настройка MediaStream по умолчанию</translation> -<translation id="8103563905615378194">Определяет, может ли модель адаптивной зарядки приостанавливать зарядку устройства, чтобы продлевать время его работы от батареи. - - Если это время требуется продлить, модель приостанавливает зарядку по достижении определенного уровня (например, 80 %) и удерживает его, а затем заряжает батарею полностью перед тем, как устройство будет отключено от источника питания. - Если правило не настроено или для него задано значение True, модель адаптивной зарядки будет включена и сможет приостанавливать зарядку устройства, чтобы продлевать время его работы от батареи. Если для правила установлено значение False, модель не будет влиять на зарядку.</translation> <translation id="8104962233214241919">Автоматический выбор клиентских сертификатов для сайтов</translation> <translation id="8114382167597081590">Отключить обязательное использование Безопасного режима в YouTube</translation> <translation id="8117921351531866504">Определяет, могут ли сайты проверять наличие сохраненных способов оплаты. @@ -7412,10 +7407,6 @@ <translation id="8951350807133946005">Установка каталога кеша на диске</translation> <translation id="8955719471735800169">В начало</translation> <translation id="8956312248048980644">Разрешает кластеризацию агента с ключом источника</translation> -<translation id="8967125680876068695">Поддержка приложений Chrome в Windows, macOS и Linux прекращена. - Если правило включено, <ph name="PRODUCT_NAME" /> будет разрешать запуск приложений Chrome на данных платформах до даты прекращения их поддержки на всех платформах в июне 2022 года. - Если правило отключено или не настроено, запуск приложений Chrome может быть запрещен (в зависимости от статуса прекращения поддержки). - В любом случае приложения Chrome, принудительно установленные с помощью правила, по-прежнему можно будет запускать.</translation> <translation id="8970205333161758602">Скрытие подсказки <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8976248126101463034">Позволяет использовать аутентификацию Gnubby для хостов удаленного доступа</translation> <translation id="8976531594979650914">Использовать системный принтер по умолчанию</translation>
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index afa2a39..ef2ce971 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -1292,7 +1292,6 @@ ดูข้อมูลโดยละเอียดเกี่ยวกับรูปแบบ <ph name="URL_LABEL" /> ที่ถูกต้องได้ที่ https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns <ph name="WILDCARD_VALUE" /> ไม่ใช่ค่าที่ยอมรับสำหรับนโยบายนี้</translation> <translation id="2299220924812062390">ระบุรายการปลั๊กอินที่เปิดใช้งาน</translation> -<translation id="2301048990069984110">ขยายการรองรับแอป Chrome ใน Windows, Mac และ Linux</translation> <translation id="2303795211377219696">เปิดใช้ "ป้อนข้อความอัตโนมัติ" สำหรับบัตรเครดิต</translation> <translation id="2304009805995145854">ตั้งแต่ <ph name="PRODUCT_NAME" /> เวอร์ชัน 67 การแยกเว็บไซต์จะเปิดใช้ไว้โดยค่าเริ่มต้นในแพลตฟอร์มเดสก์ท็อปทั้งหมด ซึ่งทำให้ทุกเว็บไซต์ทำงานด้วยกระบวนการของตนเองได้ เว็บไซต์อยู่ในรูปแบบบวก eTLD+1 (เช่น https://example.com) การตั้งค่านโยบายนี้เป็น "เปิดใช้" ไม่ได้เปลี่ยนลักษณะการทำงานดังกล่าว เพียงแต่ป้องกันไม่ให้ผู้ใช้เลือกไม่ใช้ (เช่น การใช้ Disable site isolation (ปิดใช้การแยกเว็บไซต์) ใน chrome://flags) ตั้งแต่ <ph name="PRODUCT_NAME" /> เวอร์ชัน 76 การตั้งค่านโยบายเป็น "ปิดใช้" หรือไม่ได้ตั้งค่าจะไม่ปิดการแยกเว็บไซต์ แต่จะอนุญาตให้ผู้ใช้สามารถเลือกไม่ใช้ได้ @@ -6528,10 +6527,6 @@ <translation id="8099880303030573137">ระยะหน่วงเวลาของการไม่ใช้งานเมื่อทำงานโดยใช้พลังงานแบตเตอรี่</translation> <translation id="8101381354936029836">กลุ่มขนาดเล็กของนโยบาย</translation> <translation id="8102913158860568230">การตั้งค่า mediastream เริ่มต้น</translation> -<translation id="8103563905615378194">ระบุว่าจะอนุญาตให้รูปแบบการชาร์จแบบปรับอัตโนมัติพักขั้นตอนการชาร์จไว้ชั่วคราวเพื่อยืดอายุการใช้งานแบตเตอรี่หรือไม่ - - เมื่อเสียบปลั๊กอุปกรณ์อยู่ รูปแบบการชาร์จแบบปรับอัตโนมัติจะประเมินว่าควรพักขั้นตอนการชาร์จไว้ชั่วคราวเพื่อยืดอายุการใช้งานแบตเตอรี่หรือไม่ หากรูปแบบการชาร์จแบบปรับอัตโนมัติพักขั้นตอนการชาร์จไว้ชั่วคราวก็จะคงแบตเตอรี่ไว้ที่ระดับหนึ่ง (เช่น 80%) จากนั้นจะชาร์จจนถึง 100% เมื่อผู้ใช้ต้องการ - หากตั้งค่านโยบายนี้เป็น "จริง" หรือไม่ได้ตั้งค่า ระบบจะเปิดใช้รูปแบบการชาร์จแบบปรับอัตโนมัติและอนุญาตให้พักขั้นตอนการชาร์จไว้ชั่วคราวเพื่อยืดอายุการใช้งานแบตเตอรี่ หากตั้งค่านโยบายนี้เป็น "เท็จ" รูปแบบการชาร์จแบบปรับอัตโนมัติจะไม่ส่งผลต่อขั้นตอนการชาร์จ</translation> <translation id="8104962233214241919">เลือกใบรับรองไคลเอ็นต์สำหรับไซต์เหล่านี้โดยอัตโนมัติ</translation> <translation id="8114382167597081590">ไม่บังคับใช้โหมดที่จำกัดใน YouTube</translation> <translation id="8117921351531866504">อนุญาตให้คุณตั้งค่าว่าจะอนุญาตให้เว็บไซต์ตรวจสอบว่าผู้ใช้บันทึกวิธีการชำระเงินไว้ได้หรือไม่ @@ -7347,10 +7342,6 @@ <translation id="8951350807133946005">ตั้งค่าไดเรกทอรีสำหรับแคชของดิสก์</translation> <translation id="8955719471735800169">กลับไปด้านบน</translation> <translation id="8956312248048980644">อนุญาตการสร้างคลัสเตอร์ Agent ที่ผูกกับต้นทางโดยค่าเริ่มต้น</translation> -<translation id="8967125680876068695">แอป Chrome เลิกใช้งานแล้วใน Windows, Mac และ Linux - หากเปิดใช้นโยบายนี้ <ph name="PRODUCT_NAME" /> จะอนุญาตให้แอป Chrome ทำงานในแพลตฟอร์มดังกล่าวต่อไปจนกระทั่งถึงวันที่เรายกเลิกการสนับสนุนแอป Chrome ในทุกแพลตฟอร์มเดือนมิถุนายน 2022 - หากปิดใช้นโยบายนี้หรือไม่ได้ตั้งค่า ระบบอาจไม่อนุญาตให้แอป Chrome ทำงาน ทั้งนี้ขึ้นอยู่กับสถานะของการเริ่มเลิกใช้งาน - ไม่ว่าจะเป็นกรณีใด แอป Chrome ที่นโยบายบังคับติดตั้งจะยังได้รับอนุญาตต่อไป</translation> <translation id="8970205333161758602">ระงับการแจ้งเตือนการปฏิเสธของ <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8976248126101463034">อนุญาตให้ตรวจสอบสิทธิ์ Gnubby สำหรับโฮสต์การเข้าถึงระยะไกล</translation> <translation id="8976531594979650914">ใช้เครื่องพิมพ์เริ่มต้นของระบบเป็นค่าเริ่มต้น</translation>
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb index aa540ef8..56523254 100644 --- a/components/policy/resources/policy_templates_tr.xtb +++ b/components/policy/resources/policy_templates_tr.xtb
@@ -1297,7 +1297,6 @@ Geçerli <ph name="URL_LABEL" /> kalıpları hakkında ayrıntılı bilgi için https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns adresine bakabilirsiniz. <ph name="WILDCARD_VALUE" />, bu politikada kabul edilen bir değer değildir.</translation> <translation id="2299220924812062390">Etkinleştirilmiş eklentilerin listesini belirt</translation> -<translation id="2301048990069984110">Windows, Mac ve Linux'taki Chrome Uygulamaları desteğini artırma.</translation> <translation id="2303795211377219696">Kredi kartları için Otomatik Doldurma özelliğini etkinleştirme</translation> <translation id="2304009805995145854">Site izolasyonu, 67. <ph name="PRODUCT_NAME" /> sürümünden itibaren tüm masaüstü platformlarda varsayılan olarak etkinleştirilerek her sitenin kendi işleminde çalışmasına neden olur. Site, şema artı eTLD+1 olarak tanımlanır (ör. https://example.com). Bu politikanın Etkin değerine ayarlanması bu davranışı değiştirmez, yalnızca kullanıcıların bu ayarı devre dışı bırakmasını (örneğin, chrome://flags'te Site izolasyonunu devre dışı bırak seçeneğini kullanarak) engeller. 76. <ph name="PRODUCT_NAME" /> sürümünden itibaren, bu politikanın Devre dışı değerine ayarlanması veya ayarlanmadan bırakılması, site izolasyonunu kapatmaz ancak kullanıcılar tarafından devre dışı bırakılmasına izin verir. @@ -6563,10 +6562,6 @@ <translation id="8099880303030573137">Pil gücüyle çalışırken boşta kalma gecikmesi</translation> <translation id="8101381354936029836">Politika atom grubu:</translation> <translation id="8102913158860568230">Varsayılan medya akışı ayarı</translation> -<translation id="8103563905615378194">Uyarlanabilir şarj modelinin, pil ömrünü uzatmak için şarj sürecini geçici olarak durdurmasına izin verilip verilmeyeceğini belirtir. - - Uyarlanabilir şarj modeli, cihaz AC gücünde çalışırken pil ömrünü uzatmak için şarj sürecinin geçici olarak durdurulmasına gerek olup olmadığını değerlendirir. Uyarlanabilir şarj modeli ile şarj süreci geçici olarak durdurulursa pil belirli bir seviyede (ör. %80) tutulur, daha sonra kullanıcı ihtiyaç duyduğunda cihaz %100'e kadar şarj edilir. - Bu politika, Doğru değerine ayarlanır veya ayarlanmadan bırakılırsa uyarlanabilir şarj modeli etkinleştirilir. Böylece pil ömrünü uzatmak için şarj sürecinin geçici olarak durdurulmasına izin verilmiş olur. Bu politika, Yanlış değerine ayarlanırsa uyarlanabilir şarj modeli, şarj sürecini etkilemez.</translation> <translation id="8104962233214241919">Bu siteler için istemci sertifikalarını otomatik olarak seç</translation> <translation id="8114382167597081590">YouTube'da Kısıtlı Mod'u zorunlu kılma</translation> <translation id="8117921351531866504">Web sitelerinin kullanıcının kaydettiği ödeme yöntemleri olup olmadığını kontrol etmesine izin verilip verilmeyeceğini ayarlamanıza olanak sağlar. @@ -7376,10 +7371,6 @@ <translation id="8951350807133946005">Disk önbellek dizinini ayarla</translation> <translation id="8955719471735800169">Başa dön</translation> <translation id="8956312248048980644">Varsayılan olarak kaynak içeren veya kaynaklarla ilişkili aracı kümelemeye izin verir.</translation> -<translation id="8967125680876068695">Chrome Uygulamaları; Windows, Mac ve Linux'ta kullanımdan kaldırıldı. - Bu politika etkinleştirilirse <ph name="PRODUCT_NAME" />, Chrome Uygulamaları desteğinin tüm platformlardan kaldırılacağı son tarih olan Haziran 2022'ye kadar Chrome Uygulamalarının bu platformlarda çalıştırılmasına izin verir. - Bu politika devre dışı bırakılır veya ayarlanmazsa, kullanımdan kaldırma durumuna bağlı olarak Chrome Uygulamalarının çalışmasına izin verilmeyebilir. - Her iki durumda da, politika gereği zorunlu yüklenmiş Chrome Uygulamalarına izin verilmeye devam edilir.</translation> <translation id="8970205333161758602"><ph name="PRODUCT_FRAME_NAME" /> reddetme sorusunu engelle</translation> <translation id="8976248126101463034">Uzak erişim ana makineleri için gnubby kimlik doğrulamasına izin ver</translation> <translation id="8976531594979650914">Varsayılan Olarak Sistem Varsayılan Yazıcısını Kullan</translation>
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index 5710c22..0e9305fe 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -100,6 +100,7 @@ <translation id="1095209545735032039">Блокувати Serial API на цих сайтах</translation> <translation id="1096105751829466145">Пошукова служба за умовчанням</translation> <translation id="1099282607296956954">Увімкнути Ізоляцію сайтів для кожного сайту</translation> +<translation id="1100840127293327071">Не вмикати опцію зберігання наявних даних веб-перегляду за умовчанням</translation> <translation id="1105572260329131950">Використовувати для надійних з’єднань значки за умовчанням</translation> <translation id="1107538157073168076">Вимкнути розширення статистики</translation> <translation id="1110426799149444997">Вимкнути пошук за областю зображення в сервісі <ph name="GOOGLE_LENS_PRODUCT_NAME" />.</translation> @@ -747,6 +748,14 @@ <translation id="1781356041596378058">Це правило також керує доступом до Параметрів розробника Android. Якщо для цього правила встановлено значення "true", користувачі не матимуть доступу до Параметрів розробника. Якщо це правило не налаштовано або встановлено значення "false", користувачі можуть отримувати доступ до Параметрів розробника, сім разів торкнувшись номера складання в додатку Налаштування Android.</translation> <translation id="1787790976045065845">Це правило діє, лише якщо для правила <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_POLICY_NAME" /> вибрано значення <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_LOCK" /> або <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_LOGOUT" />, а користувач, який проходить автентифікацію за допомогою розумної картки, виймає її. Потім у налаштуваннях цього правила вказується, скільки секунд відображається сповіщення про дію, яка відбудеться. Таке сповіщення блокує екран. Відповідна дія відбудеться, коли припиниться показ сповіщення. Користувач може запобігти їй, якщо знову вставить розумну картку, перш ніж сповіщення зникне. Якщо для цього правила вказано значення нуль, сповіщення не відображатиметься, а відповідна дія відбудеться відразу.</translation> <translation id="1793346220873697538">Вимкнути друк із PIN-кодом за умовчанням</translation> +<translation id="1794457906032475749">Якщо це правило ввімкнено, опцію зберігання наявних даних веб-перегляду під час створення корпоративного профілю буде ввімкнено за умовчанням. + +Якщо це правило не налаштувати або вимкнути, опцію зберігання наявних даних веб-перегляду під час створення корпоративного профілю не буде ввімкнено за умовчанням. + +Незалежно від значення правила користувач зможе вирішувати, чи зберігати наявні дані веб-перегляду під час створення корпоративного профілю. + +Це правило не діє, якщо опція зберігання наявних даних веб-перегляду недоступна. Це відбувається, якщо суворо дотримується розділення корпоративних профілів або якщо будуть використовуватися дані з керованого профілю. +</translation> <translation id="179694024208061102">Якщо це правило активовано, <ph name="PRODUCT_NAME" /> намагатиметься відкривати деякі URL-адреси в альтернативному веб-переглядачі, наприклад <ph name="IE_PRODUCT_NAME" />. Цю функцію можна налаштувати за допомогою правил у групі "<ph name="LEGACY_BROWSER_SUPPORT_POLICY_GROUP" />". Якщо це правило деактивовано або не налаштовано, <ph name="PRODUCT_NAME" /> не намагатиметься запускати визначені URL-адреси в альтернативному веб-переглядачі.</translation> @@ -1320,7 +1329,6 @@ Докладніше про дійсні шаблони <ph name="URL_LABEL" />-адрес можна дізнатися на сторінці https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> – недопустиме значення для цього правила.</translation> <translation id="2299220924812062390">Указати список увімкнених плагінів</translation> -<translation id="2301048990069984110">Подовжити підтримку додатків Chrome в ОС Windows, Mac і Linux.</translation> <translation id="2303795211377219696">Вмикає функцію автозаповнення для кредитних карток</translation> <translation id="2304009805995145854">Починаючи з версії <ph name="PRODUCT_NAME" /> 67, ізоляцію сайтів увімкнено за умовчанням на всіх платформах для ПК, тому кожний сайт відкривається окремо. Сайт – це схема плюс eTLD+1 (наприклад, https://example.com). Якщо правило ввімкнути, поведінку не буде змінено; воно лише забороняє користувачам вимикати цей параметр (наприклад, скориставшись записом "Disable site isolation" у chrome://flags). Починаючи з версії <ph name="PRODUCT_NAME" /> 76, якщо вимкнути це правило або не налаштувати його, ізоляція сайтів працюватиме, але користувачі зможуть відмовитися від неї. @@ -1642,6 +1650,7 @@ У <ph name="MS_WIN_NAME" /> ця функція доступна лише для Windows 10 Pro або версій, зареєстрованих у домені <ph name="MS_AD_NAME" /> чи в Керуванні хмарними сервісами для веб-переглядача Chrome. У <ph name="MAC_OS_NAME" /> ця функція доступна лише для версій, у яких працює додаток Керування мобільними пристроями або які зареєстровано в домені через MCX.</translation> <translation id="2623014935069176671">Чекати на першу дію користувача</translation> +<translation id="2625026032335150744">Увімкнути опцію зберігання наявних даних веб-перегляду за умовчанням</translation> <translation id="2625398797484317969">Керує налаштуваннями швидких відповідей.</translation> <translation id="262740370354162807">Дозволяє надсилати документи в службу <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="2633084400146331575">Увімкнути голосові підказки</translation> @@ -2063,6 +2072,7 @@ Докладніше про дійсні шаблони <ph name="URL_LABEL" />-адрес можна дізнатися на сторінці https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> – недопустиме значення для цього правила.</translation> <translation id="305106159605171619">Скорочення агента користувача вимкнено, і цю функцію не ввімкнено через Field-Trials або Origin-Trials.</translation> <translation id="3053265701996417839">Microsoft Windows 7</translation> +<translation id="3063302084011279315">Вимкнути функцію "Запис екрана"</translation> <translation id="3064530882228745118">Використовути пошук CNAME під час автентифікації за протоколом Kerberos</translation> <translation id="3066446511111537292">Дозволити пов'язаним користувачам цього пристрою завантажувати додатки з невідомого джерела через ADB</translation> <translation id="3070119171976169951">Заборонити стороннім зображенням показувати запити на автентифікацію</translation> @@ -2280,6 +2290,7 @@ <translation id="3255762580838224124">Якщо налаштувати це правило, на всіх дисплеях застосовуватиметься вказана орієнтація після кожного перезапуску, а також коли дисплеї підключатимуть уперше після зміни значень цього правила. Увійшовши в обліковий запис, користувачі можуть змінити орієнтацію дисплея на сторінці налаштувань, але після наступного перезапуску відновлюватиметься прописане в правилі значення. Це правило застосовується до основних і додаткових дисплеїв. Якщо його не налаштовано, діє значення за умовчанням – 0 градусів, але користувачі можуть змінити його. У такому випадку значення за умовчанням не відновлюватиметься після перезапуску.</translation> +<translation id="3257786863492892609">Контролює правила, що застосовуються до функції запису екрана.</translation> <translation id="3258380413685430793">Відтворювати весь контент <ph name="FLASH_PLUGIN_NAME" /></translation> <translation id="325883417142483505">За допомогою цього правила можна визначити список URL-адрес для входу підприємства (лише для протоколів HTTP та HTTPS). На вибраних сторінках сервіс захисту паролів зберігатиме модифіковані хеші паролів, щоб виявляти їх повторне введення. Щоб веб-переглядач <ph name="PRODUCT_NAME" /> правильно зберігав модифіковані хеші паролів, переконайтеся, що сторінки входу відповідають правилам на сайті https://www.chromium.org/developers/design-documents/create-amazing-password-forms. @@ -3260,6 +3271,7 @@ <translation id="441686537793821907">Блокувати встановлення зовнішніх розширень</translation> <translation id="4423597592074154136">Вручну вказувати налаштування проксі-сервера</translation> <translation id="4424004842303301809">Вимкнути звітування в реальному часі про запобіжні заходи щодо витоку даних</translation> +<translation id="4426601693403743089">Вимкнути версію функції "Запис екрана" для внутрішнього тестування для користувачів Family Link</translation> <translation id="4427173305799125784">Засіб перегляду PDF не може додавати примітки у файлах PDF</translation> <translation id="4432762137771104529">Вмикає Розширене звітування безпечного перегляду</translation> <translation id="443454694385851356">Застарілий (небезпечно)</translation> @@ -4865,6 +4877,7 @@ Кожний елемент у списку правила має вигляд сегмента з ідентифікатором розширення та URL-адресою "оновлення" (необов'язково), які розділені крапкою з комою (<ph name="SEMICOLON" />). Ідентифікатор розширення – це сегмент із 32 літер, приклад якого можна знайти на сторінці <ph name="CHROME_EXTENSIONS_LINK" /> у режимі розробника. URL-адреса "оновлення" (якщо її зазначено) має спрямовувати на документ маніфесту оновлення у форматі XML, як описано на сторінці <ph name="LINK_TO_EXTENSION_DOC1" />. За умовчанням використовується URL-адреса для оновлення Веб-магазину Chrome (наразі – https://clients2.google.com/service/update2/crx). Зауважте, що URL-адреса "оновлення", зазначена для цього правила, використовується лише для початкового встановлення розширення. Під час наступних оновлень використовуватиметься URL-адреса, зазначена в маніфесті розширення. Наприклад, правило <ph name="LOGIN_SCREEN_EXTENSION_POLICY_EXAMPLE" /> установлює додаток <ph name="SMART_CARD_CONNECTOR_APP_NAME" /> зі стандартної URL-адреси "оновлення" у Веб-магазині Chrome. Докладніше про розміщення розширень читайте на сторінці <ph name="LINK_TO_EXTENSION_DOC2" />.</translation> +<translation id="6274202259872570803">Запис екрана</translation> <translation id="6275497712828649588">Приховувати попередження про небезпеку, коли використовуються потенційно небезпечні правила командного рядка</translation> <translation id="6275833043726517413">Призначити пріоритет застарілої версії <ph name="CORS" /> перед новою <ph name="CORS" />. @@ -4898,7 +4911,15 @@ Налаштування правила <ph name="CHROME_OS_RELEASE_CHANNEL_POLICY_NAME" /> діють, лише якщо для <ph name="CHROME_OS_RELEASE_CHANNEL_DELEGATED_POLICY_NAME" /> вибрано значення False.</translation> <translation id="6305373713165475629">Якщо ввімкнути це правило, воно замінить стандартні параметри кольорового друку. Якщо такий режим недоступний, це правило ігнорується.</translation> +<translation id="6308109234708949641">Це правило вмикає функцію запису екрана для користувачів Family Link і дає їй дозвіл на запис відео з екрана, його перетворення на текст, а також завантаження на Диск. + Це правило не впливає на інших користувачів + і не стосується правила <ph name="PROJECTOR_ENABLED_POLICY_NAME" /> для корпоративних користувачів. + + Якщо правило ввімкнути, версію функції "Запис екрана" для внутрішнього тестування буде ввімкнено для користувачів Family Link. + Якщо вимкнути, версію функції "Запис екрана" для внутрішнього тестування буде вимкнено для користувачів Family Link. + Якщо це правило не налаштувати, версію функції "Запис екрана" для внутрішнього тестування буде за умовчанням вимкнено для користувачів Family Link.</translation> <translation id="6310223829319187614">Увімкнути автозавершення назви домену під час входу користувача</translation> +<translation id="6310756730808079944">Увімкнути функцію "Запис екрана"</translation> <translation id="631081324835911099">Примусово виходити з основного облікового запису користувача, коли маркер автентифікації стає недійсним. Це правило може заблокувати користувачу доступ до контенту з обмеженнями на веб-ресурсах Google. Якщо для цього правила вибрано значення true, з облікового запису користувача буде здійснено вихід, коли маркер автентифікації стане недійсним і його не вдасться відновити. @@ -5285,6 +5306,12 @@ Якщо для цього правила встановлено значення "false" або його не налаштовано, створення та вхід контрольованих користувачів буде вимкнено. Усіх наявних контрольованих користувачів буде сховано. ПРИМІТКА. Поведінка за умовчанням для приватних і корпоративних пристроїв різниться: на приватних пристроях контрольовані користувачі ввімкнені за умовчанням, а на корпоративних пристроях – вимкнені за умовчанням.</translation> +<translation id="6648746349186337075">Для корпоративних користувачів це правило дає функції запису екрана дозвіл на запис відео з екрана, його перетворення на текст і завантаження на Диск. + Це правило не впливає на користувачів Family Link + і не стосується правила <ph name="PROJECTOR_DOGFOOD_FOR_FAMILY_LINK_ENABLED_POLICY_NAME" /> для користувачів Family Link. + + Якщо це правило не налаштовано або ввімкнено, функцію запису екрана буде ввімкнено, + а якщо його вимкнути, функцію запису екрана буде вимкнено.</translation> <translation id="665023848306499203">Дозволяти пристроям вибирати конкретні версії для оновлення</translation> <translation id="6652197835259177259">Налаштування локально керованих користувачів</translation> <translation id="6653897159826215341">Якщо це правило ввімкнено, <ph name="PRODUCT_NAME" /> відкриває системне вікно друку, а не вбудоване вікно попереднього перегляду. @@ -6188,6 +6215,7 @@ Якщо правило ввімкнути або не налаштувати, конвертування одиниць у швидких відповідях буде ввімкнено. Якщо його вимкнути, цю функцію буде вимкнено.</translation> <translation id="7587345076013230465">Просити користувача вибрати сертифікат клієнта на екрані входу, коли правило автоматичного вибору відповідає декільком сертифікатам</translation> +<translation id="7587921466180902617">Увімкнути версію функції "Запис екрана" для внутрішнього тестування для користувачів Family Link</translation> <translation id="759957074386651883">Налаштування Безпечного перегляду</translation> <translation id="7604169113182304895">Додатки Android можуть вибирати, чи використовувати цей список. Ви не можете вплинути на це.</translation> <translation id="7612157962821894603">Позначки на рівні системи, що застосовуються під час запуску <ph name="PRODUCT_NAME" /></translation> @@ -6436,6 +6464,7 @@ Рекомендовано блокувати екран після переходу в режим сну та налаштувати перехід <ph name="PRODUCT_OS_NAME" /> у режим сну після затримки, визначеної параметром Idle. Правило ScreenLockDelays варто використовувати, лише якщо екран потрібно блокувати задовго до переходу в режим сну або якщо перехід у режим сну через неактивність небажаний.</translation> <translation id="7895553628261067384">Віддалений доступ</translation> +<translation id="7900469325540540107">Зберігати дані веб-перегляду під час створення корпоративного профілю за умовчанням</translation> <translation id="7902040092815978832">Показати цифрову клавіатуру для пароля</translation> <translation id="7904177352786629708">Якщо це правило активовано, пошук CNAME пропускатиметься. Використовується назва сервера, введена під час створення SPN для протоколу Kerberos. @@ -6598,10 +6627,6 @@ <translation id="8099880303030573137">Затримка через неактивність, коли використовується заряд акумулятора</translation> <translation id="8101381354936029836">Елементарна група правила:</translation> <translation id="8102913158860568230">Налаштування потоку медіаданих за умовчанням</translation> -<translation id="8103563905615378194">Указує, чи може модель адаптивного заряджання призупиняти заряджання, щоб подовжувати час роботи акумулятора. - - Коли пристрій підключено до електромережі, модель визначає, чи потрібно призупинити заряджання. Якщо вона це зробить, заряд акумулятора підтримуватиметься на певному рівні (наприклад, 80%), а потім пристрій зарядиться на 100% до потрібного часу. - Якщо це правило не налаштувати або вибрати для нього значення "правда", модель адаптивного заряджання буде ввімкнено й дозволено призупиняти заряджання для подовження часу роботи акумулятора. Якщо для цього правила вибрати значення "неправда", модель не впливатиме на процес заряджання.</translation> <translation id="8104962233214241919">Автоматичний вибір сертифікатів клієнтів для цих сайтів</translation> <translation id="8114382167597081590">Не застосовувати безпечний режим на YouTube</translation> <translation id="8117921351531866504">Дозволяє вказати, чи можуть веб-сайти перевіряти, чи користувач має збережені способи оплати. @@ -7428,10 +7453,6 @@ <translation id="8951350807133946005">Налаштування каталогу кешу на диску</translation> <translation id="8955719471735800169">На початок</translation> <translation id="8956312248048980644">За умовчанням дозволяє кластеризацію агентів за ключем джерела.</translation> -<translation id="8967125680876068695">Додатки Chrome не підтримуються в ОС Windows, Mac і Linux. - Якщо це правило ввімкнути, <ph name="PRODUCT_NAME" /> дозволятиме запускати додатки Chrome на цих платформах до дати завершення їх підтримки на всіх платформах (червень 2022 року). - Якщо це правило вимкнути або не налаштувати, запуск додатків Chrome може бути забороненим залежно від статусу припинення підтримки. - У будь-якому випадку додатки Chrome, які примусово встановили за допомогою правила, можна буде запускати.</translation> <translation id="8970205333161758602">Заборонити запити <ph name="PRODUCT_FRAME_NAME" /> на вимкнення</translation> <translation id="8976248126101463034">Дозволити автентифікацію розширення Gnubby для хостів віддаленого доступу</translation> <translation id="8976531594979650914">Використовувати системний принтер за умовчанням</translation>
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb index f0ac232..b04ce89 100644 --- a/components/policy/resources/policy_templates_vi.xtb +++ b/components/policy/resources/policy_templates_vi.xtb
@@ -100,6 +100,7 @@ <translation id="1095209545735032039">Chặn API nối tiếp trên các trang web này</translation> <translation id="1096105751829466145">Nhà cung cấp dịch vụ tìm kiếm mặc định</translation> <translation id="1099282607296956954">Bật chính sách Cô lập trang web cho mọi trang web</translation> +<translation id="1100840127293327071">Không chọn tuỳ chọn lưu giữ dữ liệu duyệt web hiện có theo mặc định</translation> <translation id="1105572260329131950">Sử dụng biểu tượng mặc định cho các kết nối an toàn</translation> <translation id="1107538157073168076">Tắt tiện ích thông tin chi tiết</translation> <translation id="1110426799149444997">Tắt tính năng tìm kiếm khu vực của <ph name="GOOGLE_LENS_PRODUCT_NAME" />.</translation> @@ -262,6 +263,7 @@ Nếu bạn không đặt chính sách này hoặc giá trị sau khi thay thế không phải là tên máy chủ hợp lệ, thì tên máy chủ sẽ không được đặt trong yêu cầu DHCP.</translation> <translation id="1257550411839719984">Đặt thư mục tải xuống mặc định</translation> <translation id="1265053460044691532">Hạn chế thời gian người dùng được xác thực qua SAML có thể đăng nhập ngoại tuyến</translation> +<translation id="1271811620059192171">Bật nhóm chính sách không thể phân chia</translation> <translation id="127264587838521316">Bật yêu cầu cài đặt tiện ích của <ph name="PRODUCT_NAME" /></translation> <translation id="1272798957154751008">Cho phép di chuyển các thiết bị Chromad sang chế độ quản lý qua đám mây</translation> <translation id="1274997165432133392">Cookie và các dữ liệu khác của trang web</translation> @@ -748,6 +750,14 @@ <translation id="1781356041596378058">Chính sách này cũng kiểm soát quyền truy cập vào Tùy chọn của nhà phát triển Android. Nếu bạn đặt chính sách này thành true, người dùng sẽ không thể truy cập vào Tùy chọn của nhà phát triển. Nếu bạn đặt chính sách này thành false hoặc không đặt chính sách này thì người dùng có thể truy cập Tùy chọn của nhà phát triển bằng cách nhấn bảy lần trên số bản dựng trong ứng dụng cài đặt Android.</translation> <translation id="1787790976045065845">Chính sách này chỉ có hiệu lực khi bạn đặt chính sách <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_POLICY_NAME" /> thành <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_LOCK" /> hoặc <ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_LOGOUT" /> và khi người dùng tháo thẻ thông minh mà họ dùng để xác thực. Khi đó, chính sách này sẽ chỉ rõ số giây hiển thị một thông báo cho người dùng biết về hành động sắp diễn ra. Thông báo này đang chặn màn hình. Hành động sẽ chỉ diễn ra sau khi thông báo này hết hạn. Người dùng có thể ngăn hành động diễn ra bằng cách lắp lại thẻ thông minh trước khi thông báo hết hạn. Nếu bạn đặt chính sách này thành 0, sẽ không có thông báo nào hiển thị và hành động sẽ diễn ra ngay lập tức.</translation> <translation id="1793346220873697538">Tắt tính năng in mã PIN theo mặc định</translation> +<translation id="1794457906032475749">Nếu bạn Bật chính sách này thì theo mặc định, tuỳ chọn lưu giữ mọi dữ liệu duyệt web hiện có khi tạo hồ sơ doanh nghiệp sẽ được chọn. + +Nếu bạn Tắt hoặc không thiết lập chính sách này thì theo mặc định, tuỳ chọn lưu giữ mọi dữ liệu duyệt web hiện có khi tạo hồ sơ doanh nghiệp sẽ không được chọn. + +Bất kể giá trị là gì, người dùng đều có thể quyết định có lưu giữ mọi dữ liệu duyệt web hiện có khi tạo hồ sơ doanh nghiệp hay không. + +Chính sách này không có hiệu lực nếu không có tuỳ chọn lưu giữ dữ liệu duyệt web hiện có; trường hợp này xảy ra nếu việc tách biệt hồ sơ doanh nghiệp được thực thi nghiêm ngặt hoặc nếu dữ liệu thuộc về một hồ sơ đã được quản lý. +</translation> <translation id="179694024208061102">Nếu bạn đặt chính sách này thành Bật, thì <ph name="PRODUCT_NAME" /> sẽ tìm cách chạy một số URL trong trình duyệt thay thế, chẳng hạn như <ph name="IE_PRODUCT_NAME" />. Bạn đặt tính năng này bằng các chính sách trong nhóm <ph name="LEGACY_BROWSER_SUPPORT_POLICY_GROUP" />. Nếu bạn đặt chính sách này thành Tắt hoặc không đặt, thì <ph name="PRODUCT_NAME" /> sẽ không tìm cách chạy các URL đã chỉ định trong trình duyệt thay thế.</translation> @@ -1324,7 +1334,6 @@ Để biết thông tin chi tiết về các mẫu <ph name="URL_LABEL" /> hợp lệ, vui lòng xem tại https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Chúng tôi không chấp nhận giá trị <ph name="WILDCARD_VALUE" /> đối với chính sách này.</translation> <translation id="2299220924812062390">Chỉ định danh sách plugin được phép</translation> -<translation id="2301048990069984110">Mở rộng hỗ trợ cho Ứng dụng Chrome trên Windows, Mac và Linux.</translation> <translation id="2303795211377219696">Bật tính năng Tự động điền cho thẻ tín dụng</translation> <translation id="2304009805995145854">Kể từ <ph name="PRODUCT_NAME" /> 67, tính năng tách biệt trang web đã được bật theo mặc định trên tất cả Nền tảng máy tính, khiến mọi trang web đều chạy theo quy trình riêng. Trang web là một lược đồ cộng với eTLD+1 (ví dụ: https://example.com). Nếu bạn đặt chính sách này thành Bật thì hành vi đó sẽ không thay đổi, thao tác này chỉ ngăn người dùng chọn không sử dụng (chẳng hạn như dùng lựa chọn Tắt tính năng tách biệt trang web trong chrome://flags). Kể từ <ph name="PRODUCT_NAME" /> 76, nếu bạn đặt thành Tắt hoặc không đặt chính sách này thì tính năng tách biệt trang web sẽ không bị tắt, nhưng người dùng có thể chọn không sử dụng. @@ -1645,6 +1654,7 @@ Trên <ph name="MS_WIN_NAME" />, chức năng này chỉ có ở những phiên bản liên kết với một miền <ph name="MS_AD_NAME" />, chạy trên Windows 10 Pro, hoặc đã đăng ký tùy chọn Quản lý trình duyệt Chrome qua đám mây. Trên <ph name="MAC_OS_NAME" />, chức năng này chỉ có ở những phiên bản được quản lý qua MDM, hoặc liên kết với một miền qua MCX.</translation> <translation id="2623014935069176671">Đợi hoạt động người dùng đầu tiên</translation> +<translation id="2625026032335150744">Chọn tuỳ chọn lưu giữ dữ liệu duyệt web hiện có theo mặc định</translation> <translation id="2625398797484317969">Kiểm soát các chế độ cài đặt của tính năng Thông tin nhanh.</translation> <translation id="262740370354162807">Cho phép gửi tài liệu tới <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="2633084400146331575">Bật tính năng phản hồi bằng giọng nói</translation> @@ -2066,6 +2076,7 @@ Để biết thông tin chi tiết về các mẫu <ph name="URL_LABEL" /> hợp lệ, vui lòng xem tại https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Chúng tôi không chấp nhận giá trị <ph name="WILDCARD_VALUE" /> đối với chính sách này.</translation> <translation id="305106159605171619">Đã tắt chế độ giảm thiểu Tác nhân người dùng (User-Agent Reduction) và không dùng Bản dùng thử thử nghiệm (Field-Trials) hay Bản dùng thử theo nguyên gốc (Origin-Trials) để bật tính năng này.</translation> <translation id="3053265701996417839">Microsoft Windows 7</translation> +<translation id="3063302084011279315">Tắt Screencast</translation> <translation id="3064530882228745118">Dùng tính năng tra cứu CNAME trong quá trình xác thực Kerberos</translation> <translation id="3066446511111537292">Cho phép người dùng đã liên kết của thiết bị này sử dụng tính năng cài đặt không qua cửa hàng của Cầu gỡ lỗi Android (ADB)</translation> <translation id="3070119171976169951">Ngăn hình ảnh của bên thứ ba hiện lời nhắc xác thực</translation> @@ -2283,6 +2294,7 @@ <translation id="3255762580838224124">Nếu đặt chính sách này, thì mỗi màn hình sẽ xoay theo một hướng chỉ định mỗi khi khởi động lại và vào lần đầu tiên màn hình được kết nối sau khi giá trị chính sách thay đổi. Người dùng có thể thay đổi chế độ xoay màn hình thông qua trang cài đặt sau khi đăng nhập. Tuy nhiên, chế độ này sẽ chuyển về như cũ vào lần khởi động lại tiếp theo. Chính sách này áp dụng cho màn hình chính và phụ. Nếu bạn chưa đặt chính sách này, thì giá trị mặc định là 0 độ và người dùng có thể thay đổi giá trị này. Trong trường hợp này, giá trị mặc định không được áp dụng thêm lần nữa khi khởi động lại.</translation> +<translation id="3257786863492892609">Chính sách kiểm soát đối với Screencast.</translation> <translation id="3258380413685430793">Chạy toàn bộ nội dung <ph name="FLASH_PLUGIN_NAME" /></translation> <translation id="325883417142483505">Việc đặt chính sách này sẽ đặt danh sách các URL đăng nhập của doanh nghiệp (chỉ giao thức HTTP và HTTPS). Dịch vụ bảo vệ mật khẩu sẽ ghi lại hàm băm được thêm dữ liệu ngẫu nhiên của mật khẩu trên các URL này và dùng cho mục đích 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 hàm băm được thêm dữ liệu ngẫu nhiên của mật khẩu, hãy đảm bảo các trang đăng nhập của bạn tuân thủ những nguyên tắc này (https://www.chromium.org/developers/design-documents/create-amazing-password-forms). @@ -2881,6 +2893,7 @@ Nếu bạn tắt hoặc không đặt chính sách này, thì người dùng chỉ có thể được nhắc khi không có chứng chỉ nào khớp với chính sách tự động chọn.</translation> <translation id="3950110092991281616">Chỉ bật tùy chọn xác thực môi trường xung quanh đối với các phiên thông thường.</translation> <translation id="3950239119790560549">Giới hạn thời gian cập nhật</translation> +<translation id="3956243291190637924">Ẩn đầu trang và chân trang ở chế độ xem trước bản in</translation> <translation id="3956573780915784996">Cho phép người dùng thu thập dữ liệu theo dõi hoạt động trên toàn hệ thống.</translation> <translation id="3956686688560604829">Sử dụng chính sách SiteList của Internet Explorer để hỗ trợ trình duyệt cũ.</translation> <translation id="3958586912393694012">Cho phép sử dụng Smart Lock</translation> @@ -3118,6 +3131,16 @@ Nếu bạn đặt chính sách này thành Tắt hoặc không đặt chính sách này, thì người dùng có thể chuyển tệp sang Drive khi dùng kết nối di động.</translation> <translation id="4248277954659222481">Cho phép tự động phát nội dung nghe nhìn thuộc danh sách các mẫu URL được phép</translation> <translation id="4250680216510889253">Không</translation> +<translation id="4259636715493757956">Cho phép bạn chỉ định cấu hình cho các URL xác thực trong <ph name="WEBVIEW_PRODUCT_NAME" />. + + Các URL xác thực này sẽ được <ph name="WEBVIEW_PRODUCT_NAME" /> xử lý theo cách đặc biệt, tức là trong quá trình xác thực khi trang web trong <ph name="WEBVIEW_PRODUCT_NAME" /> được điều hướng đến URL xác thực, ứng dụng xác thực của Nhà cung cấp danh tính tương ứng có thể xử lý URL xác thực này sẽ khởi chạy. + + Quy trình khởi chạy ứng dụng xác thực của Nhà cung cấp danh tính sẽ được Nhà cung cấp danh tính sử dụng để hỗ trợ những trường hợp sử dụng như cung cấp dịch vụ Đăng nhập một lần (SSO) giữa nhiều ứng dụng hoặc tăng mức độ bảo mật bằng cách thu thập tín hiệu thiết bị không tin cậy để nắm được tình trạng của thiết bị trong quá trình xác thực. + + Nếu thiết bị chưa cài đặt ứng dụng nào hợp lệ để xử lý URL xác thực, quá trình điều hướng sẽ tiếp tục trên <ph name="WEBVIEW_PRODUCT_NAME" />. + + Mẫu URL xác thực phải được định dạng theo https://www.chromium.org/administrators/url-blocklist-filter-format. + </translation> <translation id="4260027436474745627">Nếu bạn đặt chính sách này, thì mỗi nguồn gốc có tên trong một danh sách phân tách bằng dấu phẩy sẽ chạy theo một quy trình riêng. Mỗi quy trình của nguồn gốc có tên sẽ chỉ được phép chứa các tài liệu và miền con của nguồn gốc đó. Ví dụ: việc chỉ định https://a1.example.com/ cho phép https://a2.a1.example.com/ nằm trong cùng một quy trình, nhưng không cho phép https://example.com hoặc https://b.example.com. Kể từ <ph name="PRODUCT_NAME" /> 77, bạn cũng có thể chỉ định một loạt nguồn gốc để tách biệt bằng cách dùng ký tự đại diện. Ví dụ: việc chỉ định https://[*.]corp.example.com sẽ cung cấp quy trình riêng cho mọi nguồn gốc bên dưới https://corp.example.com, bao gồm chính https://corp.example.com, https://a1.corp.example.com và https://a2.a1.corp.example.com. @@ -3253,10 +3276,12 @@ <translation id="441686537793821907">Chặn việc cài đặt các tiện ích bên ngoài</translation> <translation id="4423597592074154136">Chỉ định cài đặt proxy theo cách thủ công</translation> <translation id="4424004842303301809">Tắt tùy chọn báo cáo về các sự kiện ngăn rò rỉ dữ liệu</translation> +<translation id="4426601693403743089">Tắt thử nghiệm nội bộ Screencast đối với người dùng Family Link</translation> <translation id="4427173305799125784">Trình xem PDF không thể chú thích trong tệp PDF</translation> <translation id="4432762137771104529">Bật Báo cáo mở rộng trong Duyệt web an toàn</translation> <translation id="443454694385851356">Cũ (không an toàn)</translation> <translation id="443665821428652897">Xóa dữ liệu trang web khi đóng trình duyệt (không dùng nữa)</translation> +<translation id="4436941175475497595">Tắt chế độ xem trước bản in</translation> <translation id="4439336120285389675">Chỉ định danh sách các tính năng trên nền tảng web không dùng nữa để bật lại tạm thời. Chính sách này cung cấp cho quản trị viên khả năng bật lại các tính năng trên nền tảng web không dùng nữa trong thời gian giới hạn. Các tính năng do thẻ chuỗi xác định và các tính năng tương ứng với thẻ được bao gồm trong danh sách do chính sách này chỉ định sẽ được bật lại. @@ -4305,6 +4330,7 @@ Lưu ý: Hãy phân tách tên của các máy chủ bằng dấu phẩy. Cho phép sử dụng ký tự đại diện <ph name="WILDCARD_VALUE" />.</translation> <translation id="5645779841392247734">Cho phép cookie trên các trang web này</translation> <translation id="5646234199535103501">Chính sách cấu hình dành cho Trình kết nối OnBulkDataEntry của Chrome Enterprise</translation> +<translation id="5648016151508002741">Không cho phép thực hiện hoạt động kiểm tra <ph name="OCSP_CRL_LABEL" /> trực tuyến</translation> <translation id="5649046890958064703">Nếu bạn chọn <ph name="PRINTERS_BLACKLIST" /> cho <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, thì việc đặt <ph name="DEVICE_NATIVE_PRINTERS_BLACKLIST_POLICY_NAME" /> sẽ chỉ định những máy in mà người dùng không thể sử dụng. Tất cả máy in sẽ được cung cấp cho người dùng, ngoại trừ những mã nhận dạng được liệt kê trong chính sách này. Các mã nhận dạng này phải tương ứng với trường <ph name="ID_FIELD" /> hoặc <ph name="GUID_FIELD" /> ở tệp được chỉ định trong <ph name="DEVICE_PRINTERS_POLICY_NAME" />. Chính sách này không còn dùng nữa, vui lòng sử dụng <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />.</translation> @@ -4560,6 +4586,7 @@ <translation id="5893303508158298667">Nếu bạn bật <ph name="REMOTE_ACCESS_HOST_FIREWALL_TRAVERSAL_POLICY_NAME" /> và không đặt hoặc bật <ph name="REMOTE_ACCESS_HOST_ALLOW_RELAYED_CONNECTION_POLICY_NAME" />, thì hệ thống sẽ cho phép việc sử dụng máy chủ chuyển tiếp thông qua máy khách từ xa để kết nối với máy này khi không có đường kết nối trực tiếp (chẳng hạn như do bị tường lửa hạn chế). Nếu bạn tắt chính sách này thì hệ thống sẽ không tắt quyền truy cập từ xa, nhưng chỉ cho phép các kết nối từ cùng một mạng (chứ không phải mạng truyền tải NAT hoặc mạng chuyển tiếp).</translation> +<translation id="5897234314586602143">Hiển thị đầu trang và chân trang ở chế độ xem trước bản in</translation> <translation id="5897913798715600338">Sạc pin bằng công nghệ sạc nhanh.</translation> <translation id="5898486742390981550">Khi có nhiều người dùng đăng nhập thì chỉ người dùng chính mới có thể sử dụng các ứng dụng Android.</translation> <translation id="5899751601113377553">Ngăn người dùng sử dụng <ph name="LACROS_NAME" /></translation> @@ -4856,6 +4883,7 @@ Mỗi mục danh sách của chính sách là một chuỗi chứa một mã tiện ích và một URL "cập nhật" (không bắt buộc) phân tách bằng dấu chấm phẩy (<ph name="SEMICOLON" />). Mã tiện ích là một chuỗi gồm 32 chữ cái, chẳng hạn như trên <ph name="CHROME_EXTENSIONS_LINK" /> khi ở chế độ nhà phát triển. URL "cập nhật", nếu được chỉ định, phải trỏ tới tài liệu XML của tệp kê khai cập nhật như mô tả tại <ph name="LINK_TO_EXTENSION_DOC1" />. Theo mặc định, URL cập nhật của Cửa hàng Chrome trực tuyến sẽ được sử dụng (hiện là "https://clients2.google.com/service/update2/crx"). Xin lưu ý rằng URL "cập nhật" được đặt trong chính sách này chỉ dùng cho lần cài đặt ban đầu; các lần cập nhật tiện ích tiếp theo sẽ sử dụng URL cập nhật nêu trong tệp kê khai của tiện ích. Ví dụ: <ph name="LOGIN_SCREEN_EXTENSION_POLICY_EXAMPLE" /> cài đặt ứng dụng <ph name="SMART_CARD_CONNECTOR_APP_NAME" /> từ URL "cập nhật" tiêu chuẩn của Cửa hàng Chrome trực tuyến. Để biết thêm thông tin về cách lưu trữ tiện ích, hãy xem: <ph name="LINK_TO_EXTENSION_DOC2" />.</translation> +<translation id="6274202259872570803">Screencast</translation> <translation id="6275497712828649588">Ẩn cảnh báo bảo mật khi cờ hiệu dòng lệnh có thể nguy hiểm được sử dụng</translation> <translation id="6275833043726517413">Sử dụng quy trình triển khai <ph name="CORS" /> cũ thay vì <ph name="CORS" /> mới. @@ -4889,7 +4917,15 @@ Việc đặt <ph name="CHROME_OS_RELEASE_CHANNEL_POLICY_NAME" /> chỉ có hiệu lực nếu bạn đặt <ph name="CHROME_OS_RELEASE_CHANNEL_DELEGATED_POLICY_NAME" /> thành Tắt.</translation> <translation id="6305373713165475629">Việc đặt chính sách này sẽ ghi đè chế độ in màu mặc định. Nếu không có chế độ nêu trên, chính sách này sẽ bị bỏ qua.</translation> +<translation id="6308109234708949641">Chính sách này bật tính năng Screencast cho người dùng Family Link và cấp cho tính năng này quyền tạo và chép lời trên bản ghi màn hình cũng như tải lên Drive. + Chính sách này không ảnh hưởng đến các loại người dùng khác. + Chính sách này không ảnh hưởng đến chính sách <ph name="PROJECTOR_ENABLED_POLICY_NAME" /> cho người dùng doanh nghiệp. + + Nếu bạn bật chính sách này, thử nghiệm nội bộ Screencast sẽ được bật cho người dùng Family Link. + Nếu bạn tắt chính sách này, thử nghiệm nội bộ Screencast sẽ bị tắt đối với người dùng Family Link. + Nếu bạn không thiết lập chính sách này, thì theo mặc định, thử nghiệm nội bộ Screencast sẽ bị tắt đối với người dùng Family Link.</translation> <translation id="6310223829319187614">Bật tự động hoàn tất tên miền trong khi người dùng đăng nhập</translation> +<translation id="6310756730808079944">Bật Screencast</translation> <translation id="631081324835911099">Buộc đăng xuất người dùng khi mã xác thực cho tài khoản chính của người đó không hợp lệ. Chính sách này có thể ngăn người dùng truy cập vào nội dung bị hạn chế trên các thuộc tính web của Google. Nếu bạn đặt chính sách này thành True, thì người dùng sẽ bị đăng xuất ngay khi mã xác thực của người đó không hợp lệ và khi không khôi phục được mã này. @@ -5057,6 +5093,13 @@ <translation id="6478258366184919502">Nguồn gốc thông tin đăng nhập và màn hình</translation> <translation id="6478261301433199402">Việc đặt chính sách này sẽ chỉ định hình ảnh <ph name="PLUGIN_VM_NAME" /> cho một người dùng. Hãy chỉ định chính sách này làm một chuỗi định dạng JSON, trong đó <ph name="URL_PLUGIN_VM_IMAGE_FIELD" /> cho biết vị trí tải xuống hình ảnh đó và chỉ định <ph name="HASH_PLUGIN_VM_IMAGE_FIELD" /> làm một hàm băm SHA-256 dùng để xác minh tính toàn vẹn của tệp tải xuống.</translation> <translation id="6481245670325946423">Cho phép sử dụng Chế độ không có giao diện người dùng</translation> +<translation id="648158446793103284">Nếu bạn thiết lập chính sách này, thì người dùng có thể chọn một trong nhiều phương thức nhập cho phiên <ph name="PRODUCT_OS_NAME" /> mà bạn chỉ định. + + Nếu bạn thiết lập chính sách này thành một danh sách trống hoặc không thiết lập chính sách này, thì người dùng có thể chọn tất cả phương thức nhập được hỗ trợ. + + Kể từ phiên bản M106, các phương thức nhập được cho phép sẽ tự động bật trong phiên kiosk. + + Lưu ý: Nếu phương thức nhập hiện tại không được hỗ trợ, thì hệ thống sẽ sử dụng bố cục bàn phím phần cứng (nếu được phép) hoặc mục hợp lệ đầu tiên trong danh sách này. Hệ thống sẽ bỏ qua phương thức không hợp lệ hoặc không được hỗ trợ.</translation> <translation id="6489084406497912050">Kiểm soát việc người dùng có thể thêm tài khoản Kerberos hay không. Nếu bạn bật hoặc không đặt chính sách này, thì người dùng có thể thêm tài khoản Kerberos thông qua phần Cài đặt tài khoản Kerberos trên trang Cài đặt tài khoản Kerberos. Người dùng có toàn quyền kiểm soát các tài khoản mà họ thêm, cũng như có thể sửa đổi hoặc xóa các tài khoản này. @@ -5264,6 +5307,12 @@ Nếu đặt thành sai hoặc không định cấu hình, tính năng tạo và đăng nhập tài khoản người dùng bị giám sát sẽ bị tắt. Tất cả tài khoản người dùng bị giám sát hiện có sẽ bị ẩn. LƯU Ý: Chế độ mặc định đối với các thiết bị dành cho người tiêu dùng và doanh nghiệp khác nhau: trên thiết bị dành cho người tiêu dùng, tài khoản người dùng bị giám sát được bật theo mặc định nhưng trên thiết bị dành cho doanh nghiệp, các tài khoản này được tắt theo mặc định.</translation> +<translation id="6648746349186337075">Chính sách này cấp cho Screencast quyền tạo và chép lời trên bản ghi màn hình rồi tải lên Drive cho người dùng doanh nghiệp. + Chính sách này không ảnh hưởng đến người dùng Family Link. + Chính sách này không ảnh hưởng đến chính sách <ph name="PROJECTOR_DOGFOOD_FOR_FAMILY_LINK_ENABLED_POLICY_NAME" /> cho người dùng Family Link. + + Nếu bạn bật hoặc không thiết lập chính sách này, Screencast sẽ bật. + Nếu bạn tắt chính sách này, Screencast sẽ tắt.</translation> <translation id="665023848306499203">Cho phép các thiết bị chọn một phiên bản cụ thể để cập nhật</translation> <translation id="6652197835259177259">Cài đặt người dùng được quản lý cục bộ</translation> <translation id="6653897159826215341">Nếu bạn đặt chính sách này thành Bật, <ph name="PRODUCT_NAME" /> sẽ mở hộp thoại in hệ thống thay vì chế độ xem trước bản in tích hợp khi người dùng yêu cầu in. @@ -5279,6 +5328,7 @@ Nếu bạn đặt chính sách này thành False, thì thanh địa chỉ sẽ hiển thị URL mặc định. Nếu bạn không đặt chính sách này, thì thanh địa chỉ sẽ hiển thị URL mặc định. Đồng thời, người dùng sẽ có thể chuyển đổi giữa chế độ hiển thị URL mặc định và đầy đủ bằng tùy chọn trình đơn ngữ cảnh. </translation> +<translation id="6670794785040100077">Không cho phép gửi tài liệu tới <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="6672070613706645316">Cho phép người dùng tùy chỉnh nền trên trang Thẻ mới</translation> <translation id="6672630473862787247">Bật quy trình xác thực môi trường xung quanh trong các phiên khách, phiên thông thường và phiên ẩn danh.</translation> <translation id="6685903773201985073">Bật quy trình xác thực môi trường xung quanh trong các phiên khách và phiên thông thường.</translation> @@ -5366,6 +5416,7 @@ Nếu bạn không đặt <ph name="DEFAULT_SEARCH_PROVIDER_SEARCH_URL_POST_PARAMS_POLICY_NAME" />, thì yêu cầu tìm kiếm sẽ được gửi bằng phương thức GET.</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="6763023079133439068">Cho phép các chứng chỉ thiếu tiện ích subjectAlternativeName nếu chứng chỉ là do các neo tin cậy cục bộ phát hành</translation> <translation id="6766216162565713893">Cho phép trang web yêu cầu người dùng cấp quyền truy cập vào thiết bị Bluetooth lân cận</translation> <translation id="6770454900105963262">Báo cáo thông tin về các phiên kiosk hiện hoạt</translation> <translation id="6782977971207381602">Nếu bạn đặt chính sách này thành Bật, thiết bị sẽ chạy máy ảo trên <ph name="PRODUCT_OS_NAME" />. Bạn phải bật <ph name="VIRTUAL_MACHINES_ALLOWED_POLICY_NAME" /> và <ph name="CROSTINI_ALLOWED_POLICY_NAME" /> thì mới có thể sử dụng <ph name="PRODUCT_CROSTINI_NAME" />. Nếu bạn đặt chính sách này thành Tắt, thiết bị sẽ không thể chạy máy ảo. Khi bạn đổi chính sách này thành Tắt, chính sách sẽ được áp dụng cho các máy ảo mới đang khởi động, chứ không phải các máy đã chạy. @@ -5990,6 +6041,7 @@ <translation id="7458437477941640506">Không thể khôi phục về phiên bản đích nếu phiên bản hệ điều hành mới hơn phiên bản đích. Các bản cập nhật cũng sẽ bị tắt.</translation> <translation id="7459601923199346224">Kiểm soát các chính sách quản lý chứng chỉ cho thiết bị và người dùng.</translation> <translation id="7459633275230216698">Cho phép hộp thoại chọn tệp</translation> +<translation id="7464058117970792805">Bật chế độ xem trước bản in</translation> <translation id="7464991223784276288">Hạn chế cookie so khớp các URL với phiên hiện tại</translation> <translation id="7468182772656807573">Việc đặt chính sách này sẽ xác định tần suất gửi thông tin theo dõi gói mạng, tính bằng mili giây. Khoảng thời gian là từ 30 giây đến 24 giờ. Các giá trị không nằm trong khoảng này sẽ được xếp vào khoảng này. @@ -6169,6 +6221,7 @@ Nếu bạn bật hoặc không đặt chính sách này, thì hệ thống sẽ bật tính năng chuyển đổi đơn vị của Thông tin nhanh. Nếu bạn tắt chính sách, thì hệ thống sẽ tắt tính năng chuyển đổi đơn vị của Thông tin nhanh.</translation> <translation id="7587345076013230465">Nhắc người dùng chọn chứng chỉ máy khách mỗi khi chính sách tự động chọn khớp với nhiều chứng chỉ trên màn hình đăng nhập</translation> +<translation id="7587921466180902617">Bật thử nghiệm nội bộ Screencast cho người dùng Family Link</translation> <translation id="759957074386651883">Cài đặt Duyệt web an toàn</translation> <translation id="7604169113182304895">Các ứng dụng Android có thể chọn sử dụng danh sách này một cách tự nguyện. Bạn không thể buộc các ứng dụng đó sử dụng danh sách.</translation> <translation id="7612157962821894603">Cờ trên toàn hệ thống được áp dụng khi khởi động <ph name="PRODUCT_NAME" /></translation> @@ -6367,6 +6420,7 @@ <translation id="7823902813460802031">Khi bạn đặt chính sách này thành Bật, <ph name="PRODUCT_OS_NAME" /> sẽ ngăn thiết bị chuyển sang Chế độ nhà phát triển. Khi bạn đặt thành Tắt hoặc không đặt chính sách này, thiết bị có thể chuyển sang Chế độ nhà phát triển.</translation> +<translation id="7824000841504721945">Tắt nhóm chính sách không thể phân chia</translation> <translation id="782661371433719637">Không cho phép trang web nào yêu cầu quyền đọc các tệp và thư mục qua API Hệ thống tệp</translation> <translation id="7827127381981620448">Ứng dụng nền tảng</translation> <translation id="7833148823006528332">Mã ứng dụng Android, chẳng hạn như "com.google.android.gm" cho Gmail</translation> @@ -6417,6 +6471,7 @@ Gợi ý: Khóa màn hình khi ở chế độ rảnh bằng cách bật tính năng khóa màn hình khi hệ thống tạm ngưng hoạt động và đặt <ph name="PRODUCT_OS_NAME" /> ở chế độ tạm ngưng hoạt động sau thời gian trì hoãn khi ở chế độ rảnh. Chỉ sử dụng chính sách này khi bạn muốn khóa màn hình sớm hơn đáng kể so với thời gian tạm ngưng hoạt động hoặc khi bạn không muốn tạm ngưng hoạt động ở chế độ rảnh.</translation> <translation id="7895553628261067384">Truy cập từ xa</translation> +<translation id="7900469325540540107">Lưu giữ dữ liệu duyệt web khi tạo hồ sơ doanh nghiệp theo mặc định</translation> <translation id="7902040092815978832">Hiện bàn phím số để nhập mật khẩu</translation> <translation id="7904177352786629708">Nếu bạn đặt chính sách này thành Bật, hệ thống sẽ bỏ qua quá trình tra cứu CNAME. Khi đó, tên máy chủ bạn đã nhập khi tạo SPN Kerberos sẽ được sử dụng. @@ -6451,6 +6506,7 @@ <translation id="793473937901685727">Đặt mức độ khả dụng của chứng chỉ cho ứng dụng ARC</translation> <translation id="7936302526928951356">Chuỗi User-Agent sẽ không làm phiên bản lớn dừng lại.</translation> <translation id="7937766917976512374">Cho phép hoặc từ chối quay video</translation> +<translation id="7941528208359969119">Cho phép thực hiện hoạt động kiểm tra <ph name="OCSP_CRL_LABEL" /> trực tuyến</translation> <translation id="7941975817681987555">Không dự đoán tác vụ mạng trên kết nối mạng bất kỳ</translation> <translation id="7946350455013548764">Khi bạn đặt chính sách này thành 3, các trang web có thể yêu cầu quyền truy cập vào thiết bị HID. Khi bạn đặt chính sách này thành 2, các trang web sẽ không truy cập được vào các thiết bị HID. @@ -6584,10 +6640,6 @@ <translation id="8099880303030573137">Độ trễ khi không sử dụng khi chạy trên nguồn pin</translation> <translation id="8101381354936029836">Nhóm chính sách không thể phân chia:</translation> <translation id="8102913158860568230">Cài đặt luồng truyền thông mặc định</translation> -<translation id="8103563905615378194">Chỉ định việc có chấp nhận mô hình sạc thích ứng hay không để giữ quá trình sạc nhằm kéo dài thời lượng pin. - - Khi thiết bị đang cắm vào nguồn điện, mô hình sạc thích ứng sẽ đánh giá liệu có cần giữ quá trình sạc để kéo dài thời lượng pin hay không. Nếu chế độ sạc thích ứng giữ quá trình sạc, thì pin sẽ được duy trì ở một mức cụ thể (ví dụ: 80%) rồi sạc thiết bị lên 100% khi người dùng cần đến. - Nếu chính sách này được đặt thành Đúng hoặc không đặt, thì mô hình sạc thích ứng sẽ được bật và cho phép giữ quá trình sạc để kéo dài thời lượng pin. Nếu chính sách này được đặt thành Tắt, mô hình sạc thích ứng sẽ không tác động đến quá trình sạc.</translation> <translation id="8104962233214241919">Tự động chọn chứng chỉ ứng dụng khách cho các trang web này</translation> <translation id="8114382167597081590">Không buộc sử dụng Chế độ hạn chế trên YouTube</translation> <translation id="8117921351531866504">Giúp bạn thiết lập để cho phép hoặc không cho phép các trang web kiểm tra xem người dùng đã lưu phương thức thanh toán hay chưa. @@ -6842,6 +6894,7 @@ Nếu bạn không đặt <ph name="DEFAULT_SEARCH_PROVIDER_IMAGE_URL_POST_PARMS_POLICY_NAME" />, thì yêu cầu tìm kiếm hình ảnh sẽ được gửi bằng phương thức GET.</translation> <translation id="8314214821702356835">Cho phép người dùng phát nội dung đa phương tiện khi thiết bị đang khóa</translation> +<translation id="8316940611391250886">Không cho phép các chứng chỉ thiếu tiện ích subjectAlternativeName</translation> <translation id="8319678975002906774">Đặt giá trị của cấu hình được quản lý cho các trang web tương ứng với các nguồn gốc cụ thể</translation> <translation id="8320149248919453401">Chế độ sạc pin</translation> <translation id="8327651196906278510">Cho phép chụp Thẻ theo các nguồn gốc này</translation> @@ -7418,10 +7471,6 @@ <translation id="8951350807133946005">Thiết lập thư mục bộ nhớ đệm trên đĩa</translation> <translation id="8955719471735800169">Quay lại đầu trang</translation> <translation id="8956312248048980644">Cho phép phân nhóm tác nhân theo khoá nguồn gốc theo mặc định.</translation> -<translation id="8967125680876068695">Ứng dụng Chrome không được dùng nữa trên Windows, Mac và Linux. - Nếu bạn bật chính sách này, thì <ph name="PRODUCT_NAME" /> sẽ tiếp tục cho phép Ứng dụng Chrome chạy trên các nền tảng này cho đến ngày cuối cùng, là thời điểm mà Ứng dụng Chrome không còn được hỗ trợ trên tất cả nền tảng vào tháng 6 năm 2022. - Nếu bạn tắt hoặc không đặt chính sách này, thì Ứng dụng Chrome có thể không được phép chạy, tùy thuộc vào trạng thái của việc ngừng phát hành. - Trong cả hai trường hợp, các Ứng dụng Chrome bị buộc cài đặt theo chính sách vẫn sẽ tiếp tục chạy.</translation> <translation id="8970205333161758602">Loại bỏ lời nhắc từ chối <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8976248126101463034">Cho phép xác thực gnubby cho máy chủ truy cập từ xa</translation> <translation id="8976531594979650914">Sử dụng máy in có sẵn trong hệ thống làm máy in mặc định</translation> @@ -7598,6 +7647,7 @@ <translation id="9135033364005346124">Bật proxy <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="9136212796239682721">Tắt giao diện người dùng bong bóng tải xuống</translation> <translation id="9136399279941091445">Khoảng thời gian tắt khi chính sách thiết bị đã chỉ định được phát hành</translation> +<translation id="9148720248753722892">Không cho phép các chứng chỉ có chữ ký SHA-1</translation> <translation id="9150416707757015439">Chính sách này không được chấp thuận. Vui lòng sử dụng IncognitoModeAvailability. Bật chế độ Ẩn danh trong <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb index dfaed39..e4675c11 100644 --- a/components/policy/resources/policy_templates_zh-CN.xtb +++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -1279,7 +1279,6 @@ 如需详细了解有效的<ph name="URL_LABEL" />格式,请访问 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。<ph name="WILDCARD_VALUE" /> 不是此政策可接受的值。</translation> <translation id="2299220924812062390">指定已启用插件的列表</translation> -<translation id="2301048990069984110">扩展对 Chrome 应用的支持以涵盖 Windows、Mac 和 Linux。</translation> <translation id="2303795211377219696">允许使用“自动填充”功能填写信用卡信息</translation> <translation id="2304009805995145854">从 <ph name="PRODUCT_NAME" /> 67 版起,系统已默认在所有桌面平台上启用网站隔离功能,因此每个网站都会在自己的进程中运行。网站的网址格式为架构加上 eTLD+1(例如,https://example.com)。如果此政策已启用,系统并不会更改相应行为,只会禁止用户选择停用此功能(例如,通过使用 chrome://flags 中的“停用网站隔离”)。从 <ph name="PRODUCT_NAME" /> 76 版起,如果此政策已停用或未设置,系统将不会关闭网站隔离功能,但会允许用户选择停用此功能。 @@ -6496,10 +6495,6 @@ <translation id="8099880303030573137">使用电池供电时的闲置延迟时间</translation> <translation id="8101381354936029836">政策原子组:</translation> <translation id="8102913158860568230">默认 mediastream 设置</translation> -<translation id="8103563905615378194">指定是否允许启用“自适应充电”模式以暂缓充电进程,进而延长电池寿命。 - - 当设备已连接到交流电源时,“自适应充电”模式会评估是否应暂缓充电进程以延长电池寿命。如果“自适应充电”模式暂缓充电进程,电池电量将会保持在某个水平(例如 80%),并会在用户需要时充到 100%。 - 如果此政策设为 True 或未设置,“自适应充电”模式将会启用,并会暂缓充电进程以延长电池寿命。如果此政策设为 False,“自适应充电”模式将不会影响充电进程。</translation> <translation id="8104962233214241919">自动选择这些网站的客户端证书</translation> <translation id="8114382167597081590">不强制启用 YouTube 受限模式</translation> <translation id="8117921351531866504">该政策让您能够设置是否允许网站检查用户有无已保存的付款方式。 @@ -7309,10 +7304,6 @@ <translation id="8951350807133946005">设置磁盘缓存目录</translation> <translation id="8955719471735800169">返回页首</translation> <translation id="8956312248048980644">默认允许使用以源为键的代理集群。</translation> -<translation id="8967125680876068695">在 Windows、Mac 和 Linux 上,Chrome 应用已被弃用。 - 如果此政策已启用,<ph name="PRODUCT_NAME" /> 会允许 Chrome 应用在这些平台上继续运行,直到从所有平台上移除对 Chrome 应用的支持的截止日期(2022 年 6 月)来临为止。 - 如果此政策已停用或未设置,Chrome 应用可能会无法运行,具体取决于弃用安排的状态。 - 无论在哪种情况下,系统都允许由政策强制安装的 Chrome 应用继续运行。</translation> <translation id="8970205333161758602">阻止显示 <ph name="PRODUCT_FRAME_NAME" />停止支持的提示</translation> <translation id="8976248126101463034">允许针对远程访问主机进行 gnubby 身份验证</translation> <translation id="8976531594979650914">使用系统默认打印机作为默认选项</translation>
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index 2fe1a91..3c08882 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -1284,7 +1284,6 @@ 想進一步瞭解有效的<ph name="URL_LABEL" />模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。<ph name="WILDCARD_VALUE" /> 不是這項政策許可的值。</translation> <translation id="2299220924812062390">指定停用的外掛程式清單</translation> -<translation id="2301048990069984110">延長在 Windows、Mac 和 Linux 上支援 Chrome 應用程式的時間。</translation> <translation id="2303795211377219696">啟用信用卡的自動填入功能</translation> <translation id="2304009805995145854">自 <ph name="PRODUCT_NAME" /> 第 67 版起,系統預設已在所有電腦平台上啟用網站隔離功能,因此每個網站都會以獨立程序執行。網站是指加上 eTLD+1 的配置 (例如 https://example.com)。將這項政策設為 Enabled 並不會改變這項行為,只會禁止使用者停用這項設定 (例如在 chrome://flags 中使用「停用網站隔離」功能)。自 <ph name="PRODUCT_NAME" /> 第 76 版起,如果將這項政策設為 Disabled 或不設定,系統並不會關閉網站隔離功能,只會開放使用者停用這項設定。 @@ -6469,10 +6468,6 @@ <translation id="8099880303030573137">在電池供電環境下執行時的閒置延遲時間</translation> <translation id="8101381354936029836">政策不可部分完成的群組:</translation> <translation id="8102913158860568230">預設媒體串流設定</translation> -<translation id="8103563905615378194">指定是否允許自動調節充電模式調整充電速度,進而延長電池壽命。 - - 裝置連接 AC 電源時,自動調節充電模式會評估是否要調整充電速度以延長電池壽命。如果自動調節充電模式調整了充電速度,電池電量會固定維持在 80%,並在使用者需要時充飽至 100%。 - 如果將這項政策設為 True 或不設定,系統會啟用自動調節充電模式,並允許調整充電速度以延長電池壽命。如果將這項政策設為 False,則自動調節充電模式不會調整充電速度。</translation> <translation id="8104962233214241919">自動為這些網站選取用戶端憑證</translation> <translation id="8114382167597081590">不強制執行 YouTube 嚴格篩選模式</translation> <translation id="8117921351531866504">你可以設定網站是否能檢查使用者有沒有已儲存的付款方式。 @@ -7277,10 +7272,6 @@ <translation id="8951350807133946005">設定磁碟快取目錄</translation> <translation id="8955719471735800169">返回頁首</translation> <translation id="8956312248048980644">在預設情況下,允許使用 origin-keyed 代理程式叢集。</translation> -<translation id="8967125680876068695">Chrome 應用程式已在 Windows、Mac 和 Linux 上遭到淘汰。 - 如果啟用這項政策,<ph name="PRODUCT_NAME" /> 會繼續允許 Chrome 應用程式在這些平台上執行,直到 2022 年 6 月對所有平台停止支援 Chrome 應用程式為止。 - 如果停用或不設定這項政策,系統可能會不允許執行 Chrome 應用程式,具體做法取決於淘汰實施狀態。 - 不過,無論是上述哪種情況,系統都將繼續允許透過政策強制安裝的 Chrome 應用程式。</translation> <translation id="8970205333161758602">隱藏停止支援 <ph name="PRODUCT_FRAME_NAME" />的提示</translation> <translation id="8976248126101463034">允許針對遠端存取主機進行 gnubby 驗證機制</translation> <translation id="8976531594979650914">使用系統預設印表機做為預設值</translation>
diff --git a/components/reporting/client/report_queue_provider_unittest.cc b/components/reporting/client/report_queue_provider_unittest.cc index 1300e647..5ce03fdb 100644 --- a/components/reporting/client/report_queue_provider_unittest.cc +++ b/components/reporting/client/report_queue_provider_unittest.cc
@@ -33,26 +33,33 @@ class ReportQueueProviderTest : public ::testing::Test { protected: + void SetUp() override { + provider_ = std::make_unique<NiceMock<MockReportQueueProvider>>(); + report_queue_provider_test_helper::SetForTesting(provider_.get()); + } + + void TearDown() override { + task_environment_.RunUntilIdle(); // Drain remaining scheduled tasks. + report_queue_provider_test_helper::SetForTesting(nullptr); + } + base::test::TaskEnvironment task_environment_{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; + std::unique_ptr<MockReportQueueProvider> provider_; const Destination destination_ = Destination::UPLOAD_EVENTS; ReportQueueConfiguration::PolicyCheckCallback policy_checker_callback_ = base::BindRepeating([]() { return Status::StatusOK(); }); }; TEST_F(ReportQueueProviderTest, CreateAndGetQueue) { - std::unique_ptr<MockReportQueueProvider> provider = - std::make_unique<NiceMock<MockReportQueueProvider>>(); - report_queue_provider_test_helper::SetForTesting(provider.get()); - static constexpr char kTestMessage[] = "TEST MESSAGE"; // Create configuration. auto config_result = ReportQueueConfiguration::Create( EventType::kDevice, destination_, policy_checker_callback_); ASSERT_OK(config_result); - EXPECT_CALL(*provider.get(), OnInitCompletedMock()).Times(1); - provider->ExpectCreateNewQueueAndReturnNewMockQueue(1); + EXPECT_CALL(*provider_.get(), OnInitCompletedMock()).Times(1); + provider_->ExpectCreateNewQueueAndReturnNewMockQueue(1); // Use it to asynchronously create ReportingQueue and then asynchronously // send the message. test::TestEvent<Status> e; @@ -90,7 +97,6 @@ kTestMessage, e.cb(), std::move(config_result.ValueOrDie()))); const auto res = e.result(); EXPECT_OK(res) << res; - report_queue_provider_test_helper::SetForTesting(nullptr); } TEST_F(ReportQueueProviderTest,
diff --git a/components/search_engines/template_url_service.cc b/components/search_engines/template_url_service.cc index 33bae58..2acb1bb 100644 --- a/components/search_engines/template_url_service.cc +++ b/components/search_engines/template_url_service.cc
@@ -744,7 +744,8 @@ DefaultSearchManager::FROM_FALLBACK) && (url != GetDefaultSearchProvider()) && url->url_ref().SupportsReplacement(search_terms_data()) && - (url->type() == TemplateURL::NORMAL); + (url->type() == TemplateURL::NORMAL) && + (url->starter_pack_id() != TemplateURLStarterPackData::kTabs); } void TemplateURLService::SetUserSelectedDefaultSearchProvider(
diff --git a/components/segmentation_platform/embedder/input_delegate/price_tracking_input_delegate_unittest.cc b/components/segmentation_platform/embedder/input_delegate/price_tracking_input_delegate_unittest.cc index a0c33de..a409a8ec 100644 --- a/components/segmentation_platform/embedder/input_delegate/price_tracking_input_delegate_unittest.cc +++ b/components/segmentation_platform/embedder/input_delegate/price_tracking_input_delegate_unittest.cc
@@ -8,9 +8,9 @@ #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "components/commerce/core/commerce_feature_list.h" +#include "components/commerce/core/mock_shopping_service.h" #include "components/commerce/core/shopping_service.h" #include "components/commerce/core/shopping_service_test_base.h" -#include "components/optimization_guide/proto/hints.pb.h" #include "components/segmentation_platform/internal/execution/processing/feature_processor_state.h" #include "components/segmentation_platform/public/input_context.h" #include "services/network/public/cpp/shared_url_loader_factory.h" @@ -20,11 +20,6 @@ namespace { -using optimization_guide::OptimizationGuideDecision; -using optimization_guide::OptimizationGuideDecisionCallback; -using optimization_guide::OptimizationMetadata; -using optimization_guide::proto::OptimizationType; - commerce::ShoppingService* TestShoppingServiceGetter( commerce::ShoppingService* service) { return service; @@ -42,10 +37,7 @@ void SetUp() override { Test::SetUp(); - // TODO(crbug.com/1346711): Provide mock ShoppingService to avoid passing - // all arguments. - shopping_service_ = std::make_unique<commerce::ShoppingService>( - nullptr, &mock_opt_guide_, nullptr, nullptr, nullptr); + shopping_service_ = std::make_unique<commerce::MockShoppingService>(); input_delegate_ = std::make_unique<PriceTrackingInputDelegate>( base::BindRepeating(&TestShoppingServiceGetter, base::Unretained(shopping_service_.get()))); @@ -73,8 +65,7 @@ base::test::ScopedFeatureList scoped_feature_list_; base::test::TaskEnvironment task_environment_; - commerce::MockOptGuideDecider mock_opt_guide_; - std::unique_ptr<commerce::ShoppingService> shopping_service_; + std::unique_ptr<commerce::MockShoppingService> shopping_service_; std::unique_ptr<PriceTrackingInputDelegate> input_delegate_; std::unique_ptr<FeatureProcessorState> feature_processor_state_; }; @@ -113,6 +104,8 @@ std::make_pair("url", std::move(url_value))); feature_processor_state_->set_input_context_for_testing(input_context); + shopping_service_->SetResponseForGetProductInfoForUrl(absl::nullopt); + ExpectProcessResult(input_proto, /*expected_error=*/false, {ProcessedValue(0.0f)}); } @@ -130,10 +123,8 @@ std::make_pair("url", std::move(url_value))); feature_processor_state_->set_input_context_for_testing(input_context); - OptimizationMetadata meta = - mock_opt_guide_.BuildPriceTrackingResponse("", "", 10, 20, ""); - mock_opt_guide_.SetResponse(kTestUrl, OptimizationType::PRICE_TRACKING, - OptimizationGuideDecision::kTrue, meta); + shopping_service_->SetResponseForGetProductInfoForUrl( + commerce::ProductInfo()); ExpectProcessResult(input_proto, /*expected_error=*/false, {ProcessedValue(1.0f)});
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb index fe6404e..2c446637 100644 --- a/components/strings/components_strings_ar.xtb +++ b/components/strings/components_strings_ar.xtb
@@ -1684,6 +1684,7 @@ <translation id="5518670652865028077">فنون وترفيه</translation> <translation id="5519516356611866228">مع التغييرات التي أجريتها</translation> <translation id="5523118979700054094">اسم السياسة</translation> +<translation id="5525755241743357906">تعمل هذه الميزة على نسخ الملف أو نقله.</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />، اضغط على المفتاح Tab ثم المفتاح Enter لتخصيص أدوات تسهيل الاستخدام في إعدادات نظام التشغيل Chrome.</translation> <translation id="5528532273234423708">التشغيل الآلي للأجهزة المنزلية</translation> <translation id="55293785478302737">خزم الحواف</translation> @@ -2939,6 +2940,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />، اضغط على مفتاح Tab ثم مفتاح Enter لضبط Chrome كمتصفِّح تلقائي للنظام في إعدادات iOS</translation> <translation id="9096679202588811390">عروض وبرامج تلفزيونية</translation> <translation id="9101630580131696064">الدُرج 1</translation> +<translation id="9102081333385212048">إنّ الملفات التي تنسخها أو تنقلها يتم إرسالها إلى Google Cloud أو جهات خارجية لتحليلها. على سبيل المثال، من المُحتمل أن يتم فحص هذه الملفات بحثًا عن بيانات حسّاسة أو برامج ضارة.</translation> <translation id="9103537084693478942">برامج للفيديوهات</translation> <translation id="9103872766612412690">يستخدم <ph name="SITE" /> التشفير عادة لحماية معلوماتك. عندما حاول Chromium الاتصال بموقع <ph name="SITE" /> هذه المرة، أرجَع الموقع الإلكتروني بيانات اعتماد غير عادية وغير صحيحة. وقد يحدث هذا عندما يحاول أحد المهاجمين التظاهر بأنه موقع <ph name="SITE" />، أو إذا قاطعت شاشة تسجيل دخول Wi-Fi الاتصال. ولكن لا تزال معلوماتك آمنة نظرًا لأن Chromium أوقَفَ الاتصال قبل تبادل أي بيانات.</translation> <translation id="9106062320799175032">إضافة عنوان إرسال الفواتير</translation>
diff --git a/components/strings/components_strings_as.xtb b/components/strings/components_strings_as.xtb index c5236a8..8487528 100644 --- a/components/strings/components_strings_as.xtb +++ b/components/strings/components_strings_as.xtb
@@ -1068,6 +1068,7 @@ <translation id="3835233591525155343">আপোনাৰ ডিভাইচটোৰ ব্যৱহাৰ</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, এখন নতুন Google Doc ক্ষিপ্ৰভাৱে সৃষ্টি কৰিবলৈ প্ৰথমে টেব আৰু তাৰ পাছত এণ্টাৰ টিপক</translation> <translation id="385051799172605136">উভতি যাওক</translation> +<translation id="3853684360927654006">পাছৱৰ্ডৰ শক্তি জোখা কেলকুলেটৰ</translation> <translation id="3858027520442213535">তাৰিখ আৰু সময় আপডে’ট কৰক</translation> <translation id="3858860766373142691">নাম</translation> <translation id="3872834068356954457">বিজ্ঞান</translation> @@ -1677,6 +1678,7 @@ <translation id="5518670652865028077">কলা আৰু মনোৰঞ্জন</translation> <translation id="5519516356611866228">আপুনি কৰা সালসলনিসমূহৰ সৈতে</translation> <translation id="5523118979700054094">নীতিৰ নাম</translation> +<translation id="5525755241743357906">ফাইলটো প্ৰতিলিপি কৰা অথবা স্থানান্তৰ কৰা হৈছে</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />, ChromeOSৰ ছেটিঙত আপোনাৰ সাধ্য সুবিধাৰ সঁজুলি ব্যক্তিগতকৰণ কৰিবলৈ টেব টিপক আৰু তাৰ পাছত এণ্টাৰ টিপক</translation> <translation id="5528532273234423708">হ’ম অট’মেশ্বন</translation> <translation id="55293785478302737">কাষত চিলাওক</translation> @@ -2928,6 +2930,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />, iOS ছেটিঙত Chromeক ছিষ্টেমৰ ডিফ’ল্ট ব্ৰাউজাৰ হিচাপে ছেট কৰিবলৈ প্ৰথমে টেব আৰু তাৰ পাছত এণ্টাৰ টিপক</translation> <translation id="9096679202588811390">টিভি শ্ব’ আৰু প্ৰ’গ্ৰাম</translation> <translation id="9101630580131696064">ট্ৰে’ ১</translation> +<translation id="9102081333385212048">আপুনি প্ৰতিলিপি কৰা অথবা স্থানান্তৰ কৰা ফাইলসমূহ বিশ্লেষণৰ বাবে Google Cloud অথবা তৃতীয় পক্ষলৈ পঠিওৱা হয়। উদাহৰণস্বৰূপে, সেইসমূহ সংবেদনশীল ডেটা অথবা মালৱেৰৰ বাবে স্কেন কৰা হ’ব পাৰে।</translation> <translation id="9103537084693478942">ভিডিঅ’ ছফ্টৱেৰ</translation> <translation id="9103872766612412690">আপোনাৰ তথ্য সুৰক্ষিত কৰিবলৈ <ph name="SITE" />এ সচৰাচৰতে এনক্ৰিপশ্বন ব্যৱহাৰ কৰে৷ Chromiumএ <ph name="SITE" />ৰ সৈতে সংযোগ কৰিবলৈ চেষ্টা কৰোঁতে ৱেবছাইটটোৱে সচৰাচৰতে ব্যৱহাৰ নোহোৱা আৰু অশুদ্ধ ক্ৰেডেনশ্বিয়েল পঠিয়াইছে৷ কোনো আক্ৰমণকাৰীয়ে <ph name="SITE" />ৰ ভেশ ধৰিলে বা কোনো ৱাই-ফাই ছাইন ইন স্ক্ৰীণে সংযোগত বাধা প্ৰদান কৰিলে এনে হ’ব পাৰে৷ আপোনাৰ ডেটা এতিয়াও সুৰক্ষিত হৈ আছে কিয়নো Chromiumএ কোনো ডেটা আদান-প্ৰদান হোৱাৰ পূৰ্বেই সংযোগ বন্ধ কৰিছে৷</translation> <translation id="9106062320799175032">বিলিঙৰ ঠিকনা যোগ কৰক</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb index 5c09d62..6e3df30 100644 --- a/components/strings/components_strings_bg.xtb +++ b/components/strings/components_strings_bg.xtb
@@ -1681,6 +1681,7 @@ <translation id="5518670652865028077">Изкуство и развлечения</translation> <translation id="5519516356611866228">С промените ви</translation> <translation id="5523118979700054094">Име на правилото</translation> +<translation id="5525755241743357906">Файлът е копиран или преместен</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />. Натиснете Tab и след това Enter, за да персонализирате инструментите за достъпност в настройките на Chrome OS</translation> <translation id="5528532273234423708">Автоматизиране на дома</translation> <translation id="55293785478302737">Зашиване на ръба</translation> @@ -2933,6 +2934,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />, натиснете Tab и след това Enter за задаване на Chrome като браузъра по подразбиране за системата в настройките на iOS</translation> <translation id="9096679202588811390">Телевизионни предавания и програми</translation> <translation id="9101630580131696064">Тава 1</translation> +<translation id="9102081333385212048">Файловете, които копирате или местите, се изпращат до Google Cloud или до трети страни за анализ. Възможно е например да бъдат сканирани за чувствителни данни или злонамерен софтуер.</translation> <translation id="9103537084693478942">Видеософтуер</translation> <translation id="9103872766612412690">Обикновено <ph name="SITE" /> използва шифроване за защита на информацията ви. Когато Chromium опита да установи връзка с/ъс <ph name="SITE" /> този път, уебсайтът върна необичайни и неправилни идентификационни данни. Това може да се случи, когато извършител на атака пробва да се представи за <ph name="SITE" /> или връзката е прекъсната от екран за вход в Wi-Fi. Информацията ви продължава да е защитена, тъй като Chromium спря връзката, преди да бъдат обменени данни.</translation> <translation id="9106062320799175032">Добавяне на адрес за фактуриране</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb index 220ddd2e..5c3c0372 100644 --- a/components/strings/components_strings_bn.xtb +++ b/components/strings/components_strings_bn.xtb
@@ -1683,6 +1683,7 @@ <translation id="5518670652865028077">আর্ট এবং বিনোদন</translation> <translation id="5519516356611866228">আপনার করা এডিট সমেত</translation> <translation id="5523118979700054094">নীতি নাম</translation> +<translation id="5525755241743357906">ফাইল কপি করা বা সরিয়ে দেওয়া হয়েছে</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />, ChromeOS সেটিংস থেকে আপনার অ্যাক্সেসিবিলিটি টুল পছন্দ মতো বেছে নিতে 'Tab' কী প্রেস করে 'Enter' কী প্রেস করুন</translation> <translation id="5528532273234423708">হোম অটোমেশন</translation> <translation id="55293785478302737">ধারের দিকে সেলাই</translation> @@ -2934,6 +2935,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />, iOS সেটিংসে Chrome-কে সিস্টেমের ডিফল্ট ব্রাউজার হিসেবে সেট করতে প্রথমে ট্যাব, তারপরে Enter কী প্রেস করুন</translation> <translation id="9096679202588811390">টিভি শো ও প্রোগ্রাম</translation> <translation id="9101630580131696064">ট্রে ১</translation> +<translation id="9102081333385212048">আপনার কপি করা বা সরিয়ে দেওয়া ফাইল Google Cloud-এ বা থার্ড-পার্টির কাছে বিশ্লেষণ করার জন্য পাঠানো হয়েছে। যেমন, কোনও সংবেদনশীল ডেটা বা ম্যালওয়্যার আছে কিনা জানার জন্য ফাইলগুলি হয়ত স্ক্যান করা হতে পারে।</translation> <translation id="9103537084693478942">ভিডিও সফ্টওয়্যার</translation> <translation id="9103872766612412690"><ph name="SITE" /> সাধারণত আপনার তথ্য সুরক্ষিত রাখতে এনক্রিপশন ব্যবহার করে। এবার Chromium, <ph name="SITE" />-এর সাথে কানেক্ট করার চেষ্টা করলে ওয়েবসাইটটি অস্বাভাবিক এবং ভুল ক্রেডেনশিয়াল পাঠিয়ে দেয়। হয় একজন আক্রমণকারী <ph name="SITE" /> হতে চাইছে অথবা একটি ওয়াই-ফাই সাইন-ইন স্ক্রিন কানেকশনকে বাধা দিয়েছে। আপনার তথ্য এখনো নিরাপদ আছে কারণ কোনো ডেটা আদানপ্রদানের আগেই Chromium কানেকশন বন্ধ করে দিয়েছে।</translation> <translation id="9106062320799175032">বিলিংয়ের ঠিকানা যোগ করুন</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index 8291c59..8403d15e 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -1071,6 +1071,7 @@ <translation id="3835233591525155343">L'ús que fas del dispositiu</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />: prem Tab i després Retorn per crear un document de Google ràpidament</translation> <translation id="385051799172605136">Enrere</translation> +<translation id="3853684360927654006">Calculadora del nivell de seguretat de la contrasenya</translation> <translation id="3858027520442213535">Actualitza la data i l'hora</translation> <translation id="3858860766373142691">Nom</translation> <translation id="3872834068356954457">Ciència</translation> @@ -1681,6 +1682,7 @@ <translation id="5518670652865028077">Arts i entreteniment</translation> <translation id="5519516356611866228">Amb els meus canvis</translation> <translation id="5523118979700054094">Nom de la política</translation> +<translation id="5525755241743357906">El fitxer s'ha copiat o mogut</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />: prem Tab i després Retorn per personalitzar les eines d'accessibilitat a la configuració de Chrome OS</translation> <translation id="5528532273234423708">Domòtica</translation> <translation id="55293785478302737">Cosit de la vora</translation> @@ -2933,6 +2935,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />: prem Tab i, a continuació, Retorn per establir Chrome com a navegador predeterminat del sistema a la configuració d'iOS.</translation> <translation id="9096679202588811390">Programes i xous de televisió</translation> <translation id="9101630580131696064">Safata 1</translation> +<translation id="9102081333385212048">Els fitxers que copies o mous s'envien a Google Cloud o a tercers perquè s'analitzin. Per exemple, pot ser que s'analitzin per detectar-hi dades sensibles o programari maliciós.</translation> <translation id="9103537084693478942">Programari de vídeo</translation> <translation id="9103872766612412690"><ph name="SITE" /> utilitza normalment l'encriptació per protegir la vostra informació. En aquesta ocasió, quan Chromium ha provat de connectar-se a <ph name="SITE" />, el lloc web ha enviat credencials poc comunes i incorrectes. Pot ser que un atacant estigui provant de fer-se passar per <ph name="SITE" /> o que una pantalla d'inici de sessió a la xarxa Wi-Fi hagi interromput la connexió. En qualsevol cas, la vostra informació continua estant segura, perquè Chromium ha aturat la connexió abans no s'intercanviés cap dada.</translation> <translation id="9106062320799175032">Afegeix una adreça de facturació</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb index f73a0be6..e072fad 100644 --- a/components/strings/components_strings_cs.xtb +++ b/components/strings/components_strings_cs.xtb
@@ -1067,6 +1067,7 @@ <translation id="3835233591525155343">Využití vašeho zařízení</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, stisknutím klávesy Tab a poté Enter rychle vytvoříte nový Dokument Google</translation> <translation id="385051799172605136">Zpět</translation> +<translation id="3853684360927654006">Kalkulačka síly hesla</translation> <translation id="3858027520442213535">Aktualizovat datum a čas</translation> <translation id="3858860766373142691">Název</translation> <translation id="3872834068356954457">Věda</translation> @@ -1677,6 +1678,7 @@ <translation id="5518670652865028077">Umění a zábava</translation> <translation id="5519516356611866228">S vašimi změnami</translation> <translation id="5523118979700054094">Název zásady</translation> +<translation id="5525755241743357906">Soubor je zkopírován nebo přesunut</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />, stisknutím tabulátoru a poté klávesy Enter si v nastavení ChromeOS můžete přizpůsobit nástroje pro usnadnění přístupu</translation> <translation id="5528532273234423708">Ovládání domácnosti</translation> <translation id="55293785478302737">Sešití na okraji</translation> @@ -2928,6 +2930,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />: stisknutím klávesy Tab a pak Enter nastavíte Chrome jako výchozí prohlížeč v nastavení iOS</translation> <translation id="9096679202588811390">Televizní pořady a programy</translation> <translation id="9101630580131696064">Přihrádka 1</translation> +<translation id="9102081333385212048">Soubory, které zkopírujete nebo přesunete, jsou odesílány k analýze do služby Google Cloud nebo třetím stranám. Mohou například projít kontrolou přítomnosti citlivých údajů nebo malwaru.</translation> <translation id="9103537084693478942">Software pro video</translation> <translation id="9103872766612412690">Web <ph name="SITE" /> vaše informace běžně chrání šifrováním. Když se prohlížeč Chromium k webu <ph name="SITE" /> pokusil připojit tentokrát, web vrátil neobvyklé a nesprávné identifikační údaje. K tomuto problému může dojít, pokud se za web <ph name="SITE" /> pokouší vydávat nějaký útočník nebo pokud bylo připojení přerušeno přihlašovací obrazovkou sítě Wi-Fi. Vaše informace jsou i nadále v bezpečí, protože prohlížeč Chromium připojení přerušil dříve, než došlo k odeslání jakýchkoliv dat.</translation> <translation id="9106062320799175032">Přidání fakturační adresy</translation>
diff --git a/components/strings/components_strings_cy.xtb b/components/strings/components_strings_cy.xtb index 0f7c86f8..b8c9aa9 100644 --- a/components/strings/components_strings_cy.xtb +++ b/components/strings/components_strings_cy.xtb
@@ -1071,6 +1071,7 @@ <translation id="3835233591525155343">Eich defnydd dyfais</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, pwyswch Tab yna Enter i greu Google Doc yn gyflym</translation> <translation id="385051799172605136">Nôl</translation> +<translation id="3853684360927654006">Cyfrifiannell Cryfder Cyfrinair</translation> <translation id="3858027520442213535">Diweddaru'r dyddiad a'r amser</translation> <translation id="3858860766373142691">Enw</translation> <translation id="3872834068356954457">Gwyddoniaeth</translation> @@ -1681,6 +1682,7 @@ <translation id="5518670652865028077">Y celfyddydau ac adloniant</translation> <translation id="5519516356611866228">Gyda'ch newidiadau</translation> <translation id="5523118979700054094">Enw'r polisi</translation> +<translation id="5525755241743357906">Mae'r ffeil yn cael ei chopïo neu ei symud</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />, Pwyswch Tab yna Enter i bersonoleiddio'ch offer hygyrchedd yng ngosodiadau ChromeOS</translation> <translation id="5528532273234423708">Awtomatiaeth cartref</translation> <translation id="55293785478302737">Pwyth ymyl</translation> @@ -2933,6 +2935,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />, Pwyswch Tab yna Enter i osod Chrome fel porwr diofyn y system yng ngosodiadau iOS</translation> <translation id="9096679202588811390">Rhaglenni teledu</translation> <translation id="9101630580131696064">Hambwrdd 1</translation> +<translation id="9102081333385212048">Anfonir ffeiliau rydych yn eu copïo neu eu symud i Google Cloud neu drydydd partïon i'w dadansoddi. Er enghraifft, mae'n bosib y byddant yn cael eu sganio am ddata sensitif neu ddrwgwedd.</translation> <translation id="9103537084693478942">Meddalwedd fideo</translation> <translation id="9103872766612412690">Mae <ph name="SITE" /> fel arfer yn defnyddio amgryptio i amddiffyn eich gwybodaeth. Pan geisiodd Chromium gysylltu â <ph name="SITE" /> y tro hwn, anfonodd y wefan manylion adnabod anarferol ac anghywir yn ôl. Gall hyn ddigwydd pan fydd ymosodwr yn ceisio gweithredu fel <ph name="SITE" />, neu pan fydd sgrîn mewngofnodi Wi-Fi wedi torri ar draws y cysylltiad. Mae eich gwybodaeth yn dal yn ddiogel oherwydd stopiodd Chromium y cysylltiad cyn i unrhyw ddata gael eu cyfnewid.</translation> <translation id="9106062320799175032">Ychwanegu Cyfeiriad Bilio</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index dbd4a300..00508725e 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -1682,6 +1682,7 @@ <translation id="5518670652865028077">Kunst og underholdning</translation> <translation id="5519516356611866228">Med dine ændringer</translation> <translation id="5523118979700054094">Navn på politik</translation> +<translation id="5525755241743357906">Filen kopieres eller flyttes</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" /> – tryk på Tab-tasten efterfulgt af Enter for at tilpasse dine hjælpefunktioner i Chrome OS-indstillingerne</translation> <translation id="5528532273234423708">Hjemmeautomatisering</translation> <translation id="55293785478302737">Kanthæftning</translation> @@ -2935,6 +2936,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />, tryk på Tab-tasten efterfulgt af Enter for at angive Chrome som systemets standardbrowser i iOS-indstillingerne</translation> <translation id="9096679202588811390">Tv-shows og programmer</translation> <translation id="9101630580131696064">Bakke 1</translation> +<translation id="9102081333385212048">Filer, du kopierer eller flytter, sendes til Google Cloud eller tredjeparter, hvor de analyseres. De kan f.eks. blive scannet for følsomme oplysninger eller malware.</translation> <translation id="9103537084693478942">Videosoftware</translation> <translation id="9103872766612412690"><ph name="SITE" /> bruger normalt kryptering til at beskytte dine oplysninger. Da Chromium forsøgte at oprette forbindelse til <ph name="SITE" /> denne gang, returnerede websitet usædvanlige og forkerte loginoplysninger. Dette kan skyldes, at en hacker forsøger at udgive sig for at være <ph name="SITE" />, eller at en Wi-Fi-loginskærm har forstyrret forbindelsen. Dine oplysninger er stadig sikre, idet Chromium afbrød forbindelsen, inden der blev udvekslet data.</translation> <translation id="9106062320799175032">Tilføj faktureringsadresse</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb index ffdf4fcd..c868ec45 100644 --- a/components/strings/components_strings_de.xtb +++ b/components/strings/components_strings_de.xtb
@@ -1679,6 +1679,7 @@ <translation id="5518670652865028077">Kunst und Unterhaltung</translation> <translation id="5519516356611866228">Mit meinen Änderungen</translation> <translation id="5523118979700054094">Richtlinienname</translation> +<translation id="5525755241743357906">Datei wird kopiert oder verschoben</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" /> – drücke die Tabulatortaste und dann die Eingabetaste, um die Bedienungshilfen in den Chrome OS-Einstellungen zu personalisieren</translation> <translation id="5528532273234423708">Heimautomatisierung</translation> <translation id="55293785478302737">Mehrere Heftklammern</translation> @@ -2933,6 +2934,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" /> – Drück die Tabulatortaste und dann die Eingabetaste, um Chrome in den iOS-Einstellungen als Standardbrowser für das System festzulegen</translation> <translation id="9096679202588811390">Fernsehsendungen</translation> <translation id="9101630580131696064">Fach 1</translation> +<translation id="9102081333385212048">Dateien, die du kopierst oder verschiebst, werden zur Analyse an Google Cloud oder Dritte gesendet. Sie werden beispielsweise auf sensible Daten oder Malware geprüft.</translation> <translation id="9103537084693478942">Videosoftware</translation> <translation id="9103872766612412690"><ph name="SITE" /> schützt deine Daten in der Regel durch Verschlüsselung. Als Chromium dieses Mal versuchte, eine Verbindung zu <ph name="SITE" /> herzustellen, gab die Website ungewöhnliche und falsche Anmeldedaten zurück. Entweder versucht ein Angreifer, sich als <ph name="SITE" /> auszugeben, oder die Verbindung wurde durch eine WLAN-Anmeldeseite unterbrochen. Da Chromium die Verbindung vor dem Austausch von Daten unterbrochen hat, sind deine Informationen weiterhin sicher.</translation> <translation id="9106062320799175032">Rechnungsadresse hinzufügen</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb index bcf5547..dfdfa43 100644 --- a/components/strings/components_strings_el.xtb +++ b/components/strings/components_strings_el.xtb
@@ -1072,6 +1072,7 @@ <translation id="3835233591525155343">Χρήση της συσκευής σας</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, πατήστε το πλήκτρο Tab και έπειτα το πλήκτρο Enter για να δημιουργήσετε γρήγορα ένα νέο Έγγραφο Google</translation> <translation id="385051799172605136">Πίσω</translation> +<translation id="3853684360927654006">Υπολογιστής ισχύος κωδικού πρόσβασης</translation> <translation id="3858027520442213535">Ενημέρωση ημερομηνίας και ώρας</translation> <translation id="3858860766373142691">Όνομα</translation> <translation id="3872834068356954457">Επιστήμες</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb index 65dd8e4..abe7411 100644 --- a/components/strings/components_strings_es.xtb +++ b/components/strings/components_strings_es.xtb
@@ -1681,6 +1681,7 @@ <translation id="5518670652865028077">Arte y entretenimiento</translation> <translation id="5519516356611866228">Con tus cambios</translation> <translation id="5523118979700054094">Nombre de la política</translation> +<translation id="5525755241743357906">El archivo se ha copiado o movido</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />: pulsa Tabulador y, después, Intro para personalizar tus herramientas de accesibilidad desde la configuración de ChromeOS</translation> <translation id="5528532273234423708">Domótica</translation> <translation id="55293785478302737">Grapado en el borde</translation> @@ -2933,6 +2934,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />, pulsa Tabulador y luego Intro para establecer Chrome como navegador predeterminado del sistema en los ajustes de iOS</translation> <translation id="9096679202588811390">Series y programas de televisión</translation> <translation id="9101630580131696064">Bandeja 1</translation> +<translation id="9102081333385212048">Los archivos que copies o muevas se enviarán a Google Cloud o a terceros para que se analicen. Por ejemplo, puede que se analicen para buscar datos sensibles o software malicioso.</translation> <translation id="9103537084693478942">Software para vídeos</translation> <translation id="9103872766612412690"><ph name="SITE" /> utiliza normalmente el cifrado para proteger tu información. Cuando Chromium intentó establecer conexión con <ph name="SITE" />, el sitio web devolvió unas credenciales inusuales e incorrectas. Esto puede ocurrir si un atacante intenta suplantar la identidad de <ph name="SITE" /> o si una pantalla de inicio de sesión Wi-Fi interrumpe la conexión. Tu información sigue estando protegida, ya que Chromium detuvo la conexión antes de que se intercambiaran datos.</translation> <translation id="9106062320799175032">Añade una dirección de facturación</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb index 5630c13..917eefc 100644 --- a/components/strings/components_strings_et.xtb +++ b/components/strings/components_strings_et.xtb
@@ -1071,6 +1071,7 @@ <translation id="3835233591525155343">Teie seadmekasutus</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, kiirelt uue Google'i dokumendi loomiseks vajutage tabulaatorit ja seejärel sisestusklahvi</translation> <translation id="385051799172605136">Tagasi</translation> +<translation id="3853684360927654006">Parooli tugevuse kalkulaator</translation> <translation id="3858027520442213535">Värskenda kuupäeva ja kellaaega</translation> <translation id="3858860766373142691">Nimi</translation> <translation id="3872834068356954457">Teadus</translation> @@ -1681,6 +1682,7 @@ <translation id="5518670652865028077">Kunst ja meelelahutus</translation> <translation id="5519516356611866228">Koos teie tehtud muudatustega</translation> <translation id="5523118979700054094">Reegli nimi</translation> +<translation id="5525755241743357906">Faili kopeeritakse või skannitakse</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />, Chrome OS-i seadetes oma juurdepääsetavuse tööriistade isikupärastamiseks vajutage tabulaatorit ja seejärel sisestusklahvi</translation> <translation id="5528532273234423708">Kodutehnika</translation> <translation id="55293785478302737">Servaõmblus</translation> @@ -2933,6 +2935,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />. Vajutage tabulaatorit, seejärel sisestusklahvi, et määrata Chrome iOS-i seadetes süsteemi vaikebrauseriks</translation> <translation id="9096679202588811390">Telesaated ja -programmid</translation> <translation id="9101630580131696064">Salv 1</translation> +<translation id="9102081333385212048">Failid, mida kopeerite või teisaldate, saadetakse analüüsimiseks Google Cloudi või kolmandatele osapooltele. Näiteks võidakse neid skannida tundlike andmete või pahavara tuvastamiseks.</translation> <translation id="9103537084693478942">Videotarkvara</translation> <translation id="9103872766612412690">Sait <ph name="SITE" /> kasutab teie teabe kaitsmiseks tavaliselt krüpteerimist. Kui Chromium püüdis seekord saidiga <ph name="SITE" /> ühendust luua, tagastas veebisait ebatavalised ja valed mandaadid. See võib juhtuda siis, kui ründaja proovib teeselda, et on sait <ph name="SITE" />, või WiFi sisselogimisekraan on ühenduse katkestanud. Teie teave on endiselt kaitstud, sest Chromium peatas ühenduse enne andmevahetust.</translation> <translation id="9106062320799175032">Arveldusaadressi lisamine</translation>
diff --git a/components/strings/components_strings_eu.xtb b/components/strings/components_strings_eu.xtb index 552914e9..a79b07a0 100644 --- a/components/strings/components_strings_eu.xtb +++ b/components/strings/components_strings_eu.xtb
@@ -1067,6 +1067,7 @@ <translation id="3835233591525155343">Gailuaren erabilera</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />: sakatu tabuladorea eta, ondoren, "Sartu" Google-ko dokumentu bat bizkor sortzeko</translation> <translation id="385051799172605136">Atzera</translation> +<translation id="3853684360927654006">Pasahitzaren segurtasun-mailaren kalkulagailua</translation> <translation id="3858027520442213535">Eguneratu data eta ordua</translation> <translation id="3858860766373142691">Izena</translation> <translation id="3872834068356954457">Zientzia</translation> @@ -2506,7 +2507,7 @@ <translation id="7813600968533626083">Inprimaki-iradokizuna Chrome-tik kendu nahi duzu?</translation> <translation id="781440967107097262">Arbela partekatu nahi duzu?</translation> <translation id="7815407501681723534">"<ph name="SEARCH_STRING" />" bilaketaren <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> aurkitu dira.</translation> -<translation id="7822320754433038727">Ehiza eta tiroketak</translation> +<translation id="7822320754433038727">Ehiza eta tiroa</translation> <translation id="782886543891417279">Baliteke darabilzun Wi-Fi konexioaren (<ph name="WIFI_NAME" />) saio-hasierako orrira joan behar izatea.</translation> <translation id="7836231406687464395">Postfix (gutun-azala)</translation> <translation id="7844689747373518809">{COUNT,plural, =0{Bat ere ez}=1{1 aplikazio (<ph name="EXAMPLE_APP_1" />)}=2{2 aplikazio (<ph name="EXAMPLE_APP_1" /> eta <ph name="EXAMPLE_APP_2" />)}other{# aplikazio (<ph name="EXAMPLE_APP_1" />, <ph name="EXAMPLE_APP_2" /> eta<ph name="AND_MORE" />)}}</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb index 8542c57..f732e0b8 100644 --- a/components/strings/components_strings_fa.xtb +++ b/components/strings/components_strings_fa.xtb
@@ -1071,6 +1071,7 @@ <translation id="3835233591525155343">استفاده از دستگاه</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />؛ برای ایجاد سریع «سندنگار Google» جدید، کلید «جهش» و سپس «ورود» را فشار دهید</translation> <translation id="385051799172605136">بازگشت</translation> +<translation id="3853684360927654006">محاسبهگر قدرت گذرواژه</translation> <translation id="3858027520442213535">بهروزرسانی تاریخ و زمان</translation> <translation id="3858860766373142691">نام</translation> <translation id="3872834068356954457">علم</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb index 79c0989d..4d691310 100644 --- a/components/strings/components_strings_fil.xtb +++ b/components/strings/components_strings_fil.xtb
@@ -1682,6 +1682,7 @@ <translation id="5518670652865028077">Sining at entertainment</translation> <translation id="5519516356611866228">Kasama ang iyong mga pagbabago</translation> <translation id="5523118979700054094">Pangalan ng patakaran</translation> +<translation id="5525755241743357906">Kinopya o inilipat ang file</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />, Pindutin ang tab at pagkatapos ay ang Enter para i-personalize ang iyong mga tool sa accessibility sa mga setting ng ChromeOS</translation> <translation id="5528532273234423708">Home automation</translation> <translation id="55293785478302737">Edge stitch</translation> @@ -2934,6 +2935,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />, Pindutin ang tab at pagkatapos ay ang Enter para itakda ang Chrome bilang default na browser ng system sa mga setting ng iOS</translation> <translation id="9096679202588811390">Mga palabas at programa sa TV</translation> <translation id="9101630580131696064">Tray 1</translation> +<translation id="9102081333385212048">Ipinapadala sa Google Cloud o mga third party para sa pagsusuri ang mga file na kinokopya o inililipat mo. Halimbawa, posibleng i-scan ang mga ito para sa sensitibong data o malware.</translation> <translation id="9103537084693478942">Software sa video</translation> <translation id="9103872766612412690">Karaniwang gumagamit ang <ph name="SITE" /> ng pag-encrypt upang protektahan ang iyong impormasyon. Noong sinubukang kumonekta ng Chromium sa <ph name="SITE" /> sa pagkakataong ito, nagbalik ang website ng mga hindi pangkaraniwan at maling kredensyal. Maaari itong mangyari kapag sinusubukan ng isang attacker na magpanggap bilang <ph name="SITE" />, o naputol ang koneksyon dahil sa isang screen ng pag-sign in sa Wi-Fi. Secure pa rin ang iyong impormasyon dahil inihinto ng Chromium ang koneksyon bago magkaroon ng palitan ng anumang data.</translation> <translation id="9106062320799175032">Magdagdag ng Billing Address</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb index 1580a4e..0605c29a 100644 --- a/components/strings/components_strings_gu.xtb +++ b/components/strings/components_strings_gu.xtb
@@ -1682,6 +1682,7 @@ <translation id="5518670652865028077">કળા અને મનોરંજન</translation> <translation id="5519516356611866228">તમારા ફેરફારો સાથે</translation> <translation id="5523118979700054094">નીતિનું નામ</translation> +<translation id="5525755241743357906">ફાઇલને કૉપિ કરવામાં કે ખસેડવામાં આવી છે</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />, ChromeOS સેટિંગમાં જઈને તમારા ઍક્સેસિબિલિટીના ટૂલને મનગમતા બનાવવા માટે, પહેલાં Tab અને પછી Enter કી દબાવો</translation> <translation id="5528532273234423708">હોમ ઑટોમૅશન</translation> <translation id="55293785478302737">કિનારી જોડવી</translation> @@ -2934,6 +2935,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />, iOS સેટિંગમાં Chromeને સિસ્ટમના ડિફૉલ્ટ બ્રાઉઝર તરીકે સેટ કરવા માટે, પહેલાં tab અને પછી Enter કી દબાવો</translation> <translation id="9096679202588811390">ટીવી શો અને પ્રોગ્રામ</translation> <translation id="9101630580131696064">ટ્રે 1</translation> +<translation id="9102081333385212048">તમે જે ફાઇલો કૉપિ કરશો કે ખસેડશો તેને વિશ્લેષણ માટે Google Cloud અથવા ત્રીજા પક્ષને મોકલવામાં આવે છે. ઉદાહરણ તરીકે, તેને સંવેદનશીલ વ્યક્તિગત ડેટા કે માલવેર માટે સ્કૅન કરવામાં આવી શકે છે.</translation> <translation id="9103537084693478942">વીડિયો સૉફ્ટવેર</translation> <translation id="9103872766612412690"><ph name="SITE" /> સામાન્ય રીતે તમારી માહિતીને સુરક્ષિત રાખવા માટે એન્ક્રિપ્શનનો ઉપયોગ કરે છે. જ્યારે આ સમયે Chromium દ્વારા <ph name="SITE" />થી કનેક્ટ કરવાનો પ્રયાસ થયો, ત્યારે વેબસાઇટે અસામાન્ય અને ખોટા લૉગ ઇન વિગતને પાછા મોકલ્યાં. આવું ત્યારે થઈ શકે જ્યારે કોઈ હુમલાખોર <ph name="SITE" /> હોવાનો ડોળ કરવાનો પ્રયાસ કરી રહ્યો હોવ અથવા કોઈ Wi-Fi સાઇન-ઇન સ્ક્રીને કનેક્શનમાં વિક્ષેપ પાડ્યો હોય. તમારી માહિતી હજી પણ સુરક્ષિત છે કારણ કે Chromium એ કોઈ પણ ડેટા વિનિમય થાય એ પહેલાં જ કનેક્શન રોકી દીધું.</translation> <translation id="9106062320799175032">બિલિંગ સરનામું ઉમેરો</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index 0cffc4f..c94bc71 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -1681,6 +1681,7 @@ <translation id="5518670652865028077">कला और मनोरंजन</translation> <translation id="5519516356611866228">किए गए बदलावों के साथ दस्तावेज़ डाउनलोड करें</translation> <translation id="5523118979700054094">नीति का नाम</translation> +<translation id="5525755241743357906">फ़ाइल कॉपी की गई या दूसरी जगह ले जाई गई</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />, ChromeOS की सेटिंग में सुलभता टूल को अपने हिसाब से बनाने के लिए, पहले Tab और इसके बाद Enter दबाएं</translation> <translation id="5528532273234423708">होम ऑटोमेशन</translation> <translation id="55293785478302737">एज़ स्टिच</translation> @@ -2934,6 +2935,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />, iOS की सेटिंग में, Chrome को सिस्टम के डिफ़ॉल्ट ब्राउज़र के रूप में सेट करने के लिए, पहले Tab और फिर Enter दबाएं</translation> <translation id="9096679202588811390">टीवी शो और कार्यक्रम</translation> <translation id="9101630580131696064">ट्रे 1</translation> +<translation id="9102081333385212048">कॉपी की गई या दूसरी जगह ले जाई गई फ़ाइलों को, विश्लेषण के लिए Google Cloud या तीसरे पक्ष की कंपनियों को भेजा जाता है. उदाहरण के लिए, इन्हें संवेदनशील जानकारी या मैलवेयर की जांच के लिए स्कैन किया जा सकता है.</translation> <translation id="9103537084693478942">वीडियो सॉफ़्टवेयर</translation> <translation id="9103872766612412690">आपकी जानकारी की सुरक्षा करने के लिए <ph name="SITE" /> आम तौर पर, सुरक्षित करने के तरीके (एन्क्रिप्शन) का उपयोग करती है. जब 'क्रोमियम' ने इस बार <ph name="SITE" /> से कनेक्ट करने की कोशिश की तो, वेबसाइट ने असामान्य और गलत क्रेडेंशियल वापस भेजे. ऐसा तब हो सकता है जब कोई हमलावर <ph name="SITE" /> होने का दावा करने की कोशिश कर रहा हो या किसी वाई-फ़ाई 'साइन इन स्क्रीन' की वजह से कनेक्शन में खराबी आ गई हो. आपकी जानकारी अभी भी सुरक्षित है क्योंकि किसी भी डेटा को एक्सचेंज करने से पहले ही 'क्रोमियम' ने कनेक्शन रोक दिया था.</translation> <translation id="9106062320799175032">बिलिंग पता जोड़ें</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb index 3599ac5..f17d1e5 100644 --- a/components/strings/components_strings_hr.xtb +++ b/components/strings/components_strings_hr.xtb
@@ -1070,6 +1070,7 @@ <translation id="3835233591525155343">Vaša upotreba uređaja</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, pritisnite Tab, a zatim Enter da biste brzo izradili novi Google dokument</translation> <translation id="385051799172605136">Natrag</translation> +<translation id="3853684360927654006">Kalkulator snage zaporke</translation> <translation id="3858027520442213535">Ažuriraj datum i vrijeme</translation> <translation id="3858860766373142691">Naziv</translation> <translation id="3872834068356954457">Znanost</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb index 10d609c..68973f27 100644 --- a/components/strings/components_strings_hu.xtb +++ b/components/strings/components_strings_hu.xtb
@@ -1069,6 +1069,7 @@ <translation id="3835233591525155343">Aktív eszközhasználat</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, tartsa lenyomva a Tab billentyűt, majd nyomja meg az Enter billentyűt új Google-dokumentum gyors létrehozásához</translation> <translation id="385051799172605136">Vissza</translation> +<translation id="3853684360927654006">Jelszóerősség-kalkulátor</translation> <translation id="3858027520442213535">Dátum és idő frissítése</translation> <translation id="3858860766373142691">Név</translation> <translation id="3872834068356954457">Természettudományok</translation> @@ -1679,6 +1680,7 @@ <translation id="5518670652865028077">Művészet és szórakoztatás</translation> <translation id="5519516356611866228">Az Ön módosításaival</translation> <translation id="5523118979700054094">Az irányelv neve</translation> +<translation id="5525755241743357906">Fájl másolva vagy áthelyezve</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />. Nyomja le a Tab, majd az Enter billentyűt a kisegítő eszközöknek a ChromeOS beállításaiban való személyre szabásához.</translation> <translation id="5528532273234423708">Otthonautomatizálás</translation> <translation id="55293785478302737">Éltűzés</translation> @@ -2932,6 +2934,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />. Nyomja le a Tab, majd az Enter gombot, ha a Chrome-ot szeretné beállítani a rendszer alapértelmezett böngészőjeként az iOS beállításaiban</translation> <translation id="9096679202588811390">Televíziós show-k és műsorok</translation> <translation id="9101630580131696064">1. tálca</translation> +<translation id="9102081333385212048">A másolt vagy áthelyezett fájlokat elküldjük a Google Cloudnak vagy harmadik feleknek elemzésre. A Google Cloud vagy a harmadik fél például bizalmas adatokat vagy rosszindulatú programokat kereshet a fájlokban.</translation> <translation id="9103537084693478942">Videós szoftverek</translation> <translation id="9103872766612412690">A(z) <ph name="SITE" /> webhely rendes esetben titkosítást alkalmaz az Ön adatainak védelme érdekében. Amikor a Chromium most csatlakozni próbált, a(z) <ph name="SITE" /> webhely szokatlan és helytelen hitelesítési adatokat küldött vissza.Ez olyankor fordulhat elő, amikor egy támadó megpróbálja magát kiadni a(z) <ph name="SITE" /> webhelynek, vagy valamilyen Wi-Fi-bejelentkezési képernyő megszakította a kapcsolatot. Adatai továbbra is biztonságban vannak, mivel a Chromium még azt megelőzően megszakította a kapcsolatot, hogy bármiféle adatcserére sor kerülhetett volna.</translation> <translation id="9106062320799175032">Számlázási cím hozzáadása</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb index 9eec02f..92e2edfb3 100644 --- a/components/strings/components_strings_id.xtb +++ b/components/strings/components_strings_id.xtb
@@ -1070,6 +1070,7 @@ <translation id="3835233591525155343">Penggunaan perangkat Anda</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, tekan Tab lalu Enter untuk membuat Dokumen Google baru dengan cepat</translation> <translation id="385051799172605136">Kembali</translation> +<translation id="3853684360927654006">Kalkulator Kekuatan Sandi</translation> <translation id="3858027520442213535">Perbarui tanggal dan waktu</translation> <translation id="3858860766373142691">Nama</translation> <translation id="3872834068356954457">Sains</translation> @@ -1680,6 +1681,7 @@ <translation id="5518670652865028077">Seni & hiburan</translation> <translation id="5519516356611866228">Dengan perubahan dari Anda</translation> <translation id="5523118979700054094">Nama kebijakan</translation> +<translation id="5525755241743357906">File disalin atau dipindahkan</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />, Tekan tab lalu Enter untuk mempersonalisasi alat aksesibilitas Anda di setelan ChromeOS</translation> <translation id="5528532273234423708">Otomatisasi rumah</translation> <translation id="55293785478302737">Jahitan tepi</translation> @@ -2928,6 +2930,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />, Tekan Tab lalu Enter untuk menyetel Chrome sebagai browser default sistem di setelan iOS</translation> <translation id="9096679202588811390">Program & acara TV</translation> <translation id="9101630580131696064">Baki 1</translation> +<translation id="9102081333385212048">File yang Anda salin atau pindahkan akan dikirim ke Google Cloud atau pihak ketiga untuk dianalisis. Misalnya, file mungkin dipindai untuk mendeteksi data sensitif atau malware.</translation> <translation id="9103537084693478942">Software video</translation> <translation id="9103872766612412690"><ph name="SITE" /> biasanya menggunakan enkripsi untuk melindungi informasi Anda. Saat Chromium mencoba menyambung ke <ph name="SITE" /> kali ini, situs web mengembalikan kredensial yang salah dan tidak biasa. Hal ini dapat terjadi jika ada penyerang yang berpura-pura menjadi <ph name="SITE" />, atau layar masuk Wi-Fi mengganggu sambungan. Informasi Anda masih aman karena Chromium menghentikan sambungan sebelum terjadi pertukaran data apa pun.</translation> <translation id="9106062320799175032">Tambahkan Alamat Penagihan</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb index c3236178..ce6a82c 100644 --- a/components/strings/components_strings_it.xtb +++ b/components/strings/components_strings_it.xtb
@@ -1068,6 +1068,7 @@ <translation id="3835233591525155343">Utilizzo del tuo dispositivo</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, premi Tab e poi Invio per creare rapidamente un nuovo documento Google</translation> <translation id="385051799172605136">Indietro</translation> +<translation id="3853684360927654006">Calcolatore della sicurezza delle password</translation> <translation id="3858027520442213535">Aggiorna data e ora</translation> <translation id="3858860766373142691">Nome</translation> <translation id="3872834068356954457">Scienze</translation> @@ -1900,7 +1901,7 @@ <translation id="6153243098246946146"><ph name="WIDTH" /> × <ph name="HEIGHT" /> in (<ph name="ORIENTATION" />)</translation> <translation id="6157754950574419155">Rimuovi tutto dalla cronologia</translation> <translation id="6157877588268064908">Seleziona un indirizzo per conoscere i requisiti e i metodi di spedizione</translation> -<translation id="6165508094623778733">Ulteriori informazioni</translation> +<translation id="6165508094623778733">Scopri di più</translation> <translation id="6167577165590485365">Ultimo tentativo di recupero:</translation> <translation id="6169916984152623906">Ora puoi navigare in privato. Le altre persone che usano questo dispositivo non vedranno le tue attività, ma i download e i preferiti verranno salvati.</translation> <translation id="6176716740821145453">Dedica un istante alla valutazione dell'accuratezza</translation> @@ -2720,7 +2721,7 @@ <translation id="8438786541497918448">Usare videocamera e microfono?</translation> <translation id="8443613539889492016">Rap e Hip-hop</translation> <translation id="8444543005280733648">Reti di computer</translation> -<translation id="8446884382197647889">Ulteriori informazioni</translation> +<translation id="8446884382197647889">Scopri di più</translation> <translation id="8449836157089738489">Apri tutto in un nuovo gruppo di schede</translation> <translation id="8457125768502047971">Indeterminato</translation> <translation id="8461694314515752532">Cripta i dati sincronizzati con la tua passphrase di sincronizzazione</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb index 24ae738..d8b0e64 100644 --- a/components/strings/components_strings_ja.xtb +++ b/components/strings/components_strings_ja.xtb
@@ -1071,6 +1071,7 @@ <translation id="3835233591525155343">デバイスのアクティブ状態</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" /> です。Tab キー、Enter キーの順に押すと、新しい Google ドキュメントをすばやく作成します</translation> <translation id="385051799172605136">戻る</translation> +<translation id="3853684360927654006">パスワード安全度計算ツール</translation> <translation id="3858027520442213535">日時を更新</translation> <translation id="3858860766373142691">名前</translation> <translation id="3872834068356954457">科学</translation> @@ -1681,6 +1682,7 @@ <translation id="5518670652865028077">アート、エンターテインメント</translation> <translation id="5519516356611866228">変更後のバージョン</translation> <translation id="5523118979700054094">ポリシー名</translation> +<translation id="5525755241743357906">ファイルをコピーまたは移動しました</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" /> です。Tab、Enter キーの順に押すと、Chrome OS の設定でユーザー補助ツールをカスタマイズできます</translation> <translation id="5528532273234423708">スマートホーム</translation> <translation id="55293785478302737">端綴じ</translation> @@ -2934,6 +2936,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" /> です。Tab、Enter キーの順に押すと、iOS 設定で Chrome をシステムの既定のブラウザとして設定できます</translation> <translation id="9096679202588811390">テレビ番組</translation> <translation id="9101630580131696064">トレイ 1</translation> +<translation id="9102081333385212048">コピーまたは移動したファイルは分析のため Google Cloud または第三者に送信されます。たとえば、機密データやマルウェアがないかスキャンされます。</translation> <translation id="9103537084693478942">動画編集ソフトウェア</translation> <translation id="9103872766612412690"><ph name="SITE" /> では通常、暗号化して情報を保護しています。今回、Chromium から <ph name="SITE" /> への接続試行時に、このウェブサイトからいつもとは異なる誤った認証情報が返されました。悪意のあるユーザーが <ph name="SITE" /> になりすまそうとしているか、Wi-Fi ログイン画面で接続が中断された可能性があります。データのやり取りが行われる前に Chromium によって接続が停止されたため、情報は引き続き保護されています。</translation> <translation id="9106062320799175032">請求先住所の追加</translation>
diff --git a/components/strings/components_strings_ka.xtb b/components/strings/components_strings_ka.xtb index 79e1279..911af957 100644 --- a/components/strings/components_strings_ka.xtb +++ b/components/strings/components_strings_ka.xtb
@@ -1071,6 +1071,7 @@ <translation id="3835233591525155343">თქვენი მოწყობილობის გამოყენება</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, ახალი Google Doc-ის სწრაფად შესაქმნელად დააჭირეთ კლავიშს Tab, შემდეგ კი Enter-ს</translation> <translation id="385051799172605136">უკან</translation> +<translation id="3853684360927654006">პაროლის სიძლიერის კალკულატორი</translation> <translation id="3858027520442213535">განახლების თარიღი და დრო</translation> <translation id="3858860766373142691">სახელი</translation> <translation id="3872834068356954457">მეცნიერება</translation>
diff --git a/components/strings/components_strings_kk.xtb b/components/strings/components_strings_kk.xtb index 13f18980..2c31f19 100644 --- a/components/strings/components_strings_kk.xtb +++ b/components/strings/components_strings_kk.xtb
@@ -1070,6 +1070,7 @@ <translation id="3835233591525155343">Құрылғыны пайдалануыңыз</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, жаңа Google құжатын жылдам жасау үшін Tab, содан кейін Enter пернесін басыңыз.</translation> <translation id="385051799172605136">Артқа</translation> +<translation id="3853684360927654006">Құпия сөздің күшін есептеу құралы</translation> <translation id="3858027520442213535">Күні мен уақытын жаңарту</translation> <translation id="3858860766373142691">Аты</translation> <translation id="3872834068356954457">Ғылым</translation> @@ -1680,6 +1681,7 @@ <translation id="5518670652865028077">Өнер және ойын-сауық</translation> <translation id="5519516356611866228">Өзгертулеріңізбен</translation> <translation id="5523118979700054094">Саясат атауы</translation> +<translation id="5525755241743357906">Файл көшіріледі немесе жылжытылады.</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />. ChromeOS параметрлерінен арнайы мүмкіндіктер құралдарын жекелендіру үшін Tab, сосын Enter пернесін басыңыз.</translation> <translation id="5528532273234423708">Үй құрылғыларын автоматтандыру</translation> <translation id="55293785478302737">Жиекті тігу</translation> @@ -2932,6 +2934,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />. iOS параметрлерінде Chrome-ды жүйенің әдепкі браузері етіп орнату үшін Tab, кейін Enter пернесін басыңыз.</translation> <translation id="9096679202588811390">Телешоулар мен бағдарламалар</translation> <translation id="9101630580131696064">1-науа</translation> +<translation id="9102081333385212048">Сіз көшірген немесе жылжытқан файлдар Google Cloud немесе үшінші тарапқа жіберіліп, талданады. Мысалы, онда құпия деректердің немесе зиянды бағдарламалардың бар-жоғы тексеріледі.</translation> <translation id="9103537084693478942">Бейнеге арналған бағдарламалық құрал</translation> <translation id="9103872766612412690"><ph name="SITE" /> әдетте ақпаратыңызды қорғау үшін шифрлауды қолданады. Осы жолы Chromium <ph name="SITE" /> сайтына қосылуға әрекет еткенде, веб-сайт әдеттен тыс және қате тіркелгі деректерін жіберді. Бұл жағдай қаскүнем <ph name="SITE" /> болып көрінгісі келгенде немесе Wi-Fi кіру экраны байланысқа кедергі болғанда пайда болуы мүмкін. Ақпаратыңыз қауіпсіз күйде, себебі Chromium ешқандай дерек алмасу болмай тұрып байланысты үзді.</translation> <translation id="9106062320799175032">Төлем мекенжайын қосу</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb index 3c4a5fe2..6a738f1 100644 --- a/components/strings/components_strings_kn.xtb +++ b/components/strings/components_strings_kn.xtb
@@ -1067,6 +1067,7 @@ <translation id="3835233591525155343">ನಿಮ್ಮ ಸಾಧನದ ಬಳಕೆ</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, ಹೊಸ Google Doc ಅನ್ನು ತ್ವರಿತವಾಗಿ ರಚಿಸಲು Tab ಒತ್ತಿ, ನಂತರ Enter ಒತ್ತಿ</translation> <translation id="385051799172605136">ಹಿಂದೆ</translation> +<translation id="3853684360927654006">ಪಾಸ್ವರ್ಡ್ ಸಾಮರ್ಥ್ಯ ಕ್ಯಾಲ್ಕ್ಯುಲೇಟರ್</translation> <translation id="3858027520442213535">ದಿನಾಂಕ ಮತ್ತು ಸಮಯವನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಿ</translation> <translation id="3858860766373142691">ಹೆಸರು</translation> <translation id="3872834068356954457">ವಿಜ್ಞಾನ</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb index 5da5795..08abb4f 100644 --- a/components/strings/components_strings_ko.xtb +++ b/components/strings/components_strings_ko.xtb
@@ -1071,6 +1071,7 @@ <translation id="3835233591525155343">기기 사용 여부</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, Tab을 누른 다음 Enter를 눌러 빠르게 새 Google 문서 만들기</translation> <translation id="385051799172605136">뒤로</translation> +<translation id="3853684360927654006">비밀번호 안전성 계산기</translation> <translation id="3858027520442213535">시간과 날짜 업데이트</translation> <translation id="3858860766373142691">이름</translation> <translation id="3872834068356954457">과학</translation> @@ -1681,6 +1682,7 @@ <translation id="5518670652865028077">예술 및 엔터테인먼트</translation> <translation id="5519516356611866228">변경사항 포함</translation> <translation id="5523118979700054094">정책 이름</translation> +<translation id="5525755241743357906">파일이 복사되거나 이동되었습니다.</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />, ChromeOS 설정에서 접근성 도구를 맞춤설정하려면 Tab과 Enter를 차례로 누르세요</translation> <translation id="5528532273234423708">홈 자동화</translation> <translation id="55293785478302737">에지 스티치</translation> @@ -2932,6 +2934,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />, tab 키를 누른 다음 Enter 키를 눌러 iOS 설정에서 Chrome을 시스템 기본 브라우저로 설정</translation> <translation id="9096679202588811390">TV 프로그램</translation> <translation id="9101630580131696064">트레이 1</translation> +<translation id="9102081333385212048">복사하거나 이동한 파일은 분석을 위해 Google Cloud 또는 서드 파티로 전송됩니다. 예를 들어 민감한 정보 또는 멀웨어를 찾기 위해 파일을 스캔할 수 있습니다.</translation> <translation id="9103537084693478942">동영상 소프트웨어</translation> <translation id="9103872766612412690"><ph name="SITE" />에서는 사용자 정보를 보호하기 위해 일반적으로 암호화를 사용합니다. 이번에 Chromium에서 <ph name="SITE" />에 연결을 시도했을 때 웹사이트에서 비정상적이고 잘못된 사용자 인증 정보를 반환했습니다. 이는 공격자가 <ph name="SITE" />인 것처럼 가장하려고 하거나 Wi-Fi 로그인 화면이 연결을 방해했기 때문일 수 있습니다. 데이터 교환이 발생하기 전에 Chromium에서 연결을 중단했으므로 사용자 정보는 안전합니다.</translation> <translation id="9106062320799175032">청구서 주소 추가</translation>
diff --git a/components/strings/components_strings_ky.xtb b/components/strings/components_strings_ky.xtb index 067ea3dc..c05b611 100644 --- a/components/strings/components_strings_ky.xtb +++ b/components/strings/components_strings_ky.xtb
@@ -1070,6 +1070,7 @@ <translation id="3835233591525155343">Түзмөгүңүздүн колдонулушу</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, жаңы Google документин тез түзүү үчүн Tab, андан кийин Enter баскычын басыңыз</translation> <translation id="385051799172605136">Артка</translation> +<translation id="3853684360927654006">Сырсөздүн бекемдигин эсептегич</translation> <translation id="3858027520442213535">Күн менен убакытты жаңыртуу</translation> <translation id="3858860766373142691">Аталышы</translation> <translation id="3872834068356954457">Илим</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb index fa93187..b829e9f1 100644 --- a/components/strings/components_strings_ml.xtb +++ b/components/strings/components_strings_ml.xtb
@@ -1070,6 +1070,7 @@ <translation id="3835233591525155343">നിങ്ങളുടെ ഉപകരണത്തിന്റെ ഉപയോഗം</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, പുതിയൊരു Google ഡോക് വേഗത്തിൽ സൃഷ്ടിക്കാൻ Tab അമർത്തുക, തുടർന്ന് Enter അമർത്തുക</translation> <translation id="385051799172605136">പിന്നോട്ട്</translation> +<translation id="3853684360927654006">പാസ്വേഡ് ശേഷി കണക്കാക്കാനുള്ള കാൽക്കുലേറ്റർ</translation> <translation id="3858027520442213535">തീയതിയും സമയവും അപ്ഡേറ്റ് ചെയ്യുക</translation> <translation id="3858860766373142691">പേര്</translation> <translation id="3872834068356954457">ശാസ്ത്രം</translation> @@ -1680,6 +1681,7 @@ <translation id="5518670652865028077">കലയും വിനോദവും</translation> <translation id="5519516356611866228">നിങ്ങൾ വരുത്തിയ മാറ്റങ്ങൾ സഹിതം</translation> <translation id="5523118979700054094">നയത്തിന്റെ പേര്</translation> +<translation id="5525755241743357906">ഫയൽ പകർത്തി അല്ലെങ്കിൽ നീക്കി</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />, ChromeOS ക്രമീകരണത്തിൽ നിങ്ങളുടെ ഉപയോഗസഹായി ടൂളുകൾ വ്യക്തിപരമാക്കാൻ Tab അമർത്തുക, തുടർന്ന് Enter അമർത്തുക</translation> <translation id="5528532273234423708">ഹോം ഓട്ടോമേഷൻ</translation> <translation id="55293785478302737">അരിക് കൂട്ടിച്ചേർക്കൽ</translation> @@ -2930,6 +2932,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />, iOS ക്രമീകരണത്തിൽ സിസ്റ്റത്തിന്റെ ഡിഫോൾട്ട് ബ്രൗസറായി Chrome സജ്ജീകരിക്കുന്നതിന് ടാബ് അമർത്തിയ ശേഷം Enter അമർത്തുക</translation> <translation id="9096679202588811390">ടിവി ഷോകളും പ്രോഗാമുകളും</translation> <translation id="9101630580131696064">ട്രേ 1</translation> +<translation id="9102081333385212048">നിങ്ങൾ പകർത്തുകയോ നീക്കുകയോ ചെയ്യുന്ന ഫയലുകൾ വിശകലനത്തിനായി Google Cloud-ലേക്കോ മൂന്നാം കക്ഷികൾക്കോ അയയ്ക്കുന്നു. ഉദാഹരണത്തിന്, സെൻസിറ്റീവായിട്ടുള്ള വ്യക്തിപരമായ ഡാറ്റയോ മാൽവെയറോ ഉണ്ടോയെന്നറിയാൻ അവ സ്കാൻ ചെയ്തേക്കാം.</translation> <translation id="9103537084693478942">വീഡിയോ സോഫ്റ്റ്വെയർ</translation> <translation id="9103872766612412690">നിങ്ങളുടെ വിവരങ്ങൾ പരിരക്ഷിക്കാൻ സാധാരണയായി <ph name="SITE" />, എൻക്രിപ്ഷൻ ഉപയോഗിക്കുന്നു. ഇപ്പോൾ <ph name="SITE" /> സൈറ്റിലേക്ക് കണക്റ്റ് ചെയ്യാൻ Chromium ശ്രമിച്ചപ്പോൾ, അസാധാരണമായതും തെറ്റായതുമായ ക്രെഡൻഷ്യലുകൾ വെബ്സൈറ്റ് തിരികെ അയച്ചു. ഒരു ആക്രമണകാരി <ph name="SITE" /> എന്നതായി ഭാവിക്കാൻ ശ്രമിക്കുമ്പോഴോ Wi-Fi സൈൻ ഇൻ സ്ക്രീൻ, കണക്ഷനെ തടസ്സപ്പെടുത്തുമ്പോഴോ ആണ് ഇങ്ങനെ സംഭവിക്കാനിടയുള്ളത്. ഏതെങ്കിലും ഡാറ്റ കൈമാറുന്നതിനുമുമ്പ് Chromium കണക്ഷൻ അവസാനിപ്പിച്ചതിനാൽ, നിങ്ങളുടെ വിവരങ്ങൾ തുടർന്നും സുരക്ഷിതമായിരിക്കും.</translation> <translation id="9106062320799175032">ബില്ലിംഗ് വിലാസം ചേർക്കുക</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb index aa75ae8..af35f1b 100644 --- a/components/strings/components_strings_ms.xtb +++ b/components/strings/components_strings_ms.xtb
@@ -1072,6 +1072,7 @@ <translation id="3835233591525155343">Penggunaan peranti anda</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, tekan kekunci Tab kemudian Enter untuk membuat Google Docs baharu dengan pantas</translation> <translation id="385051799172605136">Kembali</translation> +<translation id="3853684360927654006">Kalkulator Kekuatan Kata Laluan</translation> <translation id="3858027520442213535">Kemas kini tarikh dan masa</translation> <translation id="3858860766373142691">Nama</translation> <translation id="3872834068356954457">Sains</translation> @@ -1682,6 +1683,7 @@ <translation id="5518670652865028077">Seni & hiburan</translation> <translation id="5519516356611866228">Dengan perubahan anda</translation> <translation id="5523118979700054094">Nama dasar</translation> +<translation id="5525755241743357906">Fail disalin atau dialihkan</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />, Tekan tab kemudian Enter untuk memeribadikan alat kebolehaksesan anda dalam tetapan Chrome OS</translation> <translation id="5528532273234423708">Pengautomatan rumah</translation> <translation id="55293785478302737">Jahitan tepi</translation> @@ -2935,6 +2937,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />, Tekan tab kemudian Enter untuk menetapkan Chrome sebagai penyemak imbas lalai sistem dalam tetapan iOS</translation> <translation id="9096679202588811390">Rancangan & program TV</translation> <translation id="9101630580131696064">Dulang 1</translation> +<translation id="9102081333385212048">Fail yang anda salin atau alihkan dihantar kepada Google Cloud atau pihak ketiga untuk dianalisis. Contohnya, fail itu mungkin diimbas untuk mencari data sensitif atau perisian hasad.</translation> <translation id="9103537084693478942">Perisian video</translation> <translation id="9103872766612412690"><ph name="SITE" /> biasanya menggunakan penyulitan untuk melindungi maklumat anda. Apabila Chromium cuba menyambung ke <ph name="SITE" /> pada kali ini, laman web tersebut mengembalikan bukti kelayakan yang luar biasa dan salah. Hal ini boleh berlaku apabila penyerang sedang cuba menyamar sebagai <ph name="SITE" /> atau skrin log masuk Wi-Fi telah memutuskan sambungan. Maklumat anda masih selamat kerana Chromium menghentikan sambungan sebelum sebarang pertukaran data berlaku.</translation> <translation id="9106062320799175032">Tambahkan Alamat Pengebilan</translation>
diff --git a/components/strings/components_strings_my.xtb b/components/strings/components_strings_my.xtb index 8afa8f6..ae862a4 100644 --- a/components/strings/components_strings_my.xtb +++ b/components/strings/components_strings_my.xtb
@@ -1071,6 +1071,7 @@ <translation id="3835233591525155343">သင်၏ ကိရိယာအသုံးပြုမှု</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />၊ Google Doc အသစ် အမြန်ပြုလုပ်ရန် ‘တဘ်’ နှိပ်ပြီးနောက် Enter ခလုတ် နှိပ်ပါ</translation> <translation id="385051799172605136">နောက်သို့</translation> +<translation id="3853684360927654006">စကားဝှက်အားကောင်းမှု တွက်ချက်စနစ်</translation> <translation id="3858027520442213535">ရက်စွဲ နှင့် အချိန်ကို မွမ်းမံပါ</translation> <translation id="3858860766373142691">အမည်</translation> <translation id="3872834068356954457">သိပွံ</translation>
diff --git a/components/strings/components_strings_ne.xtb b/components/strings/components_strings_ne.xtb index cabc70b..2af6475 100644 --- a/components/strings/components_strings_ne.xtb +++ b/components/strings/components_strings_ne.xtb
@@ -1068,6 +1068,7 @@ <translation id="3835233591525155343">तपाईंको डिभाइसको प्रयोग</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, Google Docs प्रयोग गरी तुरुन्तै नयाँ डकुमेन्ट बनाउन Tab थिच्नुहोस् अनि Enter थिच्नुहोस्</translation> <translation id="385051799172605136">पछाडि जानुहोस्</translation> +<translation id="3853684360927654006">पासवर्डको सबलता जाँच गर्ने सेवा</translation> <translation id="3858027520442213535">मिति र समय अपडेट गर्नुहोस्</translation> <translation id="3858860766373142691">नाम</translation> <translation id="3872834068356954457">विज्ञान</translation> @@ -1678,6 +1679,7 @@ <translation id="5518670652865028077">कला तथा मनोरञ्जन</translation> <translation id="5519516356611866228">तपाईंले गर्नुभएका परिवर्तन लागू गरेर</translation> <translation id="5523118979700054094">नीति नाम</translation> +<translation id="5525755241743357906">फाइल कपी गरिएका वा सारिएका छन्</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />, तपाईं ChromeOS का सेटिङमा गई एक्सेसिबिलिटी टुलहरू पर्सनलाइज गर्न चाहनुहुन्छ भने ट्याब थिच्नुहोस् अनि इन्टर थिच्नुहोस्</translation> <translation id="5528532273234423708">घरका स्वचालित डिभाइस</translation> <translation id="55293785478302737">किनारमा स्टिच</translation> @@ -2930,6 +2932,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />, iOS का सेटिङमा गई Chrome लाई सिस्टमको डिफल्ट ब्राउजरका रूपमा सेट गर्न ट्याब थिचेर इन्टर थिच्नुहोस्</translation> <translation id="9096679202588811390">टिभी सो तथा कार्यक्रमहरू</translation> <translation id="9101630580131696064">ट्रे १</translation> +<translation id="9102081333385212048">तपाईंले कपी गर्नुभएका वा सार्नुभएका फाइलहरू विश्लेषण गर्ने प्रयोजनका लागि Google Cloud मा वा तेस्रा पक्षकहाँ पठाइन्छन्। उदाहरणका लागि, ती फाइलमा संवेदनशील डेटा वा मालवेयर छन् कि छैनन् भनी जाँच गरिन सक्छ।</translation> <translation id="9103537084693478942">भिडियो सफ्टवेयर</translation> <translation id="9103872766612412690"><ph name="SITE" /> ले सामान्यतया तपाईंको जानकारीको सुरक्षा गर्न इन्क्रिप्सन प्रयोग गर्दछ। Chromium ले यस समयमा <ph name="SITE" /> मा जडान गर्ने प्रयास गर्दा वेबसाइटले असामान्य र गलत प्रमाणहरू फिर्ता पठायो। यस्तो आक्रमणकारीले <ph name="SITE" /> भएको बहाना गर्ने प्रयास गर्दा वा Wi-Fi साइन इन स्क्रिनले जडानलाई अवरोध पुर्याउँदा हुन सक्छ। कुनै पनि डेटा आदानप्रदान हुन पूर्व Chromium ले जडान रोकेका कारण तपाईंको जानकारी अझै पनि सुरक्षित छ।</translation> <translation id="9106062320799175032">बिल पठाउने ठेगाना थप्नुहोस्</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index 8fa202d..63d0b1c 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -1681,6 +1681,7 @@ <translation id="5518670652865028077">Kunst og underholdning</translation> <translation id="5519516356611866228">Med endringene dine</translation> <translation id="5523118979700054094">Navn på retningslinje</translation> +<translation id="5525755241743357906">En fil ble kopiert eller flyttet</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" /> – trykk på Tab og deretter på Enter for å gi tilgjengelighetsverktøyene dine personlig preg i ChromeOS-innstillingene</translation> <translation id="5528532273234423708">Smarthus</translation> <translation id="55293785478302737">Kantstifting</translation> @@ -2932,6 +2933,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" /> – trykk på Tab og deretter på Enter for å angi Chrome som systemets standardnettleser i iOS-innstillingene</translation> <translation id="9096679202588811390">TV-programmer og -serier</translation> <translation id="9101630580131696064">Skuff 1</translation> +<translation id="9102081333385212048">Filer du kopierer eller flytter, blir sendt til Google Cloud eller tredjeparter for analyse. De kan for eksempel bli skannet for sensitive data eller skadelig programvare.</translation> <translation id="9103537084693478942">Videoprogramvare</translation> <translation id="9103872766612412690"><ph name="SITE" /> bruker vanligvis kryptering for å beskytte informasjonen din. Da Chromium prøvde å koble til <ph name="SITE" /> denne gangen, sendte nettstedet tilbake uvanlig og feil legitimasjon. Dette kan skje hvis en angriper prøver å utgi seg for å være <ph name="SITE" />, eller hvis en Wi-Fi-påloggingsskjerm har avbrutt tilkoblingen. Informasjonen din er likevel sikker fordi Chromium stoppet tilkoblingen før det ble utvekslet noen data.</translation> <translation id="9106062320799175032">Legg til faktureringsadresse</translation>
diff --git a/components/strings/components_strings_or.xtb b/components/strings/components_strings_or.xtb index 185f029..b16f4cc 100644 --- a/components/strings/components_strings_or.xtb +++ b/components/strings/components_strings_or.xtb
@@ -1068,6 +1068,7 @@ <translation id="3835233591525155343">ଆପଣଙ୍କ ଡିଭାଇସର ବ୍ୟବହାର</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, ଶୀଘ୍ର ଏକ ନୂଆ Google Doc ତିଆରି କରିବାକୁ Tab କରି Enter ଦବାନ୍ତୁ</translation> <translation id="385051799172605136">ପଛକୁ</translation> +<translation id="3853684360927654006">ପାସୱାର୍ଡ କ୍ଷମତା କାଲକୁଲେଟର</translation> <translation id="3858027520442213535">ତାରିଖ ଓ ସମୟ ଅପ୍ଡେଟ୍ କରନ୍ତୁ</translation> <translation id="3858860766373142691">ନାମ</translation> <translation id="3872834068356954457">ବିଜ୍ଞାନ</translation>
diff --git a/components/strings/components_strings_pa.xtb b/components/strings/components_strings_pa.xtb index 246391c..97f06e7 100644 --- a/components/strings/components_strings_pa.xtb +++ b/components/strings/components_strings_pa.xtb
@@ -1068,6 +1068,7 @@ <translation id="3835233591525155343">ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦੀ ਵਰਤੋਂ</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, ਤੇਜ਼ੀ ਨਾਲ ਨਵਾਂ Google ਡੌਕ ਬਣਾਉਣ ਲਈ Tab ਦਬਾ ਕੇ ਫਿਰ Enter ਦਬਾਓ</translation> <translation id="385051799172605136">ਪਿੱਛੇ</translation> +<translation id="3853684360927654006">ਪਾਸਵਰਡ ਦੀ ਮਜ਼ਬੂਤੀ ਨੂੰ ਮਾਪਣ ਲਈ ਕੈਲਕੁਲੇਟਰ</translation> <translation id="3858027520442213535">ਤਾਰੀਖ ਅਤੇ ਸਮਾਂ ਅੱਪਡੇਟ ਕਰੋ</translation> <translation id="3858860766373142691">ਨਾਮ</translation> <translation id="3872834068356954457">ਵਿਗਿਆਨ</translation> @@ -1678,6 +1679,7 @@ <translation id="5518670652865028077">ਕਲਾ ਅਤੇ ਮਨੋਰੰਜਨ</translation> <translation id="5519516356611866228">ਤੁਹਾਡੀਆਂ ਤਬਦੀਲੀਆਂ ਨਾਲ</translation> <translation id="5523118979700054094">ਨੀਤੀ ਦਾ ਨਾਮ</translation> +<translation id="5525755241743357906">ਫ਼ਾਈਲ ਨੂੰ ਕਾਪੀ ਕੀਤਾ ਜਾਂ ਕਿਸੇ ਹੋਰ ਥਾਂ 'ਤੇ ਲਿਜਾਇਆ ਜਾਂਦਾ ਹੈ</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />, Tab ਦਬਾ ਕੇ, ਫਿਰ ChromeOS ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਆਪਣੇ ਪਹੁੰਚਯੋਗਤਾ ਟੂਲਾਂ ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾਉਣ ਲਈ Enter ਦਬਾਓ</translation> <translation id="5528532273234423708">ਹੋਮ ਆਟੋਮੇਸ਼ਨ</translation> <translation id="55293785478302737">ਕਿਨਾਰੇ ਤੋਂ ਸਿਲਾਈ</translation> @@ -2929,6 +2931,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />, iOS ਸੈਟਿੰਗਾਂ ਵਿੱਚ Chrome ਨੂੰ ਸਿਸਟਮ ਦੇ ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਬ੍ਰਾਊਜ਼ਰ ਵਜੋਂ ਸੈੱਟ ਕਰਨ ਲਈ Tab ਦਬਾ ਕੇ, ਫਿਰ Enter ਦਬਾਓ</translation> <translation id="9096679202588811390">ਟੀਵੀ ਸ਼ੋਅ ਅਤੇ ਪ੍ਰੋਗਰਾਮ</translation> <translation id="9101630580131696064">ਟ੍ਰੇਅ 1</translation> +<translation id="9102081333385212048">ਤੁਹਾਡੇ ਵੱਲੋਂ ਕਾਪੀ ਕੀਤੀਆਂ ਜਾਂ ਕਿਸੇ ਹੋਰ ਥਾਂ 'ਤੇ ਲਿਜਾਈਆਂ ਜਾਣ ਵਾਲੀਆਂ ਫ਼ਾਈਲਾਂ ਨੂੰ Google ਕਲਾਊਡ ਜਾਂ ਤੀਜੀਆਂ ਧਿਰਾਂ ਨੂੰ ਵਿਸ਼ਲੇਸ਼ਣ ਲਈ ਭੇਜਿਆ ਜਾਂਦਾ ਹੈ। ਉਦਾਹਰਨ ਲਈ, ਉਨ੍ਹਾਂ ਨੂੰ ਸੰਵੇਦਨਸ਼ੀਲ ਡਾਟੇ ਜਾਂ ਮਾਲਵੇਅਰ ਲਈ ਸਕੈਨ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।</translation> <translation id="9103537084693478942">ਵੀਡੀਓ ਸਾਫ਼ਟਵੇਅਰ</translation> <translation id="9103872766612412690"><ph name="SITE" /> ਆਮ ਤੌਰ 'ਤੇ ਤੁਹਾਡੀ ਜਾਣਕਾਰੀ ਦੀ ਰੱਖਿਆ ਲਈ ਇਨਕ੍ਰਿਪਸ਼ਨ ਵਰਤਦੀ ਹੈ। ਜਦੋਂ Chromium ਨੇ ਇਸ ਵਾਰ <ph name="SITE" /> ਨਾਲ ਕਨੈਕਟ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ, ਤਾਂ ਵੈੱਬਸਾਈਟ ਨੇ ਅਸਧਾਰਨ ਅਤੇ ਗਲਤ ਕ੍ਰੀਡੈਂਸ਼ੀਅਲ ਵਾਪਸ ਭੇਜੇ। ਕਿਸੇ ਹਮਲਾਵਰ ਵੱਲੋਂ <ph name="SITE" /> ਹੋਣ ਦਾ ਦਾਅਵਾ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਜਾਂ ਕਿਸੇ ਵਾਈ-ਫਾਈ ਸਾਈਨ-ਇਨ ਸਕ੍ਰੀਨ ਵੱਲੋਂ ਕਨੈਕਸ਼ਨ ਰੋਕ ਦਿੱਤਾ ਜਾਣਾ ਇਸ ਦਾ ਕਾਰਨ ਹੋ ਸਕਦਾ ਹੈ। ਤੁਹਾਡੀ ਜਾਣਕਾਰੀ ਹਾਲੇ ਵੀ ਸੁਰੱਖਿਅਤ ਹੈ ਕਿਉਂਕਿ Chromium ਨੇ ਕੋਈ ਡਾਟਾ ਐਕਸਚੇਂਜ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਹੀ ਕਨੈਕਸ਼ਨ ਬੰਦ ਕਰ ਦਿੱਤਾ ਸੀ।</translation> <translation id="9106062320799175032">ਬਿਲਿੰਗ ਪਤਾ ਸ਼ਾਮਲ ਕਰੋ</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb index 7b28fd0..c550ab5 100644 --- a/components/strings/components_strings_pl.xtb +++ b/components/strings/components_strings_pl.xtb
@@ -1681,6 +1681,7 @@ <translation id="5518670652865028077">Sztuka i rozrywka</translation> <translation id="5519516356611866228">Z Twoimi zmianami</translation> <translation id="5523118979700054094">Nazwa zasady</translation> +<translation id="5525755241743357906">Plik jest kopiowany lub przenoszony</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />; aby spersonalizować narzędzia ułatwień dostępu w ustawieniach Chrome OS, naciśnij Tab, a potem Enter</translation> <translation id="5528532273234423708">Inteligentny dom</translation> <translation id="55293785478302737">Zszywanie wzdłuż krawędzi</translation> @@ -2933,6 +2934,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />, naciśnij Tab, a potem Enter, aby ustawić Chrome jako domyślną przeglądarkę systemową w ustawieniach iOS</translation> <translation id="9096679202588811390">Programy telewizyjne i seriale</translation> <translation id="9101630580131696064">Taca 1</translation> +<translation id="9102081333385212048">Kopiowane lub przenoszone pliki są wysyłane do Google Cloud albo innych firm w celu analizy. Na przykład mogą zostać przeskanowane w poszukiwaniu danych wrażliwych lub złośliwego oprogramowania.</translation> <translation id="9103537084693478942">Oprogramowanie wideo</translation> <translation id="9103872766612412690"><ph name="SITE" /> zazwyczaj używa szyfrowania do ochrony Twoich informacji. Gdy tym razem przeglądarka Chromium próbowała połączyć się ze stroną <ph name="SITE" />, odesłała ona nietypowe i nieprawidłowe dane logowania. Może się tak zdarzyć, gdy pod stronę <ph name="SITE" /> podszywa się osoba atakująca albo gdy ekran logowania do sieci Wi-Fi przerwie połączenie. Twoje informacje są nadal bezpieczne, bo połączenie w Chromium zakończyło się przed wymianą jakichkolwiek danych.</translation> <translation id="9106062320799175032">Dodaj adres rozliczeniowy</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb index af734fd..b0b7a9d 100644 --- a/components/strings/components_strings_pt-BR.xtb +++ b/components/strings/components_strings_pt-BR.xtb
@@ -1071,6 +1071,7 @@ <translation id="3835233591525155343">Uso do seu dispositivo</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />. Pressione Tab e depois Enter para criar rapidamente um novo arquivo do Documentos Google</translation> <translation id="385051799172605136">Voltar</translation> +<translation id="3853684360927654006">Calculadora de nível de segurança da senha</translation> <translation id="3858027520442213535">Atualizar data e hora</translation> <translation id="3858860766373142691">Nome</translation> <translation id="3872834068356954457">Ciência</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb index 8d869bb..368c8ee 100644 --- a/components/strings/components_strings_sk.xtb +++ b/components/strings/components_strings_sk.xtb
@@ -1067,6 +1067,7 @@ <translation id="3835233591525155343">Používanie vášho zariadenia</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, postupným stlačením klávesov Tab a Enter vytvoríte rýchlym spôsobom nový dokument Google</translation> <translation id="385051799172605136">Späť</translation> +<translation id="3853684360927654006">Kalkulačka na výpočet sily hesla</translation> <translation id="3858027520442213535">Aktualizovať dátum a čas</translation> <translation id="3858860766373142691">Názov</translation> <translation id="3872834068356954457">Veda</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb index 2abc4b19..d70d7cc 100644 --- a/components/strings/components_strings_sl.xtb +++ b/components/strings/components_strings_sl.xtb
@@ -1071,6 +1071,7 @@ <translation id="3835233591525155343">Uporaba naprave</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, pritisnite tabulatorko, nato Enter, če želite hitro ustvariti nov Google Dokument</translation> <translation id="385051799172605136">Nazaj</translation> +<translation id="3853684360927654006">Računalo za zapletenost gesla</translation> <translation id="3858027520442213535">Posodobi datum in uro</translation> <translation id="3858860766373142691">Ime</translation> <translation id="3872834068356954457">Znanost</translation> @@ -1681,6 +1682,7 @@ <translation id="5518670652865028077">Umetnost in zabava</translation> <translation id="5519516356611866228">Z vašimi spremembami</translation> <translation id="5523118979700054094">Ime pravilnika</translation> +<translation id="5525755241743357906">Datoteka je kopirana ali premaknjena</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />, pritisnite tabulatorko, nato Enter, če želite osebno prilagoditi orodja za ljudi s posebnimi potrebami v nastavitvah sistema Chrome OS.</translation> <translation id="5528532273234423708">Avtomatizacija doma</translation> <translation id="55293785478302737">Robni šiv</translation> @@ -2933,6 +2935,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />, pritisnite tabulatorko, nato tipko Enter, če želite nastaviti Chrome kot privzeti brskalnik sistema v nastavitvah sistema iOS.</translation> <translation id="9096679202588811390">Televizijske oddaje in programi</translation> <translation id="9101630580131696064">Pladenj 1</translation> +<translation id="9102081333385212048">Datoteke, ki jih kopirate ali premaknete, so poslane storitvi Google Cloud ali tretjim osebam v analizo. Lahko jih na primer pregledamo, da bi ugotovili, ali vsebujejo občutljive podatke ali zlonamerno programsko opremo.</translation> <translation id="9103537084693478942">Programska oprema za videoposnetke</translation> <translation id="9103872766612412690">Spletno mesto <ph name="SITE" /> za zaščito vaših podatkov običajno uporablja šifriranje. Ko se je Chromium tokrat poskusil povezati s spletnim mestom <ph name="SITE" />, je to vrnilo nenavadne in nepravilne poverilnice. Do tega lahko pride, če se napadalec lažno predstavlja za spletno mesto <ph name="SITE" /> ali če je povezavo prekinil zaslon za prijavo v omrežje Wi-Fi. Vaši podatki so še vedno varni, saj je Chromium pred izmenjavo podatkov prekinil povezavo.</translation> <translation id="9106062320799175032">Dodajanje naslova za izstavitev računa</translation>
diff --git a/components/strings/components_strings_sr-Latn.xtb b/components/strings/components_strings_sr-Latn.xtb index c8c6596..8ffd393f8 100644 --- a/components/strings/components_strings_sr-Latn.xtb +++ b/components/strings/components_strings_sr-Latn.xtb
@@ -1071,6 +1071,7 @@ <translation id="3835233591525155343">Korišćenje uređaja</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, pritisnite Tab, pa Enter da biste brzo napravili nov Google dokument</translation> <translation id="385051799172605136">Nazad</translation> +<translation id="3853684360927654006">Kalkulator snage lozinke</translation> <translation id="3858027520442213535">Ažurirajte datum i vreme</translation> <translation id="3858860766373142691">Naziv</translation> <translation id="3872834068356954457">Nauka</translation> @@ -1681,6 +1682,7 @@ <translation id="5518670652865028077">Umetnost i zabava</translation> <translation id="5519516356611866228">Sa promenama</translation> <translation id="5523118979700054094">Naziv smernica</translation> +<translation id="5525755241743357906">Fajl je kopiran ili premešten</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />, pritisnite Tab, pa Enter da biste personalizovali alatke za pristupačnost u podešavanjima Chrome OS-a</translation> <translation id="5528532273234423708">Automatizacija doma</translation> <translation id="55293785478302737">Spajanje ivica šavom</translation> @@ -2933,6 +2935,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />, pritisnite tab, pa Enter da biste podesili Chrome kao podrazumevani pregledač sistema u podešavanjima iOS-a</translation> <translation id="9096679202588811390">TV emisije i programi</translation> <translation id="9101630580131696064">1. fioka</translation> +<translation id="9102081333385212048">Fajlovi koje kopirate ili premestite se šalju u Google Cloud ili trećim stranama na analizu. Na primer, možda će se skenirati u potrazi za osetljivim podacima ili malverom.</translation> <translation id="9103537084693478942">Softver za obradu videa</translation> <translation id="9103872766612412690"><ph name="SITE" /> obično koristi šifrovanje da bi zaštitio informacije. Kada je Chromium ovog puta pokušao da se poveže sa <ph name="SITE" />, veb-sajt je vratio neobične i netačne akreditive. Ili napadač pokušava da se predstavi kao <ph name="SITE" /> ili je ekran za WiFi prijavljivanje prekinuo vezu. Informacije su i dalje bezbedne zato što je Chromium prekinuo vezu pre nego što su razmenjeni bilo kakvi podaci.</translation> <translation id="9106062320799175032">Dodajte adresu za obračun</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index 92592d20..579f9d2 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -1071,6 +1071,7 @@ <translation id="3835233591525155343">Коришћење уређаја</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, притисните Tab, па Enter да бисте брзо направили нов Google документ</translation> <translation id="385051799172605136">Назад</translation> +<translation id="3853684360927654006">Калкулатор снаге лозинке</translation> <translation id="3858027520442213535">Ажурирајте датум и време</translation> <translation id="3858860766373142691">Назив</translation> <translation id="3872834068356954457">Наука</translation> @@ -1681,6 +1682,7 @@ <translation id="5518670652865028077">Уметност и забава</translation> <translation id="5519516356611866228">Са променама</translation> <translation id="5523118979700054094">Назив смерница</translation> +<translation id="5525755241743357906">Фајл је копиран или премештен</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />, притисните Tab, па Enter да бисте персонализовали алатке за приступачност у подешавањима Chrome ОС-а</translation> <translation id="5528532273234423708">Аутоматизација дома</translation> <translation id="55293785478302737">Спајање ивица шавом</translation> @@ -2933,6 +2935,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />, притисните tab, па Enter да бисте подесили Chrome као подразумевани прегледач система у подешавањима iOS-а</translation> <translation id="9096679202588811390">ТВ емисије и програми</translation> <translation id="9101630580131696064">1. фиока</translation> +<translation id="9102081333385212048">Фајлови које копирате или преместите се шаљу у Google Cloud или трећим странама на анализу. На пример, можда ће се скенирати у потрази за осетљивим подацима или малвером.</translation> <translation id="9103537084693478942">Софтвер за обраду видеа</translation> <translation id="9103872766612412690"><ph name="SITE" /> обично користи шифровање да би заштитио информације. Када је Chromium овог пута покушао да се повеже са <ph name="SITE" />, веб-сајт је вратио необичне и нетачне акредитиве. Или нападач покушава да се представи као <ph name="SITE" /> или је екран за WiFi пријављивање прекинуо везу. Информације су и даље безбедне зато што је Chromium прекинуо везу пре него што су размењени било какви подаци.</translation> <translation id="9106062320799175032">Додајте адресу за обрачун</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb index ae15a7b6..f5658c5 100644 --- a/components/strings/components_strings_ta.xtb +++ b/components/strings/components_strings_ta.xtb
@@ -1678,6 +1678,7 @@ <translation id="5518670652865028077">கலை & பொழுதுபோக்கு</translation> <translation id="5519516356611866228">நான் செய்த மாற்றங்களுடன் பதிவிறக்கு</translation> <translation id="5523118979700054094">கொள்கைப் பெயர்</translation> +<translation id="5525755241743357906">ஃபைல் நகலெடுக்கப்பட்டது அல்லது நகர்த்தப்பட்டது</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />. ChromeOS அமைப்புகளில் அணுகல் கருவிகளைப் பிரத்தியேகமாக்க, Tab பட்டனை அழுத்திவிட்டு Enter பட்டனை அழுத்துங்கள்</translation> <translation id="5528532273234423708">வீட்டுத் தன்னியக்கமாக்கம்</translation> <translation id="55293785478302737">எட்ஜ் ஸ்டிட்ச்</translation> @@ -2929,6 +2930,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />, iOS அமைப்புகளுக்குச் சென்று சிஸ்டத்தின் இயல்பு உலாவியாக Chromeமை அமைக்க, Tab பட்டனை அழுத்திவிட்டு Enter பட்டனை அழுத்துங்கள்</translation> <translation id="9096679202588811390">டிவி ஷோக்கள் & நிகழ்ச்சிகள்</translation> <translation id="9101630580131696064">தட்டு 1</translation> +<translation id="9102081333385212048">நீங்கள் நகலெடுக்கும் அல்லது நகர்த்தும் ஃபைல்கள் Google கிளவுடுக்கோ மூன்றாம் தரப்பினருக்கோ பகுப்பாய்வுக்காக அனுப்பப்படும். எடுத்துக்காட்டாக, பாதுகாக்கப்பட வேண்டிய தனிப்பட்ட தரவோ மால்வேரோ உள்ளதா என்று கண்டறிவதற்காக அவை ஸ்கேன் செய்யப்படலாம்.</translation> <translation id="9103537084693478942">வீடியோ மென்பொருள்</translation> <translation id="9103872766612412690">வழக்கமாக, <ph name="SITE" /> உங்கள் தகவலைப் பாதுகாப்பதற்காக என்க்ரிப்ஷனைப் பயன்படுத்துகிறது. இந்த முறை <ph name="SITE" /> உடன் இணைவதற்கு Chromium முயற்சித்தபோது வழக்கத்திற்கு மாறான, தவறான நற்சான்றிதழ்களை இணையதளம் வழங்கியது. தாக்குபவர் தன்னை <ph name="SITE" /> ஆகக் காட்ட முயற்சிக்கும் போது அல்லது இணைப்பை வைஃபை உள்நுழைவுத் திரை குறுக்கிடும் போது இது ஏற்படலாம். இருப்பினும், தரவு எதுவும் பரிமாற்றப்படுவதற்கு முன் Chromium இணைப்பை நிறுத்தியதால் உங்கள் தகவல் பாதுகாப்பாகவே இருக்கிறது.</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb index f43ea99..1c8192b 100644 --- a/components/strings/components_strings_uk.xtb +++ b/components/strings/components_strings_uk.xtb
@@ -1071,6 +1071,7 @@ <translation id="3835233591525155343">Дані про активний стан пристрою</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />; натисніть Tab, а потім – Enter, щоб швидко створити новий документ Google</translation> <translation id="385051799172605136">Назад</translation> +<translation id="3853684360927654006">Визначник надійності пароля</translation> <translation id="3858027520442213535">Оновити дату й час</translation> <translation id="3858860766373142691">Назва</translation> <translation id="3872834068356954457">Наука</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb index 42779cc..fa15dc4a 100644 --- a/components/strings/components_strings_vi.xtb +++ b/components/strings/components_strings_vi.xtb
@@ -1071,6 +1071,7 @@ <translation id="3835233591525155343">Hoạt động dùng thiết bị của bạn</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, nhấn phím Tab rồi nhấn phím Enter để tạo nhanh một tài liệu mới trong Google Tài liệu</translation> <translation id="385051799172605136">Quay lại</translation> +<translation id="3853684360927654006">Công cụ đo độ mạnh mật khẩu</translation> <translation id="3858027520442213535">Cập nhật ngày và giờ</translation> <translation id="3858860766373142691">Tên</translation> <translation id="3872834068356954457">Khoa học</translation> @@ -1681,6 +1682,7 @@ <translation id="5518670652865028077">Nghệ thuật và giải trí</translation> <translation id="5519516356611866228">Bao gồm các thay đổi của bạn</translation> <translation id="5523118979700054094">Tên chính sách</translation> +<translation id="5525755241743357906">Tệp sẽ được sao chép hoặc di chuyển</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />, Nhấn phím Tab rồi nhấn phím Enter để cá nhân hoá các công cụ hỗ trợ tiếp cận của bạn trong phần cài đặt ChromeOS</translation> <translation id="5528532273234423708">Tự động hoá nhà</translation> <translation id="55293785478302737">May viền</translation> @@ -2934,6 +2936,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />, Nhấn Tab rồi nhấn Enter để đặt Chrome làm trình duyệt mặc định của hệ thống trong phần cài đặt iOS</translation> <translation id="9096679202588811390">Chương trình truyền hình</translation> <translation id="9101630580131696064">Khay 1</translation> +<translation id="9102081333385212048">Các tệp mà bạn sao chép hoặc di chuyển sẽ được gửi cho Google Cloud hoặc bên thứ ba phân tích. Ví dụ: Các tệp đó có thể được quét tìm dữ liệu nhạy cảm hoặc phần mềm độc hại.</translation> <translation id="9103537084693478942">Phần mềm video</translation> <translation id="9103872766612412690"><ph name="SITE" /> thường sử dụng mã hóa để bảo vệ thông tin của bạn. Khi Chromium cố gắng kết nối với <ph name="SITE" /> tại thời điểm này, trang web đã gửi lại thông tin đăng nhập không chính xác và bất thường. Điều này có thể xảy ra khi kẻ tấn công đang cố gắng giả mạo là <ph name="SITE" /> hoặc màn hình đăng nhập Wi-Fi đã làm gián đoạn kết nối. Thông tin của bạn vẫn an toàn do Chromium đã ngừng kết nối trước khi bất kỳ dữ liệu nào được trao đổi.</translation> <translation id="9106062320799175032">Thêm địa chỉ thanh toán</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb index c6b6ece..4cf0d74 100644 --- a/components/strings/components_strings_zh-CN.xtb +++ b/components/strings/components_strings_zh-CN.xtb
@@ -1677,6 +1677,7 @@ <translation id="5518670652865028077">艺术与娱乐</translation> <translation id="5519516356611866228">含您所做更改</translation> <translation id="5523118979700054094">政策名</translation> +<translation id="5525755241743357906">文件已复制或移动</translation> <translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />,依次按 Tab 键和 Enter 键即可在 Chrome 操作系统设置中定制您的个性化无障碍工具</translation> <translation id="5528532273234423708">家居自动化</translation> <translation id="55293785478302737">边缘装订</translation> @@ -2929,6 +2930,7 @@ <translation id="9096425087209440047"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />,依次按 Tab 键和 Enter 键即可在 iOS 设置中将 Chrome 设置为系统的默认浏览器</translation> <translation id="9096679202588811390">电视节目</translation> <translation id="9101630580131696064">纸匣 1</translation> +<translation id="9102081333385212048">系统会将您复制或移动的文件发送给 Google Cloud 或第三方以供分析。例如,可能通过扫描来确定文件是否包含敏感数据或恶意软件。</translation> <translation id="9103537084693478942">视频软件</translation> <translation id="9103872766612412690"><ph name="SITE" /> 通常会使用加密技术来保护您的信息。Chromium 此次尝试连接到 <ph name="SITE" /> 时,此网站发回了异常的错误凭据。这可能是因为有攻击者在试图冒充 <ph name="SITE" />,或 Wi-Fi 登录屏幕中断了此次连接。请放心,您的信息仍然是安全的,因为 Chromium 尚未进行任何数据交换便停止了连接。</translation> <translation id="9106062320799175032">添加帐单邮寄地址</translation>
diff --git a/components/sync/chromeos/lacros/BUILD.gn b/components/sync/chromeos/lacros/BUILD.gn index e84be71..281c5bd 100644 --- a/components/sync/chromeos/lacros/BUILD.gn +++ b/components/sync/chromeos/lacros/BUILD.gn
@@ -10,6 +10,8 @@ "fake_sync_explicit_passphrase_client_ash.h", "fake_sync_mojo_service.cc", "fake_sync_mojo_service.h", + "fake_sync_user_settings_client_ash.cc", + "fake_sync_user_settings_client_ash.h", ] public_deps = [ "//chromeos/crosapi/mojom",
diff --git a/components/sync/chromeos/lacros/fake_sync_mojo_service.cc b/components/sync/chromeos/lacros/fake_sync_mojo_service.cc index e7e0884..dc49aef 100644 --- a/components/sync/chromeos/lacros/fake_sync_mojo_service.cc +++ b/components/sync/chromeos/lacros/fake_sync_mojo_service.cc
@@ -25,8 +25,7 @@ void FakeSyncMojoService::BindUserSettingsClient( mojo::PendingReceiver<crosapi::mojom::SyncUserSettingsClient> receiver) { - // TODO(crbug.com/1330894): support SyncUserSettingsClient logic. - NOTIMPLEMENTED(); + fake_sync_user_settings_client_ash_.BindReceiver(std::move(receiver)); } void FakeSyncMojoService::BindReceiver( @@ -39,4 +38,9 @@ return fake_sync_explicit_passphrase_client_ash_; } +FakeSyncUserSettingsClientAsh& +FakeSyncMojoService::GetFakeSyncUserSettingsClientAsh() { + return fake_sync_user_settings_client_ash_; +} + } // namespace syncer
diff --git a/components/sync/chromeos/lacros/fake_sync_mojo_service.h b/components/sync/chromeos/lacros/fake_sync_mojo_service.h index dd47ae66..fad941d3 100644 --- a/components/sync/chromeos/lacros/fake_sync_mojo_service.h +++ b/components/sync/chromeos/lacros/fake_sync_mojo_service.h
@@ -7,6 +7,7 @@ #include "chromeos/crosapi/mojom/sync.mojom.h" #include "components/sync/chromeos/lacros/fake_sync_explicit_passphrase_client_ash.h" +#include "components/sync/chromeos/lacros/fake_sync_user_settings_client_ash.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver_set.h" @@ -35,9 +36,11 @@ void BindReceiver( mojo::PendingReceiver<crosapi::mojom::SyncService> receiver); FakeSyncExplicitPassphraseClientAsh& GetFakeSyncExplicitPassphraseClientAsh(); + FakeSyncUserSettingsClientAsh& GetFakeSyncUserSettingsClientAsh(); private: FakeSyncExplicitPassphraseClientAsh fake_sync_explicit_passphrase_client_ash_; + FakeSyncUserSettingsClientAsh fake_sync_user_settings_client_ash_; mojo::ReceiverSet<crosapi::mojom::SyncService> receivers_; };
diff --git a/components/sync/chromeos/lacros/fake_sync_user_settings_client_ash.cc b/components/sync/chromeos/lacros/fake_sync_user_settings_client_ash.cc new file mode 100644 index 0000000..ba5e1337 --- /dev/null +++ b/components/sync/chromeos/lacros/fake_sync_user_settings_client_ash.cc
@@ -0,0 +1,41 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/sync/chromeos/lacros/fake_sync_user_settings_client_ash.h" + +#include <utility> + +#include "chromeos/crosapi/mojom/sync.mojom.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/pending_remote.h" + +namespace syncer { + +FakeSyncUserSettingsClientAsh::FakeSyncUserSettingsClientAsh() = default; +FakeSyncUserSettingsClientAsh::~FakeSyncUserSettingsClientAsh() = default; + +void FakeSyncUserSettingsClientAsh::AddObserver( + mojo::PendingRemote<crosapi::mojom::SyncUserSettingsClientObserver> + observer) { + observers_.Add(std::move(observer)); +} + +void FakeSyncUserSettingsClientAsh::IsAppsSyncEnabled( + IsAppsSyncEnabledCallback callback) { + std::move(callback).Run(apps_sync_is_enabled_); +} + +void FakeSyncUserSettingsClientAsh::BindReceiver( + mojo::PendingReceiver<crosapi::mojom::SyncUserSettingsClient> receiver) { + receivers_.Add(this, std::move(receiver)); +} + +void FakeSyncUserSettingsClientAsh::SetAppsSyncIsEnabled(bool enabled) { + apps_sync_is_enabled_ = enabled; + for (auto& observer : observers_) { + observer->OnAppsSyncEnabledChanged(enabled); + } +} + +} // namespace syncer
diff --git a/components/sync/chromeos/lacros/fake_sync_user_settings_client_ash.h b/components/sync/chromeos/lacros/fake_sync_user_settings_client_ash.h new file mode 100644 index 0000000..61a3c1de --- /dev/null +++ b/components/sync/chromeos/lacros/fake_sync_user_settings_client_ash.h
@@ -0,0 +1,45 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_SYNC_CHROMEOS_LACROS_FAKE_SYNC_USER_SETTINGS_CLIENT_ASH_H_ +#define COMPONENTS_SYNC_CHROMEOS_LACROS_FAKE_SYNC_USER_SETTINGS_CLIENT_ASH_H_ + +#include "chromeos/crosapi/mojom/sync.mojom.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/receiver_set.h" +#include "mojo/public/cpp/bindings/remote_set.h" + +namespace syncer { + +// Mimics the behavior of SyncUserSettingsClientAsh. +class FakeSyncUserSettingsClientAsh + : public crosapi::mojom::SyncUserSettingsClient { + public: + constexpr static bool kDefaultAppsSyncIsEnabled = true; + + FakeSyncUserSettingsClientAsh(); + ~FakeSyncUserSettingsClientAsh() override; + + // crosapi::mojom::SyncUserSettingsClient implementation + void AddObserver( + mojo::PendingRemote<crosapi::mojom::SyncUserSettingsClientObserver> + observer) override; + void IsAppsSyncEnabled(IsAppsSyncEnabledCallback callback) override; + + // Own methods. + void BindReceiver( + mojo::PendingReceiver<crosapi::mojom::SyncUserSettingsClient> receiver); + void SetAppsSyncIsEnabled(bool enabled); + + private: + bool apps_sync_is_enabled_ = kDefaultAppsSyncIsEnabled; + + mojo::ReceiverSet<crosapi::mojom::SyncUserSettingsClient> receivers_; + mojo::RemoteSet<crosapi::mojom::SyncUserSettingsClientObserver> observers_; +}; + +} // namespace syncer + +#endif // COMPONENTS_SYNC_CHROMEOS_LACROS_FAKE_SYNC_USER_SETTINGS_CLIENT_ASH_H_
diff --git a/components/sync/driver/data_type_controller.h b/components/sync/driver/data_type_controller.h index 069fa89..9c7e5bc 100644 --- a/components/sync/driver/data_type_controller.h +++ b/components/sync/driver/data_type_controller.h
@@ -13,6 +13,7 @@ #include "base/callback.h" #include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" +#include "base/values.h" #include "components/sync/base/model_type.h" #include "components/sync/engine/shutdown_reason.h" #include "components/sync/model/data_type_error_handler.h" @@ -50,8 +51,7 @@ using StopCallback = base::OnceClosure; using AllNodesCallback = - base::OnceCallback<void(const ModelType, - std::unique_ptr<base::ListValue>)>; + base::OnceCallback<void(const ModelType, base::Value::List)>; using TypeMap = std::map<ModelType, std::unique_ptr<DataTypeController>>; using TypeVector = std::vector<std::unique_ptr<DataTypeController>>;
diff --git a/components/sync/driver/fake_sync_service.cc b/components/sync/driver/fake_sync_service.cc index 1a300f02..405f14d4e 100644 --- a/components/sync/driver/fake_sync_service.cc +++ b/components/sync/driver/fake_sync_service.cc
@@ -142,7 +142,7 @@ ProtocolEventObserver* observer) {} void FakeSyncService::GetAllNodesForDebugging( - base::OnceCallback<void(std::unique_ptr<base::ListValue>)> callback) {} + base::OnceCallback<void(base::Value::List)> callback) {} void FakeSyncService::SetInvalidationsForSessionsEnabled(bool enabled) {}
diff --git a/components/sync/driver/fake_sync_service.h b/components/sync/driver/fake_sync_service.h index a7b9830..34e6b92f 100644 --- a/components/sync/driver/fake_sync_service.h +++ b/components/sync/driver/fake_sync_service.h
@@ -61,8 +61,7 @@ void AddProtocolEventObserver(ProtocolEventObserver* observer) override; void RemoveProtocolEventObserver(ProtocolEventObserver* observer) override; void GetAllNodesForDebugging( - base::OnceCallback<void(std::unique_ptr<base::ListValue>)> callback) - override; + base::OnceCallback<void(base::Value::List)> callback) override; void SetInvalidationsForSessionsEnabled(bool enabled) override; void AddTrustedVaultDecryptionKeysFromWeb( const std::string& gaia_id,
diff --git a/components/sync/driver/glue/sync_engine_backend.h b/components/sync/driver/glue/sync_engine_backend.h index 183119e..4282948 100644 --- a/components/sync/driver/glue/sync_engine_backend.h +++ b/components/sync/driver/glue/sync_engine_backend.h
@@ -37,8 +37,7 @@ public SyncManager::Observer { public: using AllNodesCallback = - base::OnceCallback<void(const ModelType, - std::unique_ptr<base::ListValue>)>; + base::OnceCallback<void(const ModelType, base::Value::List)>; // Struct that allows passing back data upon init, for data previously // produced by SyncEngineBackend (which doesn't itself have the ability to
diff --git a/components/sync/driver/mock_sync_service.h b/components/sync/driver/mock_sync_service.h index 703cbb5..cf506d0 100644 --- a/components/sync/driver/mock_sync_service.h +++ b/components/sync/driver/mock_sync_service.h
@@ -123,11 +123,10 @@ RemoveProtocolEventObserver, (ProtocolEventObserver * observer), (override)); - MOCK_METHOD( - void, - GetAllNodesForDebugging, - (base::OnceCallback<void(std::unique_ptr<base::ListValue>)> callback), - (override)); + MOCK_METHOD(void, + GetAllNodesForDebugging, + (base::OnceCallback<void(base::Value::List)> callback), + (override)); // KeyedService implementation. MOCK_METHOD(void, Shutdown, (), (override));
diff --git a/components/sync/driver/sync_internals_util.cc b/components/sync/driver/sync_internals_util.cc index bea2531..9db2f1a4 100644 --- a/components/sync/driver/sync_internals_util.cc +++ b/components/sync/driver/sync_internals_util.cc
@@ -13,7 +13,6 @@ #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" -#include "base/values.h" #include "build/chromeos_buildflags.h" #include "components/sync/base/time.h" #include "components/sync/driver/sync_service.h" @@ -272,11 +271,11 @@ // its contents. Most of the message consists of simple fields in // chrome://sync-internals which are grouped into sections and populated with // the help of the SyncStat classes defined above. -std::unique_ptr<base::DictionaryValue> ConstructAboutInformation( +base::Value::Dict ConstructAboutInformation( IncludeSensitiveData include_sensitive_data, SyncService* service, const std::string& channel) { - auto about_info = std::make_unique<base::DictionaryValue>(); + base::Value::Dict about_info; SectionList section_list; @@ -411,8 +410,7 @@ if (!service) { transport_state->Set("Sync service does not exist"); - about_info->SetKey(kDetailsKey, - section_list.ToValue(include_sensitive_data)); + about_info.Set(kDetailsKey, section_list.ToValue(include_sensitive_data)); return about_info; } @@ -566,7 +564,7 @@ // This list of sections belongs in the 'details' field of the returned // message. - about_info->SetKey(kDetailsKey, section_list.ToValue(include_sensitive_data)); + about_info.Set(kDetailsKey, section_list.ToValue(include_sensitive_data)); // The values set from this point onwards do not belong in the // details list. @@ -578,13 +576,13 @@ full_status.sync_protocol_error.error_type != UNKNOWN_ERROR && full_status.sync_protocol_error.error_type != SYNC_SUCCESS; - about_info->SetKey("actionable_error_detected", - base::Value(actionable_error_detected)); + about_info.Set("actionable_error_detected", + base::Value(actionable_error_detected)); // NOTE: We won't bother showing any of the following values unless // actionable_error_detected is set. - base::Value actionable_error(base::Value::Type::LIST); + base::Value::List actionable_error; Stat<std::string> error_type("Error Type", kUninitialized); Stat<std::string> action("Action", kUninitialized); Stat<std::string> description("Error Description", kUninitialized); @@ -599,23 +597,22 @@ actionable_error.Append(error_type.ToValue()); actionable_error.Append(action.ToValue()); actionable_error.Append(description.ToValue()); - about_info->SetKey("actionable_error", std::move(actionable_error)); + about_info.Set("actionable_error", std::move(actionable_error)); - about_info->SetKey("unrecoverable_error_detected", - base::Value(service->HasUnrecoverableError())); + about_info.Set("unrecoverable_error_detected", + base::Value(service->HasUnrecoverableError())); if (service->HasUnrecoverableError()) { std::string unrecoverable_error_message = "Unrecoverable error detected at " + service->GetUnrecoverableErrorLocationForDebugging().ToString() + ": " + service->GetUnrecoverableErrorMessageForDebugging(); - about_info->SetKey("unrecoverable_error_message", - base::Value(unrecoverable_error_message)); + about_info.Set("unrecoverable_error_message", + base::Value(unrecoverable_error_message)); } - about_info->SetKey( - "type_status", - base::Value::FromUniquePtrValue(service->GetTypeStatusMapForDebugging())); + about_info.Set("type_status", base::Value::FromUniquePtrValue( + service->GetTypeStatusMapForDebugging())); return about_info; }
diff --git a/components/sync/driver/sync_internals_util.h b/components/sync/driver/sync_internals_util.h index ab66e9c..ca60b5a 100644 --- a/components/sync/driver/sync_internals_util.h +++ b/components/sync/driver/sync_internals_util.h
@@ -9,12 +9,9 @@ #include <string> #include "base/types/strong_alias.h" +#include "base/values.h" #include "components/signin/public/identity_manager/account_info.h" -namespace base { -class DictionaryValue; -} - namespace syncer { class SyncService; @@ -79,7 +76,7 @@ // Note that |service| may be null. // If |include_sensitive_data| is false, Personally Identifiable Information // won't be included in the return value. -std::unique_ptr<base::DictionaryValue> ConstructAboutInformation( +base::Value::Dict ConstructAboutInformation( IncludeSensitiveData include_sensitive_data, SyncService* service, const std::string& channel);
diff --git a/components/sync/driver/sync_internals_util_unittest.cc b/components/sync/driver/sync_internals_util_unittest.cc index 37348861e..06f6c35 100644 --- a/components/sync/driver/sync_internals_util_unittest.cc +++ b/components/sync/driver/sync_internals_util_unittest.cc
@@ -19,10 +19,10 @@ service.SetDisableReasons( syncer::SyncService::DISABLE_REASON_UNRECOVERABLE_ERROR); - std::unique_ptr<base::DictionaryValue> strings(ConstructAboutInformation( - IncludeSensitiveData(true), &service, std::string())); + base::Value::Dict strings = ConstructAboutInformation( + IncludeSensitiveData(true), &service, std::string()); - EXPECT_TRUE(strings->FindKey("unrecoverable_error_detected")); + EXPECT_TRUE(strings.Find("unrecoverable_error_detected")); } } // namespace
diff --git a/components/sync/driver/sync_service.h b/components/sync/driver/sync_service.h index e4b0be2..968a94c 100644 --- a/components/sync/driver/sync_service.h +++ b/components/sync/driver/sync_service.h
@@ -14,6 +14,7 @@ #include "base/location.h" #include "base/memory/weak_ptr.h" #include "base/time/time.h" +#include "base/values.h" #include "components/keyed_service/core/keyed_service.h" #include "components/sync/base/model_type.h" #include "components/sync/driver/sync_service_observer.h" @@ -429,7 +430,7 @@ // For safety, the callback should be bound to some sort of WeakPtr<> or // scoped_refptr<>. virtual void GetAllNodesForDebugging( - base::OnceCallback<void(std::unique_ptr<base::ListValue>)> callback) = 0; + base::OnceCallback<void(base::Value::List)> callback) = 0; protected: SyncService() {}
diff --git a/components/sync/driver/sync_service_impl.cc b/components/sync/driver/sync_service_impl.cc index afcfd43b..5938c5d 100644 --- a/components/sync/driver/sync_service_impl.cc +++ b/components/sync/driver/sync_service_impl.cc
@@ -1550,30 +1550,28 @@ public: GetAllNodesRequestHelper( ModelTypeSet requested_types, - base::OnceCallback<void(std::unique_ptr<base::ListValue>)> callback); + base::OnceCallback<void(base::Value::List)> callback); GetAllNodesRequestHelper(const GetAllNodesRequestHelper&) = delete; GetAllNodesRequestHelper& operator=(const GetAllNodesRequestHelper&) = delete; void OnReceivedNodesForType(const ModelType type, - std::unique_ptr<base::ListValue> node_list); + base::Value::List node_list); private: friend class base::RefCountedThreadSafe<GetAllNodesRequestHelper>; virtual ~GetAllNodesRequestHelper(); - std::unique_ptr<base::ListValue> result_accumulator_; + base::Value::List result_accumulator_; ModelTypeSet awaiting_types_; - base::OnceCallback<void(std::unique_ptr<base::ListValue>)> callback_; + base::OnceCallback<void(base::Value::List)> callback_; SEQUENCE_CHECKER(sequence_checker_); }; GetAllNodesRequestHelper::GetAllNodesRequestHelper( ModelTypeSet requested_types, - base::OnceCallback<void(std::unique_ptr<base::ListValue>)> callback) - : result_accumulator_(std::make_unique<base::ListValue>()), - awaiting_types_(requested_types), - callback_(std::move(callback)) {} + base::OnceCallback<void(base::Value::List)> callback) + : awaiting_types_(requested_types), callback_(std::move(callback)) {} GetAllNodesRequestHelper::~GetAllNodesRequestHelper() { if (!awaiting_types_.Empty()) { @@ -1587,15 +1585,14 @@ // Only return one type of nodes each time. void GetAllNodesRequestHelper::OnReceivedNodesForType( const ModelType type, - std::unique_ptr<base::ListValue> node_list) { + base::Value::List node_list) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); // Add these results to our list. - base::DictionaryValue type_dict; - type_dict.SetKey("type", base::Value(ModelTypeToDebugString(type))); - type_dict.SetKey("nodes", - base::Value::FromUniquePtrValue(std::move(node_list))); - result_accumulator_->Append(std::move(type_dict)); + base::Value::Dict type_dict; + type_dict.Set("type", ModelTypeToDebugString(type)); + type_dict.Set("nodes", std::move(node_list)); + result_accumulator_.Append(std::move(type_dict)); // Remember that this part of the request is satisfied. awaiting_types_.Remove(type); @@ -1608,12 +1605,12 @@ } // namespace void SyncServiceImpl::GetAllNodesForDebugging( - base::OnceCallback<void(std::unique_ptr<base::ListValue>)> callback) { + base::OnceCallback<void(base::Value::List)> callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); // If the engine isn't initialized yet, then there are no nodes to return. if (!engine_ || !engine_->IsInitialized()) { - std::move(callback).Run(std::make_unique<base::ListValue>()); + std::move(callback).Run(base::Value::List()); return; } @@ -1639,7 +1636,7 @@ // This can happen e.g. if we're waiting for a custom passphrase to be // entered - the data types are already considered active in this case, // but their DataTypeControllers are still NOT_RUNNING. - helper->OnReceivedNodesForType(type, std::make_unique<base::ListValue>()); + helper->OnReceivedNodesForType(type, base::Value::List()); } else { controller->GetAllNodes(base::BindRepeating( &GetAllNodesRequestHelper::OnReceivedNodesForType, helper));
diff --git a/components/sync/driver/sync_service_impl.h b/components/sync/driver/sync_service_impl.h index 6f3f181..dc2adb5 100644 --- a/components/sync/driver/sync_service_impl.h +++ b/components/sync/driver/sync_service_impl.h
@@ -156,8 +156,7 @@ void AddProtocolEventObserver(ProtocolEventObserver* observer) override; void RemoveProtocolEventObserver(ProtocolEventObserver* observer) override; void GetAllNodesForDebugging( - base::OnceCallback<void(std::unique_ptr<base::ListValue>)> callback) - override; + base::OnceCallback<void(base::Value::List)> callback) override; // SyncEngineHost implementation. void OnEngineInitialized(bool success,
diff --git a/components/sync/driver/test_sync_service.cc b/components/sync/driver/test_sync_service.cc index 3f7b23f04..628e292 100644 --- a/components/sync/driver/test_sync_service.cc +++ b/components/sync/driver/test_sync_service.cc
@@ -271,7 +271,7 @@ ProtocolEventObserver* observer) {} void TestSyncService::GetAllNodesForDebugging( - base::OnceCallback<void(std::unique_ptr<base::ListValue>)> callback) {} + base::OnceCallback<void(base::Value::List)> callback) {} void TestSyncService::SetInvalidationsForSessionsEnabled(bool enabled) {}
diff --git a/components/sync/driver/test_sync_service.h b/components/sync/driver/test_sync_service.h index bb87b4a1..4e0cb923 100644 --- a/components/sync/driver/test_sync_service.h +++ b/components/sync/driver/test_sync_service.h
@@ -99,8 +99,7 @@ void AddProtocolEventObserver(ProtocolEventObserver* observer) override; void RemoveProtocolEventObserver(ProtocolEventObserver* observer) override; void GetAllNodesForDebugging( - base::OnceCallback<void(std::unique_ptr<base::ListValue>)> callback) - override; + base::OnceCallback<void(base::Value::List)> callback) override; void SetInvalidationsForSessionsEnabled(bool enabled) override; void AddTrustedVaultDecryptionKeysFromWeb( const std::string& gaia_id,
diff --git a/components/sync/engine/events/protocol_event.cc b/components/sync/engine/events/protocol_event.cc index 880df3c..b7b875a 100644 --- a/components/sync/engine/events/protocol_event.cc +++ b/components/sync/engine/events/protocol_event.cc
@@ -10,14 +10,13 @@ ProtocolEvent::~ProtocolEvent() = default; -std::unique_ptr<base::DictionaryValue> ProtocolEvent::ToValue( - bool include_specifics) const { - auto dict = std::make_unique<base::DictionaryValue>(); - dict->SetDoubleKey("time", GetTimestamp().ToJsTime()); - dict->SetStringKey("type", GetType()); - dict->SetStringKey("details", GetDetails()); - dict->SetKey("proto", base::Value::FromUniquePtrValue( - GetProtoMessage(include_specifics))); +base::Value::Dict ProtocolEvent::ToValue(bool include_specifics) const { + base::Value::Dict dict; + dict.Set("time", GetTimestamp().ToJsTime()); + dict.Set("type", GetType()); + dict.Set("details", GetDetails()); + dict.Set("proto", + base::Value::FromUniquePtrValue(GetProtoMessage(include_specifics))); return dict; }
diff --git a/components/sync/engine/events/protocol_event.h b/components/sync/engine/events/protocol_event.h index fa2376a..33bfe963 100644 --- a/components/sync/engine/events/protocol_event.h +++ b/components/sync/engine/events/protocol_event.h
@@ -37,7 +37,7 @@ // Assembles the data exposed through the ProtocolEvent's interface into a // single DictionaryValue. - std::unique_ptr<base::DictionaryValue> ToValue(bool include_specifics) const; + base::Value::Dict ToValue(bool include_specifics) const; // Returns the time when the request was sent or received. base::Time GetTimestampForTesting() const;
diff --git a/components/sync/engine/sync_engine.h b/components/sync/engine/sync_engine.h index 52e0f8f1..9b753b7 100644 --- a/components/sync/engine/sync_engine.h +++ b/components/sync/engine/sync_engine.h
@@ -14,6 +14,7 @@ #include "base/memory/raw_ptr.h" #include "base/memory/scoped_refptr.h" #include "base/time/time.h" +#include "base/values.h" #include "components/signin/public/identity_manager/account_info.h" #include "components/sync/base/extensions_activity.h" #include "components/sync/base/model_type.h" @@ -43,7 +44,7 @@ class SyncEngine : public ModelTypeConfigurer { public: using AllNodesCallback = - base::OnceCallback<void(ModelType, std::unique_ptr<base::ListValue>)>; + base::OnceCallback<void(ModelType, base::Value::List)>; using HttpPostProviderFactoryGetter = base::OnceCallback<std::unique_ptr<HttpPostProviderFactory>()>;
diff --git a/components/sync/model/client_tag_based_model_type_processor.cc b/components/sync/model/client_tag_based_model_type_processor.cc index ae24a6e..0fb7c8c 100644 --- a/components/sync/model/client_tag_based_model_type_processor.cc +++ b/components/sync/model/client_tag_based_model_type_processor.cc
@@ -1125,8 +1125,7 @@ void ClientTagBasedModelTypeProcessor::MergeDataWithMetadataForDebugging( AllNodesCallback callback, std::unique_ptr<DataBatch> batch) { - std::unique_ptr<base::ListValue> all_nodes = - std::make_unique<base::ListValue>(); + base::Value::List all_nodes; std::string type_string = ModelTypeToDebugString(type_); while (batch->HasNext()) { @@ -1148,13 +1147,14 @@ ClientTagHash::FromHashed(metadata.client_tag_hash()); } - std::unique_ptr<base::DictionaryValue> node = data->ToDictionaryValue(); - node->SetStringKey("modelType", type_string); + base::Value::Dict node = data->ToDictionaryValue(); + node.Set("modelType", type_string); // Copy the whole metadata message into the dictionary (if existing). if (entity != nullptr) { - node->Set("metadata", EntityMetadataToValue(entity->metadata())); + node.Set("metadata", base::Value::FromUniquePtrValue( + EntityMetadataToValue(entity->metadata()))); } - all_nodes->Append(base::Value::FromUniquePtrValue(std::move(node))); + all_nodes.Append(std::move(node)); } // Create a permanent folder for this data type. Since sync server no longer @@ -1170,7 +1170,7 @@ rootnode.Set("IS_DIR", true); rootnode.Set("modelType", type_string); rootnode.Set("NON_UNIQUE_NAME", type_string); - all_nodes->Append(base::Value(std::move(rootnode))); + all_nodes.Append(std::move(rootnode)); std::move(callback).Run(type_, std::move(all_nodes)); }
diff --git a/components/sync/model/model_type_controller_delegate.h b/components/sync/model/model_type_controller_delegate.h index e610ec38..4749d6f 100644 --- a/components/sync/model/model_type_controller_delegate.h +++ b/components/sync/model/model_type_controller_delegate.h
@@ -26,7 +26,7 @@ class ModelTypeControllerDelegate { public: using AllNodesCallback = - base::OnceCallback<void(ModelType, std::unique_ptr<base::ListValue>)>; + base::OnceCallback<void(ModelType, base::Value::List)>; using StartCallback = base::OnceCallback<void(std::unique_ptr<DataTypeActivationResponse>)>;
diff --git a/components/sync/nigori/nigori_model_type_processor.cc b/components/sync/nigori/nigori_model_type_processor.cc index 8c660149..babac23b 100644 --- a/components/sync/nigori/nigori_model_type_processor.cc +++ b/components/sync/nigori/nigori_model_type_processor.cc
@@ -238,8 +238,7 @@ std::unique_ptr<EntityData> entity_data = bridge_->GetData(); if (!entity_data) { - std::move(callback).Run(syncer::NIGORI, - std::make_unique<base::ListValue>()); + std::move(callback).Run(syncer::NIGORI, base::Value::List()); return; } @@ -251,25 +250,22 @@ entity_data->modification_time = ProtoTimeToTime(metadata.modification_time()); } - std::unique_ptr<base::DictionaryValue> root_node; - root_node = entity_data->ToDictionaryValue(); + base::Value::Dict root_node = entity_data->ToDictionaryValue(); if (entity_) { - root_node->SetKey("metadata", - base::Value::FromUniquePtrValue( - EntityMetadataToValue(entity_->metadata()))); + root_node.Set("metadata", base::Value::FromUniquePtrValue( + EntityMetadataToValue(entity_->metadata()))); } // Function isTypeRootNode in sync_node_browser.js use PARENT_ID and // UNIQUE_SERVER_TAG to check if the node is root node. isChildOf in // sync_node_browser.js uses modelType to check if root node is parent of real // data node. - root_node->SetStringKey("PARENT_ID", "r"); - root_node->SetStringKey("UNIQUE_SERVER_TAG", "Nigori"); - root_node->SetStringKey("modelType", ModelTypeToDebugString(NIGORI)); + root_node.Set("PARENT_ID", "r"); + root_node.Set("UNIQUE_SERVER_TAG", "Nigori"); + root_node.Set("modelType", ModelTypeToDebugString(NIGORI)); - auto all_nodes = std::make_unique<base::ListValue>(); - all_nodes->GetList().Append( - base::Value::FromUniquePtrValue(std::move(root_node))); + base::Value::List all_nodes; + all_nodes.Append(std::move(root_node)); std::move(callback).Run(syncer::NIGORI, std::move(all_nodes)); }
diff --git a/components/sync/protocol/entity_data.cc b/components/sync/protocol/entity_data.cc index ff9926f0..36a2bd4 100644 --- a/components/sync/protocol/entity_data.cc +++ b/components/sync/protocol/entity_data.cc
@@ -24,27 +24,26 @@ EntityData& EntityData::operator=(EntityData&& other) = default; -std::unique_ptr<base::DictionaryValue> EntityData::ToDictionaryValue() { +base::Value::Dict EntityData::ToDictionaryValue() { // This is used when debugging at sync-internals page. The code in // sync_node_browser.js is expecting certain fields names. e.g. CTIME, MTIME, // and IS_DIR. - std::unique_ptr<base::DictionaryValue> dict = - std::make_unique<base::DictionaryValue>(); - dict->SetKey("SPECIFICS", base::Value::FromUniquePtrValue( - EntitySpecificsToValue(specifics))); - dict->SetStringKey("ID", id); - dict->SetStringKey("CLIENT_TAG_HASH", client_tag_hash.value()); - dict->SetStringKey("ORIGINATOR_CACHE_GUID", originator_cache_guid); - dict->SetStringKey("ORIGINATOR_CLIENT_ITEM_ID", originator_client_item_id); - dict->SetStringKey("SERVER_DEFINED_UNIQUE_TAG", server_defined_unique_tag); + base::Value::Dict dict; + dict.Set("SPECIFICS", + base::Value::FromUniquePtrValue(EntitySpecificsToValue(specifics))); + dict.Set("ID", id); + dict.Set("CLIENT_TAG_HASH", client_tag_hash.value()); + dict.Set("ORIGINATOR_CACHE_GUID", originator_cache_guid); + dict.Set("ORIGINATOR_CLIENT_ITEM_ID", originator_client_item_id); + dict.Set("SERVER_DEFINED_UNIQUE_TAG", server_defined_unique_tag); // The string "NON_UNIQUE_NAME" is used in sync-internals to identify the node // title. - dict->SetStringKey("NON_UNIQUE_NAME", name); - dict->SetStringKey("NAME", name); + dict.Set("NON_UNIQUE_NAME", name); + dict.Set("NAME", name); // The string "PARENT_ID" is used in sync-internals to build the node tree. - dict->SetStringKey("PARENT_ID", legacy_parent_id); - dict->SetStringKey("CTIME", GetTimeDebugString(creation_time)); - dict->SetStringKey("MTIME", GetTimeDebugString(modification_time)); + dict.Set("PARENT_ID", legacy_parent_id); + dict.Set("CTIME", GetTimeDebugString(creation_time)); + dict.Set("MTIME", GetTimeDebugString(modification_time)); return dict; }
diff --git a/components/sync/protocol/entity_data.h b/components/sync/protocol/entity_data.h index cfd5d4f2..7c59c45 100644 --- a/components/sync/protocol/entity_data.h +++ b/components/sync/protocol/entity_data.h
@@ -10,6 +10,7 @@ #include <string> #include "base/time/time.h" +#include "base/values.h" #include "components/sync/base/client_tag_hash.h" #include "components/sync/protocol/entity_specifics.pb.h" @@ -90,7 +91,7 @@ bool is_deleted() const { return specifics.ByteSize() == 0; } // Dumps all info into a DictionaryValue and returns it. - std::unique_ptr<base::DictionaryValue> ToDictionaryValue(); + base::Value::Dict ToDictionaryValue(); // Returns the estimate of dynamically allocated memory in bytes. size_t EstimateMemoryUsage() const;
diff --git a/components/sync/test/model/fake_model_type_controller_delegate.cc b/components/sync/test/model/fake_model_type_controller_delegate.cc index ddc7dac2..542bf2c 100644 --- a/components/sync/test/model/fake_model_type_controller_delegate.cc +++ b/components/sync/test/model/fake_model_type_controller_delegate.cc
@@ -90,7 +90,7 @@ void FakeModelTypeControllerDelegate::GetAllNodesForDebugging( ModelTypeControllerDelegate::AllNodesCallback callback) { - std::move(callback).Run(type_, std::make_unique<base::ListValue>()); + std::move(callback).Run(type_, base::Value::List()); } void FakeModelTypeControllerDelegate::RecordMemoryUsageAndCountsHistograms() {}
diff --git a/components/sync_bookmarks/bookmark_model_type_processor.cc b/components/sync_bookmarks/bookmark_model_type_processor.cc index ff360c6..925ff98 100644 --- a/components/sync_bookmarks/bookmark_model_type_processor.cc +++ b/components/sync_bookmarks/bookmark_model_type_processor.cc
@@ -472,7 +472,7 @@ void BookmarkModelTypeProcessor::GetAllNodesForDebugging( AllNodesCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - auto all_nodes = std::make_unique<base::ListValue>(); + base::Value::List all_nodes; // Create a permanent folder since sync server no longer create root folders, // and USS won't migrate root folders from directory, we create root folders. base::Value::Dict root_node; @@ -486,12 +486,12 @@ root_node.Set("IS_DIR", true); root_node.Set("modelType", "Bookmarks"); root_node.Set("NON_UNIQUE_NAME", "Bookmarks"); - all_nodes->Append(base::Value(std::move(root_node))); + all_nodes.Append(std::move(root_node)); const bookmarks::BookmarkNode* model_root_node = bookmark_model_->root_node(); int i = 0; for (const auto& child : model_root_node->children()) { - AppendNodeAndChildrenForDebugging(child.get(), i++, all_nodes.get()); + AppendNodeAndChildrenForDebugging(child.get(), i++, &all_nodes); } std::move(callback).Run(syncer::BOOKMARKS, std::move(all_nodes)); @@ -500,7 +500,7 @@ void BookmarkModelTypeProcessor::AppendNodeAndChildrenForDebugging( const bookmarks::BookmarkNode* node, int index, - base::ListValue* all_nodes) const { + base::Value::List* all_nodes) const { const SyncedBookmarkTrackerEntity* entity = bookmark_tracker_->GetEntityForBookmarkNode(node); // Include only tracked nodes. Newly added nodes are tracked even before being @@ -537,27 +537,23 @@ data.legacy_parent_id = parent_entity->metadata().server_id(); } - std::unique_ptr<base::DictionaryValue> data_dictionary = - data.ToDictionaryValue(); + base::Value::Dict data_dictionary = data.ToDictionaryValue(); // Set ID value as in legacy directory-based implementation, "s" means server. - data_dictionary->SetString("ID", "s" + metadata.server_id()); + data_dictionary.Set("ID", "s" + metadata.server_id()); if (node->is_permanent_node()) { // Hardcode the parent of permanent nodes. - data_dictionary->SetString("PARENT_ID", "BOOKMARKS_ROOT"); - data_dictionary->SetString("UNIQUE_SERVER_TAG", - data.server_defined_unique_tag); + data_dictionary.Set("PARENT_ID", "BOOKMARKS_ROOT"); + data_dictionary.Set("UNIQUE_SERVER_TAG", data.server_defined_unique_tag); } else { - data_dictionary->SetString("PARENT_ID", "s" + data.legacy_parent_id); + data_dictionary.Set("PARENT_ID", "s" + data.legacy_parent_id); } - data_dictionary->SetInteger("LOCAL_EXTERNAL_ID", node->id()); - data_dictionary->SetInteger("positionIndex", index); - data_dictionary->SetKey( - "metadata", - base::Value::FromUniquePtrValue(syncer::EntityMetadataToValue(metadata))); - data_dictionary->SetString("modelType", "Bookmarks"); - data_dictionary->SetBoolean("IS_DIR", node->is_folder()); - all_nodes->Append( - base::Value::FromUniquePtrValue(std::move(data_dictionary))); + data_dictionary.Set("LOCAL_EXTERNAL_ID", static_cast<int>(node->id())); + data_dictionary.Set("positionIndex", index); + data_dictionary.Set("metadata", base::Value::FromUniquePtrValue( + syncer::EntityMetadataToValue(metadata))); + data_dictionary.Set("modelType", "Bookmarks"); + data_dictionary.Set("IS_DIR", node->is_folder()); + all_nodes->Append(std::move(data_dictionary)); int i = 0; for (const auto& child : node->children()) {
diff --git a/components/sync_bookmarks/bookmark_model_type_processor.h b/components/sync_bookmarks/bookmark_model_type_processor.h index c3ab029..0bb1081d 100644 --- a/components/sync_bookmarks/bookmark_model_type_processor.h +++ b/components/sync_bookmarks/bookmark_model_type_processor.h
@@ -125,7 +125,7 @@ // since we iterate over child nodes already in the calling sites. void AppendNodeAndChildrenForDebugging(const bookmarks::BookmarkNode* node, int index, - base::ListValue* all_nodes) const; + base::Value::List* all_nodes) const; // Stores the start callback in between OnSyncStarting() and // ModelReadyToSync().
diff --git a/components/sync_sessions/proxy_tabs_data_type_controller.cc b/components/sync_sessions/proxy_tabs_data_type_controller.cc index 541df0b..3dc23169 100644 --- a/components/sync_sessions/proxy_tabs_data_type_controller.cc +++ b/components/sync_sessions/proxy_tabs_data_type_controller.cc
@@ -73,7 +73,7 @@ } void ProxyTabsDataTypeController::GetAllNodes(AllNodesCallback callback) { - std::move(callback).Run(type(), std::make_unique<base::ListValue>()); + std::move(callback).Run(type(), base::Value::List()); } void ProxyTabsDataTypeController::GetTypeEntitiesCount(
diff --git a/components/test/data/autofill/heuristics/output/021_checkout_cduniverse.com.out b/components/test/data/autofill/heuristics/output/021_checkout_cduniverse.com.out index e9a93f0..6c38088c 100644 --- a/components/test/data/autofill/heuristics/output/021_checkout_cduniverse.com.out +++ b/components/test/data/autofill/heuristics/output/021_checkout_cduniverse.com.out
@@ -10,13 +10,13 @@ ADDRESS_HOME_ZIP | HT_Bill_Zip | Zip/Postal Code | | HT_First_Name_1-default PHONE_HOME_WHOLE_NUMBER | HT_phone | Phone | | HT_First_Name_1-default ADDRESS_HOME_COUNTRY | HT_Bill_Country | Country | USA | HT_First_Name_1-default -NAME_FULL | HT_Ship_Name | Full Name | | HT_First_Name_1-default -ADDRESS_HOME_LINE1 | HT_Ship_Address1 | Address 1 | | HT_Ship_Address1_2-default -ADDRESS_HOME_LINE2 | HT_Ship_Address2 | Address 2 | | HT_Ship_Address1_2-default -ADDRESS_HOME_CITY | HT_Ship_City | City | | HT_Ship_Address1_2-default -ADDRESS_HOME_STATE | HT_Ship_State | State/Province | | HT_Ship_Address1_2-default -ADDRESS_HOME_ZIP | HT_Ship_Zip | Zip/Postal Code | | HT_Ship_Address1_2-default -ADDRESS_HOME_COUNTRY | HT_Ship_Country | Country | | HT_Ship_Address1_2-default -UNKNOWN_TYPE | HT_OK_to_email | Yes | -1 | HT_Ship_Address1_2-default -UNKNOWN_TYPE | HT_OK_to_email | No | 0 | HT_Ship_Address1_2-default -UNKNOWN_TYPE | HT_PrefersHTML | I prefer to receive HTML formatted email when available. | on | HT_Ship_Address1_2-default +NAME_FULL | HT_Ship_Name | Full Name | | HT_Ship_Name_2-default +ADDRESS_HOME_LINE1 | HT_Ship_Address1 | Address 1 | | HT_Ship_Name_2-default +ADDRESS_HOME_LINE2 | HT_Ship_Address2 | Address 2 | | HT_Ship_Name_2-default +ADDRESS_HOME_CITY | HT_Ship_City | City | | HT_Ship_Name_2-default +ADDRESS_HOME_STATE | HT_Ship_State | State/Province | | HT_Ship_Name_2-default +ADDRESS_HOME_ZIP | HT_Ship_Zip | Zip/Postal Code | | HT_Ship_Name_2-default +ADDRESS_HOME_COUNTRY | HT_Ship_Country | Country | | HT_Ship_Name_2-default +UNKNOWN_TYPE | HT_OK_to_email | Yes | -1 | HT_Ship_Name_2-default +UNKNOWN_TYPE | HT_OK_to_email | No | 0 | HT_Ship_Name_2-default +UNKNOWN_TYPE | HT_PrefersHTML | I prefer to receive HTML formatted email when available. | on | HT_Ship_Name_2-default
diff --git a/components/test/data/autofill/heuristics/output/083_crbug_87517.out b/components/test/data/autofill/heuristics/output/083_crbug_87517.out index bc05b2b3..25b47d7 100644 --- a/components/test/data/autofill/heuristics/output/083_crbug_87517.out +++ b/components/test/data/autofill/heuristics/output/083_crbug_87517.out
@@ -19,18 +19,18 @@ UNKNOWN_TYPE | Comments | ( You may enter up to 500 characters. ) | | f1_1-default UNKNOWN_TYPE | tribute | In Honor Of | IHO | f1_1-default UNKNOWN_TYPE | tribute | In Memory Of | IMO | f1_1-default -NAME_FULL | Tribute_Name | Name: | | f1_1-default -UNKNOWN_TYPE | Tribute_occasion | Occasion: | | f1_1-default -UNKNOWN_TYPE | Tribute_Disclosure | I wish to remain anonymous | on | f1_1-default -UNKNOWN_TYPE | Tribute_Notification | Please send a notification of my gift to the following address: | on | f1_1-default -UNKNOWN_TYPE | Tribute_IncludeAmount | Include the amount | 1 | f1_1-default -UNKNOWN_TYPE | Tribute_IncludeAmount | Do not include the amount | 0 | f1_1-default -NAME_FULL | Tribute_NotifyName | Name: | | f1_1-default -EMAIL_ADDRESS | Tribute_Email | Email: | | Tribute_Email_2-default -ADDRESS_HOME_LINE1 | Tribute_NotifyAddr | Street: | | Tribute_Email_2-default -ADDRESS_HOME_CITY | Tribute_NotifyCity | City / St. / Zip: | | Tribute_Email_2-default -ADDRESS_HOME_STATE | Tribute_NotifyState | City / St. / Zip: | | Tribute_Email_2-default -ADDRESS_HOME_ZIP | Tribute_NotifyZip | City / St. / Zip: | | Tribute_Email_2-default +NAME_FULL | Tribute_Name | Name: | | Tribute_Name_2-default +UNKNOWN_TYPE | Tribute_occasion | Occasion: | | Tribute_Name_2-default +UNKNOWN_TYPE | Tribute_Disclosure | I wish to remain anonymous | on | Tribute_Name_2-default +UNKNOWN_TYPE | Tribute_Notification | Please send a notification of my gift to the following address: | on | Tribute_Name_2-default +UNKNOWN_TYPE | Tribute_IncludeAmount | Include the amount | 1 | Tribute_Name_2-default +UNKNOWN_TYPE | Tribute_IncludeAmount | Do not include the amount | 0 | Tribute_Name_2-default +NAME_FULL | Tribute_NotifyName | Name: | | Tribute_Name_2-default +EMAIL_ADDRESS | Tribute_Email | Email: | | Tribute_Name_2-default +ADDRESS_HOME_LINE1 | Tribute_NotifyAddr | Street: | | Tribute_Name_2-default +ADDRESS_HOME_CITY | Tribute_NotifyCity | City / St. / Zip: | | Tribute_Name_2-default +ADDRESS_HOME_STATE | Tribute_NotifyState | City / St. / Zip: | | Tribute_Name_2-default +ADDRESS_HOME_ZIP | Tribute_NotifyZip | City / St. / Zip: | | Tribute_Name_2-default CREDIT_CARD_TYPE | cctype | Credit Card Type * | Visa | credit-card-cc CREDIT_CARD_NUMBER | ccard | Credit Card Number * | | credit-card-cc CREDIT_CARD_VERIFICATION_CODE | csc | CSC Number * What Is This? | | credit-card-cc
diff --git a/components/test/data/history/history.56.sql b/components/test/data/history/history.56.sql index 0fa69b7..f55c4592 100644 --- a/components/test/data/history/history.56.sql +++ b/components/test/data/history/history.56.sql
@@ -2,7 +2,7 @@ BEGIN TRANSACTION; CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR); INSERT INTO meta VALUES('mmap_status','-1'); -INSERT INTO meta VALUES('version','55'); +INSERT INTO meta VALUES('version','56'); INSERT INTO meta VALUES('last_compatible_version','16'); CREATE TABLE urls(id INTEGER PRIMARY KEY AUTOINCREMENT,url LONGVARCHAR,title LONGVARCHAR,visit_count INTEGER DEFAULT 0 NOT NULL,typed_count INTEGER DEFAULT 0 NOT NULL,last_visit_time INTEGER NOT NULL,hidden INTEGER DEFAULT 0 NOT NULL); CREATE TABLE visits(id INTEGER PRIMARY KEY AUTOINCREMENT,url INTEGER NOT NULL,visit_time INTEGER NOT NULL,from_visit INTEGER,transition INTEGER DEFAULT 0 NOT NULL,segment_id INTEGER,visit_duration INTEGER DEFAULT 0 NOT NULL,incremented_omnibox_typed_score BOOLEAN DEFAULT FALSE NOT NULL,opener_visit INTEGER,originator_cache_guid TEXT,originator_visit_id INTEGER,originator_from_visit INTEGER,originator_opener_visit INTEGER); @@ -23,6 +23,7 @@ CREATE INDEX visits_url_index ON visits (url); CREATE INDEX visits_from_index ON visits (from_visit); CREATE INDEX visits_time_index ON visits (visit_time); +CREATE INDEX visits_originator_id_index ON visits (originator_visit_id); CREATE INDEX keyword_search_terms_index1 ON keyword_search_terms (keyword_id, normalized_term); CREATE INDEX keyword_search_terms_index2 ON keyword_search_terms (url_id); CREATE INDEX keyword_search_terms_index3 ON keyword_search_terms (term);
diff --git a/components/translate/ios/browser/translate_controller_unittest.mm b/components/translate/ios/browser/translate_controller_unittest.mm index e66eea9..2884a0a 100644 --- a/components/translate/ios/browser/translate_controller_unittest.mm +++ b/components/translate/ios/browser/translate_controller_unittest.mm
@@ -141,35 +141,37 @@ // Tests that OnJavascriptCommandReceived() returns false to malformed commands. TEST_F(TranslateControllerTest, OnJavascriptCommandReceived) { - base::DictionaryValue malformed_command; + base::Value::Dict malformed_command; EXPECT_FALSE(translate_controller_->OnJavascriptCommandReceived( - malformed_command, GURL("http://google.com"), /*interacting*/ false, - fake_main_frame_.get())); + base::Value(std::move(malformed_command)), GURL("http://google.com"), + /*interacting*/ false, fake_main_frame_.get())); } // Tests that OnJavascriptCommandReceived() returns false to iframe commands. TEST_F(TranslateControllerTest, OnIFrameJavascriptCommandReceived) { - base::DictionaryValue command; - command.SetString("command", "translate.ready"); - command.SetDouble("errorCode", TranslateErrors::TRANSLATION_TIMEOUT); - command.SetDouble("loadTime", .0); - command.SetDouble("readyTime", .0); + base::Value::Dict command; + command.Set("command", "translate.ready"); + command.Set("errorCode", + static_cast<double>(TranslateErrors::TRANSLATION_TIMEOUT)); + command.Set("loadTime", .0); + command.Set("readyTime", .0); EXPECT_FALSE(translate_controller_->OnJavascriptCommandReceived( - command, GURL("http://google.com"), /*interacting*/ false, - fake_iframe_.get())); + base::Value(std::move(command)), GURL("http://google.com"), + /*interacting*/ false, fake_iframe_.get())); } // Tests that OnTranslateScriptReady() is called when a timeout message is // received from the JS side. TEST_F(TranslateControllerTest, OnTranslateScriptReadyTimeoutCalled) { - base::DictionaryValue command; - command.SetString("command", "translate.ready"); - command.SetDouble("errorCode", TranslateErrors::TRANSLATION_TIMEOUT); - command.SetDouble("loadTime", .0); - command.SetDouble("readyTime", .0); + base::Value::Dict command; + command.Set("command", "translate.ready"); + command.Set("errorCode", + static_cast<double>(TranslateErrors::TRANSLATION_TIMEOUT)); + command.Set("loadTime", .0); + command.Set("readyTime", .0); EXPECT_TRUE(translate_controller_->OnJavascriptCommandReceived( - command, GURL("http://google.com"), /*interacting*/ false, - fake_main_frame_.get())); + base::Value(std::move(command)), GURL("http://google.com"), + /*interacting*/ false, fake_main_frame_.get())); EXPECT_TRUE(on_script_ready_called_); EXPECT_FALSE(on_translate_complete_called_); EXPECT_FALSE(error_type_ == TranslateErrors::NONE); @@ -182,14 +184,14 @@ double some_load_time = 23.1; double some_ready_time = 12.2; - base::DictionaryValue command; - command.SetString("command", "translate.ready"); - command.SetDouble("errorCode", TranslateErrors::NONE); - command.SetDouble("loadTime", some_load_time); - command.SetDouble("readyTime", some_ready_time); + base::Value::Dict command; + command.Set("command", "translate.ready"); + command.Set("errorCode", static_cast<double>(TranslateErrors::NONE)); + command.Set("loadTime", some_load_time); + command.Set("readyTime", some_ready_time); EXPECT_TRUE(translate_controller_->OnJavascriptCommandReceived( - command, GURL("http://google.com"), /*interacting*/ false, - fake_main_frame_.get())); + base::Value(std::move(command)), GURL("http://google.com"), + /*interacting*/ false, fake_main_frame_.get())); EXPECT_TRUE(on_script_ready_called_); EXPECT_FALSE(on_translate_complete_called_); EXPECT_TRUE(error_type_ == TranslateErrors::NONE); @@ -204,14 +206,14 @@ std::string some_source_language("en"); double some_translation_time = 12.9; - base::DictionaryValue command; - command.SetString("command", "translate.status"); - command.SetDouble("errorCode", TranslateErrors::NONE); - command.SetString("pageSourceLanguage", some_source_language); - command.SetDouble("translationTime", some_translation_time); + base::Value::Dict command; + command.Set("command", "translate.status"); + command.Set("errorCode", static_cast<double>(TranslateErrors::NONE)); + command.Set("pageSourceLanguage", some_source_language); + command.Set("translationTime", some_translation_time); EXPECT_TRUE(translate_controller_->OnJavascriptCommandReceived( - command, GURL("http://google.com"), /*interacting*/ false, - fake_main_frame_.get())); + base::Value(std::move(command)), GURL("http://google.com"), + /*interacting*/ false, fake_main_frame_.get())); EXPECT_FALSE(on_script_ready_called_); EXPECT_TRUE(on_translate_complete_called_); EXPECT_TRUE(error_type_ == TranslateErrors::NONE); @@ -222,12 +224,13 @@ // Tests that OnTranslateComplete() is called with the right parameters when a // |translate.status| message is received from the JS side. TEST_F(TranslateControllerTest, TranslationFailure) { - base::DictionaryValue command; - command.SetString("command", "translate.status"); - command.SetDouble("errorCode", TranslateErrors::INITIALIZATION_ERROR); + base::Value::Dict command; + command.Set("command", "translate.status"); + command.Set("errorCode", + static_cast<double>(TranslateErrors::INITIALIZATION_ERROR)); EXPECT_TRUE(translate_controller_->OnJavascriptCommandReceived( - command, GURL("http://google.com"), /*interacting*/ false, - fake_main_frame_.get())); + base::Value(std::move(command)), GURL("http://google.com"), + /*interacting*/ false, fake_main_frame_.get())); EXPECT_FALSE(on_script_ready_called_); EXPECT_TRUE(on_translate_complete_called_); EXPECT_FALSE(error_type_ == TranslateErrors::NONE); @@ -236,59 +239,57 @@ // Tests that OnTranslateLoadJavaScript() is called with the right parameters // when a |translate.loadjavascript| message is received from the JS side. TEST_F(TranslateControllerTest, OnTranslateLoadJavascript) { - base::DictionaryValue command; - command.SetString("command", "translate.loadjavascript"); - command.SetString("url", "https://translate.googleapis.com/javascript.js"); + base::Value::Dict command; + command.Set("command", "translate.loadjavascript"); + command.Set("url", "https://translate.googleapis.com/javascript.js"); EXPECT_TRUE(translate_controller_->OnJavascriptCommandReceived( - command, GURL("http://google.com"), /*interacting=*/false, - fake_main_frame_.get())); + base::Value(std::move(command)), GURL("http://google.com"), + /*interacting=*/false, fake_main_frame_.get())); } // Tests that OnTranslateSendRequest() is called with the right parameters // when a |translate.sendrequest| message is received from the JS side. TEST_F(TranslateControllerTest, OnTranslateSendRequestWithValidCommand) { - base::DictionaryValue command; - command.SetString("command", "translate.sendrequest"); - command.SetString("method", "POST"); - command.SetString("url", - "https://translate.googleapis.com/translate?key=abcd"); - command.SetString("body", "helloworld"); - command.SetDouble("requestID", 0); + base::Value::Dict command; + command.Set("command", "translate.sendrequest"); + command.Set("method", "POST"); + command.Set("url", "https://translate.googleapis.com/translate?key=abcd"); + command.Set("body", "helloworld"); + command.Set("requestID", .0); EXPECT_TRUE(translate_controller_->OnJavascriptCommandReceived( - command, GURL("http://google.com"), /*interacting=*/false, - fake_main_frame_.get())); + base::Value(std::move(command)), GURL("http://google.com"), + /*interacting=*/false, fake_main_frame_.get())); } // Tests that OnTranslateSendRequest() rejects a bad url contained in the // |translate.sendrequest| message received from Javascript. TEST_F(TranslateControllerTest, OnTranslateSendRequestWithBadURL) { - base::DictionaryValue command; - command.SetString("command", "translate.sendrequest"); - command.SetString("method", "POST"); - command.SetString("url", "https://badurl.example.com"); - command.SetString("body", "helloworld"); - command.SetDouble("requestID", 0); + base::Value::Dict command; + command.Set("command", "translate.sendrequest"); + command.Set("method", "POST"); + command.Set("url", "https://badurl.example.com"); + command.Set("body", "helloworld"); + command.Set("requestID", .0); EXPECT_FALSE(translate_controller_->OnJavascriptCommandReceived( - command, GURL("http://google.com"), /*interacting=*/false, - fake_main_frame_.get())); + base::Value(std::move(command)), GURL("http://google.com"), + /*interacting=*/false, fake_main_frame_.get())); } // Tests that OnTranslateSendRequest() called with a bad method will eventually // cause the request to fail. TEST_F(TranslateControllerTest, OnTranslateSendRequestWithBadMethod) { - base::DictionaryValue command; - command.SetString("command", "translate.sendrequest"); - command.SetString("method", "POST\r\nHost: other.example.com"); - command.SetString("url", - "https://translate.googleapis.com/translate?key=abcd"); - command.SetString("body", "helloworld"); - command.SetDouble("requestID", 0); + base::Value::Dict command; + command.Set("command", "translate.sendrequest"); + command.Set("method", "POST\r\nHost: other.example.com"); + command.Set("url", "https://translate.googleapis.com/translate?key=abcd"); + command.Set("body", "helloworld"); + command.Set("requestID", .0); // The command will be accepted, but a bad method should cause the request to // fail shortly thereafter. EXPECT_TRUE(translate_controller_->OnJavascriptCommandReceived( - command, GURL("http://google.com"), /*interacting=*/false, - fake_main_frame_.get())); + base::Value(std::move(command)), GURL("http://google.com"), + /*interacting=*/false, fake_main_frame_.get())); task_environment_.RunUntilIdle(); HandleTranslateResponseParams* last_params =
diff --git a/components/url_param_filter/core/url_param_classifications_loader.cc b/components/url_param_filter/core/url_param_classifications_loader.cc index 9a63017e..d8df5923 100644 --- a/components/url_param_filter/core/url_param_classifications_loader.cc +++ b/components/url_param_filter/core/url_param_classifications_loader.cc
@@ -56,11 +56,22 @@ ClassificationMapKey key = {.site_role = classification.site_role(), .site_match_type = site_match_type, .site = classification.site()}; - map[key][use_case][base::ToLowerASCII(param.name())] = - !classification.experiment_tags().empty() && - !HasExperimentTag(classification, DEFAULT_TAG) - ? ClassificationExperimentStatus::EXPERIMENTAL - : ClassificationExperimentStatus::NON_EXPERIMENTAL; + std::string param_name = base::ToLowerASCII(param.name()); + + auto status = !classification.experiment_tags().empty() && + !HasExperimentTag(classification, DEFAULT_TAG) + ? ClassificationExperimentStatus::EXPERIMENTAL + : ClassificationExperimentStatus::NON_EXPERIMENTAL; + + // Preserve existing entry in map if it is marked as NON_EXPERIMENTAL. + if (map.find(key) != map.end() && + map[key].find(use_case) != map[key].end() && + map[key][use_case].find(param_name) != map[key][use_case].end() && + map[key][use_case][param_name] == + ClassificationExperimentStatus::NON_EXPERIMENTAL) { + status = ClassificationExperimentStatus::NON_EXPERIMENTAL; + } + map[key][use_case][param_name] = status; } }
diff --git a/components/url_param_filter/core/url_param_classifications_loader_unittest.cc b/components/url_param_filter/core/url_param_classifications_loader_unittest.cc index bf7ae5d..0461293 100644 --- a/components/url_param_filter/core/url_param_classifications_loader_unittest.cc +++ b/components/url_param_filter/core/url_param_classifications_loader_unittest.cc
@@ -148,7 +148,7 @@ }; TEST_F(UrlParamClassificationsLoaderTest, - ReadClassifications_MatchTypeKeyCollision_SecondEntryAdded) { + ReadClassifications_MatchTypeKeyCollision_NonExperimentalTagApplied) { base::HistogramTester histogram_tester; FilterClassifications classifications; @@ -180,17 +180,18 @@ SetComponentFileContents(classifications.SerializeAsString()); loader()->ReadClassifications(test_file_contents()); - // The second entry gets added to the map normally, despite the collision. - // We can tell the second entry is the one that won because it's tagged - // EXPERIMENTAL. - EXPECT_THAT(loader()->GetClassifications(), - UnorderedElementsAre(Pair( - SourceKey(kSourceSite), - UnorderedElementsAre(Pair( - FilterClassification::USE_CASE_UNKNOWN, - UnorderedElementsAre(Pair( - "plzblock", - ClassificationExperimentStatus::EXPERIMENTAL))))))); + // The first entry remains in the map, despite the collision. + // We can tell the first entry is the one that won because it's tagged + // NON_EXPERIMENTAL. + EXPECT_THAT( + loader()->GetClassifications(), + UnorderedElementsAre( + Pair(SourceKey(kSourceSite), + UnorderedElementsAre(Pair( + FilterClassification::USE_CASE_UNKNOWN, + UnorderedElementsAre(Pair( + "plzblock", + ClassificationExperimentStatus::NON_EXPERIMENTAL))))))); histogram_tester.ExpectTotalCount(kApplicableClassificationsSourceMetric, 1); ASSERT_EQ( @@ -203,6 +204,108 @@ histogram_tester.ExpectTotalCount(kApplicableClassificationsInvalidMetric, 0); }; +TEST_F( + UrlParamClassificationsLoaderTest, + ReadClassifications_DuplicateKeysExperimentalThenNonExperimental_NonExperimentalTagApplied) { + base::HistogramTester histogram_tester; + FilterClassifications classifications; + + // Two classifications keyed in exactly the same way. + // The first classification is EXPERIMENTAL but the second is + // NON_EXPERIMENTAL. + AddClassification(classifications.add_classifications(), kSourceSite, + FilterClassification_SiteRole_SOURCE, + FilterClassification_SiteMatchType_EXACT_ETLD_PLUS_ONE, + {"plzblock"}, {FilterClassification::USE_CASE_UNKNOWN}, + {"not_default"}); + AddClassification(classifications.add_classifications(), kSourceSite, + FilterClassification_SiteRole_SOURCE, + FilterClassification_SiteMatchType_EXACT_ETLD_PLUS_ONE, + {"plzblock"}, {FilterClassification::USE_CASE_UNKNOWN}, + {"default", "not_default"}); + + const std::string experiment_identifier = "not_default"; + base::test::ScopedFeatureList scoped_feature_list; + base::FieldTrialParams params; + params["experiment_identifier"] = experiment_identifier; + scoped_feature_list.InitAndEnableFeatureWithParameters( + features::kIncognitoParamFilterEnabled, params); + SetComponentFileContents(classifications.SerializeAsString()); + loader()->ReadClassifications(test_file_contents()); + + // The parameter is marked as NON_EXPERIMENTAL. + EXPECT_THAT( + loader()->GetClassifications(), + UnorderedElementsAre( + Pair(SourceKey(kSourceSite), + UnorderedElementsAre(Pair( + FilterClassification::USE_CASE_UNKNOWN, + UnorderedElementsAre(Pair( + "plzblock", + ClassificationExperimentStatus::NON_EXPERIMENTAL))))))); + + histogram_tester.ExpectTotalCount(kApplicableClassificationsSourceMetric, 1); + ASSERT_EQ( + histogram_tester.GetTotalSum(kApplicableClassificationsSourceMetric), 2); + histogram_tester.ExpectTotalCount(kApplicableClassificationsDestinationMetric, + 1); + ASSERT_EQ( + histogram_tester.GetTotalSum(kApplicableClassificationsDestinationMetric), + 0); + histogram_tester.ExpectTotalCount(kApplicableClassificationsInvalidMetric, 0); +} + +TEST_F( + UrlParamClassificationsLoaderTest, + ReadClassifications_DuplicateKeysNonExperimentalThenExperimental_NonExperimentalTagApplied) { + base::HistogramTester histogram_tester; + FilterClassifications classifications; + + // Two classifications keyed in exactly the same way. + // The first classification is NON_EXPERIMENTAL but the second is + // EXPERIMENTAL. + AddClassification(classifications.add_classifications(), kSourceSite, + FilterClassification_SiteRole_SOURCE, + FilterClassification_SiteMatchType_EXACT_ETLD_PLUS_ONE, + {"plzblock"}, {FilterClassification::USE_CASE_UNKNOWN}, + {"not_default", "default"}); + AddClassification(classifications.add_classifications(), kSourceSite, + FilterClassification_SiteRole_SOURCE, + FilterClassification_SiteMatchType_EXACT_ETLD_PLUS_ONE, + {"plzblock"}, {FilterClassification::USE_CASE_UNKNOWN}, + {"not_default"}); + + const std::string experiment_identifier = "not_default"; + base::test::ScopedFeatureList scoped_feature_list; + base::FieldTrialParams params; + params["experiment_identifier"] = experiment_identifier; + scoped_feature_list.InitAndEnableFeatureWithParameters( + features::kIncognitoParamFilterEnabled, params); + SetComponentFileContents(classifications.SerializeAsString()); + loader()->ReadClassifications(test_file_contents()); + + // The parameter is marked as NON_EXPERIMENTAL. + EXPECT_THAT( + loader()->GetClassifications(), + UnorderedElementsAre( + Pair(SourceKey(kSourceSite), + UnorderedElementsAre(Pair( + FilterClassification::USE_CASE_UNKNOWN, + UnorderedElementsAre(Pair( + "plzblock", + ClassificationExperimentStatus::NON_EXPERIMENTAL))))))); + + histogram_tester.ExpectTotalCount(kApplicableClassificationsSourceMetric, 1); + ASSERT_EQ( + histogram_tester.GetTotalSum(kApplicableClassificationsSourceMetric), 2); + histogram_tester.ExpectTotalCount(kApplicableClassificationsDestinationMetric, + 1); + ASSERT_EQ( + histogram_tester.GetTotalSum(kApplicableClassificationsDestinationMetric), + 0); + histogram_tester.ExpectTotalCount(kApplicableClassificationsInvalidMetric, 0); +} + TEST_F(UrlParamClassificationsLoaderTest, ReadClassifications_SiteMatchTypeSetToUnknown_DefaultsToETLDPlusOne) { base::HistogramTester histogram_tester;
diff --git a/components/viz/service/display/renderer_pixeltest.cc b/components/viz/service/display/renderer_pixeltest.cc index af59e3e..4a3aea7 100644 --- a/components/viz/service/display/renderer_pixeltest.cc +++ b/components/viz/service/display/renderer_pixeltest.cc
@@ -4577,7 +4577,7 @@ SkColors::kWhite, false); gfx::RRectF rounded_corner_bounds(gfx::RectF(pass_rect), kCornerRadius); - gfx::LinearGradient gradient_mask(90); + gfx::LinearGradient gradient_mask(330); gradient_mask.AddStep(/*percent=*/0, /*alpha=*/0); gradient_mask.AddStep(50, 255); gradient_mask.AddStep(100, 255); @@ -4646,7 +4646,7 @@ SkColors::kWhite, false); gfx::RRectF rounded_corner_bounds(gfx::RectF(pass_rect), kCornerRadius); - gfx::LinearGradient gradient_mask(90); + gfx::LinearGradient gradient_mask(-30); gradient_mask.AddStep(/*percent=*/0, /*alpha=*/0); gradient_mask.AddStep(50, 255); gradient_mask.AddStep(100, 255);
diff --git a/components/viz/service/display/skia_renderer.cc b/components/viz/service/display/skia_renderer.cc index 60d2f61..25c199e 100644 --- a/components/viz/service/display/skia_renderer.cc +++ b/components/viz/service/display/skia_renderer.cc
@@ -1242,61 +1242,42 @@ const gfx::RectF rect = mask_filter_info->bounds(); const absl::optional<gfx::LinearGradient>& gradient_mask = mask_filter_info->gradient_mask(); - const int16_t angle = gradient_mask->angle() % 360; - // For positive angles, the start point is the bottom left rect point. For - // negative angles, the start point is the upper left rect point. - bool negative = angle < 0; + int16_t angle = gradient_mask->angle() % 360; + if (angle < 0) angle += 360; + SkPoint start_end[2]; - start_end[0] = {0, negative ? 0 : rect.height()}; - // We explicitly specify the end point when cos(angle) = 0 and for axis - // aligned angles, where complex computation is not required to determine the - // end point. - switch (std::abs(angle)) { - case 0: - ABSL_FALLTHROUGH_INTENDED; - case 180: - ABSL_FALLTHROUGH_INTENDED; - case 360: - start_end[1] = {rect.width(), negative ? 0 : rect.height()}; - break; - case 90: - ABSL_FALLTHROUGH_INTENDED; - case 270: - start_end[1] = {0, negative ? rect.height() : 0}; - break; - // For non-axis aligned angles, the end point is the intersection of - // the gradient line and the normal line. The normal line is orthogonal to - // the gradient line and intersects the corner diagonal from the start - // point. - // Positive angle gradient line example: - // + - // +-/-------+ - // |/ ) | - // +---------+ - // - // Negative angle gradient line example: - // +---------+ - // |\ ) | - // +-\-------+ - // + - default: { - // TODO(crbug.com/1039003): add computation for angles >90 deg. - float rad_angle = gfx::DegToRad(static_cast<float>(angle)); - float s = std::sin(rad_angle); - float c = std::cos(rad_angle); - float t = std::tan(rad_angle); + float rad_angle = gfx::DegToRad(static_cast<float>(angle)); + float s = std::sin(rad_angle); + float c = std::cos(rad_angle); - float a = rect.width() * t; - float b = rect.height() - a; - float cc = b * s; - float d = cc * c; - float e = cc * s; - float end_x = (rect.width() + d); - float end_y = negative ? (a + e) : (rect.height() - a - e); + if (angle % 180 > 90) { + float start_x = rect.width() * c * c; + float start_y = rect.height() - (rect.width() * s * c); + float end_x = rect.height() * s * c; + float end_y = rect.height() * c * c; + if (angle < 180) { + start_end[0] = {start_x, start_y}; start_end[1] = {end_x, end_y}; + } else { + start_end[0] = {end_x, end_y}; + start_end[1] = {start_x, start_y}; + } + + } else { + float start_x = -rect.height() * s * c; + float start_y = rect.height() * s * s; + float end_x = rect.width() * c * c; + float end_y = -rect.width() * s * c; + + if (angle < 180) { + start_end[0] = {start_x, start_y}; + start_end[1] = {end_x, end_y}; + } else { + start_end[0] = {end_x, end_y}; + start_end[1] = {start_x, start_y}; } }
diff --git a/components/viz/test/data/linear_gradient_render_pass.png b/components/viz/test/data/linear_gradient_render_pass.png index 3725d53..f22469f8 100644 --- a/components/viz/test/data/linear_gradient_render_pass.png +++ b/components/viz/test/data/linear_gradient_render_pass.png Binary files differ
diff --git a/components/viz/test/data/multi_linear_gradient_render_pass.png b/components/viz/test/data/multi_linear_gradient_render_pass.png index ebd4829..2526d02 100644 --- a/components/viz/test/data/multi_linear_gradient_render_pass.png +++ b/components/viz/test/data/multi_linear_gradient_render_pass.png Binary files differ
diff --git a/content/browser/accessibility/browser_accessibility_manager.cc b/content/browser/accessibility/browser_accessibility_manager.cc index 9556580..1726c31c 100644 --- a/content/browser/accessibility/browser_accessibility_manager.cc +++ b/content/browser/accessibility/browser_accessibility_manager.cc
@@ -439,20 +439,25 @@ void BrowserAccessibilityManager::EnsureParentConnectionIfNotRootManager() { BrowserAccessibility* parent = GetParentNodeFromParentTree(); if (parent) { - if (!connected_to_parent_tree_node_) { + if (!connected_to_parent_tree_node_) ParentConnectionChanged(parent); - } - } else if (connected_to_parent_tree_node_) { - // This manager was previously connected to a parent manager but now became - // the new root manager. - SANITIZER_CHECK(IsRootTree()) - << "Disconnected from parent manager, root url =: " - << delegate_->AccessibilityRenderFrameHost() - ->GetParentOrOuterDocumentOrEmbedder() - ->GetLastCommittedURL() - << "\ncurrent url = " - << delegate_->AccessibilityRenderFrameHost()->GetLastCommittedURL(); + SANITIZER_CHECK(!IsRootTree()); + return; + } + + if (connected_to_parent_tree_node_) { connected_to_parent_tree_node_ = false; + // Two possible cases: + // 1. This manager was previously connected to a parent manager but now + // became the new root manager. One example where this can happen is portal + // activation. + // 2. The parent host node for this child tree was removed. Because the + // connection with the root has been severed, it will no longer be possible + // to fire events, as this BrowserAccessibilityManager is no longer tied to + // an existing document. Due to race conditions, in some cases, |this| is + // destroyed first, and this condition is not reached; while in other cases + // the parent node is destroyed first (this case). + DCHECK(IsRootTree() || !CanFireEvents()); } }
diff --git a/content/browser/accessibility/browser_accessibility_manager.h b/content/browser/accessibility/browser_accessibility_manager.h index c3d5c0a..6e4bed1 100644 --- a/content/browser/accessibility/browser_accessibility_manager.h +++ b/content/browser/accessibility/browser_accessibility_manager.h
@@ -212,11 +212,6 @@ // If this tree has a parent tree, return the parent node in that tree. BrowserAccessibility* GetParentNodeFromParentTree() const; - // Refreshes a parent node in a parent tree when it needs to be informed that - // this tree is ready or being destroyed. For example, an iframe object - // in a parent tree may need to link or unlink to this manager. - void ParentConnectionChanged(BrowserAccessibility* parent); - // In general, there is only a single node with the role of kRootWebArea, // but if a popup is opened, a second nested "root" is created in the same // tree as the "true" root. This will keep track of the nested root node. @@ -702,6 +697,11 @@ // connected, post the proper notifications on the parent. void EnsureParentConnectionIfNotRootManager(); + // Refreshes a parent node in a parent tree when it needs to be informed that + // this tree is ready or being destroyed. For example, an iframe object + // in a parent tree may need to link or unlink to this manager. + void ParentConnectionChanged(BrowserAccessibility* parent); + // If this BrowserAccessibilityManager is a child frame or guest frame, // returns the BrowserAccessibilityManager from the parent document in the // frame tree. If the current frame is not connected to its parent frame yet,
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc index 1bb23ab..635f605 100644 --- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc +++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -1279,6 +1279,11 @@ } IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, + AccessibilityAriaRequiredEmptyInput) { + RunAriaTest(FILE_PATH_LITERAL("aria-required-empty-input.html")); +} + +IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityAriaRoleDescription) { RunAriaTest(FILE_PATH_LITERAL("aria-roledescription.html")); }
diff --git a/content/browser/aggregation_service/aggregatable_report_scheduler.cc b/content/browser/aggregation_service/aggregatable_report_scheduler.cc index 0547557..9aa433b3 100644 --- a/content/browser/aggregation_service/aggregatable_report_scheduler.cc +++ b/content/browser/aggregation_service/aggregatable_report_scheduler.cc
@@ -106,8 +106,11 @@ void AggregatableReportScheduler::TimerDelegate::AdjustOfflineReportTimes( base::OnceCallback<void(absl::optional<base::Time>)> maybe_set_timer_cb) { - // TODO(crbug.com/1340042): Implement offline and startup handling - std::move(maybe_set_timer_cb).Run(absl::nullopt); + storage_context_->GetStorage() + .AsyncCall(&AggregationServiceStorage::AdjustOfflineReportTimes) + .WithArgs(base::Time::Now(), kOfflineReportTimeMinimumDelay, + kOfflineReportTimeMaximumDelay) + .Then(std::move(maybe_set_timer_cb)); } void AggregatableReportScheduler::TimerDelegate::NotifyRequestCompleted(
diff --git a/content/browser/aggregation_service/aggregatable_report_scheduler.h b/content/browser/aggregation_service/aggregatable_report_scheduler.h index 8875db4..7e10f2ff 100644 --- a/content/browser/aggregation_service/aggregatable_report_scheduler.h +++ b/content/browser/aggregation_service/aggregatable_report_scheduler.h
@@ -11,6 +11,7 @@ #include "base/callback.h" #include "base/memory/raw_ref.h" #include "base/memory/weak_ptr.h" +#include "base/time/time.h" #include "content/browser/aggregation_service/aggregation_service_storage.h" #include "content/browser/aggregation_service/report_scheduler_timer.h" #include "content/common/content_export.h" @@ -37,6 +38,14 @@ // clock time goes backward). class CONTENT_EXPORT AggregatableReportScheduler { public: + // Add uniform random noise in the range of [0, 1 minutes] to the report time + // when the browser comes back online. Aligned with + // `AttributionStorageDelegateImpl::GetOfflineReportDelayConfig()`. + static constexpr base::TimeDelta kOfflineReportTimeMinimumDelay = + base::Minutes(0); + static constexpr base::TimeDelta kOfflineReportTimeMaximumDelay = + base::Minutes(1); + AggregatableReportScheduler( AggregationServiceStorageContext* storage_context, base::RepeatingCallback<
diff --git a/content/browser/aggregation_service/aggregatable_report_scheduler_unittest.cc b/content/browser/aggregation_service/aggregatable_report_scheduler_unittest.cc index aea6e03d..f1bd3f9 100644 --- a/content/browser/aggregation_service/aggregatable_report_scheduler_unittest.cc +++ b/content/browser/aggregation_service/aggregatable_report_scheduler_unittest.cc
@@ -19,6 +19,8 @@ #include "content/browser/aggregation_service/aggregatable_report.h" #include "content/browser/aggregation_service/aggregation_service_storage.h" #include "content/browser/aggregation_service/aggregation_service_test_utils.h" +#include "services/network/public/mojom/network_change_manager.mojom.h" +#include "services/network/test/test_network_connection_tracker.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -33,6 +35,8 @@ // Will be used to verify the sequence of expected function calls. using Checkpoint = ::testing::MockFunction<void(int)>; +// TODO(alexmt): Consider changing tests to avoid the assumption that this time +// is after `base::Time::Now()`. const base::Time kExampleTime = base::Time::FromJavaTime(1652984901234); } // namespace @@ -398,4 +402,93 @@ task_environment_.RunUntilIdle(); } +TEST_F(AggregatableReportSchedulerTest, + NetworkOffline_ReportsAreNotRetrievedUntilOnline) { + network::TestNetworkConnectionTracker::GetInstance()->SetConnectionType( + network::mojom::ConnectionType::CONNECTION_NONE); // Offline + + AggregatableReportRequest example_request = + aggregation_service::CreateExampleRequest(); + + AggregatableReportSharedInfo expected_shared_info = + example_request.shared_info().Clone(); + expected_shared_info.scheduled_report_time = kExampleTime; + + scheduler_.ScheduleRequest( + AggregatableReportRequest::Create(example_request.payload_contents(), + std::move(expected_shared_info)) + .value()); + + base::TimeDelta fast_forward_required = kExampleTime - base::Time::Now(); + + Checkpoint checkpoint; + { + testing::InSequence seq; + EXPECT_CALL(mock_callback_, Run).Times(0); + EXPECT_CALL(checkpoint, Call(1)); + EXPECT_CALL(mock_callback_, Run); + } + + // Need to fast forward beyond the report time so that it's in the past and + // will be updated. + task_environment_.FastForwardBy(fast_forward_required + + base::Microseconds(1)); + + network::TestNetworkConnectionTracker::GetInstance()->SetConnectionType( + network::mojom::ConnectionType::CONNECTION_UNKNOWN); // Online + + checkpoint.Call(1); + + // As the new report should've been delayed from 'now', we fast forward + // through that delay to trigger the report. + task_environment_.FastForwardBy( + AggregatableReportScheduler::kOfflineReportTimeMaximumDelay); +} + +TEST_F(AggregatableReportSchedulerTest, + OnlineConnectionChanges_ReportsAreNotRetrieved) { + network::TestNetworkConnectionTracker::GetInstance()->SetConnectionType( + network::mojom::ConnectionType::CONNECTION_3G); + + AggregatableReportRequest example_request = + aggregation_service::CreateExampleRequest(); + + AggregatableReportSharedInfo expected_shared_info = + example_request.shared_info().Clone(); + expected_shared_info.scheduled_report_time = kExampleTime; + + scheduler_.ScheduleRequest( + AggregatableReportRequest::Create(example_request.payload_contents(), + std::move(expected_shared_info)) + .value()); + + Checkpoint checkpoint; + { + testing::InSequence seq; + EXPECT_CALL(mock_callback_, Run).Times(0); + EXPECT_CALL(checkpoint, Call(1)); + EXPECT_CALL(mock_callback_, Run); + } + + // Deliberately avoid running tasks so that the connection change and time + // advance can be "atomic", which is necessary because + // `AttributionStorage::AdjustOfflineReportTimes()` only adjusts times for + // reports that should have been sent before now. In other words, the call to + // `AdjustOfflineReportTimes()` would have no effect if we used + // `FastForwardBy()` here, and we wouldn't be able to detect it below. + base::TimeDelta fast_forward_required = kExampleTime - base::Time::Now(); + + task_environment_.AdvanceClock(fast_forward_required + base::Microseconds(1)); + network::TestNetworkConnectionTracker::GetInstance()->SetConnectionType( + network::mojom::ConnectionType::CONNECTION_4G); + + checkpoint.Call(1); + + // Cause any scheduled tasks to run. If the report was delayed, this wouldn't + // be late enough for the report to be sent. There is a tiny chance that the + // report was only delayed by 0 or 1 microsecond, but this flake is rare + // enough to ignore (1 in 30 million runs). + task_environment_.FastForwardBy(base::TimeDelta()); +} + } // namespace content
diff --git a/content/browser/aggregation_service/aggregation_service_impl.cc b/content/browser/aggregation_service/aggregation_service_impl.cc index 2ef5d003..355f23e 100644 --- a/content/browser/aggregation_service/aggregation_service_impl.cc +++ b/content/browser/aggregation_service/aggregation_service_impl.cc
@@ -51,19 +51,26 @@ bool run_in_memory, const base::FilePath& user_data_directory, StoragePartitionImpl* storage_partition) - : AggregationServiceImpl( - run_in_memory, - user_data_directory, - base::DefaultClock::GetInstance(), - std::make_unique<AggregatableReportScheduler>( - /*storage_context=*/this, - // `base::Unretained` is safe as the scheduler is owned by `this`. - base::BindRepeating( - &AggregationServiceImpl::OnScheduledReportTimeReached, - base::Unretained(this))), - std::make_unique<AggregatableReportAssembler>(this, - storage_partition), - std::make_unique<AggregatableReportSender>(storage_partition)) {} + : storage_( + // Ensure storage is constructed first (and destroyed last) so we can + // safely pass `this` as an `AggregationServiceStorageContext` in the + // below constructors. + // TODO(alexmt): Pass the storage directly to avoid an extra wrapper. + base::SequenceBound<AggregationServiceStorageSql>( + g_storage_task_runner.Get(), + run_in_memory, + user_data_directory, + base::DefaultClock::GetInstance())), + scheduler_(std::make_unique<AggregatableReportScheduler>( + /*storage_context=*/this, + // `base::Unretained` is safe as the scheduler is owned by `this`. + base::BindRepeating( + &AggregationServiceImpl::OnScheduledReportTimeReached, + base::Unretained(this)))), + assembler_(std::make_unique<AggregatableReportAssembler>( + /*storage_context=*/this, + storage_partition)), + sender_(std::make_unique<AggregatableReportSender>(storage_partition)) {} AggregationServiceImpl::~AggregationServiceImpl() = default; @@ -88,12 +95,12 @@ std::unique_ptr<AggregatableReportScheduler> scheduler, std::unique_ptr<AggregatableReportAssembler> assembler, std::unique_ptr<AggregatableReportSender> sender) - : scheduler_(std::move(scheduler)), - storage_(base::SequenceBound<AggregationServiceStorageSql>( + : storage_(base::SequenceBound<AggregationServiceStorageSql>( g_storage_task_runner.Get(), run_in_memory, user_data_directory, clock)), + scheduler_(std::move(scheduler)), assembler_(std::move(assembler)), sender_(std::move(sender)) {}
diff --git a/content/browser/aggregation_service/aggregation_service_impl.h b/content/browser/aggregation_service/aggregation_service_impl.h index da14798..9a56d45 100644 --- a/content/browser/aggregation_service/aggregation_service_impl.h +++ b/content/browser/aggregation_service/aggregation_service_impl.h
@@ -105,8 +105,8 @@ void OnReportSendingComplete(AggregationServiceStorage::RequestId request_id, AggregatableReportSender::RequestStatus status); - std::unique_ptr<AggregatableReportScheduler> scheduler_; base::SequenceBound<AggregationServiceStorage> storage_; + std::unique_ptr<AggregatableReportScheduler> scheduler_; std::unique_ptr<AggregatableReportAssembler> assembler_; std::unique_ptr<AggregatableReportSender> sender_; };
diff --git a/content/browser/aggregation_service/aggregation_service_storage.h b/content/browser/aggregation_service/aggregation_service_storage.h index b01a244..1bd1066 100644 --- a/content/browser/aggregation_service/aggregation_service_storage.h +++ b/content/browser/aggregation_service/aggregation_service_storage.h
@@ -77,8 +77,15 @@ virtual std::vector<RequestAndId> GetRequestsReportingOnOrBefore( base::Time not_after_time) = 0; - // TODO(crbug.com/1340042): Add a method to randomly delay all reports in the - // past (for startup and coming online). + // Adjusts the report time of all reports with report times strictly before + // `now`. Each new report time is `now` + a random delay. The random delay for + // each report is picked independently from a uniform distribution between + // `min_delay` and `max_delay`, both inclusive. Returns the new first report + // time in storage, if any. + virtual absl::optional<base::Time> AdjustOfflineReportTimes( + base::Time now, + base::TimeDelta min_delay, + base::TimeDelta max_delay) = 0; // == Joint methods =====
diff --git a/content/browser/aggregation_service/aggregation_service_storage_sql.cc b/content/browser/aggregation_service/aggregation_service_storage_sql.cc index fc63592..27ae1b6 100644 --- a/content/browser/aggregation_service/aggregation_service_storage_sql.cc +++ b/content/browser/aggregation_service/aggregation_service_storage_sql.cc
@@ -31,6 +31,7 @@ #include "sql/database.h" #include "sql/meta_table.h" #include "sql/statement.h" +#include "sql/statement_id.h" #include "sql/transaction.h" #include "third_party/abseil-cpp/absl/numeric/int128.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -466,6 +467,12 @@ if (!EnsureDatabaseOpen(DbCreationPolicy::kFailIfAbsent)) return absl::nullopt; + return NextReportTimeAfterImpl(strictly_after_time); +} + +absl::optional<base::Time> +AggregationServiceStorageSql::NextReportTimeAfterImpl( + base::Time strictly_after_time) { static constexpr char kGetRequestsSql[] = "SELECT MIN(report_time) FROM report_requests WHERE report_time>?"; @@ -520,6 +527,43 @@ return result; } +absl::optional<base::Time> +AggregationServiceStorageSql::AdjustOfflineReportTimes( + base::Time now, + base::TimeDelta min_delay, + base::TimeDelta max_delay) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + DCHECK_GE(min_delay, base::TimeDelta()); + DCHECK_GE(max_delay, base::TimeDelta()); + DCHECK_LE(min_delay, max_delay); + + if (!EnsureDatabaseOpen(DbCreationPolicy::kFailIfAbsent)) + return absl::nullopt; + + // Set the report time for all reports that should have been sent before `now` + // to `now` + a random number of microseconds between `min_delay` and + // `max_delay`, both inclusive. We use RANDOM, instead of a C++ method to + // avoid having to pull all reports into memory and update them one by one. We + // use ABS because RANDOM may return a negative integer. We add 1 to the + // difference between `max_delay` and `min_delay` to ensure that the range of + // generated values is inclusive. If `max_delay == min_delay`, we take the + // remainder modulo 1, which is always 0. + static constexpr char kAdjustOfflineReportTimesSql[] = + "UPDATE report_requests SET report_time=?+ABS(RANDOM()%?)" + "WHERE report_time<?"; + + sql::Statement statement( + db_.GetCachedStatement(SQL_FROM_HERE, kAdjustOfflineReportTimesSql)); + statement.BindTime(0, now + min_delay); + statement.BindInt64(1, 1 + (max_delay - min_delay).InMicroseconds()); + statement.BindTime(2, now); + + statement.Run(); + + return NextReportTimeAfterImpl(base::Time::Min()); +} + void AggregationServiceStorageSql::ClearDataBetween( base::Time delete_begin, base::Time delete_end,
diff --git a/content/browser/aggregation_service/aggregation_service_storage_sql.h b/content/browser/aggregation_service/aggregation_service_storage_sql.h index ede193c3..9d2b8e4 100644 --- a/content/browser/aggregation_service/aggregation_service_storage_sql.h +++ b/content/browser/aggregation_service/aggregation_service_storage_sql.h
@@ -65,6 +65,10 @@ base::Time strictly_after_time) override; std::vector<AggregationServiceStorage::RequestAndId> GetRequestsReportingOnOrBefore(base::Time not_after_time) override; + absl::optional<base::Time> AdjustOfflineReportTimes( + base::Time now, + base::TimeDelta min_delay, + base::TimeDelta max_delay) override; void ClearDataBetween( base::Time delete_begin, base::Time delete_end, @@ -132,6 +136,9 @@ bool DeleteRequestImpl(RequestId request_id) VALID_CONTEXT_REQUIRED(sequence_checker_); + absl::optional<base::Time> NextReportTimeAfterImpl( + base::Time strictly_after_time) VALID_CONTEXT_REQUIRED(sequence_checker_); + // Clears the report requests that were stored between `delete_begin` and // `delete_end` time (inclusive). Null times are treated as unbounded lower or // upper range. If `!filter.is_null()`, only requests with reporting origins
diff --git a/content/browser/aggregation_service/aggregation_service_storage_sql_unittest.cc b/content/browser/aggregation_service/aggregation_service_storage_sql_unittest.cc index c7d091cf..0b6559bfb 100644 --- a/content/browser/aggregation_service/aggregation_service_storage_sql_unittest.cc +++ b/content/browser/aggregation_service/aggregation_service_storage_sql_unittest.cc
@@ -740,6 +740,142 @@ EXPECT_EQ(stored_reports[0].id, AggregationServiceStorage::RequestId(3)); } +TEST_F(AggregationServiceStorageSqlTest, + AdjustOfflineReportTimes_AffectsPastReportsOnly) { + OpenDatabase(); + + AggregatableReportRequest request = + aggregation_service::CreateExampleRequest(); + + base::Time original_report_time = request.shared_info().scheduled_report_time; + + storage_->StoreRequest(aggregation_service::CloneReportRequest(request)); + EXPECT_EQ(storage_->NextReportTimeAfter(base::Time::Min()), + original_report_time); + + // As `now` is before the report time, the report shouldn't be affected. + EXPECT_EQ(storage_->AdjustOfflineReportTimes( + /*now=*/original_report_time - base::Minutes(1), + /*min_delay=*/base::Minutes(1), + /*max_delay=*/base::Minutes(2)), + original_report_time); + EXPECT_EQ(storage_->NextReportTimeAfter(base::Time::Min()), + original_report_time); + + // Report times equal to `now` are also unaffected. + EXPECT_EQ(storage_->AdjustOfflineReportTimes(/*now=*/original_report_time, + /*min_delay=*/base::Minutes(1), + /*max_delay=*/base::Minutes(2)), + original_report_time); + EXPECT_EQ(storage_->NextReportTimeAfter(base::Time::Min()), + original_report_time); + + { + // The report time is now considered in the past so it is adjusted. + absl::optional<base::Time> new_report_time = + storage_->AdjustOfflineReportTimes( + /*now=*/original_report_time + base::Minutes(1), + /*min_delay=*/base::Minutes(1), + /*max_delay=*/base::Minutes(2)); + EXPECT_EQ(storage_->NextReportTimeAfter(base::Time::Min()), + new_report_time); + ASSERT_TRUE(new_report_time.has_value()); + EXPECT_GE(new_report_time.value(), original_report_time + base::Minutes(2)); + EXPECT_LE(new_report_time.value(), original_report_time + base::Minutes(3)); + } +} + +TEST_F(AggregationServiceStorageSqlTest, + AdjustOfflineReportTimes_SupportsZeroMinAndConstantDelay) { + OpenDatabase(); + + AggregatableReportRequest request = + aggregation_service::CreateExampleRequest(); + + base::Time original_report_time = request.shared_info().scheduled_report_time; + + storage_->StoreRequest(aggregation_service::CloneReportRequest(request)); + EXPECT_EQ(storage_->NextReportTimeAfter(base::Time::Min()), + original_report_time); + + { + // The delay can be constant (i.e. min delay can be equal to max delay) + absl::optional<base::Time> new_report_time = + storage_->AdjustOfflineReportTimes( + /*now=*/original_report_time + base::Minutes(1), + /*min_delay=*/base::Minutes(1), + /*max_delay=*/base::Minutes(1)); + + EXPECT_EQ(storage_->NextReportTimeAfter(base::Time::Min()), + new_report_time); + ASSERT_TRUE(new_report_time.has_value()); + EXPECT_EQ(new_report_time.value(), original_report_time + base::Minutes(2)); + } + + { + // The min delay can be zero + absl::optional<base::Time> new_report_time = + storage_->AdjustOfflineReportTimes( + /*now=*/original_report_time + base::Minutes(5), + /*min_delay=*/base::Minutes(0), + /*max_delay=*/base::Minutes(1)); + EXPECT_EQ(storage_->NextReportTimeAfter(base::Time::Min()), + new_report_time); + ASSERT_TRUE(new_report_time.has_value()); + EXPECT_GE(new_report_time.value(), original_report_time + base::Minutes(5)); + EXPECT_LE(new_report_time.value(), original_report_time + base::Minutes(6)); + } +} + +TEST_F(AggregationServiceStorageSqlTest, + AdjustOfflineReportTimes_MultipleReports) { + OpenDatabase(); + + const base::Time kExampleTime = base::Time::FromJavaTime(1652984901234); + + std::vector<base::Time> scheduled_report_times = { + kExampleTime, kExampleTime + base::Hours(1), + kExampleTime - base::Hours(1)}; + + for (base::Time scheduled_report_time : scheduled_report_times) { + AggregatableReportRequest example_request = + aggregation_service::CreateExampleRequest(); + AggregatableReportSharedInfo shared_info = + example_request.shared_info().Clone(); + shared_info.scheduled_report_time = scheduled_report_time; + + absl::optional<AggregatableReportRequest> request = + AggregatableReportRequest::Create(example_request.payload_contents(), + std::move(shared_info)); + ASSERT_TRUE(request.has_value()); + + storage_->StoreRequest(std::move(request.value())); + } + + EXPECT_EQ(storage_->NextReportTimeAfter(base::Time::Min()), + kExampleTime - base::Hours(1)); + EXPECT_EQ(storage_->GetRequestsReportingOnOrBefore(base::Time::Max()).size(), + 3u); + + // Should only affect the third report. + EXPECT_EQ(storage_->AdjustOfflineReportTimes( + /*now=*/kExampleTime, + /*min_delay=*/base::Minutes(1), + /*max_delay=*/base::Minutes(1)), + kExampleTime); + + // Next report is now the first. + EXPECT_EQ(storage_->NextReportTimeAfter(base::Time::Min()), kExampleTime); + + // After that is the third report with a delay applied + EXPECT_EQ(storage_->NextReportTimeAfter(kExampleTime), + kExampleTime + base::Minutes(1)); + + // Finally there's the unaffected second report. + EXPECT_EQ(storage_->NextReportTimeAfter(kExampleTime + base::Minutes(1)), + kExampleTime + base::Hours(1)); +} + TEST_F(AggregationServiceStorageSqlInMemoryTest, DatabaseInMemoryReopened_RequestsNotPersisted) { OpenDatabase();
diff --git a/content/browser/back_forward_cache_browsertest.cc b/content/browser/back_forward_cache_browsertest.cc index e86e2927..624e063 100644 --- a/content/browser/back_forward_cache_browsertest.cc +++ b/content/browser/back_forward_cache_browsertest.cc
@@ -2283,8 +2283,15 @@ // Tests that trying to focus on a BFCached cross-site iframe won't crash. // See https://crbug.com/1250218. +// TODO(crbug.com/1349657): Flaky on linux tsan +#if BUILDFLAG(IS_LINUX) && defined(THREAD_SANITIZER) +#define MAYBE_FocusSameSiteSubframeOnPagehide \ + DISABLED_FocusSameSiteSubframeOnPagehide +#else +#define MAYBE_FocusSameSiteSubframeOnPagehide FocusSameSiteSubframeOnPagehide +#endif IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest, - FocusSameSiteSubframeOnPagehide) { + MAYBE_FocusSameSiteSubframeOnPagehide) { ASSERT_TRUE(embedded_test_server()->Start()); GURL main_url( embedded_test_server()->GetURL("a.com", "/page_with_iframe.html"));
diff --git a/content/browser/devtools/devtools_instrumentation.cc b/content/browser/devtools/devtools_instrumentation.cc index 42d7d374..dc37e11 100644 --- a/content/browser/devtools/devtools_instrumentation.cc +++ b/content/browser/devtools/devtools_instrumentation.cc
@@ -210,11 +210,6 @@ kErrorFetchingClientMetadataInvalidResponse: { return FederatedAuthRequestIssueReasonEnum::ClientMetadataInvalidResponse; } - case FederatedAuthRequestResult:: - kErrorClientMetadataMissingPrivacyPolicyUrl: { - return FederatedAuthRequestIssueReasonEnum:: - ClientMetadataMissingPrivacyPolicyUrl; - } case FederatedAuthRequestResult::kErrorFetchingAccountsHttpNotFound: { return FederatedAuthRequestIssueReasonEnum::AccountsHttpNotFound; }
diff --git a/content/browser/first_party_sets/first_party_sets_handler_impl.cc b/content/browser/first_party_sets/first_party_sets_handler_impl.cc index 71b87dd8..ed490cf 100644 --- a/content/browser/first_party_sets/first_party_sets_handler_impl.cc +++ b/content/browser/first_party_sets/first_party_sets_handler_impl.cc
@@ -149,6 +149,22 @@ return normalized_additions; } +// TODO(https://crbug.com/1349487): Since this is basically the same as +// FirstPartySetsManager::FindOwnerInternal(), move the common algorithm into +// //net to be reused in both here and FirstPartySetsManager. +absl::optional<net::SchemefulSite> FindOwner( + const net::SchemefulSite& site, + const FirstPartySetsHandlerImpl::FlattenedSets& sets, + const FirstPartySetsHandlerImpl::PolicyCustomization& policy_sets) { + absl::optional<net::SchemefulSite> owner; + if (const auto it = policy_sets.find(site); it != policy_sets.end()) { + owner = it->second; + } else if (const auto it = sets.find(site); it != sets.end()) { + owner = it->second; + } + return owner; +} + } // namespace bool FirstPartySetsHandler::PolicyParsingError::operator==( @@ -464,28 +480,40 @@ // static base::flat_set<net::SchemefulSite> FirstPartySetsHandlerImpl::ComputeSetsDiff( - const base::flat_map<net::SchemefulSite, net::SchemefulSite>& old_sets, - const base::flat_map<net::SchemefulSite, net::SchemefulSite>& - current_sets) { - if (old_sets.empty()) + const FirstPartySetsHandlerImpl::FlattenedSets& old_sets, + const FirstPartySetsHandlerImpl::PolicyCustomization& old_policy, + const FirstPartySetsHandlerImpl::FlattenedSets& current_sets, + const FirstPartySetsHandlerImpl::PolicyCustomization& current_policy) { + // TODO(https://crbug.com/1219656): For now we don't clear site data if FPSs + // is disabled. This may change with future feature ruquest. + if ((old_sets.empty() && old_policy.empty()) || + (current_sets.empty() && current_policy.empty())) return {}; std::vector<net::SchemefulSite> result; - if (current_sets.empty()) { - result.reserve(old_sets.size()); - for (const auto& pair : old_sets) { - result.push_back(pair.first); - } - return result; - } for (const auto& old_pair : old_sets) { const net::SchemefulSite& old_member = old_pair.first; const net::SchemefulSite& old_owner = old_pair.second; - const auto current_pair = current_sets.find(old_member); + if (base::Contains(old_policy, old_member)) + continue; + + absl::optional<net::SchemefulSite> current_owner = + FindOwner(old_member, current_sets, current_policy); // Look for the removed sites and the ones have owner changed. - if (current_pair == current_sets.end() || - current_pair->second != old_owner) { + if (!current_owner.has_value() || current_owner.value() != old_owner) { + result.push_back(old_member); + } + } + + for (const auto& old_pair : old_policy) { + const net::SchemefulSite& old_member = old_pair.first; + const absl::optional<net::SchemefulSite>& old_owner = old_pair.second; + + absl::optional<net::SchemefulSite> current_owner = + FindOwner(old_member, current_sets, current_policy); + // Look for the ones have owner changed. + if (old_owner.has_value() && current_owner != old_owner) { result.push_back(old_member); } } @@ -497,11 +525,6 @@ DCHECK(sets_.has_value()); DCHECK(raw_persisted_sets_.has_value()); - base::flat_set<net::SchemefulSite> diff = - ComputeSetsDiff(FirstPartySetParser::DeserializeFirstPartySets( - raw_persisted_sets_.value()), - sets_.value()); - // TODO(shuuran@chromium.org): Implement site state clearing. if (!persisted_sets_path_.empty()) {
diff --git a/content/browser/first_party_sets/first_party_sets_handler_impl.h b/content/browser/first_party_sets/first_party_sets_handler_impl.h index aa8ed567a..b5afe603 100644 --- a/content/browser/first_party_sets/first_party_sets_handler_impl.h +++ b/content/browser/first_party_sets/first_party_sets_handler_impl.h
@@ -88,16 +88,19 @@ embedder_will_provide_public_sets_ = enabled_ && will_provide; } - // Compares the map `old_sets` to `current_sets` and returns the set of - // sites that: 1) were in `old_sets` but are no longer in `current_sets`, - // i.e. leave the FPSs; or, 2) mapped to a different owner site. + // Gets the difference between the previously used FPSs info with the current + // FPSs info by comparing the combined `old_sets` and `old_policy` with the + // combined `current_sets` and `current_policy`. Returns the set of sites + // that: 1) were in old FPSs but are no longer in current FPSs i.e. leave the + // FPSs; or, 2) mapped to a different owner site. // // This method assumes that the sites were normalized properly when the maps // were created. Made public only for testing, static base::flat_set<net::SchemefulSite> ComputeSetsDiff( - const base::flat_map<net::SchemefulSite, net::SchemefulSite>& old_sets, - const base::flat_map<net::SchemefulSite, net::SchemefulSite>& - current_sets); + const FlattenedSets& old_sets, + const PolicyCustomization& old_policy, + const FlattenedSets& current_sets, + const PolicyCustomization& current_policy); // Computes information needed by the FirstPartySetsAccessDelegate in order // to update the browser's list of First-Party Sets to respect a profile's
diff --git a/content/browser/first_party_sets/first_party_sets_handler_impl_unittest.cc b/content/browser/first_party_sets/first_party_sets_handler_impl_unittest.cc index 09b8ba750..65dd537 100644 --- a/content/browser/first_party_sets/first_party_sets_handler_impl_unittest.cc +++ b/content/browser/first_party_sets/first_party_sets_handler_impl_unittest.cc
@@ -132,7 +132,8 @@ // "https://foo.test" and "https://member2.test" joined FPSs. We don't clear // site data upon joining, so the computed diff should be empty set. EXPECT_THAT( - FirstPartySetsHandlerImpl::ComputeSetsDiff(old_sets, current_sets), + FirstPartySetsHandlerImpl::ComputeSetsDiff( + old_sets, /*old_policy=*/{}, current_sets, /*current_policy=*/{}), IsEmpty()); } @@ -168,7 +169,8 @@ // Expected diff: "https://foo.test", "https://member2.test" and // "https://member3.test" left FPSs. EXPECT_THAT( - FirstPartySetsHandlerImpl::ComputeSetsDiff(old_sets, current_sets), + FirstPartySetsHandlerImpl::ComputeSetsDiff( + old_sets, /*old_policy=*/{}, current_sets, /*current_policy=*/{}), UnorderedElementsAre(SerializesTo("https://foo.test"), SerializesTo("https://member2.test"), SerializesTo("https://member3.test"))); @@ -214,7 +216,8 @@ // Expected diff: "https://member3.test" changed owner. EXPECT_THAT( - FirstPartySetsHandlerImpl::ComputeSetsDiff(old_sets, current_sets), + FirstPartySetsHandlerImpl::ComputeSetsDiff( + old_sets, /*old_policy=*/{}, current_sets, /*current_policy=*/{}), UnorderedElementsAre(SerializesTo("https://member3.test"))); } @@ -248,7 +251,8 @@ // isn't sophisticated enough yet to know that foo.test and bar.test don't // need to be included in the result. EXPECT_THAT( - FirstPartySetsHandlerImpl::ComputeSetsDiff(old_sets, current_sets), + FirstPartySetsHandlerImpl::ComputeSetsDiff( + old_sets, /*old_policy=*/{}, current_sets, /*current_policy=*/{}), UnorderedElementsAre(SerializesTo("https://example.test"), SerializesTo("https://foo.test"), SerializesTo("https://bar.test"))); @@ -281,7 +285,8 @@ // It would be valid to not include example.test and foo.test in the result, // but our logic isn't sophisticated enough yet to know that.ß EXPECT_THAT( - FirstPartySetsHandlerImpl::ComputeSetsDiff(old_sets, current_sets), + FirstPartySetsHandlerImpl::ComputeSetsDiff( + old_sets, /*old_policy=*/{}, current_sets, /*current_policy=*/{}), UnorderedElementsAre(SerializesTo("https://example.test"), SerializesTo("https://foo.test"))); } @@ -298,7 +303,9 @@ R"("members": ["https://member1.test"]})"), current_sets); - EXPECT_THAT(FirstPartySetsHandlerImpl::ComputeSetsDiff({}, current_sets), + EXPECT_THAT(FirstPartySetsHandlerImpl::ComputeSetsDiff( + /*old_sets=*/{}, /*old_policy=*/{}, current_sets, + /*current_policy=*/{}), IsEmpty()); } @@ -314,9 +321,149 @@ R"("members": ["https://member1.test"]})"), old_sets); - EXPECT_THAT(FirstPartySetsHandlerImpl::ComputeSetsDiff(old_sets, {}), + EXPECT_THAT(FirstPartySetsHandlerImpl::ComputeSetsDiff( + old_sets, /*old_policy=*/{}, /*current_sets=*/{}, + /*current_policy=*/{}), + IsEmpty()); +} + +TEST(FirstPartySetsHandlerImpl, ComputeSetsDiff_PolicySitesJoined) { + FirstPartySetsHandlerImpl::PolicyCustomization current_policy = { + {net::SchemefulSite(GURL("https://foo.test")), + {net::SchemefulSite(GURL("https://foo.test"))}}, + {net::SchemefulSite(GURL("https://member2.test")), + {net::SchemefulSite(GURL("https://foo.test"))}}, + }; + + // "https://example.test" and "https://member2.test" joined FPSs via + // enterprise policy. We don't clear site data upon joining, so the computed + // diff should be empty. + EXPECT_THAT(FirstPartySetsHandlerImpl::ComputeSetsDiff( + /*old_sets=*/{}, /*old_sets=*/{}, /*current_sets=*/{}, + current_policy), + IsEmpty()); +} + +TEST(FirstPartySetsHandlerImpl, ComputeSetsDiff_PolicyRemovedSitesJoined) { + FirstPartySetsHandlerImpl::FlattenedSets sets = { + {net::SchemefulSite(GURL("https://example.test")), + net::SchemefulSite(GURL("https://example.test"))}, + {net::SchemefulSite(GURL("https://member1.test")), + net::SchemefulSite(GURL("https://example.test"))}}; + // Consistency check the reviewer-friendly format matches the input. + ASSERT_THAT(ParseSetsFromStream(R"({"owner": "https://example.test",)" + R"("members": ["https://member1.test"]})"), + sets); + + // "https://example.test" was removed from FPSs by policy modifications. + FirstPartySetsHandlerImpl::PolicyCustomization old_policy = { + {net::SchemefulSite(GURL("https://foo.test")), + {net::SchemefulSite(GURL("https://foo.test"))}}, + {net::SchemefulSite(GURL("https://member1.test")), + {net::SchemefulSite(GURL("https://foo.test"))}}, + {net::SchemefulSite(GURL("https://example.test")), absl::nullopt}, + }; + + // "https://example.test" added back to FPSs. + FirstPartySetsHandlerImpl::PolicyCustomization current_policy = { + {net::SchemefulSite(GURL("https://foo.test")), + {net::SchemefulSite(GURL("https://foo.test"))}}, + {net::SchemefulSite(GURL("https://member1.test")), + {net::SchemefulSite(GURL("https://foo.test"))}}, + {net::SchemefulSite(GURL("https://example.test")), + {net::SchemefulSite(GURL("https://foo.test"))}}, + }; + + // We don't clear site data upon joining, so the computed diff should be + // empty. + EXPECT_THAT( + FirstPartySetsHandlerImpl::ComputeSetsDiff( + /*old_sets=*/sets, old_policy, /*current_sets=*/sets, current_policy), + IsEmpty()); +} + +TEST(FirstPartySetsHandlerImpl, ComputeSetsDiff_PolicyMemberLeft) { + FirstPartySetsHandlerImpl::PolicyCustomization old_policy = { + {net::SchemefulSite(GURL("https://foo.test")), + {net::SchemefulSite(GURL("https://foo.test"))}}, + {net::SchemefulSite(GURL("https://member1.test")), + {net::SchemefulSite(GURL("https://foo.test"))}}, + {net::SchemefulSite(GURL("https://member2.test")), + {net::SchemefulSite(GURL("https://foo.test"))}}, + }; + + // "https://member2.test" left FPSs via enterprise policy. + FirstPartySetsHandlerImpl::PolicyCustomization current_policy = { + {net::SchemefulSite(GURL("https://foo.test")), + {net::SchemefulSite(GURL("https://foo.test"))}}, + {net::SchemefulSite(GURL("https://member1.test")), + {net::SchemefulSite(GURL("https://foo.test"))}}, + }; + + EXPECT_THAT( + FirstPartySetsHandlerImpl::ComputeSetsDiff( + /*old_sets=*/{}, old_policy, /*current_sets=*/{}, current_policy), + UnorderedElementsAre(SerializesTo("https://member2.test"))); +} + +TEST(FirstPartySetsHandlerImpl, ComputeSetsDiff_PolicyOwnerLeft) { + FirstPartySetsHandlerImpl::PolicyCustomization old_policy = { + {net::SchemefulSite(GURL("https://example.test")), + {net::SchemefulSite(GURL("https://example.test"))}}, + {net::SchemefulSite(GURL("https://member1.test")), + {net::SchemefulSite(GURL("https://example.test"))}}, + {net::SchemefulSite(GURL("https://member2.test")), + {net::SchemefulSite(GURL("https://example.test"))}}, + }; + + FirstPartySetsHandlerImpl::PolicyCustomization current_policy = { + {net::SchemefulSite(GURL("https://member1.test")), + {net::SchemefulSite(GURL("https://member1.test"))}}, + {net::SchemefulSite(GURL("https://member2.test")), + {net::SchemefulSite(GURL("https://member1.test"))}}, + }; + + // Expected diff: "https://example.test" left FPSs, "https://member1.test" and + // "https://member2.test" changed owner. + // It would be valid to only have example.test in the diff, but our logic + // isn't sophisticated enough yet to know that member1.test and member2.test + // don't need to be included in the result. + EXPECT_THAT(FirstPartySetsHandlerImpl::ComputeSetsDiff( + /*old_sets=*/{}, /*old_policy=*/old_policy, + /*current_sets=*/{}, current_policy), UnorderedElementsAre(SerializesTo("https://example.test"), - SerializesTo("https://member1.test"))); + SerializesTo("https://member1.test"), + SerializesTo("https://member2.test"))); +} + +TEST(FirstPartySetsHandlerImpl, ComputeSetsDiff_PolicyMembersChangeSet) { + FirstPartySetsHandlerImpl::PolicyCustomization old_policy = { + {net::SchemefulSite(GURL("https://foo.test")), + {net::SchemefulSite(GURL("https://foo.test"))}}, + {net::SchemefulSite(GURL("https://member1.test")), + {net::SchemefulSite(GURL("https://foo.test"))}}, + {net::SchemefulSite(GURL("https://bar.test")), + {net::SchemefulSite(GURL("https://bar.test"))}}, + {net::SchemefulSite(GURL("https://member2.test")), + {net::SchemefulSite(GURL("https://bar.test"))}}, + }; + + FirstPartySetsHandlerImpl::PolicyCustomization current_policy = { + {net::SchemefulSite(GURL("https://foo.test")), + {net::SchemefulSite(GURL("https://foo.test"))}}, + {net::SchemefulSite(GURL("https://member2.test")), + {net::SchemefulSite(GURL("https://foo.test"))}}, + {net::SchemefulSite(GURL("https://bar.test")), + {net::SchemefulSite(GURL("https://bar.test"))}}, + {net::SchemefulSite(GURL("https://member1.test")), + {net::SchemefulSite(GURL("https://bar.test"))}}, + }; + + EXPECT_THAT( + FirstPartySetsHandlerImpl::ComputeSetsDiff( + /*old_sets=*/{}, old_policy, /*current_sets=*/{}, current_policy), + UnorderedElementsAre(SerializesTo("https://member1.test"), + SerializesTo("https://member2.test"))); } TEST(FirstPartySetsHandlerImpl, ValidateEnterprisePolicy_ValidPolicy) {
diff --git a/content/browser/navigation_browsertest.cc b/content/browser/navigation_browsertest.cc index 33cc4734..8a46943 100644 --- a/content/browser/navigation_browsertest.cc +++ b/content/browser/navigation_browsertest.cc
@@ -5629,10 +5629,10 @@ // This test's process layout is structured a bit differently from the main // frame case. PerformanceManager reports when a remote frame is attached to // a local parent, and it was previously getting confused by the fact that - // a RenderFrameProxy with matching RemoteFrameTokens was being reported as - // attached twice: once by the initial page loaded in the next statement, and - // the next when the browser needs to send a `UndoCommitNavigation()` to the - // a.com renderer. + // a `blink::RemoteFrame` with matching RemoteFrameTokens was being reported + // as attached twice: once by the initial page loaded in the next statement, + // and the next when the browser needs to send a `UndoCommitNavigation()` to + // the a.com renderer. ASSERT_TRUE(NavigateToURL( shell(), embedded_test_server()->GetURL( "a.com", "/cross_site_iframe_factory.html?a(b)"))); @@ -5662,7 +5662,7 @@ speculative_render_frame_host->GetProcess()); // Update the id attribute to exercise a PerformanceManager-specific code - // path: when the renderer swaps in a RenderFrameProxy to undo the + // path: when the renderer swaps in a `blink::RemoteFrame` to undo the // `CommitNavigation()`, it will report the iframe attribution data again. The // PerformanceManager should not complain that V8ContextTracker already has // the iframe attribution data, nor should it update the iframe attribution
diff --git a/content/browser/preloading/preloading_attempt_impl.cc b/content/browser/preloading/preloading_attempt_impl.cc index 5406440..3346dee 100644 --- a/content/browser/preloading/preloading_attempt_impl.cc +++ b/content/browser/preloading/preloading_attempt_impl.cc
@@ -4,7 +4,7 @@ #include "content/browser/preloading/preloading_attempt_impl.h" -#include "content/common/state_transitions.h" +#include "base/state_transitions.h" #include "content/public/browser/preloading.h" #include "services/metrics/public/cpp/ukm_builders.h" #include "services/metrics/public/cpp/ukm_recorder.h" @@ -16,8 +16,9 @@ void DCHECKTriggeringOutcomeTransitions(PreloadingTriggeringOutcome old_state, PreloadingTriggeringOutcome new_state) { #if DCHECK_IS_ON() - static const base::NoDestructor<StateTransitions<PreloadingTriggeringOutcome>> - allowed_transitions(StateTransitions<PreloadingTriggeringOutcome>({ + static const base::NoDestructor< + base::StateTransitions<PreloadingTriggeringOutcome>> + allowed_transitions(base::StateTransitions<PreloadingTriggeringOutcome>({ {PreloadingTriggeringOutcome::kUnspecified, {PreloadingTriggeringOutcome::kDuplicate, PreloadingTriggeringOutcome::kRunning,
diff --git a/content/browser/renderer_host/agent_scheduling_group_host.cc b/content/browser/renderer_host/agent_scheduling_group_host.cc index 1aa18d6..ecbc7c0 100644 --- a/content/browser/renderer_host/agent_scheduling_group_host.cc +++ b/content/browser/renderer_host/agent_scheduling_group_host.cc
@@ -9,6 +9,7 @@ #include "base/containers/unique_ptr_adapters.h" #include "base/feature_list.h" #include "base/no_destructor.h" +#include "base/state_transitions.h" #include "base/supports_user_data.h" #include "base/threading/thread_task_runner_handle.h" #include "content/browser/bad_message.h" @@ -17,7 +18,6 @@ #include "content/browser/renderer_host/render_process_host_impl.h" #include "content/common/agent_scheduling_group.mojom.h" #include "content/common/renderer.mojom.h" -#include "content/common/state_transitions.h" #include "content/public/browser/browser_message_filter.h" #include "content/public/browser/render_process_host.h" #include "content/services/shared_storage_worklet/public/mojom/shared_storage_worklet_service.mojom.h" @@ -332,21 +332,6 @@ mojo_remote_.get()->CreateView(std::move(params)); } -void AgentSchedulingGroupHost::CreateRemoteMainFrame( - const blink::RemoteFrameToken& token, - const absl::optional<blink::FrameToken>& opener_frame_token, - int32_t view_routing_id, - blink::mojom::FrameReplicationStatePtr replicated_state, - const base::UnguessableToken& devtools_frame_token, - blink::mojom::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, - mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) { - DCHECK_EQ(state_, LifecycleState::kBound); - mojo_remote_.get()->CreateRemoteMainFrame( - token, opener_frame_token, view_routing_id, std::move(replicated_state), - devtools_frame_token, std::move(remote_frame_interfaces), - std::move(remote_main_frame_interfaces)); -} - void AgentSchedulingGroupHost::CreateSharedStorageWorkletService( mojo::PendingReceiver< shared_storage_worklet::mojom::SharedStorageWorkletService> receiver) { @@ -498,8 +483,8 @@ void AgentSchedulingGroupHost::SetState( AgentSchedulingGroupHost::LifecycleState state) { - static const base::NoDestructor<StateTransitions<LifecycleState>> transitions( - StateTransitions<LifecycleState>({ + static const base::NoDestructor<base::StateTransitions<LifecycleState>> + transitions(base::StateTransitions<LifecycleState>({ {LifecycleState::kNewborn, {LifecycleState::kBound}}, {LifecycleState::kBound, {LifecycleState::kRenderProcessExited,
diff --git a/content/browser/renderer_host/agent_scheduling_group_host.h b/content/browser/renderer_host/agent_scheduling_group_host.h index c382971d..a256d8d 100644 --- a/content/browser/renderer_host/agent_scheduling_group_host.h +++ b/content/browser/renderer_host/agent_scheduling_group_host.h
@@ -9,13 +9,13 @@ #include "base/containers/id_map.h" #include "base/memory/safe_ref.h" +#include "base/state_transitions.h" #include "base/supports_user_data.h" #include "content/browser/browser_interface_broker_impl.h" #include "content/common/agent_scheduling_group.mojom.h" #include "content/common/associated_interfaces.mojom.h" #include "content/common/content_export.h" #include "content/common/renderer.mojom-forward.h" -#include "content/common/state_transitions.h" #include "content/public/browser/render_process_host_observer.h" #include "content/public/common/content_features.h" #include "content/services/shared_storage_worklet/public/mojom/shared_storage_worklet_service.mojom-forward.h" @@ -103,14 +103,6 @@ mojom::RouteProvider* GetRemoteRouteProvider(); void CreateFrame(mojom::CreateFrameParamsPtr params); void CreateView(mojom::CreateViewParamsPtr params); - void CreateRemoteMainFrame( - const blink::RemoteFrameToken& token, - const absl::optional<blink::FrameToken>& opener_frame_token, - int32_t view_routing_id, - blink::mojom::FrameReplicationStatePtr replicated_state, - const base::UnguessableToken& devtools_frame_token, - blink::mojom::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, - mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces); void CreateSharedStorageWorkletService( mojo::PendingReceiver< shared_storage_worklet::mojom::SharedStorageWorkletService> receiver); @@ -141,7 +133,7 @@ // kRenderProcessHostDestroyed is the terminal state of the state machine. kRenderProcessHostDestroyed, }; - friend StateTransitions<LifecycleState>; + friend base::StateTransitions<LifecycleState>; friend std::ostream& operator<<(std::ostream& os, LifecycleState state); // IPC::Listener
diff --git a/content/browser/renderer_host/frame_tree.cc b/content/browser/renderer_host/frame_tree.cc index 234ee259..379d47d7 100644 --- a/content/browser/renderer_host/frame_tree.cc +++ b/content/browser/renderer_host/frame_tree.cc
@@ -365,7 +365,7 @@ // since initial sandbox flags and permissions policy should apply to the // initial empty document in the frame. This needs to happen before the call // to AddChild so that the effective policy is sent to any newly-created - // RenderFrameProxy objects when the RenderFrameHost is created. + // `blink::RemoteFrame` objects when the RenderFrameHost is created. // SetPendingFramePolicy is necessary here because next navigation on this // frame will need the value of pending frame policy instead of effective // frame policy.
diff --git a/content/browser/renderer_host/navigation_controller_impl_unittest.cc b/content/browser/renderer_host/navigation_controller_impl_unittest.cc index 99a318c..4ed43e9 100644 --- a/content/browser/renderer_host/navigation_controller_impl_unittest.cc +++ b/content/browser/renderer_host/navigation_controller_impl_unittest.cc
@@ -128,6 +128,17 @@ SetPageBaseBackgroundColor, (absl::optional<SkColor> color), (override)); + MOCK_METHOD( + void, + CreateRemoteMainFrame, + (const blink::RemoteFrameToken& token, + const absl::optional<blink::FrameToken>& opener_frame_token, + blink::mojom::FrameReplicationStatePtr replication_state, + const base::UnguessableToken& devtools_frame_token, + blink::mojom::RemoteFrameInterfacesFromBrowserPtr + remote_frame_interfaces, + blink::mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces), + (override)); mojo::PendingAssociatedRemote<blink::mojom::PageBroadcast> GetRemote() { return receiver_.BindNewEndpointAndPassDedicatedRemote();
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc index b1120c9..609b121 100644 --- a/content/browser/renderer_host/navigation_request.cc +++ b/content/browser/renderer_host/navigation_request.cc
@@ -24,6 +24,7 @@ #include "base/metrics/histogram_macros.h" #include "base/no_destructor.h" #include "base/rand_util.h" +#include "base/state_transitions.h" #include "base/stl_util.h" #include "base/strings/strcat.h" #include "base/strings/string_util.h" @@ -85,7 +86,6 @@ #include "content/common/content_constants_internal.h" #include "content/common/debug_utils.h" #include "content/common/navigation_params_utils.h" -#include "content/common/state_transitions.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" @@ -7607,8 +7607,8 @@ // See // https://chromium.googlesource.com/chromium/src/+/HEAD/docs/navigation-request-navigation-state.png // clang-format off - static const base::NoDestructor<StateTransitions<NavigationState>> - transitions(StateTransitions<NavigationState>({ + static const base::NoDestructor<base::StateTransitions<NavigationState>> + transitions(base::StateTransitions<NavigationState>({ {NOT_STARTED, { WAITING_FOR_RENDERER_RESPONSE, WILL_START_NAVIGATION,
diff --git a/content/browser/renderer_host/navigator.h b/content/browser/renderer_host/navigator.h index 52b8b0e..ab6a1dc5 100644 --- a/content/browser/renderer_host/navigator.h +++ b/content/browser/renderer_host/navigator.h
@@ -141,8 +141,8 @@ const absl::optional<blink::Impression>& impression); // Called when a document requests a navigation in another document through a - // RenderFrameProxy. If |method| is "POST", then |post_body| needs to specify - // the request body, otherwise |post_body| should be null. + // `blink::RemoteFrame`. If `method` is "POST", then `post_body` needs to + // specify the request body, otherwise `post_body` should be null. void NavigateFromFrameProxy( RenderFrameHostImpl* render_frame_host, const GURL& url,
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc index 9fe7a9c0..3288b33 100644 --- a/content/browser/renderer_host/render_frame_host_impl.cc +++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -31,6 +31,7 @@ #include "base/numerics/safe_conversions.h" #include "base/process/kill.h" #include "base/ranges/algorithm.h" +#include "base/state_transitions.h" #include "base/stl_util.h" #include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" @@ -160,7 +161,6 @@ #include "content/common/frame_messages.mojom.h" #include "content/common/navigation_client.mojom.h" #include "content/common/navigation_params_utils.h" -#include "content/common/state_transitions.h" #include "content/public/browser/ax_event_notification_details.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/content_browser_client.h" @@ -1829,7 +1829,7 @@ // main RenderFrame. // 2. The RenderFrame can be unloaded. In this case, the browser sends a // mojom::FrameNavigationControl::UnloadFrame message for the RenderFrame - // to replace itself with a RenderFrameProxy and release its associated + // to replace itself with a `blink::RemoteFrame`and release its associated // resources. |lifecycle_state_| is advanced to // LifecycleStateImpl::kRunningUnloadHandlers to track that this IPC is in // flight. @@ -3350,7 +3350,7 @@ RenderFrameProxyHost* proxy = RenderFrameProxyHost::FromFrameToken( GetProcess()->GetID(), previous_frame_token->GetAs<blink::RemoteFrameToken>()); - // We have also created a RenderFrameProxy in CreateFrame above, so + // We have also created a `blink::RemoteFrame` in CreateFrame above, so // remember that. CHECK(proxy); proxy->SetRenderFrameProxyCreated(true); @@ -4231,11 +4231,11 @@ // IPCs will only be processed after the renderer has already swapped // in the provisional RenderFrame and swapped out the provisional // frame's reference frame (which is either a RenderFrame or a - // RenderFrameProxy). + // `blink::RemoteFrame`). // - // Since the swapped out RenderFrame/RenderFrameProxy is already gone, - // a `DeleteRenderFrame()` (routed to the RenderFrame) or a - // `DetachAndDispose()` (routed to the RenderFrameProxy) won't do + // Since the swapped out `RenderFrame`/`blink::RemoteFrame` is already + // gone, a `DeleteRenderFrame()` (routed to the RenderFrame) or a + // `DetachAndDispose()` (routed to the `blink::RemoteFrame`) won't do // anything. The browser must also instruct the already-committed but // not-yet-acknowledged speculative RFH to detach itself as well. speculative_frame_host->DeleteRenderFrame( @@ -4243,11 +4243,11 @@ } else { // Otherwise, the provisional RenderFrame has not yet been instructed // to swap in but is already associated with the RenderFrame or - // RenderFrameProxy it is expected to replace. The associated - // RenderFrame/RenderFrameProxy (which is still in the frame tree) - // will be responsible for tearing down any associated provisional - // RenderFrame, so the browser does not need to take any explicit - // cleanup actions. + // `blink::RemoteFrame` it is expected to replace. The associated + // `RenderFrame`/`blink::RemoteFrame` (which is still in the frame + // tree) will be responsible for tearing down any associated + // provisional RenderFrame, so the browser does not need to take any + // explicit cleanup actions. } } // No explicit cleanup is needed here for `RenderFrameProxyHost`s. @@ -4760,8 +4760,8 @@ proxy->frame_tree_node()->current_replication_state().Clone(), proxy->GetFrameToken(), proxy->CreateAndBindRemoteFrameInterfaces(), proxy->CreateAndBindRemoteMainFrameInterfaces()); - // Remember that a RenderFrameProxy was created as part of processing the - // Unload message above. + // Remember that a `blink::RemoteFrame` was created as part of processing + // the Unload message above. proxy->SetRenderFrameProxyCreated(true); } } else { @@ -7477,7 +7477,6 @@ bool wait_for_debugger = devtools_instrumentation::ShouldWaitForDebuggerInWindowOpen(); mojom::CreateNewWindowReplyPtr reply = mojom::CreateNewWindowReply::New( - new_main_rfh->GetRenderViewHost()->GetRoutingID(), new_main_rfh->GetFrameToken(), new_main_rfh->GetRoutingID(), std::move(pending_frame_receiver), std::move(widget_params), std::move(page_broadcast_receiver), std::move(browser_interface_broker), @@ -13670,7 +13669,7 @@ // TODO(crbug.com/1256898): Consider associating expectations with each // transitions. #if DCHECK_IS_ON() - static const base::NoDestructor<StateTransitions<LifecycleStateImpl>> + static const base::NoDestructor<base::StateTransitions<LifecycleStateImpl>> allowed_transitions( // For a graph of state transitions, see // https://chromium.googlesource.com/chromium/src/+/HEAD/docs/render-frame-host-lifecycle-state.png @@ -13678,7 +13677,7 @@ // RenderFrameHost is only set speculative during its creation and no // transitions happen to this state during its lifetime. - StateTransitions<LifecycleStateImpl>({ + base::StateTransitions<LifecycleStateImpl>({ {LifecycleStateImpl::kSpeculative, {LifecycleStateImpl::kActive, LifecycleStateImpl::kPendingCommit}},
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h index b125961..0868e70 100644 --- a/content/browser/renderer_host/render_frame_host_impl.h +++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -888,11 +888,11 @@ // Tells the renderer that this RenderFrame is being replaced with one in a // different renderer process. It should run its unload handler and move to // a blank document. If |proxy| is not null, it should also create a - // RenderFrameProxy to replace the RenderFrame and set it to |is_loading| - // state. The renderer process keeps the RenderFrameProxy object around as a - // placeholder while the frame is rendered in a different process. + // `blink::RemoteFrame` to replace the RenderFrame and set it to `is_loading` + // state. The renderer process keeps the `blink::RemoteFrame` object around as + // a placeholder while the frame is rendered in a different process. // - // There should always be a |proxy| to replace the old RenderFrameHost. If + // There should always be a `proxy` to replace the old RenderFrameHost. If // there are no remaining active views in the process, the proxy will be // short-lived and will be deleted when the unload ACK is received. // @@ -905,10 +905,10 @@ // Sent to a renderer when the browser needs to cancel a navigation associated // with a speculative RenderFrameHost that has already been asked to commit // via `CommitNavigation()`. The renderer will swap out the already-committed - // RenderFrame, replacing it with a RenderFrameProxy for `proxy`. + // RenderFrame, replacing it with a `blink::RemoteFrame` for `proxy`. // // TODO(https://crbug.com/1220337): This method is fundamentally incompatible - // with RenderDocument, as there is no RenderFrameProxy to restore for a + // with RenderDocument, as there is no `blink::RemoteFrame` to restore for a // local<->local swap. void UndoCommitNavigation(RenderFrameProxyHost& proxy, bool is_loading); @@ -1600,7 +1600,7 @@ blink::TransferableMessage message); // Requests to swap the current frame into the frame tree, replacing the - // RenderFrameProxy it is associated with. + // `blink::RemoteFrame` it is associated with. void SwapIn(); // Manual RTTI to ensure safe downcasts in tests.
diff --git a/content/browser/renderer_host/render_frame_host_manager.cc b/content/browser/renderer_host/render_frame_host_manager.cc index 2ade1a07..75fb5860 100644 --- a/content/browser/renderer_host/render_frame_host_manager.cc +++ b/content/browser/renderer_host/render_frame_host_manager.cc
@@ -887,8 +887,8 @@ render_frame_host.reset(); - // If the old proxy isn't live, create the RenderFrameProxy in the renderer, - // so that other frames can still communicate with this frame. See + // If the old proxy isn't live, create the `blink::RemoteFrame` in the + // renderer, so that other frames can still communicate with this frame. See // https://crbug.com/653746. if (proxy && !proxy->is_render_frame_proxy_live()) proxy->InitRenderFrameProxy(); @@ -1392,7 +1392,7 @@ LifecycleStateImpl::kPendingCommit); // The browser process already asked the renderer to commit the navigation. // The renderer is guaranteed to commit the navigation and swap in the - // provisional `RenderFrame` to replace the current `RenderFrameProxy` + // provisional `RenderFrame` to replace the current `blink::RemoteFrame` // unless the frame is detached: see `AssertNavigationCommits` in // `RenderFrameImpl` for more details about this enforcement. // @@ -1423,9 +1423,9 @@ speculative_render_frame_host_->GetProcess()->RemovePendingView(); // No need to call `DeleteRenderFrame()`. When a RenderFrame or - // RenderFrameProxy is detached, it also detaches any associated provisional - // RenderFrame, whether this due to a child frame being removed from the - // frame tree or the entire RenderView being torn down. + // `blink::RemoteFrame` is detached, it also detaches any associated + // provisional RenderFrame, whether this due to a child frame being removed + // from the frame tree or the entire RenderView being torn down. // // When the LifecycleStateImpl is kSpeculative, there is no need to transition // to kReadyToBeDeleted as speculative RenderFrameHosts don't run any unload @@ -3054,7 +3054,7 @@ instance, std::move(render_view_host), frame_tree_node_); } - // Make sure that the RenderFrameProxy is present in the renderer. + // Make sure that the `blink::RemoteFrame` is present in the renderer. if (frame_tree_node_->IsMainFrame() && proxy->GetRenderViewHost()) { InitRenderView(group, proxy->GetRenderViewHost(), proxy); } else {
diff --git a/content/browser/renderer_host/render_frame_host_manager.h b/content/browser/renderer_host/render_frame_host_manager.h index ad65a62..2868a56b 100644 --- a/content/browser/renderer_host/render_frame_host_manager.h +++ b/content/browser/renderer_host/render_frame_host_manager.h
@@ -431,7 +431,7 @@ // Tells the |render_frame_host|'s renderer that its RenderFrame is being // swapped for a frame in another process, and that it should create a - // RenderFrameProxy to replace it using the |proxy| RenderFrameProxyHost. + // `blink::RemoteFrame` to replace it using the |proxy| RenderFrameProxyHost. void SwapOuterDelegateFrame(RenderFrameHostImpl* render_frame_host, RenderFrameProxyHost* proxy); @@ -475,9 +475,9 @@ blink::mojom::UserActivationNotificationType notification_type); // Sets up the necessary state for a new RenderViewHost. If |proxy| is not - // null, it creates a RenderFrameProxy in the target renderer process which is - // used to route IPC messages. Returns early if the RenderViewHost has - // already been initialized for another RenderFrameHost. + // null, it creates a `blink::RemoteFrame` in the target renderer process + // which is used to route IPC messages. Returns early if the RenderViewHost + // has already been initialized for another RenderFrameHost. bool InitRenderView(SiteInstanceGroup* site_instance_group, RenderViewHostImpl* render_view_host, RenderFrameProxyHost* proxy);
diff --git a/content/browser/renderer_host/render_frame_host_manager_browsertest.cc b/content/browser/renderer_host/render_frame_host_manager_browsertest.cc index da26b40..65870a7f 100644 --- a/content/browser/renderer_host/render_frame_host_manager_browsertest.cc +++ b/content/browser/renderer_host/render_frame_host_manager_browsertest.cc
@@ -3374,7 +3374,7 @@ // Tests that navigating cross-process and reusing an existing RenderViewHost // (whose process has been killed/crashed) recreates properly the RenderView and -// RenderFrameProxy on the renderer side. +// `blink::RemoteFrame` on the renderer side. // See https://crbug.com/544271 IN_PROC_BROWSER_TEST_P(RenderFrameHostManagerTest, RenderViewInitAfterProcessKill) { @@ -8892,9 +8892,9 @@ // TODO(https://crbug.com/1148793): Remove this early return. This doesn't // work for RenderDocumentLevel::kSubframe or greater because cancelling the // navigation when detaching the subtree tries to restore the replaced - // RenderFrameProxy (which doesn't exist in the same-site RenderDocument case - // because the replaced object wasn't a RenderFrameProxy, but instead a - // RenderFrame). + // `blink::RemoteFrame` (which doesn't exist in the same-site RenderDocument + // case because the replaced object wasn't a `blink::RemoteFrame`, but instead + // a RenderFrame). if (ShouldCreateNewHostForSameSiteSubframe()) return; AssertCanRemoveSubframeInUnload(/*same_site=*/true);
diff --git a/content/browser/renderer_host/render_frame_host_manager_unittest.cc b/content/browser/renderer_host/render_frame_host_manager_unittest.cc index 4de29e5..4b403f8 100644 --- a/content/browser/renderer_host/render_frame_host_manager_unittest.cc +++ b/content/browser/renderer_host/render_frame_host_manager_unittest.cc
@@ -1177,7 +1177,7 @@ EXPECT_TRUE(main_test_rfh()->IsActive()); } -// Test that we create RenderFrameProxy objects for the opener chain when +// Test that we create `blink::RemoteFrame` objects for the opener chain when // navigating an opened tab cross-process. This allows us to support certain // cross-process JavaScript calls (http://crbug.com/99202). TEST_P(RenderFrameHostManagerTest, CreateProxiesForOpeners) {
diff --git a/content/browser/renderer_host/render_frame_proxy_host.cc b/content/browser/renderer_host/render_frame_proxy_host.cc index ed8492e..69a57ea5 100644 --- a/content/browser/renderer_host/render_frame_proxy_host.cc +++ b/content/browser/renderer_host/render_frame_proxy_host.cc
@@ -256,7 +256,7 @@ CHECK(parent_proxy); // Proxies that aren't live in the parent node should not be initialized - // here, since there is no valid parent RenderFrameProxy on the renderer + // here, since there is no valid parent `blink::RemoteFrame` on the renderer // side. This can happen when adding a new child frame after an opener // process crashed and was reloaded. See https://crbug.com/501152. if (!parent_proxy->is_render_frame_proxy_live()) @@ -269,9 +269,8 @@ CreateAndBindRemoteFrameInterfaces()); } else { - int view_routing_id = GetRenderViewHost()->GetRoutingID(); - GetAgentSchedulingGroup().CreateRemoteMainFrame( - frame_token_, opener_frame_token, view_routing_id, + GetRenderViewHost()->GetAssociatedPageBroadcast()->CreateRemoteMainFrame( + frame_token_, opener_frame_token, frame_tree_node_->current_replication_state().Clone(), frame_tree_node_->devtools_frame_token(), CreateAndBindRemoteFrameInterfaces(), @@ -772,9 +771,9 @@ return params; } -mojom::RemoteMainFrameInterfacesPtr +blink::mojom::RemoteMainFrameInterfacesPtr RenderFrameProxyHost::CreateAndBindRemoteMainFrameInterfaces() { - auto params = mojom::RemoteMainFrameInterfaces::New(); + auto params = blink::mojom::RemoteMainFrameInterfaces::New(); BindRemoteMainFrameInterfaces( params->main_frame.InitWithNewEndpointAndPassRemote(), params->main_frame_host.InitWithNewEndpointAndPassReceiver());
diff --git a/content/browser/renderer_host/render_frame_proxy_host.h b/content/browser/renderer_host/render_frame_proxy_host.h index ca35c7b8..45925c6 100644 --- a/content/browser/renderer_host/render_frame_proxy_host.h +++ b/content/browser/renderer_host/render_frame_proxy_host.h
@@ -53,8 +53,8 @@ // When a page's frames are rendered by multiple processes, each renderer has a // full copy of the frame tree. It has full RenderFrames for the frames it is -// responsible for rendering and placeholder objects (i.e., RenderFrameProxies) -// for frames rendered by other processes. +// responsible for rendering and placeholder objects (i.e., +// `blink::RemoteFrame`) for frames rendered by other processes. // // This class is the browser-side host object for the placeholder. Each node in // the frame tree has a RenderFrameHost for the active SiteInstance and a set @@ -119,7 +119,7 @@ RenderProcessHost* GetProcess() const { return process_; } - // Initializes the object and creates the RenderFrameProxy in the process + // Initializes the object and creates the `blink::RemoteFrame` in the process // for the SiteInstanceGroup. bool InitRenderFrameProxy(); @@ -188,7 +188,7 @@ // mojo connections to RenderFrameProxyHost will be closed. void SetRenderFrameProxyCreated(bool created); - // Returns if the RenderFrameProxy for this host is alive. + // Returns if the `blink::RemoteFrame` for this host is alive. bool is_render_frame_proxy_live() const { return render_frame_proxy_created_; } @@ -266,7 +266,8 @@ // and bound in blink. blink::mojom::RemoteFrameInterfacesFromBrowserPtr CreateAndBindRemoteFrameInterfaces(); - mojom::RemoteMainFrameInterfacesPtr CreateAndBindRemoteMainFrameInterfaces(); + blink::mojom::RemoteMainFrameInterfacesPtr + CreateAndBindRemoteMainFrameInterfaces(); // Bind mojo endpoints of the Remote/RemoteMainFrame in blink. void BindRemoteFrameInterfaces( @@ -284,7 +285,8 @@ // - the renderer side object goes away due to the renderer process going away // (i.e. crashing) // - undoing a `CommitNavigation()` that has already been sent to a - // speculative RenderFrameHost by swapping it back to a RenderFrameProxy. + // speculative RenderFrameHost by swapping it back to a + // `blink::RemoteFrame`. void TearDownMojoConnection(); using TraceProto = perfetto::protos::pbzero::RenderFrameProxyHost; @@ -327,7 +329,7 @@ // The node in the frame tree where this proxy is located. raw_ptr<FrameTreeNode> frame_tree_node_; - // True if we have a live RenderFrameProxy for this host. + // True if we have a live `blink::RemoteFrame` for this host. bool render_frame_proxy_created_; // When a RenderFrameHost is in a different process from its parent in the
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc index 00f570d..0339d9f 100644 --- a/content/browser/renderer_host/render_view_host_impl.cc +++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -437,7 +437,6 @@ params->renderer_preferences = delegate_->GetRendererPrefs(); RenderViewHostImpl::GetPlatformSpecificPrefs(¶ms->renderer_preferences); params->web_preferences = delegate_->GetOrCreateWebPreferences(); - params->view_id = GetRoutingID(); params->opener_frame_token = opener_frame_token; params->replication_state = frame_tree_node->current_replication_state().Clone();
diff --git a/content/browser/renderer_host/render_view_host_impl.h b/content/browser/renderer_host/render_view_host_impl.h index 3ccc771..fa144ac 100644 --- a/content/browser/renderer_host/render_view_host_impl.h +++ b/content/browser/renderer_host/render_view_host_impl.h
@@ -190,13 +190,13 @@ // blink::Page's main blink::Frame is remote). RenderFrameHostImpl* GetMainRenderFrameHost(); - // // RenderViewHost is associated with a given SiteInstanceGroup and as + // RenderViewHost is associated with a given SiteInstanceGroup and as // BrowsingContextState in non-legacy BrowsingContextState mode is tied to a // given BrowsingInstance, so the main BrowsingContextState stays the same // during the entire lifetime of a RenderViewHost: cross-SiteInstanceGroup // same-BrowsingInstance navigations might change the representation of the - // main frame in a given RenderView from RenderFrame to RenderFrameProxy and - // back, while cross-BrowsingInstances result in creating a new unrelated + // main frame in a given RenderView from RenderFrame to `blink::RemoteFrame` + // and back, while cross-BrowsingInstances result in creating a new unrelated // RenderViewHost. This is not true in the legacy BCS mode, so there the // |main_browsing_context_state_| is null. const absl::optional<base::SafeRef<BrowsingContextState>>&
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc index cfa45a1..a8d0013 100644 --- a/content/browser/renderer_host/render_widget_host_impl.cc +++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -1071,7 +1071,7 @@ // 2. IPC -> blink::mojom::Widget::UpdateVisualProperties // 3. Renderer A: parent RenderWidget // (sometimes blink involved) - // 4. Renderer A: child RenderFrameProxy + // 4. Renderer A: child blink::RemoteFrame // 5. IPC -> FrameHostMsg_SynchronizeVisualProperties // 6. Browser: child CrossProcessFrameConnector // 7. Browser: parent RenderWidgetHost (We're here if |is_child_frame|.)
diff --git a/content/browser/renderer_host/render_widget_host_view_child_frame_browsertest.cc b/content/browser/renderer_host/render_widget_host_view_child_frame_browsertest.cc index e526731..48a6076 100644 --- a/content/browser/renderer_host/render_widget_host_view_child_frame_browsertest.cc +++ b/content/browser/renderer_host/render_widget_host_view_child_frame_browsertest.cc
@@ -61,7 +61,7 @@ } // Tests that the FrameSinkId of each child frame has been updated by the - // RenderFrameProxy. + // `blink::RemoteFrame`. void CheckFrameSinkId(RenderFrameHost* render_frame_host) { RenderWidgetHostViewBase* child_view = static_cast<RenderFrameHostImpl*>(render_frame_host) @@ -279,7 +279,7 @@ // 2. AutoResize on Android does not size to the min/max bounds specified, it // ends up ignoring them and sizing to the screen (I think). // Luckily this test is verifying interactions and behaviour of -// RenderWidgetHostImpl - RenderWidget - RenderFrameProxy - +// RenderWidgetHostImpl - RenderWidget - `blink::RemoteFrame` - // CrossProcessFrameConnector, and this isn't Android-specific code. #if !BUILDFLAG(IS_ANDROID)
diff --git a/content/browser/resource_loading_browsertest.cc b/content/browser/resource_loading_browsertest.cc index 44a0de3..46a2bc6 100644 --- a/content/browser/resource_loading_browsertest.cc +++ b/content/browser/resource_loading_browsertest.cc
@@ -21,7 +21,7 @@ // crbug.com/1339969 IN_PROC_BROWSER_TEST_F(ResourceLoadingBrowserTest, - DISABLED_ResourceLoadingAvoidDoubleDownloads) { + ResourceLoadingAvoidDoubleDownloads) { ASSERT_TRUE(embedded_test_server()->Start()); GURL url = embedded_test_server()->GetURL(kResourceLoadingNonMobilePage); EXPECT_TRUE(NavigateToURL(shell(), url));
diff --git a/content/browser/scheduler/responsiveness/calculator.cc b/content/browser/scheduler/responsiveness/calculator.cc index 1f707ea..278d5ac 100644 --- a/content/browser/scheduler/responsiveness/calculator.cc +++ b/content/browser/scheduler/responsiveness/calculator.cc
@@ -33,10 +33,9 @@ constexpr char kLatencyEventCategory[] = "latency"; -// The names emitted for JankyInterval measurement events. -constexpr char kJankyIntervalEvent[] = "JankyInterval"; -constexpr char kJankyIntervalsPerThirtySeconds3Event[] = - "JankyIntervalsPerThirtySeconds3"; +// The names emitted for MainThreadsCongestion measurement events. +constexpr char kCongestedIntervalEvent[] = "CongestedInterval"; +constexpr char kMainThreadsCongestionsEvent[] = "MainThreadsCongestion"; // Given a |jank|, finds each janky slice between |start_time| and |end_time|, // and adds it to |janky_slices|. @@ -149,6 +148,18 @@ DCHECK_LE(janky_slices, kMaxJankySlices); switch (jank_type) { case JankType::kExecution: { + UMA_HISTOGRAM_COUNTS_1000("Browser.MainThreadsCongestion.RunningOnly", + janky_slices); + // Only kFirstInterval and kPeriodic are reported with a suffix, stages + // in between are only part of the unsuffixed histogram. + if (startup_stage_ == StartupStage::kFirstInterval) { + UMA_HISTOGRAM_COUNTS_1000( + "Browser.MainThreadsCongestion.RunningOnly.Initial", janky_slices); + } else if (startup_stage_ == StartupStage::kPeriodic) { + UMA_HISTOGRAM_COUNTS_1000( + "Browser.MainThreadsCongestion.RunningOnly.Periodic", janky_slices); + } + // Emit the old name until M107. UMA_HISTOGRAM_COUNTS_1000( "Browser.Responsiveness.JankyIntervalsPerThirtySeconds", janky_slices); @@ -171,6 +182,16 @@ startup_stage_ == StartupStage::kFirstIntervalDoneWithoutFirstIdle) { break; } + UMA_HISTOGRAM_CUSTOM_COUNTS("Browser.MainThreadsCongestion", janky_slices, + 1, kMaxJankySlices, 50); + if (startup_stage_ == StartupStage::kFirstIntervalAfterFirstIdle) { + UMA_HISTOGRAM_CUSTOM_COUNTS("Browser.MainThreadsCongestion.Initial", + janky_slices, 1, kMaxJankySlices, 50); + } else if (startup_stage_ == StartupStage::kPeriodic) { + UMA_HISTOGRAM_CUSTOM_COUNTS("Browser.MainThreadsCongestion.Periodic", + janky_slices, 1, kMaxJankySlices, 50); + } + // Emit the old name until M107. UMA_HISTOGRAM_CUSTOM_COUNTS( "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3", janky_slices, 1, kMaxJankySlices, 50); @@ -233,20 +254,20 @@ base::TimeTicks end_time, size_t amount_of_slices) { TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP1( - kLatencyEventCategory, kJankyIntervalsPerThirtySeconds3Event, - TRACE_ID_LOCAL(this), start_time, "amount_of_slices", amount_of_slices); + kLatencyEventCategory, kMainThreadsCongestionsEvent, TRACE_ID_LOCAL(this), + start_time, "amount_of_slices", amount_of_slices); TRACE_EVENT_NESTABLE_ASYNC_END_WITH_TIMESTAMP0( - kLatencyEventCategory, kJankyIntervalsPerThirtySeconds3Event, - TRACE_ID_LOCAL(this), end_time); + kLatencyEventCategory, kMainThreadsCongestionsEvent, TRACE_ID_LOCAL(this), + end_time); } void Calculator::EmitJankyIntervalsJankTraceEvent(base::TimeTicks start_time, base::TimeTicks end_time) { TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP0( - kLatencyEventCategory, kJankyIntervalEvent, TRACE_ID_LOCAL(this), + kLatencyEventCategory, kCongestedIntervalEvent, TRACE_ID_LOCAL(this), start_time); TRACE_EVENT_NESTABLE_ASYNC_END_WITH_TIMESTAMP0( - kLatencyEventCategory, kJankyIntervalEvent, TRACE_ID_LOCAL(this), + kLatencyEventCategory, kCongestedIntervalEvent, TRACE_ID_LOCAL(this), end_time); }
diff --git a/content/browser/scheduler/responsiveness/calculator.h b/content/browser/scheduler/responsiveness/calculator.h index 6a667e2..00675d2 100644 --- a/content/browser/scheduler/responsiveness/calculator.h +++ b/content/browser/scheduler/responsiveness/calculator.h
@@ -57,7 +57,7 @@ // MainMessageLoopRun() reaches idle (i.e. done running all tasks queued // during startup). This will be used as a signal for the true end of // "startup" and the beginning of recording - // Browser.Responsiveness.JankyIntervalsPerThirtySeconds3. + // Browser.MainThreadsCongestion. void OnFirstIdle(); // Change the Power state of the process. Must be called from the UI thread.
diff --git a/content/browser/scheduler/responsiveness/calculator_unittest.cc b/content/browser/scheduler/responsiveness/calculator_unittest.cc index da0fee3..85a5c3d 100644 --- a/content/browser/scheduler/responsiveness/calculator_unittest.cc +++ b/content/browser/scheduler/responsiveness/calculator_unittest.cc
@@ -414,18 +414,15 @@ StartupStage::kFirstInterval)); histograms.emplace(); TriggerCalculation(); + histograms->ExpectUniqueSample("Browser.MainThreadsCongestion.RunningOnly", 0, + 1); histograms->ExpectUniqueSample( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds", 0, 1); - histograms->ExpectUniqueSample( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds.Initial", 0, 1); + "Browser.MainThreadsCongestion.RunningOnly.Initial", 0, 1); histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds.Periodic", 0); - histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3", 0); - histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3.Initial", 0); - histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3.Periodic", 0); + "Browser.MainThreadsCongestion.RunningOnly.Periodic", 0); + histograms->ExpectTotalCount("Browser.MainThreadsCongestion", 0); + histograms->ExpectTotalCount("Browser.MainThreadsCongestion.Initial", 0); + histograms->ExpectTotalCount("Browser.MainThreadsCongestion.Periodic", 0); // Queue jank event during a few kMeasurementInterval (without having seen // OnFirstIdle()). Neither .Initial nor .Periodic @@ -440,18 +437,15 @@ StartupStage::kFirstIntervalDoneWithoutFirstIdle)); histograms.emplace(); TriggerCalculation(); - histograms->ExpectUniqueSample( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds", 0, 1); + histograms->ExpectUniqueSample("Browser.MainThreadsCongestion.RunningOnly", 0, + 1); histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds.Initial", 0); + "Browser.MainThreadsCongestion.RunningOnly.Initial", 0); histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds.Periodic", 0); - histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3", 0); - histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3.Initial", 0); - histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3.Periodic", 0); + "Browser.MainThreadsCongestion.RunningOnly.Periodic", 0); + histograms->ExpectTotalCount("Browser.MainThreadsCongestion", 0); + histograms->ExpectTotalCount("Browser.MainThreadsCongestion.Initial", 0); + histograms->ExpectTotalCount("Browser.MainThreadsCongestion.Periodic", 0); AddEventUI(kQueueTime, kStartTime, kFinishTime); EXPECT_CALL( *calculator_, @@ -463,18 +457,15 @@ StartupStage::kFirstIntervalDoneWithoutFirstIdle)); histograms.emplace(); TriggerCalculation(); - histograms->ExpectUniqueSample( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds", 0, 1); + histograms->ExpectUniqueSample("Browser.MainThreadsCongestion.RunningOnly", 0, + 1); histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds.Initial", 0); + "Browser.MainThreadsCongestion.RunningOnly.Initial", 0); histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds.Periodic", 0); - histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3", 0); - histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3.Initial", 0); - histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3.Periodic", 0); + "Browser.MainThreadsCongestion.RunningOnly.Periodic", 0); + histograms->ExpectTotalCount("Browser.MainThreadsCongestion", 0); + histograms->ExpectTotalCount("Browser.MainThreadsCongestion.Initial", 0); + histograms->ExpectTotalCount("Browser.MainThreadsCongestion.Periodic", 0); // OnFirstIdle() eventually during a kMeasurementInterval. Same as above, last // one of these. @@ -490,18 +481,15 @@ StartupStage::kFirstIntervalDoneWithoutFirstIdle)); histograms.emplace(); TriggerCalculation(); - histograms->ExpectUniqueSample( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds", 0, 1); + histograms->ExpectUniqueSample("Browser.MainThreadsCongestion.RunningOnly", 0, + 1); histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds.Initial", 0); + "Browser.MainThreadsCongestion.RunningOnly.Initial", 0); histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds.Periodic", 0); - histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3", 0); - histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3.Initial", 0); - histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3.Periodic", 0); + "Browser.MainThreadsCongestion.RunningOnly.Periodic", 0); + histograms->ExpectTotalCount("Browser.MainThreadsCongestion", 0); + histograms->ExpectTotalCount("Browser.MainThreadsCongestion.Initial", 0); + histograms->ExpectTotalCount("Browser.MainThreadsCongestion.Periodic", 0); // Events in intervals after OnFirstIdle(). Janky3.Initial still no .Periodic. AddEventUI(kQueueTime, kStartTime, kFinishTime); @@ -513,18 +501,16 @@ StartupStage::kFirstIntervalAfterFirstIdle)); histograms.emplace(); TriggerCalculation(); - histograms->ExpectUniqueSample( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds", 0, 1); + histograms->ExpectUniqueSample("Browser.MainThreadsCongestion.RunningOnly", 0, + 1); histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds.Initial", 0); + "Browser.MainThreadsCongestion.RunningOnly.Initial", 0); histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds.Periodic", 0); - histograms->ExpectUniqueSample( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3", 10, 1); - histograms->ExpectUniqueSample( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3.Initial", 10, 1); - histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3.Periodic", 0); + "Browser.MainThreadsCongestion.RunningOnly.Periodic", 0); + histograms->ExpectUniqueSample("Browser.MainThreadsCongestion", 10, 1); + histograms->ExpectUniqueSample("Browser.MainThreadsCongestion.Initial", 10, + 1); + histograms->ExpectTotalCount("Browser.MainThreadsCongestion.Periodic", 0); AddEventUI(kQueueTime, kStartTime, kFinishTime); EXPECT_CALL(*calculator_, EmitResponsivenessMock(JankType::kExecution, 0, @@ -534,18 +520,16 @@ StartupStage::kPeriodic)); histograms.emplace(); TriggerCalculation(); - histograms->ExpectUniqueSample( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds", 0, 1); + histograms->ExpectUniqueSample("Browser.MainThreadsCongestion.RunningOnly", 0, + 1); histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds.Initial", 0); + "Browser.MainThreadsCongestion.RunningOnly.Initial", 0); histograms->ExpectUniqueSample( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds.Periodic", 0, 1); - histograms->ExpectUniqueSample( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3", 10, 1); - histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3.Initial", 0); - histograms->ExpectUniqueSample( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3.Periodic", 10, 1); + "Browser.MainThreadsCongestion.RunningOnly.Periodic", 0, 1); + histograms->ExpectUniqueSample("Browser.MainThreadsCongestion", 10, 1); + histograms->ExpectTotalCount("Browser.MainThreadsCongestion.Initial", 0); + histograms->ExpectUniqueSample("Browser.MainThreadsCongestion.Periodic", 10, + 1); } TEST_F(ResponsivenessCalculatorTest, FastStartupStages) { @@ -568,18 +552,15 @@ StartupStage::kFirstInterval)); histograms.emplace(); TriggerCalculation(); + histograms->ExpectUniqueSample("Browser.MainThreadsCongestion.RunningOnly", 0, + 1); histograms->ExpectUniqueSample( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds", 0, 1); - histograms->ExpectUniqueSample( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds.Initial", 0, 1); + "Browser.MainThreadsCongestion.RunningOnly.Initial", 0, 1); histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds.Periodic", 0); - histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3", 0); - histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3.Initial", 0); - histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3.Periodic", 0); + "Browser.MainThreadsCongestion.RunningOnly.Periodic", 0); + histograms->ExpectTotalCount("Browser.MainThreadsCongestion", 0); + histograms->ExpectTotalCount("Browser.MainThreadsCongestion.Initial", 0); + histograms->ExpectTotalCount("Browser.MainThreadsCongestion.Periodic", 0); AddEventUI(kQueueTime, kStartTime, kFinishTime); EXPECT_CALL(*calculator_, EmitResponsivenessMock( @@ -590,18 +571,16 @@ StartupStage::kFirstIntervalAfterFirstIdle)); histograms.emplace(); TriggerCalculation(); - histograms->ExpectUniqueSample( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds", 0, 1); + histograms->ExpectUniqueSample("Browser.MainThreadsCongestion.RunningOnly", 0, + 1); histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds.Initial", 0); + "Browser.MainThreadsCongestion.RunningOnly.Initial", 0); histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds.Periodic", 0); - histograms->ExpectUniqueSample( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3", 10, 1); - histograms->ExpectUniqueSample( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3.Initial", 10, 1); - histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3.Periodic", 0); + "Browser.MainThreadsCongestion.RunningOnly.Periodic", 0); + histograms->ExpectUniqueSample("Browser.MainThreadsCongestion", 10, 1); + histograms->ExpectUniqueSample("Browser.MainThreadsCongestion.Initial", 10, + 1); + histograms->ExpectTotalCount("Browser.MainThreadsCongestion.Periodic", 0); AddEventUI(kQueueTime, kStartTime, kFinishTime); EXPECT_CALL(*calculator_, EmitResponsivenessMock(JankType::kExecution, 0, @@ -611,18 +590,16 @@ StartupStage::kPeriodic)); histograms.emplace(); TriggerCalculation(); - histograms->ExpectUniqueSample( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds", 0, 1); + histograms->ExpectUniqueSample("Browser.MainThreadsCongestion.RunningOnly", 0, + 1); histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds.Initial", 0); + "Browser.MainThreadsCongestion.RunningOnly.Initial", 0); histograms->ExpectUniqueSample( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds.Periodic", 0, 1); - histograms->ExpectUniqueSample( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3", 10, 1); - histograms->ExpectTotalCount( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3.Initial", 0); - histograms->ExpectUniqueSample( - "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3.Periodic", 10, 1); + "Browser.MainThreadsCongestion.RunningOnly.Periodic", 0, 1); + histograms->ExpectUniqueSample("Browser.MainThreadsCongestion", 10, 1); + histograms->ExpectTotalCount("Browser.MainThreadsCongestion.Initial", 0); + histograms->ExpectUniqueSample("Browser.MainThreadsCongestion.Periodic", 10, + 1); } // An event execution that crosses a measurement interval boundary should count
diff --git a/content/browser/scheduler/responsiveness/watcher.h b/content/browser/scheduler/responsiveness/watcher.h index c398a00..a45ab465 100644 --- a/content/browser/scheduler/responsiveness/watcher.h +++ b/content/browser/scheduler/responsiveness/watcher.h
@@ -29,8 +29,7 @@ // Must be invoked once-and-only-once, after SetUp(), the first time // MainMessageLoopRun() reaches idle (i.e. done running all tasks queued // during startup). This will be used as a signal for the true end of - // "startup" and the beginning of recording - // Browser.Responsiveness.JankyIntervalsPerThirtySeconds3. + // "startup" and the beginning of recording Browser.MainThreadsCongestion. void OnFirstIdle(); protected:
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc index 0cdffce..109db72c 100644 --- a/content/browser/site_per_process_browsertest.cc +++ b/content/browser/site_per_process_browsertest.cc
@@ -1623,8 +1623,8 @@ EXPECT_TRUE(observer.last_navigation_succeeded()); EXPECT_EQ(b_url, observer.last_navigation_url()); - // Ensure that the grandchild RenderFrameProxy in B was created when process - // B was restored. + // Ensure that the grandchild `blink::RemoteFrame` in B was created when + // process B was restored. EXPECT_TRUE(grandchild_rfph->is_render_frame_proxy_live()); } @@ -2241,7 +2241,7 @@ // Check that b.com frame's location.ancestorOrigins contains the correct // origin for the parent. The origin should have been replicated as part of // the mojom::Renderer::CreateView message that created the parent's - // RenderFrameProxy in b.com's process. + // `blink::RemoteFrame` in b.com's process. EXPECT_EQ(ListValueOf(a_origin), EvalJs(tiptop_child, "Array.from(location.ancestorOrigins);")); @@ -3687,10 +3687,10 @@ } // Check that if a subframe has an opener, that opener is preserved when a new -// RenderFrameProxy is created for that subframe in another renderer process. -// Similar to NavigateSubframeWithOpener, but this test verifies the subframe -// opener plumbing for blink::mojom::RemoteFrame::CreateRemoteChild(), whereas -// NavigateSubframeWithOpener targets mojom::Renderer::CreateFrame(). +// `blink::RemoteFrame` is created for that subframe in another renderer +// process. Similar to NavigateSubframeWithOpener, but this test verifies the +// subframe opener plumbing for blink::mojom::RemoteFrame::CreateRemoteChild(), +// whereas NavigateSubframeWithOpener targets mojom::Renderer::CreateFrame(). IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest, NewRenderFrameProxyPreservesOpener) { GURL main_url( @@ -4156,7 +4156,7 @@ EvalJs(child1, "document.activeElement.tagName").ExtractString())); } -// Tests that we are using the correct RenderFrameProxy when navigating an +// Tests that we are using the correct `blink::RemoteFrame` when navigating an // opener window. IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest, OpenerSetLocation) { // Navigate the main window. @@ -6588,7 +6588,7 @@ EXPECT_EQ(c_url, observer.last_navigation_url()); EXPECT_TRUE(observer.last_navigation_succeeded()); - // Kill the b.com process (which currently hosts a RenderFrameProxy that + // Kill the b.com process (which currently hosts a `blink::RemoteFrame` that // replaced the pending RenderFrame in |popup2|, as well as the RenderFrame // for |popup|). RenderProcessHost* b_process = @@ -8088,10 +8088,10 @@ // created its RenderFrame, which crashed when referencing its parent by a // proxy which didn't exist. // -// All cross-process navigations now require creating a RenderFrameProxy before -// creating a RenderFrame, which makes such navigations follow the provisional -// frame (remote-to-local navigation) paths, where such a scenario is no longer -// possible. See https://crbug.com/756790. +// All cross-process navigations now require creating a `blink::RemoteFrame` +// before creating a RenderFrame, which makes such navigations follow the +// provisional frame (remote-to-local navigation) paths, where such a scenario +// is no longer possible. See https://crbug.com/756790. IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest, TwoCrossSitePendingNavigationsAndMainFrameWins) { GURL main_url(embedded_test_server()->GetURL(
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index 276ae812..8fa436c 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -7879,10 +7879,10 @@ void WebContentsImpl::OnAdvanceFocus(RenderFrameHostImpl* source_rfh) { OPTIONAL_TRACE_EVENT1("content", "WebContentsImpl::OnAdvanceFocus", "render_frame_host", source_rfh); - // When a RenderFrame needs to advance focus to a RenderFrameProxy (by hitting - // TAB), the RenderFrameProxy sends an IPC to RenderFrameProxyHost. When this - // RenderFrameProxyHost represents an inner WebContents, the outer WebContents - // needs to focus the inner WebContents. + // When a RenderFrame needs to advance focus to a `blink::RemoteFrame` (by + // hitting TAB), the `blink::RemoteFrame` sends an IPC to + // RenderFrameProxyHost. When this RenderFrameProxyHost represents an inner + // WebContents, the outer WebContents needs to focus the inner WebContents. if (GetOuterWebContents() && GetOuterWebContents() == WebContents::FromRenderFrameHost(source_rfh) && GetFocusedWebContents() == GetOuterWebContents()) {
diff --git a/content/browser/webid/federated_auth_request_impl.cc b/content/browser/webid/federated_auth_request_impl.cc index e34ba83..f03626ee 100644 --- a/content/browser/webid/federated_auth_request_impl.cc +++ b/content/browser/webid/federated_auth_request_impl.cc
@@ -136,11 +136,6 @@ kErrorFetchingClientMetadataInvalidResponse: { return "Provider's client metadata is invalid."; } - case FederatedAuthRequestResult:: - kErrorClientMetadataMissingPrivacyPolicyUrl: { - return "Provider's client metadata is missing or has an invalid privacy " - "policy url."; - } case FederatedAuthRequestResult::kErrorFetchingAccountsHttpNotFound: { return "The provider's accounts list endpoint cannot be found."; } @@ -208,8 +203,6 @@ case FederatedAuthRequestResult::kErrorFetchingClientMetadataHttpNotFound: case FederatedAuthRequestResult::kErrorFetchingClientMetadataNoResponse: case FederatedAuthRequestResult:: - kErrorClientMetadataMissingPrivacyPolicyUrl: - case FederatedAuthRequestResult:: kErrorFetchingClientMetadataInvalidResponse: case FederatedAuthRequestResult::kErrorFetchingAccountsHttpNotFound: case FederatedAuthRequestResult::kErrorFetchingAccountsNoResponse:
diff --git a/content/browser/webid/federated_auth_request_impl_unittest.cc b/content/browser/webid/federated_auth_request_impl_unittest.cc index 7457a51c..8900ddb9 100644 --- a/content/browser/webid/federated_auth_request_impl_unittest.cc +++ b/content/browser/webid/federated_auth_request_impl_unittest.cc
@@ -643,10 +643,6 @@ {FederatedAuthRequestResult:: kErrorFetchingClientMetadataInvalidResponse, "Provider's client metadata is invalid."}, - {FederatedAuthRequestResult:: - kErrorClientMetadataMissingPrivacyPolicyUrl, - "Provider's client metadata is missing or has an invalid privacy " - "policy url."}, {FederatedAuthRequestResult::kErrorFetchingIdTokenInvalidResponse, "Provider's token is invalid."}, };
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc index 1a31b155..d0788e40 100644 --- a/content/child/runtime_features.cc +++ b/content/child/runtime_features.cc
@@ -338,6 +338,7 @@ features::kAndroidDownloadableFontsMatching}, {"CancelFormSubmissionInDefaultHandler", blink::features::kCancelFormSubmissionInDefaultHandler}, + {"BatchFetchRequests", blink::features::kBatchFetchRequests}, {"ClipboardCustomFormats", blink::features::kClipboardCustomFormats}, {"CSSContainerQueries", blink::features::kCSSContainerQueries}, {"CSSOverflowForReplacedElements",
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn index c6f685a..99558277 100644 --- a/content/common/BUILD.gn +++ b/content/common/BUILD.gn
@@ -137,7 +137,6 @@ "shared_file_util.h", "skia_utils.cc", "skia_utils.h", - "state_transitions.h", "thread_pool_util.cc", "thread_pool_util.h", "trace_utils.h",
diff --git a/content/common/agent_scheduling_group.mojom b/content/common/agent_scheduling_group.mojom index d611223..f2275d18 100644 --- a/content/common/agent_scheduling_group.mojom +++ b/content/common/agent_scheduling_group.mojom
@@ -72,34 +72,6 @@ // Tells the renderer to create a new RenderFrame. CreateFrame(CreateFrameParams params); - // Tells the renderer to create a new RemoteFrame main frame. See - // blink.mojom.RemoteFrame.CreateRemoteChild for creating child frames - // of RemoteFrames. - // - // `token`: The frame token. Used to map between RemoteFrame and - // RenderFrameProxyHost. - // `opener_frame_token`: Frame token that identifies the opener frame if one - // exists, or absl::nullopt otherwise. - // `view_routing_id`: routing ID of the RenderView for this RenderFrameProxy. - // Must not be `MSG_ROUTING_NONE`. - // `devtools_frame_token`: Used for devtools instrumentation and - // trace-ability. The token is shared across all frames (local or remotes) - // representing the same logical frame tree node, and is used by Blink and - // content to tag calls and requests for instrumentation purposes, - // allowing them to be attributed to a context frame. - // - // Must not be used to look up a RenderFrameHostImpl or - // RenderFrameProxyHost in the browser process, as the token is shared, - // making the mapping ambiguous and non-authoritative. - CreateRemoteMainFrame( - blink.mojom.RemoteFrameToken token, - blink.mojom.FrameToken? opener_frame_token, - int32 view_routing_id, - blink.mojom.FrameReplicationState replication_state, - mojo_base.mojom.UnguessableToken devtools_frame_token, - blink.mojom.RemoteFrameInterfacesFromBrowser remote_frame_interfaces, - RemoteMainFrameInterfaces remote_main_frame_interfaces); - // Tells the renderer process to create a thread that exclusively hosts the // shared storage worklet service. CreateSharedStorageWorkletService(
diff --git a/content/common/frame.mojom b/content/common/frame.mojom index fc7e18c..ef0d6146 100644 --- a/content/common/frame.mojom +++ b/content/common/frame.mojom
@@ -97,9 +97,6 @@ // Preferences for this view. blink.mojom.WebPreferences web_preferences; - // The ID of the view to be created. - int32 view_id = IPC.mojom.kRoutingIdNone; - // The session storage namespace ID this view should use. string session_storage_namespace_id; @@ -198,7 +195,7 @@ // The communication channels for the Remote/RemoteMainFrame in this view. blink.mojom.RemoteFrameInterfacesFromBrowser frame_interfaces; - RemoteMainFrameInterfaces main_frame_interfaces; + blink.mojom.RemoteMainFrameInterfaces main_frame_interfaces; }; // Parameters used for creating a new frame widget. @@ -346,12 +343,6 @@ kSpeculativeMainFrameForNavigationCancelled, }; -// Struct for communication channels of the RemoteMainFrame in blink. -struct RemoteMainFrameInterfaces { - pending_associated_remote<blink.mojom.RemoteMainFrameHost> main_frame_host; - pending_associated_receiver<blink.mojom.RemoteMainFrame> main_frame; -}; - // Implemented by the frame provider, and must be associated with other content // mojoms bound to frames, widgets, views, and currently also with the legacy // IPC channel. @@ -403,7 +394,7 @@ blink.mojom.FrameReplicationState new_remote_frame_replication_state, blink.mojom.RemoteFrameToken new_remote_frame_token, blink.mojom.RemoteFrameInterfacesFromBrowser new_remote_frame_interfaces, - RemoteMainFrameInterfaces new_remote_main_frame_interfaces); + blink.mojom.RemoteMainFrameInterfaces new_remote_main_frame_interfaces); // Delete the frame. This is only called for child frames that the browser // wants to detach, or for speculative main frames which are owned by the @@ -450,7 +441,7 @@ blink.mojom.FrameReplicationState new_remote_frame_replication_state, blink.mojom.RemoteFrameToken new_remote_frame_token, blink.mojom.RemoteFrameInterfacesFromBrowser new_remote_frame_interfaces, - RemoteMainFrameInterfaces new_remote_main_frame_interfaces); + blink.mojom.RemoteMainFrameInterfaces new_remote_main_frame_interfaces); // Causes all new subresource requests to be blocked (not being started) until // ResumeBlockedRequests is called. @@ -591,9 +582,6 @@ // See if there's a reasonable way to factor out state here by splitting things // into browser-created params vs renderer-created params. struct CreateNewWindowReply { - // The ID of the view to be created. - int32 route_id; - // The unique identifier of the RenderFrameHost blink.mojom.LocalFrameToken main_frame_token;
diff --git a/content/public/renderer/render_frame_observer.h b/content/public/renderer/render_frame_observer.h index 5a7d3da5..7d16954 100644 --- a/content/public/renderer/render_frame_observer.h +++ b/content/public/renderer/render_frame_observer.h
@@ -147,9 +147,9 @@ const blink::WebVector<blink::WebString>& stopped_matching_selectors) {} // Called when the RenderFrame creates a FencedFrame and provides the - // RemoteFrameToken to identify the RenderFrameProxy to the inner + // RemoteFrameToken to identify the `blink::RemoteFrame` to the inner // RenderFrame. This is called immediately after the FencedFrame is created - // in the browser and the RenderFrameProxy initialized in this renderer. + // in the browser and the `blink::RemoteFrame` initialized in this renderer. virtual void DidCreateFencedFrame( const blink::RemoteFrameToken& placeholder_token) {}
diff --git a/content/public/test/mock_render_thread.cc b/content/public/test/mock_render_thread.cc index 9461873..7b39453 100644 --- a/content/public/test/mock_render_thread.cc +++ b/content/public/test/mock_render_thread.cc
@@ -283,7 +283,6 @@ void MockRenderThread::OnCreateWindow( const mojom::CreateNewWindowParams& params, mojom::CreateNewWindowReply* reply) { - reply->route_id = GetNextRoutingID(); reply->frame = TestRenderFrame::CreateStubFrameReceiver(); reply->main_frame_route_id = GetNextRoutingID(); frame_routing_id_to_initial_browser_brokers_.emplace(
diff --git a/content/public/test/render_view_test.cc b/content/public/test/render_view_test.cc index a117908..9663d3316 100644 --- a/content/public/test/render_view_test.cc +++ b/content/public/test/render_view_test.cc
@@ -475,7 +475,6 @@ view_params->window_was_opened_by_another_window = false; view_params->renderer_preferences = blink::RendererPreferences(); view_params->web_preferences = blink::web_pref::WebPreferences(); - view_params->view_id = render_thread_->GetNextRoutingID(); view_params->replication_state = blink::mojom::FrameReplicationState::New(); view_params->blink_page_broadcast = page_broadcast_.BindNewEndpointAndPassDedicatedReceiver();
diff --git a/content/renderer/agent_scheduling_group.cc b/content/renderer/agent_scheduling_group.cc index 4d1191ca..ec19777 100644 --- a/content/renderer/agent_scheduling_group.cc +++ b/content/renderer/agent_scheduling_group.cc
@@ -276,34 +276,6 @@ std::move(params->policy_container)); } -void AgentSchedulingGroup::CreateRemoteMainFrame( - const blink::RemoteFrameToken& frame_token, - const absl::optional<blink::FrameToken>& opener_frame_token, - int32_t view_routing_id, - blink::mojom::FrameReplicationStatePtr replicated_state, - const base::UnguessableToken& devtools_frame_token, - blink::mojom::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, - mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) { - blink::WebFrame* opener = nullptr; - if (opener_frame_token) - opener = blink::WebFrame::FromFrameToken(*opener_frame_token); - // Create a top level WebRemoteFrame. - RenderViewImpl* render_view = RenderViewImpl::FromRoutingID(view_routing_id); - blink::WebView* web_view = render_view->GetWebView(); - blink::WebRemoteFrame::CreateMainFrame( - web_view, frame_token, devtools_frame_token, opener, - std::move(remote_frame_interfaces->frame_host), - std::move(remote_frame_interfaces->frame_receiver), - std::move(replicated_state)); - // Root frame proxy has no ancestors to point to their RenderWidget. - - // The WebRemoteFrame created here was already attached to the Page as its - // main frame, so we can call WebView's DidAttachRemoteMainFrame(). - web_view->DidAttachRemoteMainFrame( - std::move(remote_main_frame_interfaces->main_frame_host), - std::move(remote_main_frame_interfaces->main_frame)); -} - void AgentSchedulingGroup::CreateSharedStorageWorkletService( mojo::PendingReceiver< shared_storage_worklet::mojom::SharedStorageWorkletService> receiver) {
diff --git a/content/renderer/agent_scheduling_group.h b/content/renderer/agent_scheduling_group.h index e92ca24..3c166ed 100644 --- a/content/renderer/agent_scheduling_group.h +++ b/content/renderer/agent_scheduling_group.h
@@ -92,15 +92,6 @@ // mojom::AgentSchedulingGroup: void CreateView(mojom::CreateViewParamsPtr params) override; void CreateFrame(mojom::CreateFrameParamsPtr params) override; - void CreateRemoteMainFrame( - const blink::RemoteFrameToken& token, - const absl::optional<blink::FrameToken>& opener_frame_token, - int32_t view_routing_id, - blink::mojom::FrameReplicationStatePtr replicated_state, - const base::UnguessableToken& devtools_frame_token, - blink::mojom::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, - mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) - override; void CreateSharedStorageWorkletService( mojo::PendingReceiver< shared_storage_worklet::mojom::SharedStorageWorkletService> receiver)
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 33497b7..26ec0c2e 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -464,7 +464,7 @@ // Set the request initiator origin, which is supplied by the browser // process. It is present in cases such as navigating a frame in a different - // process, which is routed through RenderFrameProxy and the origin is + // process, which is routed through `blink::RemoteFrame` and the origin is // required to correctly compute the effective origin in which the // navigation will commit. if (common_params.initiator_origin) { @@ -2027,7 +2027,7 @@ blink::mojom::FrameReplicationStatePtr replicated_frame_state, const blink::RemoteFrameToken& proxy_frame_token, blink::mojom::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, - mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) { + blink::mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) { TRACE_EVENT1("navigation,rail", "RenderFrameImpl::UnloadFrame", "id", routing_id_); DCHECK(!base::RunLoop::IsNestedOnCurrentThread()); @@ -2132,7 +2132,7 @@ blink::mojom::FrameReplicationStatePtr replicated_frame_state, const blink::RemoteFrameToken& proxy_frame_token, blink::mojom::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, - mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) { + blink::mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) { // The browser process asked `this` to commit a navigation but has now decided // to discard the speculative RenderFrameHostImpl instead, since the // associated navigation was cancelled or replaced. However, the browser @@ -3954,7 +3954,7 @@ blink::mojom::FrameReplicationStatePtr replicated_frame_state, const blink::RemoteFrameToken& proxy_frame_token, blink::mojom::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, - mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) { + blink::mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) { TRACE_EVENT1("navigation,rail", "RenderFrameImpl::SwapOutAndDeleteThis", "id", routing_id_); DCHECK(!base::RunLoop::IsNestedOnCurrentThread()); @@ -3987,9 +3987,10 @@ // frame to cause them to become detached. DCHECK(success); - // The RenderFrameProxy being swapped in here has now been attached to the - // Page as its main frame and properly initialized by the WebFrame::Swap() - // call, so we can call WebView's DidAttachRemoteMainFrame(). + // The `blink::RemoteFrame` being swapped in here has now been attached to + // the Page as its main frame and properly initialized by the + // WebFrame::Swap() call, so we can call WebView's + // DidAttachRemoteMainFrame(). web_view->DidAttachRemoteMainFrame( std::move(remote_main_frame_interfaces->main_frame_host), std::move(remote_main_frame_interfaces->main_frame)); @@ -4320,10 +4321,6 @@ return web_media_stream_device_observer_.get(); } -bool RenderFrameImpl::AllowRTCLegacyTLSProtocols() { - return GetRendererPreferences().webrtc_allow_legacy_tls_protocols; -} - blink::WebEncryptedMediaClient* RenderFrameImpl::EncryptedMediaClient() { return media_factory_.EncryptedMediaClient(); } @@ -4365,12 +4362,6 @@ return document_state && document_state->is_overriding_user_agent(); } -blink::WebString RenderFrameImpl::DoNotTrackValue() { - if (GetWebView()->GetRendererPreferences().enable_do_not_track) - return WebString::FromUTF8("1"); - return WebString(); -} - blink::mojom::RendererAudioInputStreamFactory* RenderFrameImpl::GetAudioInputStreamFactory() { if (!audio_input_stream_factory_)
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h index 19eae2c0..34a9abf 100644 --- a/content/renderer/render_frame_impl.h +++ b/content/renderer/render_frame_impl.h
@@ -591,11 +591,9 @@ void PreloadSubresourceOptimizationsForOrigins( const std::vector<blink::WebSecurityOrigin>& origins) override; blink::WebMediaStreamDeviceObserver* MediaStreamDeviceObserver() override; - bool AllowRTCLegacyTLSProtocols() override; blink::WebEncryptedMediaClient* EncryptedMediaClient() override; blink::WebString UserAgentOverride() override; absl::optional<blink::UserAgentMetadata> UserAgentMetadataOverride() override; - blink::WebString DoNotTrackValue() override; blink::mojom::RendererAudioInputStreamFactory* GetAudioInputStreamFactory(); bool AllowContentInitiatedDataUrlNavigations( const blink::WebURL& url) override; @@ -825,7 +823,7 @@ blink::mojom::FrameReplicationStatePtr replicated_frame_state, const blink::RemoteFrameToken& frame_token, blink::mojom::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, - mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) + blink::mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) override; void Delete(mojom::FrameDeleteIntention intent) override; void UndoCommitNavigation( @@ -833,7 +831,7 @@ blink::mojom::FrameReplicationStatePtr replicated_frame_state, const blink::RemoteFrameToken& frame_token, blink::mojom::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, - mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) + blink::mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) override; void BlockRequests() override; void ResumeBlockedRequests() override; @@ -1085,7 +1083,7 @@ // Debounces many updates in quick succession. void StartDelayedSyncTimer(); - // Swaps out the RenderFrame, creating a new RenderFrameProxy and then + // Swaps out the RenderFrame, creating a new `blink::RemoteFrame` and then // swapping it into the frame tree to replace `this`. Returns false if // swapping out `this` ends up detaching this frame instead when running the // unload handlers, and true otherwise. @@ -1096,7 +1094,7 @@ blink::mojom::FrameReplicationStatePtr replicated_frame_state, const blink::RemoteFrameToken& frame_token, blink::mojom::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, - mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces); + blink::mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces); // Stores the WebLocalFrame we are associated with. This is null from the // constructor until BindToFrame() is called, and it is null after @@ -1143,10 +1141,10 @@ // // When a frame is created by the browser process, it is for a pending // navigation. In this case, it is not immediately attached to the frame tree - // if there is a RenderFrameProxy for the same frame. It is inserted into the - // frame tree at the time the pending navigation commits. - // Frames added by the parent document are created from the renderer process - // and are immediately inserted in the frame tree. + // if there is a `blink::RemoteFrame` for the same frame. It is inserted into + // the frame tree at the time the pending navigation commits. Frames added by + // the parent document are created from the renderer process and are + // immediately inserted in the frame tree. // TODO(dcheng): Remove this once we have FrameTreeHandle and can use the // Blink Web* layer to check for provisional frames. bool in_frame_tree_;
diff --git a/content/renderer/render_frame_impl_browsertest.cc b/content/renderer/render_frame_impl_browsertest.cc index cb7a0725..d3a9d3e 100644 --- a/content/renderer/render_frame_impl_browsertest.cc +++ b/content/renderer/render_frame_impl_browsertest.cc
@@ -138,7 +138,8 @@ std::ignore = frame_host.BindNewEndpointAndPassDedicatedReceiver(); remote_frame_interfaces->frame_host = frame_host.Unbind(); - auto remote_main_frame_interfaces = mojom::RemoteMainFrameInterfaces::New(); + auto remote_main_frame_interfaces = + blink::mojom::RemoteMainFrameInterfaces::New(); mojo::AssociatedRemote<blink::mojom::RemoteMainFrame> main_frame; remote_main_frame_interfaces->main_frame = main_frame.BindNewEndpointAndPassDedicatedReceiver();
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc index 3d6ecb3..69cc34f 100644 --- a/content/renderer/render_view_browsertest.cc +++ b/content/renderer/render_view_browsertest.cc
@@ -277,8 +277,9 @@ return interfaces; } -mojom::RemoteMainFrameInterfacesPtr CreateStubRemoteMainFrameInterfaces() { - auto interfaces = mojom::RemoteMainFrameInterfaces::New(); +blink::mojom::RemoteMainFrameInterfacesPtr +CreateStubRemoteMainFrameInterfaces() { + auto interfaces = blink::mojom::RemoteMainFrameInterfaces::New(); mojo::AssociatedRemote<blink::mojom::RemoteMainFrame> main_frame; interfaces->main_frame = main_frame.BindNewEndpointAndPassDedicatedReceiver(); @@ -975,13 +976,12 @@ popup_request.SetMode(network::mojom::RequestMode::kNavigate); popup_request.SetRedirectMode(network::mojom::RedirectMode::kManual); popup_request.SetRequestContext(blink::mojom::RequestContextType::INTERNAL); - blink::WebView* new_web_view = - RenderViewImpl::FromWebView(web_view_)->CreateView( - GetMainFrame(), popup_request, blink::WebWindowFeatures(), "foo", - blink::kWebNavigationPolicyNewForegroundTab, - network::mojom::WebSandboxFlags::kNone, - blink::AllocateSessionStorageNamespaceId(), consumed_user_gesture, - absl::nullopt, absl::nullopt); + blink::WebView* new_web_view = web_view_->Client()->CreateView( + GetMainFrame(), popup_request, blink::WebWindowFeatures(), "foo", + blink::kWebNavigationPolicyNewForegroundTab, + network::mojom::WebSandboxFlags::kNone, + blink::AllocateSessionStorageNamespaceId(), consumed_user_gesture, + absl::nullopt, absl::nullopt); auto popup_navigation_info = std::make_unique<blink::WebNavigationInfo>(); popup_navigation_info->url_request = std::move(popup_request); popup_navigation_info->frame_type =
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index f9a857f2..ceaa9fcb 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc
@@ -35,6 +35,7 @@ #include "third_party/blink/public/web/web_frame_widget.h" #include "third_party/blink/public/web/web_local_frame.h" #include "third_party/blink/public/web/web_page_popup.h" +#include "third_party/blink/public/web/web_remote_frame.h" #include "third_party/blink/public/web/web_view.h" #include "third_party/blink/public/web/web_window_features.h" #include "ui/base/ui_base_features.h" @@ -49,15 +50,6 @@ namespace content { -//----------------------------------------------------------------------------- - -typedef std::map<blink::WebView*, RenderViewImpl*> ViewMap; -static base::LazyInstance<ViewMap>::Leaky g_view_map = - LAZY_INSTANCE_INITIALIZER; -typedef std::map<int32_t, RenderViewImpl*> RoutingIDViewMap; -static base::LazyInstance<RoutingIDViewMap>::Leaky g_routing_id_view_map = - LAZY_INSTANCE_INITIALIZER; - // static WindowOpenDisposition RenderViewImpl::NavigationPolicyToDisposition( WebNavigationPolicy policy) { @@ -101,8 +93,7 @@ RenderViewImpl::RenderViewImpl(AgentSchedulingGroup& agent_scheduling_group, const mojom::CreateViewParams& params) - : routing_id_(params.view_id), - agent_scheduling_group_(agent_scheduling_group) { + : agent_scheduling_group_(agent_scheduling_group) { // Please put all logic in RenderViewImpl::Initialize(). } @@ -130,9 +121,6 @@ agent_scheduling_group_.agent_group_scheduler(), params->session_storage_namespace_id, params->base_background_color); - g_view_map.Get().insert(std::make_pair(GetWebView(), this)); - g_routing_id_view_map.Get().insert(std::make_pair(routing_id_, this)); - bool local_main_frame = params->main_frame->is_local_params(); webview_->SetRendererPreferences(params->renderer_preferences); @@ -148,16 +136,23 @@ std::move(params->replication_state), params->devtools_main_frame_token, std::move(params->main_frame->get_local_params())); } else { - static_cast<mojom::AgentSchedulingGroup&>(agent_scheduling_group_) - .CreateRemoteMainFrame( - params->main_frame->get_remote_params()->token, - params->opener_frame_token, routing_id_, - std::move(params->replication_state), - params->devtools_main_frame_token, - std::move( - params->main_frame->get_remote_params()->frame_interfaces), - std::move(params->main_frame->get_remote_params() - ->main_frame_interfaces)); + blink::WebRemoteFrame::CreateMainFrame( + webview_, params->main_frame->get_remote_params()->token, + params->devtools_main_frame_token, opener_frame, + std::move(params->main_frame->get_remote_params() + ->frame_interfaces->frame_host), + std::move(params->main_frame->get_remote_params() + ->frame_interfaces->frame_receiver), + std::move(params->replication_state)); + // Root frame proxy has no ancestors to point to their RenderWidget. + + // The WebRemoteFrame created here was already attached to the Page as its + // main frame, so we can call WebView's DidAttachRemoteMainFrame(). + webview_->DidAttachRemoteMainFrame( + std::move(params->main_frame->get_remote_params() + ->main_frame_interfaces->main_frame_host), + std::move(params->main_frame->get_remote_params() + ->main_frame_interfaces->main_frame)); } // TODO(davidben): Move this state from Blink into content. @@ -168,38 +163,7 @@ was_created_by_renderer); } -RenderViewImpl::~RenderViewImpl() { - DCHECK(destroying_); // Always deleted through OnDestruct(). - - g_routing_id_view_map.Get().erase(routing_id_); - -#ifndef NDEBUG - // Make sure we are no longer referenced by the ViewMap or RoutingIDViewMap. - ViewMap* views = g_view_map.Pointer(); - for (ViewMap::iterator it = views->begin(); it != views->end(); ++it) - DCHECK_NE(this, it->second) << "Failed to call Close?"; - RoutingIDViewMap* routing_id_views = g_routing_id_view_map.Pointer(); - for (RoutingIDViewMap::iterator it = routing_id_views->begin(); - it != routing_id_views->end(); ++it) - DCHECK_NE(this, it->second) << "Failed to call Close?"; -#endif -} - -/*static*/ -RenderViewImpl* RenderViewImpl::FromWebView(blink::WebView* webview) { - DCHECK(RenderThread::IsMainThread()); - ViewMap* views = g_view_map.Pointer(); - auto it = views->find(webview); - return it == views->end() ? NULL : it->second; -} - -/*static*/ -RenderViewImpl* RenderViewImpl::FromRoutingID(int32_t routing_id) { - DCHECK(RenderThread::IsMainThread()); - RoutingIDViewMap* views = g_routing_id_view_map.Pointer(); - auto it = views->find(routing_id); - return it == views->end() ? NULL : it->second; -} +RenderViewImpl::~RenderViewImpl() = default; /*static*/ RenderViewImpl* RenderViewImpl::Create( @@ -207,7 +171,6 @@ mojom::CreateViewParamsPtr params, bool was_created_by_renderer, scoped_refptr<base::SingleThreadTaskRunner> task_runner) { - DCHECK(params->view_id != MSG_ROUTING_NONE); DCHECK(!params->session_storage_namespace_id.empty()) << "Session storage namespace must be populated."; @@ -221,10 +184,6 @@ // blink::WebViewClient ------------------------------------------------------ void RenderViewImpl::OnDestruct() { - destroying_ = true; - // The webview_ is already destroyed by the time we get here, remove any - // references to it. - g_view_map.Get().erase(webview_); delete this; } @@ -341,7 +300,6 @@ return nullptr; DCHECK(reply); - DCHECK_NE(MSG_ROUTING_NONE, reply->route_id); DCHECK_NE(MSG_ROUTING_NONE, reply->main_frame_route_id); DCHECK_NE(MSG_ROUTING_NONE, reply->widget_params->routing_id); @@ -364,7 +322,6 @@ view_params->window_was_opened_by_another_window = true; view_params->renderer_preferences = webview_->GetRendererPreferences(); view_params->web_preferences = webview_->GetWebPreferences(); - view_params->view_id = reply->route_id; view_params->replication_state = blink::mojom::FrameReplicationState::New(); view_params->replication_state->frame_policy.sandbox_flags = sandbox_flags;
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h index f55211fd..6a3cba8 100644 --- a/content/renderer/render_view_impl.h +++ b/content/renderer/render_view_impl.h
@@ -88,12 +88,6 @@ RenderViewImpl(const RenderViewImpl&) = delete; RenderViewImpl& operator=(const RenderViewImpl&) = delete; - // Returns the RenderViewImpl for the given routing ID. - static RenderViewImpl* FromRoutingID(int routing_id); - - // Returns the RenderViewImpl for the given blink::WebView. - static RenderViewImpl* FromWebView(blink::WebView* web_view); - // blink::WebViewClient implementation -------------------------------------- blink::WebView* CreateView( @@ -146,13 +140,6 @@ // it in the same order in the .cc file as it was in the header. // --------------------------------------------------------------------------- - // Becomes true when Destroy() is called. - bool destroying_ = false; - - // Routing ID that allows us to communicate with the corresponding - // RenderViewHost in the parent browser process. - const int32_t routing_id_; - // View ---------------------------------------------------------------------- // This class owns this member, and is responsible for calling
diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc index 8077fb8..e3b66f1 100644 --- a/content/renderer/renderer_blink_platform_impl.cc +++ b/content/renderer/renderer_blink_platform_impl.cc
@@ -200,9 +200,6 @@ } #endif - // TODO(crbug/1349313): Remove this invocation. - main_thread_scheduler_->SetTopLevelBlameContext(nullptr); - auto io_task_runner = GetIOTaskRunner(); if (io_task_runner) { io_task_runner->PostTask( @@ -220,13 +217,10 @@ } RendererBlinkPlatformImpl::~RendererBlinkPlatformImpl() { - main_thread_scheduler_->SetTopLevelBlameContext(nullptr); - { - base::ScopedAllowBaseSyncPrimitives allow; - // Ensure task posted to IO thread is finished because it contains - // pointers to fields of `this`. - io_thread_id_ready_event_.Wait(); - } + base::ScopedAllowBaseSyncPrimitives allow; + // Ensure task posted to IO thread is finished because it contains + // pointers to fields of `this`. + io_thread_id_ready_event_.Wait(); } void RendererBlinkPlatformImpl::Shutdown() {}
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index d5cbec7..e00d9af 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -2489,7 +2489,6 @@ "../common/input/event_with_latency_info_unittest.cc", "../common/input/gesture_event_stream_validator_unittest.cc", "../common/input/touch_event_stream_validator_unittest.cc", - "../common/state_transitions_unittest.cc", "../common/url_utils_unittest.cc", "../common/user_agent_unittest.cc", "../common/webplugininfo_unittest.cc",
diff --git a/content/test/data/accessibility/aria/aria-required-empty-input-expected-blink.txt b/content/test/data/accessibility/aria/aria-required-empty-input-expected-blink.txt new file mode 100644 index 0000000..e0109429 --- /dev/null +++ b/content/test/data/accessibility/aria/aria-required-empty-input-expected-blink.txt
@@ -0,0 +1,7 @@ +rootWebArea +++genericContainer ignored +++++genericContainer +++++++textField required invalidState=false +++++++++genericContainer +++++++textField required invalidState=false +++++++++genericContainer \ No newline at end of file
diff --git a/content/test/data/accessibility/aria/aria-required-empty-input.html b/content/test/data/accessibility/aria/aria-required-empty-input.html new file mode 100644 index 0000000..5298008 --- /dev/null +++ b/content/test/data/accessibility/aria/aria-required-empty-input.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<!-- +@BLINK-ALLOW:ariaInvalidValue* +@BLINK-ALLOW:invalidState* +@MAC-ALLOW:AXInvalid* +@WIN-ALLOW:ia2_hypertext* +@WIN-ALLOW:IA2_STATE_INVALID_ENTRY +@WIN-ALLOW:invalid* +@AURALINUX-ALLOW:invalid* +--> +<!-- crbug.com/1318969 Don't expose invalid on an empty required field, + in order to avoid redundant verbalizations. +--> +<html> +<body> + <input required></input> + <input aria-required="true"></input> +</body> +</html>
diff --git a/content/test/data/accessibility/aria/graphics-roles-expected-uia-win.txt b/content/test/data/accessibility/aria/graphics-roles-expected-uia-win.txt new file mode 100644 index 0000000..434102de --- /dev/null +++ b/content/test/data/accessibility/aria/graphics-roles-expected-uia-win.txt
@@ -0,0 +1,4 @@ +Document +++Document Name='graphics-document' +++Group Name='graphics-object' +++Image Name='graphics-symbol' \ No newline at end of file
diff --git a/content/test/data/accessibility/css/first-letter-expected-blink.txt b/content/test/data/accessibility/css/first-letter-expected-blink.txt index d34c1d9..c4a1b7d 100644 --- a/content/test/data/accessibility/css/first-letter-expected-blink.txt +++ b/content/test/data/accessibility/css/first-letter-expected-blink.txt
@@ -11,3 +11,9 @@ ++++++++++++++inlineTextBox name='T' ++++++++staticText name='his starts with a large T.' ++++++++++inlineTextBox name='his starts with a large T.' +++++++heading name='%E0%A4%B8%E0%A5%8D%E0%A4%A5%E0%A4%B2%E0%A5%8B%E0%A4%82' +++++++++staticText name='%E0%A4%B8%E0%A5%8D%E0%A4%A5%E0%A4%B2%E0%A5%8B%E0%A4%82' +++++++++++inlineTextBox name='%E0%A4%B8%E0%A5%8D%E0%A4%A5%E0%A4%B2%E0%A5%8B%E0%A4%82' +++++++heading name='((AB))C' +++++++++staticText name='((AB))C' +++++++++++inlineTextBox name='((AB))C'
diff --git a/content/test/data/accessibility/css/first-letter.html b/content/test/data/accessibility/css/first-letter.html index b174c3e..7635750 100644 --- a/content/test/data/accessibility/css/first-letter.html +++ b/content/test/data/accessibility/css/first-letter.html
@@ -5,3 +5,5 @@ </style> <h1>Chapter 1</h1> <p>his starts with a large T. +<h1>स्थलों</h1> +<h1>((AB))C</h1>
diff --git a/content/test/data/resource_loading/resource_loading_non_mobile.html b/content/test/data/resource_loading/resource_loading_non_mobile.html index 81dd59d..ee27cf6 100644 --- a/content/test/data/resource_loading/resource_loading_non_mobile.html +++ b/content/test/data/resource_loading/resource_loading_non_mobile.html
@@ -23,6 +23,9 @@ function getResourceNumber() { setInterval(function() { if (resourcesNumber != -1) { + if (resourcesNumber !== 9) { + window.performance.getEntriesByType("resource").forEach(e => { console.log(JSON.stringify(e.toJSON())); }) + } sendValueToTest(resourcesNumber); } }, 300);
diff --git a/content/test/test_page_broadcast.cc b/content/test/test_page_broadcast.cc index 992045f..eaf5a1e 100644 --- a/content/test/test_page_broadcast.cc +++ b/content/test/test_page_broadcast.cc
@@ -4,6 +4,9 @@ #include "content/test/test_page_broadcast.h" +#include "third_party/blink/public/mojom/frame/frame.mojom.h" +#include "third_party/blink/public/mojom/frame/frame_replication_state.mojom.h" + namespace content { TestPageBroadcast::TestPageBroadcast( @@ -44,4 +47,12 @@ void TestPageBroadcast::SetPageBaseBackgroundColor( absl::optional<SkColor> color) {} +void TestPageBroadcast::CreateRemoteMainFrame( + const blink::RemoteFrameToken& token, + const absl::optional<blink::FrameToken>& opener_frame_token, + blink::mojom::FrameReplicationStatePtr replication_state, + const base::UnguessableToken& devtools_frame_token, + blink::mojom::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, + blink::mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) {} + } // namespace content
diff --git a/content/test/test_page_broadcast.h b/content/test/test_page_broadcast.h index fd8ee8c1..81c00c3 100644 --- a/content/test/test_page_broadcast.h +++ b/content/test/test_page_broadcast.h
@@ -34,6 +34,14 @@ void SetHistoryOffsetAndLength(int32_t history_offset, int32_t history_length) override; void SetPageBaseBackgroundColor(absl::optional<SkColor> color) override; + void CreateRemoteMainFrame( + const blink::RemoteFrameToken& token, + const absl::optional<blink::FrameToken>& opener_frame_token, + blink::mojom::FrameReplicationStatePtr replication_state, + const base::UnguessableToken& devtools_frame_token, + blink::mojom::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, + blink::mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) + override; mojo::AssociatedReceiver<blink::mojom::PageBroadcast> receiver_; };
diff --git a/dbus/message.cc b/dbus/message.cc index ba8b081..a0f4295 100644 --- a/dbus/message.cc +++ b/dbus/message.cc
@@ -513,10 +513,10 @@ AppendBasic(DBUS_TYPE_DOUBLE, &value); } -void MessageWriter::AppendString(const std::string& value) { +void MessageWriter::AppendString(base::StringPiece value) { // D-Bus Specification (0.19) says a string "must be valid UTF-8". CHECK(base::IsStringUTF8(value)); - const char* pointer = value.c_str(); + const char* pointer = value.data() ? value.data() : ""; AppendBasic(DBUS_TYPE_STRING, &pointer); // TODO(satorux): It may make sense to return an error here, as the // input string can be large. If needed, we could add something like
diff --git a/dbus/message.h b/dbus/message.h index 7ff8c6ae..a6e2958 100644 --- a/dbus/message.h +++ b/dbus/message.h
@@ -15,6 +15,7 @@ #include "base/files/scoped_file.h" #include "base/memory/raw_ptr.h" +#include "base/strings/string_piece.h" #include "dbus/dbus_export.h" #include "dbus/object_path.h" @@ -287,7 +288,7 @@ void AppendInt64(int64_t value); void AppendUint64(uint64_t value); void AppendDouble(double value); - void AppendString(const std::string& value); + void AppendString(base::StringPiece value); void AppendObjectPath(const ObjectPath& value); // Appends a file descriptor to the message.
diff --git a/dbus/values_util.cc b/dbus/values_util.cc index 56652e5..8fcbfda 100644 --- a/dbus/values_util.cc +++ b/dbus/values_util.cc
@@ -68,26 +68,28 @@ } // Gets the D-Bus type signature for the value. -std::string GetTypeSignature(const base::Value& value) { - switch (value.type()) { - case base::Value::Type::BOOLEAN: - return "b"; - case base::Value::Type::INTEGER: - return "i"; - case base::Value::Type::DOUBLE: - return "d"; - case base::Value::Type::STRING: - return "s"; - case base::Value::Type::BINARY: - return "ay"; - case base::Value::Type::DICTIONARY: - return "a{sv}"; - case base::Value::Type::LIST: - return "av"; - default: - DLOG(ERROR) << "Unexpected type " << value.type(); +std::string GetTypeSignature(base::ValueView value) { + struct Visitor { + std::string operator()(absl::monostate) { + DLOG(ERROR) << "Unexpected type " << base::Value::Type::NONE; return std::string(); - } + } + + std::string operator()(bool) { return "b"; } + + std::string operator()(int) { return "i"; } + + std::string operator()(double) { return "d"; } + + std::string operator()(base::StringPiece) { return "s"; } + + std::string operator()(const base::Value::BlobStorage&) { return "ay"; } + + std::string operator()(const base::Value::Dict&) { return "a{sv}"; } + + std::string operator()(const base::Value::List&) { return "av"; } + }; + return value.Visit(Visitor()); } } // namespace @@ -217,44 +219,78 @@ return result; } -void AppendBasicTypeValueData(MessageWriter* writer, const base::Value& value) { - switch (value.type()) { - case base::Value::Type::BOOLEAN: { - writer->AppendBool(value.GetBool()); - break; +void AppendBasicTypeValueData(MessageWriter* writer, base::ValueView value) { + struct Visitor { + MessageWriter* writer; + + void operator()(absl::monostate) { + DLOG(ERROR) << "Unexpected type: " << base::Value::Type::NONE; } - case base::Value::Type::INTEGER: { - writer->AppendInt32(value.GetInt()); - break; + + void operator()(bool value) { writer->AppendBool(value); } + + void operator()(int value) { writer->AppendInt32(value); } + + void operator()(double value) { writer->AppendDouble(value); } + + void operator()(base::StringPiece value) { writer->AppendString(value); } + + void operator()(const base::Value::BlobStorage&) { + DLOG(ERROR) << "Unexpected type: " << base::Value::Type::BINARY; } - case base::Value::Type::DOUBLE: { - writer->AppendDouble(value.GetDouble()); - break; + + void operator()(const base::Value::Dict&) { + DLOG(ERROR) << "Unexpected type: " << base::Value::Type::DICT; } - case base::Value::Type::STRING: { - writer->AppendString(value.GetString()); - break; + + void operator()(const base::Value::List&) { + DLOG(ERROR) << "Unexpected type: " << base::Value::Type::LIST; } - default: - DLOG(ERROR) << "Unexpected type " << value.type(); - break; - } + }; + + value.Visit(Visitor{.writer = writer}); } void AppendBasicTypeValueDataAsVariant(MessageWriter* writer, - const base::Value& value) { + base::ValueView value) { MessageWriter sub_writer(nullptr); writer->OpenVariant(GetTypeSignature(value), &sub_writer); AppendBasicTypeValueData(&sub_writer, value); writer->CloseContainer(&sub_writer); } -void AppendValueData(MessageWriter* writer, const base::Value& value) { - switch (value.type()) { - case base::Value::Type::DICTIONARY: { +void AppendValueData(MessageWriter* writer, base::ValueView value) { + struct Visitor { + MessageWriter* writer; + + void operator()(absl::monostate) { + DLOG(ERROR) << "Unexpected type: " << base::Value::Type::NONE; + } + + void operator()(bool value) { + return AppendBasicTypeValueData(writer, value); + } + + void operator()(int value) { + return AppendBasicTypeValueData(writer, value); + } + + void operator()(double value) { + return AppendBasicTypeValueData(writer, value); + } + + void operator()(base::StringPiece value) { + return AppendBasicTypeValueData(writer, value); + } + + void operator()(const base::Value::BlobStorage& value) { + DLOG(ERROR) << "Unexpected type: " << base::Value::Type::BINARY; + } + + void operator()(const base::Value::Dict& value) { dbus::MessageWriter array_writer(nullptr); writer->OpenArray("{sv}", &array_writer); - for (auto item : value.DictItems()) { + for (auto item : value) { dbus::MessageWriter dict_entry_writer(nullptr); array_writer.OpenDictEntry(&dict_entry_writer); dict_entry_writer.AppendString(item.first); @@ -262,29 +298,22 @@ array_writer.CloseContainer(&dict_entry_writer); } writer->CloseContainer(&array_writer); - break; } - case base::Value::Type::LIST: { + + void operator()(const base::Value::List& value) { dbus::MessageWriter array_writer(nullptr); writer->OpenArray("v", &array_writer); - for (const auto& value_in_list : value.GetListDeprecated()) { + for (const auto& value_in_list : value) { AppendValueDataAsVariant(&array_writer, value_in_list); } writer->CloseContainer(&array_writer); - break; } - case base::Value::Type::BOOLEAN: - case base::Value::Type::INTEGER: - case base::Value::Type::DOUBLE: - case base::Value::Type::STRING: - AppendBasicTypeValueData(writer, value); - break; - default: - DLOG(ERROR) << "Unexpected type: " << value.type(); - } + }; + + value.Visit(Visitor{.writer = writer}); } -void AppendValueDataAsVariant(MessageWriter* writer, const base::Value& value) { +void AppendValueDataAsVariant(MessageWriter* writer, base::ValueView value) { MessageWriter variant_writer(nullptr); writer->OpenVariant(GetTypeSignature(value), &variant_writer); AppendValueData(&variant_writer, value);
diff --git a/dbus/values_util.h b/dbus/values_util.h index 09432159..abee1dff 100644 --- a/dbus/values_util.h +++ b/dbus/values_util.h
@@ -11,6 +11,7 @@ namespace base { class Value; +class ValueView; } namespace dbus { @@ -29,7 +30,7 @@ // types and to handle basic type members of collections that should not // have type "a{sv}" or "av". Otherwise, use AppendValueData. CHROME_DBUS_EXPORT void AppendBasicTypeValueData(MessageWriter* writer, - const base::Value& value); + base::ValueView value); // Appends a basic type value to |writer| as a variant. Basic types are BOOLEAN, // INTEGER, DOUBLE, and STRING. Use this function for values that are known to @@ -37,7 +38,7 @@ // not have type "a{sv}" or "av". Otherwise, use AppendValueDataAsVariant. CHROME_DBUS_EXPORT void AppendBasicTypeValueDataAsVariant( MessageWriter* writer, - const base::Value& value); + base::ValueView value); // Appends a value to |writer|. Value can be a basic type, as well as a // collection type, such as dictionary or list. Collections will be recursively @@ -45,7 +46,7 @@ // a{sv} and lists with type av. Any sub-dictionaries or sub-lists will also // have these types. CHROME_DBUS_EXPORT void AppendValueData(MessageWriter* writer, - const base::Value& value); + base::ValueView value); // Appends a value to |writer| as a variant. Value can be a basic type, as well // as a collection type, such as dictionary or list. Collections will be @@ -53,7 +54,7 @@ // with type a{sv} and lists with type av. Any sub-dictionaries or sub-lists // will also have these types. CHROME_DBUS_EXPORT void AppendValueDataAsVariant(MessageWriter* writer, - const base::Value& value); + base::ValueView value); } // namespace dbus
diff --git a/device/bluetooth/dbus/bluetooth_adapter_client.cc b/device/bluetooth/dbus/bluetooth_adapter_client.cc index ef9b89e1..29cd723 100644 --- a/device/bluetooth/dbus/bluetooth_adapter_client.cc +++ b/device/bluetooth/dbus/bluetooth_adapter_client.cc
@@ -464,8 +464,8 @@ bluetooth_adapter::kConnectDevice); dbus::MessageWriter writer(&method_call); - base::DictionaryValue dict; - dict.SetStringKey(bluetooth_device::kAddressProperty, address); + base::Value::Dict dict; + dict.Set(bluetooth_device::kAddressProperty, address); if (address_type) { std::string address_type_value; switch (*address_type) { @@ -479,8 +479,7 @@ NOTREACHED(); break; }; - dict.SetStringKey(bluetooth_device::kAddressTypeProperty, - address_type_value); + dict.Set(bluetooth_device::kAddressTypeProperty, address_type_value); } dbus::AppendValueData(&writer, dict);
diff --git a/device/bluetooth/dbus/bluetooth_gatt_characteristic_client.cc b/device/bluetooth/dbus/bluetooth_gatt_characteristic_client.cc index 1b4e4d96..e466de6 100644 --- a/device/bluetooth/dbus/bluetooth_gatt_characteristic_client.cc +++ b/device/bluetooth/dbus/bluetooth_gatt_characteristic_client.cc
@@ -105,8 +105,7 @@ // Append empty option dict dbus::MessageWriter writer(&method_call); - base::DictionaryValue dict; - dbus::AppendValueData(&writer, dict); + dbus::AppendValueData(&writer, base::Value::Dict()); object_proxy->CallMethodWithErrorCallback( &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, @@ -137,12 +136,11 @@ writer.AppendArrayOfBytes(value.data(), value.size()); // Append option dict - base::DictionaryValue dict; + base::Value::Dict dict; if (!type_option.empty()) { // NB: the "type" option was added in BlueZ 5.51. Older versions of BlueZ // will ignore this option. - dict.SetStringKey(bluetooth_gatt_characteristic::kOptionType, - type_option); + dict.Set(bluetooth_gatt_characteristic::kOptionType, type_option); } dbus::AppendValueData(&writer, dict); @@ -172,8 +170,7 @@ dbus::MessageWriter writer(&method_call); writer.AppendArrayOfBytes(value.data(), value.size()); - base::DictionaryValue dict; - dbus::AppendValueData(&writer, dict); + dbus::AppendValueData(&writer, base::Value::Dict()); object_proxy->CallMethodWithErrorCallback( &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
diff --git a/device/bluetooth/dbus/bluetooth_gatt_descriptor_client.cc b/device/bluetooth/dbus/bluetooth_gatt_descriptor_client.cc index 349ae53..69fce98 100644 --- a/device/bluetooth/dbus/bluetooth_gatt_descriptor_client.cc +++ b/device/bluetooth/dbus/bluetooth_gatt_descriptor_client.cc
@@ -108,8 +108,7 @@ // Append empty option dict dbus::MessageWriter writer(&method_call); - base::DictionaryValue dict; - dbus::AppendValueData(&writer, dict); + dbus::AppendValueData(&writer, base::Value::Dict()); object_proxy->CallMethodWithErrorCallback( &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, @@ -139,8 +138,7 @@ writer.AppendArrayOfBytes(value.data(), value.size()); // Append empty option dict - base::DictionaryValue dict; - dbus::AppendValueData(&writer, dict); + dbus::AppendValueData(&writer, base::Value::Dict()); object_proxy->CallMethodWithErrorCallback( &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
diff --git a/docs/android_accessing_cpp_features_in_java.md b/docs/android_accessing_cpp_features_in_java.md index 0af33dd..27eb289 100644 --- a/docs/android_accessing_cpp_features_in_java.md +++ b/docs/android_accessing_cpp_features_in_java.md
@@ -16,7 +16,7 @@ 2020" to be whatever the year is at the time of writing (as you would for any other file). ```java - // Copyright 2020 The Chromium Authors. All rights reserved. + // Copyright 2020 The Chromium Authors. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -82,7 +82,7 @@ would contain: ```java - // Copyright $YEAR The Chromium Authors. All rights reserved. + // Copyright $YEAR The Chromium Authors. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/docs/android_accessing_cpp_switches_in_java.md b/docs/android_accessing_cpp_switches_in_java.md index a15904a..2aa40e06 100644 --- a/docs/android_accessing_cpp_switches_in_java.md +++ b/docs/android_accessing_cpp_switches_in_java.md
@@ -14,7 +14,7 @@ 2020" to be whatever the year is at the time of writing (as you would for any other file). ```java - // Copyright 2020 The Chromium Authors. All rights reserved. + // Copyright 2020 The Chromium Authors. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -65,7 +65,7 @@ would contain: ```java - // Copyright $YEAR The Chromium Authors. All rights reserved. + // Copyright $YEAR The Chromium Authors. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/docs/cipd_and_3pp.md b/docs/cipd_and_3pp.md index 339f6a3..eea0be1 100644 --- a/docs/cipd_and_3pp.md +++ b/docs/cipd_and_3pp.md
@@ -194,7 +194,7 @@ ``` #!/bin/bash -# Copyright 2021 The Chromium Authors. All rights reserved. +# Copyright 2021 The Chromium Authors. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. @@ -222,7 +222,7 @@ ``` #!/usr/bin/env python -# Copyright 2021 The Chromium Authors. All rights reserved. +# Copyright 2021 The Chromium Authors. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/docs/closure_compilation.md b/docs/closure_compilation.md index 2067c48..9e4a0b0f 100644 --- a/docs/closure_compilation.md +++ b/docs/closure_compilation.md
@@ -89,7 +89,7 @@ With these contents: ``` -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2018 The Chromium Authors. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/docs/ui/android/mvc_simple_list_tutorial.md b/docs/ui/android/mvc_simple_list_tutorial.md index 360a13c..58fbecb 100644 --- a/docs/ui/android/mvc_simple_list_tutorial.md +++ b/docs/ui/android/mvc_simple_list_tutorial.md
@@ -138,7 +138,7 @@ ### simple_menu_item.xml ```xml <?xml version="1.0" encoding="utf-8"?> -<!-- Copyright 2019 The Chromium Authors. All rights reserved. +<!-- Copyright 2019 The Chromium Authors. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> <LinearLayout
diff --git a/docs/ui/create/examples/login_dialog.md b/docs/ui/create/examples/login_dialog.md index cd280920..8b181271 100644 --- a/docs/ui/create/examples/login_dialog.md +++ b/docs/ui/create/examples/login_dialog.md
@@ -19,7 +19,7 @@ `login_bubble_dialog_example.h` ``` cpp -// Copyright 2020 The Chromium Authors. All rights reserved. +// Copyright 2020 The Chromium Authors. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -48,7 +48,7 @@ `login_bubble_dialog_example.cc` ``` cpp -// Copyright 2020 The Chromium Authors. All rights reserved. +// Copyright 2020 The Chromium Authors. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -379,7 +379,7 @@ ``` -// Copyright 2020 The Chromium Authors. All rights reserved. +// Copyright 2020 The Chromium Authors. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -430,7 +430,7 @@ ``` -// Copyright 2020 The Chromium Authors. All rights reserved. +// Copyright 2020 The Chromium Authors. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/docs/webui_in_chrome.md b/docs/webui_in_chrome.md index ec1661c..ad3c81c 100644 --- a/docs/webui_in_chrome.md +++ b/docs/webui_in_chrome.md
@@ -78,7 +78,7 @@ needed by Polymer UIs include noUncheckedIndexAccess, noUnusedLocals, and strictPropertyInitialization, all set to false. -`chrome/browser/resources/hello_world/tsconfig_base.gn` +`chrome/browser/resources/hello_world/tsconfig_base.json` ``` { "extends": "../../../../tools/typescript/tsconfig_base.json",
diff --git a/extensions/browser/api/networking_private/networking_private_chromeos_unittest.cc b/extensions/browser/api/networking_private/networking_private_chromeos_unittest.cc index 0d04864..6a9996d 100644 --- a/extensions/browser/api/networking_private/networking_private_chromeos_unittest.cc +++ b/extensions/browser/api/networking_private/networking_private_chromeos_unittest.cc
@@ -105,7 +105,7 @@ base::Value(kWifiDevicePath)); service_test()->SetServiceProperty(kSharedWifiServicePath, shill::kSecurityClassProperty, - base::Value("psk")); + base::Value(shill::kSecurityClassPsk)); service_test()->SetServiceProperty( kSharedWifiServicePath, shill::kPriorityProperty, base::Value(2)); service_test()->SetServiceProperty( @@ -123,7 +123,7 @@ base::Value(kWifiDevicePath)); service_test()->SetServiceProperty(kPrivateWifiServicePath, shill::kSecurityClassProperty, - base::Value("psk")); + base::Value(shill::kSecurityClassPsk)); service_test()->SetServiceProperty( kPrivateWifiServicePath, shill::kPriorityProperty, base::Value(2));
diff --git a/gpu/command_buffer/service/bug_1307307_tracker.cc b/gpu/command_buffer/service/bug_1307307_tracker.cc index 6ef602bb..ce8b892a 100644 --- a/gpu/command_buffer/service/bug_1307307_tracker.cc +++ b/gpu/command_buffer/service/bug_1307307_tracker.cc
@@ -117,4 +117,11 @@ return *error; return VideoAccessError::kNoError; } + +bool Bug1307307Tracker::HadNoTextureOwnerError() { + auto error = GetLastAccessError(); + return error == VideoAccessError::kSurfaceTexture_NoTextureOwner || + error == VideoAccessError::kImageReader_NoTextureOwner; +} + } // namespace gpu
diff --git a/gpu/command_buffer/service/bug_1307307_tracker.h b/gpu/command_buffer/service/bug_1307307_tracker.h index bbc7111..fd9df1ba 100644 --- a/gpu/command_buffer/service/bug_1307307_tracker.h +++ b/gpu/command_buffer/service/bug_1307307_tracker.h
@@ -41,6 +41,8 @@ bool failed); void AccessFailed(const Mailbox& mailbox, bool cleared); + bool HadNoTextureOwnerError(); + // Called by SharedImageVideo, thread-safe. static void SetLastAccessError(VideoAccessError error);
diff --git a/gpu/command_buffer/service/raster_decoder.cc b/gpu/command_buffer/service/raster_decoder.cc index 94d72bf..66bb5d7 100644 --- a/gpu/command_buffer/service/raster_decoder.cc +++ b/gpu/command_buffer/service/raster_decoder.cc
@@ -2210,6 +2210,29 @@ // Fall back to GPU->GPU copy if src image is not CPU-backed. auto source_shared_image = shared_image_representation_factory_.ProduceSkia( source_mailbox, shared_context_state_); + + // TODO(vasilyt): Remove this workaround asap. When android video is promoted + // to SurfaceView overlay, we won't be able to create representation. We need + // to surface error here, but as very short term solution we're using debug + // code to make sure image is cleared correctly. + if (!source_shared_image && bug_1307307_tracker_.HadNoTextureOwnerError()) { + auto* canvas = dest_scoped_access->surface()->getCanvas(); + + SkAutoCanvasRestore autoRestore(canvas, true /* do_save */); + canvas->clipRect(gfx::RectToSkRect(dest_rect)); + canvas->clear(SkColors::kBlack); + + if (!dest_shared_image->IsCleared()) { + dest_shared_image->SetClearedRect(new_cleared_rect); + } + FlushAndSubmitIfNecessary(dest_scoped_access->surface(), + dest_scoped_access->TakeEndState(), + std::move(end_semaphores)); + + // Note, we're intentionally don't mark this CopySubTexture as succeeded. + return; + } + if (!source_shared_image) { LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTexture", "unknown source image mailbox.");
diff --git a/gpu/ipc/service/stream_texture_android.h b/gpu/ipc/service/stream_texture_android.h index a8e4e7f1c..1b7c30c1 100644 --- a/gpu/ipc/service/stream_texture_android.h +++ b/gpu/ipc/service/stream_texture_android.h
@@ -12,6 +12,7 @@ #include "base/memory/raw_ptr.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" +#include "base/threading/thread_checker.h" #include "base/unguessable_token.h" #include "gpu/command_buffer/service/shared_context_state.h" #include "gpu/command_buffer/service/stream_texture_shared_image_interface.h"
diff --git a/infra/config/generated/builders/ci/Mac Builder/properties.json b/infra/config/generated/builders/ci/Mac Builder/properties.json index 8cbc5d8..67ddb31 100644 --- a/infra/config/generated/builders/ci/Mac Builder/properties.json +++ b/infra/config/generated/builders/ci/Mac Builder/properties.json
@@ -185,6 +185,36 @@ { "builder_id": { "bucket": "ci", + "builder": "Mac12 Tests (py2 less)", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "goma_use_local" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64, + "target_platform": "mac" + }, + "legacy_gclient_config": { + "config": "chromium" + }, + "parent": { + "bucket": "ci", + "builder": "Mac Builder", + "project": "chromium" + } + } + }, + { + "builder_id": { + "bucket": "ci", "builder": "mac-osxbeta-rel", "project": "chromium" }, @@ -252,6 +282,11 @@ }, { "bucket": "ci", + "builder": "Mac12 Tests (py2 less)", + "project": "chromium" + }, + { + "bucket": "ci", "builder": "mac-osxbeta-rel", "project": "chromium" }
diff --git "a/infra/config/generated/builders/ci/Mac12 Tests \050py2 less\051/properties.json" "b/infra/config/generated/builders/ci/Mac12 Tests \050py2 less\051/properties.json" new file mode 100644 index 0000000..ab64da1 --- /dev/null +++ "b/infra/config/generated/builders/ci/Mac12 Tests \050py2 less\051/properties.json"
@@ -0,0 +1,95 @@ +{ + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "Mac Builder", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-mac-archive", + "builder_group": "chromium.mac", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "goma_use_local" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64, + "target_platform": "mac" + }, + "legacy_gclient_config": { + "apply_configs": [ + "use_clang_coverage" + ], + "config": "chromium" + } + } + }, + { + "builder_id": { + "bucket": "ci", + "builder": "Mac12 Tests (py2 less)", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "goma_use_local" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64, + "target_platform": "mac" + }, + "legacy_gclient_config": { + "config": "chromium" + }, + "parent": { + "bucket": "ci", + "builder": "Mac Builder", + "project": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "Mac12 Tests (py2 less)", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "mac_chromium_compile_rel_ng", + "group": "tryserver.chromium.mac" + } + ] + } + }, + "$build/goma": { + "rpc_extra_params": "?prod", + "server_host": "goma.chromium.org", + "use_luci_auth": true + }, + "$recipe_engine/resultdb/test_presentation": { + "column_keys": [], + "grouping_keys": [ + "status", + "v.test_suite" + ] + }, + "builder_group": "chromium.fyi", + "recipe": "chromium" +} \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/lacros-arm-generic-rel/properties.json b/infra/config/generated/builders/ci/lacros-arm-generic-rel/properties.json index 78378be7d..b63d1d72 100644 --- a/infra/config/generated/builders/ci/lacros-arm-generic-rel/properties.json +++ b/infra/config/generated/builders/ci/lacros-arm-generic-rel/properties.json
@@ -22,7 +22,8 @@ "target_arch": "intel", "target_bits": 64, "target_cros_boards": [ - "arm-generic" + "arm-generic", + "jacuzzi" ], "target_platform": "chromeos" },
diff --git a/infra/config/generated/builders/try/lacros-arm-generic-rel/properties.json b/infra/config/generated/builders/try/lacros-arm-generic-rel/properties.json index 34c9ff2..9931e00 100644 --- a/infra/config/generated/builders/try/lacros-arm-generic-rel/properties.json +++ b/infra/config/generated/builders/try/lacros-arm-generic-rel/properties.json
@@ -22,7 +22,8 @@ "target_arch": "intel", "target_bits": 64, "target_cros_boards": [ - "arm-generic" + "arm-generic", + "jacuzzi" ], "target_platform": "chromeos" },
diff --git a/infra/config/generated/builders/try/mac_chromium_compile_rel_ng/properties.json b/infra/config/generated/builders/try/mac_chromium_compile_rel_ng/properties.json index 2205f8a..8ffe31f5 100644 --- a/infra/config/generated/builders/try/mac_chromium_compile_rel_ng/properties.json +++ b/infra/config/generated/builders/try/mac_chromium_compile_rel_ng/properties.json
@@ -185,6 +185,36 @@ { "builder_id": { "bucket": "ci", + "builder": "Mac12 Tests (py2 less)", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "goma_use_local" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64, + "target_platform": "mac" + }, + "legacy_gclient_config": { + "config": "chromium" + }, + "parent": { + "bucket": "ci", + "builder": "Mac Builder", + "project": "chromium" + } + } + }, + { + "builder_id": { + "bucket": "ci", "builder": "mac-osxbeta-rel", "project": "chromium" }, @@ -252,6 +282,11 @@ }, { "bucket": "ci", + "builder": "Mac12 Tests (py2 less)", + "project": "chromium" + }, + { + "bucket": "ci", "builder": "mac-osxbeta-rel", "project": "chromium" }
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg index 39cdbcd..8cc18cf 100644 --- a/infra/config/generated/luci/cr-buildbucket.cfg +++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -16121,6 +16121,89 @@ } } builders { + name: "Mac12 Tests (py2 less)" + swarming_host: "chromium-swarm.appspot.com" + dimensions: "builder:Mac12 Tests (py2 less)" + dimensions: "cores:4" + dimensions: "cpu:x86-64" + dimensions: "os:Mac-12" + dimensions: "pool:luci.chromium.ci" + exe { + cipd_package: "infra/chromium/bootstrapper/${platform}" + cipd_version: "latest" + cmd: "bootstrapper" + } + properties: + '{' + ' "$bootstrap/exe": {' + ' "exe": {' + ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",' + ' "cipd_version": "refs/heads/main",' + ' "cmd": [' + ' "luciexe"' + ' ]' + ' }' + ' },' + ' "$bootstrap/properties": {' + ' "properties_file": "infra/config/generated/builders/ci/Mac12 Tests (py2 less)/properties.json",' + ' "top_level_project": {' + ' "ref": "refs/heads/main",' + ' "repo": {' + ' "host": "chromium.googlesource.com",' + ' "project": "chromium/src"' + ' }' + ' }' + ' },' + ' "builder_group": "chromium.fyi",' + ' "led_builder_is_bootstrapped": true,' + ' "recipe": "chromium"' + '}' + execution_timeout_secs: 36000 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.buildbucket.omit_python2" + value: 100 + } + experiments { + key: "luci.recipes.use_python3" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "ci_test_results" + test_results {} + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "gpu_ci_test_results" + test_results { + predicate { + test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+" + } + } + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "blink_web_tests_ci_test_results" + test_results { + predicate { + test_id_regexp: "ninja://[^/]*blink_web_tests/.+" + } + } + } + history_options { + use_invocation_timestamp: true + } + } + description_html: "This is mirror of <a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac12%20Tests\">Mac12 Tests</a>, but runs on bots not having python2." + } + builders { name: "Marshmallow 64 bit Tester" swarming_host: "chromium-swarm.appspot.com" dimensions: "builderless:1" @@ -31539,6 +31622,98 @@ } properties: '{' + ' "$build/chromium_tests_builder_config": {' + ' "builder_config": {' + ' "builder_db": {' + ' "entries": [' + ' {' + ' "builder_id": {' + ' "bucket": "ci",' + ' "builder": "ios-angle-builder",' + ' "project": "chromium"' + ' },' + ' "builder_spec": {' + ' "build_gs_bucket": "chromium-angle-archive",' + ' "builder_group": "chromium.angle",' + ' "execution_mode": "COMPILE_AND_TEST",' + ' "legacy_chromium_config": {' + ' "apply_configs": [' + ' "mb",' + ' "mac_toolchain"' + ' ],' + ' "build_config": "Release",' + ' "config": "chromium",' + ' "target_bits": 64,' + ' "target_platform": "ios"' + ' },' + ' "legacy_gclient_config": {' + ' "apply_configs": [' + ' "angle_internal",' + ' "angle_top_of_tree"' + ' ],' + ' "config": "ios"' + ' }' + ' }' + ' },' + ' {' + ' "builder_id": {' + ' "bucket": "ci",' + ' "builder": "ios-angle-intel",' + ' "project": "chromium"' + ' },' + ' "builder_spec": {' + ' "build_gs_bucket": "chromium-angle-archive",' + ' "builder_group": "chromium.angle",' + ' "execution_mode": "TEST",' + ' "legacy_chromium_config": {' + ' "apply_configs": [' + ' "mb",' + ' "mac_toolchain"' + ' ],' + ' "build_config": "Release",' + ' "config": "chromium",' + ' "target_bits": 64,' + ' "target_platform": "ios"' + ' },' + ' "legacy_gclient_config": {' + ' "apply_configs": [' + ' "angle_internal",' + ' "angle_top_of_tree"' + ' ],' + ' "config": "ios"' + ' },' + ' "parent": {' + ' "bucket": "ci",' + ' "builder": "ios-angle-builder",' + ' "project": "chromium"' + ' },' + ' "run_tests_serially": true' + ' }' + ' }' + ' ]' + ' },' + ' "builder_ids": [' + ' {' + ' "bucket": "ci",' + ' "builder": "ios-angle-builder",' + ' "project": "chromium"' + ' }' + ' ],' + ' "builder_ids_in_scope_for_testing": [' + ' {' + ' "bucket": "ci",' + ' "builder": "ios-angle-intel",' + ' "project": "chromium"' + ' }' + ' ],' + ' "mirroring_builder_group_and_names": [' + ' {' + ' "builder": "ios-angle-try-intel",' + ' "group": "tryserver.chromium.angle"' + ' }' + ' ]' + ' }' + ' },' ' "$build/goma": {' ' "rpc_extra_params": "?prod",' ' "server_host": "goma.chromium.org",' @@ -31620,6 +31795,91 @@ } properties: '{' + ' "$build/chromium_tests_builder_config": {' + ' "builder_config": {' + ' "builder_db": {' + ' "entries": [' + ' {' + ' "builder_id": {' + ' "bucket": "ci",' + ' "builder": "ios-angle-builder",' + ' "project": "chromium"' + ' },' + ' "builder_spec": {' + ' "build_gs_bucket": "chromium-angle-archive",' + ' "builder_group": "chromium.angle",' + ' "execution_mode": "COMPILE_AND_TEST",' + ' "legacy_chromium_config": {' + ' "apply_configs": [' + ' "mb",' + ' "mac_toolchain"' + ' ],' + ' "build_config": "Release",' + ' "config": "chromium",' + ' "target_bits": 64,' + ' "target_platform": "ios"' + ' },' + ' "legacy_gclient_config": {' + ' "apply_configs": [' + ' "angle_internal",' + ' "angle_top_of_tree"' + ' ],' + ' "config": "ios"' + ' }' + ' }' + ' },' + ' {' + ' "builder_id": {' + ' "bucket": "ci",' + ' "builder": "ios-angle-intel",' + ' "project": "chromium"' + ' },' + ' "builder_spec": {' + ' "build_gs_bucket": "chromium-angle-archive",' + ' "builder_group": "chromium.angle",' + ' "execution_mode": "TEST",' + ' "legacy_chromium_config": {' + ' "apply_configs": [' + ' "mb",' + ' "mac_toolchain"' + ' ],' + ' "build_config": "Release",' + ' "config": "chromium",' + ' "target_bits": 64,' + ' "target_platform": "ios"' + ' },' + ' "legacy_gclient_config": {' + ' "apply_configs": [' + ' "angle_internal",' + ' "angle_top_of_tree"' + ' ],' + ' "config": "ios"' + ' },' + ' "parent": {' + ' "bucket": "ci",' + ' "builder": "ios-angle-builder",' + ' "project": "chromium"' + ' },' + ' "run_tests_serially": true' + ' }' + ' }' + ' ]' + ' },' + ' "builder_ids": [' + ' {' + ' "bucket": "ci",' + ' "builder": "ios-angle-intel",' + ' "project": "chromium"' + ' }' + ' ],' + ' "mirroring_builder_group_and_names": [' + ' {' + ' "builder": "ios-angle-try-intel",' + ' "group": "tryserver.chromium.angle"' + ' }' + ' ]' + ' }' + ' },' ' "$recipe_engine/resultdb/test_presentation": {' ' "column_keys": [],' ' "grouping_keys": [' @@ -50635,6 +50895,10 @@ value: 5 } experiments { + key: "enable_weetbix_queries" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -52234,6 +52498,10 @@ value: 5 } experiments { + key: "enable_weetbix_queries" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -53503,6 +53771,10 @@ value: 5 } experiments { + key: "enable_weetbix_queries" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -55751,6 +56023,10 @@ value: 5 } experiments { + key: "enable_weetbix_queries" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -56325,6 +56601,10 @@ value: 5 } experiments { + key: "enable_weetbix_queries" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -57046,6 +57326,10 @@ value: 5 } experiments { + key: "enable_weetbix_queries" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -57321,6 +57605,10 @@ value: 5 } experiments { + key: "enable_weetbix_queries" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -59617,6 +59905,10 @@ value: 5 } experiments { + key: "enable_weetbix_queries" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -59706,6 +59998,10 @@ value: 5 } experiments { + key: "enable_weetbix_queries" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -59795,6 +60091,10 @@ value: 5 } experiments { + key: "enable_weetbix_queries" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -64043,6 +64343,93 @@ } properties: '{' + ' "$build/chromium_tests_builder_config": {' + ' "builder_config": {' + ' "builder_db": {' + ' "entries": [' + ' {' + ' "builder_id": {' + ' "bucket": "ci",' + ' "builder": "ios-angle-builder",' + ' "project": "chromium"' + ' },' + ' "builder_spec": {' + ' "build_gs_bucket": "chromium-angle-archive",' + ' "builder_group": "chromium.angle",' + ' "execution_mode": "COMPILE_AND_TEST",' + ' "legacy_chromium_config": {' + ' "apply_configs": [' + ' "mb",' + ' "mac_toolchain"' + ' ],' + ' "build_config": "Release",' + ' "config": "chromium",' + ' "target_bits": 64,' + ' "target_platform": "ios"' + ' },' + ' "legacy_gclient_config": {' + ' "apply_configs": [' + ' "angle_internal",' + ' "angle_top_of_tree"' + ' ],' + ' "config": "ios"' + ' }' + ' }' + ' },' + ' {' + ' "builder_id": {' + ' "bucket": "ci",' + ' "builder": "ios-angle-intel",' + ' "project": "chromium"' + ' },' + ' "builder_spec": {' + ' "build_gs_bucket": "chromium-angle-archive",' + ' "builder_group": "chromium.angle",' + ' "execution_mode": "TEST",' + ' "legacy_chromium_config": {' + ' "apply_configs": [' + ' "mb",' + ' "mac_toolchain"' + ' ],' + ' "build_config": "Release",' + ' "config": "chromium",' + ' "target_bits": 64,' + ' "target_platform": "ios"' + ' },' + ' "legacy_gclient_config": {' + ' "apply_configs": [' + ' "angle_internal",' + ' "angle_top_of_tree"' + ' ],' + ' "config": "ios"' + ' },' + ' "parent": {' + ' "bucket": "ci",' + ' "builder": "ios-angle-builder",' + ' "project": "chromium"' + ' },' + ' "run_tests_serially": true' + ' }' + ' }' + ' ]' + ' },' + ' "builder_ids": [' + ' {' + ' "bucket": "ci",' + ' "builder": "ios-angle-builder",' + ' "project": "chromium"' + ' }' + ' ],' + ' "builder_ids_in_scope_for_testing": [' + ' {' + ' "bucket": "ci",' + ' "builder": "ios-angle-intel",' + ' "project": "chromium"' + ' }' + ' ],' + ' "retry_failed_shards": false' + ' }' + ' },' ' "$build/goma": {' ' "rpc_extra_params": "?prod",' ' "server_host": "goma.chromium.org",' @@ -64805,6 +65192,10 @@ value: 5 } experiments { + key: "enable_weetbix_queries" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -65814,6 +66205,10 @@ value: 5 } experiments { + key: "enable_weetbix_queries" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -65903,6 +66298,10 @@ value: 5 } experiments { + key: "enable_weetbix_queries" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -67780,6 +68179,10 @@ value: 5 } experiments { + key: "enable_weetbix_queries" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -69295,6 +69698,10 @@ value: 5 } experiments { + key: "enable_weetbix_queries" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -69557,6 +69964,10 @@ value: 5 } experiments { + key: "enable_weetbix_queries" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -70020,6 +70431,10 @@ key: "remove_src_checkout_experiment" value: 100 } + experiments { + key: "retry_findit_exonerations" + value: 100 + } resultdb { enable: true bq_exports { @@ -71088,6 +71503,10 @@ value: 5 } experiments { + key: "enable_weetbix_queries" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -71900,6 +72319,10 @@ value: 5 } experiments { + key: "enable_weetbix_queries" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -73078,6 +73501,10 @@ value: 5 } experiments { + key: "enable_weetbix_queries" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -74491,6 +74918,10 @@ value: 5 } experiments { + key: "enable_weetbix_queries" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -78246,6 +78677,10 @@ value: 5 } experiments { + key: "enable_weetbix_queries" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 } @@ -79383,6 +79818,10 @@ value: 5 } experiments { + key: "enable_weetbix_queries" + value: 100 + } + experiments { key: "luci.recipes.use_python3" value: 100 }
diff --git a/infra/config/generated/luci/luci-milo.cfg b/infra/config/generated/luci/luci-milo.cfg index 182fafe..7724d5f 100644 --- a/infra/config/generated/luci/luci-milo.cfg +++ b/infra/config/generated/luci/luci-milo.cfg
@@ -7798,6 +7798,11 @@ short_name: "cmp" } builders { + name: "buildbucket/luci.chromium.ci/Mac12 Tests (py2 less)" + category: "mac" + short_name: "py3" + } + builders { name: "buildbucket/luci.chromium.ci/Mac Builder (reclient)" category: "mac" short_name: "re"
diff --git a/infra/config/generated/luci/luci-scheduler.cfg b/infra/config/generated/luci/luci-scheduler.cfg index 46096bf..a4b17d0 100644 --- a/infra/config/generated/luci/luci-scheduler.cfg +++ b/infra/config/generated/luci/luci-scheduler.cfg
@@ -2731,6 +2731,20 @@ } } job { + id: "Mac12 Tests (py2 less)" + realm: "ci" + acls { + role: TRIGGERER + granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + } + acl_sets: "ci" + buildbucket { + server: "cr-buildbucket.appspot.com" + bucket: "ci" + builder: "Mac12 Tests (py2 less)" + } +} +job { id: "Marshmallow 64 bit Tester" realm: "ci" acls {
diff --git a/infra/config/generated/luci/realms.cfg b/infra/config/generated/luci/realms.cfg index 0842e68a..21ab8acc 100644 --- a/infra/config/generated/luci/realms.cfg +++ b/infra/config/generated/luci/realms.cfg
@@ -133,6 +133,7 @@ values: "Mac11 Tests" values: "Mac12 Tests" values: "Mac12 Tests (dbg)" + values: "Mac12 Tests (py2 less)" values: "Marshmallow 64 bit Tester" values: "Marshmallow Tablet Tester" values: "Nougat Phone Tester"
diff --git a/infra/config/subprojects/chromium/angle.try.star b/infra/config/subprojects/chromium/angle.try.star index 72aa650..77dfd86 100644 --- a/infra/config/subprojects/chromium/angle.try.star +++ b/infra/config/subprojects/chromium/angle.try.star
@@ -3,6 +3,7 @@ # found in the LICENSE file. load("//lib/builders.star", "cpu", "goma", "os", "xcode") +load("//lib/builder_config.star", "builder_config") load("//lib/try.star", "try_") try_.defaults.set( @@ -44,5 +45,12 @@ angle_ios_builder( name = "ios-angle-try-intel", + mirrors = [ + "ci/ios-angle-builder", + "ci/ios-angle-intel", + ], pool = "luci.chromium.gpu.mac.mini.intel.try", + try_settings = builder_config.try_settings( + retry_failed_shards = False, + ), )
diff --git a/infra/config/subprojects/chromium/ci/chromium.angle.star b/infra/config/subprojects/chromium/ci/chromium.angle.star index 854bece..0c37863 100644 --- a/infra/config/subprojects/chromium/ci/chromium.angle.star +++ b/infra/config/subprojects/chromium/ci/chromium.angle.star
@@ -4,6 +4,7 @@ """Definitions of builders in the chromium.angle builder group.""" load("//lib/builders.star", "goma", "reclient", "sheriff_rotations", "xcode") +load("//lib/builder_config.star", "builder_config") load("//lib/ci.star", "ci") load("//lib/consoles.star", "consoles") @@ -120,17 +121,59 @@ ci.gpu.mac_builder( name = "ios-angle-builder", - xcode = xcode.x13main, + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "ios", + apply_configs = [ + "angle_internal", + "angle_top_of_tree", + ], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + "mac_toolchain", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + target_platform = builder_config.target_platform.IOS, + ), + build_gs_bucket = "chromium-angle-archive", + ), console_view_entry = consoles.console_view_entry( category = "iOS|Builder|ANGLE", short_name = "x64", ), goma_backend = goma.backend.RBE_PROD, reclient_instance = None, + xcode = xcode.x13main, ) ci.thin_tester( name = "ios-angle-intel", + builder_spec = builder_config.builder_spec( + execution_mode = builder_config.execution_mode.TEST, + gclient_config = builder_config.gclient_config( + config = "ios", + apply_configs = [ + "angle_internal", + "angle_top_of_tree", + ], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + "mac_toolchain", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + target_platform = builder_config.target_platform.IOS, + ), + build_gs_bucket = "chromium-angle-archive", + run_tests_serially = True, + ), console_view_entry = consoles.console_view_entry( category = "iOS|Intel|ANGLE", short_name = "x64",
diff --git a/infra/config/subprojects/chromium/ci/chromium.chromiumos.star b/infra/config/subprojects/chromium/ci/chromium.chromiumos.star index dbeff3f0..1a15302 100644 --- a/infra/config/subprojects/chromium/ci/chromium.chromiumos.star +++ b/infra/config/subprojects/chromium/ci/chromium.chromiumos.star
@@ -584,6 +584,7 @@ target_bits = 64, target_cros_boards = [ "arm-generic", + "jacuzzi", ], target_platform = builder_config.target_platform.CHROMEOS, ),
diff --git a/infra/config/subprojects/chromium/ci/chromium.fyi.star b/infra/config/subprojects/chromium/ci/chromium.fyi.star index 90facfb5..279a23a3 100644 --- a/infra/config/subprojects/chromium/ci/chromium.fyi.star +++ b/infra/config/subprojects/chromium/ci/chromium.fyi.star
@@ -1445,6 +1445,23 @@ ) fyi_mac_builder( + name = "Mac12 Tests (py2 less)", + builder_spec = builder_config.copy_from("ci/Mac12 Tests", lambda spec: structs.evolve( + spec, + build_gs_bucket = "chromium-fyi-archive", + )), + console_view_entry = consoles.console_view_entry( + category = "mac", + short_name = "py3", + ), + description_html = "This is mirror of <a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac12%20Tests\">Mac12 Tests</a>, but runs on bots not having python2.", + experiments = { + "luci.buildbucket.omit_python2": 100, + }, + triggered_by = ["ci/Mac Builder"], +) + +fyi_mac_builder( name = "mac-arm64-on-arm64-rel-reclient", # same with mac-arm64-on-arm64-rel
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star index aeaa0e6..0d77cfa 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
@@ -119,6 +119,9 @@ ], }, }, + experiments = { + "enable_weetbix_queries": 100, + }, tryjob = try_.job(), ssd = True, ) @@ -257,6 +260,7 @@ tryjob = try_.job(), experiments = { "remove_src_checkout_experiment": 100, + "enable_weetbix_queries": 100, }, ) @@ -386,6 +390,9 @@ branch_selector = branches.STANDARD_MILESTONE, main_list_view = "try", tryjob = try_.job(), + experiments = { + "enable_weetbix_queries": 100, + }, ) try_.compilator_builder( @@ -621,6 +628,9 @@ builderless = not settings.is_main, main_list_view = "try", tryjob = try_.job(), + experiments = { + "enable_weetbix_queries": 100, + }, ) try_.builder( @@ -648,6 +658,9 @@ builderless = not settings.is_main, main_list_view = "try", tryjob = try_.job(), + experiments = { + "enable_weetbix_queries": 100, + }, ) try_.builder(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star b/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star index 9cc961e..d99f69a 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star
@@ -59,6 +59,7 @@ tryjob = try_.job(), experiments = { "remove_src_checkout_experiment": 100, + "enable_weetbix_queries": 100, }, use_orchestrator_pool = True, ) @@ -84,6 +85,9 @@ builderless = not settings.is_main, main_list_view = "try", tryjob = try_.job(), + experiments = { + "enable_weetbix_queries": 100, + }, ) try_.builder( @@ -101,6 +105,9 @@ builderless = not settings.is_main, main_list_view = "try", tryjob = try_.job(), + experiments = { + "enable_weetbix_queries": 100, + }, ) try_.builder( @@ -120,6 +127,9 @@ builderless = not settings.is_main, main_list_view = "try", tryjob = try_.job(), + experiments = { + "enable_weetbix_queries": 100, + }, ) try_.builder( @@ -209,6 +219,7 @@ tryjob = try_.job(), experiments = { "remove_src_checkout_experiment": 100, + "enable_weetbix_queries": 100, }, use_orchestrator_pool = True, ) @@ -248,6 +259,9 @@ goma_jobs = goma.jobs.J300, main_list_view = "try", tryjob = try_.job(), + experiments = { + "enable_weetbix_queries": 100, + }, ) try_.builder(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.fuchsia.star b/infra/config/subprojects/chromium/try/tryserver.chromium.fuchsia.star index 83bd582..6e05a41 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.fuchsia.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.fuchsia.star
@@ -107,6 +107,9 @@ mirrors = [ "ci/fuchsia-x64-cast", ], + experiments = { + "enable_weetbix_queries": 100, + }, ) try_.builder( @@ -118,6 +121,9 @@ mirrors = [ "ci/Fuchsia ARM64", ], + experiments = { + "enable_weetbix_queries": 100, + }, ) try_.builder( @@ -129,4 +135,7 @@ mirrors = [ "ci/Fuchsia x64", ], + experiments = { + "enable_weetbix_queries": 100, + }, )
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star b/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star index abbec0a5..77c1318 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
@@ -206,6 +206,9 @@ executable = "recipe:chromium_libfuzzer_trybot", main_list_view = "try", tryjob = try_.job(), + experiments = { + "enable_weetbix_queries": 100, + }, ) try_.builder( @@ -244,6 +247,7 @@ experiments = { "remove_src_checkout_experiment": 100, "enable_weetbix_queries": 100, + "retry_findit_exonerations": 100, }, use_orchestrator_pool = True, ) @@ -297,6 +301,9 @@ builderless = not settings.is_main, main_list_view = "try", tryjob = try_.job(), + experiments = { + "enable_weetbix_queries": 100, + }, ) # b/236069482: Experimental builder to test reclient migration @@ -360,6 +367,7 @@ ), experiments = { "remove_src_checkout_experiment": 100, + "enable_weetbix_queries": 100, }, use_orchestrator_pool = True, ) @@ -520,6 +528,7 @@ tryjob = try_.job(), experiments = { "remove_src_checkout_experiment": 100, + "enable_weetbix_queries": 100, }, use_orchestrator_pool = True, )
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star b/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star index 5e48c7e..26e2ab2 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star
@@ -102,6 +102,7 @@ tryjob = try_.job(), experiments = { "remove_src_checkout_experiment": 100, + "enable_weetbix_queries": 100, }, use_orchestrator_pool = True, ) @@ -317,6 +318,9 @@ coverage_exclude_sources = "ios_test_files_and_test_utils", coverage_test_types = ["overall", "unit"], tryjob = try_.job(), + experiments = { + "enable_weetbix_queries": 100, + }, ) ios_builder(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.win.star b/infra/config/subprojects/chromium/try/tryserver.chromium.win.star index d5b67c2..05e4702 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.win.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.win.star
@@ -61,6 +61,9 @@ main_list_view = "try", os = os.WINDOWS_ANY, tryjob = try_.job(), + experiments = { + "enable_weetbix_queries": 100, + }, ) try_.builder( @@ -182,6 +185,7 @@ tryjob = try_.job(), experiments = { "remove_src_checkout_experiment": 100, + "enable_weetbix_queries": 100, }, use_orchestrator_pool = True, )
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd index 6b8ad06c..3ec1767 100644 --- a/ios/chrome/app/strings/ios_strings.grd +++ b/ios/chrome/app/strings/ios_strings.grd
@@ -2289,6 +2289,9 @@ <message name="IDS_IOS_SAVE_PASSWORDS_MANAGE_ACCOUNT_HEADER" desc="Header text with link for the view in Settings for managing saved passwords. [Length: unlimited] [iOS only]"> Create, save, and manage your passwords so you can easily sign in to sites and apps. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph> </message> + <message name="IDS_IOS_PASSWORD_MANAGER_HEADER_NOT_SYNCING" desc="Header text for the view in Settings for managing saved passwords. This string only appears when the user is not syncing their passwords. [Length: unlimited] [iOS only]"> + Passwords are saved to Google Password Manager on this device only. + </message> <message name="IDS_IOS_CHECK_PASSWORDS" desc="Title for the item in Settings for Password Check feature" meaning="Label tells the user about status of Password Check [CHAR_LIMIT=25] [iOS only]"> Check Passwords </message>
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_MANAGER_HEADER_NOT_SYNCING.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_MANAGER_HEADER_NOT_SYNCING.png.sha1 new file mode 100644 index 0000000..fb8eb14f --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_MANAGER_HEADER_NOT_SYNCING.png.sha1
@@ -0,0 +1 @@ +14af71a2019f56755623d9f74b7abb438de6319e \ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_strings_bs.xtb b/ios/chrome/app/strings/resources/ios_strings_bs.xtb index b1c24e3..a923b65 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bs.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">Nije sigurno</translation> <translation id="3533202363250687977">Zatvori sve anonimne kartice</translation> <translation id="3533436815740441613">Nova kartica</translation> +<translation id="3547799431091898961">Da biste se odjavili sa svojeg Google računa na svim web-lokacijama, <ph name="BEGIN_LINK" />odjavite se iz Chromea<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Zatvori karticu</translation> <translation id="3581564640715911333">Ponudi prevođenje stranica na drugim jezicima</translation> <translation id="3588820906588687999">Otvori sliku na novoj kartici</translation> @@ -680,6 +681,7 @@ <translation id="6561262006871132942">Uvećaj</translation> <translation id="6583087784430677195">Da isključite, otvorite <ph name="BEGIN_LINK" />Postavke<ph name="END_LINK" /> i idite u Automatsko popunjavanje lozinki.</translation> <translation id="6585618849026997638">Dodavanjem oznake možete se vratiti na stranicu koja vam je važna</translation> +<translation id="6596481460663245319">Pretraži sliku na Googleu</translation> <translation id="6598875554591387303">Poredaj po izdavaču</translation> <translation id="6603393121510733479">Vaša organizacija je isključila privatno pregledavanje. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation> @@ -848,6 +850,7 @@ <translation id="7987685713885608670">Da imate dodatnu sigurnost, šifrirajte lozinke na uređaju prije nego što se pohrane u Googleov Upravitelj lozinki.</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="8016714545083187120">Uvijek upotrebljavaj sigurne veze</translation> <translation id="802154636333426148">Preuzimanje nije uspjelo</translation> <translation id="8023878949384262191">Proširuje odjeljak.</translation> <translation id="8027581147000338959">Otvori u novom prozoru</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb index a77c454..df60eaae 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -848,6 +848,7 @@ <translation id="7987685713885608670">Per a una seguretat addicional, encripta les contrasenyes al dispositiu abans de desar-les al gestor de contrasenyes de Google.</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="8016714545083187120">Utilitza sempre connexions segures</translation> <translation id="802154636333426148">Error de baixada</translation> <translation id="8023878949384262191">Desplega la secció.</translation> <translation id="8027581147000338959">Obre en una finestra nova</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb index 89045fe..41dfe1f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_da.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">Ikke sikker</translation> <translation id="3533202363250687977">Luk alle inkognitofaner</translation> <translation id="3533436815740441613">Ny fane</translation> +<translation id="3547799431091898961">Hvis du vil logge ud af din Google-konto på alle websites, skal du <ph name="BEGIN_LINK" />logge ud af Chrome<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Luk fanen</translation> <translation id="3581564640715911333">Tilbyd at oversætte sider på andre sprog</translation> <translation id="3588820906588687999">Åbn billede på ny fane</translation> @@ -680,6 +681,7 @@ <translation id="6561262006871132942">Zoom ind</translation> <translation id="6583087784430677195">Du kan deaktivere funktionen ved at åbne <ph name="BEGIN_LINK" />Indstillinger<ph name="END_LINK" /> og gå til Autoudfyld adgangskoder.</translation> <translation id="6585618849026997638">Du kan vende tilbage til en side, der er vigtig for dig, ved at tilføje et bogmærke</translation> +<translation id="6596481460663245319">Søg efter billedet med Google</translation> <translation id="6598875554591387303">Sortér efter udgiver</translation> <translation id="6603393121510733479">Din organisation har deaktiveret privat browsing. <ph name="BEGIN_LINK" />Få flere oplysninger<ph name="END_LINK" /></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 edc64a4..cf64e31b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -850,6 +850,7 @@ <translation id="7987685713885608670">For added safety, encrypt passwords on your device before they’re saved to Google Password Manager.</translation> <translation id="7993619969781047893">Features on some sites may break</translation> <translation id="800361585186029508">Opens the inputted URLs in Google Chrome.</translation> +<translation id="8016714545083187120">Always use secure connections</translation> <translation id="802154636333426148">Download failed</translation> <translation id="8023878949384262191">Expands the section.</translation> <translation id="8027581147000338959">Open in new window</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 7c5926d..b974d953 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">Pas sécuritaire</translation> <translation id="3533202363250687977">Fermer les onglets de navigation privée</translation> <translation id="3533436815740441613">Nouvel onglet</translation> +<translation id="3547799431091898961">Pour vous déconnecter de votre compte Google sur tous les sites Web, <ph name="BEGIN_LINK" />déconnectez-vous de Chrome<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Fermer l'onglet</translation> <translation id="3581564640715911333">Proposer des traductions de pages dans d'autres langues</translation> <translation id="3588820906588687999">Ouvrir l'image dans un nouvel onglet</translation> @@ -680,6 +681,7 @@ <translation id="6561262006871132942">Zoom avant</translation> <translation id="6583087784430677195">Pour désactiver, ouvrez <ph name="BEGIN_LINK" />Réglages<ph name="END_LINK" /> et accédez à remplissage automatique des mots de passe.</translation> <translation id="6585618849026997638">Vous pouvez revenir à une page importante pour vous en ajoutant un favori</translation> +<translation id="6596481460663245319">Rechercher l'image avec Google</translation> <translation id="6598875554591387303">Trier par Éditeur</translation> <translation id="6603393121510733479">Votre organisation a désactivé la navigation privée. <ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb index 96873ed..af968e7 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">Nije sigurno</translation> <translation id="3533202363250687977">Zatvori sve anonimne kartice</translation> <translation id="3533436815740441613">Nova kartica</translation> +<translation id="3547799431091898961">Da biste se odjavili sa svojeg Google računa na svim web-lokacijama, <ph name="BEGIN_LINK" />odjavite se iz Chromea<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Zatvori karticu</translation> <translation id="3581564640715911333">Ponudi prevođenje stranica na druge jezike</translation> <translation id="3588820906588687999">Otvori sliku u novoj kartici</translation> @@ -680,6 +681,7 @@ <translation id="6561262006871132942">Povećaj</translation> <translation id="6583087784430677195">Da biste isključili značajku, otvorite <ph name="BEGIN_LINK" />Postavke<ph name="END_LINK" />, a zatim Automatsko popunjavanje zaporki.</translation> <translation id="6585618849026997638">Dodavanjem oznake možete se vratiti na stranicu koja vam je važna</translation> +<translation id="6596481460663245319">Pretraži sliku na Googleu</translation> <translation id="6598875554591387303">Poredaj po izdavaču</translation> <translation id="6603393121510733479">Vaša organizacija isključila je anonimno pregledavanje. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation> @@ -848,6 +850,7 @@ <translation id="7987685713885608670">Radi dodatne sigurnosti šifrirajte zaporke na uređaju prije spremanja na Google upravitelj zaporki.</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="8016714545083187120">Uvijek upotrebljavaj sigurne veze</translation> <translation id="802154636333426148">Preuzimanje nije uspjelo</translation> <translation id="8023878949384262191">Proširuje odjeljak.</translation> <translation id="8027581147000338959">Otvori u novom prozoru</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb index da85cdc5..d99fac0 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">Nem biztonságos</translation> <translation id="3533202363250687977">Összes inkognitó lap bezárása</translation> <translation id="3533436815740441613">Új lap</translation> +<translation id="3547799431091898961">Ha az összes webhelyen ki szeretne jelentkezni Google-fiókjából, <ph name="BEGIN_LINK" />jelentkezzen ki a Chrome-ból<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Lap bezárása</translation> <translation id="3581564640715911333">Más nyelvű oldalak fordításának felajánlása</translation> <translation id="3588820906588687999">Kép megnyitása új lapon</translation> @@ -680,6 +681,7 @@ <translation id="6561262006871132942">Nagyítás</translation> <translation id="6583087784430677195">A kikapcsoláshoz nyissa meg a <ph name="BEGIN_LINK" />Beállítások<ph name="END_LINK" /> menüt, és lépjen a Jelszavak automatikus kitöltése ponthoz.</translation> <translation id="6585618849026997638">A fontos oldalakra könyvjelző felvételével térhet vissza a későbbiekben.</translation> +<translation id="6596481460663245319">Kép keresése a Google-lal</translation> <translation id="6598875554591387303">Rendezés közzétevő szerint</translation> <translation id="6603393121510733479">Szervezete kikapcsolta az inkognitó módban való böngészést. <ph name="BEGIN_LINK" />További információ<ph name="END_LINK" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_it.xtb b/ios/chrome/app/strings/resources/ios_strings_it.xtb index 84c8ca2..8bd31556 100644 --- a/ios/chrome/app/strings/resources/ios_strings_it.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_it.xtb
@@ -893,7 +893,7 @@ <translation id="8428045167754449968">Città/località</translation> <translation id="8428213095426709021">Impostazioni</translation> <translation id="8428634594422941299">OK</translation> -<translation id="8446884382197647889">Ulteriori informazioni</translation> +<translation id="8446884382197647889">Scopri di più</translation> <translation id="8458397775385147834">1 elemento eliminato</translation> <translation id="8459333855531264009">Non sicuro</translation> <translation id="8487667956631253959">Attiva</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_strings_ka.xtb index 2fd728e..ed5817b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ka.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">დაუცველი</translation> <translation id="3533202363250687977">ყველა ინკოგნიტო ჩანართის დახურვა</translation> <translation id="3533436815740441613">ახალი ჩანართი</translation> +<translation id="3547799431091898961">თქვენი Google ანგარიშიდან ყველა ვებსაიტზე რომ გამოხვიდეთ, <ph name="BEGIN_LINK" />გადით Chrome-იდან<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">ჩანართის დახურვა</translation> <translation id="3581564640715911333">სხვა ენებზე არსებული გვერდების თარგმნის შემოთავაზება</translation> <translation id="3588820906588687999">გამოსახულების გახსნა ახალ ჩანართზე</translation> @@ -680,6 +681,7 @@ <translation id="6561262006871132942">მასშტაბის გადიდება</translation> <translation id="6583087784430677195">გამოსართავად გახსენით <ph name="BEGIN_LINK" />პარამეტრები<ph name="END_LINK" /> და გადადით „პაროლების ავტომატურ შევსებაზე“.</translation> <translation id="6585618849026997638">თქვენთვის მნიშვნელოვან გვერდზე დაბრუნება შესაძლებელია სანიშნეს დამატებით</translation> +<translation id="6596481460663245319">სურათის ძიება Google-ით</translation> <translation id="6598875554591387303">დალაგება გამომცემლის მიხედვით</translation> <translation id="6603393121510733479">თქვენმა ორგანიზაციამ გამორთო კონფიდენციალური დათვალიერება. <ph name="BEGIN_LINK" />შეიტყვეთ მეტი<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lo.xtb b/ios/chrome/app/strings/resources/ios_strings_lo.xtb index 7893da6..0de5630 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lo.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">ບໍ່ປອດໄພ</translation> <translation id="3533202363250687977">ປິດແຖບທີ່ບໍ່ເຜີຍຕົວຕົນທັງໝົດ</translation> <translation id="3533436815740441613">ແຖບໃໝ່</translation> +<translation id="3547799431091898961">ເພື່ອອອກຈາກລະບົບບັນຊີ Google ຂອງທ່ານຢູ່ເວັບໄຊທ໌ທັງໝົດ, ກະລຸນາ <ph name="BEGIN_LINK" />ອອກຈາກລະບົບ chrome<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">ປິດແຖບ</translation> <translation id="3581564640715911333">ໃຫ້ການແປໜ້າຕ່າງໆເປັນພາສາອື່ນ</translation> <translation id="3588820906588687999">ຮູບເປີດຢູ່ໃນແຖບໃໝ່</translation> @@ -680,6 +681,7 @@ <translation id="6561262006871132942">ຊຸມເຂົ້າ</translation> <translation id="6583087784430677195">ເພື່ອປິດໄວ້, ໃຫ້ເປີດ <ph name="BEGIN_LINK" />ການຕັ້ງຄ່າ<ph name="END_LINK" /> ແລ້ວໄປຫາການຕື່ມຂໍ້ມູນລະຫັດຜ່ານອັດຕະໂນມັດ.</translation> <translation id="6585618849026997638">ທ່ານສາມາດກັບໄປຫາໜ້າທີ່ສຳຄັນຕໍ່ກັບທ່ານໂດຍການເພີ່ມບຸກມາກໄດ້</translation> +<translation id="6596481460663245319">ຊອກຫາຮູບດ້ວຍ Google</translation> <translation id="6598875554591387303">ຈັດຮຽງຕາມຜູ້ເຜີຍແຜ່</translation> <translation id="6603393121510733479">ອົງການຂອງທ່ານໄດ້ປິດການທ່ອງເວັບແບບສ່ວນຕົວແລ້ວ. <ph name="BEGIN_LINK" />ສຶກສາເພີ່ມເຕີມ<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mk.xtb b/ios/chrome/app/strings/resources/ios_strings_mk.xtb index ae22c03..3ec03d2 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mk.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">Небезбедно</translation> <translation id="3533202363250687977">Затвори ги сите инкогнито картички</translation> <translation id="3533436815740441613">Нова картичка</translation> +<translation id="3547799431091898961">За да се одјавите од вашата сметка на Google на сите веб-сајтови, <ph name="BEGIN_LINK" />одјавете се од Chrome<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Затвори ја картичката</translation> <translation id="3581564640715911333">Понудувај превод на страниците на други јазици</translation> <translation id="3588820906588687999">Отворете ја сликата во нова картичка</translation> @@ -680,6 +681,7 @@ <translation id="6561262006871132942">Зумирај</translation> <translation id="6583087784430677195">За да го исклучите, отворете ги <ph name="BEGIN_LINK" />Поставките<ph name="END_LINK" /> и одете на „Автоматско пополнување лозинки“.</translation> <translation id="6585618849026997638">Може да се навратите на страница што ви е важна со додавање обележувач</translation> +<translation id="6596481460663245319">Пребарајте слика со Google</translation> <translation id="6598875554591387303">Подредете според издавач</translation> <translation id="6603393121510733479">Вашата организација го исклучи прелистувањето „Инкогнито“. <ph name="BEGIN_LINK" />Дознајте повеќе<ph name="END_LINK" /></translation> @@ -848,6 +850,7 @@ <translation id="7987685713885608670">За дополнителна безбедност, шифрирајте ги лозинките на уредот пред да се зачуваат во „Управникот со лозинки на Google“.</translation> <translation id="7993619969781047893">Функциите на некои сајтови може да не функционираат</translation> <translation id="800361585186029508">Ги отвора внесените URL-адреси во Google Chrome.</translation> +<translation id="8016714545083187120">Секогаш користете безбедни врски</translation> <translation id="802154636333426148">Неуспешно преземање</translation> <translation id="8023878949384262191">Го проширува делот.</translation> <translation id="8027581147000338959">Отвори во нов прозорец</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb index a6b9b25e..c7e286b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">Tidak selamat</translation> <translation id="3533202363250687977">Tutup Semua Tab Inkognito</translation> <translation id="3533436815740441613">Tab Baharu</translation> +<translation id="3547799431091898961">Untuk log keluar daripada Google Account dalam semua laman web, <ph name="BEGIN_LINK" />log keluar daripada Chrome<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Tutup Tab</translation> <translation id="3581564640715911333">Tawaran untuk menterjemah halaman dalam bahasa lain</translation> <translation id="3588820906588687999">Buka Imej dalam Tab Baharu</translation> @@ -680,6 +681,7 @@ <translation id="6561262006871132942">Zum Masuk</translation> <translation id="6583087784430677195">Untuk mematikan, buka <ph name="BEGIN_LINK" />Tetapan<ph name="END_LINK" /> dan pergi ke Kata Laluan AutoLengkap.</translation> <translation id="6585618849026997638">Anda boleh kembali ke halaman yang penting bagi anda dengan menambah penanda halaman</translation> +<translation id="6596481460663245319">Cari Imej dengan Google</translation> <translation id="6598875554591387303">Isih mengikut Penerbit</translation> <translation id="6603393121510733479">Organisasi anda telah mematikan penyemakan imbas peribadi. <ph name="BEGIN_LINK" />Ketahui lebih lanjut<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_my.xtb b/ios/chrome/app/strings/resources/ios_strings_my.xtb index a7681c4..c95da63 100644 --- a/ios/chrome/app/strings/resources/ios_strings_my.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_my.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">လုံခြုံမှုမရှိပါ</translation> <translation id="3533202363250687977">ရုပ်ဖျက်တဘ်များအားလုံး ပိတ်ရန်</translation> <translation id="3533436815740441613">တဘ်အသစ်</translation> +<translation id="3547799431091898961">ဝဘ်ဆိုက်အားလုံးမှ Google Account ထွက်ရန် <ph name="BEGIN_LINK" />Chrome မှ ထွက်ပါ<ph name="END_LINK" />။</translation> <translation id="3551320343578183772">တဘ် ပိတ်ရန်</translation> <translation id="3581564640715911333">စာမျက်နှာများကို အခြားဘာသာစကားများဖြင့် ပြန်ဆိုရန် ကမ်းလှမ်းသည်</translation> <translation id="3588820906588687999">ရုပ်ပုံကို တက်ဘ်အသစ်တွင်ဖွင့်ရန်</translation> @@ -679,6 +680,7 @@ <translation id="6561262006871132942">ဇူးမ်ဆွဲရန်</translation> <translation id="6583087784430677195">ပိတ်ရန်အတွက် <ph name="BEGIN_LINK" />ဆက်တင်များ<ph name="END_LINK" /> ဖွင့်ပြီး ‘အော်တိုဖြည့် စကားဝှက်များ’ သို့ သွားပါ။</translation> <translation id="6585618849026997638">သင့်အတွက်အရေးကြီးသော စာမျက်နှာသို့ လိပ်စာမှတ်ပြီး ပြန်သွားနိုင်သည်</translation> +<translation id="6596481460663245319">Google ဖြင့် ပုံရှာရန်</translation> <translation id="6598875554591387303">ထုတ်ဝေသူအလိုက် စီရန်</translation> <translation id="6603393121510733479">သင့်အဖွဲ့အစည်းက ကိုယ်ဖျောက်မုဒ်ဖြင့် ဝင်ရောက်ကြည့်ရှုခြင်းကို ပိတ်ထားသည်။ <ph name="BEGIN_LINK" />ပိုမိုလေ့လာရန်<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pa.xtb b/ios/chrome/app/strings/resources/ios_strings_pa.xtb index 9081f40e..0504f2a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pa.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">ਸੁਰੱਖਿਅਤ ਨਹੀਂ</translation> <translation id="3533202363250687977">ਸਾਰੀਆਂ ਇਨਕੋਗਨਿਟੋ ਟੈਬਾਂ ਨੂੰ ਬੰਦ ਕਰੋ</translation> <translation id="3533436815740441613">ਨਵੀਂ ਟੈਬ</translation> +<translation id="3547799431091898961">ਸਾਰੀਆਂ ਵੈੱਬਸਾਈਟਾਂ 'ਤੇ ਆਪਣੇ Google ਖਾਤੇ ਤੋਂ ਸਾਈਨ-ਆਊਟ ਕਰਨ ਲਈ, <ph name="BEGIN_LINK" />Chrome ਤੋਂ ਸਾਈਨ-ਆਊਟ ਕਰੋ<ph name="END_LINK" />।</translation> <translation id="3551320343578183772">ਟੈਬ ਬੰਦ ਕਰੋ</translation> <translation id="3581564640715911333">ਹੋਰ ਭਾਸ਼ਾਵਾਂ ਵਿੱਚ ਪੰਨਿਆਂ ਦਾ ਅਨੁਵਾਦ ਕਰਨ ਲਈ ਪੇਸ਼ਕਸ਼ ਕਰੋ</translation> <translation id="3588820906588687999">ਨਵੀਂ ਟੈਬ ਵਿੱਚ ਚਿੱਤਰ ਖੋਲ੍ਹੋ</translation> @@ -680,6 +681,7 @@ <translation id="6561262006871132942">ਜ਼ੂਮ ਵਧਾਓ</translation> <translation id="6583087784430677195">ਬੰਦ ਕਰਨ ਲਈ, <ph name="BEGIN_LINK" />ਸੈਟਿੰਗਾਂ<ph name="END_LINK" /> ਖੋਲ੍ਹੋ ਅਤੇ 'ਪਾਸਵਰਡ ਆਟੋਫਿਲ ਕਰੋ' 'ਤੇ ਜਾਓ।</translation> <translation id="6585618849026997638">ਬੁੱਕਮਾਰਕ ਸ਼ਾਮਲ ਕਰਕੇ ਤੁਸੀਂ ਉਸ ਪੰਨੇ 'ਤੇ ਆਸਾਨੀ ਨਾਲ ਵਾਪਸ ਜਾ ਸਕਦੇ ਹੋ ਜੋ ਤੁਹਾਡੇ ਲਈ ਮਹੱਤਵਪੂਰਨ ਹੈ</translation> +<translation id="6596481460663245319">Google ਨਾਲ ਚਿੱਤਰ ਖੋਜੋ</translation> <translation id="6598875554591387303">ਪ੍ਰਕਾਸ਼ਕ ਮੁਤਾਬਕ ਕ੍ਰਮ-ਬੱਧ ਕਰੋ</translation> <translation id="6603393121510733479">ਤੁਹਾਡੀ ਸੰਸਥਾ ਨੇ ਨਿੱਜੀ ਬ੍ਰਾਊਜ਼ਿੰਗ ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਹੈ। <ph name="BEGIN_LINK" />ਹੋਰ ਜਾਣੋ<ph name="END_LINK" /></translation> @@ -848,6 +850,7 @@ <translation id="7987685713885608670">ਵਾਧੂ ਸੁਰੱਖਿਆ ਲਈ, Google ਪਾਸਵਰਡ ਪ੍ਰਬੰਧਕ 'ਤੇ ਰੱਖਿਅਤ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਪਾਸਵਰਡਾਂ ਨੂੰ ਆਪਣੇ ਡੀਵਾਈਸ 'ਤੇ ਇਨਕ੍ਰਿਪਟ ਕਰੋ।</translation> <translation id="7993619969781047893">ਸ਼ਾਇਦ ਕੁਝ ਸਾਈਟਾਂ 'ਤੇ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਠੀਕ ਤਰੀਕੇ ਨਾਲ ਕੰਮ ਨਾ ਕਰਨ</translation> <translation id="800361585186029508">ਦਾਖਲ ਕੀਤੇ URL ਨੂੰ Google Chrome ਵਿੱਚ ਖੋਲ੍ਹਦਾ ਹੈ।</translation> +<translation id="8016714545083187120">ਹਮੇਸ਼ਾਂ ਸੁਰੱਖਿਅਤ ਕਨੈਕਸ਼ਨਾਂ ਨੂੰ ਵਰਤੋ</translation> <translation id="802154636333426148">ਡਾਊਨਲੋਡ ਅਸਫਲ ਰਿਹਾ</translation> <translation id="8023878949384262191">ਸੈਕਸ਼ਨ ਦਾ ਵਿਸਤਾਰ ਕਰਦਾ ਹੈ।</translation> <translation id="8027581147000338959">ਨਵੀਂ ਵਿੰਡੋ ਵਿੱਚ ਖੋਲ੍ਹੋ</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 2d7df9e..3681213e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">Inseguro</translation> <translation id="3533202363250687977">Fechar todos os separadores de navegação anónima</translation> <translation id="3533436815740441613">Novo separador</translation> +<translation id="3547799431091898961">Para terminar sessão na sua Conta Google em todos os Websites, <ph name="BEGIN_LINK" />termine sessão no Chrome<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Fechar Separador</translation> <translation id="3581564640715911333">Proponha a tradução de páginas noutros idiomas</translation> <translation id="3588820906588687999">Abrir imagem num novo separador</translation> @@ -680,6 +681,7 @@ <translation id="6561262006871132942">Aumentar zoom</translation> <translation id="6583087784430677195">Para desativar, abra as <ph name="BEGIN_LINK" />Definições<ph name="END_LINK" /> e aceda a Preenchimento automático de palavras-passe.</translation> <translation id="6585618849026997638">Pode regressar a uma página importante para si ao adicionar um marcador.</translation> +<translation id="6596481460663245319">Pesquisar imagem com o Google</translation> <translation id="6598875554591387303">Ordenar por publicador</translation> <translation id="6603393121510733479">A sua entidade desativou a navegação anónima. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation> @@ -848,6 +850,7 @@ <translation id="7987685713885608670">Para maior segurança, encripte as palavras-passe no seu dispositivo antes de serem guardadas no Gestor de palavras-passe da Google.</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="8016714545083187120">Usar sempre ligações seguras</translation> <translation id="802154636333426148">Falha ao transferir</translation> <translation id="8023878949384262191">Expande a secção.</translation> <translation id="8027581147000338959">Abrir numa Nova Janela</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb index 33ba977..6909746 100644 --- a/ios/chrome/app/strings/resources/ios_strings_te.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">సురక్షితం కాదు</translation> <translation id="3533202363250687977">అజ్ఞాత ట్యాబ్లన్నీ మూసివేయి</translation> <translation id="3533436815740441613">కొత్త ట్యాబ్</translation> +<translation id="3547799431091898961">అన్ని వెబ్సైట్లలో మీ Google ఖాతా నుండి సైన్ అవుట్ చేయడానికి, <ph name="BEGIN_LINK" />chrome నుండి సైన్ అవుట్ చేయండి<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">ట్యాబ్ను మూసివేయి</translation> <translation id="3581564640715911333">ఇతర భాషలలో ఉన్న పేజీలను అనువదించడాన్ని ఆఫర్ చేస్తుంది</translation> <translation id="3588820906588687999">చిత్రాన్ని కొత్త ట్యాబ్లో తెరువు</translation> @@ -680,6 +681,7 @@ <translation id="6561262006871132942">దగ్గరగా జూమ్ చేయి</translation> <translation id="6583087784430677195">ఆఫ్ చేయడానికి, <ph name="BEGIN_LINK" />సెట్టింగ్లను<ph name="END_LINK" /> తెరిచి, 'పాస్వర్డ్లను ఆటోఫిల్ చేయండి' అనే ఆప్షన్కు వెళ్లండి.</translation> <translation id="6585618849026997638">బుక్మార్క్ను జోడించడం ద్వారా మీకు ముఖ్యమైన పేజీకి మళ్ళీ చేరుకోవచ్చు</translation> +<translation id="6596481460663245319">Google ద్వారా ఇమేజ్ను సెర్చ్ చేయండి</translation> <translation id="6598875554591387303">పబ్లిషర్ ఆధారంగా క్రమపద్ధతిలో అమర్చండి</translation> <translation id="6603393121510733479">మీ సంస్థ, ప్రైవేట్ బ్రౌజింగ్ను ఆఫ్ చేసింది. <ph name="BEGIN_LINK" />మరింత తెలుసుకోండి<ph name="END_LINK" /></translation> @@ -848,6 +850,7 @@ <translation id="7987685713885608670">అదనపు భద్రత కోసం, పాస్వర్డ్లు Google పాస్వర్డ్ మేనేజర్లో సేవ్ కావడానికి ముందు, వాటిని మీ పరికరంలో ఎన్క్రిప్ట్ చేయండి.</translation> <translation id="7993619969781047893">కొన్ని సైట్లలోని ఫీచర్లు పని చేయకపోవచ్చు</translation> <translation id="800361585186029508">ఇన్పుట్ చేసిన URLలను Google Chromeలో తెరుస్తుంది.</translation> +<translation id="8016714545083187120">ఎల్లప్పుడూ సురక్షితమైన కనెక్షన్లను ఉపయోగించండి</translation> <translation id="802154636333426148">డౌన్లోడ్ విఫలమైంది</translation> <translation id="8023878949384262191">విభాగాన్ని విస్తరింపజేస్తుంది.</translation> <translation id="8027581147000338959">కొత్త విండోలో తెరువు</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_strings_uz.xtb index 26ac1ee4..b844cb4 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uz.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">Xavfsiz emas</translation> <translation id="3533202363250687977">Inkognito sahifalarni yopish</translation> <translation id="3533436815740441613">Yangi varaq</translation> +<translation id="3547799431091898961">Barcha saytlarda Google hisobingizdan chiqish uchun <ph name="BEGIN_LINK" />Chrome brauzerida hisobdan chiqing<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Ichki oynani yopish</translation> <translation id="3581564640715911333">Boshqa tildagi sahifalarni tarjima qilish taklif qilinsin</translation> <translation id="3588820906588687999">Tasvirni yangi tabda ochish</translation> @@ -680,6 +681,7 @@ <translation id="6561262006871132942">Yaqinlashtirish</translation> <translation id="6583087784430677195">Faolsizlantirish uchun avval <ph name="BEGIN_LINK" />Sozlamalar<ph name="END_LINK" />, keyin Parollarni avtomatik kiritish sahifasini oching.</translation> <translation id="6585618849026997638">Siz uchun muhim sahifalarga bukmark kiritish orqali qaytish mumkin</translation> +<translation id="6596481460663245319">Google orqali rasm qidirish</translation> <translation id="6598875554591387303">Noshirlar asosida saralash</translation> <translation id="6603393121510733479">Inkognito rejimi tashkilotingiz tomonidan faolsizlantirildi. <ph name="BEGIN_LINK" />Batafsil<ph name="END_LINK" /></translation> @@ -848,6 +850,7 @@ <translation id="7987685713885608670">Xavfsizlikni yanada oshirish uchun parolingizni Google Parollar menejeriga saqlashdan oldin qurilmangizda shifrlang</translation> <translation id="7993619969781047893">Ayrim saytlardagi funksiyalar ishalamay qolishi mumkin</translation> <translation id="800361585186029508">Kiritiladigan URL manzillarni Google Chrome orqali ochadi.</translation> +<translation id="8016714545083187120">Doim xavfsiz ulanish ishlatilsin</translation> <translation id="802154636333426148">Yuklab olib bo‘lmadi</translation> <translation id="8023878949384262191">Bo‘limni yoyadi.</translation> <translation id="8027581147000338959">Yangi oynada ochish</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb index dd2fc7c..ff5b83aa 100644 --- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">Không an toàn</translation> <translation id="3533202363250687977">Đóng tất cả các thẻ ẩn danh</translation> <translation id="3533436815740441613">Thẻ mới</translation> +<translation id="3547799431091898961">Để đăng xuất khỏi Tài khoản Google trên tất cả các trang web, hãy <ph name="BEGIN_LINK" />đăng xuất khỏi Chrome<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Đóng Thẻ</translation> <translation id="3581564640715911333">Đề xuất dịch trang bằng các ngôn ngữ khác</translation> <translation id="3588820906588687999">Mở ảnh trong thẻ mới</translation> @@ -680,6 +681,7 @@ <translation id="6561262006871132942">Phóng to</translation> <translation id="6583087784430677195">Để tắt, hãy mở phần <ph name="BEGIN_LINK" />Cài đặt<ph name="END_LINK" /> rồi chuyển đến phần Tự động điền mật khẩu.</translation> <translation id="6585618849026997638">Bạn có thể thêm dấu trang để truy cập lại một trang mà bạn thấy quan trọng</translation> +<translation id="6596481460663245319">Tìm hình ảnh bằng Google</translation> <translation id="6598875554591387303">Sắp xếp theo Nhà xuất bản</translation> <translation id="6603393121510733479">Tổ chức của bạn đã tắt tính năng duyệt web ở chế độ riêng tư. <ph name="BEGIN_LINK" />Tìm hiểu thêm<ph name="END_LINK" /></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 59ad346..7e8a453 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
@@ -846,6 +846,7 @@ <translation id="7987685713885608670">為進一步增強安全性,請先在裝置上將密碼加密,然後才將密碼儲存至 Google 密碼管理工具。</translation> <translation id="7993619969781047893">部分網站的功能可能會無法正常運作</translation> <translation id="800361585186029508">在 Google Chrome 中開啟已輸入的網址。</translation> +<translation id="8016714545083187120">一律使用安全連線</translation> <translation id="802154636333426148">下載失敗</translation> <translation id="8023878949384262191">展開這個專區。</translation> <translation id="8027581147000338959">在新視窗中開啟</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 26bbd2c..78ec78e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -848,6 +848,7 @@ <translation id="7987685713885608670">為進一步加強安全性,系統會先在裝置上將密碼加密,再儲存至 Google 密碼管理員。</translation> <translation id="7993619969781047893">某些網站的功能可能無法正常運作</translation> <translation id="800361585186029508">在 Google Chrome 中開啟輸入的網址。</translation> +<translation id="8016714545083187120">一律使用安全連線</translation> <translation id="802154636333426148">下載失敗</translation> <translation id="8023878949384262191">展開這個專區。</translation> <translation id="8027581147000338959">在新視窗中開啟</translation>
diff --git a/ios/chrome/browser/autofill/form_structure_browsertest.mm b/ios/chrome/browser/autofill/form_structure_browsertest.mm index 24722a4d..c8eaccd 100644 --- a/ios/chrome/browser/autofill/form_structure_browsertest.mm +++ b/ios/chrome/browser/autofill/form_structure_browsertest.mm
@@ -196,7 +196,9 @@ // TODO(crbug.com/1277480): Remove once launched. autofill::features::kAutofillEnableNameSurenameParsing, // TODO(crbug.com/1190334): Remove once launched. - autofill::features::kAutofillParseMerchantPromoCodeFields}, + autofill::features::kAutofillParseMerchantPromoCodeFields, + // TODO(crbug.com/1113970): Remove once launched. + features::kAutofillSectionUponRedundantNameInfo}, // Disabled {}); } @@ -302,7 +304,7 @@ name = ""; } - std::string section = field->section; + std::string section = field->section.ToString(); if (base::StartsWith(section, "gChrome~field~", base::CompareCase::SENSITIVE)) { // The name has been generated by iOS JavaScript. Output an empty name
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm index 23b50317..5b978ac 100644 --- a/ios/chrome/browser/flags/about_flags.mm +++ b/ios/chrome/browser/flags/about_flags.mm
@@ -891,14 +891,6 @@ flag_descriptions::kEnableUnicornAccountSupportDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(signin::kEnableUnicornAccountSupport)}, - {"single-cell-content-suggestions", - flag_descriptions::kSingleCellContentSuggestionsName, - flag_descriptions::kSingleCellContentSuggestionsDescription, - flags_ui::kOsIos, FEATURE_VALUE_TYPE(kSingleCellContentSuggestions)}, - {"content-suggestions-header-migration", - flag_descriptions::kContentSuggestionsHeaderMigrationName, - flag_descriptions::kContentSuggestionsHeaderMigrationDescription, - flags_ui::kOsIos, FEATURE_VALUE_TYPE(kContentSuggestionsHeaderMigration)}, {"leak-detection-unauthenticated", flag_descriptions::kLeakDetectionUnauthenticatedName, flag_descriptions::kLeakDetectionUnauthenticatedDescription, @@ -943,11 +935,6 @@ flag_descriptions::kSendTabToSelfSigninPromoName, flag_descriptions::kSendTabToSelfSigninPromoDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(send_tab_to_self::kSendTabToSelfSigninPromo)}, - {"content-suggestions-uiviewcontroller-migration", - flag_descriptions::kContentSuggestionsUIViewControllerMigrationName, - flag_descriptions::kContentSuggestionsUIViewControllerMigrationDescription, - flags_ui::kOsIos, - FEATURE_VALUE_TYPE(kContentSuggestionsUIViewControllerMigration)}, {"bubble-rich-iph", flag_descriptions::kBubbleRichIPHName, flag_descriptions::kBubbleRichIPHDescription, flags_ui::kOsIos, FEATURE_WITH_PARAMS_VALUE_TYPE(kBubbleRichIPH,
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc index 8c2d6b1..5edc494 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -164,24 +164,12 @@ "When enabled, Experience Kit Calendar will use Text Classifier library in " "entity detection where possible."; -const char kContentSuggestionsHeaderMigrationName[] = - "Content Suggestions header migration"; -const char kContentSuggestionsHeaderMigrationDescription[] = - "When enabled, the Content Suggestions header will be logically moved to " - "the Discover feed ScrollView"; - const char kContentSuggestionsUIModuleRefreshName[] = "Content Suggestions UI Module Refresh"; const char kContentSuggestionsUIModuleRefreshDescription[] = "When enabled, the Content Suggestions will be redesigned to be contained " "into distinct modules."; -const char kContentSuggestionsUIViewControllerMigrationName[] = - "Content Suggestions UIViewController migration"; -const char kContentSuggestionsUIViewControllerMigrationDescription[] = - "When enabled, the Content Suggestions will be logically moved to a " - "UIViewController subclass implementation"; - const char kCrashpadIOSName[] = "Use Crashpad for crash collection."; const char kCrashpadIOSDescription[] = "When enabled use Crashpad to generate crash reports crash collection. " @@ -630,11 +618,6 @@ "Adds a Link to Text option in the Edit Menu which generates URLs with a " "text fragment."; -const char kSingleCellContentSuggestionsName[] = - "Use Single Cell for Content Suggestions"; -const char kSingleCellContentSuggestionsDescription[] = - "Uses a single cell for all items in the NTP's content suggestions."; - const char kShowAutofillTypePredictionsName[] = "Show Autofill predictions"; const char kShowAutofillTypePredictionsDescription[] = "Annotates web forms with Autofill field type predictions as placeholder "
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h index b788026..3cb9769 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -139,21 +139,11 @@ extern const char kEnableExpKitCalendarTextClassifierName[]; extern const char kEnableExpKitCalendarTextClassifierDescription[]; -// Title and description for the flag that moves the Content Suggestions header -// to the Discover feed ScrollView. -extern const char kContentSuggestionsHeaderMigrationName[]; -extern const char kContentSuggestionsHeaderMigrationDescription[]; - // Title and description for the flag that updates the Content Suggestions to a // new module design. extern const char kContentSuggestionsUIModuleRefreshName[]; extern const char kContentSuggestionsUIModuleRefreshDescription[]; -// Title and description for the flag that moves the Content Suggestions to a -// UIViewController. -extern const char kContentSuggestionsUIViewControllerMigrationName[]; -extern const char kContentSuggestionsUIViewControllerMigrationDescription[]; - // Title and description for the flag to control which crash generation tool // is used. extern const char kCrashpadIOSName[]; @@ -577,11 +567,6 @@ extern const char kShowAutofillTypePredictionsName[]; extern const char kShowAutofillTypePredictionsDescription[]; -// Title and description for the flag to use one cell for the Content -// Suggestions -extern const char kSingleCellContentSuggestionsName[]; -extern const char kSingleCellContentSuggestionsDescription[]; - // Title and description for the flag to enable smart sorting the new overflow // menu. extern const char kSmartSortingNewOverflowMenuName[];
diff --git a/ios/chrome/browser/ntp_tiles/ntp_tiles_egtest.mm b/ios/chrome/browser/ntp_tiles/ntp_tiles_egtest.mm index 0362388b..66d63d1 100644 --- a/ios/chrome/browser/ntp_tiles/ntp_tiles_egtest.mm +++ b/ios/chrome/browser/ntp_tiles/ntp_tiles_egtest.mm
@@ -41,10 +41,6 @@ - (AppLaunchConfiguration)appConfigurationForTestCase { AppLaunchConfiguration config; config.relaunch_policy = ForceRelaunchByCleanShutdown; - config.features_enabled.push_back(kSingleCellContentSuggestions); - config.features_enabled.push_back(kContentSuggestionsHeaderMigration); - config.features_enabled.push_back( - kContentSuggestionsUIViewControllerMigration); return config; }
diff --git a/ios/chrome/browser/tabs_search/BUILD.gn b/ios/chrome/browser/tabs_search/BUILD.gn index d3d75a2..f2ff73f 100644 --- a/ios/chrome/browser/tabs_search/BUILD.gn +++ b/ios/chrome/browser/tabs_search/BUILD.gn
@@ -42,7 +42,11 @@ "//base", "//components/keyed_service/ios", "//ios/chrome/browser/browser_state", + "//ios/chrome/browser/history", "//ios/chrome/browser/main:public", + "//ios/chrome/browser/sessions", + "//ios/chrome/browser/signin", + "//ios/chrome/browser/sync", ] }
diff --git a/ios/chrome/browser/tabs_search/tabs_search_service_factory.mm b/ios/chrome/browser/tabs_search/tabs_search_service_factory.mm index 611a0ea8..27a85c6 100644 --- a/ios/chrome/browser/tabs_search/tabs_search_service_factory.mm +++ b/ios/chrome/browser/tabs_search/tabs_search_service_factory.mm
@@ -7,6 +7,13 @@ #include "components/keyed_service/ios/browser_state_dependency_manager.h" #include "ios/chrome/browser/browser_state/browser_state_otr_helper.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" +#import "ios/chrome/browser/history/history_service_factory.h" +#import "ios/chrome/browser/history/web_history_service_factory.h" +#import "ios/chrome/browser/main/browser_list_factory.h" +#import "ios/chrome/browser/sessions/ios_chrome_tab_restore_service_factory.h" +#import "ios/chrome/browser/signin/identity_manager_factory.h" +#import "ios/chrome/browser/sync/session_sync_service_factory.h" +#import "ios/chrome/browser/sync/sync_service_factory.h" #import "ios/chrome/browser/tabs_search/tabs_search_service.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -27,7 +34,14 @@ TabsSearchServiceFactory::TabsSearchServiceFactory() : BrowserStateKeyedServiceFactory( "TabsSearchService", - BrowserStateDependencyManager::GetInstance()) {} + BrowserStateDependencyManager::GetInstance()) { + DependsOn(BrowserListFactory::GetInstance()); + DependsOn(IOSChromeTabRestoreServiceFactory::GetInstance()); + DependsOn(IdentityManagerFactory::GetInstance()); + DependsOn(ios::HistoryServiceFactory::GetInstance()); + DependsOn(SessionSyncServiceFactory::GetInstance()); + DependsOn(SyncServiceFactory::GetInstance()); +} TabsSearchServiceFactory::~TabsSearchServiceFactory() = default;
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm index fabb8d6..bccf914 100644 --- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm +++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -2589,11 +2589,9 @@ - (BOOL)isTabScrolledToTopForBubblePresenter:(BubblePresenter*)bubblePresenter { DCHECK(bubblePresenter == _bubblePresenter); - // If NTP exists, use NTP coordinator's scroll offset. + // If NTP exists, check if it is scrolled to top. if (self.isNTPActiveForCurrentWebState) { - NewTabPageCoordinator* coordinator = self.ntpCoordinator; - CGFloat scrolledToTopOffset = [coordinator contentInset].top; - return [coordinator contentOffset].y == scrolledToTopOffset; + return [self.ntpCoordinator isScrolledToTop]; } CRWWebViewScrollViewProxy* scrollProxy =
diff --git a/ios/chrome/browser/ui/content_suggestions/BUILD.gn b/ios/chrome/browser/ui/content_suggestions/BUILD.gn index 18367615..d93550f 100644 --- a/ios/chrome/browser/ui/content_suggestions/BUILD.gn +++ b/ios/chrome/browser/ui/content_suggestions/BUILD.gn
@@ -119,6 +119,7 @@ "//ui/strings", ] configs += [ "//build/config/compiler:enable_arc" ] + public_deps = [ "//ios/third_party/material_components_ios" ] } source_set("metrics") { @@ -144,22 +145,17 @@ source_set("public") { sources = [ "content_suggestions_menu_provider.h" ] - public_deps = [ "//ios/third_party/material_components_ios" ] configs += [ "//build/config/compiler:enable_arc" ] } source_set("content_suggestions_ui") { sources = [ - "content_suggestions_collection_consumer.h", "content_suggestions_collection_controlling.h", "content_suggestions_collection_synchronizing.h", - "content_suggestions_collection_view_controller.h", - "content_suggestions_collection_view_controller.mm", "content_suggestions_commands.h", "content_suggestions_consumer.h", "content_suggestions_header_commands.h", "content_suggestions_header_controlling.h", - "content_suggestions_header_provider.h", "content_suggestions_header_synchronizer.h", "content_suggestions_header_synchronizer.mm", "content_suggestions_header_synchronizing.h", @@ -168,8 +164,6 @@ "content_suggestions_header_view_controller.h", "content_suggestions_header_view_controller.mm", "content_suggestions_header_view_controller_delegate.h", - "content_suggestions_layout.h", - "content_suggestions_layout.mm", "content_suggestions_view_controller.h", "content_suggestions_view_controller.mm", "content_suggestions_view_controller_audience.h", @@ -214,10 +208,7 @@ "//ios/web/common", "//ui/base", ] - public_deps = [ - ":content_suggestions_ui_util", - "//ios/third_party/material_components_ios", - ] + public_deps = [ ":content_suggestions_ui_util" ] configs += [ "//build/config/compiler:enable_arc" ] } @@ -253,7 +244,6 @@ "//ios/chrome/common/ui/colors", "//ios/chrome/common/ui/util", "//ios/components/ui_util", - "//ios/third_party/material_components_ios", "//ios/web/common", "//ui/base", ]
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/BUILD.gn b/ios/chrome/browser/ui/content_suggestions/cells/BUILD.gn index 0578d07..a745014 100644 --- a/ios/chrome/browser/ui/content_suggestions/cells/BUILD.gn +++ b/ios/chrome/browser/ui/content_suggestions/cells/BUILD.gn
@@ -5,24 +5,16 @@ source_set("cells") { sources = [ "content_suggestions_gesture_commands.h", - "content_suggestions_header_item.h", - "content_suggestions_header_item.mm", "content_suggestions_module_container.h", "content_suggestions_module_container.mm", - "content_suggestions_most_visited_action_cell.h", - "content_suggestions_most_visited_action_cell.mm", "content_suggestions_most_visited_action_item.h", "content_suggestions_most_visited_action_item.mm", - "content_suggestions_most_visited_cell.h", - "content_suggestions_most_visited_cell.mm", "content_suggestions_most_visited_constants.h", "content_suggestions_most_visited_constants.mm", "content_suggestions_most_visited_item.h", "content_suggestions_most_visited_item.mm", "content_suggestions_most_visited_tile_view.h", "content_suggestions_most_visited_tile_view.mm", - "content_suggestions_parent_item.h", - "content_suggestions_parent_item.mm", "content_suggestions_return_to_recent_tab_item.h", "content_suggestions_return_to_recent_tab_item.mm", "content_suggestions_return_to_recent_tab_view.h", @@ -72,11 +64,9 @@ "//ios/chrome/common/ui/table_view:cells_constants", "//ios/chrome/common/ui/util", "//ios/chrome/common/ui/util:dynamic_type_util", - "//ios/third_party/material_components_ios", "//ui/base", "//url", ] - public_deps = [ "//ios/third_party/material_components_ios" ] configs += [ "//build/config/compiler:enable_arc" ] } @@ -92,18 +82,13 @@ deps = [ "//ios/chrome/app/strings:ios_strings_grit", "//ios/chrome/browser/ui/icons:symbols", - "//ios/third_party/material_components_ios", "//ui/base:base", ] } source_set("unit_tests") { testonly = true - sources = [ - "content_suggestions_header_item_unittest.mm", - "content_suggestions_tile_layout_util_unittest.mm", - "content_suggestions_whats_new_item_unittest.mm", - ] + sources = [ "content_suggestions_tile_layout_util_unittest.mm" ] deps = [ ":cells", "//base",
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_header_item.h b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_header_item.h deleted file mode 100644 index f6ff7ccb..0000000 --- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_header_item.h +++ /dev/null
@@ -1,31 +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_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CELLS_CONTENT_SUGGESTIONS_HEADER_ITEM_H_ -#define IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CELLS_CONTENT_SUGGESTIONS_HEADER_ITEM_H_ - -#import <MaterialComponents/MaterialCollectionCells.h> - -#import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h" - -// Item to display a view cell. -@interface ContentSuggestionsHeaderItem : CollectionViewItem - -// The view to be displayed. -@property(nonatomic, strong) UIView* view; - -// Accessibility identifier of the ContentSuggestionsHeaderCell. -+ (NSString*)accessibilityIdentifier; - -@end - -// Corresponding cell. -@interface ContentSuggestionsHeaderCell : MDCCollectionViewCell - -// The header view to be displayed. -@property(nonatomic, strong) UIView* headerView; - -@end - -#endif // IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CELLS_CONTENT_SUGGESTIONS_HEADER_ITEM_H_
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_header_item.mm b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_header_item.mm deleted file mode 100644 index 58bff46..0000000 --- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_header_item.mm +++ /dev/null
@@ -1,58 +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. - -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_header_item.h" - -#import "ios/chrome/common/ui/util/constraints_ui_util.h" - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -@implementation ContentSuggestionsHeaderItem - -@synthesize view; - -- (instancetype)initWithType:(NSInteger)type { - self = [super initWithType:type]; - if (self) { - self.cellClass = [ContentSuggestionsHeaderCell class]; - } - return self; -} - -- (void)configureCell:(ContentSuggestionsHeaderCell*)cell { - [super configureCell:cell]; - [cell setHeaderView:self.view]; - cell.accessibilityIdentifier = [[self class] accessibilityIdentifier]; -} - -+ (NSString*)accessibilityIdentifier { - return @"CSHeaderIdentifier"; -} - -@end - -@implementation ContentSuggestionsHeaderCell - -@synthesize headerView = _headerView; - -- (void)setHeaderView:(UIView*)header { - [_headerView removeFromSuperview]; - _headerView = header; - - if (!header) - return; - - header.translatesAutoresizingMaskIntoConstraints = NO; - [self.contentView addSubview:header]; - AddSameConstraints(self.contentView, header); -} - -- (void)prepareForReuse { - [super prepareForReuse]; - self.headerView = nil; -} - -@end
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_header_item_unittest.mm b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_header_item_unittest.mm deleted file mode 100644 index 69e8de8..0000000 --- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_header_item_unittest.mm +++ /dev/null
@@ -1,45 +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. - -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_header_item.h" - -#include "testing/gtest/include/gtest/gtest.h" -#include "testing/platform_test.h" - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -namespace { - -using ContentSuggestionsHeaderItemTest = PlatformTest; - -TEST_F(ContentSuggestionsHeaderItemTest, CellClass) { - // Setup. - ContentSuggestionsHeaderItem* item = - [[ContentSuggestionsHeaderItem alloc] initWithType:0]; - - // Action. - ContentSuggestionsHeaderCell* cell = [[[item cellClass] alloc] init]; - - // Test. - EXPECT_EQ([ContentSuggestionsHeaderCell class], [cell class]); -} - -TEST_F(ContentSuggestionsHeaderItemTest, Configure) { - // Setup. - UIView* view = [[UIView alloc] init]; - ContentSuggestionsHeaderItem* item = - [[ContentSuggestionsHeaderItem alloc] initWithType:0]; - item.view = view; - ContentSuggestionsHeaderCell* cell = [[[item cellClass] alloc] init]; - - // Action. - [item configureCell:cell]; - - // Test. - ASSERT_EQ(1U, [cell.contentView.subviews count]); - EXPECT_EQ(view, cell.contentView.subviews[0]); -} -}
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_cell.h b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_cell.h deleted file mode 100644 index 2e365b8..0000000 --- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_cell.h +++ /dev/null
@@ -1,30 +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 IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CELLS_CONTENT_SUGGESTIONS_MOST_VISITED_ACTION_CELL_H_ -#define IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CELLS_CONTENT_SUGGESTIONS_MOST_VISITED_ACTION_CELL_H_ - -#import <MaterialComponents/MaterialCollectionCells.h> - -// Associated cell to display a Most Visited Action tile based. -@interface ContentSuggestionsMostVisitedActionCell : MDCCollectionViewCell - -// View for action icon. -@property(nonatomic, strong, readonly, nonnull) UIImageView* iconView; - -// Title of the action. -@property(nonatomic, strong, readonly, nonnull) UILabel* titleLabel; - -// Container view for `countLabel`. -@property(nonatomic, strong, readonly, nonnull) UIView* countContainer; - -// Number shown in circle by top trailing side of cell. -@property(nonatomic, strong, readonly, nonnull) UILabel* countLabel; - -// Size for a an action tile. -+ (CGSize)defaultSize; - -@end - -#endif // IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CELLS_CONTENT_SUGGESTIONS_MOST_VISITED_ACTION_CELL_H_
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_cell.mm b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_cell.mm deleted file mode 100644 index febb062..0000000 --- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_cell.mm +++ /dev/null
@@ -1,88 +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. - -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_cell.h" - -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_constants.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_shortcut_tile_view.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_tile_layout_util.h" -#include "ios/chrome/browser/ui/util/ui_util.h" -#import "ios/chrome/browser/ui/util/uikit_ui_util.h" -#import "ios/chrome/common/material_timing.h" -#import "ios/chrome/common/ui/favicon/favicon_view.h" -#import "ios/chrome/common/ui/util/constraints_ui_util.h" - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -@interface ContentSuggestionsMostVisitedActionCell () - -@property(nonatomic, strong) ContentSuggestionsShortcutTileView* tileView; - -@end - -@implementation ContentSuggestionsMostVisitedActionCell : MDCCollectionViewCell - -#pragma mark - Public - -- (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { - _tileView = - [[ContentSuggestionsShortcutTileView alloc] initWithFrame:frame]; - _tileView.translatesAutoresizingMaskIntoConstraints = NO; - [self.contentView addSubview:_tileView]; - AddSameConstraints(self.contentView, _tileView); - - self.isAccessibilityElement = YES; - } - return self; -} - -- (void)setHighlighted:(BOOL)highlighted { - [super setHighlighted:highlighted]; - - [UIView transitionWithView:self - duration:ios::material::kDuration8 - options:UIViewAnimationOptionCurveEaseInOut - animations:^{ - self.alpha = highlighted ? 0.5 : 1.0; - } - completion:nil]; -} - -+ (CGSize)defaultSize { - return MostVisitedCellSize( - UIApplication.sharedApplication.preferredContentSizeCategory); -} - -- (CGSize)intrinsicContentSize { - return [[self class] defaultSize]; -} - -- (void)prepareForReuse { - [super prepareForReuse]; - self.tileView.countContainer.hidden = YES; -} - -#pragma mark - properties - -- (UIImageView*)iconView { - return self.tileView.iconView; -} - -- (UILabel*)titleLabel { - return self.tileView.titleLabel; -} - -- (UIView*)countContainer { - return self.tileView.countContainer; -} - -- (UILabel*)countLabel { - return self.tileView.countLabel; -} - -@end
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_item.h b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_item.h index bd879383..3f045bdd 100644 --- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_item.h +++ b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_item.h
@@ -7,15 +7,12 @@ #import <UIKit/UIKit.h> -#import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_tile_constants.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/suggested_content.h" // Item containing a most visited action button. These buttons belong to the // collection section as most visited items, but have static placement (the last // four) and cannot be removed. -@interface ContentSuggestionsMostVisitedActionItem - : CollectionViewItem<SuggestedContent> +@interface ContentSuggestionsMostVisitedActionItem : NSObject - (nonnull instancetype)initWithCollectionShortcutType: (NTPCollectionShortcutType)type;
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_item.mm b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_item.mm index 4d23365..73cffb49 100644 --- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_item.mm +++ b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_item.mm
@@ -5,7 +5,6 @@ #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_item.h" #include "base/check.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_cell.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_tile_constants.h" #import "ios/chrome/browser/ui/icons/chrome_symbol.h" @@ -14,11 +13,9 @@ #endif @implementation ContentSuggestionsMostVisitedActionItem -@synthesize metricsRecorded; -@synthesize suggestionIdentifier; - (instancetype)initWithCollectionShortcutType:(NTPCollectionShortcutType)type { - self = [super initWithType:0]; + self = [super init]; if (self) { _collectionShortcutType = type; switch (_collectionShortcutType) { @@ -37,7 +34,6 @@ default: break; } - self.cellClass = [ContentSuggestionsMostVisitedActionCell class]; self.title = TitleForCollectionShortcutType(_collectionShortcutType); } return self; @@ -59,35 +55,6 @@ [self updateAccessibilityLabel]; } -#pragma mark - AccessibilityCustomAction - -- (void)configureCell:(ContentSuggestionsMostVisitedActionCell*)cell { - [super configureCell:cell]; - cell.accessibilityCustomActions = nil; - cell.titleLabel.text = self.title; - cell.accessibilityLabel = - self.accessibilityLabel.length ? self.accessibilityLabel : self.title; - // The accessibilityUserInputLabel should just be the title, with nothing - // extra from the accessibilityLabel. - cell.accessibilityUserInputLabels = @[ self.title ]; - cell.iconView.image = - UseSymbols() ? SymbolForCollectionShortcutType(_collectionShortcutType) - : ImageForCollectionShortcutType(_collectionShortcutType); - cell.iconView.contentMode = UIViewContentModeCenter; - if (self.count != 0) { - cell.countLabel.text = [@(self.count) stringValue]; - cell.countContainer.hidden = NO; - } else { - cell.countContainer.hidden = YES; - } -} - -#pragma mark - ContentSuggestionsItem - -- (CGFloat)cellHeightForWidth:(CGFloat)width { - return [ContentSuggestionsMostVisitedActionCell defaultSize].height; -} - #pragma mark - Private // Updates self.accessibilityLabel based on the current property values.
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_cell.h b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_cell.h deleted file mode 100644 index 831cc647..0000000 --- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_cell.h +++ /dev/null
@@ -1,27 +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_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CELLS_CONTENT_SUGGESTIONS_MOST_VISITED_CELL_H_ -#define IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CELLS_CONTENT_SUGGESTIONS_MOST_VISITED_CELL_H_ - -#import <MaterialComponents/MaterialCollectionCells.h> - -@class FaviconView; - -// Associated cell to display a Most Visited tile based on the suggestion. -// It displays the favicon for this Most Visited suggestion and its title. -@interface ContentSuggestionsMostVisitedCell : MDCCollectionViewCell - -// FaviconView displaying the favicon. -@property(nonatomic, strong, readonly, nonnull) FaviconView* faviconView; - -// Title of the Most Visited. -@property(nonatomic, strong, readonly, nonnull) UILabel* titleLabel; - -// Size for a Most Visited tile. -+ (CGSize)defaultSize; - -@end - -#endif // IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CELLS_CONTENT_SUGGESTIONS_MOST_VISITED_CELL_H_
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_cell.mm b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_cell.mm deleted file mode 100644 index e5aa393a..0000000 --- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_cell.mm +++ /dev/null
@@ -1,73 +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. - -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_cell.h" - -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_tile_view.h" - -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_constants.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_tile_layout_util.h" -#include "ios/chrome/browser/ui/util/ui_util.h" -#import "ios/chrome/common/material_timing.h" -#import "ios/chrome/common/ui/favicon/favicon_view.h" -#import "ios/chrome/common/ui/util/constraints_ui_util.h" - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -@interface ContentSuggestionsMostVisitedCell () - -@property(nonatomic, strong) - ContentSuggestionsMostVisitedTileView* mostVisitedTile; - -@end - -@implementation ContentSuggestionsMostVisitedCell : MDCCollectionViewCell - -#pragma mark - Public - -- (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { - _mostVisitedTile = - [[ContentSuggestionsMostVisitedTileView alloc] initWithFrame:frame]; - [self.contentView addSubview:_mostVisitedTile]; - _mostVisitedTile.translatesAutoresizingMaskIntoConstraints = NO; - AddSameConstraints(self.contentView, _mostVisitedTile); - self.isAccessibilityElement = YES; - } - return self; -} - -- (FaviconView*)faviconView { - return self.mostVisitedTile.faviconView; -} - -- (UILabel*)titleLabel { - return self.mostVisitedTile.titleLabel; -} - -- (void)setHighlighted:(BOOL)highlighted { - [super setHighlighted:highlighted]; - - [UIView transitionWithView:self - duration:ios::material::kDuration8 - options:UIViewAnimationOptionCurveEaseInOut - animations:^{ - self.alpha = highlighted ? 0.5 : 1.0; - } - completion:nil]; -} - -+ (CGSize)defaultSize { - return MostVisitedCellSize( - UIApplication.sharedApplication.preferredContentSizeCategory); -} - -- (CGSize)intrinsicContentSize { - return [[self class] defaultSize]; -} - -@end
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_item.h b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_item.h index e5c7ccb9..6b1c38c 100644 --- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_item.h +++ b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_item.h
@@ -7,16 +7,15 @@ #include "components/ntp_tiles/tile_source.h" #include "components/ntp_tiles/tile_title_source.h" -#import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/suggested_content.h" + +#import <UIKit/UIKit.h> @protocol ContentSuggestionsGestureCommands; @class FaviconAttributes; class GURL; // Item containing a Most Visited suggestion. -@interface ContentSuggestionsMostVisitedItem - : CollectionViewItem<SuggestedContent> +@interface ContentSuggestionsMostVisitedItem : NSObject // Text for the title and the accessibility label of the cell. @property(nonatomic, copy, nonnull) NSString* title;
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_item.mm b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_item.mm index cfc7afcb..69e30e3 100644 --- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_item.mm +++ b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_item.mm
@@ -6,7 +6,6 @@ #include "base/check.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_gesture_commands.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_cell.h" #import "ios/chrome/common/ui/favicon/favicon_attributes.h" #import "ios/chrome/common/ui/favicon/favicon_view.h" #include "ios/chrome/grit/ios_strings.h" @@ -19,41 +18,12 @@ @implementation ContentSuggestionsMostVisitedItem -@synthesize suggestionIdentifier = _suggestionIdentifier; @synthesize attributes = _attributes; @synthesize title = _title; @synthesize URL = _URL; @synthesize titleSource = _titleSource; @synthesize source = _source; @synthesize commandHandler = _commandHandler; -@synthesize metricsRecorded = _metricsRecorded; - -- (instancetype)initWithType:(NSInteger)type { - self = [super initWithType:type]; - if (self) { - self.cellClass = [ContentSuggestionsMostVisitedCell class]; - } - return self; -} - -- (void)configureCell:(MDCCollectionViewCell*)cell { - [super configureCell:cell]; - if (![cell isKindOfClass:[ContentSuggestionsMostVisitedCell class]]) { - // Do not attempt to configure cell if it is not the correct class - // (crbug.com/1276562). - return; - } - ContentSuggestionsMostVisitedCell* mostVisitedCell = - static_cast<ContentSuggestionsMostVisitedCell*>(cell); - mostVisitedCell.titleLabel.text = self.title; - mostVisitedCell.accessibilityLabel = self.title; - [mostVisitedCell.faviconView configureWithAttributes:self.attributes]; - mostVisitedCell.accessibilityCustomActions = [self customActions]; -} - -- (CGFloat)cellHeightForWidth:(CGFloat)width { - return [ContentSuggestionsMostVisitedCell defaultSize].height; -} #pragma mark - AccessibilityCustomAction
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_parent_item.h b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_parent_item.h deleted file mode 100644 index b92f06cc..0000000 --- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_parent_item.h +++ /dev/null
@@ -1,55 +0,0 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CELLS_CONTENT_SUGGESTIONS_PARENT_ITEM_H_ -#define IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CELLS_CONTENT_SUGGESTIONS_PARENT_ITEM_H_ - -#import <MaterialComponents/MaterialCollectionCells.h> - -#import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_selection_actions.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/suggested_content.h" -#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_menu_provider.h" - -@class ContentSuggestionsMostVisitedActionItem; -@class ContentSuggestionsMostVisitedItem; -@class ContentSuggestionsReturnToRecentTabItem; -@class ContentSuggestionsWhatsNewItem; - -// Item containing all the Content Suggestions content. -@interface ContentSuggestionsParentItem : CollectionViewItem <SuggestedContent> - -// The configuration for the Return To Recent Tab tile. -@property(nonatomic, strong) - ContentSuggestionsReturnToRecentTabItem* returnToRecentItem; -// The configuration for the NTP promo view. -@property(nonatomic, strong) ContentSuggestionsWhatsNewItem* whatsNewItem; -// The list of configurations for the Most Visited Tiles to be shown. -@property(nonatomic, strong) - NSArray<ContentSuggestionsMostVisitedItem*>* mostVisitedItems; -// The list of configurations for the Shortcuts to be shown. -@property(nonatomic, strong) - NSArray<ContentSuggestionsMostVisitedActionItem*>* shortcutsItems; - -// The target for the Most Visited tiles. -@property(nonatomic, weak) id<ContentSuggestionsSelectionActions> tapTarget; - -// Provider of menu configurations for the Most Visited tiles. -@property(nonatomic, weak) id<ContentSuggestionsMenuProvider> menuProvider; - -@end - -// The cell associated with ContentSuggestionsParentItem. -@interface ContentSuggestionsParentCell : MDCCollectionViewCell - -// Adds `view` as a subview. If `spacing` is non-zero, a bottom spacing of -// `spacing` will be added below `view`. -- (void)addUIElement:(UIView*)view withCustomBottomSpacing:(CGFloat)spacing; - -// Removes all UI elements added by addUIElement:withCustomBottomSpacing:. -- (void)removeContentViews; - -@end - -#endif // IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CELLS_CONTENT_SUGGESTIONS_PARENT_ITEM_H_
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_parent_item.mm b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_parent_item.mm deleted file mode 100644 index 8ef25e4c..0000000 --- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_parent_item.mm +++ /dev/null
@@ -1,266 +0,0 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_parent_item.h" - -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_cells_constants.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_item.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_item.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_tile_view.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_parent_item.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_return_to_recent_tab_item.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_return_to_recent_tab_view.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_shortcut_tile_view.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_tile_layout_util.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_whats_new_view.h" -#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_utils.h" -#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_constants.h" -#import "ios/chrome/common/material_timing.h" -#import "ios/chrome/common/ui/util/constraints_ui_util.h" - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -@interface ContentSuggestionsParentItem () - -// List of all UITapGestureRecognizers created for the Most Visisted tiles. -@property(nonatomic, strong) - NSMutableArray<UITapGestureRecognizer*>* mostVisitedTapRecognizers; -// The UILongPressGestureRecognizer for the Return To Recent Tab tile. -@property(nonatomic, strong) - UITapGestureRecognizer* returnToRecentTabTapRecognizer; -@property(nonatomic, strong) - UILongPressGestureRecognizer* returnToRecentTabLongPressRecognizer; -// The UITapGestureRecognizer for the NTP promo view. -@property(nonatomic, strong) UITapGestureRecognizer* promoTapRecognizer; - -@end - -@implementation ContentSuggestionsParentItem -@synthesize metricsRecorded; -@synthesize suggestionIdentifier; - -- (instancetype)initWithType:(NSInteger)type { - self = [super initWithType:type]; - if (self) { - self.cellClass = [ContentSuggestionsParentCell class]; - } - return self; -} - -- (void)configureCell:(ContentSuggestionsParentCell*)cell { - [super configureCell:cell]; - - // Remove subviews from StackView in case prepareForReuse was not called (e.g. - // itemHasChanged: was called). - [cell removeContentViews]; - - CGFloat horizontalSpacing = - ContentSuggestionsTilesHorizontalSpacing(cell.traitCollection); - if (self.returnToRecentItem) { - ContentSuggestionsReturnToRecentTabView* returnToRecentTabTile = - [[ContentSuggestionsReturnToRecentTabView alloc] - initWithConfiguration:self.returnToRecentItem]; - self.returnToRecentTabTapRecognizer = [[UITapGestureRecognizer alloc] - initWithTarget:self.tapTarget - action:@selector(contentSuggestionsElementTapped:)]; - [returnToRecentTabTile - addGestureRecognizer:self.returnToRecentTabTapRecognizer]; - self.returnToRecentTabTapRecognizer.enabled = YES; - // Add long press functionality for the Return to Recent Tab tile. - self.returnToRecentTabLongPressRecognizer = - [[UILongPressGestureRecognizer alloc] - initWithTarget:self.tapTarget - action:@selector(contentSuggestionsElementTapped:)]; - self.returnToRecentTabLongPressRecognizer.minimumPressDuration = - ios::material::kDuration8; - self.returnToRecentTabLongPressRecognizer.enabled = YES; - [returnToRecentTabTile - addGestureRecognizer:self.returnToRecentTabLongPressRecognizer]; - [cell addUIElement:returnToRecentTabTile - withCustomBottomSpacing:content_suggestions:: - kReturnToRecentTabSectionBottomMargin]; - CGFloat cardWidth = content_suggestions::searchFieldWidth( - cell.bounds.size.width, cell.traitCollection); - [NSLayoutConstraint activateConstraints:@[ - [returnToRecentTabTile.widthAnchor constraintEqualToConstant:cardWidth], - [returnToRecentTabTile.heightAnchor - constraintEqualToConstant:kReturnToRecentTabSize.height] - ]]; - } - if (self.whatsNewItem) { - ContentSuggestionsWhatsNewView* whatsNewView = - [[ContentSuggestionsWhatsNewView alloc] - initWithConfiguration:self.whatsNewItem]; - self.promoTapRecognizer = [[UITapGestureRecognizer alloc] - initWithTarget:self.tapTarget - action:@selector(contentSuggestionsElementTapped:)]; - [whatsNewView addGestureRecognizer:self.promoTapRecognizer]; - self.promoTapRecognizer.enabled = YES; - [cell addUIElement:whatsNewView withCustomBottomSpacing:0]; - CGFloat width = - MostVisitedTilesContentHorizontalSpace(cell.traitCollection); - CGSize size = - MostVisitedCellSize(cell.traitCollection.preferredContentSizeCategory); - [NSLayoutConstraint activateConstraints:@[ - [whatsNewView.widthAnchor constraintEqualToConstant:width], - [whatsNewView.heightAnchor constraintEqualToConstant:size.height] - ]]; - } - if (self.mostVisitedItems) { - UIStackView* stackView = [[UIStackView alloc] init]; - stackView.axis = UILayoutConstraintAxisHorizontal; - stackView.alignment = UIStackViewAlignmentTop; - stackView.distribution = UIStackViewDistributionFillEqually; - stackView.spacing = horizontalSpacing; - NSUInteger index = 0; - for (ContentSuggestionsMostVisitedItem* item in self.mostVisitedItems) { - ContentSuggestionsMostVisitedTileView* view = - [[ContentSuggestionsMostVisitedTileView alloc] - initWithConfiguration:item]; - view.accessibilityIdentifier = [NSString - stringWithFormat: - @"%@%li", - kContentSuggestionsMostVisitedAccessibilityIdentifierPrefix, - index]; - view.menuProvider = self.menuProvider; - UITapGestureRecognizer* tapRecognizer = [[UITapGestureRecognizer alloc] - initWithTarget:self.tapTarget - action:@selector(contentSuggestionsElementTapped:)]; - [view addGestureRecognizer:tapRecognizer]; - [self.mostVisitedTapRecognizers addObject:tapRecognizer]; - [stackView addArrangedSubview:view]; - index++; - } - [cell addUIElement:stackView - withCustomBottomSpacing:kMostVisitedBottomMargin]; - CGFloat width = - MostVisitedTilesContentHorizontalSpace(cell.traitCollection); - CGSize size = - MostVisitedCellSize(cell.traitCollection.preferredContentSizeCategory); - [NSLayoutConstraint activateConstraints:@[ - [stackView.widthAnchor constraintEqualToConstant:width], - [stackView.heightAnchor constraintEqualToConstant:size.height] - ]]; - } - if (self.shortcutsItems) { - UIStackView* stackView = [[UIStackView alloc] init]; - stackView.axis = UILayoutConstraintAxisHorizontal; - stackView.alignment = UIStackViewAlignmentTop; - stackView.distribution = UIStackViewDistributionFillEqually; - stackView.spacing = horizontalSpacing; - NSUInteger index = 0; - for (ContentSuggestionsMostVisitedActionItem* item in self.shortcutsItems) { - ContentSuggestionsShortcutTileView* view = - [[ContentSuggestionsShortcutTileView alloc] - initWithConfiguration:item]; - view.accessibilityIdentifier = [NSString - stringWithFormat: - @"%@%li", - kContentSuggestionsShortcutsAccessibilityIdentifierPrefix, index]; - UITapGestureRecognizer* tapRecognizer = [[UITapGestureRecognizer alloc] - initWithTarget:self.tapTarget - action:@selector(contentSuggestionsElementTapped:)]; - [view addGestureRecognizer:tapRecognizer]; - [self.mostVisitedTapRecognizers addObject:tapRecognizer]; - [stackView addArrangedSubview:view]; - index++; - } - - [cell addUIElement:stackView withCustomBottomSpacing:0]; - CGFloat width = - MostVisitedTilesContentHorizontalSpace(cell.traitCollection); - CGSize size = - MostVisitedCellSize(cell.traitCollection.preferredContentSizeCategory); - [NSLayoutConstraint activateConstraints:@[ - [stackView.widthAnchor constraintEqualToConstant:width], - // The parent StackView is UIStackViewDistributionFill so there will be no - // spacing below the last element. Add what would be bottom spacing below - // the last row to the height of this StackView. - // TODO(crbug.com/1285378): Move this spacing to between the Feed header - // and the ContentSuggestions parent view when migrating to - // UIViewController. - [stackView.heightAnchor - constraintEqualToConstant:size.height + kMostVisitedBottomMargin], - ]]; - } -} - -// Returns the default height of the content subviews and the spacing in between -// them. -- (CGFloat)cellHeightForWidth:(CGFloat)width { - CGFloat height = 0; - if (self.mostVisitedItems) { - height += MostVisitedCellSize( - UIApplication.sharedApplication.preferredContentSizeCategory) - .height + - kMostVisitedBottomMargin; - } - if (self.shortcutsItems) { - height += MostVisitedCellSize( - UIApplication.sharedApplication.preferredContentSizeCategory) - .height + - kMostVisitedBottomMargin; - } - if (self.returnToRecentItem) { - height += (kReturnToRecentTabSize.height + - content_suggestions::kReturnToRecentTabSectionBottomMargin); - } - if (self.whatsNewItem) { - height += MostVisitedCellSize( - UIApplication.sharedApplication.preferredContentSizeCategory) - .height; - } - return height; -} - -@end - -#pragma mark - ContentSuggestionsParentCell - -@interface ContentSuggestionsParentCell () - -// StackView holding all subviews. -@property(nonatomic, strong) UIStackView* verticalStackView; - -@end - -@implementation ContentSuggestionsParentCell - -- (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { - _verticalStackView = [[UIStackView alloc] init]; - _verticalStackView.translatesAutoresizingMaskIntoConstraints = NO; - _verticalStackView.axis = UILayoutConstraintAxisVertical; - // A centered alignment will ensure the views are centered. - _verticalStackView.alignment = UIStackViewAlignmentCenter; - // A fill distribution allows for the custom spacing between elements and - // height/width configurations for each row. - _verticalStackView.distribution = UIStackViewDistributionFill; - [self.contentView addSubview:_verticalStackView]; - AddSameConstraints(self.contentView, _verticalStackView); - } - return self; -} - -- (void)addUIElement:(UIView*)view withCustomBottomSpacing:(CGFloat)spacing { - [_verticalStackView addArrangedSubview:view]; - if (spacing > 0) { - [_verticalStackView setCustomSpacing:spacing afterView:view]; - } -} -- (void)removeContentViews { - for (UIView* view in [self.verticalStackView arrangedSubviews]) { - [view removeFromSuperview]; - } -} - -- (void)prepareForReuse { - [super prepareForReuse]; - [self removeContentViews]; -} - -@end
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_return_to_recent_tab_item.h b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_return_to_recent_tab_item.h index b2eb8f8..c9ae07f 100644 --- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_return_to_recent_tab_item.h +++ b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_return_to_recent_tab_item.h
@@ -5,9 +5,6 @@ #ifndef IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CELLS_CONTENT_SUGGESTIONS_RETURN_TO_RECENT_TAB_ITEM_H_ #define IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CELLS_CONTENT_SUGGESTIONS_RETURN_TO_RECENT_TAB_ITEM_H_ -#import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h" - -#import <MaterialComponents/MaterialCollectionCells.h> #import <UIKit/UIKit.h> #import "ios/chrome/browser/ui/content_suggestions/cells/suggested_content.h" @@ -16,8 +13,7 @@ @class FaviconAttributes; // Item containing a Return to Recent Tab Start Surface tile. -@interface ContentSuggestionsReturnToRecentTabItem - : CollectionViewItem <SuggestedContent> +@interface ContentSuggestionsReturnToRecentTabItem : NSObject // Favicon image of the page of the most recent tab. @property(nonatomic, strong) UIImage* icon; @@ -33,19 +29,4 @@ @end -@interface ContentSuggestionsReturnToRecentTabCell : MDCCollectionViewCell - -// Sets the title of the most recent tab tile. -- (void)setTitle:(NSString*)title; - -// sets the subtitle of the most recent tab tile. -- (void)setSubtitle:(NSString*)subtitle; - -+ (CGSize)defaultSize; - -// Sets the image that should be displayed at the leading edge of the cell. -- (void)setIconImage:(UIImage*)image; - -@end - #endif // IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CELLS_CONTENT_SUGGESTIONS_RETURN_TO_RECENT_TAB_ITEM_H_
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_return_to_recent_tab_item.mm b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_return_to_recent_tab_item.mm index 6e55e3f..f58ac02 100644 --- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_return_to_recent_tab_item.mm +++ b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_return_to_recent_tab_item.mm
@@ -16,87 +16,9 @@ #endif @implementation ContentSuggestionsReturnToRecentTabItem -@synthesize metricsRecorded; -@synthesize suggestionIdentifier; - -- (instancetype)initWithType:(NSInteger)type { - self = [super initWithType:type]; - if (self) { - self.cellClass = [ContentSuggestionsReturnToRecentTabCell class]; - } - return self; -} - -- (void)configureCell:(ContentSuggestionsReturnToRecentTabCell*)cell { - [super configureCell:cell]; - [cell setTitle:self.title]; - [cell setSubtitle:self.subtitle]; - cell.accessibilityLabel = self.title; - if (self.icon) { - [cell setIconImage:self.icon]; - } -} - (CGFloat)cellHeightForWidth:(CGFloat)width { return kReturnToRecentTabSize.height; } @end - -#pragma mark - ContentSuggestionsReturnToRecentTabCell - -@interface ContentSuggestionsReturnToRecentTabCell () - -// Container view holding Return to Recent Tab tile. -@property(nonatomic, strong) - ContentSuggestionsReturnToRecentTabView* recentTabView; - -@end - -@implementation ContentSuggestionsReturnToRecentTabCell - -- (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { - _recentTabView = - [[ContentSuggestionsReturnToRecentTabView alloc] initWithFrame:frame]; - [self.contentView addSubview:_recentTabView]; - _recentTabView.translatesAutoresizingMaskIntoConstraints = NO; - AddSameConstraints(self.contentView, _recentTabView); - self.isAccessibilityElement = YES; - } - return self; -} - -- (void)setHighlighted:(BOOL)highlighted { - [super setHighlighted:highlighted]; - __weak ContentSuggestionsReturnToRecentTabCell* weakSelf = self; - [UIView transitionWithView:self - duration:ios::material::kDuration8 - options:UIViewAnimationOptionCurveEaseInOut - animations:^{ - weakSelf.recentTabView.backgroundColor = - highlighted ? [UIColor colorNamed:kGrey100Color] - : [UIColor clearColor]; - } - completion:nil]; -} - -- (void)setTitle:(NSString*)title { - self.recentTabView.titleLabel.text = title; -} - -- (void)setSubtitle:(NSString*)subtitle { - self.recentTabView.subtitleLabel.text = subtitle; -} - -+ (CGSize)defaultSize { - return kReturnToRecentTabSize; -} - -- (void)setIconImage:(UIImage*)image { - self.recentTabView.iconImageView.image = image; - self.recentTabView.iconImageView.hidden = image == nil; -} - -@end
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_whats_new_item.h b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_whats_new_item.h index edaf50b..652ebbe 100644 --- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_whats_new_item.h +++ b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_whats_new_item.h
@@ -5,13 +5,10 @@ #ifndef IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CELLS_CONTENT_SUGGESTIONS_WHATS_NEW_ITEM_H_ #define IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CELLS_CONTENT_SUGGESTIONS_WHATS_NEW_ITEM_H_ -#import <MaterialComponents/MaterialCollectionCells.h> - -#import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/suggested_content.h" +#import <UIKit/UIKit.h> // Item to display what is new in the ContentSuggestions. -@interface ContentSuggestionsWhatsNewItem : CollectionViewItem<SuggestedContent> +@interface ContentSuggestionsWhatsNewItem : NSObject // Icon for the promo. @property(nonatomic, strong, nullable) UIImage* icon; @@ -21,17 +18,4 @@ + (nonnull NSString*)accessibilityIdentifier; @end - -// Associated cell, displaying what is new. -@interface ContentSuggestionsWhatsNewCell : MDCCollectionViewCell - -// Sets the icon of the promo. -- (void)setIcon:(nullable UIImage*)icon; -// Sets the text displayed. -- (void)setText:(nullable NSString*)text; -// Returns the height needed by a cell contained in `width` containing `text`. -+ (CGFloat)heightForWidth:(CGFloat)width withText:(nullable NSString*)text; - -@end - #endif // IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CELLS_CONTENT_SUGGESTIONS_WHATS_NEW_ITEM_H_
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_whats_new_item.mm b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_whats_new_item.mm index 66157d83..5438add 100644 --- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_whats_new_item.mm +++ b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_whats_new_item.mm
@@ -16,134 +16,15 @@ #error "This file requires ARC support." #endif -namespace { -const CGFloat kLabelMargin = 14; -const CGFloat kLabelLineSpacing = 4; -const CGFloat kLabelIconMargin = 8; -const CGFloat kLabelFontSize = 14; -const CGFloat kIconSize = 24; -} // namespace - #pragma mark - ContentSuggestionsWhatsNewItem @implementation ContentSuggestionsWhatsNewItem @synthesize text = _text; @synthesize icon = _icon; -@synthesize suggestionIdentifier = _suggestionIdentifier; -@synthesize metricsRecorded = _metricsRecorded; - -- (instancetype)initWithType:(NSInteger)type { - self = [super initWithType:type]; - if (self) { - self.cellClass = [ContentSuggestionsWhatsNewCell class]; - } - return self; -} - -- (void)configureCell:(ContentSuggestionsWhatsNewCell*)cell { - [super configureCell:cell]; - [cell setIcon:self.icon]; - [cell setText:self.text]; - cell.accessibilityIdentifier = [[self class] accessibilityIdentifier]; -} - -- (CGFloat)cellHeightForWidth:(CGFloat)width { - return [ContentSuggestionsWhatsNewCell heightForWidth:width - withText:self.text]; -} + (NSString*)accessibilityIdentifier { return kContentSuggestionsWhatsNewIdentifier; } @end - -#pragma mark - ContentSuggestionsWhatsNewCell - -@interface ContentSuggestionsWhatsNewCell () - -// View containing all UI elements -@property(nonatomic, strong) ContentSuggestionsWhatsNewView* whatsNewView; - -@end - -@implementation ContentSuggestionsWhatsNewCell - -- (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { - _whatsNewView = - [[ContentSuggestionsWhatsNewView alloc] initWithFrame:frame]; - [self.contentView addSubview:_whatsNewView]; - _whatsNewView.translatesAutoresizingMaskIntoConstraints = NO; - AddSameConstraints(self.contentView, _whatsNewView); - } - return self; -} - -- (void)setIcon:(UIImage*)icon { - self.whatsNewView.iconView.image = icon; -} - -- (void)setText:(NSString*)text { - [[self class] configureLabel:self.whatsNewView.promoLabel withText:text]; -} - -+ (CGFloat)heightForWidth:(CGFloat)width withText:(NSString*)text { - UILabel* label = [[UILabel alloc] init]; - [self configureLabel:label withText:text]; - CGSize sizeForLabel = CGSizeMake(width - kLabelIconMargin - kIconSize, 500); - - return 2 * kLabelMargin + [label sizeThatFits:sizeForLabel].height; -} - -#pragma mark UIView - -// Implements -layoutSubviews as per instructions in documentation for -// +[MDCCollectionViewCell cr_preferredHeightForWidth:forItem:]. -- (void)layoutSubviews { - [super layoutSubviews]; - - // Adjust the text label preferredMaxLayoutWidth when the parent's width - // changes, for instance on screen rotation. - CGFloat parentWidth = CGRectGetWidth(self.contentView.bounds); - - self.whatsNewView.promoLabel.preferredMaxLayoutWidth = - parentWidth - kIconSize - kLabelIconMargin; - - // Re-layout with the new preferred width to allow the label to adjust its - // height. - [super layoutSubviews]; -} - -#pragma mark Private - -// Configures the `promoLabel` with the `text`. -+ (void)configureLabel:(UILabel*)promoLabel withText:(NSString*)text { - promoLabel.font = [UIFont systemFontOfSize:kLabelFontSize - weight:UIFontWeightRegular]; - promoLabel.textColor = [UIColor colorNamed:kTextPrimaryColor]; - promoLabel.numberOfLines = 0; - - // Sets the line spacing on the attributed string. - NSMutableParagraphStyle* style = [[NSMutableParagraphStyle alloc] init]; - [style setLineSpacing:kLabelLineSpacing]; - NSDictionary* textAttributes = @{ - NSParagraphStyleAttributeName : style, - }; - - // Sets the styling to mimic a link. - NSDictionary* linkAttributes = @{ - NSForegroundColorAttributeName : [UIColor colorNamed:kBlueColor], - NSUnderlineStyleAttributeName : @(NSUnderlineStyleSingle), - NSUnderlineColorAttributeName : [UIColor colorNamed:kBlueColor], - }; - - NSAttributedString* attributedText = - AttributedStringFromStringWithLink(text, textAttributes, linkAttributes); - - [promoLabel setAttributedText:attributedText]; -} - -@end
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_whats_new_item_unittest.mm b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_whats_new_item_unittest.mm deleted file mode 100644 index 9c897bf..0000000 --- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_whats_new_item_unittest.mm +++ /dev/null
@@ -1,50 +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. - -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_whats_new_item.h" - -#include "testing/gtest/include/gtest/gtest.h" -#include "testing/platform_test.h" -#import "third_party/ocmock/OCMock/OCMock.h" -#import "third_party/ocmock/gtest_support.h" - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -namespace { - -using ContentSuggestionsWhatsNewItemTest = PlatformTest; - -TEST_F(ContentSuggestionsWhatsNewItemTest, CellClass) { - // Setup. - ContentSuggestionsWhatsNewItem* item = - [[ContentSuggestionsWhatsNewItem alloc] initWithType:0]; - - // Action. - ContentSuggestionsWhatsNewCell* cell = [[[item cellClass] alloc] init]; - - // Test. - EXPECT_EQ([ContentSuggestionsWhatsNewCell class], [cell class]); -} - -TEST_F(ContentSuggestionsWhatsNewItemTest, Configure) { - // Setup. - UIImage* image = [[UIImage alloc] init]; - NSString* text = @"What's new test!"; - ContentSuggestionsWhatsNewItem* item = - [[ContentSuggestionsWhatsNewItem alloc] initWithType:0]; - item.icon = image; - item.text = text; - id cell = OCMClassMock([ContentSuggestionsWhatsNewCell class]); - OCMExpect([cell setIcon:image]); - OCMExpect([cell setText:text]); - - // Action. - [item configureCell:cell]; - - // Test. - ASSERT_OCMOCK_VERIFY(cell); -} -}
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_consumer.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_consumer.h deleted file mode 100644 index 2e74837..0000000 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_consumer.h +++ /dev/null
@@ -1,39 +0,0 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_COLLECTION_CONSUMER_H_ -#define IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_COLLECTION_CONSUMER_H_ - -#import "ios/chrome/browser/ui/content_suggestions/cells/suggested_content.h" - -@class CollectionViewItem; -@class ContentSuggestionsSectionInformation; -@protocol SuggestedContent; - -using CSCollectionViewItem = CollectionViewItem<SuggestedContent>; - -@protocol ContentSuggestionsCollectionConsumer - -// Informs the consumer to reload with `sections` and `items`. -- (void)reloadDataWithSections: - (NSArray<ContentSuggestionsSectionInformation*>*)sections - andItems:(NSMutableDictionary<NSNumber*, NSArray*>*)items; - -// Informs the consumer to add `sectionInfo` to the model and call `completion` -// if a section is added. If the section already exists, `completion` will not -// be called. -- (void)addSection:(ContentSuggestionsSectionInformation*)sectionInfo - withItems:(NSArray<CSCollectionViewItem*>*)items - completion:(void (^)(void))completion; - -// The section corresponding to `sectionInfo` has been invalidated and must be -// cleared now. -- (void)clearSection:(ContentSuggestionsSectionInformation*)sectionInfo; - -// Notifies the consumer that the `item` has changed. -- (void)itemHasChanged:(CollectionViewItem<SuggestedContent>*)item; - -@end - -#endif // IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_COLLECTION_CONSUMER_H_
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_view_controller.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_view_controller.h deleted file mode 100644 index 487a101..0000000 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_view_controller.h +++ /dev/null
@@ -1,99 +0,0 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_COLLECTION_VIEW_CONTROLLER_H_ -#define IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_COLLECTION_VIEW_CONTROLLER_H_ - -#import <UIKit/UIKit.h> - -#import "ios/chrome/browser/ui/collection_view/collection_view_controller.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/suggested_content.h" -#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_consumer.h" - -namespace { - -using CSCollectionViewModel = CollectionViewModel<CSCollectionViewItem*>; - -// Enum defining the type of a ContentSuggestions. -typedef NS_ENUM(NSInteger, ContentSuggestionType) { - // Use this type to pass information about an empty section. Suggestion of - // this type are empty and should not be displayed. The information to be - // displayed are contained in the SectionInfo. - ContentSuggestionTypeEmpty, - ContentSuggestionTypeMostVisited, - ContentSuggestionTypeReturnToRecentTab, - ContentSuggestionTypePromo, -}; - -// Enum defining the ItemTypes of this ContentSuggestionsViewController. -typedef NS_ENUM(NSInteger, ItemType) { - ItemTypeFooter = kItemTypeEnumZero, - ItemTypeHeader, - ItemTypeEmpty, - ItemTypeMostVisited, - ItemTypePromo, - ItemTypeReturnToRecentTab, - ItemTypeSingleCell, - ItemTypeUnknown, -}; - -// Enum defining the SectionIdentifiers of this -// ContentSuggestionsViewController. -typedef NS_ENUM(NSInteger, SectionIdentifier) { - SectionIdentifierMostVisited = kSectionIdentifierEnumZero, - SectionIdentifierLogo, - SectionIdentifierReturnToRecentTab, - SectionIdentifierPromo, - SectionIdentifierSingleCell, - SectionIdentifierDefault, -}; - -} // namespace - -@class ContentSuggestionsSectionInformation; -@protocol ContentSuggestionsActionHandler; -@protocol ContentSuggestionsCommands; -@protocol ContentSuggestionsHeaderControlling; -@protocol ContentSuggestionsMenuProvider; -@protocol ContentSuggestionsViewControllerAudience; -@protocol SuggestedContent; - -// CollectionViewController to display the suggestions items. -@interface ContentSuggestionsCollectionViewController - : CollectionViewController <ContentSuggestionsCollectionConsumer> - -// Inits view controller with `style`. -- (instancetype)initWithStyle:(CollectionViewControllerStyle)style - NS_DESIGNATED_INITIALIZER; - -- (instancetype)initWithLayout:(UICollectionViewLayout*)layout - style:(CollectionViewControllerStyle)style - NS_UNAVAILABLE; - -// Handler for the commands sent by the ContentSuggestionsViewController. -@property(nonatomic, weak) id<ContentSuggestionsCommands> - suggestionCommandHandler; -@property(nonatomic, weak) id<ContentSuggestionsViewControllerAudience> - audience; -// Override from superclass to have a more specific type. -@property(nonatomic, readonly) - CollectionViewModel<CollectionViewItem<SuggestedContent>*>* - collectionViewModel; -// Whether or not the contents section should be hidden completely. -@property(nonatomic, assign) BOOL contentSuggestionsEnabled; -// Provides information about the content suggestions header. Used to get the -// header height. -// TODO(crbug.com/1114792): Remove this and replace its call with refactored -// header synchronizer. -@property(nonatomic, weak) id<ContentSuggestionsHeaderControlling> - headerProvider; -// Delegate for handling actions relating to content suggestions. -@property(nonatomic, weak) id<ContentSuggestionsActionHandler> handler; -// Provider of menu configurations for the contentSuggestions component. -@property(nonatomic, weak) id<ContentSuggestionsMenuProvider> menuProvider; -// Returns the header view containing the logo and omnibox to be displayed. -- (UIView*)headerViewForWidth:(CGFloat)width; -@end - -#endif // IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_COLLECTION_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_view_controller.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_view_controller.mm deleted file mode 100644 index 262071a..0000000 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_view_controller.mm +++ /dev/null
@@ -1,770 +0,0 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_view_controller.h" - -#include "base/mac/foundation_util.h" -#include "base/metrics/user_metrics.h" -#include "base/metrics/user_metrics_action.h" -#include "components/strings/grit/components_strings.h" -#import "ios/chrome/browser/ui/collection_view/cells/MDCCollectionViewCell+Chrome.h" -#import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h" -#import "ios/chrome/browser/ui/collection_view/collection_view_model.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_cells_constants.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_header_item.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_item.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_cell.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_item.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_tile_view.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_parent_item.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_return_to_recent_tab_view.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_selection_actions.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_shortcut_tile_view.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_text_item.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_tile_layout_util.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_whats_new_view.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/suggested_content.h" -#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_utils.h" -#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_commands.h" -#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_constants.h" -#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.h" -#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_header_controlling.h" -#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_header_synchronizing.h" -#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_layout.h" -#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_menu_provider.h" -#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller_audience.h" -#import "ios/chrome/browser/ui/content_suggestions/identifier/content_suggestions_section_information.h" -#import "ios/chrome/browser/ui/content_suggestions/ntp_home_constant.h" -#import "ios/chrome/browser/ui/list_model/list_item+Controller.h" -#import "ios/chrome/browser/ui/ntp/new_tab_page_header_constants.h" -#import "ios/chrome/browser/ui/start_surface/start_surface_features.h" -#import "ios/chrome/browser/ui/toolbar/public/toolbar_utils.h" -#import "ios/chrome/browser/ui/ui_feature_flags.h" -#import "ios/chrome/browser/ui/util/uikit_ui_util.h" -#import "ios/chrome/common/material_timing.h" -#import "ios/chrome/common/ui/colors/semantic_color_names.h" -#import "ios/chrome/common/ui/util/constraints_ui_util.h" -#include "ui/base/l10n/l10n_util.h" -#include "url/gurl.h" - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -namespace { -const CGFloat kCardBorderRadius = 11; -} // namespace - -@interface ContentSuggestionsCollectionViewController () < - UIGestureRecognizerDelegate, - ContentSuggestionsSelectionActions> - -// The layout of the content suggestions collection view. -@property(nonatomic, strong) ContentSuggestionsLayout* layout; - -// Dictionary keyed by SectionIdentifier containing section configuration -// information. -@property(nonatomic, strong) - NSMutableDictionary<NSNumber*, ContentSuggestionsSectionInformation*>* - sectionInfoBySectionIdentifier; - -// Ordered list of sections being shown. -@property(nonatomic, strong) - NSMutableArray<ContentSuggestionsSectionInformation*>* orderedSectionsInfo; -// Whether an item of type ItemTypePromo has already been added to the model. -@property(nonatomic, assign) BOOL promoAdded; - -@end - -@implementation ContentSuggestionsCollectionViewController - -@dynamic collectionViewModel; - -#pragma mark - Lifecycle - -- (instancetype)initWithStyle:(CollectionViewControllerStyle)style { - _layout = [[ContentSuggestionsLayout alloc] init]; - self = [super initWithLayout:_layout style:style]; - return self; -} - -#pragma mark - Public - -// Removes the `section`. -- (void)dismissSection:(NSInteger)section { - if (section >= [self numberOfSectionsInCollectionView:self.collectionView]) { - return; - } - - NSInteger sectionIdentifier = - [self.collectionViewModel sectionIdentifierForSectionIndex:section]; - - [self.collectionView - performBatchUpdates:^{ - [self.collectionViewModel - removeSectionWithIdentifier:sectionIdentifier]; - [self.collectionView - deleteSections:[NSIndexSet indexSetWithIndex:section]]; - } - completion:nil]; -} - -#pragma mark - UIViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - - self.collectionView.prefetchingEnabled = NO; - // Overscroll action does not work well with content offset, so set this - // to never and internally offset the UI to account for safe area insets. - self.collectionView.contentInsetAdjustmentBehavior = - UIScrollViewContentInsetAdjustmentNever; - - self.collectionView.delegate = self; - self.collectionView.backgroundColor = ntp_home::kNTPBackgroundColor(); - self.styler.cellStyle = MDCCollectionViewCellStyleCard; - self.styler.cardBorderRadius = kCardBorderRadius; - self.styler.separatorColor = [UIColor clearColor]; - self.collectionView.translatesAutoresizingMaskIntoConstraints = NO; - - ApplyVisualConstraints(@[ @"V:|[collection]|", @"H:|[collection]|" ], - @{@"collection" : self.collectionView}); -} - -- (void)viewDidDisappear:(BOOL)animated { - [super viewDidDisappear:animated]; - if (ShouldShowReturnToMostRecentTabForStartSurface()) { - [self.audience viewDidDisappear]; - } -} - -#pragma mark - UICollectionViewDelegate - -- (void)collectionView:(UICollectionView*)collectionView - didSelectItemAtIndexPath:(NSIndexPath*)indexPath { - [super collectionView:collectionView didSelectItemAtIndexPath:indexPath]; - - CollectionViewItem* item = - [self.collectionViewModel itemAtIndexPath:indexPath]; - switch ([self contentSuggestionTypeForItem:item]) { - case ContentSuggestionTypeMostVisited: - [self.suggestionCommandHandler openMostVisitedItem:item - atIndex:indexPath.item]; - break; - case ContentSuggestionTypeReturnToRecentTab: - [self.suggestionCommandHandler openMostRecentTab]; - break; - case ContentSuggestionTypePromo: - [self dismissSection:indexPath.section]; - [self.suggestionCommandHandler handlePromoTapped]; - [self.collectionViewLayout invalidateLayout]; - break; - case ContentSuggestionTypeEmpty: - break; - } -} - -- (UICollectionViewCell*)collectionView:(UICollectionView*)collectionView - cellForItemAtIndexPath:(NSIndexPath*)indexPath { - UICollectionViewCell* cell = [super collectionView:collectionView - cellForItemAtIndexPath:indexPath]; - if ([self isMostVisitedSection:indexPath.section]) { - cell.accessibilityIdentifier = [NSString - stringWithFormat: - @"%@%li", - kContentSuggestionsMostVisitedAccessibilityIdentifierPrefix, - indexPath.row]; - // Apple doesn't handle the transparency of the background during animations - // linked to context menus. To prevent the cell from turning black during - // animations, its background is set to be the same as the NTP background. - // See: crbug.com/1120321. - cell.backgroundColor = ntp_home::kNTPBackgroundColor(); - [self.collectionViewModel itemAtIndexPath:indexPath] - .accessibilityIdentifier = cell.accessibilityIdentifier; - } - - return cell; -} - -- (UIContextMenuConfiguration*)collectionView:(UICollectionView*)collectionView - contextMenuConfigurationForItemAtIndexPath:(NSIndexPath*)indexPath - point:(CGPoint)point { - CollectionViewItem* item = - [self.collectionViewModel itemAtIndexPath:indexPath]; - - if (![item isKindOfClass:[ContentSuggestionsMostVisitedItem class]]) - return nil; - - ContentSuggestionsMostVisitedItem* contentSuggestionsItem = - base::mac::ObjCCastStrict<ContentSuggestionsMostVisitedItem>(item); - - return [self.menuProvider - contextMenuConfigurationForItem:contentSuggestionsItem - fromView:[self.collectionView - cellForItemAtIndexPath:indexPath]]; -} - -#pragma mark - UICollectionViewDelegateFlowLayout - -- (CGSize)collectionView:(UICollectionView*)collectionView - layout:(UICollectionViewLayout*)collectionViewLayout - sizeForItemAtIndexPath:(NSIndexPath*)indexPath { - if ([self isMostVisitedSection:indexPath.section]) { - return [ContentSuggestionsMostVisitedCell defaultSize]; - } - CGSize size = [super collectionView:collectionView - layout:collectionViewLayout - sizeForItemAtIndexPath:indexPath]; - return size; -} - -- (UIEdgeInsets)collectionView:(UICollectionView*)collectionView - layout:(UICollectionViewLayout*)collectionViewLayout - insetForSectionAtIndex:(NSInteger)section { - UIEdgeInsets parentInset = [super collectionView:collectionView - layout:collectionViewLayout - insetForSectionAtIndex:section]; - if ([self isHeaderSection:section] || [self isSingleCellSection:section]) { - parentInset.top = 0; - parentInset.left = 0; - parentInset.right = 0; - } else if ([self isReturnToRecentTabSection:section]) { - CGFloat collectionWidth = collectionView.bounds.size.width; - CGFloat maxCardWidth = content_suggestions::searchFieldWidth( - collectionWidth, self.traitCollection); - CGFloat margin = - MAX(0, (collectionView.frame.size.width - maxCardWidth) / 2); - parentInset.left = margin; - parentInset.right = margin; - parentInset.bottom = - content_suggestions::kReturnToRecentTabSectionBottomMargin; - } else if ([self isMostVisitedSection:section] || - [self isPromoSection:section]) { - CGFloat margin = CenteredTilesMarginForWidth( - self.traitCollection, collectionView.frame.size.width); - parentInset.left = margin; - parentInset.right = margin; - if ([self isMostVisitedSection:section]) { - parentInset.bottom = kMostVisitedBottomMargin; - } - } - return parentInset; -} - -- (CGFloat)collectionView:(UICollectionView*)collectionView - layout:(UICollectionViewLayout*) - collectionViewLayout - minimumLineSpacingForSectionAtIndex:(NSInteger)section { - if ([self isMostVisitedSection:section]) { - return kContentSuggestionsTilesVerticalSpacing; - } - return [super collectionView:collectionView - layout:collectionViewLayout - minimumLineSpacingForSectionAtIndex:section]; -} - -#pragma mark - MDCCollectionViewStylingDelegate - -- (BOOL)collectionView:(UICollectionView*)collectionView - hidesInkViewAtIndexPath:(NSIndexPath*)indexPath { - return YES; -} - -- (UIColor*)collectionView:(nonnull UICollectionView*)collectionView - cellBackgroundColorAtIndexPath:(nonnull NSIndexPath*)indexPath { - if ([self shouldUseCustomStyleForSection:indexPath.section]) { - return UIColor.clearColor; - } - return ntp_home::kNTPBackgroundColor(); -} - -- (CGSize)collectionView:(UICollectionView*)collectionView - layout: - (UICollectionViewLayout*)collectionViewLayout - referenceSizeForHeaderInSection:(NSInteger)section { - if ([self isHeaderSection:section]) { - DCHECK(!IsContentSuggestionsHeaderMigrationEnabled()); - return CGSizeMake(0, [self.headerProvider headerHeight]); - } - CGSize defaultSize = [super collectionView:collectionView - layout:collectionViewLayout - referenceSizeForHeaderInSection:section]; - if (UIContentSizeCategoryIsAccessibilityCategory( - self.traitCollection.preferredContentSizeCategory)) { - // Double the size of the header as it is now on two lines. - defaultSize.height *= 2; - } - return defaultSize; -} - -- (BOOL)collectionView:(nonnull UICollectionView*)collectionView - shouldHideItemBackgroundAtIndexPath:(nonnull NSIndexPath*)indexPath { - return [self shouldUseCustomStyleForSection:indexPath.section]; -} - -- (BOOL)collectionView:(UICollectionView*)collectionView - shouldHideHeaderBackgroundForSection:(NSInteger)section { - return [self shouldUseCustomStyleForSection:section]; -} - -- (CGFloat)collectionView:(UICollectionView*)collectionView - cellHeightAtIndexPath:(NSIndexPath*)indexPath { - CSCollectionViewItem* item = - [self.collectionViewModel itemAtIndexPath:indexPath]; - UIEdgeInsets inset = [self collectionView:collectionView - layout:collectionView.collectionViewLayout - insetForSectionAtIndex:indexPath.section]; - CGFloat width = - CGRectGetWidth(collectionView.bounds) - inset.left - inset.right; - - return [item cellHeightForWidth:width]; -} - -- (BOOL)collectionView:(UICollectionView*)collectionView - shouldHideHeaderSeparatorForSection:(NSInteger)section { - return [self shouldUseCustomStyleForSection:section]; -} - -#pragma mark - UIGestureRecognizerDelegate - -- (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer - shouldReceiveTouch:(UITouch*)touch { - return touch.view.accessibilityIdentifier != - ntp_home::FakeOmniboxAccessibilityID() && - touch.view.superview.accessibilityIdentifier != - ntp_home::FakeOmniboxAccessibilityID(); -} - -#pragma mark - ContentSuggestionsCollectionConsumer - -- (void)reloadDataWithSections: - (NSArray<ContentSuggestionsSectionInformation*>*)sections - andItems: - (NSMutableDictionary<NSNumber*, NSArray*>*)items { - [self resetModels]; - self.orderedSectionsInfo = [sections mutableCopy]; - - // The data is reset, add the new data directly in the model then reload the - // collection. - [self addSectionsForSectionInfoToModel:sections withItems:items]; - for (ContentSuggestionsSectionInformation* sectionInfo in sections) { - if (sectionInfo.sectionID == ContentSuggestionsSectionSingleCell) { - DCHECK(IsSingleCellContentSuggestionsEnabled()); - DCHECK_EQ(1.0, [items[@(sectionInfo.sectionID)] count]); - ContentSuggestionsParentItem* item = - static_cast<ContentSuggestionsParentItem*>( - items[@(sectionInfo.sectionID)][0]); - item.tapTarget = self; - item.menuProvider = self.menuProvider; - } - [self addSuggestionsToModel:items[@(sectionInfo.sectionID)] - withSectionInfo:sectionInfo]; - } - [self.collectionView reloadData]; -} - -- (void)addSection:(ContentSuggestionsSectionInformation*)sectionInfo - withItems:(NSArray<CSCollectionViewItem*>*)items - completion:(void (^)(void))completion { - SectionIdentifier sectionIdentifier = - [self sectionIdentifierForInfo:sectionInfo]; - CSCollectionViewModel* model = self.collectionViewModel; - - if ([model hasSectionForSectionIdentifier:sectionIdentifier]) - return; - - auto addSectionBlock = ^{ - NSIndexSet* addedSection = [self - addSectionsForSectionInfoToModel:@[ sectionInfo ] - withItems:@{@(sectionInfo.sectionID) : items}]; - [self.collectionView insertSections:addedSection]; - NSArray<NSIndexPath*>* addedItems = - [self addSuggestionsToModel:items withSectionInfo:sectionInfo]; - [self.collectionView insertItemsAtIndexPaths:addedItems]; - }; - - [UIView performWithoutAnimation:^{ - [self.collectionView performBatchUpdates:addSectionBlock - completion:^(BOOL finished) { - completion(); - }]; - }]; -} - -- (void)clearSection:(ContentSuggestionsSectionInformation*)sectionInfo { - SectionIdentifier sectionIdentifier = - [self sectionIdentifierForInfo:sectionInfo]; - CSCollectionViewModel* model = self.collectionViewModel; - - if (![model hasSectionForSectionIdentifier:sectionIdentifier]) - return; - - NSInteger section = [model sectionForSectionIdentifier:sectionIdentifier]; - - [self dismissSection:section]; -} - -- (void)itemHasChanged:(CollectionViewItem<SuggestedContent>*)item { - if (![self.collectionViewModel hasItem:item]) { - return; - } - if (IsSingleCellContentSuggestionsEnabled()) { - ContentSuggestionsParentItem* parentItem = - static_cast<ContentSuggestionsParentItem*>(item); - parentItem.tapTarget = self; - } - [self reconfigureCellsForItems:@[ item ]]; -} - -#pragma mark - UIAccessibilityAction - -- (BOOL)accessibilityScroll:(UIAccessibilityScrollDirection)direction { - CGFloat toolbarHeight = - ToolbarExpandedHeight(self.traitCollection.preferredContentSizeCategory); - // The collection displays the fake omnibox on the top of the other elements. - // The default scrolling action scrolls for the full height of the collection, - // hiding elements behing the fake omnibox. This reduces the scrolling by the - // height of the fake omnibox. - if (direction == UIAccessibilityScrollDirectionDown) { - CGFloat newYOffset = self.collectionView.contentOffset.y + - self.collectionView.bounds.size.height - toolbarHeight; - newYOffset = MIN(self.collectionView.contentSize.height - - self.collectionView.bounds.size.height, - newYOffset); - self.collectionView.contentOffset = - CGPointMake(self.collectionView.contentOffset.x, newYOffset); - } else if (direction == UIAccessibilityScrollDirectionUp) { - CGFloat newYOffset = self.collectionView.contentOffset.y - - self.collectionView.bounds.size.height + toolbarHeight; - newYOffset = MAX(0, newYOffset); - self.collectionView.contentOffset = - CGPointMake(self.collectionView.contentOffset.x, newYOffset); - } else { - return NO; - } - return YES; -} - -#pragma mark - ContentSuggestionsSelectionActions - -- (void)contentSuggestionsElementTapped:(UIGestureRecognizer*)sender { - if ([sender.view - isKindOfClass:[ContentSuggestionsMostVisitedTileView class]]) { - ContentSuggestionsMostVisitedTileView* mostVisitedView = - static_cast<ContentSuggestionsMostVisitedTileView*>(sender.view); - [self.suggestionCommandHandler - openMostVisitedItem:mostVisitedView.config - atIndex:mostVisitedView.config.index]; - } else if ([sender.view - isKindOfClass:[ContentSuggestionsShortcutTileView class]]) { - ContentSuggestionsShortcutTileView* shortcutView = - static_cast<ContentSuggestionsShortcutTileView*>(sender.view); - int index = static_cast<int>(shortcutView.config.index); - [self.suggestionCommandHandler openMostVisitedItem:shortcutView.config - atIndex:index]; - } else if ([sender.view isKindOfClass:[ContentSuggestionsReturnToRecentTabView - class]]) { - ContentSuggestionsReturnToRecentTabView* returnToRecentTabView = - static_cast<ContentSuggestionsReturnToRecentTabView*>(sender.view); - __weak ContentSuggestionsReturnToRecentTabView* weakRecentTabView = - returnToRecentTabView; - UIGestureRecognizerState state = sender.state; - if (state == UIGestureRecognizerStateChanged || - state == UIGestureRecognizerStateCancelled) { - // Do nothing if isn't a gesture start or end. - // If the gesture was cancelled by the system, then reset the background - // color since UIGestureRecognizerStateEnded will not be received. - if (state == UIGestureRecognizerStateCancelled) { - returnToRecentTabView.backgroundColor = [UIColor clearColor]; - } - return; - } - BOOL touchBegan = state == UIGestureRecognizerStateBegan; - [UIView transitionWithView:returnToRecentTabView - duration:ios::material::kDuration8 - options:UIViewAnimationOptionCurveEaseInOut - animations:^{ - weakRecentTabView.backgroundColor = - touchBegan ? [UIColor colorNamed:kGrey100Color] - : [UIColor clearColor]; - } - completion:nil]; - if (state == UIGestureRecognizerStateEnded) { - CGPoint point = [sender locationInView:returnToRecentTabView]; - if (point.x < 0 || point.y < 0 || - point.x > kReturnToRecentTabSize.width || - point.y > kReturnToRecentTabSize.height) { - // Reset the highlighted state and do nothing if the gesture ended - // outside of the tile. - returnToRecentTabView.backgroundColor = [UIColor clearColor]; - return; - } - [self.suggestionCommandHandler openMostRecentTab]; - } - } else if ([sender.view - isKindOfClass:[ContentSuggestionsWhatsNewView class]]) { - [self.suggestionCommandHandler handlePromoTapped]; - } -} - -#pragma mark - Private - -// Checks if the `section` is empty and add an empty element if it is the case. -// Must be called from inside a performBatchUpdates: block. -- (void)addEmptySectionPlaceholderIfNeeded:(NSInteger)section { - if ([self.collectionViewModel numberOfItemsInSection:section] > 0) - return; - - NSIndexPath* emptyItem = [self addEmptyItemForSection:section]; - if (emptyItem) - [self.collectionView insertItemsAtIndexPaths:@[ emptyItem ]]; -} - -// Returns the ContentSuggestionType associated with an ItemType `type`. -- (ContentSuggestionType)contentSuggestionTypeForItemType:(NSInteger)type { - switch (type) { - case ItemTypeEmpty: - return ContentSuggestionTypeEmpty; - case ItemTypeReturnToRecentTab: - return ContentSuggestionTypeReturnToRecentTab; - case ItemTypeMostVisited: - return ContentSuggestionTypeMostVisited; - case ItemTypePromo: - return ContentSuggestionTypePromo; - default: - return ContentSuggestionTypeEmpty; - } -} - -// Returns the item type corresponding to the section `info`. -- (ItemType)itemTypeForInfo:(ContentSuggestionsSectionInformation*)info { - switch (info.sectionID) { - case ContentSuggestionsSectionReturnToRecentTab: - return ItemTypeReturnToRecentTab; - case ContentSuggestionsSectionMostVisited: - return ItemTypeMostVisited; - case ContentSuggestionsSectionPromo: - return ItemTypePromo; - case ContentSuggestionsSectionSingleCell: - return ItemTypeSingleCell; - case ContentSuggestionsSectionLogo: - case ContentSuggestionsSectionUnknown: - return ItemTypeUnknown; - } -} - -// Returns the section identifier corresponding to the section `info`. -- (SectionIdentifier)sectionIdentifierForInfo: - (ContentSuggestionsSectionInformation*)info { - switch (info.sectionID) { - case ContentSuggestionsSectionMostVisited: - return SectionIdentifierMostVisited; - case ContentSuggestionsSectionLogo: - return SectionIdentifierLogo; - case ContentSuggestionsSectionReturnToRecentTab: - return SectionIdentifierReturnToRecentTab; - case ContentSuggestionsSectionPromo: - return SectionIdentifierPromo; - case ContentSuggestionsSectionSingleCell: - return SectionIdentifierSingleCell; - case ContentSuggestionsSectionUnknown: - return SectionIdentifierDefault; - } -} - -- (BOOL)shouldUseCustomStyleForSection:(NSInteger)section { - NSNumber* identifier = - @([self.collectionViewModel sectionIdentifierForSectionIndex:section]); - ContentSuggestionsSectionInformation* sectionInformation = - self.sectionInfoBySectionIdentifier[identifier]; - return sectionInformation.layout == ContentSuggestionsSectionLayoutCustom; -} - -- (ContentSuggestionType)contentSuggestionTypeForItem: - (CollectionViewItem*)item { - return [self contentSuggestionTypeForItemType:item.type]; -} - -- (NSArray<NSIndexPath*>*) - addSuggestionsToModel:(NSArray<CSCollectionViewItem*>*)suggestions - withSectionInfo:(ContentSuggestionsSectionInformation*)sectionInfo { - NSMutableArray<NSIndexPath*>* indexPaths = [NSMutableArray array]; - - CSCollectionViewModel* model = self.collectionViewModel; - NSInteger sectionIdentifier = [self sectionIdentifierForInfo:sectionInfo]; - - if (suggestions.count == 0) { - // No suggestions for this section. Add the item signaling this section is - // empty if there is currently no item in it. - if ([model hasSectionForSectionIdentifier:sectionIdentifier] && - [model numberOfItemsInSection:[model sectionForSectionIdentifier: - sectionIdentifier]] == 0) { - NSIndexPath* emptyItemIndexPath = - [self addEmptyItemForSection: - [model sectionForSectionIdentifier:sectionIdentifier]]; - if (emptyItemIndexPath) { - [indexPaths addObject:emptyItemIndexPath]; - } - } - return indexPaths; - } - - // Add the items from this section. - [suggestions enumerateObjectsUsingBlock:^(CSCollectionViewItem* item, - NSUInteger index, BOOL* stop) { - ItemType type = [self itemTypeForInfo:sectionInfo]; - if (type == ItemTypePromo && !self.promoAdded) { - self.promoAdded = YES; - [self.audience promoShown]; - } - item.type = type; - NSIndexPath* addedIndexPath = [self addItem:item - toSectionWithIdentifier:sectionIdentifier]; - - [indexPaths addObject:addedIndexPath]; - }]; - - return indexPaths; -} - -- (NSIndexSet*) - addSectionsForSectionInfoToModel: - (NSArray<ContentSuggestionsSectionInformation*>*)sectionsInfo - withItems:(NSDictionary<NSNumber*, NSArray*>*)items { - NSMutableIndexSet* addedSectionIdentifiers = [NSMutableIndexSet indexSet]; - - CSCollectionViewModel* model = self.collectionViewModel; - for (ContentSuggestionsSectionInformation* sectionInfo in sectionsInfo) { - NSInteger sectionIdentifier = [self sectionIdentifierForInfo:sectionInfo]; - NSArray* itemsArray = items[@(sectionInfo.sectionID)]; - if ([model hasSectionForSectionIdentifier:sectionIdentifier] || - (!sectionInfo.showIfEmpty && [itemsArray count] == 0)) { - continue; - } - - NSUInteger sectionIndex = 0; - for (ContentSuggestionsSectionInformation* orderedSectionInfo in self - .orderedSectionsInfo) { - NSInteger orderedSectionIdentifier = - [self sectionIdentifierForInfo:orderedSectionInfo]; - if (orderedSectionIdentifier == sectionIdentifier) { - break; - } - if ([model hasSectionForSectionIdentifier:orderedSectionIdentifier]) { - sectionIndex++; - } - } - [model insertSectionWithIdentifier:sectionIdentifier atIndex:sectionIndex]; - - self.sectionInfoBySectionIdentifier[@(sectionIdentifier)] = sectionInfo; - [addedSectionIdentifiers addIndex:sectionIdentifier]; - - if (sectionIdentifier == SectionIdentifierLogo) { - [self addLogoHeaderIfNeeded]; - } - } - - NSMutableIndexSet* indexSet = [NSMutableIndexSet indexSet]; - [addedSectionIdentifiers enumerateIndexesUsingBlock:^( - NSUInteger sectionIdentifier, BOOL* stop) { - [indexSet addIndex:[model sectionForSectionIdentifier:sectionIdentifier]]; - }]; - return indexSet; -} - -- (NSIndexPath*)addEmptyItemForSection:(NSInteger)section { - CSCollectionViewModel* model = self.collectionViewModel; - NSInteger sectionIdentifier = - [model sectionIdentifierForSectionIndex:section]; - ContentSuggestionsSectionInformation* sectionInfo = - self.sectionInfoBySectionIdentifier[@(sectionIdentifier)]; - - CSCollectionViewItem* item = [self emptyItemForSectionInfo:sectionInfo]; - if (!item) { - return nil; - } - return [self addItem:item toSectionWithIdentifier:sectionIdentifier]; -} - -- (BOOL)isReturnToRecentTabSection:(NSInteger)section { - return [self.collectionViewModel sectionIdentifierForSectionIndex:section] == - SectionIdentifierReturnToRecentTab; -} - -- (BOOL)isMostVisitedSection:(NSInteger)section { - return [self.collectionViewModel sectionIdentifierForSectionIndex:section] == - SectionIdentifierMostVisited; -} - -- (BOOL)isHeaderSection:(NSInteger)section { - return [self.collectionViewModel sectionIdentifierForSectionIndex:section] == - SectionIdentifierLogo; -} - -- (BOOL)isPromoSection:(NSInteger)section { - return [self.collectionViewModel sectionIdentifierForSectionIndex:section] == - SectionIdentifierPromo; -} - -- (BOOL)isSingleCellSection:(NSInteger)section { - return [self.collectionViewModel sectionIdentifierForSectionIndex:section] == - SectionIdentifierSingleCell; -} - -// Adds the header for the first section, containing the logo and the omnibox, -// if there is no header for the section. -- (void)addLogoHeaderIfNeeded { - DCHECK(!IsContentSuggestionsHeaderMigrationEnabled()); - if (![self.collectionViewModel - headerForSectionWithIdentifier:SectionIdentifierLogo]) { - ContentSuggestionsHeaderItem* header = - [[ContentSuggestionsHeaderItem alloc] initWithType:ItemTypeHeader]; - header.view = - [self headerViewForWidth:self.collectionView.bounds.size.width]; - [self.collectionViewModel setHeader:header - forSectionWithIdentifier:SectionIdentifierLogo]; - } -} - -- (UIView*)headerViewForWidth:(CGFloat)width { - return [self.headerProvider - headerForWidth:width - safeAreaInsets:[self.audience safeAreaInsetsForDiscoverFeed]]; -} - -// Resets the models, removing the current CollectionViewItem and the -// SectionInfo. -- (void)resetModels { - [self loadModel]; - self.sectionInfoBySectionIdentifier = [[NSMutableDictionary alloc] init]; -} - -// Returns a item to be displayed when the section identified by `sectionInfo` -// is empty. -// Returns nil if there is no empty item for this section info. -- (CSCollectionViewItem*)emptyItemForSectionInfo: - (ContentSuggestionsSectionInformation*)sectionInfo { - if (!sectionInfo.emptyText || !sectionInfo.expanded) - return nil; - ContentSuggestionsTextItem* item = - [[ContentSuggestionsTextItem alloc] initWithType:ItemTypeEmpty]; - item.text = l10n_util::GetNSString(IDS_NTP_TITLE_NO_SUGGESTIONS); - item.detailText = sectionInfo.emptyText; - - return item; -} - -// Adds `item` to `sectionIdentifier` section of the model of the -// CollectionView. Returns the IndexPath of the newly added item. -- (NSIndexPath*)addItem:(CSCollectionViewItem*)item - toSectionWithIdentifier:(NSInteger)sectionIdentifier { - CSCollectionViewModel* model = self.collectionViewModel; - NSInteger section = [model sectionForSectionIdentifier:sectionIdentifier]; - NSInteger itemNumber = [model numberOfItemsInSection:section]; - [model addItem:item toSectionWithIdentifier:sectionIdentifier]; - - return [NSIndexPath indexPathForItem:itemNumber inSection:section]; -} - -@end
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_commands.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_commands.h index 6fa389e..5385567 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_commands.h +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_commands.h
@@ -13,8 +13,7 @@ @protocol ContentSuggestionsCommands // Opens the Most Visited associated with this `item` at the `mostVisitedItem`. -- (void)openMostVisitedItem:(CollectionViewItem*)item - atIndex:(NSInteger)mostVisitedIndex; +- (void)openMostVisitedItem:(NSObject*)item atIndex:(NSInteger)mostVisitedIndex; // Handles the actions tapping the "Return to Recent Tab" item that returns the // user to the last opened tab. - (void)openMostRecentTab;
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.h index ad413b4..4bcd486 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.h +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.h
@@ -33,17 +33,7 @@ // YES if the coordinator has started. If YES, start is a no-op. @property(nonatomic, readonly) BOOL started; -@property(nonatomic, strong, readonly) - ContentSuggestionsHeaderViewController* headerController; - -// The CollectionView that this coordinator manages. -@property(nonatomic, strong, readonly) - UICollectionViewController* contentSuggestionsCollectionViewController; - -// The ViewController that this coordinator managers if -// kContentSuggestionsUIViewControllerMigration is enabled. -// TODO(crbug.com/1285378): remove `contentSuggestionsCollectionViewController` -// once migration is finished. +// The ViewController that this coordinator managers. @property(nonatomic, strong, readonly) ContentSuggestionsViewController* viewController; @@ -63,13 +53,6 @@ // Delegate used to communicate to communicate events to the feed. @property(nonatomic, weak) id<FeedDelegate> feedDelegate; -// Stop any scrolling in the scroll view. -- (void)stopScrolling; - -// The content inset and offset of the scroll view. -- (UIEdgeInsets)contentInset; -- (CGPoint)contentOffset; - // Reloads the suggestions. - (void)reload;
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm index cdd114e..622ec0e 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm
@@ -37,7 +37,6 @@ #import "ios/chrome/browser/ui/commands/omnibox_commands.h" #import "ios/chrome/browser/ui/commands/open_new_tab_command.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_item.h" -#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_view_controller.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_constants.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_header_commands.h" @@ -78,7 +77,6 @@ #endif @interface ContentSuggestionsCoordinator () < - AppStateObserver, ContentSuggestionsHeaderCommands, ContentSuggestionsMenuProvider, ContentSuggestionsViewControllerAudience, @@ -87,9 +85,6 @@ // StartSurfaceRecentTabObserverBridge. std::unique_ptr<StartSurfaceRecentTabObserverBridge> _startSurfaceObserver; } - -@property(nonatomic, strong) - ContentSuggestionsCollectionViewController* collectionViewController; @property(nonatomic, strong) ContentSuggestionsViewController* contentSuggestionsViewController; @property(nonatomic, strong) @@ -98,9 +93,6 @@ ContentSuggestionsHeaderSynchronizer* headerCollectionInteractionHandler; @property(nonatomic, strong) URLDragDropHandler* dragDropHandler; @property(nonatomic, strong) ActionSheetCoordinator* alertCoordinator; -// Redefined as readwrite. -@property(nonatomic, strong, readwrite) - ContentSuggestionsHeaderViewController* headerController; @property(nonatomic, assign) BOOL contentSuggestionsEnabled; // Authentication Service for the user's signed-in state. @property(nonatomic, assign) AuthenticationService* authService; @@ -138,37 +130,6 @@ prefs->GetBoolean(prefs::kArticlesForYouEnabled) && prefs->GetBoolean(prefs::kNTPContentSuggestionsEnabled); - if (!IsContentSuggestionsHeaderMigrationEnabled()) { - self.headerController = - [[ContentSuggestionsHeaderViewController alloc] init]; - // TODO(crbug.com/1045047): Use HandlerForProtocol after commands protocol - // clean up. - self.headerController.dispatcher = - static_cast<id<ApplicationCommands, BrowserCommands, OmniboxCommands, - FakeboxFocuser>>(self.browser->GetCommandDispatcher()); - self.headerController.commandHandler = self; - self.headerController.delegate = self.ntpMediator; - - self.headerController.readingListModel = - ReadingListModelFactory::GetForBrowserState( - self.browser->GetBrowserState()); - self.headerController.toolbarDelegate = self.toolbarDelegate; - - // Only handle app state for the new First Run UI. - if (base::FeatureList::IsEnabled(kEnableFREUIModuleIOS)) { - SceneState* sceneState = - SceneStateBrowserAgent::FromBrowser(self.browser)->GetSceneState(); - AppState* appState = sceneState.appState; - [appState addObserver:self]; - - // Do not focus on omnibox for voice over if there are other screens to - // show. - if (appState.initStage < InitStageFinal) { - self.headerController.focusOmniboxWhenViewAppears = NO; - } - } - } - favicon::LargeIconService* largeIconService = IOSChromeLargeIconServiceFactory::GetForBrowserState( self.browser->GetBrowserState()); @@ -204,83 +165,24 @@ self.contentSuggestionsMediator.webState = self.webState; [self configureStartSurfaceIfNeeded]; - if (!IsContentSuggestionsHeaderMigrationEnabled()) { - self.headerController.promoCanShow = - [self.contentSuggestionsMediator notificationPromo]->CanShow(); - } - - if (IsContentSuggestionsUIViewControllerMigrationEnabled()) { self.contentSuggestionsViewController = [[ContentSuggestionsViewController alloc] init]; self.contentSuggestionsViewController.suggestionCommandHandler = self.contentSuggestionsMediator; self.contentSuggestionsViewController.audience = self; self.contentSuggestionsViewController.menuProvider = self; - } else { - self.collectionViewController = - [[ContentSuggestionsCollectionViewController alloc] - initWithStyle:CollectionViewControllerStyleDefault]; - self.collectionViewController.suggestionCommandHandler = - self.contentSuggestionsMediator; - self.collectionViewController.audience = self; - self.collectionViewController.contentSuggestionsEnabled = - self.contentSuggestionsEnabled; - self.collectionViewController.menuProvider = self; - } - if (IsContentSuggestionsHeaderMigrationEnabled()) { - if (IsContentSuggestionsUIViewControllerMigrationEnabled()) { - self.contentSuggestionsMediator.consumer = - self.contentSuggestionsViewController; - } else { - self.contentSuggestionsMediator.collectionConsumer = - self.collectionViewController; - } - } + self.contentSuggestionsMediator.consumer = + self.contentSuggestionsViewController; - if (!IsContentSuggestionsHeaderMigrationEnabled()) { - self.ntpMediator.consumer = self.headerController; - } - // IsContentSuggestionsUIViewControllerMigrationEnabled() doesn't need to set - // the suggestionsViewController since it won't be retrieving an item's index - // from the CollectionView model. - if (!IsContentSuggestionsUIViewControllerMigrationEnabled()) { - self.ntpMediator.suggestionsViewController = self.collectionViewController; - } - self.ntpMediator.suggestionsMediator = self.contentSuggestionsMediator; - [self.ntpMediator setUp]; + self.ntpMediator.suggestionsMediator = self.contentSuggestionsMediator; + [self.ntpMediator setUp]; - if (!IsContentSuggestionsHeaderMigrationEnabled()) { - [self.collectionViewController - addChildViewController:self.headerController]; - [self.headerController - didMoveToParentViewController:self.collectionViewController]; - - // TODO(crbug.com/1114792): Remove header provider and use refactored - // header synchronizer instead. - self.collectionViewController.headerProvider = self.headerController; - - // Set consumer after configuring the header to ensure that view - // controller has access to it when configuring its elements. - DCHECK(self.collectionViewController.headerProvider); - self.contentSuggestionsMediator.collectionConsumer = - self.collectionViewController; - - self.collectionViewController.collectionView.accessibilityIdentifier = - kContentSuggestionsCollectionIdentifier; - } - - self.dragDropHandler = [[URLDragDropHandler alloc] init]; - self.dragDropHandler.dropDelegate = self; - if (IsContentSuggestionsUIViewControllerMigrationEnabled()) { + self.dragDropHandler = [[URLDragDropHandler alloc] init]; + self.dragDropHandler.dropDelegate = self; [self.contentSuggestionsViewController.view addInteraction:[[UIDropInteraction alloc] initWithDelegate:self.dragDropHandler]]; - } else { - [self.collectionViewController.collectionView - addInteraction:[[UIDropInteraction alloc] - initWithDelegate:self.dragDropHandler]]; - } } - (void)stop { @@ -295,27 +197,16 @@ } [self.contentSuggestionsMediator disconnect]; self.contentSuggestionsMediator = nil; - if (IsContentSuggestionsUIViewControllerMigrationEnabled()) { - self.contentSuggestionsViewController = nil; - } else { - self.collectionViewController = nil; - } + self.contentSuggestionsViewController = nil; [self.sharingCoordinator stop]; self.sharingCoordinator = nil; - self.headerController = nil; _started = NO; } - (UIViewController*)viewController { - DCHECK(IsContentSuggestionsUIViewControllerMigrationEnabled()); return self.contentSuggestionsViewController; } -- (UICollectionViewController*)contentSuggestionsCollectionViewController { - DCHECK(!IsContentSuggestionsUIViewControllerMigrationEnabled()); - return self.collectionViewController; -} - #pragma mark - Setters - (void)setWebState:(web::WebState*)webState { @@ -329,7 +220,6 @@ NotificationPromoWhatsNew* notificationPromo = [self.contentSuggestionsMediator notificationPromo]; notificationPromo->HandleViewed(); - [self.headerController setPromoCanShow:notificationPromo->CanShow()]; } - (void)viewDidDisappear { @@ -378,26 +268,7 @@ #pragma mark - Public methods - (UIView*)view { - return IsContentSuggestionsUIViewControllerMigrationEnabled() - ? self.contentSuggestionsViewController.view - : self.collectionViewController.view; -} - -- (void)stopScrolling { - UIScrollView* scrollView = self.collectionViewController.collectionView; - [scrollView setContentOffset:scrollView.contentOffset animated:NO]; -} - -- (UIEdgeInsets)contentInset { - return self.collectionViewController.collectionView.contentInset; -} - -- (CGPoint)contentOffset { - CGPoint collectionOffset = - self.collectionViewController.collectionView.contentOffset; - collectionOffset.y -= - self.headerCollectionInteractionHandler.collectionShiftingOffset; - return collectionOffset; + return self.contentSuggestionsViewController.view; } - (void)reload { @@ -442,12 +313,6 @@ NSMutableArray<UIMenuElement*>* menuElements = [[NSMutableArray alloc] init]; - NSInteger index = - IsSingleCellContentSuggestionsEnabled() - ? item.index - : [self.collectionViewController.collectionViewModel - indexPathForItem:item] - .item; CGPoint centerPoint = [view.superview convertPoint:view.center toView:nil]; @@ -455,7 +320,7 @@ [weakSelf.contentSuggestionsMediator openNewTabWithMostVisitedItem:item incognito:NO - atIndex:index + atIndex:item.index fromPoint:centerPoint]; }]]; @@ -464,7 +329,7 @@ [weakSelf.contentSuggestionsMediator openNewTabWithMostVisitedItem:item incognito:YES - atIndex:index + atIndex:item.index fromPoint:centerPoint]; }]; @@ -568,30 +433,12 @@ [[ActivityParams alloc] initWithURL:URL title:title scenario:ActivityScenario::MostVisitedEntry]; - UIViewController* contentSuggestionsVC = - IsContentSuggestionsUIViewControllerMigrationEnabled() - ? self.contentSuggestionsViewController - : self.collectionViewController; self.sharingCoordinator = [[SharingCoordinator alloc] - initWithBaseViewController:contentSuggestionsVC + initWithBaseViewController:self.contentSuggestionsViewController browser:self.browser params:params originView:view]; [self.sharingCoordinator start]; } -#pragma mark - AppStateObserver - -- (void)appState:(AppState*)appState - didTransitionFromInitStage:(InitStage)previousInitStage { - if (base::FeatureList::IsEnabled(kEnableFREUIModuleIOS)) { - if (previousInitStage == InitStageFirstRun) { - self.headerController.focusOmniboxWhenViewAppears = YES; - [self.headerController focusAccessibilityOnOmnibox]; - - [appState removeObserver:self]; - } - } -} - @end
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_favicon_mediator.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_favicon_mediator.h index 1fd7752..efb51ba 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_favicon_mediator.h +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_favicon_mediator.h
@@ -16,7 +16,6 @@ @protocol ContentSuggestionsCollectionConsumer; @protocol ContentSuggestionsConsumer; @class ContentSuggestionsMostVisitedItem; -@class ContentSuggestionsParentItem; @class FaviconAttributesProvider; class LargeIconCache; @@ -33,12 +32,6 @@ - (instancetype)init NS_UNAVAILABLE; -// The consumer that will be notified when the data change. `consumer` is used -// if kContentSuggestionsUIViewControllerMigration is enabled. -// TODO(crbug.com/1285378): remove after completion of UIViewController -// migration. -@property(nonatomic, weak) id<ContentSuggestionsCollectionConsumer> - collectionConsumer; @property(nonatomic, weak) id<ContentSuggestionsConsumer> consumer; // FaviconAttributesProvider to fetch the favicon for the most visited tiles. @@ -51,11 +44,6 @@ // Fetches the favicon for this `item`. - (void)fetchFaviconForMostVisited:(ContentSuggestionsMostVisitedItem*)item; -// Fetches the favicon for `item` within `parentItem`. -// TODO(crbug.com/1285378): Remove this after fully migrating ContentSuggestions -// to UIViewController. -- (void)fetchFaviconForMostVisited:(ContentSuggestionsMostVisitedItem*)item - parentItem:(ContentSuggestionsParentItem*)parentItem; @end
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_favicon_mediator.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_favicon_mediator.mm index 28cba5627..eefa6751 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_favicon_mediator.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_favicon_mediator.mm
@@ -8,8 +8,6 @@ #include "components/favicon/core/large_icon_service.h" #include "ios/chrome/browser/application_context.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_item.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_parent_item.h" -#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_consumer.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_consumer.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.h" #import "ios/chrome/browser/ui/content_suggestions/identifier/content_suggestions_section_information.h" @@ -71,39 +69,6 @@ _mostVisitedDataForLogging = mostVisitedData; } -- (void)fetchFaviconForMostVisited:(ContentSuggestionsMostVisitedItem*)item - parentItem:(ContentSuggestionsParentItem*)parentItem { - DCHECK(IsSingleCellContentSuggestionsEnabled()); - __weak ContentSuggestionsFaviconMediator* weakSelf = self; - __weak ContentSuggestionsMostVisitedItem* weakItem = item; - __weak ContentSuggestionsParentItem* weakParentItem = parentItem; - - void (^completion)(FaviconAttributes*) = ^(FaviconAttributes* attributes) { - ContentSuggestionsFaviconMediator* strongSelf = weakSelf; - ContentSuggestionsMostVisitedItem* strongItem = weakItem; - ContentSuggestionsParentItem* strongParentItem = weakParentItem; - if (!strongSelf || !strongItem) { - return; - } - - strongItem.attributes = attributes; - if (!parentItem) { - return; - } - for (__strong ContentSuggestionsMostVisitedItem* mvtItem in strongParentItem - .mostVisitedItems) { - if (mvtItem.index == strongItem.index) { - mvtItem = strongItem; - } - } - [strongSelf logFaviconFetchedForItem:strongItem]; - [strongSelf.collectionConsumer itemHasChanged:strongParentItem]; - }; - - [self.mostVisitedAttributesProvider fetchFaviconAttributesForURL:item.URL - completion:completion]; -} - - (void)fetchFaviconForMostVisited:(ContentSuggestionsMostVisitedItem*)item { __weak ContentSuggestionsFaviconMediator* weakSelf = self; __weak ContentSuggestionsMostVisitedItem* weakItem = item; @@ -116,11 +81,7 @@ strongItem.attributes = attributes; [strongSelf logFaviconFetchedForItem:strongItem]; - if (IsContentSuggestionsUIViewControllerMigrationEnabled()) { - [strongSelf.consumer updateMostVisitedTileConfig:strongItem]; - } else { - [strongSelf.collectionConsumer itemHasChanged:strongItem]; - } + [strongSelf.consumer updateMostVisitedTileConfig:strongItem]; }; [self.mostVisitedAttributesProvider fetchFaviconAttributesForURL:item.URL
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.h index fe998d3..60e3595 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.h +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.h
@@ -15,16 +15,6 @@ // Feature to use one NTP for all tabs in a Browser. extern const base::Feature kSingleNtp; -// Feature to use one cell for Content Suggestions -extern const base::Feature kSingleCellContentSuggestions; - -// Feature to move the Content Suggestions header view into the Discover -// ScrollView. -extern const base::Feature kContentSuggestionsHeaderMigration; - -// Feature to move the Content Suggestions ViewController to a UIViewController. -extern const base::Feature kContentSuggestionsUIViewControllerMigration; - // Feature to section the Content Suggestions into modules. extern const base::Feature kContentSuggestionsUIModuleRefresh; @@ -43,16 +33,6 @@ // Whether the Discover feed is enabled instead of the Zine feed. bool IsDiscoverFeedEnabled(); -// Whether the single cell content suggestions feature is enabled. -bool IsSingleCellContentSuggestionsEnabled(); - -// Whether the Content Suggestions header migration feature is enabled. -bool IsContentSuggestionsHeaderMigrationEnabled(); - -// Whether the Content Suggestions UIViewController migration feature is -// enabled. -bool IsContentSuggestionsUIViewControllerMigrationEnabled(); - // Whether the Content Suggestions UI Module Refresh feature is enabled. bool IsContentSuggestionsUIModuleRefreshEnabled();
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.mm index f3fb458..8f8f503 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.mm
@@ -18,19 +18,6 @@ const base::Feature kSingleNtp{"SingleNTP", base::FEATURE_ENABLED_BY_DEFAULT}; // Feature disabled by default. -const base::Feature kSingleCellContentSuggestions{ - "SingleCellContentSuggestions", base::FEATURE_ENABLED_BY_DEFAULT}; - -// Feature disabled by default. -const base::Feature kContentSuggestionsHeaderMigration{ - "ContentSuggestionsHeaderMigration", base::FEATURE_ENABLED_BY_DEFAULT}; - -// Feature disabled by default. -const base::Feature kContentSuggestionsUIViewControllerMigration{ - "ContentSuggestionsUIViewControllerMigration", - base::FEATURE_ENABLED_BY_DEFAULT}; - -// Feature disabled by default. const base::Feature kContentSuggestionsUIModuleRefresh{ "ContentSuggestionsUIModuleRefresh", base::FEATURE_DISABLED_BY_DEFAULT}; @@ -50,19 +37,6 @@ return base::FeatureList::IsEnabled(kDiscoverFeedInNtp); } -bool IsSingleCellContentSuggestionsEnabled() { - return base::FeatureList::IsEnabled(kSingleCellContentSuggestions); -} - -bool IsContentSuggestionsHeaderMigrationEnabled() { - return base::FeatureList::IsEnabled(kContentSuggestionsHeaderMigration); -} - -bool IsContentSuggestionsUIViewControllerMigrationEnabled() { - return base::FeatureList::IsEnabled( - kContentSuggestionsUIViewControllerMigration); -} - bool IsContentSuggestionsUIModuleRefreshEnabled() { return base::FeatureList::IsEnabled(kContentSuggestionsUIModuleRefresh); }
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_controlling.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_controlling.h index 1dfa011..0db1294 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_controlling.h +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_controlling.h
@@ -21,10 +21,6 @@ // ignored. @property(nonatomic, assign, getter=isShowing) BOOL showing; -// Returns the header view containing the logo and omnibox to be displayed. -- (UIView*)headerForWidth:(CGFloat)width - safeAreaInsets:(UIEdgeInsets)safeAreaInsets; - // Updates the iPhone fakebox's frame based on the current scroll view `offset` // and `width`. `width` is the width of the screen, including the space outside // the safe area. The `safeAreaInsets` is relative to the view used to calculate
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_provider.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_provider.h deleted file mode 100644 index 1952fc6e..0000000 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_provider.h +++ /dev/null
@@ -1,16 +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_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_HEADER_PROVIDER_H_ -#define IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_HEADER_PROVIDER_H_ - -// Object providing a header view for the content suggestions. -@protocol ContentSuggestionsHeaderProvider - -- (nullable UIView*)headerForWidth:(CGFloat)width - safeAreaInsets:(UIEdgeInsets)safeAreaInsets; - -@end - -#endif // IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_HEADER_PROVIDER_H_
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_synchronizer.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_synchronizer.mm index c695ecba..34cb0c8b 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_synchronizer.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_synchronizer.mm
@@ -6,11 +6,8 @@ #include "base/ios/ios_util.h" #import "base/mac/foundation_util.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_cell.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_cell.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_controlling.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_utils.h" -#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_view_controller.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_header_controlling.h" #import "ios/chrome/browser/ui/util/uikit_ui_util.h" @@ -271,17 +268,6 @@ #pragma mark - UIGestureRecognizerDelegate -- (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer - shouldReceiveTouch:(UITouch*)touch { - BOOL isMostVisitedCell = - content_suggestions::nearestAncestor( - touch.view, [ContentSuggestionsMostVisitedCell class]) != nil; - BOOL isMostVisitedActionCell = - content_suggestions::nearestAncestor( - touch.view, [ContentSuggestionsMostVisitedActionCell class]) != nil; - return !isMostVisitedCell && !isMostVisitedActionCell; -} - - (UIView*)nearestAncestorOfView:(UIView*)view withClass:(Class)aClass { if (!view) { return nil;
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.h index 4c11bcf..c10500a 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.h +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.h
@@ -8,7 +8,6 @@ #import <UIKit/UIKit.h> #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_header_controlling.h" -#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_header_provider.h" #import "ios/chrome/browser/ui/content_suggestions/ntp_home_consumer.h" #import "ios/chrome/browser/ui/ntp/logo_animation_controller.h" @@ -28,10 +27,9 @@ // the interactions between the header and the collection, and the rest of the // application. @interface ContentSuggestionsHeaderViewController - : UIViewController<ContentSuggestionsHeaderControlling, - ContentSuggestionsHeaderProvider, - NTPHomeConsumer, - LogoAnimationControllerOwnerOwner> + : UIViewController <ContentSuggestionsHeaderControlling, + NTPHomeConsumer, + LogoAnimationControllerOwnerOwner> - (instancetype)init NS_DESIGNATED_INITIALIZER; - (instancetype)initWithNibName:(NSString*)nibNameOrNil
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.mm index 9ee491a..4548124 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.mm
@@ -215,14 +215,6 @@ return AlignValueToPixel(offsetY); } -- (void)loadView { - if (IsContentSuggestionsHeaderMigrationEnabled()) { - [super loadView]; - } else { - self.view = [[ContentSuggestionsHeaderView alloc] init]; - } -} - - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; @@ -240,7 +232,7 @@ - (void)viewDidLoad { [super viewDidLoad]; - if (IsContentSuggestionsHeaderMigrationEnabled() && !self.headerView) { + if (!self.headerView) { CGFloat width = self.view.frame.size.width; self.headerView = [[ContentSuggestionsHeaderView alloc] init]; @@ -280,56 +272,6 @@ } } -#pragma mark - ContentSuggestionsHeaderProvider - -- (UIView*)headerForWidth:(CGFloat)width - safeAreaInsets:(UIEdgeInsets)safeAreaInsets { - DCHECK(!IsContentSuggestionsHeaderMigrationEnabled()); - if (!self.headerView) { - self.headerView = - base::mac::ObjCCastStrict<ContentSuggestionsHeaderView>(self.view); - [self addFakeOmnibox]; - - [self.headerView addSubview:self.logoVendor.view]; - // Fake Tap View has identity disc, which should render above the doodle. - [self addFakeTapView]; - [self.headerView addSubview:self.fakeOmnibox]; - self.logoVendor.view.translatesAutoresizingMaskIntoConstraints = NO; - self.logoVendor.view.accessibilityIdentifier = - ntp_home::NTPLogoAccessibilityID(); - self.fakeOmnibox.translatesAutoresizingMaskIntoConstraints = NO; - - [self.headerView addSeparatorToSearchField:self.fakeOmnibox]; - - // Identity disc needs to be added after the Google logo/doodle since it - // needs to respond to user taps first. - [self addIdentityDisc]; - - // -headerForView is regularly called before self.headerView has been added - // to the view hierarchy, so there's no simple way to get the correct - // safeAreaInsets. Since this situation is universally called for the full - // screen new tab animation, it's safe to check the rootViewController's - // view instead. - // TODO(crbug.com/791784) : Remove use of rootViewController. - if (self.headerView.window) { - safeAreaInsets = - self.headerView.window.rootViewController.view.safeAreaInsets; - } - width = std::max<CGFloat>( - 0, width - safeAreaInsets.left - safeAreaInsets.right); - - self.fakeOmniboxWidthConstraint = [self.fakeOmnibox.widthAnchor - constraintEqualToConstant:content_suggestions::searchFieldWidth( - width, self.traitCollection)]; - [self addConstraintsForLogoView:self.logoVendor.view - fakeOmnibox:self.fakeOmnibox - andHeaderView:self.headerView]; - - [self.logoVendor fetchDoodle]; - } - return self.headerView; -} - #pragma mark - Private // Initialize and add a search field tap target and a voice search button. @@ -511,15 +453,11 @@ self.logoVendor.isShowingDoodle, self.traitCollection)]; self.fakeOmnibox.hidden = IsRegularXRegularSizeClass(self) && !self.logoIsShowing; - if (IsContentSuggestionsHeaderMigrationEnabled()) { - [self.headerView layoutIfNeeded]; - self.headerViewHeightConstraint.constant = - content_suggestions::heightForLogoHeader( - self.logoIsShowing, self.logoVendor.isShowingDoodle, - self.promoCanShow, YES, [self topInset], self.traitCollection); - } else { - [self.collectionSynchronizer invalidateLayout]; - } + [self.headerView layoutIfNeeded]; + self.headerViewHeightConstraint.constant = + content_suggestions::heightForLogoHeader( + self.logoIsShowing, self.logoVendor.isShowingDoodle, + self.promoCanShow, YES, [self topInset], self.traitCollection); } // If Google is not the default search engine, hides the logo, doodle and @@ -561,11 +499,9 @@ self.fakeOmniboxTopMarginConstraint = [logoView.bottomAnchor constraintEqualToAnchor:fakeOmnibox.topAnchor constant:-content_suggestions::searchFieldTopMargin()]; - if (IsContentSuggestionsHeaderMigrationEnabled()) { - self.headerViewHeightConstraint = - [headerView.heightAnchor constraintEqualToConstant:[self headerHeight]]; - self.headerViewHeightConstraint.active = YES; - } + self.headerViewHeightConstraint = + [headerView.heightAnchor constraintEqualToConstant:[self headerHeight]]; + self.headerViewHeightConstraint.active = YES; self.doodleTopMarginConstraint.active = YES; self.doodleHeightConstraint.active = YES; self.fakeOmniboxWidthConstraint.active = YES; @@ -660,9 +596,7 @@ } - (CGFloat)topInset { - return IsContentSuggestionsHeaderMigrationEnabled() - ? 0 - : self.parentViewController.view.safeAreaInsets.top; + return 0; } #pragma mark - UIIndirectScribbleInteractionDelegate @@ -738,12 +672,10 @@ setConstant:content_suggestions::doodleHeight(self.logoVendor.showingLogo, doodleShowing, self.traitCollection)]; - if (IsContentSuggestionsHeaderMigrationEnabled()) { - self.headerViewHeightConstraint.constant = - content_suggestions::heightForLogoHeader( - self.logoIsShowing, self.logoVendor.isShowingDoodle, - self.promoCanShow, YES, [self topInset], self.traitCollection); - } + self.headerViewHeightConstraint.constant = + content_suggestions::heightForLogoHeader( + self.logoIsShowing, self.logoVendor.isShowingDoodle, + self.promoCanShow, YES, [self topInset], self.traitCollection); [self.commandHandler updateForHeaderSizeChange]; }
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_layout.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_layout.h deleted file mode 100644 index 7ccb1fe..0000000 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_layout.h +++ /dev/null
@@ -1,34 +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_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_LAYOUT_H_ -#define IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_LAYOUT_H_ - -#import <MaterialComponents/MDCCollectionViewFlowLayout.h> - -@protocol NewTabPageOmniboxPositioning; - -// Layout used for ContentSuggestions. It makes sure the collection is high -// enough to be scrolled up to the point the fake omnibox is hidden. For size -// classes other than RegularXRegular, this layout makes sure the fake omnibox -// is pinned to the top of the collection. -@interface ContentSuggestionsLayout : MDCCollectionViewFlowLayout - -// The parent collection view that contains the content suggestions collection -// view. -@property(nonatomic, weak) UICollectionView* parentCollectionView; - -// Provides information relating to the fake omnibox size. -@property(nonatomic, weak) id<NewTabPageOmniboxPositioning> omniboxPositioner; - -// Whether or not the user has scrolled into the feed, transferring ownership of -// the omnibox to allow it to stick to the top of the NTP. -@property(nonatomic, assign) BOOL isScrolledIntoFeed; - -// Minimum height of the NTP scroll view to allow for scrolling to omnibox. -- (CGFloat)minimumNTPHeight; - -@end - -#endif // IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_LAYOUT_H_
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_layout.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_layout.mm deleted file mode 100644 index f726232..0000000 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_layout.mm +++ /dev/null
@@ -1,195 +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. - -#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_layout.h" - -#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_utils.h" -#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.h" -#import "ios/chrome/browser/ui/ntp/new_tab_page_header_constants.h" -#import "ios/chrome/browser/ui/ntp/new_tab_page_omnibox_positioning.h" -#import "ios/chrome/browser/ui/toolbar/public/toolbar_utils.h" -#import "ios/chrome/browser/ui/util/ui_util.h" -#import "ios/chrome/browser/ui/util/uikit_ui_util.h" - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -@implementation ContentSuggestionsLayout - -- (CGFloat)minimumNTPHeight { - CGFloat collectionViewHeight = self.parentCollectionView.bounds.size.height; - CGFloat headerHeight = [self firstHeaderHeight]; - - // The minimum height for the collection view content should be the height of - // the header plus the height of the collection view minus the height of the - // NTP bottom bar. This allows the Most Visited cells to be scrolled up to the - // top of the screen. Also computes the total NTP scrolling height for - // Discover infinite feed. - CGFloat ntpHeight = collectionViewHeight + headerHeight; - CGFloat minimumHeight = - ntpHeight - ntp_header::kScrolledToTopOmniboxBottomMargin; - if (!IsRegularXRegularSizeClass(self.collectionView)) { - CGFloat toolbarHeight = - IsSplitToolbarMode(self.collectionView) - ? ToolbarExpandedHeight([UIApplication sharedApplication] - .preferredContentSizeCategory) - : 0; - CGFloat additionalHeight = - toolbarHeight + self.collectionView.contentInset.bottom; - minimumHeight -= additionalHeight; - } - - return minimumHeight; -} - -- (NSArray*)layoutAttributesForElementsInRect:(CGRect)rect { - if (IsRegularXRegularSizeClass(self.collectionView) || - IsContentSuggestionsHeaderMigrationEnabled()) - return [super layoutAttributesForElementsInRect:rect]; - - NSMutableArray* layoutAttributes = - [[super layoutAttributesForElementsInRect:rect] mutableCopy]; - UICollectionViewLayoutAttributes* fixedHeaderAttributes = nil; - NSIndexPath* fixedHeaderIndexPath = - [NSIndexPath indexPathForItem:0 inSection:0]; - - for (UICollectionViewLayoutAttributes* attributes in layoutAttributes) { - if ([attributes.representedElementKind - isEqualToString:UICollectionElementKindSectionHeader] && - attributes.indexPath.section == fixedHeaderIndexPath.section) { - fixedHeaderAttributes = [self - layoutAttributesForSupplementaryViewOfKind: - UICollectionElementKindSectionHeader - atIndexPath:fixedHeaderIndexPath]; - attributes.zIndex = fixedHeaderAttributes.zIndex; - attributes.frame = fixedHeaderAttributes.frame; - } - } - - // The fixed header's attributes are not updated if the header's default frame - // is far enough away from `rect`, which can occur when the NTP is scrolled - // up. - if (!fixedHeaderAttributes) { - UICollectionViewLayoutAttributes* fixedHeaderAttributes = - [self layoutAttributesForSupplementaryViewOfKind: - UICollectionElementKindSectionHeader - atIndexPath:fixedHeaderIndexPath]; - [layoutAttributes addObject:fixedHeaderAttributes]; - } - - return layoutAttributes; -} - -- (UICollectionViewLayoutAttributes*) -layoutAttributesForSupplementaryViewOfKind:(NSString*)kind - atIndexPath:(NSIndexPath*)indexPath { - UICollectionViewLayoutAttributes* attributes = - [super layoutAttributesForSupplementaryViewOfKind:kind - atIndexPath:indexPath]; - if (!IsSplitToolbarMode(self.collectionView) || - IsContentSuggestionsHeaderMigrationEnabled()) - return attributes; - - if ([kind isEqualToString:UICollectionElementKindSectionHeader] && - indexPath.section == 0) { - CGFloat contentOffset = self.parentCollectionView.contentOffset.y + - self.collectionView.contentSize.height; - - CGFloat headerHeight = CGRectGetHeight(attributes.frame); - CGPoint origin = attributes.frame.origin; - - // Keep the header in front of all other views. - attributes.zIndex = NSIntegerMax; - - // TODO(crbug.com/1114792): Remove this and only use omniboxPositioner after - // refactoring is complete. - CGFloat minY = - headerHeight - ntp_header::kFakeOmniboxScrolledToTopMargin - - ToolbarExpandedHeight( - [UIApplication sharedApplication].preferredContentSizeCategory) - - self.collectionView.safeAreaInsets.top; - - minY = [self.omniboxPositioner stickyOmniboxHeight]; - // TODO(crbug.com/1114792): Remove mentioned of "refactored" from the - // variable name once this launches. - BOOL hasScrolledIntoRefactoredDiscoverFeed = self.isScrolledIntoFeed; - if (contentOffset > minY && !hasScrolledIntoRefactoredDiscoverFeed) { - origin.y = contentOffset - minY; - } - attributes.frame = {origin, attributes.frame.size}; - } - return attributes; -} - -- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBound { - if (IsRegularXRegularSizeClass(self.collectionView)) - return [super shouldInvalidateLayoutForBoundsChange:newBound]; - return YES; -} - -#pragma mark - MDCCollectionViewFlowLayout overrides -// This section contains overrides of methods to avoid ugly effects during -// rotation due to the default behavior of the MDCCollectionViewFlowLayout. See -// http://crbug.com/949659 . - -- (UICollectionViewLayoutAttributes*) - initialLayoutAttributesForAppearingItemAtIndexPath: - (NSIndexPath*)itemIndexPath { - UICollectionViewLayoutAttributes* attribute = - [super initialLayoutAttributesForAppearingItemAtIndexPath:itemIndexPath]; - attribute.alpha = 0; - return attribute; -} - -- (UICollectionViewLayoutAttributes*) - initialLayoutAttributesForAppearingSupplementaryElementOfKind: - (NSString*)elementKind - atIndexPath: - (NSIndexPath*) - elementIndexPath { - UICollectionViewLayoutAttributes* attribute = [super - initialLayoutAttributesForAppearingSupplementaryElementOfKind:elementKind - atIndexPath: - elementIndexPath]; - attribute.alpha = 0; - return attribute; -} - -- (UICollectionViewLayoutAttributes*) - finalLayoutAttributesForDisappearingItemAtIndexPath: - (NSIndexPath*)itemIndexPath { - UICollectionViewLayoutAttributes* attribute = - [super finalLayoutAttributesForDisappearingItemAtIndexPath:itemIndexPath]; - attribute.alpha = 0; - return attribute; -} - -- (UICollectionViewLayoutAttributes*) - finalLayoutAttributesForDisappearingSupplementaryElementOfKind: - (NSString*)elementKind - atIndexPath: - (NSIndexPath*) - indexPath { - UICollectionViewLayoutAttributes* attribute = [super - finalLayoutAttributesForDisappearingSupplementaryElementOfKind:elementKind - atIndexPath:indexPath]; - attribute.alpha = 0; - return attribute; -} - -#pragma mark - Private. - -// Returns the height of the header of the first section. -- (CGFloat)firstHeaderHeight { - id<UICollectionViewDelegateFlowLayout> delegate = - static_cast<id<UICollectionViewDelegateFlowLayout>>( - self.collectionView.delegate); - return [delegate collectionView:self.collectionView - layout:self - referenceSizeForHeaderInSection:0] - .height; -} - -@end
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.h index dc571ce9..9359d77 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.h +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.h
@@ -11,7 +11,6 @@ #include "components/prefs/pref_service.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_gesture_commands.h" -#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_consumer.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_commands.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_consumer.h" #import "ios/chrome/browser/ui/content_suggestions/start_suggest_service_response_bridge.h" @@ -32,7 +31,6 @@ @protocol ApplicationCommands; class Browser; @protocol BrowserCoordinatorCommands; -@protocol ContentSuggestionsCollectionConsumer; @protocol FeedDelegate; class GURL; class LargeIconCache; @@ -78,8 +76,6 @@ @property(nonatomic, weak) id<FeedDelegate> feedDelegate; // The consumer that will be notified when the data change. -@property(nonatomic, weak) id<ContentSuggestionsCollectionConsumer> - collectionConsumer; @property(nonatomic, weak) id<ContentSuggestionsConsumer> consumer; // YES if the Start Surface is being shown.
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm index b077fadd..4da3721 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm
@@ -40,7 +40,6 @@ #import "ios/chrome/browser/ui/commands/snackbar_commands.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_item.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_item.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_parent_item.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_return_to_recent_tab_item.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_tile_constants.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_whats_new_item.h" @@ -131,17 +130,12 @@ // Item for the "Return to Recent Tab" tile. @property(nonatomic, strong) ContentSuggestionsReturnToRecentTabItem* returnToRecentTabItem; -// Parent Item for single cell layout. -@property(nonatomic, strong) ContentSuggestionsParentItem* parentItem; // Section Info for the What's New promo section. @property(nonatomic, strong) ContentSuggestionsSectionInformation* promoSectionInfo; // Section Info for the Most Visited section. @property(nonatomic, strong) ContentSuggestionsSectionInformation* mostVisitedSectionInfo; -// Section Info for the single cell parent item section. -@property(nonatomic, strong) - ContentSuggestionsSectionInformation* singleCellSectionInfo; // Whether the page impression has been recorded. @property(nonatomic, assign) BOOL recordedPageImpression; // Map the section information created to the relevant category. @@ -203,12 +197,8 @@ largeIconCache:largeIconCache]; _logoSectionInfo = LogoSectionInformation(); - if (IsSingleCellContentSuggestionsEnabled()) { - _singleCellSectionInfo = SingleCellSectionInformation(); - } else { - _promoSectionInfo = PromoSectionInformation(); - _mostVisitedSectionInfo = MostVisitedSectionInformation(); - } + _promoSectionInfo = PromoSectionInformation(); + _mostVisitedSectionInfo = MostVisitedSectionInformation(); _notificationPromo = std::make_unique<NotificationPromoWhatsNew>( GetApplicationContext()->GetLocalState()); @@ -253,40 +243,29 @@ } - (void)reloadAllData { - if (IsContentSuggestionsUIViewControllerMigrationEnabled()) { - if (!self.consumer) { - return; - } - if (_notificationPromo->CanShow()) { - ContentSuggestionsWhatsNewItem* item = - [[ContentSuggestionsWhatsNewItem alloc] initWithType:0]; - item.icon = _notificationPromo->GetIcon(); - item.text = base::SysUTF8ToNSString(_notificationPromo->promo_text()); - [self.consumer showWhatsNewViewWithConfig:item]; - } - if (self.returnToRecentTabItem) { - [self.consumer - showReturnToRecentTabTileWithConfig:self.returnToRecentTabItem]; - } - if ([self.mostVisitedItems count]) { - [self.consumer setMostVisitedTilesWithConfigs:self.mostVisitedItems]; - } - if (!ShouldHideShortcutsForTrendingQueries()) { - [self.consumer setShortcutTilesWithConfigs:self.actionButtonItems]; - } - if (IsTrendingQueriesModuleEnabled()) { - [self fetchTrendingQueriesIfApplicable]; - } + if (!self.consumer) { return; } - NSArray<ContentSuggestionsSectionInformation*>* sections = - [self sectionsInfo]; - NSMutableDictionary<NSNumber*, NSArray*>* items = - [[NSMutableDictionary alloc] init]; - for (ContentSuggestionsSectionInformation* section in sections) { - items[@(section.sectionID)] = [self itemsForSectionInfo:section]; + if (_notificationPromo->CanShow()) { + ContentSuggestionsWhatsNewItem* item = + [[ContentSuggestionsWhatsNewItem alloc] init]; + item.icon = _notificationPromo->GetIcon(); + item.text = base::SysUTF8ToNSString(_notificationPromo->promo_text()); + [self.consumer showWhatsNewViewWithConfig:item]; } - [self.collectionConsumer reloadDataWithSections:sections andItems:items]; + if (self.returnToRecentTabItem) { + [self.consumer + showReturnToRecentTabTileWithConfig:self.returnToRecentTabItem]; + } + if ([self.mostVisitedItems count]) { + [self.consumer setMostVisitedTilesWithConfigs:self.mostVisitedItems]; + } + if (!ShouldHideShortcutsForTrendingQueries()) { + [self.consumer setShortcutTilesWithConfigs:self.actionButtonItems]; + } + if (IsTrendingQueriesModuleEnabled()) { + [self fetchTrendingQueriesIfApplicable]; + } } - (void)blockMostVisitedURL:(GURL)URL { @@ -303,13 +282,6 @@ return _notificationPromo.get(); } -- (void)setCollectionConsumer: - (id<ContentSuggestionsCollectionConsumer>)collectionConsumer { - _collectionConsumer = collectionConsumer; - self.faviconMediator.collectionConsumer = collectionConsumer; - [self reloadAllData]; -} - - (void)setConsumer:(id<ContentSuggestionsConsumer>)consumer { _consumer = consumer; self.faviconMediator.consumer = consumer; @@ -336,7 +308,7 @@ self.returnToRecentTabSectionInfo = ReturnToRecentTabSectionInformation(); if (!self.returnToRecentTabItem) { self.returnToRecentTabItem = - [[ContentSuggestionsReturnToRecentTabItem alloc] initWithType:0]; + [[ContentSuggestionsReturnToRecentTabItem alloc] init]; } // Retrieve favicon associated with the page. @@ -359,18 +331,8 @@ webState->GetTitle()) timeString:timeLabel]; self.showMostRecentTabStartSurfaceTile = YES; - NSArray<CSCollectionViewItem*>* items = - [self itemsForSectionInfo:self.returnToRecentTabSectionInfo]; - if (IsContentSuggestionsUIViewControllerMigrationEnabled()) { - [self.consumer - showReturnToRecentTabTileWithConfig:self.returnToRecentTabItem]; - } else { - [self.collectionConsumer addSection:self.returnToRecentTabSectionInfo - withItems:items - completion:^{ - [self.feedDelegate returnToRecentTabWasAdded]; - }]; - } + [self.consumer + showReturnToRecentTabTileWithConfig:self.returnToRecentTabItem]; } - (void)hideRecentTabTile { @@ -378,33 +340,18 @@ if (self.showMostRecentTabStartSurfaceTile) { self.showMostRecentTabStartSurfaceTile = NO; self.returnToRecentTabItem = nil; - if (IsContentSuggestionsUIViewControllerMigrationEnabled()) { - [self.consumer hideReturnToRecentTabTile]; - } else { - if (IsSingleCellContentSuggestionsEnabled()) { - [self reloadAllData]; - } else { - [self.collectionConsumer - clearSection:self.returnToRecentTabSectionInfo]; - } - } + [self.consumer hideReturnToRecentTabTile]; } } - (void)hidePromo { self.shouldHidePromoAfterTap = YES; - if (IsContentSuggestionsUIViewControllerMigrationEnabled()) { - [self.consumer hideWhatsNewView]; - } else { - // By reloading data, checking `notificationPromo` will remove the promo - // view. - [self reloadAllData]; - } + [self.consumer hideWhatsNewView]; } #pragma mark - ContentSuggestionsCommands -- (void)openMostVisitedItem:(CollectionViewItem*)item +- (void)openMostVisitedItem:(NSObject*)item atIndex:(NSInteger)mostVisitedIndex { NewTabPageTabHelper* NTPHelper = NewTabPageTabHelper::FromWebState(self.webState); @@ -458,9 +405,6 @@ DCHECK(notificationPromo); notificationPromo->HandleClosed(); [self.NTPMetrics recordAction:new_tab_page_uma::ACTION_OPENED_PROMO]; - if (IsSingleCellContentSuggestionsEnabled()) { - [self hidePromo]; - } if (notificationPromo->IsURLPromo()) { UrlLoadParams params = UrlLoadParams::InNewTab(notificationPromo->url()); @@ -588,17 +532,8 @@ - (void)mostRecentTabFaviconUpdatedWithImage:(UIImage*)image { if (self.returnToRecentTabItem) { self.returnToRecentTabItem.icon = image; - if (IsContentSuggestionsUIViewControllerMigrationEnabled()) { - [self.consumer - updateReturnToRecentTabTileWithConfig:self.returnToRecentTabItem]; - } else { - if (IsSingleCellContentSuggestionsEnabled()) { - self.parentItem.returnToRecentItem = self.returnToRecentTabItem; - [self.collectionConsumer itemHasChanged:self.parentItem]; - } else { - [self.collectionConsumer itemHasChanged:self.returnToRecentTabItem]; - } - } + [self.consumer + updateReturnToRecentTabTileWithConfig:self.returnToRecentTabItem]; } } @@ -634,13 +569,7 @@ item.index = index; DCHECK(index < kShortcutMinimumIndex); index++; - if (!IsSingleCellContentSuggestionsEnabled() || - IsContentSuggestionsUIViewControllerMigrationEnabled()) { - [self.faviconMediator fetchFaviconForMostVisited:item]; - } else { - [self.faviconMediator fetchFaviconForMostVisited:item - parentItem:self.parentItem]; - } + [self.faviconMediator fetchFaviconForMostVisited:item]; [self.freshMostVisitedItems addObject:item]; } @@ -661,13 +590,7 @@ for (ContentSuggestionsMostVisitedItem* item in self.mostVisitedItems) { if (item.URL == siteURL) { - if (!IsSingleCellContentSuggestionsEnabled() || - IsContentSuggestionsUIViewControllerMigrationEnabled()) { - [self.faviconMediator fetchFaviconForMostVisited:item]; - } else { - [self.faviconMediator fetchFaviconForMostVisited:item - parentItem:self.parentItem]; - } + [self.faviconMediator fetchFaviconForMostVisited:item]; return; } } @@ -686,95 +609,11 @@ // Replaces the Most Visited items currently displayed by the most recent ones. - (void)useFreshMostVisited { self.mostVisitedItems = self.freshMostVisitedItems; - if (IsContentSuggestionsUIViewControllerMigrationEnabled()) { - [self.consumer setMostVisitedTilesWithConfigs:self.mostVisitedItems]; - } else { - // All data needs to be reloaded in order to force a re-layout, this is - // cheaper since the Feed is not part of this ViewController when Discover - // is enabled. - [self reloadAllData]; - } + [self.consumer setMostVisitedTilesWithConfigs:self.mostVisitedItems]; [self.feedDelegate contentSuggestionsWasUpdated]; } -- (NSArray<ContentSuggestionsSectionInformation*>*)sectionsInfo { - NSMutableArray<ContentSuggestionsSectionInformation*>* sectionsInfo = - [NSMutableArray array]; - - if (!IsContentSuggestionsHeaderMigrationEnabled()) { - [sectionsInfo addObject:self.logoSectionInfo]; - } - - if (IsSingleCellContentSuggestionsEnabled()) { - [sectionsInfo addObject:self.singleCellSectionInfo]; - } else { - if (self.showMostRecentTabStartSurfaceTile) { - DCHECK(IsStartSurfaceEnabled()); - [sectionsInfo addObject:self.returnToRecentTabSectionInfo]; - } - - if (_notificationPromo->CanShow()) { - [sectionsInfo addObject:self.promoSectionInfo]; - } - - [sectionsInfo addObject:self.mostVisitedSectionInfo]; - } - - return sectionsInfo; -} - -- (NSArray<CSCollectionViewItem*>*)itemsForSectionInfo: - (ContentSuggestionsSectionInformation*)sectionInfo { - NSMutableArray<CSCollectionViewItem*>* convertedSuggestions = - [NSMutableArray array]; - - if (sectionInfo == self.logoSectionInfo) { - // Section empty on purpose. - } else if (sectionInfo == self.promoSectionInfo) { - if (_notificationPromo->CanShow()) { - ContentSuggestionsWhatsNewItem* item = - [[ContentSuggestionsWhatsNewItem alloc] initWithType:0]; - item.icon = _notificationPromo->GetIcon(); - item.text = base::SysUTF8ToNSString(_notificationPromo->promo_text()); - [convertedSuggestions addObject:item]; - } - } else if (sectionInfo == self.returnToRecentTabSectionInfo) { - DCHECK(IsStartSurfaceEnabled()); - [convertedSuggestions addObject:self.returnToRecentTabItem]; - } else if (sectionInfo == self.mostVisitedSectionInfo) { - [convertedSuggestions addObjectsFromArray:self.mostVisitedItems]; - if (!ShouldHideShortcutsForStartSurface()) { - [convertedSuggestions addObjectsFromArray:self.actionButtonItems]; - } - } else if (sectionInfo == self.singleCellSectionInfo) { - if (!self.parentItem) { - self.parentItem = [[ContentSuggestionsParentItem alloc] initWithType:0]; - } - if (_notificationPromo->CanShow() && !self.shouldHidePromoAfterTap) { - ContentSuggestionsWhatsNewItem* item = - [[ContentSuggestionsWhatsNewItem alloc] initWithType:0]; - item.icon = _notificationPromo->GetIcon(); - item.text = base::SysUTF8ToNSString(_notificationPromo->promo_text()); - self.parentItem.whatsNewItem = item; - } else { - self.parentItem.whatsNewItem = nil; - } - if (self.showMostRecentTabStartSurfaceTile) { - self.parentItem.returnToRecentItem = self.returnToRecentTabItem; - } else { - self.parentItem.returnToRecentItem = nil; - } - self.parentItem.mostVisitedItems = self.mostVisitedItems; - if (!ShouldHideShortcutsForStartSurface()) { - self.parentItem.shortcutsItems = self.actionButtonItems; - } - [convertedSuggestions addObject:self.parentItem]; - } - - return convertedSuggestions; -} - // Opens the `URL` in a new tab `incognito` or not. `originPoint` is the origin // of the new tab animation if the tab is opened in background, in window // coordinates. @@ -913,11 +752,7 @@ self.readingListUnreadCount = model->unread_size(); if (self.readingListItem) { self.readingListItem.count = self.readingListUnreadCount; - if (IsContentSuggestionsUIViewControllerMigrationEnabled()) { - [self.consumer updateReadingListCount:self.readingListUnreadCount]; - } else { - [self.collectionConsumer itemHasChanged:self.readingListItem]; - } + [self.consumer updateReadingListCount:self.readingListUnreadCount]; } }
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator_unittest.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator_unittest.mm index 4f279ea..16493728 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator_unittest.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator_unittest.mm
@@ -68,12 +68,6 @@ class ContentSuggestionsMediatorTest : public PlatformTest { public: ContentSuggestionsMediatorTest() { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitWithFeatures( - {kSingleCellContentSuggestions, kContentSuggestionsHeaderMigration, - kContentSuggestionsUIViewControllerMigration}, - {}); - TestChromeBrowserState::Builder test_cbs_builder; test_cbs_builder.AddTestingFactory( IOSChromeLargeIconServiceFactory::GetInstance(), @@ -186,7 +180,7 @@ TEST_F(ContentSuggestionsMediatorTest, TestOpenMostVisited) { GURL url = GURL("http://chromium.org"); ContentSuggestionsMostVisitedItem* item = - [[ContentSuggestionsMostVisitedItem alloc] initWithType:0]; + [[ContentSuggestionsMostVisitedItem alloc] init]; item.URL = url; histogram_tester_->ExpectUniqueSample( "IOS.ContentSuggestions.ActionOnNTP",
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm index bc33707..0f3f7877 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm
@@ -13,7 +13,6 @@ #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_item.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_item.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_tile_view.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_parent_item.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_return_to_recent_tab_item.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_return_to_recent_tab_view.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_selection_actions.h"
diff --git a/ios/chrome/browser/ui/content_suggestions/mediator_util.mm b/ios/chrome/browser/ui/content_suggestions/mediator_util.mm index 211c23bb..5404039 100644 --- a/ios/chrome/browser/ui/content_suggestions/mediator_util.mm +++ b/ios/chrome/browser/ui/content_suggestions/mediator_util.mm
@@ -66,7 +66,7 @@ const ntp_tiles::NTPTile& tile, ContentSuggestionsSectionInformation* sectionInfo) { ContentSuggestionsMostVisitedItem* suggestion = - [[ContentSuggestionsMostVisitedItem alloc] initWithType:0]; + [[ContentSuggestionsMostVisitedItem alloc] init]; suggestion.title = base::SysUTF16ToNSString(tile.title); suggestion.URL = tile.url; @@ -74,10 +74,6 @@ suggestion.titleSource = tile.title_source; suggestion.accessibilityTraits = UIAccessibilityTraitButton; - suggestion.suggestionIdentifier = [[ContentSuggestionIdentifier alloc] init]; - suggestion.suggestionIdentifier.IDInSection = tile.url.spec(); - suggestion.suggestionIdentifier.sectionInfo = sectionInfo; - return suggestion; }
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm index 3ddcf9d..41ed132 100644 --- a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm +++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
@@ -137,10 +137,6 @@ config.additional_args.push_back(std::string("--") + switches::kEnableDiscoverFeed); config.features_enabled.push_back(kDiscoverFeedInNtp); - config.features_enabled.push_back(kSingleCellContentSuggestions); - config.features_enabled.push_back(kContentSuggestionsHeaderMigration); - config.features_enabled.push_back( - kContentSuggestionsUIViewControllerMigration); return config; }
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.h b/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.h index e836077..3b938b5 100644 --- a/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.h +++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.h
@@ -23,7 +23,6 @@ @protocol ContentSuggestionsCollectionControlling; @class ContentSuggestionsHeaderSynchronizer; @class ContentSuggestionsMediator; -@class ContentSuggestionsCollectionViewController; @protocol FeedControlDelegate; @class FeedMetricsRecorder; class GURL; @@ -57,12 +56,6 @@ @property(nonatomic, strong) NTPHomeMetrics* NTPMetrics; // Recorder for the metrics related to the feed. @property(nonatomic, strong) FeedMetricsRecorder* feedMetricsRecorder; -// View Controller for the NTP if using the non refactored NTP or the Feed is -// not visible. -// TODO(crbug.com/1114792): Create a protocol to avoid duplication and update -// comment. -@property(nonatomic, weak) - ContentSuggestionsCollectionViewController* suggestionsViewController; // View Controller forthe NTP if using the refactored NTP and the Feed is // visible. // TODO(crbug.com/1114792): Create a protocol to avoid duplication and update
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm index ba32fd2e..4c32aeb 100644 --- a/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm +++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm
@@ -25,9 +25,9 @@ #import "ios/chrome/browser/signin/authentication_service.h" #import "ios/chrome/browser/signin/chrome_account_manager_service.h" #import "ios/chrome/browser/signin/chrome_account_manager_service_observer_bridge.h" +#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_cells_constants.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_return_to_recent_tab_item.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_utils.h" -#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_view_controller.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_header_synchronizer.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.h" @@ -203,7 +203,7 @@ // Return to Recent tab tile is only shown one time, so subtract it's // vertical space to preserve relative scroll position from top. CGFloat tileSectionHeight = - [ContentSuggestionsReturnToRecentTabCell defaultSize].height + + kReturnToRecentTabSize.height + content_suggestions::kReturnToRecentTabSectionBottomMargin; if (scrollPosition > tileSectionHeight +
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator_unittest.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator_unittest.mm index f026b33..79376e5d 100644 --- a/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator_unittest.mm +++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator_unittest.mm
@@ -20,7 +20,6 @@ #import "ios/chrome/browser/ui/collection_view/collection_view_controller.h" #import "ios/chrome/browser/ui/collection_view/collection_view_model.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_item.h" -#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_view_controller.h" #import "ios/chrome/browser/ui/content_suggestions/ntp_home_consumer.h" #import "ios/chrome/browser/ui/ntp/logo_vendor.h" #import "ios/chrome/browser/ui/toolbar/test/toolbar_test_navigation_manager.h" @@ -61,8 +60,6 @@ navigation_manager_ = navigation_manager.get(); fake_web_state_ = std::make_unique<web::FakeWebState>(); logo_vendor_ = OCMProtocolMock(@protocol(LogoVendor)); - suggestions_view_controller_ = - OCMClassMock([ContentSuggestionsCollectionViewController class]); voice_availability_.SetVoiceProviderEnabled(true); UrlLoadingNotifierBrowserAgent::CreateForBrowser(browser_.get()); @@ -89,7 +86,6 @@ accountManagerService:accountManagerService logoVendor:logo_vendor_ voiceSearchAvailability:&voice_availability_]; - mediator_.suggestionsViewController = suggestions_view_controller_; consumer_ = OCMProtocolMock(@protocol(NTPHomeConsumer)); mediator_.consumer = consumer_; } @@ -104,7 +100,6 @@ std::unique_ptr<Browser> browser_; id consumer_; id logo_vendor_; - id suggestions_view_controller_; FakeVoiceSearchAvailability voice_availability_; NTPHomeMediator* mediator_; ToolbarTestNavigationManager* navigation_manager_;
diff --git a/ios/chrome/browser/ui/ntp/BUILD.gn b/ios/chrome/browser/ui/ntp/BUILD.gn index bc8819b5..add8d2c 100644 --- a/ios/chrome/browser/ui/ntp/BUILD.gn +++ b/ios/chrome/browser/ui/ntp/BUILD.gn
@@ -85,6 +85,7 @@ "//ios/chrome/browser/ui/main:scene_state_observer", "//ios/chrome/browser/ui/ntp:metrics", "//ios/chrome/browser/ui/ntp/feed_management", + "//ios/chrome/browser/ui/ntp/feed_top_section", "//ios/chrome/browser/ui/overscroll_actions", "//ios/chrome/browser/ui/settings/utils", "//ios/chrome/browser/ui/util", @@ -118,14 +119,6 @@ "feed_header_view_controller.h", "feed_header_view_controller.mm", "feed_menu_commands.h", - "feed_top_section_consumer.h", - "feed_top_section_coordinator.h", - "feed_top_section_coordinator.mm", - "feed_top_section_mediator.h", - "feed_top_section_mediator.mm", - "feed_top_section_view_controller.h", - "feed_top_section_view_controller.mm", - "feed_top_section_view_controller_delegate.h", "feed_wrapper_view_controller.h", "feed_wrapper_view_controller.mm", "incognito_view.h", @@ -152,7 +145,6 @@ "resources:fake_omnibox_top_gradient_color", "resources:incognito_icon", "resources:ntp_background_bottom_gradient_color", - "resources:ntp_feed_signin_promo_icon", "resources:ntp_opentabs", "resources:ntp_opentabs_clock", "resources:ntp_opentabs_header", @@ -175,7 +167,6 @@ "//components/metrics", "//components/ntp_tiles", "//components/prefs", - "//components/signin/public/identity_manager/objc", "//components/strings", "//ios/chrome/app/strings", "//ios/chrome/app/theme", @@ -191,12 +182,8 @@ "//ios/chrome/browser/ntp_tiles", "//ios/chrome/browser/reading_list", "//ios/chrome/browser/search_engines", - "//ios/chrome/browser/signin", "//ios/chrome/browser/tabs", "//ios/chrome/browser/ui:feature_flags", - "//ios/chrome/browser/ui/authentication", - "//ios/chrome/browser/ui/authentication:signin_presenter", - "//ios/chrome/browser/ui/authentication/cells", "//ios/chrome/browser/ui/bookmarks", "//ios/chrome/browser/ui/bubble", "//ios/chrome/browser/ui/commands", @@ -208,6 +195,7 @@ "//ios/chrome/browser/ui/favicon", "//ios/chrome/browser/ui/gestures", "//ios/chrome/browser/ui/icons:symbols", + "//ios/chrome/browser/ui/ntp/feed_top_section", "//ios/chrome/browser/ui/overscroll_actions", "//ios/chrome/browser/ui/settings/cells", "//ios/chrome/browser/ui/thumb_strip:public",
diff --git a/ios/chrome/browser/ui/ntp/feed_top_section/BUILD.gn b/ios/chrome/browser/ui/ntp/feed_top_section/BUILD.gn new file mode 100644 index 0000000..84c1e7409 --- /dev/null +++ b/ios/chrome/browser/ui/ntp/feed_top_section/BUILD.gn
@@ -0,0 +1,34 @@ +# Copyright 2022 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +source_set("feed_top_section") { + sources = [ + "feed_top_section_consumer.h", + "feed_top_section_coordinator.h", + "feed_top_section_coordinator.mm", + "feed_top_section_mediator.h", + "feed_top_section_mediator.mm", + "feed_top_section_view_controller.h", + "feed_top_section_view_controller.mm", + "feed_top_section_view_controller_delegate.h", + ] + configs += [ "//build/config/compiler:enable_arc" ] + deps = [ + "resources:ntp_feed_signin_promo_icon", + "//components/signin/public/identity_manager/objc", + "//ios/chrome/app/strings", + "//ios/chrome/browser/browser_state", + "//ios/chrome/browser/discover_feed:constants", + "//ios/chrome/browser/main:public", + "//ios/chrome/browser/signin", + "//ios/chrome/browser/ui/authentication", + "//ios/chrome/browser/ui/authentication:signin_presenter", + "//ios/chrome/browser/ui/authentication/cells", + "//ios/chrome/browser/ui/commands", + "//ios/chrome/browser/ui/coordinators:chrome_coordinators", + "//ios/chrome/browser/ui/ntp:constants", + "//ios/chrome/browser/ui/ntp:feature_flags", + "//ios/chrome/common/ui/colors", + ] +}
diff --git a/ios/chrome/browser/ui/ntp/feed_top_section/OWNERS b/ios/chrome/browser/ui/ntp/feed_top_section/OWNERS new file mode 100644 index 0000000..f129c37 --- /dev/null +++ b/ios/chrome/browser/ui/ntp/feed_top_section/OWNERS
@@ -0,0 +1,2 @@ +adamta@google.com +mrefaat@chromium.org \ No newline at end of file
diff --git a/ios/chrome/browser/ui/ntp/feed_top_section_consumer.h b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_consumer.h similarity index 71% rename from ios/chrome/browser/ui/ntp/feed_top_section_consumer.h rename to ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_consumer.h index 09e196f..8a9b7cc9 100644 --- a/ios/chrome/browser/ui/ntp/feed_top_section_consumer.h +++ b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_consumer.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 IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_CONSUMER_H_ -#define IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_CONSUMER_H_ +#ifndef IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_FEED_TOP_SECTION_CONSUMER_H_ +#define IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_FEED_TOP_SECTION_CONSUMER_H_ @class SigninPromoViewConfigurator; @@ -19,4 +19,4 @@ @end -#endif // IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_CONSUMER_H_ +#endif // IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_FEED_TOP_SECTION_CONSUMER_H_
diff --git a/ios/chrome/browser/ui/ntp/feed_top_section_coordinator.h b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_coordinator.h similarity index 64% rename from ios/chrome/browser/ui/ntp/feed_top_section_coordinator.h rename to ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_coordinator.h index cd29cbd..d7be4fd 100644 --- a/ios/chrome/browser/ui/ntp/feed_top_section_coordinator.h +++ b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_coordinator.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 IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_COORDINATOR_H_ -#define IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_COORDINATOR_H_ +#ifndef IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_FEED_TOP_SECTION_COORDINATOR_H_ +#define IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_FEED_TOP_SECTION_COORDINATOR_H_ #import <Foundation/Foundation.h> @@ -16,4 +16,4 @@ @end -#endif // IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_COORDINATOR_H_ +#endif // IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_FEED_TOP_SECTION_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/ntp/feed_top_section_coordinator.mm b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_coordinator.mm similarity index 92% rename from ios/chrome/browser/ui/ntp/feed_top_section_coordinator.mm rename to ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_coordinator.mm index a6f93d6..a6b33db 100644 --- a/ios/chrome/browser/ui/ntp/feed_top_section_coordinator.mm +++ b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_coordinator.mm
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import "ios/chrome/browser/ui/ntp/feed_top_section_coordinator.h" +#import "ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_coordinator.h" #import "components/signin/public/base/signin_metrics.h" #import "ios/chrome/browser/browser_state/chrome_browser_state.h" @@ -16,8 +16,8 @@ #import "ios/chrome/browser/ui/authentication/signin_promo_view_mediator.h" #import "ios/chrome/browser/ui/commands/application_commands.h" #import "ios/chrome/browser/ui/commands/command_dispatcher.h" -#import "ios/chrome/browser/ui/ntp/feed_top_section_mediator.h" -#import "ios/chrome/browser/ui/ntp/feed_top_section_view_controller.h" +#import "ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_mediator.h" +#import "ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_view_controller.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/ntp/feed_top_section_mediator.h b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_mediator.h similarity index 76% rename from ios/chrome/browser/ui/ntp/feed_top_section_mediator.h rename to ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_mediator.h index a319b6a..943b8e2 100644 --- a/ios/chrome/browser/ui/ntp/feed_top_section_mediator.h +++ b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_mediator.h
@@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_MEDIATOR_H_ -#define IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_MEDIATOR_H_ +#ifndef IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_FEED_TOP_SECTION_MEDIATOR_H_ +#define IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_FEED_TOP_SECTION_MEDIATOR_H_ #import <UIKit/UIKit.h> #import "ios/chrome/browser/ui/authentication/cells/signin_promo_view_consumer.h" -#import "ios/chrome/browser/ui/ntp/feed_top_section_view_controller_delegate.h" +#import "ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_view_controller_delegate.h" class ChromeBrowserState; @protocol FeedTopSectionConsumer; @@ -36,4 +36,4 @@ @end -#endif // IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_MEDIATOR_H_ +#endif // IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_FEED_TOP_SECTION_MEDIATOR_H_
diff --git a/ios/chrome/browser/ui/ntp/feed_top_section_mediator.mm b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_mediator.mm similarity index 96% rename from ios/chrome/browser/ui/ntp/feed_top_section_mediator.mm rename to ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_mediator.mm index 286fb54..03438db 100644 --- a/ios/chrome/browser/ui/ntp/feed_top_section_mediator.mm +++ b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_mediator.mm
@@ -2,14 +2,14 @@ // 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/ntp/feed_top_section_mediator.h" +#import "ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_mediator.h" #import "components/signin/public/identity_manager/identity_manager.h" #import "components/signin/public/identity_manager/objc/identity_manager_observer_bridge.h" #import "ios/chrome/browser/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" #import "ios/chrome/browser/ui/authentication/signin_promo_view_mediator.h" -#import "ios/chrome/browser/ui/ntp/feed_top_section_consumer.h" +#import "ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_consumer.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/ntp/feed_top_section_view_controller.h b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_view_controller.h similarity index 61% rename from ios/chrome/browser/ui/ntp/feed_top_section_view_controller.h rename to ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_view_controller.h index 6e5ed9b..0ac29fc4 100644 --- a/ios/chrome/browser/ui/ntp/feed_top_section_view_controller.h +++ b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_view_controller.h
@@ -2,14 +2,14 @@ // 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_NTP_FEED_TOP_SECTION_VIEW_CONTROLLER_H_ -#define IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_VIEW_CONTROLLER_H_ +#ifndef IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_FEED_TOP_SECTION_VIEW_CONTROLLER_H_ +#define IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_FEED_TOP_SECTION_VIEW_CONTROLLER_H_ #import <UIKit/UIKit.h> #import "ios/chrome/browser/ui/authentication/cells/signin_promo_view_delegate.h" -#import "ios/chrome/browser/ui/ntp/feed_top_section_consumer.h" -#import "ios/chrome/browser/ui/ntp/feed_top_section_view_controller_delegate.h" +#import "ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_consumer.h" +#import "ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_view_controller_delegate.h" // View Controller that contains all the elements of the Feed Top section. @interface FeedTopSectionViewController @@ -23,4 +23,4 @@ @end -#endif // IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_VIEW_CONTROLLER_H_ +#endif // IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_FEED_TOP_SECTION_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/ntp/feed_top_section_view_controller.mm b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_view_controller.mm similarity index 96% rename from ios/chrome/browser/ui/ntp/feed_top_section_view_controller.mm rename to ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_view_controller.mm index df95128..fd2c3b5 100644 --- a/ios/chrome/browser/ui/ntp/feed_top_section_view_controller.mm +++ b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_view_controller.mm
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import "ios/chrome/browser/ui/ntp/feed_top_section_view_controller.h" +#import "ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_view_controller.h" #import "base/check.h" #import "ios/chrome/browser/discover_feed/feed_constants.h" @@ -10,7 +10,7 @@ #import "ios/chrome/browser/ui/authentication/cells/signin_promo_view_configurator.h" #import "ios/chrome/browser/ui/authentication/cells/signin_promo_view_constants.h" #import "ios/chrome/browser/ui/ntp/discover_feed_constants.h" -#import "ios/chrome/browser/ui/ntp/feed_top_section_consumer.h" +#import "ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_consumer.h" #import "ios/chrome/browser/ui/ntp/new_tab_page_feature.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #import "ios/chrome/grit/ios_chromium_strings.h"
diff --git a/ios/chrome/browser/ui/ntp/feed_top_section_view_controller_delegate.h b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_view_controller_delegate.h similarity index 62% rename from ios/chrome/browser/ui/ntp/feed_top_section_view_controller_delegate.h rename to ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_view_controller_delegate.h index 6b642c4..fff59303 100644 --- a/ios/chrome/browser/ui/ntp/feed_top_section_view_controller_delegate.h +++ b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_view_controller_delegate.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_VIEW_CONTROLLER_DELEGATE_H_ -#define IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_VIEW_CONTROLLER_DELEGATE_H_ +#ifndef IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_FEED_TOP_SECTION_VIEW_CONTROLLER_DELEGATE_H_ +#define IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_FEED_TOP_SECTION_VIEW_CONTROLLER_DELEGATE_H_ @class SigninPromoViewConfigurator; @@ -16,4 +16,4 @@ @end -#endif // IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_VIEW_CONTROLLER_DELEGATE_H_ +#endif // IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_FEED_TOP_SECTION_VIEW_CONTROLLER_DELEGATE_H_
diff --git a/ios/chrome/browser/ui/ntp/feed_top_section/resources/BUILD.gn b/ios/chrome/browser/ui/ntp/feed_top_section/resources/BUILD.gn new file mode 100644 index 0000000..dc85b37 --- /dev/null +++ b/ios/chrome/browser/ui/ntp/feed_top_section/resources/BUILD.gn
@@ -0,0 +1,13 @@ +# Copyright 2022 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/ios/asset_catalog.gni") + +imageset("ntp_feed_signin_promo_icon") { + sources = [ + "ntp_feed_signin_promo_icon.imageset/Contents.json", + "ntp_feed_signin_promo_icon.imageset/ntp_feed_signin_promo_icon@2x.png", + "ntp_feed_signin_promo_icon.imageset/ntp_feed_signin_promo_icon@3x.png", + ] +}
diff --git a/ios/chrome/browser/ui/ntp/resources/ntp_feed_signin_promo_icon.imageset/Contents.json b/ios/chrome/browser/ui/ntp/feed_top_section/resources/ntp_feed_signin_promo_icon.imageset/Contents.json similarity index 100% rename from ios/chrome/browser/ui/ntp/resources/ntp_feed_signin_promo_icon.imageset/Contents.json rename to ios/chrome/browser/ui/ntp/feed_top_section/resources/ntp_feed_signin_promo_icon.imageset/Contents.json
diff --git a/ios/chrome/browser/ui/ntp/resources/ntp_feed_signin_promo_icon.imageset/ntp_feed_signin_promo_icon@2x.png b/ios/chrome/browser/ui/ntp/feed_top_section/resources/ntp_feed_signin_promo_icon.imageset/ntp_feed_signin_promo_icon@2x.png similarity index 100% rename from ios/chrome/browser/ui/ntp/resources/ntp_feed_signin_promo_icon.imageset/ntp_feed_signin_promo_icon@2x.png rename to ios/chrome/browser/ui/ntp/feed_top_section/resources/ntp_feed_signin_promo_icon.imageset/ntp_feed_signin_promo_icon@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/ntp/resources/ntp_feed_signin_promo_icon.imageset/ntp_feed_signin_promo_icon@3x.png b/ios/chrome/browser/ui/ntp/feed_top_section/resources/ntp_feed_signin_promo_icon.imageset/ntp_feed_signin_promo_icon@3x.png similarity index 100% rename from ios/chrome/browser/ui/ntp/resources/ntp_feed_signin_promo_icon.imageset/ntp_feed_signin_promo_icon@3x.png rename to ios/chrome/browser/ui/ntp/feed_top_section/resources/ntp_feed_signin_promo_icon.imageset/ntp_feed_signin_promo_icon@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.h b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.h index b51dfe0..0015c71 100644 --- a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.h +++ b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.h
@@ -54,10 +54,6 @@ @property(nonatomic, weak, readonly) id<ThumbStripSupporting> thumbStripSupporting; -// Exposes content inset of contentSuggestions collectionView to ensure all of -// content is visible under the bottom toolbar. -@property(nonatomic, readonly) UIEdgeInsets contentInset; - // Bubble presenter for displaying IPH bubbles relating to the NTP. @property(nonatomic, strong) BubblePresenter* bubblePresenter; @@ -71,8 +67,8 @@ // Stop any scrolling in the scroll view. - (void)stopScrolling; -// The content offset of the scroll view. -- (CGPoint)contentOffset; +// Whether the NTP is scrolled to the top. +- (BOOL)isScrolledToTop; // Reloads the content of the NewTabPage. Does not do anything on Incognito. - (void)reload;
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm index 0894011a..af3da7f 100644 --- a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm +++ b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm
@@ -61,7 +61,7 @@ #import "ios/chrome/browser/ui/ntp/feed_management/feed_management_navigation_delegate.h" #import "ios/chrome/browser/ui/ntp/feed_menu_commands.h" #import "ios/chrome/browser/ui/ntp/feed_metrics_recorder.h" -#import "ios/chrome/browser/ui/ntp/feed_top_section_coordinator.h" +#import "ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_coordinator.h" #import "ios/chrome/browser/ui/ntp/feed_wrapper_view_controller.h" #import "ios/chrome/browser/ui/ntp/incognito_view_controller.h" #import "ios/chrome/browser/ui/ntp/new_tab_page_content_delegate.h" @@ -290,7 +290,6 @@ self.feedMetricsRecorder.feedControlDelegate = self; self.feedMetricsRecorder.followDelegate = self; - if (IsContentSuggestionsHeaderMigrationEnabled()) { self.headerController = [[ContentSuggestionsHeaderViewController alloc] init]; // TODO(crbug.com/1045047): Use HandlerForProtocol after commands protocol @@ -321,7 +320,6 @@ self.headerController.focusOmniboxWhenViewAppears = NO; } } - } if (IsDiscoverFeedTopSyncPromoEnabled()) { self.feedTopSectionCoordinator = [self createFeedTopSectionCoordinator]; @@ -330,10 +328,8 @@ self.contentSuggestionsCoordinator = [self createContentSuggestionsCoordinator]; - if (IsContentSuggestionsHeaderMigrationEnabled()) { - self.headerController.promoCanShow = - [self.contentSuggestionsCoordinator notificationPromo]->CanShow(); - } + self.headerController.promoCanShow = + [self.contentSuggestionsCoordinator notificationPromo]->CanShow(); // Fetches feed header and conditionally fetches feed. Feed can only be // visible if feed header is visible. @@ -359,14 +355,6 @@ self.viewPresented = NO; [self updateVisible]; - if (!IsContentSuggestionsHeaderMigrationEnabled()) { - // Unfocus omnibox, to prevent it from lingering when it should be dismissed - // (for example, when navigating away or when changing feed visibility). - id<OmniboxCommands> omniboxCommandHandler = HandlerForProtocol( - self.browser->GetCommandDispatcher(), OmniboxCommands); - [omniboxCommandHandler cancelOmniboxEdit]; - } - SceneState* sceneState = SceneStateBrowserAgent::FromBrowser(self.browser)->GetSceneState(); [sceneState removeObserver:self]; @@ -451,14 +439,8 @@ - (void)configureNTPViewController { DCHECK(self.ntpViewController); - if (IsContentSuggestionsUIViewControllerMigrationEnabled()) { - self.ntpViewController.contentSuggestionsViewController = - self.contentSuggestionsCoordinator.viewController; - } else { - self.ntpViewController.contentSuggestionsCollectionViewController = - self.contentSuggestionsCoordinator - .contentSuggestionsCollectionViewController; - } + self.ntpViewController.contentSuggestionsViewController = + self.contentSuggestionsCoordinator.viewController; self.ntpViewController.panGestureHandler = self.panGestureHandler; self.ntpViewController.feedVisible = [self isFeedVisible]; @@ -472,16 +454,16 @@ self.headerSynchronizer = [[ContentSuggestionsHeaderSynchronizer alloc] initWithCollectionController:self.ntpViewController - headerController:[self headerController]]; + headerController:self.headerController]; self.ntpViewController.feedWrapperViewController = self.feedWrapperViewController; self.ntpViewController.overscrollDelegate = self; self.ntpViewController.ntpContentDelegate = self; self.ntpViewController.identityDiscButton = - [[self headerController] identityDiscButton]; + [self.headerController identityDiscButton]; - self.ntpViewController.headerController = [self headerController]; + self.ntpViewController.headerController = self.headerController; [self configureMainViewControllerUsing:self.ntpViewController]; self.ntpViewController.feedMetricsRecorder = self.feedMetricsRecorder; @@ -539,12 +521,8 @@ [self.ntpViewController stopScrolling]; } -- (UIEdgeInsets)contentInset { - return [self.contentSuggestionsCoordinator contentInset]; -} - -- (CGPoint)contentOffset { - return [self.contentSuggestionsCoordinator contentOffset]; +- (BOOL)isScrolledToTop { + return [self.ntpViewController isNTPScrolledToTop]; } - (void)willUpdateSnapshot { @@ -557,7 +535,7 @@ if (self.feedViewController) { [self.ntpViewController focusFakebox]; } else { - [[self headerController] focusFakebox]; + [self.headerController focusFakebox]; } } @@ -816,11 +794,10 @@ - (void)appState:(AppState*)appState didTransitionFromInitStage:(InitStage)previousInitStage { - DCHECK(IsContentSuggestionsHeaderMigrationEnabled()); if (base::FeatureList::IsEnabled(kEnableFREUIModuleIOS)) { if (previousInitStage == InitStageFirstRun) { - [self headerController].focusOmniboxWhenViewAppears = YES; - [[self headerController] focusAccessibilityOnOmnibox]; + self.headerController.focusOmniboxWhenViewAppears = YES; + [self.headerController focusAccessibilityOnOmnibox]; [appState removeObserver:self]; } @@ -830,7 +807,7 @@ #pragma mark - LogoAnimationControllerOwnerOwner - (id<LogoAnimationControllerOwner>)logoAnimationControllerOwner { - return [[self headerController] logoAnimationControllerOwner]; + return [self.headerController logoAnimationControllerOwner]; } #pragma mark - SceneStateObserver @@ -937,7 +914,7 @@ - (UIView*)toolbarSnapshotViewForOverscrollActionsController: (OverscrollActionsController*)controller { return - [[[self headerController] toolBarView] snapshotViewAfterScreenUpdates:NO]; + [[self.headerController toolBarView] snapshotViewAfterScreenUpdates:NO]; } - (UIView*)headerViewForOverscrollActionsController: @@ -952,7 +929,7 @@ - (CGFloat)headerHeightForOverscrollActionsController: (OverscrollActionsController*)controller { - CGFloat height = [[self headerController] toolBarView].bounds.size.height; + CGFloat height = [self.headerController toolBarView].bounds.size.height; CGFloat topInset = self.feedWrapperViewController.view.safeAreaInsets.top; return height + topInset; } @@ -971,14 +948,10 @@ #pragma mark - NewTabPageContentDelegate - (void)reloadContentSuggestions { - if (IsContentSuggestionsHeaderMigrationEnabled() && - IsContentSuggestionsUIViewControllerMigrationEnabled()) { - // No need to reload ContentSuggestions since the mediator receives all - // model state changes and immediately updates the consumer with the new - // state. - return; - } - [self.contentSuggestionsCoordinator reload]; + // No need to reload ContentSuggestions since the mediator receives all + // model state changes and immediately updates the consumer with the new + // state. + return; } - (BOOL)isContentHeaderSticky { @@ -1096,16 +1069,6 @@ } } -// TODO(crbug.com/1285378): Remove this after -// kContentSuggestionsHeaderMigrationEnabled is launched. -- (ContentSuggestionsHeaderViewController*)headerController { - if (IsContentSuggestionsHeaderMigrationEnabled()) { - return _headerController; - } else { - return self.contentSuggestionsCoordinator.headerController; - } -} - // Feed header is always visible unless it is disabled from the Chrome settings // menu, or by an enterprise policy. - (BOOL)isFeedHeaderVisible { @@ -1200,17 +1163,10 @@ initWithBaseViewController:nil browser:self.browser]; contentSuggestionsCoordinator.webState = self.webState; - if (!IsContentSuggestionsHeaderMigrationEnabled()) { - contentSuggestionsCoordinator.toolbarDelegate = self.toolbarDelegate; - } contentSuggestionsCoordinator.ntpMediator = self.ntpMediator; contentSuggestionsCoordinator.ntpDelegate = self; contentSuggestionsCoordinator.feedDelegate = self; [contentSuggestionsCoordinator start]; - if (!IsContentSuggestionsHeaderMigrationEnabled()) { - contentSuggestionsCoordinator.headerController.baseViewController = - self.baseViewController; - } return contentSuggestionsCoordinator; }
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.h b/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.h index 610099e..54c33a25 100644 --- a/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.h +++ b/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.h
@@ -51,12 +51,6 @@ // ContentSuggestions. @property(nonatomic, weak) UIButton* identityDiscButton; -// View controller representing the NTP content suggestions. These suggestions -// include the most visited site tiles, the shortcut tiles, the fake omnibox and -// the Google doodle. `contentSuggestionsUIViewController` is used if -// kContentSuggestionsUIViewControllerMigration is enabled. -@property(nonatomic, strong) - UICollectionViewController* contentSuggestionsCollectionViewController; @property(nonatomic, strong) ContentSuggestionsViewController* contentSuggestionsViewController;
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.mm b/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.mm index 3ff0108..251fcd5 100644 --- a/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.mm +++ b/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.mm
@@ -13,13 +13,12 @@ #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_header_synchronizing.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.h" -#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_layout.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.h" #import "ios/chrome/browser/ui/content_suggestions/ntp_home_constant.h" #import "ios/chrome/browser/ui/gestures/view_revealing_vertical_pan_handler.h" #import "ios/chrome/browser/ui/ntp/feed_header_view_controller.h" #import "ios/chrome/browser/ui/ntp/feed_metrics_recorder.h" -#import "ios/chrome/browser/ui/ntp/feed_top_section_view_controller.h" +#import "ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_view_controller.h" #import "ios/chrome/browser/ui/ntp/feed_wrapper_view_controller.h" #import "ios/chrome/browser/ui/ntp/new_tab_page_constants.h" #import "ios/chrome/browser/ui/ntp/new_tab_page_content_delegate.h" @@ -57,10 +56,6 @@ // Whether or not the fake omnibox is pineed to the top of the NTP. @property(nonatomic, assign) BOOL fakeOmniboxPinnedToTop; -// The collection view layout for the uppermost content suggestions collection -// view. -@property(nonatomic, weak) ContentSuggestionsLayout* contentSuggestionsLayout; - // Constraint to determine the height of the contained ContentSuggestions view. @property(nonatomic, strong) NSLayoutConstraint* contentSuggestionsHeightConstraint; @@ -111,11 +106,11 @@ [super viewDidLoad]; DCHECK(self.feedWrapperViewController); - DCHECK([self contentSuggestionsViewController]); + DCHECK(self.contentSuggestionsViewController); // TODO(crbug.com/1262536): Remove this when bug is fixed. [self.feedWrapperViewController loadViewIfNeeded]; - [[self contentSuggestionsViewController] loadViewIfNeeded]; + [self.contentSuggestionsViewController loadViewIfNeeded]; // Prevent the NTP from spilling behind the toolbar and tab strip. self.view.clipsToBounds = YES; @@ -129,22 +124,6 @@ singleTapRecognizer.delegate = self; [self.view addGestureRecognizer:singleTapRecognizer]; - if (!IsContentSuggestionsUIViewControllerMigrationEnabled()) { - // Ensures that there is never any nested scrolling, since we are nesting - // the content suggestions collection view in the feed collection view. - self.contentSuggestionsCollectionViewController.collectionView.bounces = NO; - self.contentSuggestionsCollectionViewController.collectionView - .alwaysBounceVertical = NO; - self.contentSuggestionsCollectionViewController.collectionView - .scrollEnabled = NO; - - self.contentSuggestionsLayout = static_cast<ContentSuggestionsLayout*>( - self.contentSuggestionsCollectionViewController.collectionView - .collectionViewLayout); - self.contentSuggestionsLayout.isScrolledIntoFeed = self.isScrolledIntoFeed; - self.contentSuggestionsLayout.omniboxPositioner = self; - } - if (IsContentSuggestionsUIModuleRefreshEnabled()) { GradientView* gradientView = [[GradientView alloc] initWithTopColor:[UIColor colorNamed:kBackgroundColor] @@ -263,9 +242,6 @@ weakSelf.collectionView.contentOffset = CGPointMake(0, yOffsetBeforeRotation - heightAboveFeedDifference); [weakSelf updateNTPLayout]; - } else if (!IsContentSuggestionsUIViewControllerMigrationEnabled()) { - [weakSelf.contentSuggestionsCollectionViewController.collectionView - .collectionViewLayout invalidateLayout]; } [weakSelf.view setNeedsLayout]; [weakSelf.view layoutIfNeeded]; @@ -304,17 +280,13 @@ // height. self.headerTopAnchor.constant = -([self stickyOmniboxHeight] + [self feedHeaderHeight]); - [[self contentSuggestionsViewController].view setNeedsLayout]; - [[self contentSuggestionsViewController].view layoutIfNeeded]; + [self.contentSuggestionsViewController.view setNeedsLayout]; + [self.contentSuggestionsViewController.view layoutIfNeeded]; [self.ntpContentDelegate reloadContentSuggestions]; } if (previousTraitCollection.preferredContentSizeCategory != self.traitCollection.preferredContentSizeCategory) { - if (!IsContentSuggestionsUIViewControllerMigrationEnabled()) { - [self.contentSuggestionsCollectionViewController.collectionView - .collectionViewLayout invalidateLayout]; - } [self.headerSynchronizer updateFakeOmniboxForScrollPosition]; } @@ -326,7 +298,7 @@ - (void)layoutContentInParentCollectionView { DCHECK(self.feedWrapperViewController); - DCHECK([self contentSuggestionsViewController]); + DCHECK(self.contentSuggestionsViewController); // Ensure the view is loaded so we can set the accessibility identifier. [self.feedWrapperViewController loadViewIfNeeded]; @@ -343,11 +315,10 @@ // Configures the content suggestions in the view hierarchy. // TODO(crbug.com/1262536): Remove this when issue is fixed. - if ([self contentSuggestionsViewController].parentViewController) { - [[self contentSuggestionsViewController] - willMoveToParentViewController:nil]; - [[self contentSuggestionsViewController].view removeFromSuperview]; - [[self contentSuggestionsViewController] removeFromParentViewController]; + if (self.contentSuggestionsViewController.parentViewController) { + [self.contentSuggestionsViewController willMoveToParentViewController:nil]; + [self.contentSuggestionsViewController.view removeFromSuperview]; + [self.contentSuggestionsViewController removeFromParentViewController]; [self.feedMetricsRecorder recordBrokenNTPHierarchy:BrokenNTPHierarchyRelationship:: kContentSuggestionsReset]; @@ -364,11 +335,8 @@ [self addViewController:self.feedHeaderViewController toParentViewController:parentViewController]; } - [self addViewController:[self contentSuggestionsViewController] + [self addViewController:self.contentSuggestionsViewController toParentViewController:parentViewController]; - if (!IsContentSuggestionsUIViewControllerMigrationEnabled()) { - self.contentSuggestionsLayout.parentCollectionView = self.collectionView; - } // Adds the feed top section to the view hierarchy if it exists. if (IsDiscoverFeedTopSyncPromoEnabled() && @@ -377,28 +345,26 @@ toParentViewController:parentViewController]; } - if (IsContentSuggestionsHeaderMigrationEnabled()) { [self addViewController:self.headerController toParentViewController:parentViewController]; DCHECK([self.headerController.view isDescendantOfView:self.containerView]); self.headerController.view.translatesAutoresizingMaskIntoConstraints = NO; - } - // TODO(crbug.com/1170995): The contentCollectionView width might be narrower - // than the ContentSuggestions view. This causes elements to be hidden, so we - // set clipsToBounds to ensure that they remain visible. The collection view - // changes, so we must set this property each time it does. - self.collectionView.clipsToBounds = NO; + // TODO(crbug.com/1170995): The contentCollectionView width might be + // narrower than the ContentSuggestions view. This causes elements to be + // hidden, so we set clipsToBounds to ensure that they remain visible. The + // collection view changes, so we must set this property each time it does. + self.collectionView.clipsToBounds = NO; - [self.overscrollActionsController invalidate]; - [self configureOverscrollActionsController]; + [self.overscrollActionsController invalidate]; + [self configureOverscrollActionsController]; - // If viewDidAppear, then we are just changing the NTP collection view. In - // that case, we apply the constraints here. - if (self.viewDidAppear) { - [self applyCollectionViewConstraints]; - } + // If viewDidAppear, then we are just changing the NTP collection view. In + // that case, we apply the constraints here. + if (self.viewDidAppear) { + [self applyCollectionViewConstraints]; + } // If the feed is not visible, we control the delegate ourself (since it is // otherwise controlled by the feed service). The view is also layed out @@ -443,10 +409,6 @@ // presented in front of the NTP. [self.headerSynchronizer updateFakeOmniboxOnNewWidth:self.collectionView.bounds.size.width]; - if (!IsContentSuggestionsUIViewControllerMigrationEnabled()) { - [self.contentSuggestionsCollectionViewController.collectionView - .collectionViewLayout invalidateLayout]; - } // Ensure initial fake omnibox layout. [self.headerSynchronizer updateFakeOmniboxForScrollPosition]; @@ -469,17 +431,15 @@ - (CGFloat)heightAboveFeed { CGFloat height = [self adjustedContentSuggestionsHeight] + [self feedHeaderHeight] + [self feedTopSectionHeight]; - if (IsContentSuggestionsHeaderMigrationEnabled()) { - // Add the header height since it is no longer a part of the Content - // Suggestions. - height += [self.headerController headerHeight]; - } + // Add the header height since it is no longer a part of the Content + // Suggestions. + height += [self.headerController headerHeight]; return height; } - (void)resetViewHierarchy { [self removeFromViewHierarchy:self.feedWrapperViewController]; - [self removeFromViewHierarchy:[self contentSuggestionsViewController]]; + [self removeFromViewHierarchy:self.contentSuggestionsViewController]; if (self.feedHeaderViewController) { [self removeFromViewHierarchy:self.feedHeaderViewController]; } @@ -529,14 +489,6 @@ #pragma mark - UIScrollViewDelegate - (void)scrollViewDidScroll:(UIScrollView*)scrollView { - // Scroll events should not be handled until the content suggestions have been - // layed out. - if (!IsContentSuggestionsUIViewControllerMigrationEnabled() && - !self.contentSuggestionsCollectionViewController.collectionView - .contentSize.height) { - return; - } - [self.overscrollActionsController scrollViewDidScroll:scrollView]; [self.panGestureHandler scrollViewDidScroll:scrollView]; [self.headerSynchronizer updateFakeOmniboxForScrollPosition]; @@ -544,13 +496,6 @@ [self updateScrolledToMinimumHeight]; CGFloat scrollPosition = scrollView.contentOffset.y; - // Fixes the content suggestions collection view layout so that the header - // scrolls at the same rate as the rest. - if (scrollPosition > -[self heightAboveFeed] && - !IsContentSuggestionsUIViewControllerMigrationEnabled()) { - [self.contentSuggestionsCollectionViewController.collectionView - .collectionViewLayout invalidateLayout]; - } [self handleStickyElementsForScrollPosition:scrollPosition force:NO]; } @@ -711,79 +656,36 @@ return; } - if (IsContentSuggestionsHeaderMigrationEnabled()) { - [NSLayoutConstraint deactivateConstraints:self.fakeOmniboxConstraints]; - } else { - [self.headerController removeFromParentViewController]; - [self.headerController.view removeFromSuperview]; - [self.view addSubview:self.headerController.view]; - } + [NSLayoutConstraint deactivateConstraints:self.fakeOmniboxConstraints]; - if (IsContentSuggestionsHeaderMigrationEnabled()) { - self.headerTopAnchor = [self.headerController.view.topAnchor - constraintEqualToAnchor:self.feedWrapperViewController.view.topAnchor - constant:-([self stickyOmniboxHeight] + - [self feedHeaderHeight])]; - // This issue fundamentally comes down to the topAnchor being set just once - // and if it is set in landscape mode, it never is updated upon rotation. - // And landscape is when it doesn't matter. - self.fakeOmniboxConstraints = @[ - self.headerTopAnchor, - [self.headerController.view.leadingAnchor - constraintEqualToAnchor:self.feedWrapperViewController.view - .leadingAnchor], - [self.headerController.view.trailingAnchor - constraintEqualToAnchor:self.feedWrapperViewController.view - .trailingAnchor], - ]; - } else { - self.fakeOmniboxConstraints = @[ - [self.headerController.view.topAnchor - constraintEqualToAnchor:self.feedWrapperViewController.view.topAnchor - constant:-([self stickyOmniboxHeight] + - [self feedHeaderHeight])], - [self.headerController.view.leadingAnchor - constraintEqualToAnchor:self.feedWrapperViewController.view - .leadingAnchor], - [self.headerController.view.trailingAnchor - constraintEqualToAnchor:self.feedWrapperViewController.view - .trailingAnchor], - [self.headerController.view.heightAnchor - constraintEqualToConstant:self.headerController.view.frame.size - .height], - ]; - } - - if (!IsContentSuggestionsHeaderMigrationEnabled()) { - self.contentSuggestionsHeightConstraint.active = NO; - } + self.headerTopAnchor = [self.headerController.view.topAnchor + constraintEqualToAnchor:self.feedWrapperViewController.view.topAnchor + constant:-([self stickyOmniboxHeight] + + [self feedHeaderHeight])]; + // This issue fundamentally comes down to the topAnchor being set just once + // and if it is set in landscape mode, it never is updated upon rotation. + // And landscape is when it doesn't matter. + self.fakeOmniboxConstraints = @[ + self.headerTopAnchor, + [self.headerController.view.leadingAnchor + constraintEqualToAnchor:self.feedWrapperViewController.view + .leadingAnchor], + [self.headerController.view.trailingAnchor + constraintEqualToAnchor:self.feedWrapperViewController.view + .trailingAnchor], + ]; [NSLayoutConstraint activateConstraints:self.fakeOmniboxConstraints]; } // Gives content suggestions collection view ownership of the fake omnibox for // the width animation. - (void)setInitialFakeOmniboxConstraints { - if (!IsContentSuggestionsHeaderMigrationEnabled()) { - [self.headerController removeFromParentViewController]; - [self.headerController.view removeFromSuperview]; - self.contentSuggestionsHeightConstraint.active = YES; - } - [NSLayoutConstraint deactivateConstraints:self.fakeOmniboxConstraints]; - if (IsContentSuggestionsHeaderMigrationEnabled()) { - self.fakeOmniboxConstraints = @[ - [[self contentSuggestionsViewController].view.topAnchor - constraintEqualToAnchor:self.headerController.view.bottomAnchor], - ]; - [NSLayoutConstraint activateConstraints:self.fakeOmniboxConstraints]; - } - - // Reload the content suggestions so that the fake omnibox goes back where it - // belongs. This can probably be optimized by just reloading the header, if - // that doesn't mess up any collection/header interactions. - if (!IsContentSuggestionsHeaderMigrationEnabled()) { - [self.ntpContentDelegate reloadContentSuggestions]; - } + self.fakeOmniboxConstraints = @[ + [self.contentSuggestionsViewController.view.topAnchor + constraintEqualToAnchor:self.headerController.view.bottomAnchor], + ]; + [NSLayoutConstraint activateConstraints:self.fakeOmniboxConstraints]; } // Pins feed header to top of the NTP when scrolled into the feed, below the @@ -804,8 +706,8 @@ [self.feedHeaderViewController customSearchEngineViewHeight])], [self.collectionView.topAnchor - constraintEqualToAnchor:[self contentSuggestionsViewController] - .view.bottomAnchor], + constraintEqualToAnchor:self.contentSuggestionsViewController.view + .bottomAnchor], ]; } else { self.feedHeaderConstraints = @[ @@ -814,8 +716,8 @@ constant:-[self.feedHeaderViewController customSearchEngineViewHeight]], [self.collectionView.topAnchor - constraintEqualToAnchor:[self contentSuggestionsViewController] - .view.bottomAnchor], + constraintEqualToAnchor:self.contentSuggestionsViewController.view + .bottomAnchor], ]; } @@ -837,8 +739,8 @@ } self.feedHeaderConstraints = @[ [self.feedHeaderViewController.view.topAnchor - constraintEqualToAnchor:[self contentSuggestionsViewController] - .view.bottomAnchor], + constraintEqualToAnchor:self.contentSuggestionsViewController.view + .bottomAnchor], [bottomView.topAnchor constraintEqualToAnchor:self.feedHeaderViewController .view.bottomAnchor], ]; @@ -869,8 +771,8 @@ -[self feedHeaderHeight] - [self feedTopSectionHeight], self.view.frame.size.width, [self feedHeaderHeight]); } - [self contentSuggestionsViewController].view.frame = CGRectMake( - [self contentSuggestionsViewController].view.frame.origin.x, + self.contentSuggestionsViewController.view.frame = CGRectMake( + self.contentSuggestionsViewController.view.frame.origin.x, -[self contentSuggestionsContentHeight] - [self feedHeaderHeight] - [self feedTopSectionHeight], self.view.frame.size.width, [self contentSuggestionsContentHeight]); @@ -964,7 +866,7 @@ // Applies constraints to the NTP collection view, along with the constraints // for the content suggestions within it. - (void)applyCollectionViewConstraints { - UIView* contentSuggestionsView = [self contentSuggestionsViewController].view; + UIView* contentSuggestionsView = self.contentSuggestionsViewController.view; contentSuggestionsView.translatesAutoresizingMaskIntoConstraints = NO; self.contentSuggestionsHeightConstraint = [contentSuggestionsView.heightAnchor @@ -1000,7 +902,6 @@ ]]; } - if (IsContentSuggestionsHeaderMigrationEnabled()) { [NSLayoutConstraint activateConstraints:@[ [[self containerView].safeAreaLayoutGuide.leadingAnchor constraintEqualToAnchor:self.headerController.view.leadingAnchor], @@ -1008,15 +909,14 @@ constraintEqualToAnchor:self.headerController.view.trailingAnchor], ]]; [self setInitialFakeOmniboxConstraints]; - } - [NSLayoutConstraint activateConstraints:@[ - [[self containerView].safeAreaLayoutGuide.leadingAnchor - constraintEqualToAnchor:contentSuggestionsView.leadingAnchor], - [[self containerView].safeAreaLayoutGuide.trailingAnchor - constraintEqualToAnchor:contentSuggestionsView.trailingAnchor], - self.contentSuggestionsHeightConstraint, - ]]; + [NSLayoutConstraint activateConstraints:@[ + [[self containerView].safeAreaLayoutGuide.leadingAnchor + constraintEqualToAnchor:contentSuggestionsView.leadingAnchor], + [[self containerView].safeAreaLayoutGuide.trailingAnchor + constraintEqualToAnchor:contentSuggestionsView.trailingAnchor], + self.contentSuggestionsHeightConstraint, + ]]; } // Sets minimum height for the NTP collection view, allowing it to scroll enough @@ -1035,49 +935,38 @@ #pragma mark - Helpers - (UIViewController*)contentSuggestionsViewController { - return IsContentSuggestionsUIViewControllerMigrationEnabled() - ? _contentSuggestionsViewController - : self.contentSuggestionsCollectionViewController; + return _contentSuggestionsViewController; } - (CGFloat)minimumNTPHeight { - if (IsContentSuggestionsHeaderMigrationEnabled()) { - CGFloat collectionViewHeight = self.collectionView.bounds.size.height; - CGFloat headerHeight = [self.headerController headerHeight]; + CGFloat collectionViewHeight = self.collectionView.bounds.size.height; + CGFloat headerHeight = [self.headerController headerHeight]; - // The minimum height for the collection view content should be the height - // of the header plus the height of the collection view minus the height of - // the NTP bottom bar. This allows the Most Visited cells to be scrolled up - // to the top of the screen. Also computes the total NTP scrolling height - // for Discover infinite feed. - CGFloat ntpHeight = collectionViewHeight + headerHeight; - CGFloat minimumHeight = - ntpHeight - ntp_header::kScrolledToTopOmniboxBottomMargin; - if (!IsRegularXRegularSizeClass(self.collectionView)) { - CGFloat toolbarHeight = - IsSplitToolbarMode(self.collectionView) - ? ToolbarExpandedHeight([UIApplication sharedApplication] - .preferredContentSizeCategory) - : 0; - CGFloat additionalHeight = - toolbarHeight + self.collectionView.contentInset.bottom; - minimumHeight -= additionalHeight; - } - - return minimumHeight; - } else { - return [self.contentSuggestionsLayout minimumNTPHeight]; + // The minimum height for the collection view content should be the height + // of the header plus the height of the collection view minus the height of + // the NTP bottom bar. This allows the Most Visited cells to be scrolled up + // to the top of the screen. Also computes the total NTP scrolling height + // for Discover infinite feed. + CGFloat ntpHeight = collectionViewHeight + headerHeight; + CGFloat minimumHeight = + ntpHeight - ntp_header::kScrolledToTopOmniboxBottomMargin; + if (!IsRegularXRegularSizeClass(self.collectionView)) { + CGFloat toolbarHeight = + IsSplitToolbarMode(self.collectionView) + ? ToolbarExpandedHeight([UIApplication sharedApplication] + .preferredContentSizeCategory) + : 0; + CGFloat additionalHeight = + toolbarHeight + self.collectionView.contentInset.bottom; + minimumHeight -= additionalHeight; } + + return minimumHeight; } // Returns the current height of the content suggestions content. - (CGFloat)contentSuggestionsContentHeight { - if (IsContentSuggestionsUIViewControllerMigrationEnabled()) { - return [self.contentSuggestionsViewController contentSuggestionsHeight]; - } else { - return self.contentSuggestionsCollectionViewController.collectionView - .contentSize.height; - } + return [self.contentSuggestionsViewController contentSuggestionsHeight]; } // Content suggestions height adjusted with the safe area top insets. @@ -1128,8 +1017,7 @@ -(self.headerController.view.frame.size.height - [self stickyOmniboxHeight] - [self.feedHeaderViewController customSearchEngineViewHeight]); - if (IsSplitToolbarMode(self) && - IsContentSuggestionsHeaderMigrationEnabled()) { + if (IsSplitToolbarMode(self)) { offset -= [self contentSuggestionsContentHeight]; } if (self.feedTopSectionViewController) { @@ -1156,23 +1044,21 @@ // self.feedWrapperViewController.feedViewController.view -> // self.collectionView -> self.contentSuggestionsViewController.view. if (![self.collectionView.subviews - containsObject:[self contentSuggestionsViewController].view]) { + containsObject:self.contentSuggestionsViewController.view]) { // Remove child VC from old parent. - [[self contentSuggestionsViewController] - willMoveToParentViewController:nil]; - [[self contentSuggestionsViewController] removeFromParentViewController]; - [[self contentSuggestionsViewController].view removeFromSuperview]; - [[self contentSuggestionsViewController] didMoveToParentViewController:nil]; + [self.contentSuggestionsViewController willMoveToParentViewController:nil]; + [self.contentSuggestionsViewController removeFromParentViewController]; + [self.contentSuggestionsViewController.view removeFromSuperview]; + [self.contentSuggestionsViewController didMoveToParentViewController:nil]; // Add child VC to new parent. - [[self contentSuggestionsViewController] + [self.contentSuggestionsViewController willMoveToParentViewController:self.feedWrapperViewController .feedViewController]; [self.feedWrapperViewController.feedViewController - addChildViewController:[self contentSuggestionsViewController]]; - [self.collectionView - addSubview:[self contentSuggestionsViewController].view]; - [[self contentSuggestionsViewController] + addChildViewController:self.contentSuggestionsViewController]; + [self.collectionView addSubview:self.contentSuggestionsViewController.view]; + [self.contentSuggestionsViewController didMoveToParentViewController:self.feedWrapperViewController .feedViewController]; @@ -1181,12 +1067,10 @@ kContentSuggestionsParent]; } - if (IsContentSuggestionsHeaderMigrationEnabled()) { - [self ensureView:self.headerController.view - isSubviewOf:self.collectionView - withRelationshipID:BrokenNTPHierarchyRelationship:: - kContentSuggestionsHeaderParent]; - } + [self ensureView:self.headerController.view + isSubviewOf:self.collectionView + withRelationshipID:BrokenNTPHierarchyRelationship:: + kContentSuggestionsHeaderParent]; [self ensureView:self.feedHeaderViewController.view isSubviewOf:self.collectionView @@ -1274,7 +1158,6 @@ // view controls its position. - (void)setIsScrolledIntoFeed:(BOOL)scrolledIntoFeed { _scrolledIntoFeed = scrolledIntoFeed; - self.contentSuggestionsLayout.isScrolledIntoFeed = scrolledIntoFeed; } // Sets the y content offset of the NTP collection view.
diff --git a/ios/chrome/browser/ui/ntp/resources/BUILD.gn b/ios/chrome/browser/ui/ntp/resources/BUILD.gn index fa81cb7..72803fe 100644 --- a/ios/chrome/browser/ui/ntp/resources/BUILD.gn +++ b/ios/chrome/browser/ui/ntp/resources/BUILD.gn
@@ -58,14 +58,6 @@ ] } -imageset("ntp_feed_signin_promo_icon") { - sources = [ - "ntp_feed_signin_promo_icon.imageset/Contents.json", - "ntp_feed_signin_promo_icon.imageset/ntp_feed_signin_promo_icon@2x.png", - "ntp_feed_signin_promo_icon.imageset/ntp_feed_signin_promo_icon@3x.png", - ] -} - imageset("ntp_opentabs_header") { sources = [ "ntp_opentabs_header.imageset/Contents.json",
diff --git a/ios/chrome/browser/ui/settings/BUILD.gn b/ios/chrome/browser/ui/settings/BUILD.gn index 1959d96f..5a00ec3 100644 --- a/ios/chrome/browser/ui/settings/BUILD.gn +++ b/ios/chrome/browser/ui/settings/BUILD.gn
@@ -209,6 +209,7 @@ "//url", ] allow_circular_includes_from = [ "//ios/chrome/browser/ui/authentication" ] + public_deps = [ "//ios/third_party/material_components_ios" ] frameworks = [ "CoreLocation.framework", "UIKit.framework",
diff --git a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm index a9464ec..a80f1408 100644 --- a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm
@@ -617,31 +617,6 @@ [self.signoutCoordinator start]; } -- (void)handleSignOutWithForceClearData:(BOOL)forceClearData { - if (!_browser) - return; - - // `self.removeOrMyGoogleChooserAlertCoordinator` should not be stopped, since - // the coordinator has been confirmed. - DCHECK(self.removeOrMyGoogleChooserAlertCoordinator); - self.removeOrMyGoogleChooserAlertCoordinator = nil; - - AuthenticationService* authService = [self authService]; - if (authService->HasPrimaryIdentity(signin::ConsentLevel::kSignin)) { - _authenticationOperationInProgress = YES; - [self preventUserInteraction]; - __weak AccountsTableViewController* weakSelf = self; - authService->SignOut( - signin_metrics::USER_CLICKED_SIGNOUT_SETTINGS, forceClearData, ^{ - // Metrics logging must occur before dismissing the currently - // presented view controller from `handleSignoutDidFinish`. - [weakSelf logSignoutMetricsWithForceClearData:forceClearData]; - [weakSelf allowUserInteraction]; - [weakSelf handleAuthenticationOperationDidFinish]; - }); - } -} - // Logs the UMA metrics to record the data retention option selected by the user // on signout. If the account is managed the data will always be cleared. - (void)logSignoutMetricsWithForceClearData:(BOOL)forceClearData {
diff --git a/ios/chrome/browser/ui/settings/password/password_manager_view_controller.mm b/ios/chrome/browser/ui/settings/password/password_manager_view_controller.mm index 9370c4d..78365e8 100644 --- a/ios/chrome/browser/ui/settings/password/password_manager_view_controller.mm +++ b/ios/chrome/browser/ui/settings/password/password_manager_view_controller.mm
@@ -437,7 +437,10 @@ - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; - [self logMetricsForFavicons]; + // Record favicons metrics only if the feature is enabled. + if (IsFaviconEnabled()) { + [self logMetricsForFavicons]; + } // Restore to default origin offset for cancel button proxy style. UIBarButtonItem* cancelButton = [UIBarButtonItem @@ -505,10 +508,6 @@ [model addItem:_savePasswordsItem toSectionWithIdentifier:SectionIdentifierSavePasswordsSwitch]; } - - _manageAccountLinkItem = [self manageAccountLinkItem]; - [model setHeader:_manageAccountLinkItem - forSectionWithIdentifier:SectionIdentifierSavePasswordsSwitch]; } // Passwords in other apps. @@ -575,6 +574,12 @@ [model addItem:_exportPasswordsItem toSectionWithIdentifier:SectionIdentifierExportPasswordsButton]; + // Add the descriptive text at the top of the screen. Do this at the end to + // ensure the section to which it's being attached already exists. + _manageAccountLinkItem = [self manageAccountLinkItem]; + [model setHeader:_manageAccountLinkItem + forSectionWithIdentifier:[self sectionForManageAccountLinkHeader]]; + [self filterItems:self.searchTerm]; } @@ -730,34 +735,46 @@ } #pragma mark - Items +- (PasswordSectionIdentifier)sectionForManageAccountLinkHeader { + // When settings are shown on this page, the Save Passwords Switch is the + // first section, so it should host the page's header text. When settings are + // absent, this needs to move down to the Password Check section instead. + return ShouldShowSettingsUI() ? SectionIdentifierSavePasswordsSwitch + : SectionIdentifierPasswordCheck; +} - (TableViewLinkHeaderFooterItem*)manageAccountLinkItem { - TableViewLinkHeaderFooterItem* footerItem = + TableViewLinkHeaderFooterItem* header = [[TableViewLinkHeaderFooterItem alloc] initWithType:ItemTypeLinkHeader]; if (base::FeatureList::IsEnabled( password_manager::features:: kIOSEnablePasswordManagerBrandingUpdate)) { - footerItem.text = - l10n_util::GetNSString(IDS_IOS_SAVE_PASSWORDS_MANAGE_ACCOUNT_HEADER); + if ([self.delegate isSyncingPasswords]) { + header.text = + l10n_util::GetNSString(IDS_IOS_SAVE_PASSWORDS_MANAGE_ACCOUNT_HEADER); - footerItem.urls = @[ [[CrURL alloc] - initWithGURL: - google_util::AppendGoogleLocaleParam( - GURL(password_manager::kPasswordManagerHelpCenteriOSURL), - GetApplicationContext()->GetApplicationLocale())] ]; + header.urls = @[ [[CrURL alloc] + initWithGURL: + google_util::AppendGoogleLocaleParam( + GURL(password_manager::kPasswordManagerHelpCenteriOSURL), + GetApplicationContext()->GetApplicationLocale())] ]; + } else { + header.text = + l10n_util::GetNSString(IDS_IOS_PASSWORD_MANAGER_HEADER_NOT_SYNCING); + header.urls = @[]; + } } else { - footerItem.text = - l10n_util::GetNSString(IDS_IOS_SAVE_PASSWORDS_MANAGE_ACCOUNT); + header.text = l10n_util::GetNSString(IDS_IOS_SAVE_PASSWORDS_MANAGE_ACCOUNT); - footerItem.urls = @[ [[CrURL alloc] + header.urls = @[ [[CrURL alloc] initWithGURL: google_util::AppendGoogleLocaleParam( GURL(password_manager::kPasswordManagerAccountDashboardURL), GetApplicationContext()->GetApplicationLocale())] ]; } - return footerItem; + return header; } - (TableViewSwitchItem*)savePasswordsItem { @@ -1207,8 +1224,6 @@ [model insertSectionWithIdentifier:SectionIdentifierSavePasswordsSwitch atIndex:sectionIndex]; - [model setHeader:_manageAccountLinkItem - forSectionWithIdentifier:SectionIdentifierSavePasswordsSwitch]; [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationTop]; @@ -1266,6 +1281,9 @@ [rowsIndexPaths addObject:[NSIndexPath indexPathForRow:1 inSection:checkSection]]; + [model setHeader:_manageAccountLinkItem + forSectionWithIdentifier:[self sectionForManageAccountLinkHeader]]; + [self.tableView insertRowsAtIndexPaths:rowsIndexPaths withRowAnimation:UITableViewRowAnimationTop]; @@ -1951,16 +1969,16 @@ - (UIView*)tableView:(UITableView*)tableView viewForHeaderInSection:(NSInteger)section { UIView* view = [super tableView:tableView viewForHeaderInSection:section]; - switch ([self.tableViewModel sectionIdentifierForSectionIndex:section]) { - case SectionIdentifierSavePasswordsSwitch: { - TableViewLinkHeaderFooterView* linkView = - base::mac::ObjCCastStrict<TableViewLinkHeaderFooterView>(view); - linkView.delegate = self; - break; - } - default: - break; + + if ([self.tableViewModel sectionIdentifierForSectionIndex:section] == + [self sectionForManageAccountLinkHeader]) { + // This is the text at the top of the page with a link. Attach as a delegate + // to ensure clicks on the link are handled. + TableViewLinkHeaderFooterView* linkView = + base::mac::ObjCCastStrict<TableViewLinkHeaderFooterView>(view); + linkView.delegate = self; } + return view; }
diff --git a/ios/chrome/browser/ui/settings/password/password_manager_view_controller_delegate.h b/ios/chrome/browser/ui/settings/password/password_manager_view_controller_delegate.h index 9866140..e584d87 100644 --- a/ios/chrome/browser/ui/settings/password/password_manager_view_controller_delegate.h +++ b/ios/chrome/browser/ui/settings/password/password_manager_view_controller_delegate.h
@@ -54,6 +54,9 @@ // Returns the on-device encryption state according to the sync service. - (OnDeviceEncryptionState)onDeviceEncryptionState; +// Returns whether or not passwords are currently syncing. +- (BOOL)isSyncingPasswords; + @end #endif // IOS_CHROME_BROWSER_UI_SETTINGS_PASSWORD_PASSWORD_MANAGER_VIEW_CONTROLLER_DELEGATE_H_
diff --git a/ios/chrome/browser/ui/settings/password/passwords_mediator.mm b/ios/chrome/browser/ui/settings/password/passwords_mediator.mm index 9030563..a6327b1 100644 --- a/ios/chrome/browser/ui/settings/password/passwords_mediator.mm +++ b/ios/chrome/browser/ui/settings/password/passwords_mediator.mm
@@ -8,6 +8,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/time/time.h" #include "components/password_manager/core/browser/leak_detection_dialog_utils.h" +#import "components/password_manager/core/browser/password_manager_util.h" #include "components/password_manager/core/common/password_manager_features.h" #import "components/signin/public/identity_manager/objc/identity_manager_observer_bridge.h" #include "components/sync/driver/sync_service_utils.h" @@ -259,6 +260,11 @@ return OnDeviceEncryptionStateNotShown; } +- (BOOL)isSyncingPasswords { + return password_manager_util::GetPasswordSyncState(_syncService) != + password_manager::SyncState::kNotSyncing; +} + #pragma mark - PasswordCheckObserver - (void)passwordCheckStateDidChange:(PasswordCheckState)state {
diff --git a/ios/chrome/browser/ui/settings/password/passwords_settings_egtest.mm b/ios/chrome/browser/ui/settings/password/passwords_settings_egtest.mm index 73a9a0e..f5edf86 100644 --- a/ios/chrome/browser/ui/settings/password/passwords_settings_egtest.mm +++ b/ios/chrome/browser/ui/settings/password/passwords_settings_egtest.mm
@@ -420,6 +420,12 @@ config.features_disabled.push_back( syncer::kSyncTrustedVaultPassphrasePromo); } + if ([self isRunningTest:@selector(testLogFaviconsForPasswordsMetrics)] || + [self isRunningTest:@selector + (testLogFaviconsForPasswordsMetricsNoPassword)]) { + config.features_enabled.push_back( + password_manager::features::kEnableFaviconForPasswords); + } return config; } @@ -2121,7 +2127,7 @@ // Tests that the favicons for the password managers metrics are logged // properly when there are passwords with a favicon. // TODO(crbug.com/1348585): Fix to re-enable. -- (void)DISABLED_testLogFaviconsForPasswordsMetrics { +- (void)testLogFaviconsForPasswordsMetrics { // Sign-in and synced user. FakeChromeIdentity* fakeIdentity = [FakeChromeIdentity fakeIdentity1]; [SigninEarlGreyUI signinWithFakeIdentity:fakeIdentity];
diff --git a/ios/chrome/browser/ui/start_surface/start_surface_egtest.mm b/ios/chrome/browser/ui/start_surface/start_surface_egtest.mm index 64d16e4..d02ee45 100644 --- a/ios/chrome/browser/ui/start_surface/start_surface_egtest.mm +++ b/ios/chrome/browser/ui/start_surface/start_surface_egtest.mm
@@ -35,9 +35,6 @@ - (AppLaunchConfiguration)appConfigurationForTestCase { AppLaunchConfiguration config; config.relaunch_policy = ForceRelaunchByCleanShutdown; - config.features_enabled.push_back(kContentSuggestionsHeaderMigration); - config.features_enabled.push_back( - kContentSuggestionsUIViewControllerMigration); config.additional_args.push_back( std::string("--force-fieldtrial-params=StartSurface.ShrinkLogo:" "ReturnToStartSurfaceInactiveDurationInSeconds/0"));
diff --git a/ios/components/webui/sync_internals/sync_internals_message_handler.h b/ios/components/webui/sync_internals/sync_internals_message_handler.h index 2ad85da..72ca561 100644 --- a/ios/components/webui/sync_internals/sync_internals_message_handler.h +++ b/ios/components/webui/sync_internals/sync_internals_message_handler.h
@@ -68,7 +68,7 @@ // Callback used in GetAllNodes. void OnReceivedAllNodes(const std::string& callback_id, - std::unique_ptr<base::ListValue> nodes); + base::Value::List nodes); // syncer::SyncServiceObserver implementation. void OnStateChanged(syncer::SyncService* sync) override; @@ -95,7 +95,8 @@ // return null (e.g. if sync invalidations are not enabled). syncer::SyncInvalidationsService* GetSyncInvalidationsService(); - void DispatchEvent(const std::string& name, const base::Value& details_value); + void DispatchEvent(const std::string& name, + const base::ValueView details_value); // A flag used to prevent double-registration with SyncService. bool is_registered_ = false;
diff --git a/ios/components/webui/sync_internals/sync_internals_message_handler.mm b/ios/components/webui/sync_internals/sync_internals_message_handler.mm index 8d119e18..a89c8ac 100644 --- a/ios/components/webui/sync_internals/sync_internals_message_handler.mm +++ b/ios/components/webui/sync_internals/sync_internals_message_handler.mm
@@ -139,11 +139,11 @@ void SyncInternalsMessageHandler::HandleRequestListOfTypes( const base::Value::List& args) { DCHECK(args.empty()); - base::DictionaryValue event_details; - auto type_list = std::make_unique<base::ListValue>(); + base::Value::Dict event_details; + base::Value::List type_list; syncer::ModelTypeSet protocol_types = syncer::ProtocolTypes(); for (syncer::ModelType type : protocol_types) { - type_list->Append(ModelTypeToDebugString(type)); + type_list.Append(ModelTypeToDebugString(type)); } event_details.Set(syncer::sync_ui_util::kTypes, std::move(type_list)); DispatchEvent(syncer::sync_ui_util::kOnReceivedListOfTypes, event_details); @@ -153,9 +153,9 @@ const base::Value::List& args) { DCHECK(args.empty()); - base::DictionaryValue value; - value.SetBoolean(syncer::sync_ui_util::kIncludeSpecifics, - GetIncludeSpecificsInitialState()); + base::Value::Dict value; + value.Set(syncer::sync_ui_util::kIncludeSpecifics, + GetIncludeSpecificsInitialState()); DispatchEvent(syncer::sync_ui_util::kOnReceivedIncludeSpecificsInitialState, value); @@ -234,12 +234,11 @@ void SyncInternalsMessageHandler::OnReceivedAllNodes( const std::string& callback_id, - std::unique_ptr<base::ListValue> nodes) { + base::Value::List nodes) { base::Value id(callback_id); - base::Value nodes_clone = nodes->Clone(); base::Value success(true); - base::ValueView args[] = {id, success, nodes_clone}; + base::ValueView args[] = {id, success, nodes}; web_ui()->CallJavascriptFunction("cr.webUIResponse", args); } @@ -249,9 +248,8 @@ void SyncInternalsMessageHandler::OnProtocolEvent( const syncer::ProtocolEvent& event) { - std::unique_ptr<base::DictionaryValue> value( - event.ToValue(include_specifics_)); - DispatchEvent(syncer::sync_ui_util::kOnProtocolEvent, *value); + DispatchEvent(syncer::sync_ui_util::kOnProtocolEvent, + event.ToValue(include_specifics_)); } void SyncInternalsMessageHandler::OnInvalidationReceived( @@ -261,7 +259,7 @@ return; } - base::ListValue data_types_list; + base::Value::List data_types_list; for (const auto& data_type_invalidation : payload_message.data_type_invalidations()) { const int field_number = data_type_invalidation.data_type_id(); @@ -278,11 +276,10 @@ void SyncInternalsMessageHandler::SendAboutInfoAndEntityCounts() { // This class serves to display debug information to the user, so it's fine to // include sensitive data in ConstructAboutInformation(). - std::unique_ptr<base::DictionaryValue> value = - syncer::sync_ui_util::ConstructAboutInformation( - syncer::sync_ui_util::IncludeSensitiveData(true), GetSyncService(), - web_ui::GetChannelString()); - DispatchEvent(syncer::sync_ui_util::kOnAboutInfoUpdated, *value); + base::Value::Dict value = syncer::sync_ui_util::ConstructAboutInformation( + syncer::sync_ui_util::IncludeSensitiveData(true), GetSyncService(), + web_ui::GetChannelString()); + DispatchEvent(syncer::sync_ui_util::kOnAboutInfoUpdated, value); if (syncer::SyncService* service = GetSyncService()) { service->GetEntityCountsForDebugging( @@ -295,23 +292,20 @@ void SyncInternalsMessageHandler::OnGotEntityCounts( const std::vector<syncer::TypeEntitiesCount>& entity_counts) { - base::ListValue count_list; + base::Value::List count_list; for (const syncer::TypeEntitiesCount& count : entity_counts) { - base::DictionaryValue count_dictionary; - count_dictionary.SetStringPath(syncer::sync_ui_util::kModelType, - ModelTypeToDebugString(count.type)); - count_dictionary.SetIntPath(syncer::sync_ui_util::kEntities, - count.entities); - count_dictionary.SetIntPath(syncer::sync_ui_util::kNonTombstoneEntities, - count.non_tombstone_entities); + base::Value::Dict count_dictionary; + count_dictionary.Set(syncer::sync_ui_util::kModelType, + ModelTypeToDebugString(count.type)); + count_dictionary.Set(syncer::sync_ui_util::kEntities, count.entities); + count_dictionary.Set(syncer::sync_ui_util::kNonTombstoneEntities, + count.non_tombstone_entities); count_list.Append(std::move(count_dictionary)); } - base::DictionaryValue event_details; - event_details.SetPath(syncer::sync_ui_util::kEntityCounts, - std::move(count_list)); - DispatchEvent(syncer::sync_ui_util::kOnEntityCountsUpdated, - std::move(event_details)); + base::Value::Dict event_details; + event_details.Set(syncer::sync_ui_util::kEntityCounts, std::move(count_list)); + DispatchEvent(syncer::sync_ui_util::kOnEntityCountsUpdated, event_details); } // Gets the SyncService of the underlying original profile. May return null. @@ -326,7 +320,7 @@ void SyncInternalsMessageHandler::DispatchEvent( const std::string& name, - const base::Value& details_value) { + const base::ValueView details_value) { base::Value event_name = base::Value(name); base::ValueView args[] = {event_name, details_value}; web_ui()->CallJavascriptFunction("cr.webUIListenerCallback", args);
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 index 7aefc53..4b6f5f7 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -afe3f9fbc0f935ef0975cfca9b0a43783793d0fe \ No newline at end of file +90d769964f35df9def662e9b1837486e5deb82a6 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 index 6ad5024..581242e7 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -8cadbd516410dc83b83198c20235c08f06702d95 \ No newline at end of file +ad5e7f7079dee1a54914917522630c0515a06838 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 index a8d2be4..723880c 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -308fe47d96f0d1243ff68039f77249c9d507864c \ No newline at end of file +16e3aa32ec02f054ae73c57a93667a3e7336b44e \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 index 99a2e0c..cac7d4e 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -c764e1a683991c9ed3a9a359c0cda5ce6f865594 \ No newline at end of file +a34b4235b70cec4b2f9f96037bce1623b1a248fc \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 index dcf81ef6..997f868 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -a180733206934b878d878558ca419d793174277b \ No newline at end of file +2497e593b3eaee2f65963ee4324288de68b25c1f \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 index f5357938..2ab4984 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -e9ff32e203c63c9b78f69129d8acfdd82a925fc7 \ No newline at end of file +32a4aad951ef8ca92befc1df037b5122339d6746 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 index e586322..43e10e3f8 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -fd9d4f38e27f04ce3a867f436fd348fd7bf561a3 \ No newline at end of file +436dfa038b538798cf7992902c514191550a80fc \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 index 2666313..fca8d6ec 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -935504d64af8a74e00159b599ecf788120b52ea1 \ No newline at end of file +54743b23a5d296a8670df88cd7dd6124a745aa25 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 index 1debb09..8077b76 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -90824bfd2ae442a0b5be5bf60fac14843ec46668 \ No newline at end of file +2d4c9db8862d7705b44e916a93e8031c7c904e1a \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 index 3379a3f54..b82e9bd 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -f7f548e827bfaf902f6f9e74b30cf467da7f619e \ No newline at end of file +d95540c7eb0dcd9337cdb44c134fdd0faa03bd56 \ No newline at end of file
diff --git a/media/BUILD.gn b/media/BUILD.gn index 4d94c87e..7d0170e 100644 --- a/media/BUILD.gn +++ b/media/BUILD.gn
@@ -9,23 +9,23 @@ import("//build/config/features.gni") import("//build/config/linux/pkg_config.gni") import("//build/config/ui.gni") -import("//media/cdm/library_cdm/cdm_paths.gni") import("//media/media_options.gni") import("//testing/libfuzzer/fuzzer_test.gni") import("//testing/test.gni") import("//third_party/ffmpeg/ffmpeg_options.gni") +if (enable_library_cdms) { + import("//media/cdm/library_cdm/cdm_paths.gni") +} + buildflag_header("media_buildflags") { header = "media_buildflags.h" flags = [ "ALTERNATE_CDM_STORAGE_ID_KEY=\"$alternate_cdm_storage_id_key\"", - "CDM_PLATFORM_SPECIFIC_PATH=\"$cdm_platform_specific_path\"", "CHROME_WIDE_ECHO_CANCELLATION=$chrome_wide_echo_cancellation_supported", "ENABLE_PLATFORM_AC3_EAC3_AUDIO=$enable_platform_ac3_eac3_audio", "ENABLE_CAST_AUDIO_RENDERER=$enable_cast_audio_renderer", - "ENABLE_CDM_HOST_VERIFICATION=$enable_cdm_host_verification", - "ENABLE_CDM_STORAGE_ID=$enable_cdm_storage_id", "ENABLE_DAV1D_DECODER=$enable_dav1d_decoder", "ENABLE_AV1_DECODER=$enable_av1_decoder", "ENABLE_PLATFORM_DOLBY_VISION=$enable_platform_dolby_vision", @@ -37,8 +37,8 @@ "ENABLE_HLS_SAMPLE_AES=$enable_hls_sample_aes", "ENABLE_HLS_DEMUXER=$enable_hls_demuxer", "ENABLE_LIBGAV1_DECODER=$enable_libgav1_decoder", - "ENABLE_LIBRARY_CDMS=$enable_library_cdms", "ENABLE_LIBAOM=$enable_libaom", + "ENABLE_LIBRARY_CDMS=$enable_library_cdms", "ENABLE_LIBVPX=$media_use_libvpx", "ENABLE_LOGGING_OVERRIDE=$enable_logging_override", "ENABLE_MEDIA_DRM_STORAGE=$enable_media_drm_storage", @@ -54,6 +54,14 @@ "USE_PROPRIETARY_CODECS=$proprietary_codecs", "ENABLE_PLATFORM_DTS_AUDIO=$enable_platform_dts_audio", ] + + if (enable_library_cdms) { + flags += [ + "CDM_PLATFORM_SPECIFIC_PATH=\"$cdm_platform_specific_path\"", + "ENABLE_CDM_HOST_VERIFICATION=$enable_cdm_host_verification", + "ENABLE_CDM_STORAGE_ID=$enable_cdm_storage_id", + ] + } } if (proprietary_codecs && media_use_ffmpeg) {
diff --git a/media/audio/cras/cras_input.cc b/media/audio/cras/cras_input.cc index df5667d..7ffca72 100644 --- a/media/audio/cras/cras_input.cc +++ b/media/audio/cras/cras_input.cc
@@ -441,7 +441,9 @@ } bool CrasInputStream::IsMuted() { - return false; + int muted = 0; + libcras_client_get_system_capture_muted(client_, &muted); + return static_cast<bool>(muted); } void CrasInputStream::SetOutputDeviceForAec(
diff --git a/media/audio/win/audio_low_latency_input_win_unittest.cc b/media/audio/win/audio_low_latency_input_win_unittest.cc index ae36d40..6553abc 100644 --- a/media/audio/win/audio_low_latency_input_win_unittest.cc +++ b/media/audio/win/audio_low_latency_input_win_unittest.cc
@@ -415,7 +415,8 @@ sink.WaitForData(); ais->Stop(); ais.Close(); - histogram_tester.ExpectTotalCount("Media.Audio.Capture.Win.Glitches", 1); + histogram_tester.ExpectTotalCount("Media.Audio.Capture.EarlyGlitchDetected", + 1); } // Test some additional calling sequences.
diff --git a/media/base/media_log_record.h b/media/base/media_log_record.h index 3db5b21..cb03016 100644 --- a/media/base/media_log_record.h +++ b/media/base/media_log_record.h
@@ -23,8 +23,9 @@ MediaLogRecord& operator=(const MediaLogRecord& event) { id = event.id; type = event.type; - std::unique_ptr<base::DictionaryValue> event_copy(event.params.DeepCopy()); - params.Swap(event_copy.get()); + params.Swap(base::DictionaryValue::From( + base::Value::ToUniquePtrValue(event.params.Clone())) + .get()); time = event.time; return *this; }
diff --git a/media/cdm/BUILD.gn b/media/cdm/BUILD.gn index 4a6a61a..b9d7e02 100644 --- a/media/cdm/BUILD.gn +++ b/media/cdm/BUILD.gn
@@ -12,8 +12,8 @@ if (enable_library_cdms || is_win) { # This target is a subcomponent. visibility = [ + ":*", "//media", - "//media/cdm", ] configs += [ "//media:subcomponent_config" ] } else { @@ -150,18 +150,19 @@ } } -static_library("cdm_paths") { - sources = [ - "cdm_paths.cc", - "cdm_paths.h", - ] +if (enable_library_cdms) { + static_library("cdm_paths") { + public = [ "cdm_paths.h" ] - public_deps = [ ":cdm_type" ] + sources = [ "cdm_paths.cc" ] - deps = [ - "//base", - "//media:media_buildflags", - ] + public_deps = [ ":cdm_type" ] + + deps = [ + "//base", + "//media:media_buildflags", + ] + } } source_set("cdm_type") {
diff --git a/media/cdm/aes_decryptor_unittest.cc b/media/cdm/aes_decryptor_unittest.cc index 9c7ed0c..cc51832 100644 --- a/media/cdm/aes_decryptor_unittest.cc +++ b/media/cdm/aes_decryptor_unittest.cc
@@ -27,7 +27,6 @@ #include "media/base/decryptor.h" #include "media/base/media_switches.h" #include "media/base/mock_filters.h" -#include "media/cdm/cdm_module.h" #include "media/media_buildflags.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest-param-test.h" @@ -38,6 +37,7 @@ #include "media/cdm/api/content_decryption_module.h" // nogncheck #include "media/cdm/cdm_adapter.h" #include "media/cdm/cdm_auxiliary_helper.h" +#include "media/cdm/cdm_module.h" #include "media/cdm/external_clear_key_test_helper.h" #include "media/cdm/mock_helpers.h" #include "media/cdm/simple_cdm_allocator.h"
diff --git a/media/cdm/cdm_module.h b/media/cdm/cdm_module.h index aba21218..ede4e6c 100644 --- a/media/cdm/cdm_module.h +++ b/media/cdm/cdm_module.h
@@ -14,6 +14,10 @@ #include "media/cdm/api/content_decryption_module.h" #include "media/media_buildflags.h" +#if !BUILDFLAG(ENABLE_LIBRARY_CDMS) +#error This file only applies to builds that enable_library_cdms. +#endif + #if BUILDFLAG(ENABLE_CDM_HOST_VERIFICATION) #include "media/cdm/cdm_host_file.h" #include "media/cdm/cdm_host_files.h"
diff --git a/media/cdm/cdm_paths.h b/media/cdm/cdm_paths.h index d406d6a2..cabb002 100644 --- a/media/cdm/cdm_paths.h +++ b/media/cdm/cdm_paths.h
@@ -11,6 +11,11 @@ #include "base/unguessable_token.h" #include "build/build_config.h" #include "media/cdm/cdm_type.h" +#include "media/media_buildflags.h" + +#if !BUILDFLAG(ENABLE_LIBRARY_CDMS) +#error This file only applies to builds that enable_library_cdms. +#endif namespace media {
diff --git a/media/cdm/cdm_paths_unittest.cc b/media/cdm/cdm_paths_unittest.cc index 3a7d9d9b3..1a569ef5 100644 --- a/media/cdm/cdm_paths_unittest.cc +++ b/media/cdm/cdm_paths_unittest.cc
@@ -30,7 +30,7 @@ #elif BUILDFLAG(IS_LINUX) "linux"; #else - "unsupported_platform"; +#error unsupported platform #endif // Name of the component architecture. @@ -44,7 +44,7 @@ #elif defined(ARCH_CPU_ARM64) "arm64"; #else - "unsupported_arch"; +#error unsupported architecture #endif } // namespace
diff --git a/media/cdm/library_cdm/cdm_paths.gni b/media/cdm/library_cdm/cdm_paths.gni index 3077dd9..d18f179f 100644 --- a/media/cdm/library_cdm/cdm_paths.gni +++ b/media/cdm/library_cdm/cdm_paths.gni
@@ -3,8 +3,10 @@ # found in the LICENSE file. import("//build/config/chromeos/ui_mode.gni") +import("//media/media_options.gni") # This file defines output paths for the CDM adapters and CDMs. +assert(enable_library_cdms) # Naming and folder structure below are following the recommendation for Chrome # components. Component-updated CDMs must follow the same recommendation. @@ -20,7 +22,7 @@ } else if (is_mac) { component_os = "mac" } else { - component_os = "unsupported_platform" + assert(false, "unsupported_platform") } component_arch = "$current_cpu"
diff --git a/media/cdm/library_cdm/clear_key_cdm/BUILD.gn b/media/cdm/library_cdm/clear_key_cdm/BUILD.gn index c82db0c..94deeb5 100644 --- a/media/cdm/library_cdm/clear_key_cdm/BUILD.gn +++ b/media/cdm/library_cdm/clear_key_cdm/BUILD.gn
@@ -6,6 +6,8 @@ import("//media/cdm/library_cdm/cdm_paths.gni") import("//media/media_options.gni") +assert(enable_library_cdms) + loadable_module("clear_key_cdm") { testonly = true output_dir = "$root_out_dir/$clearkey_cdm_path" @@ -36,11 +38,6 @@ "//url", ] - if (!enable_library_cdms) { - # cdm_type_conversion is not included via //media. - deps += [ "//media/cdm:cdm_type_conversion" ] - } - # TODO(xhwang): Convert this to use media::FFmpegAudioDecoder. if (media_use_ffmpeg) { sources += [
diff --git a/media/mojo/services/BUILD.gn b/media/mojo/services/BUILD.gn index 4adecd5b..22d16c17 100644 --- a/media/mojo/services/BUILD.gn +++ b/media/mojo/services/BUILD.gn
@@ -226,7 +226,6 @@ "//base/test:test_support", "//components/ukm:test_support", "//media:test_support", - "//media/cdm:cdm_paths", "//media/learning/common", "//media/mojo:test_support", "//media/mojo/clients", @@ -250,7 +249,10 @@ "mojo_cdm_helper_unittest.cc", ] - deps += [ "//media/cdm:cdm_api" ] + deps += [ + "//media/cdm:cdm_api", + "//media/cdm:cdm_paths", + ] } if (is_chromeos_ash) {
diff --git a/mojo/PRESUBMIT.py b/mojo/PRESUBMIT.py index 073a3b8..63f5d210 100644 --- a/mojo/PRESUBMIT.py +++ b/mojo/PRESUBMIT.py
@@ -11,9 +11,9 @@ import os.path USE_PYTHON3 = True +PRESUBMIT_VERSION = '2.0.0' - -def CheckChangeOnUpload(input_api, output_api): +def CheckChange(input_api, output_api): # Additional python module paths (we're in src/mojo/); not everyone needs # them, but it's easiest to add them to everyone's path. # For ply and jinja2:
diff --git a/mojo/public/tools/bindings/compile_typescript.py b/mojo/public/tools/bindings/compile_typescript.py index a978901..4cf9684 100644 --- a/mojo/public/tools/bindings/compile_typescript.py +++ b/mojo/public/tools/bindings/compile_typescript.py
@@ -6,6 +6,9 @@ import sys import argparse +# Module 'node' has no 'RunNode' member (no-member) +# pylint: disable=no-member + _HERE_PATH = os.path.dirname(__file__) _SRC_PATH = os.path.normpath(os.path.join(_HERE_PATH, '..', '..', '..', '..'))
diff --git a/mojo/public/tools/bindings/concatenate-files.py b/mojo/public/tools/bindings/concatenate-files.py index 48bc66f..dd4e3a1f 100755 --- a/mojo/public/tools/bindings/concatenate-files.py +++ b/mojo/public/tools/bindings/concatenate-files.py
@@ -15,6 +15,7 @@ from __future__ import print_function import optparse +import sys def Concatenate(filenames): @@ -47,7 +48,7 @@ parser.set_usage("""Concatenate several files into one. Equivalent to: cat file1 ... > target.""") (_options, args) = parser.parse_args() - exit(0 if Concatenate(args) else 1) + sys.exit(0 if Concatenate(args) else 1) if __name__ == "__main__":
diff --git a/mojo/public/tools/bindings/concatenate_and_replace_closure_exports.py b/mojo/public/tools/bindings/concatenate_and_replace_closure_exports.py index be8985c..5d8493c 100755 --- a/mojo/public/tools/bindings/concatenate_and_replace_closure_exports.py +++ b/mojo/public/tools/bindings/concatenate_and_replace_closure_exports.py
@@ -20,6 +20,7 @@ import optparse import re +import sys _MOJO_INTERNAL_MODULE_NAME = "mojo.internal" @@ -34,7 +35,7 @@ match = re.match("goog.provide\('([^']+)'\);", line) if not match: print("Invalid goog.provide line in %s:\n%s" % (filename, line)) - exit(1) + sys.exit(1) module_name = match.group(1) if module_name == _MOJO_INTERNAL_MODULE_NAME: @@ -67,7 +68,8 @@ Concatenate several files into one, stripping Closure provide and require directives along the way.""") (_, args) = parser.parse_args() - exit(0 if ConcatenateAndReplaceExports(args) else 1) + sys.exit(0 if ConcatenateAndReplaceExports(args) else 1) + if __name__ == "__main__": main()
diff --git a/mojo/public/tools/bindings/mojom_bindings_generator.py b/mojo/public/tools/bindings/mojom_bindings_generator.py index d4e4b80..3e55e3d 100755 --- a/mojo/public/tools/bindings/mojom_bindings_generator.py +++ b/mojo/public/tools/bindings/mojom_bindings_generator.py
@@ -103,7 +103,7 @@ zip(imported_filename_stack[1:], imported_filename_stack)])) -class RelativePath(object): +class RelativePath: """Represents a path relative to the source tree or generated output dir.""" def __init__(self, path, source_root, output_dir): @@ -163,7 +163,7 @@ return f.read() -class MojomProcessor(object): +class MojomProcessor: """Takes parsed mojom modules and generates language bindings from them. Attributes:
diff --git a/mojo/public/tools/bindings/mojom_bindings_generator_unittest.py b/mojo/public/tools/bindings/mojom_bindings_generator_unittest.py index bddbe3f..77915301 100644 --- a/mojo/public/tools/bindings/mojom_bindings_generator_unittest.py +++ b/mojo/public/tools/bindings/mojom_bindings_generator_unittest.py
@@ -8,13 +8,13 @@ from mojom_bindings_generator import ScrambleMethodOrdinals -class FakeIface(object): +class FakeIface: def __init__(self): self.mojom_name = None self.methods = None -class FakeMethod(object): +class FakeMethod: def __init__(self, explicit_ordinal=None): self.explicit_ordinal = explicit_ordinal self.ordinal = explicit_ordinal
diff --git a/mojo/public/tools/mojom/check_stable_mojom_compatibility.py b/mojo/public/tools/mojom/check_stable_mojom_compatibility.py index 0255427..a85e21c 100755 --- a/mojo/public/tools/mojom/check_stable_mojom_compatibility.py +++ b/mojo/public/tools/mojom/check_stable_mojom_compatibility.py
@@ -12,19 +12,18 @@ breaking changes to stable mojoms.""" import argparse -import errno import io import json import os import os.path -import shutil import sys -import tempfile from mojom.generate import module from mojom.generate import translate from mojom.parse import parser +# pylint: disable=raise-missing-from + class ParseError(Exception): pass @@ -99,10 +98,10 @@ modules[mojom] = translate.OrderedModule(ast, mojom, all_modules) old_modules = {} - for mojom in old_files.keys(): + for mojom in old_files: parseMojom(mojom, old_files, old_modules) new_modules = {} - for mojom in new_files.keys(): + for mojom in new_files: parseMojom(mojom, new_files, new_modules) # At this point we have a complete set of translated Modules from both the
diff --git a/mojo/public/tools/mojom/check_stable_mojom_compatibility_unittest.py b/mojo/public/tools/mojom/check_stable_mojom_compatibility_unittest.py index 887e2395..385d10e 100755 --- a/mojo/public/tools/mojom/check_stable_mojom_compatibility_unittest.py +++ b/mojo/public/tools/mojom/check_stable_mojom_compatibility_unittest.py
@@ -15,7 +15,7 @@ from mojom.generate import module -class Change(object): +class Change: """Helper to clearly define a mojom file delta to be analyzed.""" def __init__(self, filename, old=None, new=None): @@ -28,7 +28,7 @@ class UnchangedFile(Change): def __init__(self, filename, contents): - super(UnchangedFile, self).__init__(filename, old=contents, new=contents) + super().__init__(filename, old=contents, new=contents) class CheckStableMojomCompatibilityTest(unittest.TestCase):
diff --git a/mojo/public/tools/mojom/mojom/generate/check.py b/mojo/public/tools/mojom/mojom/generate/check.py index df6518c..852fb1f9 100644 --- a/mojo/public/tools/mojom/mojom/generate/check.py +++ b/mojo/public/tools/mojom/mojom/generate/check.py
@@ -8,14 +8,14 @@ def __init__(self, module, message): self.module = module self.message = message - super(CheckException, self).__init__(self.message) + super().__init__(self.message) def __str__(self): return "Failed mojo pre-generation check for {}:\n{}".format( self.module.path, self.message) -class Check(object): +class Check: def __init__(self, module): self.module = module
diff --git a/mojo/public/tools/mojom/mojom/generate/generator.py b/mojo/public/tools/mojom/mojom/generate/generator.py index 4a1c73fc..36b98ce 100644 --- a/mojo/public/tools/mojom/mojom/generate/generator.py +++ b/mojo/public/tools/mojom/mojom/generate/generator.py
@@ -97,7 +97,7 @@ return _ToSnakeCase(identifier, upper=False) -class Stylizer(object): +class Stylizer: """Stylizers specify naming rules to map mojom names to names in generated code. For example, if you would like method_name in mojom to be mapped to MethodName in the generated code, you need to define a subclass of Stylizer @@ -233,7 +233,7 @@ _AddInterfaceComputedData(interface) -class Generator(object): +class Generator: # Pass |output_dir| to emit files to disk. Omit |output_dir| to echo all # files to stdout. def __init__(self,
diff --git a/mojo/public/tools/mojom/mojom/generate/module.py b/mojo/public/tools/mojom/mojom/generate/module.py index 160ad1ef3..eff9376b 100644 --- a/mojo/public/tools/mojom/mojom/generate/module.py +++ b/mojo/public/tools/mojom/mojom/generate/module.py
@@ -15,8 +15,10 @@ import pickle from uuid import UUID +# pylint: disable=raise-missing-from -class BackwardCompatibilityChecker(object): + +class BackwardCompatibilityChecker: """Used for memoization while recursively checking two type definitions for backward-compatibility.""" @@ -60,23 +62,20 @@ return obj.Repr(as_ref=as_ref) # Since we cannot implement Repr for existing container types, we # handle them here. - elif isinstance(obj, list): + if isinstance(obj, list): if not obj: return '[]' - else: - return ('[\n%s\n]' % (',\n'.join( - ' %s' % Repr(elem, as_ref).replace('\n', '\n ') - for elem in obj))) - elif isinstance(obj, dict): + return ('[\n%s\n]' % + (',\n'.join(' %s' % Repr(elem, as_ref).replace('\n', '\n ') + for elem in obj))) + if isinstance(obj, dict): if not obj: return '{}' - else: - return ('{\n%s\n}' % (',\n'.join( - ' %s: %s' % (Repr(key, as_ref).replace('\n', '\n '), - Repr(val, as_ref).replace('\n', '\n ')) - for key, val in obj.items()))) - else: - return repr(obj) + return ('{\n%s\n}' % (',\n'.join(' %s: %s' % + (Repr(key, as_ref).replace('\n', '\n '), + Repr(val, as_ref).replace('\n', '\n ')) + for key, val in obj.items()))) + return repr(obj) def GenericRepr(obj, names): @@ -100,7 +99,7 @@ ReprIndent(name, as_ref) for (name, as_ref) in names.items())) -class Kind(object): +class Kind: """Kind represents a type (e.g. int8, string). Attributes: @@ -214,15 +213,14 @@ setattr(cls, name, property(Get, Set)) def __eq__(self, rhs): - return (isinstance(rhs, ReferenceKind) - and super(ReferenceKind, self).__eq__(rhs) + return (isinstance(rhs, ReferenceKind) and super().__eq__(rhs) and self.is_nullable == rhs.is_nullable) def __hash__(self): - return hash((super(ReferenceKind, self).__hash__(), self.is_nullable)) + return hash((super().__hash__(), self.is_nullable)) def IsBackwardCompatible(self, rhs, checker): - return (super(ReferenceKind, self).IsBackwardCompatible(rhs, checker) + return (super().IsBackwardCompatible(rhs, checker) and self.is_nullable == rhs.is_nullable) @@ -295,7 +293,7 @@ ATTRIBUTE_ALLOWED_CONTEXT = 'AllowedContext' -class NamedValue(object): +class NamedValue: def __init__(self, module, parent_kind, mojom_name): self.module = module self.parent_kind = parent_kind @@ -315,7 +313,7 @@ return hash((self.parent_kind, self.mojom_name)) -class BuiltinValue(object): +class BuiltinValue: def __init__(self, value): self.value = value @@ -349,7 +347,7 @@ return self.field.name -class Constant(object): +class Constant: def __init__(self, mojom_name=None, kind=None, value=None, parent_kind=None): self.mojom_name = mojom_name self.name = None @@ -367,7 +365,7 @@ rhs.parent_kind)) -class Field(object): +class Field: def __init__(self, mojom_name=None, kind=None, @@ -480,12 +478,11 @@ return '<%s mojom_name=%r module=%s>' % (self.__class__.__name__, self.mojom_name, Repr(self.module, as_ref=True)) - else: - return GenericRepr(self, { - 'mojom_name': False, - 'fields': False, - 'module': True - }) + return GenericRepr(self, { + 'mojom_name': False, + 'fields': False, + 'module': True + }) def AddField(self, mojom_name, @@ -506,13 +503,13 @@ for constant in self.constants: constant.Stylize(stylizer) - def IsBackwardCompatible(self, older_struct, checker): - """This struct is backward-compatible with older_struct if and only if all - of the following conditions hold: + def IsBackwardCompatible(self, rhs, checker): + """This struct is backward-compatible with rhs (older_struct) if and only if + all of the following conditions hold: - Any newly added field is tagged with a [MinVersion] attribute specifying a version number greater than all previously used [MinVersion] attributes within the struct. - - All fields present in older_struct remain present in the new struct, + - All fields present in rhs remain present in the new struct, with the same ordinal position, same optional or non-optional status, same (or backward-compatible) type and where applicable, the same [MinVersion] attribute value. @@ -531,7 +528,7 @@ return fields_by_ordinal new_fields = buildOrdinalFieldMap(self) - old_fields = buildOrdinalFieldMap(older_struct) + old_fields = buildOrdinalFieldMap(rhs) if len(new_fields) < len(old_fields): # At least one field was removed, which is not OK. return False @@ -635,8 +632,7 @@ return '<%s spec=%r is_nullable=%r fields=%s>' % ( self.__class__.__name__, self.spec, self.is_nullable, Repr( self.fields)) - else: - return GenericRepr(self, {'fields': True, 'is_nullable': False}) + return GenericRepr(self, {'fields': True, 'is_nullable': False}) def AddField(self, mojom_name, kind, ordinal=None, attributes=None): field = UnionField(mojom_name, kind, ordinal, None, attributes) @@ -648,13 +644,13 @@ for field in self.fields: field.Stylize(stylizer) - def IsBackwardCompatible(self, older_union, checker): - """This union is backward-compatible with older_union if and only if all - of the following conditions hold: + def IsBackwardCompatible(self, rhs, checker): + """This union is backward-compatible with rhs (older_union) if and only if + all of the following conditions hold: - Any newly added field is tagged with a [MinVersion] attribute specifying a version number greater than all previously used [MinVersion] attributes within the union. - - All fields present in older_union remain present in the new union, + - All fields present in rhs remain present in the new union, with the same ordinal value, same optional or non-optional status, same (or backward-compatible) type, and where applicable, the same [MinVersion] attribute value. @@ -670,7 +666,7 @@ return fields_by_ordinal new_fields = buildOrdinalFieldMap(self) - old_fields = buildOrdinalFieldMap(older_union) + old_fields = buildOrdinalFieldMap(rhs) if len(new_fields) < len(old_fields): # At least one field was removed, which is not OK. return False @@ -759,12 +755,11 @@ return '<%s spec=%r is_nullable=%r kind=%s length=%r>' % ( self.__class__.__name__, self.spec, self.is_nullable, Repr( self.kind), self.length) - else: - return GenericRepr(self, { - 'kind': True, - 'length': False, - 'is_nullable': False - }) + return GenericRepr(self, { + 'kind': True, + 'length': False, + 'is_nullable': False + }) def __eq__(self, rhs): return (isinstance(rhs, Array) @@ -811,8 +806,7 @@ return '<%s spec=%r is_nullable=%r key_kind=%s value_kind=%s>' % ( self.__class__.__name__, self.spec, self.is_nullable, Repr(self.key_kind), Repr(self.value_kind)) - else: - return GenericRepr(self, {'key_kind': True, 'value_kind': True}) + return GenericRepr(self, {'key_kind': True, 'value_kind': True}) def __eq__(self, rhs): return (isinstance(rhs, Map) and @@ -980,7 +974,7 @@ self.kind, rhs.kind) -class Parameter(object): +class Parameter: def __init__(self, mojom_name=None, kind=None, @@ -1014,7 +1008,7 @@ rhs.default, rhs.attributes)) -class Method(object): +class Method: def __init__(self, interface, mojom_name, ordinal=None, attributes=None): self.interface = interface self.mojom_name = mojom_name @@ -1030,12 +1024,11 @@ def Repr(self, as_ref=True): if as_ref: return '<%s mojom_name=%r>' % (self.__class__.__name__, self.mojom_name) - else: - return GenericRepr(self, { - 'mojom_name': False, - 'parameters': True, - 'response_parameters': True - }) + return GenericRepr(self, { + 'mojom_name': False, + 'parameters': True, + 'response_parameters': True + }) def AddParameter(self, mojom_name, @@ -1135,12 +1128,11 @@ def Repr(self, as_ref=True): if as_ref: return '<%s mojom_name=%r>' % (self.__class__.__name__, self.mojom_name) - else: - return GenericRepr(self, { - 'mojom_name': False, - 'attributes': False, - 'methods': False - }) + return GenericRepr(self, { + 'mojom_name': False, + 'attributes': False, + 'methods': False + }) def AddMethod(self, mojom_name, ordinal=None, attributes=None): method = Method(self, mojom_name, ordinal, attributes) @@ -1156,10 +1148,10 @@ for constant in self.constants: constant.Stylize(stylizer) - def IsBackwardCompatible(self, older_interface, checker): - """This interface is backward-compatible with older_interface if and only - if all of the following conditions hold: - - All defined methods in older_interface (when identified by ordinal) have + def IsBackwardCompatible(self, rhs, checker): + """This interface is backward-compatible with rhs (older_interface) if and + only if all of the following conditions hold: + - All defined methods in rhs (when identified by ordinal) have backward-compatible definitions in this interface. For each method this means: - The parameter list is backward-compatible, according to backward- @@ -1173,7 +1165,7 @@ rules for structs. - All newly introduced methods in this interface have a [MinVersion] attribute specifying a version greater than any method in - older_interface. + rhs. """ def buildOrdinalMethodMap(interface): @@ -1186,7 +1178,7 @@ return methods_by_ordinal new_methods = buildOrdinalMethodMap(self) - old_methods = buildOrdinalMethodMap(older_interface) + old_methods = buildOrdinalMethodMap(rhs) max_old_min_version = 0 for ordinal, old_method in old_methods.items(): new_method = new_methods.get(ordinal) @@ -1319,7 +1311,7 @@ self.kind, rhs.kind) -class EnumField(object): +class EnumField: def __init__(self, mojom_name=None, value=None, @@ -1370,8 +1362,7 @@ def Repr(self, as_ref=True): if as_ref: return '<%s mojom_name=%r>' % (self.__class__.__name__, self.mojom_name) - else: - return GenericRepr(self, {'mojom_name': False, 'fields': False}) + return GenericRepr(self, {'mojom_name': False, 'fields': False}) def Stylize(self, stylizer): self.name = stylizer.StylizeEnum(self.mojom_name) @@ -1397,14 +1388,14 @@ return '%s%s' % (prefix, self.mojom_name) # pylint: disable=unused-argument - def IsBackwardCompatible(self, older_enum, checker): - """This enum is backward-compatible with older_enum if and only if one of - the following conditions holds: + def IsBackwardCompatible(self, rhs, checker): + """This enum is backward-compatible with rhs (older_enum) if and only if one + of the following conditions holds: - Neither enum is [Extensible] and both have the exact same set of valid numeric values. Field names and aliases for the same numeric value do not affect compatibility. - - older_enum is [Extensible], and for every version defined by - older_enum, this enum has the exact same set of valid numeric values. + - rhs is [Extensible], and for every version defined by + rhs, this enum has the exact same set of valid numeric values. """ def buildVersionFieldMap(enum): @@ -1415,10 +1406,10 @@ fields_by_min_version[field.min_version].add(field.numeric_value) return fields_by_min_version - old_fields = buildVersionFieldMap(older_enum) + old_fields = buildVersionFieldMap(rhs) new_fields = buildVersionFieldMap(self) - if new_fields.keys() != old_fields.keys() and not older_enum.extensible: + if new_fields.keys() != old_fields.keys() and not rhs.extensible: return False for min_version, valid_values in old_fields.items(): @@ -1445,7 +1436,7 @@ return id(self) -class Module(object): +class Module: def __init__(self, path=None, mojom_namespace=None, attributes=None): self.path = path self.mojom_namespace = mojom_namespace @@ -1480,16 +1471,15 @@ if as_ref: return '<%s path=%r mojom_namespace=%r>' % ( self.__class__.__name__, self.path, self.mojom_namespace) - else: - return GenericRepr( - self, { - 'path': False, - 'mojom_namespace': False, - 'attributes': False, - 'structs': False, - 'interfaces': False, - 'unions': False - }) + return GenericRepr( + self, { + 'path': False, + 'mojom_namespace': False, + 'attributes': False, + 'structs': False, + 'interfaces': False, + 'unions': False + }) def GetNamespacePrefix(self): return '%s.' % self.mojom_namespace if self.mojom_namespace else '' @@ -1775,18 +1765,17 @@ checked.add(kind.spec) if IsStructKind(kind): return any(Check(field.kind) for field in kind.fields) - elif IsUnionKind(kind): + if IsUnionKind(kind): return any(Check(field.kind) for field in kind.fields) - elif IsAnyHandleKind(kind): + if IsAnyHandleKind(kind): return True - elif IsAnyInterfaceKind(kind): + if IsAnyInterfaceKind(kind): return True - elif IsArrayKind(kind): + if IsArrayKind(kind): return Check(kind.kind) - elif IsMapKind(kind): + if IsMapKind(kind): return Check(kind.key_kind) or Check(kind.value_kind) - else: - return False + return False return Check(kind) @@ -1813,21 +1802,20 @@ checked.add(kind.spec) if IsEnumKind(kind): return kind.native_only - elif IsStructKind(kind): + if IsStructKind(kind): if kind.native_only: return True if any(enum.native_only for enum in kind.enums): return True return any(Check(field.kind) for field in kind.fields) - elif IsUnionKind(kind): + if IsUnionKind(kind): return any(Check(field.kind) for field in kind.fields) - elif IsInterfaceKind(kind): + if IsInterfaceKind(kind): return any(enum.native_only for enum in kind.enums) - elif IsArrayKind(kind): + if IsArrayKind(kind): return Check(kind.kind) - elif IsMapKind(kind): + if IsMapKind(kind): return Check(kind.key_kind) or Check(kind.value_kind) - else: - return False + return False return Check(kind)
diff --git a/mojo/public/tools/mojom/mojom/generate/pack.py b/mojo/public/tools/mojom/mojom/generate/pack.py index 88b77c98..1d5635b 100644 --- a/mojo/public/tools/mojom/mojom/generate/pack.py +++ b/mojo/public/tools/mojom/mojom/generate/pack.py
@@ -15,7 +15,7 @@ HEADER_SIZE = 8 -class PackedField(object): +class PackedField: kind_to_size = { mojom.BOOL: 1, mojom.INT8: 1, @@ -120,7 +120,7 @@ return offset + pad -class PackedStruct(object): +class PackedStruct: def __init__(self, struct): self.struct = struct # |packed_fields| contains all the fields, in increasing offset order. @@ -186,7 +186,7 @@ dst_fields.append(src_field) -class ByteInfo(object): +class ByteInfo: def __init__(self): self.is_padding = False self.packed_fields = [] @@ -214,7 +214,7 @@ return byte_info -class VersionInfo(object): +class VersionInfo: def __init__(self, version, num_fields, num_bytes): self.version = version self.num_fields = num_fields
diff --git a/mojo/public/tools/mojom/mojom/generate/translate.py b/mojo/public/tools/mojom/mojom/generate/translate.py index 0fb231d..727a3508 100644 --- a/mojo/public/tools/mojom/mojom/generate/translate.py +++ b/mojo/public/tools/mojom/mojom/generate/translate.py
@@ -459,8 +459,7 @@ for attribute in attribute_list: if attribute.key in attributes: raise Exception("Duplicate key (%s) in attribute list" % attribute.key) - else: - attributes[attribute.key] = _MapValueToEnum(module, attribute.value) + attributes[attribute.key] = _MapValueToEnum(module, attribute.value) return attributes
diff --git a/mojo/public/tools/mojom/mojom/parse/ast.py b/mojo/public/tools/mojom/mojom/parse/ast.py index d5007de..d48e068 100644 --- a/mojo/public/tools/mojom/mojom/parse/ast.py +++ b/mojo/public/tools/mojom/mojom/parse/ast.py
@@ -11,7 +11,11 @@ import os.path -class NodeBase(object): +# Instance of 'NodeListBase' has no '_list_item_type' member (no-member) +# pylint: disable=no-member + + +class NodeBase: """Base class for nodes in the AST.""" def __init__(self, filename=None, lineno=None): @@ -36,7 +40,7 @@ classes, in a tuple) of the members of the list.)""" def __init__(self, item_or_items=None, **kwargs): - super(NodeListBase, self).__init__(**kwargs) + super().__init__(**kwargs) self.items = [] if item_or_items is None: pass @@ -55,7 +59,7 @@ return self.items.__iter__() def __eq__(self, other): - return super(NodeListBase, self).__eq__(other) and \ + return super().__eq__(other) and \ self.items == other.items # Implement this so that on failure, we get slightly more sensible output. @@ -102,12 +106,12 @@ def __init__(self, key, value, **kwargs): assert isinstance(key, str) - super(Attribute, self).__init__(**kwargs) + super().__init__(**kwargs) self.key = key self.value = value def __eq__(self, other): - return super(Attribute, self).__eq__(other) and \ + return super().__eq__(other) and \ self.key == other.key and \ self.value == other.value @@ -128,13 +132,13 @@ # The value is either a literal (currently passed through as a string) or a # "wrapped identifier". assert isinstance(value, (tuple, str)) - super(Const, self).__init__(mojom_name, **kwargs) + super().__init__(mojom_name, **kwargs) self.attribute_list = attribute_list self.typename = typename self.value = value def __eq__(self, other): - return super(Const, self).__eq__(other) and \ + return super().__eq__(other) and \ self.attribute_list == other.attribute_list and \ self.typename == other.typename and \ self.value == other.value @@ -146,12 +150,12 @@ def __init__(self, mojom_name, attribute_list, enum_value_list, **kwargs): assert attribute_list is None or isinstance(attribute_list, AttributeList) assert enum_value_list is None or isinstance(enum_value_list, EnumValueList) - super(Enum, self).__init__(mojom_name, **kwargs) + super().__init__(mojom_name, **kwargs) self.attribute_list = attribute_list self.enum_value_list = enum_value_list def __eq__(self, other): - return super(Enum, self).__eq__(other) and \ + return super().__eq__(other) and \ self.attribute_list == other.attribute_list and \ self.enum_value_list == other.enum_value_list @@ -164,12 +168,12 @@ # "wrapped identifier". assert attribute_list is None or isinstance(attribute_list, AttributeList) assert value is None or isinstance(value, (tuple, str)) - super(EnumValue, self).__init__(mojom_name, **kwargs) + super().__init__(mojom_name, **kwargs) self.attribute_list = attribute_list self.value = value def __eq__(self, other): - return super(EnumValue, self).__eq__(other) and \ + return super().__eq__(other) and \ self.attribute_list == other.attribute_list and \ self.value == other.value @@ -187,13 +191,13 @@ def __init__(self, attribute_list, import_filename, **kwargs): assert attribute_list is None or isinstance(attribute_list, AttributeList) assert isinstance(import_filename, str) - super(Import, self).__init__(**kwargs) + super().__init__(**kwargs) self.attribute_list = attribute_list # TODO(crbug.com/953884): Use pathlib once we're migrated fully to Python 3. self.import_filename = os.path.normpath(import_filename).replace('\\', '/') def __eq__(self, other): - return super(Import, self).__eq__(other) and \ + return super().__eq__(other) and \ self.attribute_list == other.attribute_list and \ self.import_filename == other.import_filename @@ -210,12 +214,12 @@ def __init__(self, mojom_name, attribute_list, body, **kwargs): assert attribute_list is None or isinstance(attribute_list, AttributeList) assert isinstance(body, InterfaceBody) - super(Interface, self).__init__(mojom_name, **kwargs) + super().__init__(mojom_name, **kwargs) self.attribute_list = attribute_list self.body = body def __eq__(self, other): - return super(Interface, self).__eq__(other) and \ + return super().__eq__(other) and \ self.attribute_list == other.attribute_list and \ self.body == other.body @@ -230,14 +234,14 @@ assert isinstance(parameter_list, ParameterList) assert response_parameter_list is None or \ isinstance(response_parameter_list, ParameterList) - super(Method, self).__init__(mojom_name, **kwargs) + super().__init__(mojom_name, **kwargs) self.attribute_list = attribute_list self.ordinal = ordinal self.parameter_list = parameter_list self.response_parameter_list = response_parameter_list def __eq__(self, other): - return super(Method, self).__eq__(other) and \ + return super().__eq__(other) and \ self.attribute_list == other.attribute_list and \ self.ordinal == other.ordinal and \ self.parameter_list == other.parameter_list and \ @@ -258,12 +262,12 @@ # |mojom_namespace| is either none or a "wrapped identifier". assert mojom_namespace is None or isinstance(mojom_namespace, tuple) assert attribute_list is None or isinstance(attribute_list, AttributeList) - super(Module, self).__init__(**kwargs) + super().__init__(**kwargs) self.mojom_namespace = mojom_namespace self.attribute_list = attribute_list def __eq__(self, other): - return super(Module, self).__eq__(other) and \ + return super().__eq__(other) and \ self.mojom_namespace == other.mojom_namespace and \ self.attribute_list == other.attribute_list @@ -275,13 +279,13 @@ assert module is None or isinstance(module, Module) assert isinstance(import_list, ImportList) assert isinstance(definition_list, list) - super(Mojom, self).__init__(**kwargs) + super().__init__(**kwargs) self.module = module self.import_list = import_list self.definition_list = definition_list def __eq__(self, other): - return super(Mojom, self).__eq__(other) and \ + return super().__eq__(other) and \ self.module == other.module and \ self.import_list == other.import_list and \ self.definition_list == other.definition_list @@ -296,11 +300,11 @@ def __init__(self, value, **kwargs): assert isinstance(value, int) - super(Ordinal, self).__init__(**kwargs) + super().__init__(**kwargs) self.value = value def __eq__(self, other): - return super(Ordinal, self).__eq__(other) and \ + return super().__eq__(other) and \ self.value == other.value @@ -312,14 +316,14 @@ assert attribute_list is None or isinstance(attribute_list, AttributeList) assert ordinal is None or isinstance(ordinal, Ordinal) assert isinstance(typename, str) - super(Parameter, self).__init__(**kwargs) + super().__init__(**kwargs) self.mojom_name = mojom_name self.attribute_list = attribute_list self.ordinal = ordinal self.typename = typename def __eq__(self, other): - return super(Parameter, self).__eq__(other) and \ + return super().__eq__(other) and \ self.mojom_name == other.mojom_name and \ self.attribute_list == other.attribute_list and \ self.ordinal == other.ordinal and \ @@ -338,12 +342,12 @@ def __init__(self, mojom_name, attribute_list, body, **kwargs): assert attribute_list is None or isinstance(attribute_list, AttributeList) assert isinstance(body, StructBody) or body is None - super(Struct, self).__init__(mojom_name, **kwargs) + super().__init__(mojom_name, **kwargs) self.attribute_list = attribute_list self.body = body def __eq__(self, other): - return super(Struct, self).__eq__(other) and \ + return super().__eq__(other) and \ self.attribute_list == other.attribute_list and \ self.body == other.body @@ -363,16 +367,15 @@ assert isinstance(typename, str) # The optional default value is currently either a value as a string or a # "wrapped identifier". - assert default_value is None or isinstance(default_value, str) or \ - isinstance(default_value, tuple) - super(StructField, self).__init__(mojom_name, **kwargs) + assert default_value is None or isinstance(default_value, (str, tuple)) + super().__init__(mojom_name, **kwargs) self.attribute_list = attribute_list self.ordinal = ordinal self.typename = typename self.default_value = default_value def __eq__(self, other): - return super(StructField, self).__eq__(other) and \ + return super().__eq__(other) and \ self.attribute_list == other.attribute_list and \ self.ordinal == other.ordinal and \ self.typename == other.typename and \ @@ -398,12 +401,12 @@ def __init__(self, mojom_name, attribute_list, body, **kwargs): assert attribute_list is None or isinstance(attribute_list, AttributeList) assert isinstance(body, UnionBody) - super(Union, self).__init__(mojom_name, **kwargs) + super().__init__(mojom_name, **kwargs) self.attribute_list = attribute_list self.body = body def __eq__(self, other): - return super(Union, self).__eq__(other) and \ + return super().__eq__(other) and \ self.attribute_list == other.attribute_list and \ self.body == other.body @@ -414,13 +417,13 @@ assert attribute_list is None or isinstance(attribute_list, AttributeList) assert ordinal is None or isinstance(ordinal, Ordinal) assert isinstance(typename, str) - super(UnionField, self).__init__(mojom_name, **kwargs) + super().__init__(mojom_name, **kwargs) self.attribute_list = attribute_list self.ordinal = ordinal self.typename = typename def __eq__(self, other): - return super(UnionField, self).__eq__(other) and \ + return super().__eq__(other) and \ self.attribute_list == other.attribute_list and \ self.ordinal == other.ordinal and \ self.typename == other.typename
diff --git a/mojo/public/tools/mojom/mojom/parse/ast_unittest.py b/mojo/public/tools/mojom/mojom/parse/ast_unittest.py index 62798631..d30b745 100644 --- a/mojo/public/tools/mojom/mojom/parse/ast_unittest.py +++ b/mojo/public/tools/mojom/mojom/parse/ast_unittest.py
@@ -14,11 +14,11 @@ """Node type for tests.""" def __init__(self, value, **kwargs): - super(_TestNode, self).__init__(**kwargs) + super().__init__(**kwargs) self.value = value def __eq__(self, other): - return super(_TestNode, self).__eq__(other) and self.value == other.value + return super().__eq__(other) and self.value == other.value class _TestNodeList(ast.NodeListBase):
diff --git a/mojo/public/tools/mojom/mojom/parse/lexer.py b/mojo/public/tools/mojom/mojom/parse/lexer.py index 4a2fefc..a9da293 100644 --- a/mojo/public/tools/mojom/mojom/parse/lexer.py +++ b/mojo/public/tools/mojom/mojom/parse/lexer.py
@@ -22,7 +22,7 @@ # We have methods which look like they could be functions: # pylint: disable=R0201 -class Lexer(object): +class Lexer: def __init__(self, filename): self.filename = filename
diff --git a/mojo/public/tools/mojom/mojom/parse/parser.py b/mojo/public/tools/mojom/mojom/parse/parser.py index 50d7aae..5211262 100644 --- a/mojo/public/tools/mojom/mojom/parse/parser.py +++ b/mojo/public/tools/mojom/mojom/parse/parser.py
@@ -33,7 +33,7 @@ # We have methods which look like they could be functions: # pylint: disable=R0201 -class Parser(object): +class Parser: def __init__(self, lexer, source, filename): self.tokens = lexer.tokens self.source = source
diff --git a/mojo/public/tools/mojom/mojom_parser_test_case.py b/mojo/public/tools/mojom/mojom_parser_test_case.py index e213fbfa7..d235967 100644 --- a/mojo/public/tools/mojom/mojom_parser_test_case.py +++ b/mojo/public/tools/mojom/mojom_parser_test_case.py
@@ -20,7 +20,7 @@ resolution, and module serialization and deserialization.""" def __init__(self, method_name): - super(MojomParserTestCase, self).__init__(method_name) + super().__init__(method_name) self._temp_dir = None def setUp(self):
diff --git a/mojo/public/tools/mojom/version_compatibility_unittest.py b/mojo/public/tools/mojom/version_compatibility_unittest.py index 65db4dc..4e981ed 100644 --- a/mojo/public/tools/mojom/version_compatibility_unittest.py +++ b/mojo/public/tools/mojom/version_compatibility_unittest.py
@@ -23,7 +23,7 @@ checker = module.BackwardCompatibilityChecker() compatibility_map = {} - for name in old.keys(): + for name in old: compatibility_map[name] = checker.IsBackwardCompatible( new[name], old[name]) return compatibility_map
diff --git a/net/BUILD.gn b/net/BUILD.gn index fc6edfb..a733e5ec 100644 --- a/net/BUILD.gn +++ b/net/BUILD.gn
@@ -4452,10 +4452,6 @@ sources += [ "base/sockaddr_util_posix_unittest.cc" ] } - if (is_posix || is_fuchsia) { - sources += [ "socket/udp_socket_posix_unittest.cc" ] - } - if (is_android || is_chromeos_ash) { sources += [ "base/network_change_notifier_posix_unittest.cc" ] }
diff --git a/net/cookies/cookie_monster.cc b/net/cookies/cookie_monster.cc index 0bfad8d..7ccffa2 100644 --- a/net/cookies/cookie_monster.cc +++ b/net/cookies/cookie_monster.cc
@@ -995,12 +995,11 @@ DCHECK(thread_checker_.CalledOnValidThread()); // Iterate through all the of the cookies, grouped by host. - auto prev_range_end = cookies_.begin(); - while (prev_range_end != cookies_.end()) { - auto cur_range_begin = prev_range_end; + for (auto next = cookies_.begin(); next != cookies_.end();) { + auto cur_range_begin = next; const std::string key = cur_range_begin->first; // Keep a copy. auto cur_range_end = cookies_.upper_bound(key); - prev_range_end = cur_range_end; + next = cur_range_end; // Ensure no equivalent cookies for this host. TrimDuplicateCookiesForKey(key, cur_range_begin, cur_range_end,
diff --git a/net/dns/address_sorter_posix_unittest.cc b/net/dns/address_sorter_posix_unittest.cc index f4a55322f..124aa2f0 100644 --- a/net/dns/address_sorter_posix_unittest.cc +++ b/net/dns/address_sorter_posix_unittest.cc
@@ -77,32 +77,6 @@ return OK; } void UseNonBlockingIO() override {} - int WriteAsync( - const char* buffer, - size_t buf_len, - CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& traffic_annotation) override { - NOTIMPLEMENTED(); - return OK; - } - int WriteAsync( - DatagramBuffers buffers, - CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& traffic_annotation) override { - NOTIMPLEMENTED(); - return OK; - } - DatagramBuffers GetUnwrittenBuffers() override { - DatagramBuffers result; - NOTIMPLEMENTED(); - return result; - } - void SetWriteAsyncEnabled(bool enabled) override {} - void SetMaxPacketSize(size_t max_packet_size) override {} - bool WriteAsyncEnabled() override { return false; } - void SetWriteMultiCoreEnabled(bool enabled) override {} - void SetSendmmsgEnabled(bool enabled) override {} - void SetWriteBatchingActive(bool active) override {} int SetMulticastInterface(uint32_t interface_index) override { NOTIMPLEMENTED(); return ERR_NOT_IMPLEMENTED;
diff --git a/net/dns/host_cache.cc b/net/dns/host_cache.cc index 20d0624b..30b74c3 100644 --- a/net/dns/host_cache.cc +++ b/net/dns/host_cache.cc
@@ -1120,14 +1120,14 @@ // replace the entry. auto found = entries_.find(key); if (found == entries_.end()) { - Entry entry(error, std::move(ip_endpoints), std::move(endpoint_metadatas), - std::move(aliases), legacy_address_value, - std::move(text_records), std::move(hostname_records), - std::move(experimental_results), Entry::SOURCE_UNKNOWN, - expiration_time, network_changes_ - 1); - entry.set_pinning(maybe_pinned.value_or(false)); - entry.set_canonical_names(std::move(canonical_names)); - AddEntry(key, std::move(entry)); + Entry new_entry( + error, std::move(ip_endpoints), std::move(endpoint_metadatas), + std::move(aliases), legacy_address_value, std::move(text_records), + std::move(hostname_records), std::move(experimental_results), + Entry::SOURCE_UNKNOWN, expiration_time, network_changes_ - 1); + new_entry.set_pinning(maybe_pinned.value_or(false)); + new_entry.set_canonical_names(std::move(canonical_names)); + AddEntry(key, std::move(new_entry)); restore_size_++; } }
diff --git a/net/dns/mdns_client_impl.cc b/net/dns/mdns_client_impl.cc index f0cd2ce..61227620 100644 --- a/net/dns/mdns_client_impl.cc +++ b/net/dns/mdns_client_impl.cc
@@ -307,12 +307,12 @@ cache_.FindDnsRecords(0, record->name(), &records_to_remove, clock_->Now()); - for (const auto* record : records_to_remove) { - if (record->type() == dns_protocol::kTypeNSEC) + for (const auto* record_to_remove : records_to_remove) { + if (record_to_remove->type() == dns_protocol::kTypeNSEC) continue; - if (!rdata->GetBit(record->type())) { + if (!rdata->GetBit(record_to_remove->type())) { std::unique_ptr<const RecordParsed> record_removed = - cache_.RemoveRecord(record); + cache_.RemoveRecord(record_to_remove); DCHECK(record_removed); OnRecordRemoved(record_removed.get()); }
diff --git a/net/dns/mock_mdns_socket_factory.h b/net/dns/mock_mdns_socket_factory.h index 78036ef..ce50a88 100644 --- a/net/dns/mock_mdns_socket_factory.h +++ b/net/dns/mock_mdns_socket_factory.h
@@ -55,9 +55,6 @@ MOCK_CONST_METHOD1(GetPeerAddress, int(IPEndPoint* address)); int GetLocalAddress(IPEndPoint* address) const override; MOCK_METHOD0(UseNonBlockingIO, void()); - MOCK_METHOD0(UseWriteBatching, void()); - MOCK_METHOD0(UseMultiCore, void()); - MOCK_METHOD0(UseSendmmsg, void()); MOCK_CONST_METHOD0(NetLog, const NetLogWithSource&()); MOCK_METHOD0(AllowAddressReuse, void());
diff --git a/net/http/http_cache_transaction.cc b/net/http/http_cache_transaction.cc index 55617fb..3a0941eb 100644 --- a/net/http/http_cache_transaction.cc +++ b/net/http/http_cache_transaction.cc
@@ -3994,20 +3994,22 @@ "upgrade", "vary", }); - // Iterate the response headers looking for matches. - size_t iter = 0; - std::string name; - std::string value; // Pairs of (lower_case_header_name, header_value). std::vector<std::pair<std::string, std::string>> filtered_headers; // It's good to set the initial allocation size of the vector to the // expected size to avoid a lot of reallocations. This value was chosen as // it is a nice round number. filtered_headers.reserve(16); - while (response_.headers->EnumerateHeaderLines(&iter, &name, &value)) { - std::string lowered_name = base::ToLowerASCII(name); - if (kHeadersToInclude.contains(lowered_name)) { - filtered_headers.emplace_back(lowered_name, value); + { + // Iterate the response headers looking for matches. + size_t iter = 0; + std::string name; + std::string value; + while (response_.headers->EnumerateHeaderLines(&iter, &name, &value)) { + std::string lowered_name = base::ToLowerASCII(name); + if (kHeadersToInclude.contains(lowered_name)) { + filtered_headers.emplace_back(lowered_name, value); + } } } std::sort(filtered_headers.begin(), filtered_headers.end());
diff --git a/net/socket/datagram_client_socket.h b/net/socket/datagram_client_socket.h index 552565b..3342e1e 100644 --- a/net/socket/datagram_client_socket.h +++ b/net/socket/datagram_client_socket.h
@@ -50,82 +50,6 @@ // By default, this method is no-op. virtual void EnableRecvOptimization() {} - // As Write, but internally this can delay writes and batch them up - // for writing in a separate task. This is to increase throughput - // in bulk transfer scenarios (in QUIC) where a substantial - // proportion of CPU time is spend in kernel UDP writes, and total - // CPU time of the net IO thread saturates single core capacity. - // The batching is required to allow overlapped computation time - // between user and kernel packet processing. - // - // Returns the number of bytes written or a net error code. A - // return value of zero is possible, because with batching enabled, - // the underlying socket write may be delayed so as to accumulate - // multiple buffers. The return value may also be larger than the - // number of bytes in |buffers| due to completion of previous - // writes. [ Writing the batch to the socket typically happens on a - // different thread/cpu core. ] - // - // As with |Write|, a return value of ERR_IO_PENDING indicates the - // caller should suspend further writes until the callback fires. - // - // If a socket write returns an error, it will be surfaced either as - // the return value from the next call to |WriteAsync|, or via the - // callback. - // - // Not all platforms will implement this, see |write_async_enabled()| - // below. - virtual int WriteAsync( - DatagramBuffers buffers, - CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& traffic_annotation) = 0; - - // |buffer| is copied to an internal |DatagramBuffer|, caller - // |retains ownership of |buffer|. - virtual int WriteAsync( - const char* buffer, - size_t buf_len, - CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& traffic_annotation) = 0; - - // With WriteAsync, the caller may wish to try unwritten buffers on - // a new socket, e.g. with QUIC connection migration. - virtual DatagramBuffers GetUnwrittenBuffers() = 0; - - // Enable |WriteAsync()|. May be a noop, see |WriteAsyncEnabled()| - // below. Must be called right after construction and before other - // calls. This is intended to support rollout of |WriteAsync| for - // QUIC via a Finch trial, using the kWRBA client connection option. - virtual void SetWriteAsyncEnabled(bool enabled) = 0; - - // Needed with |WriteAsync()| enabled, for socket's - // |DatagramBufferPool|. Must be called right after construction - // and before other calls. - virtual void SetMaxPacketSize(size_t max_packet_size) = 0; - - // This is true if the |SetWriteAsyncEnabled(true)| has been called - // *and* the platform supports |WriteAsync()|. - virtual bool WriteAsyncEnabled() = 0; - - // In |WriteAsync()|, allow socket writing to happen on a separate - // core when advantageous. This can increase maximum single-stream - // throughput. Must be called right after construction and before - // other calls. This is intended to support QUIC Finch trials, using - // the kMLTC client connection option. - virtual void SetWriteMultiCoreEnabled(bool enabled) = 0; - - // In |WriteAsync()|, use |sendmmsg()| on platforms that support it. - // This can increase maximum single-stream throughput. Must be - // called right after construction and before other calls. This is - // intended to support QUIC Finch trials, using the kMMSG client - // connection option. - virtual void SetSendmmsgEnabled(bool enabled) = 0; - - // This is to (de-)activate batching in |WriteAsync|, e.g. in - // |QuicChromiumClientSession| based on whether there are large - // upload stream(s) active. - virtual void SetWriteBatchingActive(bool active) = 0; - // Set interface to use for data sent to multicast groups. If // |interface_index| set to 0, default interface is used. // Must be called before Connect(), ConnectUsingNetwork() or
diff --git a/net/socket/fuzzed_datagram_client_socket.cc b/net/socket/fuzzed_datagram_client_socket.cc index 8af4dd1a..a4c71ab 100644 --- a/net/socket/fuzzed_datagram_client_socket.cc +++ b/net/socket/fuzzed_datagram_client_socket.cc
@@ -92,34 +92,6 @@ void FuzzedDatagramClientSocket::UseNonBlockingIO() {} -int FuzzedDatagramClientSocket::WriteAsync( - DatagramBuffers buffers, - CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& traffic_annotation) { - return -1; -} - -int FuzzedDatagramClientSocket::WriteAsync( - const char* buffer, - size_t buf_len, - CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& traffic_annotation) { - return -1; -} - -DatagramBuffers FuzzedDatagramClientSocket::GetUnwrittenBuffers() { - DatagramBuffers result; - return result; -} - -void FuzzedDatagramClientSocket::SetWriteAsyncEnabled(bool enabled) {} -bool FuzzedDatagramClientSocket::WriteAsyncEnabled() { - return false; -} -void FuzzedDatagramClientSocket::SetMaxPacketSize(size_t max_packet_size) {} -void FuzzedDatagramClientSocket::SetWriteMultiCoreEnabled(bool enabled) {} -void FuzzedDatagramClientSocket::SetSendmmsgEnabled(bool enabled) {} -void FuzzedDatagramClientSocket::SetWriteBatchingActive(bool active) {} int FuzzedDatagramClientSocket::SetMulticastInterface( uint32_t interface_index) { return ERR_NOT_IMPLEMENTED;
diff --git a/net/socket/fuzzed_datagram_client_socket.h b/net/socket/fuzzed_datagram_client_socket.h index fecfd6a5..3bf0e4b6 100644 --- a/net/socket/fuzzed_datagram_client_socket.h +++ b/net/socket/fuzzed_datagram_client_socket.h
@@ -49,22 +49,6 @@ int GetPeerAddress(IPEndPoint* address) const override; int GetLocalAddress(IPEndPoint* address) const override; void UseNonBlockingIO() override; - int WriteAsync( - const char* buffer, - size_t buf_len, - CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& traffic_annotation) override; - int WriteAsync( - DatagramBuffers buffers, - CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& traffic_annotation) override; - DatagramBuffers GetUnwrittenBuffers() override; - void SetWriteAsyncEnabled(bool enabled) override; - void SetMaxPacketSize(size_t max_packet_size) override; - bool WriteAsyncEnabled() override; - void SetWriteMultiCoreEnabled(bool enabled) override; - void SetSendmmsgEnabled(bool enabled) override; - void SetWriteBatchingActive(bool active) override; int SetMulticastInterface(uint32_t interface_index) override; const NetLogWithSource& NetLog() const override;
diff --git a/net/socket/socket_test_util.cc b/net/socket/socket_test_util.cc index 99ac01b1..f1c52ada 100644 --- a/net/socket/socket_test_util.cc +++ b/net/socket/socket_test_util.cc
@@ -1571,82 +1571,6 @@ return write_result.result; } -int MockUDPClientSocket::WriteAsync( - const char* buffer, - size_t buf_len, - CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& /* traffic_annotation */) { - DCHECK(buffer); - DCHECK_GT(buf_len, 0u); - DCHECK(callback); - - if (!connected_ || !data_) - return ERR_UNEXPECTED; - data_transferred_ = true; - - std::string data(buffer, buf_len); - MockWriteResult write_result = data_->OnWrite(data); - - // ERR_IO_PENDING is a signal that the socket data will call back - // asynchronously. - if (write_result.result == ERR_IO_PENDING) { - pending_write_callback_ = std::move(callback); - return ERR_IO_PENDING; - } - if (write_result.mode == ASYNC) { - RunCallbackAsync(std::move(callback), write_result.result); - return ERR_IO_PENDING; - } - return write_result.result; -} - -int MockUDPClientSocket::WriteAsync( - DatagramBuffers buffers, - CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& /* traffic_annotation */) { - DCHECK(!buffers.empty()); - DCHECK(callback); - - if (!connected_ || !data_) - return ERR_UNEXPECTED; - - unwritten_buffers_ = std::move(buffers); - - int rv = 0; - size_t buf_len = 0; - do { - auto& buf = unwritten_buffers_.front(); - - buf_len = buf->length(); - std::string data(buf->data(), buf_len); - MockWriteResult write_result = data_->OnWrite(data); - rv = write_result.result; - - // ERR_IO_PENDING is a signal that the socket data will call back - // asynchronously. - if (write_result.result == ERR_IO_PENDING) { - pending_write_callback_ = std::move(callback); - return ERR_IO_PENDING; - } - if (write_result.mode == ASYNC) { - RunCallbackAsync(std::move(callback), write_result.result); - return ERR_IO_PENDING; - } - - if (rv < 0) { - return rv; - } - - unwritten_buffers_.pop_front(); - } while (!unwritten_buffers_.empty()); - - return buf_len; -} - -DatagramBuffers MockUDPClientSocket::GetUnwrittenBuffers() { - return std::move(unwritten_buffers_); -} - int MockUDPClientSocket::SetReceiveBufferSize(int32_t size) { return OK; } @@ -1678,14 +1602,6 @@ void MockUDPClientSocket::UseNonBlockingIO() {} -void MockUDPClientSocket::SetWriteAsyncEnabled(bool enabled) {} -bool MockUDPClientSocket::WriteAsyncEnabled() { - return false; -} -void MockUDPClientSocket::SetMaxPacketSize(size_t max_packet_size) {} -void MockUDPClientSocket::SetWriteMultiCoreEnabled(bool enabled) {} -void MockUDPClientSocket::SetSendmmsgEnabled(bool enabled) {} -void MockUDPClientSocket::SetWriteBatchingActive(bool active) {} int MockUDPClientSocket::SetMulticastInterface(uint32_t interface_index) { return OK; }
diff --git a/net/socket/socket_test_util.h b/net/socket/socket_test_util.h index e32e9701..1db07ee 100644 --- a/net/socket/socket_test_util.h +++ b/net/socket/socket_test_util.h
@@ -969,16 +969,6 @@ int buf_len, CompletionOnceCallback callback, const NetworkTrafficAnnotationTag& traffic_annotation) override; - int WriteAsync( - DatagramBuffers buffers, - CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& traffic_annotation) override; - int WriteAsync( - const char* buffer, - size_t buf_len, - CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& traffic_annotation) override; - DatagramBuffers GetUnwrittenBuffers() override; int SetReceiveBufferSize(int32_t size) override; int SetSendBufferSize(int32_t size) override; @@ -989,12 +979,6 @@ int GetPeerAddress(IPEndPoint* address) const override; int GetLocalAddress(IPEndPoint* address) const override; void UseNonBlockingIO() override; - void SetWriteAsyncEnabled(bool enabled) override; - void SetMaxPacketSize(size_t max_packet_size) override; - bool WriteAsyncEnabled() override; - void SetWriteMultiCoreEnabled(bool enabled) override; - void SetSendmmsgEnabled(bool enabled) override; - void SetWriteBatchingActive(bool active) override; int SetMulticastInterface(uint32_t interface_index) override; const NetLogWithSource& NetLog() const override;
diff --git a/net/socket/udp_client_socket.cc b/net/socket/udp_client_socket.cc index b898807..9bb4f198 100644 --- a/net/socket/udp_client_socket.cc +++ b/net/socket/udp_client_socket.cc
@@ -97,29 +97,6 @@ return socket_.Write(buf, buf_len, std::move(callback), traffic_annotation); } -int UDPClientSocket::WriteAsync( - const char* buffer, - size_t buf_len, - CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& traffic_annotation) { - DCHECK(WriteAsyncEnabled()); - return socket_.WriteAsync(buffer, buf_len, std::move(callback), - traffic_annotation); -} - -int UDPClientSocket::WriteAsync( - DatagramBuffers buffers, - CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& traffic_annotation) { - DCHECK(WriteAsyncEnabled()); - return socket_.WriteAsync(std::move(buffers), std::move(callback), - traffic_annotation); -} - -DatagramBuffers UDPClientSocket::GetUnwrittenBuffers() { - return socket_.GetUnwrittenBuffers(); -} - void UDPClientSocket::Close() { socket_.Close(); } @@ -158,30 +135,6 @@ #endif } -void UDPClientSocket::SetWriteAsyncEnabled(bool enabled) { - socket_.SetWriteAsyncEnabled(enabled); -} - -void UDPClientSocket::SetMaxPacketSize(size_t max_packet_size) { - socket_.SetMaxPacketSize(max_packet_size); -} - -bool UDPClientSocket::WriteAsyncEnabled() { - return socket_.WriteAsyncEnabled(); -} - -void UDPClientSocket::SetWriteMultiCoreEnabled(bool enabled) { - socket_.SetWriteMultiCoreEnabled(enabled); -} - -void UDPClientSocket::SetSendmmsgEnabled(bool enabled) { - socket_.SetSendmmsgEnabled(enabled); -} - -void UDPClientSocket::SetWriteBatchingActive(bool active) { - socket_.SetWriteBatchingActive(active); -} - int UDPClientSocket::SetMulticastInterface(uint32_t interface_index) { return socket_.SetMulticastInterface(interface_index); }
diff --git a/net/socket/udp_client_socket.h b/net/socket/udp_client_socket.h index e385e00..c55150d 100644 --- a/net/socket/udp_client_socket.h +++ b/net/socket/udp_client_socket.h
@@ -49,18 +49,6 @@ CompletionOnceCallback callback, const NetworkTrafficAnnotationTag& traffic_annotation) override; - int WriteAsync( - const char* buffer, - size_t buf_len, - CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& traffic_annotation) override; - int WriteAsync( - DatagramBuffers buffers, - CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& traffic_annotation) override; - - DatagramBuffers GetUnwrittenBuffers() override; - void Close() override; int GetPeerAddress(IPEndPoint* address) const override; int GetLocalAddress(IPEndPoint* address) const override; @@ -74,12 +62,6 @@ const NetLogWithSource& NetLog() const override; void EnableRecvOptimization() override; - void SetWriteAsyncEnabled(bool enabled) override; - bool WriteAsyncEnabled() override; - void SetMaxPacketSize(size_t max_packet_size) override; - void SetWriteMultiCoreEnabled(bool enabled) override; - void SetSendmmsgEnabled(bool enabled) override; - void SetWriteBatchingActive(bool active) override; int SetMulticastInterface(uint32_t interface_index) override; void SetIOSNetworkServiceType(int ios_network_service_type) override;
diff --git a/net/socket/udp_socket_posix.cc b/net/socket/udp_socket_posix.cc index 6c6e3e9..3dfc1920 100644 --- a/net/socket/udp_socket_posix.cc +++ b/net/socket/udp_socket_posix.cc
@@ -25,7 +25,6 @@ #include "base/bind.h" #include "base/callback.h" #include "base/callback_helpers.h" -#include "base/containers/stack_container.h" #include "base/debug/alias.h" #include "base/feature_list.h" #include "base/files/file_util.h" @@ -130,9 +129,7 @@ UDPSocketPosix::UDPSocketPosix(DatagramSocket::BindType bind_type, net::NetLog* net_log, const net::NetLogSource& source) - : write_async_watcher_(std::make_unique<WriteAsyncWatcher>(this)), - sender_(base::MakeRefCounted<UDPSocketPosixSender>()), - socket_(kInvalidSocket), + : socket_(kInvalidSocket), bind_type_(bind_type), read_socket_watcher_(FROM_HERE), write_socket_watcher_(FROM_HERE), @@ -285,7 +282,6 @@ is_connected_ = false; tag_ = SocketTag(); - write_async_timer_.Stop(); received_activity_monitor_.OnClose(); } @@ -1062,340 +1058,6 @@ tag_ = tag; } -UDPSocketPosixSender::UDPSocketPosixSender() = default; -UDPSocketPosixSender::~UDPSocketPosixSender() = default; - -SendResult::SendResult() : rv(0), write_count(0) {} -SendResult::~SendResult() = default; -SendResult::SendResult(int _rv, int _write_count, DatagramBuffers _buffers) - : rv(_rv), write_count(_write_count), buffers(std::move(_buffers)) {} -SendResult::SendResult(SendResult&& other) = default; - -SendResult UDPSocketPosixSender::InternalSendBuffers( - int fd, - DatagramBuffers buffers) const { - int rv = 0; - int write_count = 0; - for (auto& buffer : buffers) { - int result = HANDLE_EINTR(Send(fd, buffer->data(), buffer->length(), 0)); - if (result < 0) { - rv = MapSystemError(errno); - break; - } - write_count++; - } - return SendResult(rv, write_count, std::move(buffers)); -} - -#if HAVE_SENDMMSG -SendResult UDPSocketPosixSender::InternalSendmmsgBuffers( - int fd, - DatagramBuffers buffers) const { - base::StackVector<struct iovec, kWriteAsyncMaxBuffersThreshold + 1> msg_iov; - base::StackVector<struct mmsghdr, kWriteAsyncMaxBuffersThreshold + 1> msgvec; - msg_iov->reserve(buffers.size()); - for (auto& buffer : buffers) - msg_iov->push_back({const_cast<char*>(buffer->data()), buffer->length()}); - msgvec->reserve(buffers.size()); - for (size_t j = 0; j < buffers.size(); j++) - msgvec->push_back({{nullptr, 0, &msg_iov[j], 1, nullptr, 0, 0}, 0}); - int result = HANDLE_EINTR(Sendmmsg(fd, &msgvec[0], buffers.size(), 0)); - SendResult send_result(0, 0, std::move(buffers)); - if (result < 0) { - send_result.rv = MapSystemError(errno); - } else { - send_result.write_count = result; - } - return send_result; -} -#endif - -SendResult UDPSocketPosixSender::SendBuffers(int fd, DatagramBuffers buffers) { -#if HAVE_SENDMMSG - if (sendmmsg_enabled_) { - auto result = InternalSendmmsgBuffers(fd, std::move(buffers)); - if (LIKELY(result.rv != ERR_NOT_IMPLEMENTED)) { - return result; - } - DLOG(WARNING) << "senddmsg() not implemented, falling back to send()"; - sendmmsg_enabled_ = false; - buffers = std::move(result.buffers); - } -#endif - return InternalSendBuffers(fd, std::move(buffers)); -} - -ssize_t UDPSocketPosixSender::Send(int sockfd, - const void* buf, - size_t len, - int flags) const { - return send(sockfd, buf, len, flags); -} - -#if HAVE_SENDMMSG -int UDPSocketPosixSender::Sendmmsg(int sockfd, - struct mmsghdr* msgvec, - unsigned int vlen, - unsigned int flags) const { - return sendmmsg(sockfd, msgvec, vlen, flags); -} -#endif - -int UDPSocketPosix::WriteAsync( - const char* buffer, - size_t buf_len, - CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& traffic_annotation) { - DCHECK(datagram_buffer_pool_ != nullptr); - IncreaseWriteAsyncOutstanding(1); - datagram_buffer_pool_->Enqueue(buffer, buf_len, &pending_writes_); - return InternalWriteAsync(std::move(callback), traffic_annotation); -} - -int UDPSocketPosix::WriteAsync( - DatagramBuffers buffers, - CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& traffic_annotation) { - IncreaseWriteAsyncOutstanding(buffers.size()); - pending_writes_.splice(pending_writes_.end(), std::move(buffers)); - return InternalWriteAsync(std::move(callback), traffic_annotation); -} - -int UDPSocketPosix::InternalWriteAsync( - CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& traffic_annotation) { - CHECK(write_callback_.is_null()); - - // Surface error immediately if one is pending. - if (last_async_result_ < 0) { - return ResetLastAsyncResult(); - } - - size_t flush_threshold = - write_batching_active_ ? kWriteAsyncPostBuffersThreshold : 1; - if (pending_writes_.size() >= flush_threshold) { - FlushPending(); - // Surface error immediately if one is pending. - if (last_async_result_ < 0) { - return ResetLastAsyncResult(); - } - } - - if (!write_async_timer_running_) { - write_async_timer_running_ = true; - write_async_timer_.Start(FROM_HERE, kWriteAsyncMsThreshold, this, - &UDPSocketPosix::OnWriteAsyncTimerFired); - } - - int blocking_threshold = - write_batching_active_ ? kWriteAsyncMaxBuffersThreshold : 1; - if (write_async_outstanding_ >= blocking_threshold) { - write_callback_ = std::move(callback); - return ERR_IO_PENDING; - } - - DVLOG(2) << __func__ << " pending " << pending_writes_.size() - << " outstanding " << write_async_outstanding_; - return ResetWrittenBytes(); -} - -DatagramBuffers UDPSocketPosix::GetUnwrittenBuffers() { - write_async_outstanding_ -= pending_writes_.size(); - return std::move(pending_writes_); -} - -void UDPSocketPosix::FlushPending() { - // Nothing to do if socket is blocked. - if (write_async_watcher_->watching()) - return; - - if (pending_writes_.empty()) - return; - - if (write_async_timer_running_) - write_async_timer_.Reset(); - - int num_pending_writes = static_cast<int>(pending_writes_.size()); - if (!write_multi_core_enabled_ || - // Don't bother with post if not enough buffers - (num_pending_writes <= kWriteAsyncMinBuffersThreshold && - // but not if there is a previous post - // outstanding, to prevent out of order transmission. - (num_pending_writes == write_async_outstanding_))) { - LocalSendBuffers(); - } else { - PostSendBuffers(); - } -} - -// TODO(ckrasic) Sad face. Do this lazily because many tests exploded -// otherwise. |threading_and_tasks.md| advises to instantiate a -// |base::test::TaskEnvironment| in the test, implementing that -// for all tests that might exercise QUIC is too daunting. Also, in -// some tests it seemed like following the advice just broke in other -// ways. -base::SequencedTaskRunner* UDPSocketPosix::GetTaskRunner() { - if (task_runner_ == nullptr) - task_runner_ = base::ThreadPool::CreateSequencedTaskRunner({}); - return task_runner_.get(); -} - -void UDPSocketPosix::OnWriteAsyncTimerFired() { - DVLOG(2) << __func__ << " pending writes " << pending_writes_.size(); - if (pending_writes_.empty()) { - write_async_timer_.Stop(); - write_async_timer_running_ = false; - return; - } - if (last_async_result_ < 0) { - DVLOG(1) << __func__ << " socket not writeable"; - return; - } - FlushPending(); -} - -void UDPSocketPosix::LocalSendBuffers() { - DVLOG(1) << __func__ << " queue " << pending_writes_.size() << " out of " - << write_async_outstanding_ << " total"; - DidSendBuffers(sender_->SendBuffers(socket_, std::move(pending_writes_))); -} - -void UDPSocketPosix::PostSendBuffers() { - DVLOG(1) << __func__ << " queue " << pending_writes_.size() << " out of " - << write_async_outstanding_ << " total"; - base::PostTaskAndReplyWithResult( - GetTaskRunner(), FROM_HERE, - base::BindOnce(&UDPSocketPosixSender::SendBuffers, sender_, socket_, - std::move(pending_writes_)), - base::BindOnce(&UDPSocketPosix::DidSendBuffers, - weak_factory_.GetWeakPtr())); -} - -void UDPSocketPosix::DidSendBuffers(SendResult send_result) { - DVLOG(3) << __func__; - int write_count = send_result.write_count; - DatagramBuffers& buffers = send_result.buffers; - - DCHECK(!buffers.empty()); - int num_buffers = buffers.size(); - - // Dequeue buffers that have been written. - if (write_count > 0) { - write_async_outstanding_ -= write_count; - - DatagramBuffers::const_iterator it; - // Generate logs for written buffers - it = buffers.cbegin(); - for (int i = 0; i < write_count; i++, it++) { - auto& buffer = *it; - LogWrite(buffer->length(), buffer->data(), nullptr); - written_bytes_ += buffer->length(); - } - // Return written buffers to pool - DatagramBuffers written_buffers; - if (write_count == num_buffers) { - it = buffers.cend(); - } else { - it = buffers.cbegin(); - for (int i = 0; i < write_count; i++) { - it++; - } - } - written_buffers.splice(written_buffers.cend(), buffers, buffers.cbegin(), - it); - DCHECK(datagram_buffer_pool_ != nullptr); - datagram_buffer_pool_->Dequeue(&written_buffers); - } - - // Requeue left-over (unwritten) buffers. - if (!buffers.empty()) { - DVLOG(2) << __func__ << " requeue " << buffers.size() << " buffers"; - pending_writes_.splice(pending_writes_.begin(), std::move(buffers)); - } - - last_async_result_ = send_result.rv; - if (last_async_result_ == ERR_IO_PENDING) { - DVLOG(2) << __func__ << " WatchFileDescriptor start"; - if (!WatchFileDescriptor()) { - DVPLOG(1) << "WatchFileDescriptor failed on write"; - last_async_result_ = MapSystemError(errno); - LogWrite(last_async_result_, nullptr, nullptr); - } else { - last_async_result_ = 0; - } - } else if (last_async_result_ < 0 || pending_writes_.empty()) { - DVLOG(2) << __func__ << " WatchFileDescriptor stop: result " - << ErrorToShortString(last_async_result_) << " pending_writes " - << pending_writes_.size(); - StopWatchingFileDescriptor(); - } - DCHECK(last_async_result_ != ERR_IO_PENDING); - - if (write_callback_.is_null()) - return; - - if (last_async_result_ < 0) { - DVLOG(1) << last_async_result_; - // Update the writer with the latest result. - DoWriteCallback(ResetLastAsyncResult()); - } else if (write_async_outstanding_ < kWriteAsyncCallbackBuffersThreshold) { - DVLOG(1) << write_async_outstanding_ << " < " - << kWriteAsyncCallbackBuffersThreshold; - DoWriteCallback(ResetWrittenBytes()); - } -} - -void UDPSocketPosix::WriteAsyncWatcher::OnFileCanWriteWithoutBlocking(int) { - DVLOG(1) << __func__ << " queue " << socket_->pending_writes_.size() - << " out of " << socket_->write_async_outstanding_ << " total"; - socket_->StopWatchingFileDescriptor(); - socket_->FlushPending(); -} - -bool UDPSocketPosix::WatchFileDescriptor() { - if (write_async_watcher_->watching()) - return true; - bool result = InternalWatchFileDescriptor(); - if (result) { - write_async_watcher_->set_watching(true); - } - return result; -} - -void UDPSocketPosix::StopWatchingFileDescriptor() { - if (!write_async_watcher_->watching()) - return; - InternalStopWatchingFileDescriptor(); - write_async_watcher_->set_watching(false); -} - -bool UDPSocketPosix::InternalWatchFileDescriptor() { - return base::CurrentIOThread::Get()->WatchFileDescriptor( - socket_, true, base::MessagePumpForIO::WATCH_WRITE, - &write_socket_watcher_, write_async_watcher_.get()); -} - -void UDPSocketPosix::InternalStopWatchingFileDescriptor() { - bool ok = write_socket_watcher_.StopWatchingFileDescriptor(); - DCHECK(ok); -} - -void UDPSocketPosix::SetMaxPacketSize(size_t max_packet_size) { - datagram_buffer_pool_ = std::make_unique<DatagramBufferPool>(max_packet_size); -} - -int UDPSocketPosix::ResetLastAsyncResult() { - int result = last_async_result_; - last_async_result_ = 0; - return result; -} - -int UDPSocketPosix::ResetWrittenBytes() { - int bytes = written_bytes_; - written_bytes_ = 0; - return bytes; -} - int UDPSocketPosix::SetIOSNetworkServiceType(int ios_network_service_type) { if (ios_network_service_type == 0) { return OK;
diff --git a/net/socket/udp_socket_posix.h b/net/socket/udp_socket_posix.h index 1b9b203..770acb3e 100644 --- a/net/socket/udp_socket_posix.h +++ b/net/socket/udp_socket_posix.h
@@ -17,10 +17,8 @@ #include "base/message_loop/message_pump_for_io.h" #include "base/threading/thread_checker.h" #include "base/timer/timer.h" -#include "build/build_config.h" #include "net/base/address_family.h" #include "net/base/completion_once_callback.h" -#include "net/base/datagram_buffer.h" #include "net/base/io_buffer.h" #include "net/base/ip_endpoint.h" #include "net/base/net_export.h" @@ -33,14 +31,6 @@ #include "net/socket/udp_socket_global_limits.h" #include "net/traffic_annotation/network_traffic_annotation.h" -#if defined(__ANDROID__) && defined(__aarch64__) -#define HAVE_SENDMMSG 1 -#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) -#define HAVE_SENDMMSG 1 -#else -#define HAVE_SENDMMSG 0 -#endif - namespace net { class IPAddress; @@ -48,77 +38,6 @@ struct NetLogSource; class SocketTag; -// Sendresult is inspired by sendmmsg, but unlike sendmmsg it is not -// convenient to require that a positive |write_count| and a negative -// error code are mutually exclusive. -struct NET_EXPORT SendResult { - explicit SendResult(); - ~SendResult(); - SendResult(int rv, int write_count, DatagramBuffers buffers); - SendResult(SendResult& other) = delete; - SendResult& operator=(SendResult& other) = delete; - SendResult(SendResult&& other); - SendResult& operator=(SendResult&& other) = default; - int rv; - // number of successful writes. - int write_count; - DatagramBuffers buffers; -}; - -// Don't delay writes more than this. -const base::TimeDelta kWriteAsyncMsThreshold = base::Milliseconds(1); -// Prefer local if number of writes is not more than this. -const int kWriteAsyncMinBuffersThreshold = 2; -// Don't allow more than this many outstanding async writes. -const int kWriteAsyncMaxBuffersThreshold = 16; -// PostTask immediately when unwritten buffers reaches this. -const int kWriteAsyncPostBuffersThreshold = kWriteAsyncMaxBuffersThreshold / 2; -// Don't unblock writer unless pending async writes are less than this. -const int kWriteAsyncCallbackBuffersThreshold = kWriteAsyncMaxBuffersThreshold; - -// To allow mock |Send|/|Sendmsg| in testing. This has to be -// reference counted thread safe because |SendBuffers| and -// |SendmmsgBuffers| may be invoked in another thread via PostTask*. -class NET_EXPORT UDPSocketPosixSender - : public base::RefCountedThreadSafe<UDPSocketPosixSender> { - public: - UDPSocketPosixSender(); - - UDPSocketPosixSender(const UDPSocketPosixSender&) = delete; - UDPSocketPosixSender& operator=(const UDPSocketPosixSender&) = delete; - - SendResult SendBuffers(int fd, DatagramBuffers buffers); - - void SetSendmmsgEnabled(bool enabled) { -#if HAVE_SENDMMSG - sendmmsg_enabled_ = enabled; -#endif - } - - protected: - friend class base::RefCountedThreadSafe<UDPSocketPosixSender>; - - virtual ~UDPSocketPosixSender(); - virtual ssize_t Send(int sockfd, - const void* buf, - size_t len, - int flags) const; -#if HAVE_SENDMMSG - virtual int Sendmmsg(int sockfd, - struct mmsghdr* msgvec, - unsigned int vlen, - unsigned int flags) const; -#endif - - SendResult InternalSendBuffers(int fd, DatagramBuffers buffers) const; -#if HAVE_SENDMMSG - SendResult InternalSendmmsgBuffers(int fd, DatagramBuffers buffers) const; -#endif - - private: - bool sendmmsg_enabled_ = false; -}; - class NET_EXPORT UDPSocketPosix { public: // Performance helper for net::activity_monitor, it batches @@ -207,17 +126,6 @@ CompletionOnceCallback callback, const NetworkTrafficAnnotationTag& traffic_annotation); - // Refer to datagram_client_socket.h - int WriteAsync(DatagramBuffers buffers, - CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& traffic_annotation); - int WriteAsync(const char* buffer, - size_t buf_len, - CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& traffic_annotation); - - DatagramBuffers GetUnwrittenBuffers(); - // Reads from a socket and receive sender address information. // |buf| is the buffer to read data into. // |buf_len| is the maximum amount of data to read. @@ -354,27 +262,6 @@ // Apply |tag| to this socket. void ApplySocketTag(const SocketTag& tag); - void SetWriteAsyncEnabled(bool enabled) { write_async_enabled_ = enabled; } - bool WriteAsyncEnabled() { return write_async_enabled_; } - - void SetMaxPacketSize(size_t max_packet_size); - - void SetWriteMultiCoreEnabled(bool enabled) { - write_multi_core_enabled_ = enabled; - } - - void SetSendmmsgEnabled(bool enabled) { - DCHECK(sender_ != nullptr); - sender_->SetSendmmsgEnabled(enabled); - } - - void SetWriteBatchingActive(bool active) { write_batching_active_ = active; } - - void SetWriteAsyncMaxBuffers(int value) { - LOG(INFO) << "SetWriteAsyncMaxBuffers: " << value; - write_async_max_buffers_ = value; - } - // Enables experimental optimization. This method should be called // before the socket is used to read data for the first time. void enable_experimental_recv_optimization() { @@ -385,54 +272,6 @@ // Sets iOS Network Service Type for option SO_NET_SERVICE_TYPE. int SetIOSNetworkServiceType(int ios_network_service_type); - protected: - // WriteAsync batching etc. are to improve throughput of large high - // bandwidth uploads. - - // Watcher for WriteAsync paths. - class WriteAsyncWatcher : public base::MessagePumpForIO::FdWatcher { - public: - explicit WriteAsyncWatcher(UDPSocketPosix* socket) : socket_(socket) {} - - WriteAsyncWatcher(const WriteAsyncWatcher&) = delete; - WriteAsyncWatcher& operator=(const WriteAsyncWatcher&) = delete; - - // MessagePumpForIO::FdWatcher methods - - void OnFileCanReadWithoutBlocking(int /* fd */) override {} - - void OnFileCanWriteWithoutBlocking(int /* fd */) override; - - void set_watching(bool watching) { watching_ = watching; } - - bool watching() { return watching_; } - - private: - const raw_ptr<UDPSocketPosix> socket_; - bool watching_ = false; - }; - - void IncreaseWriteAsyncOutstanding(int increment) { - write_async_outstanding_ += increment; - } - - virtual bool InternalWatchFileDescriptor(); - virtual void InternalStopWatchingFileDescriptor(); - - void SetWriteCallback(CompletionOnceCallback callback) { - write_callback_ = std::move(callback); - } - - void DidSendBuffers(SendResult buffers); - void FlushPending(); - - std::unique_ptr<WriteAsyncWatcher> write_async_watcher_; - scoped_refptr<UDPSocketPosixSender> sender_; - std::unique_ptr<DatagramBufferPool> datagram_buffer_pool_; - // |WriteAsync| pending writes, does not include buffers that have - // been |PostTask*|'d. - DatagramBuffers pending_writes_; - private: enum SocketOptions { SOCKET_OPTION_MULTICAST_LOOP = 1 << 0 @@ -472,11 +311,6 @@ const raw_ptr<UDPSocketPosix> socket_; }; - int InternalWriteAsync(CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& traffic_annotation); - bool WatchFileDescriptor(); - void StopWatchingFileDescriptor(); - void DoReadCallback(int rv); void DoWriteCallback(int rv); void DidCompleteRead(); @@ -531,14 +365,6 @@ // Binds to a random port on |address|. int RandomBind(const IPAddress& address); - // Helpers for |WriteAsync| - base::SequencedTaskRunner* GetTaskRunner(); - void OnWriteAsyncTimerFired(); - void LocalSendBuffers(); - void PostSendBuffers(); - int ResetLastAsyncResult(); - int ResetWrittenBytes(); - int socket_; // Hash of |socket_| to verify that it is not corrupted when calling close(). @@ -580,21 +406,6 @@ ReadWatcher read_watcher_; WriteWatcher write_watcher_; - // Various bits to support |WriteAsync()|. - bool write_async_enabled_ = false; - bool write_batching_active_ = false; - bool write_multi_core_enabled_ = false; - int write_async_max_buffers_ = 16; - int written_bytes_ = 0; - - int last_async_result_ = 0; - base::RepeatingTimer write_async_timer_; - bool write_async_timer_running_ = false; - // Total writes in flight, including those |PostTask*|'d. - int write_async_outstanding_ = 0; - - scoped_refptr<base::SequencedTaskRunner> task_runner_; - // The buffer used by InternalRead() to retry Read requests scoped_refptr<IOBuffer> read_buf_; int read_buf_len_ = 0; @@ -641,9 +452,6 @@ OwnedUDPSocketCount owned_socket_count_; THREAD_CHECKER(thread_checker_); - - // Used for alternate writes that are posted for concurrent execution. - base::WeakPtrFactory<UDPSocketPosix> weak_factory_{this}; }; } // namespace net
diff --git a/net/socket/udp_socket_posix_unittest.cc b/net/socket/udp_socket_posix_unittest.cc deleted file mode 100644 index 0dc6170d..0000000 --- a/net/socket/udp_socket_posix_unittest.cc +++ /dev/null
@@ -1,722 +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 "net/socket/udp_socket_posix.h" - -#include "base/bind.h" -#include "build/build_config.h" -#include "net/base/completion_repeating_callback.h" -#include "net/base/net_errors.h" -#include "net/log/net_log.h" -#include "net/log/test_net_log.h" -#include "net/log/test_net_log_util.h" -#include "net/socket/datagram_socket.h" -#include "net/test/test_with_task_environment.h" -#include "net/traffic_annotation/network_traffic_annotation_test_helper.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -using ::testing::_; -using ::testing::InSequence; -using ::testing::Invoke; -using ::testing::InvokeWithoutArgs; -using ::testing::Return; - -namespace net::test { - -namespace { - -const size_t kMaxPacketSize = 1500; -const size_t kNumMsgs = 3; -const std::string kHelloMsg = "Hello world"; -const std::string kSecondMsg = "Second buffer"; -const std::string kThirdMsg = "Third buffer"; - -int SetWouldBlock() { - errno = EWOULDBLOCK; - return -1; -} - -#if HAVE_SENDMMSG -int SetNotImplemented() { - errno = ENOSYS; - return -1; -} -#endif - -bool WatcherSetInvalidHandle() { - errno = EBADF; - return false; -} - -int SetInvalidHandle() { - errno = EBADF; - return -1; -} - -} // namespace - -class MockUDPSocketPosixSender : public UDPSocketPosixSender { - public: - MOCK_CONST_METHOD4( - Send, - ssize_t(int sockfd, const void* buf, size_t len, int flags)); - MOCK_CONST_METHOD4(Sendmmsg, - int(int sockfd, - struct mmsghdr* msgvec, - unsigned int vlen, - unsigned int flags)); - - public: - SendResult InternalSendBuffers(int fd, DatagramBuffers buffers) const { - return UDPSocketPosixSender::InternalSendBuffers(fd, std::move(buffers)); - } -#if HAVE_SENDMMSG - SendResult InternalSendmmsgBuffers(int fd, DatagramBuffers buffers) const { - return UDPSocketPosixSender::InternalSendmmsgBuffers(fd, - std::move(buffers)); - } -#endif - - private: - ~MockUDPSocketPosixSender() override = default; -}; - -class MockUDPSocketPosix : public UDPSocketPosix { - public: - MockUDPSocketPosix(DatagramSocket::BindType bind_type, - net::NetLog* net_log, - const net::NetLogSource& source) - : UDPSocketPosix(bind_type, net_log, source) { - sender_ = base::MakeRefCounted<MockUDPSocketPosixSender>(); - } - - MockUDPSocketPosixSender* sender() { - return static_cast<MockUDPSocketPosixSender*>(sender_.get()); - } - - MOCK_METHOD0(InternalWatchFileDescriptor, bool()); - MOCK_METHOD0(InternalStopWatchingFileDescriptor, void()); - - void FlushPending() { UDPSocketPosix::FlushPending(); } - - void DidSendBuffers(SendResult buffers) { - UDPSocketPosix::DidSendBuffers(std::move(buffers)); - } - - void Enqueue(const std::string& msg, DatagramBuffers* buffers) { - datagram_buffer_pool_->Enqueue(msg.data(), msg.length(), buffers); - } - - void SetWriteCallback(CompletionOnceCallback callback) { - UDPSocketPosix::SetWriteCallback(std::move(callback)); - } - - void IncreaseWriteAsyncOutstanding(int increment) { - UDPSocketPosix::IncreaseWriteAsyncOutstanding(increment); - } - - void SetPendingWrites(DatagramBuffers buffers) { - pending_writes_ = std::move(buffers); - } - - void OnFileCanWriteWithoutBlocking() { - write_async_watcher_->OnFileCanWriteWithoutBlocking(1); - } -}; - -class UDPSocketPosixTest : public TestWithTaskEnvironment { - public: - UDPSocketPosixTest() - : TestWithTaskEnvironment( - base::test::TaskEnvironment::TimeSource::MOCK_TIME), - socket_(DatagramSocket::DEFAULT_BIND, NetLog::Get(), NetLogSource()) { - write_callback_ = base::BindRepeating(&UDPSocketPosixTest::OnWriteComplete, - weak_factory_.GetWeakPtr()); - } - - void SetUp() override { - socket_.SetWriteAsyncEnabled(true); - socket_.SetMaxPacketSize(kMaxPacketSize); - } - - void AddBuffer(const std::string& msg) { - socket_.IncreaseWriteAsyncOutstanding(1); - socket_.Enqueue(msg, &buffers_); - } - - void AddBuffers() { - for (const auto& msg : msgs_) { - AddBuffer(msg); - } - } - - void SaveBufferPtrs() { - int i = 0; - for (const auto& buffer : buffers_) { - buffer_ptrs_[i] = buffer.get(); - i++; - } - } - - void VerifyBufferPtrs() { - int i = 0; - for (auto it = buffers_.cbegin(); it != buffers_.cend(); it++) { - EXPECT_EQ(buffer_ptrs_[i], it->get()); - i++; - } - } - - void VerifyBuffersDequeued() { - AddBuffers(); - VerifyBufferPtrs(); - buffers_.clear(); - } - - void ResetWriteCallback() { - callback_fired_ = false; - rv_ = 0; - } - - void OnWriteComplete(int rv) { - callback_fired_ = true; - rv_ = rv; - } - - int WriteAsync(int i) { - return socket_.WriteAsync(msgs_[i].data(), lengths_[i], write_callback_, - TRAFFIC_ANNOTATION_FOR_TESTS); - } - - void ExpectSend(int i) { - EXPECT_CALL(*socket_.sender(), Send(_, _, lengths_[i], _)) - .WillOnce(Return(lengths_[i])); - } - - void ExpectSendWillBlock(int i) { - EXPECT_CALL(*socket_.sender(), Send(_, _, lengths_[i], _)) - .WillOnce(InvokeWithoutArgs(SetWouldBlock)); - EXPECT_CALL(socket_, InternalWatchFileDescriptor()).WillOnce(Return(true)); - } - - void ExpectSendWillError(int i) { - EXPECT_CALL(*socket_.sender(), Send(_, _, lengths_[i], _)) - .WillOnce(InvokeWithoutArgs(SetInvalidHandle)); - } - - void ExpectSends() { - InSequence dummy; - for (size_t i = 0; i < kNumMsgs; i++) { - ExpectSend(static_cast<int>(i)); - } - } - - void ExpectSendmmsg() { - EXPECT_CALL(*socket_.sender(), Sendmmsg(_, _, kNumMsgs, _)) - .WillOnce(Return(kNumMsgs)); - } - - RecordingNetLogObserver net_log_observer_; - MockUDPSocketPosix socket_; - DatagramBuffers buffers_; - bool callback_fired_ = false; - int rv_; - std::string msgs_[kNumMsgs] = {kHelloMsg, kSecondMsg, kThirdMsg}; - int lengths_[kNumMsgs] = {static_cast<int>(kHelloMsg.length()), - static_cast<int>(kSecondMsg.length()), - static_cast<int>(kThirdMsg.length())}; - int total_lengths_ = - kHelloMsg.length() + kSecondMsg.length() + kThirdMsg.length(); - DatagramBuffer* buffer_ptrs_[kNumMsgs]; - CompletionRepeatingCallback write_callback_; -#if HAVE_SENDMMSG - struct iovec msg_iov_[kNumMsgs]; - struct mmsghdr msgvec_[kNumMsgs]; -#endif - base::WeakPtrFactory<UDPSocketPosixTest> weak_factory_{this}; -}; - -TEST_F(UDPSocketPosixTest, InternalSendBuffers) { - AddBuffers(); - ExpectSends(); - SendResult result = socket_.sender()->SendBuffers(1, std::move(buffers_)); - DatagramBuffers& buffers = result.buffers; - EXPECT_EQ(0, result.rv); - EXPECT_EQ(3, result.write_count); - EXPECT_EQ(kNumMsgs, buffers.size()); -} - -TEST_F(UDPSocketPosixTest, InternalSendBuffersWriteError) { - AddBuffers(); - { - InSequence dummy; - EXPECT_CALL(*socket_.sender(), Send(_, _, lengths_[0], _)) - .WillOnce(Return(lengths_[0])); - EXPECT_CALL(*socket_.sender(), Send(_, _, lengths_[1], _)) - .WillOnce(InvokeWithoutArgs(SetWouldBlock)); - } - SendResult result = socket_.sender()->SendBuffers(1, std::move(buffers_)); - DatagramBuffers& buffers = result.buffers; - EXPECT_EQ(ERR_IO_PENDING, result.rv); - EXPECT_EQ(1, result.write_count); - EXPECT_EQ(kNumMsgs, buffers.size()); -} - -#if HAVE_SENDMMSG - -TEST_F(UDPSocketPosixTest, InternalSendmmsgBuffers) { - AddBuffers(); - ExpectSendmmsg(); - SendResult result = - socket_.sender()->InternalSendmmsgBuffers(1, std::move(buffers_)); - DatagramBuffers& buffers = result.buffers; - EXPECT_EQ(0, result.rv); - EXPECT_EQ(3, result.write_count); - EXPECT_EQ(kNumMsgs, buffers.size()); -} - -TEST_F(UDPSocketPosixTest, InternalSendmmsgBuffersWriteShort) { - AddBuffers(); - EXPECT_CALL(*socket_.sender(), Sendmmsg(_, _, kNumMsgs, _)) - .WillOnce(Return(1)); - SendResult result = - socket_.sender()->InternalSendmmsgBuffers(1, std::move(buffers_)); - DatagramBuffers& buffers = result.buffers; - EXPECT_EQ(0, result.rv); - EXPECT_EQ(1, result.write_count); - EXPECT_EQ(kNumMsgs, buffers.size()); -} - -TEST_F(UDPSocketPosixTest, InternalSendmmsgBuffersWriteError) { - AddBuffers(); - EXPECT_CALL(*socket_.sender(), Sendmmsg(_, _, kNumMsgs, _)) - .WillOnce(InvokeWithoutArgs(SetWouldBlock)); - SendResult result = - socket_.sender()->InternalSendmmsgBuffers(1, std::move(buffers_)); - DatagramBuffers& buffers = result.buffers; - EXPECT_EQ(ERR_IO_PENDING, result.rv); - EXPECT_EQ(0, result.write_count); - EXPECT_EQ(kNumMsgs, buffers.size()); -} - -TEST_F(UDPSocketPosixTest, SendInternalSend) { - AddBuffers(); - ExpectSends(); - SendResult result = socket_.sender()->SendBuffers(1, std::move(buffers_)); - EXPECT_EQ(0, result.rv); - EXPECT_EQ(3, result.write_count); - EXPECT_EQ(kNumMsgs, result.buffers.size()); -} - -TEST_F(UDPSocketPosixTest, SendInternalSendmmsg) { - socket_.sender()->SetSendmmsgEnabled(true); - AddBuffers(); - ExpectSendmmsg(); - SendResult result = socket_.sender()->SendBuffers(1, std::move(buffers_)); - EXPECT_EQ(0, result.rv); - EXPECT_EQ(3, result.write_count); - EXPECT_EQ(kNumMsgs, result.buffers.size()); -} - -TEST_F(UDPSocketPosixTest, SendInternalSendmmsgFallback) { - socket_.sender()->SetSendmmsgEnabled(true); - AddBuffers(); - { - InSequence dummy; - EXPECT_CALL(*socket_.sender(), Sendmmsg(_, _, kNumMsgs, _)) - .WillOnce(InvokeWithoutArgs(SetNotImplemented)); - ExpectSends(); - } - SendResult result = socket_.sender()->SendBuffers(1, std::move(buffers_)); - EXPECT_EQ(0, result.rv); - EXPECT_EQ(3, result.write_count); - EXPECT_EQ(kNumMsgs, result.buffers.size()); -} - -#endif // HAVE_SENDMMSG - -TEST_F(UDPSocketPosixTest, DidSendBuffers) { - AddBuffers(); - SaveBufferPtrs(); - SendResult send_result(0, kNumMsgs, std::move(buffers_)); - socket_.DidSendBuffers(std::move(send_result)); - EXPECT_EQ(0u, socket_.GetUnwrittenBuffers().size()); - VerifyBuffersDequeued(); - auto client_entries = net_log_observer_.GetEntries(); - EXPECT_EQ(4u, client_entries.size()); - EXPECT_TRUE( - LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE)); - EXPECT_TRUE(LogContainsEvent(client_entries, 1, - NetLogEventType::UDP_BYTES_SENT, - NetLogEventPhase::NONE)); - EXPECT_TRUE(LogContainsEvent(client_entries, 2, - NetLogEventType::UDP_BYTES_SENT, - NetLogEventPhase::NONE)); - EXPECT_TRUE(LogContainsEvent(client_entries, 3, - NetLogEventType::UDP_BYTES_SENT, - NetLogEventPhase::NONE)); - EXPECT_FALSE(callback_fired_); -} - -TEST_F(UDPSocketPosixTest, DidSendBuffersAsync) { - AddBuffers(); - SendResult send_result(0, kNumMsgs, std::move(buffers_)); - ResetWriteCallback(); - socket_.SetWriteCallback(write_callback_); - socket_.DidSendBuffers(std::move(send_result)); - EXPECT_EQ(0u, socket_.GetUnwrittenBuffers().size()); - auto client_entries = net_log_observer_.GetEntries(); - EXPECT_EQ(4u, client_entries.size()); - EXPECT_TRUE( - LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE)); - EXPECT_TRUE(LogContainsEvent(client_entries, 1, - NetLogEventType::UDP_BYTES_SENT, - NetLogEventPhase::NONE)); - EXPECT_TRUE(LogContainsEvent(client_entries, 2, - NetLogEventType::UDP_BYTES_SENT, - NetLogEventPhase::NONE)); - EXPECT_TRUE(LogContainsEvent(client_entries, 3, - NetLogEventType::UDP_BYTES_SENT, - NetLogEventPhase::NONE)); - EXPECT_TRUE(callback_fired_); - EXPECT_EQ(rv_, total_lengths_); -} - -TEST_F(UDPSocketPosixTest, DidSendBuffersError) { - AddBuffers(); - SendResult send_result(ERR_INVALID_HANDLE, 1, std::move(buffers_)); - ResetWriteCallback(); - socket_.SetWriteCallback(write_callback_); - socket_.DidSendBuffers(std::move(send_result)); - EXPECT_EQ(2u, socket_.GetUnwrittenBuffers().size()); - auto client_entries = net_log_observer_.GetEntries(); - EXPECT_EQ(2u, client_entries.size()); - EXPECT_TRUE( - LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE)); - EXPECT_TRUE(LogContainsEvent(client_entries, 1, - NetLogEventType::UDP_BYTES_SENT, - NetLogEventPhase::NONE)); - EXPECT_TRUE(callback_fired_); - EXPECT_EQ(rv_, ERR_INVALID_HANDLE); -} - -TEST_F(UDPSocketPosixTest, DidSendBuffersShort) { - AddBuffers(); - SendResult send_result(0, 1, std::move(buffers_)); - ResetWriteCallback(); - socket_.SetWriteCallback(write_callback_); - socket_.DidSendBuffers(std::move(send_result)); - EXPECT_EQ(2u, socket_.GetUnwrittenBuffers().size()); - auto client_entries = net_log_observer_.GetEntries(); - EXPECT_EQ(2u, client_entries.size()); - EXPECT_TRUE( - LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE)); - EXPECT_TRUE(LogContainsEvent(client_entries, 1, - NetLogEventType::UDP_BYTES_SENT, - NetLogEventPhase::NONE)); - EXPECT_TRUE(callback_fired_); - EXPECT_EQ(rv_, lengths_[0]); -} - -TEST_F(UDPSocketPosixTest, DidSendBuffersPending) { - AddBuffers(); - SendResult send_result(ERR_IO_PENDING, 1, std::move(buffers_)); - ResetWriteCallback(); - socket_.SetWriteCallback(write_callback_); - EXPECT_CALL(socket_, InternalWatchFileDescriptor()).WillOnce(Return(true)); - socket_.DidSendBuffers(std::move(send_result)); - EXPECT_EQ(2u, socket_.GetUnwrittenBuffers().size()); - auto client_entries = net_log_observer_.GetEntries(); - EXPECT_EQ(2u, client_entries.size()); - EXPECT_TRUE( - LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE)); - EXPECT_TRUE(LogContainsEvent(client_entries, 1, - NetLogEventType::UDP_BYTES_SENT, - NetLogEventPhase::NONE)); - EXPECT_TRUE(callback_fired_); - EXPECT_EQ(rv_, lengths_[0]); -} - -TEST_F(UDPSocketPosixTest, DidSendBuffersWatchError) { - AddBuffers(); - SendResult send_result(ERR_IO_PENDING, 1, std::move(buffers_)); - ResetWriteCallback(); - socket_.SetWriteCallback(write_callback_); - EXPECT_CALL(socket_, InternalWatchFileDescriptor()) - .WillOnce(InvokeWithoutArgs(WatcherSetInvalidHandle)); - socket_.DidSendBuffers(std::move(send_result)); - EXPECT_EQ(2u, socket_.GetUnwrittenBuffers().size()); - auto client_entries = net_log_observer_.GetEntries(); - EXPECT_EQ(3u, client_entries.size()); - EXPECT_TRUE( - LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE)); - EXPECT_TRUE(LogContainsEvent(client_entries, 1, - NetLogEventType::UDP_BYTES_SENT, - NetLogEventPhase::NONE)); - EXPECT_TRUE(LogContainsEvent(client_entries, 2, - NetLogEventType::UDP_SEND_ERROR, - NetLogEventPhase::NONE)); - EXPECT_TRUE(callback_fired_); - EXPECT_EQ(rv_, ERR_INVALID_HANDLE); -} - -TEST_F(UDPSocketPosixTest, DidSendBuffersStopWatch) { - AddBuffers(); - SendResult send_result(ERR_IO_PENDING, 1, std::move(buffers_)); - ResetWriteCallback(); - socket_.SetWriteCallback(write_callback_); - EXPECT_CALL(socket_, InternalWatchFileDescriptor()).WillOnce(Return(true)); - socket_.DidSendBuffers(std::move(send_result)); - buffers_ = socket_.GetUnwrittenBuffers(); - EXPECT_EQ(2u, buffers_.size()); - auto client_entries = net_log_observer_.GetEntries(); - EXPECT_EQ(2u, client_entries.size()); - EXPECT_TRUE( - LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE)); - EXPECT_TRUE(LogContainsEvent(client_entries, 1, - NetLogEventType::UDP_BYTES_SENT, - NetLogEventPhase::NONE)); - EXPECT_TRUE(callback_fired_); - EXPECT_EQ(rv_, lengths_[0]); - - SendResult send_result2(0, 2, std::move(buffers_)); - ResetWriteCallback(); - socket_.SetWriteCallback(write_callback_); - EXPECT_CALL(socket_, InternalStopWatchingFileDescriptor()); - - socket_.DidSendBuffers(std::move(send_result2)); - - EXPECT_EQ(0u, socket_.GetUnwrittenBuffers().size()); - client_entries = net_log_observer_.GetEntries(); - EXPECT_EQ(4u, client_entries.size()); - EXPECT_TRUE( - LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE)); - EXPECT_TRUE(LogContainsEvent(client_entries, 1, - NetLogEventType::UDP_BYTES_SENT, - NetLogEventPhase::NONE)); - EXPECT_TRUE(LogContainsEvent(client_entries, 2, - NetLogEventType::UDP_BYTES_SENT, - NetLogEventPhase::NONE)); - EXPECT_TRUE(LogContainsEvent(client_entries, 3, - NetLogEventType::UDP_BYTES_SENT, - NetLogEventPhase::NONE)); - EXPECT_TRUE(callback_fired_); - EXPECT_EQ(rv_, lengths_[1] + lengths_[2]); -} - -TEST_F(UDPSocketPosixTest, DidSendBuffersErrorStopWatch) { - AddBuffers(); - SendResult send_result(ERR_IO_PENDING, 1, std::move(buffers_)); - ResetWriteCallback(); - socket_.SetWriteCallback(write_callback_); - EXPECT_CALL(socket_, InternalWatchFileDescriptor()).WillOnce(Return(true)); - socket_.DidSendBuffers(std::move(send_result)); - buffers_ = socket_.GetUnwrittenBuffers(); - EXPECT_EQ(2u, buffers_.size()); - auto client_entries = net_log_observer_.GetEntries(); - EXPECT_EQ(2u, client_entries.size()); - EXPECT_TRUE( - LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE)); - EXPECT_TRUE(LogContainsEvent(client_entries, 1, - NetLogEventType::UDP_BYTES_SENT, - NetLogEventPhase::NONE)); - EXPECT_TRUE(callback_fired_); - EXPECT_EQ(rv_, lengths_[0]); - - SendResult send_result2(ERR_INVALID_HANDLE, 0, std::move(buffers_)); - ResetWriteCallback(); - socket_.SetWriteCallback(write_callback_); - EXPECT_CALL(socket_, InternalStopWatchingFileDescriptor()); - - socket_.DidSendBuffers(std::move(send_result2)); - - EXPECT_EQ(2u, socket_.GetUnwrittenBuffers().size()); - client_entries = net_log_observer_.GetEntries(); - EXPECT_EQ(2u, client_entries.size()); - EXPECT_TRUE( - LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE)); - EXPECT_TRUE(LogContainsEvent(client_entries, 1, - NetLogEventType::UDP_BYTES_SENT, - NetLogEventPhase::NONE)); - EXPECT_TRUE(callback_fired_); - EXPECT_EQ(rv_, ERR_INVALID_HANDLE); -} - -TEST_F(UDPSocketPosixTest, DidSendBuffersDelayCallbackWhileTooManyBuffers) { - for (int i = 0; i < kWriteAsyncCallbackBuffersThreshold + 2; i++) { - AddBuffer(msgs_[0]); - } - SendResult send_result(0, 2, std::move(buffers_)); - ResetWriteCallback(); - socket_.SetWriteCallback(write_callback_); - socket_.DidSendBuffers(std::move(send_result)); - auto client_entries = net_log_observer_.GetEntries(); - EXPECT_EQ(3u, client_entries.size()); - EXPECT_TRUE( - LogContainsBeginEvent(client_entries, 0, NetLogEventType::SOCKET_ALIVE)); - EXPECT_TRUE(LogContainsEvent(client_entries, 1, - NetLogEventType::UDP_BYTES_SENT, - NetLogEventPhase::NONE)); - EXPECT_TRUE(LogContainsEvent(client_entries, 2, - NetLogEventType::UDP_BYTES_SENT, - NetLogEventPhase::NONE)); - // bytes written but no callback because socket_.pending_writes_ is full. - EXPECT_FALSE(callback_fired_); - - // now the rest - buffers_ = socket_.GetUnwrittenBuffers(); - EXPECT_EQ(kWriteAsyncCallbackBuffersThreshold, - static_cast<int>(buffers_.size())); - SendResult send_result2(0, buffers_.size(), std::move(buffers_)); - ResetWriteCallback(); - socket_.SetWriteCallback(write_callback_); - socket_.DidSendBuffers(std::move(send_result2)); - EXPECT_TRUE(callback_fired_); - // rv includes bytes from previous invocation. - EXPECT_EQ(rv_, (kWriteAsyncCallbackBuffersThreshold + 2) * lengths_[0]); -} - -TEST_F(UDPSocketPosixTest, FlushPendingLocal) { - socket_.SetWriteMultiCoreEnabled(false); - AddBuffers(); - ExpectSends(); - socket_.SetPendingWrites(std::move(buffers_)); - ResetWriteCallback(); - socket_.SetWriteCallback(write_callback_); - socket_.FlushPending(); - EXPECT_TRUE(callback_fired_); - EXPECT_EQ(rv_, total_lengths_); -} - -TEST_F(UDPSocketPosixTest, FlushPendingMultiCore) { - socket_.SetWriteMultiCoreEnabled(true); - AddBuffers(); - ExpectSends(); - socket_.SetPendingWrites(std::move(buffers_)); - ResetWriteCallback(); - socket_.SetWriteCallback(write_callback_); - socket_.FlushPending(); - EXPECT_FALSE(callback_fired_); - RunUntilIdle(); - EXPECT_TRUE(callback_fired_); - EXPECT_EQ(rv_, total_lengths_); -} - -TEST_F(UDPSocketPosixTest, WriteAsyncNoBatching) { - socket_.SetWriteBatchingActive(false); - socket_.SetWriteMultiCoreEnabled(true); - DatagramBuffers buffers; - ExpectSend(0); - int rv = WriteAsync(0); - EXPECT_EQ(lengths_[0], rv); - ExpectSend(1); - rv = WriteAsync(1); - EXPECT_EQ(lengths_[1], rv); - ExpectSend(2); - rv = WriteAsync(2); - EXPECT_EQ(lengths_[2], rv); -} - -TEST_F(UDPSocketPosixTest, WriteAsyncNoBatchingErrIOPending) { - socket_.SetWriteBatchingActive(false); - socket_.SetWriteMultiCoreEnabled(true); - DatagramBuffers buffers; - ExpectSend(0); - int rv = WriteAsync(0); - EXPECT_EQ(lengths_[0], rv); - ExpectSendWillBlock(1); - rv = WriteAsync(1); - EXPECT_EQ(ERR_IO_PENDING, rv); - EXPECT_CALL(socket_, InternalStopWatchingFileDescriptor()); - ExpectSend(1); - socket_.OnFileCanWriteWithoutBlocking(); - EXPECT_TRUE(callback_fired_); - EXPECT_EQ(rv_, lengths_[1]); -} - -TEST_F(UDPSocketPosixTest, WriteAsyncNoBatchingError) { - socket_.SetWriteBatchingActive(false); - socket_.SetWriteMultiCoreEnabled(true); - DatagramBuffers buffers; - ExpectSend(0); - int rv = WriteAsync(0); - EXPECT_EQ(lengths_[0], rv); - ExpectSendWillError(1); - rv = WriteAsync(1); - EXPECT_EQ(ERR_INVALID_HANDLE, rv); -} - -TEST_F(UDPSocketPosixTest, WriteAsyncBasicDelay) { - socket_.SetWriteBatchingActive(true); - socket_.SetWriteMultiCoreEnabled(true); - DatagramBuffers buffers; - ASSERT_LT(kWriteAsyncMinBuffersThreshold, 3); - ASSERT_GT(kWriteAsyncPostBuffersThreshold, 3); - int rv = WriteAsync(0); - EXPECT_EQ(0, rv); - rv = WriteAsync(1); - EXPECT_EQ(0, rv); - rv = WriteAsync(2); - EXPECT_EQ(0, rv); - // Cause the write async timer to fire and above writes to flush. - ExpectSends(); - FastForwardBy(kWriteAsyncMsThreshold); - RunUntilIdle(); - rv = WriteAsync(0); - EXPECT_EQ(total_lengths_, rv); -} - -TEST_F(UDPSocketPosixTest, WriteAsyncPostBuffersThresholdLocal) { - socket_.SetWriteBatchingActive(true); - socket_.SetWriteMultiCoreEnabled(false); - DatagramBuffers buffers; - int rv = 0; - for (int i = 0; i < kWriteAsyncPostBuffersThreshold - 1; i++) { - WriteAsync(0); - EXPECT_EQ(0, rv); - } - EXPECT_CALL(*socket_.sender(), Send(_, _, lengths_[0], _)) - .Times(kWriteAsyncPostBuffersThreshold) - .WillRepeatedly(Return(lengths_[0])); - rv = WriteAsync(0); - EXPECT_EQ(kWriteAsyncPostBuffersThreshold * lengths_[0], rv); -} - -TEST_F(UDPSocketPosixTest, WriteAsyncPostBuffersThresholdRemote) { - socket_.SetWriteBatchingActive(true); - socket_.SetWriteMultiCoreEnabled(true); - EXPECT_CALL(*socket_.sender(), Send(_, _, lengths_[0], _)) - .Times(kWriteAsyncPostBuffersThreshold) - .WillRepeatedly(Return(lengths_[0])); - DatagramBuffers buffers; - int rv = 0; - for (int i = 0; i < kWriteAsyncPostBuffersThreshold; i++) { - WriteAsync(0); - EXPECT_EQ(0, rv); - } - RunUntilIdle(); - rv = WriteAsync(0); - EXPECT_EQ(kWriteAsyncPostBuffersThreshold * lengths_[0], rv); -} - -TEST_F(UDPSocketPosixTest, WriteAsyncPostBlocks) { - socket_.SetWriteBatchingActive(true); - socket_.SetWriteMultiCoreEnabled(true); - DatagramBuffers buffers; - for (int i = 0; i < kWriteAsyncMaxBuffersThreshold; i++) { - socket_.Enqueue(msgs_[0], &buffers_); - } - EXPECT_CALL(*socket_.sender(), Send(_, _, lengths_[0], _)) - .Times(kWriteAsyncMaxBuffersThreshold) - .WillRepeatedly(Return(lengths_[0])); - int rv = socket_.WriteAsync(std::move(buffers_), write_callback_, - TRAFFIC_ANNOTATION_FOR_TESTS); - EXPECT_EQ(ERR_IO_PENDING, rv); - EXPECT_FALSE(callback_fired_); - RunUntilIdle(); - EXPECT_TRUE(callback_fired_); - EXPECT_EQ(rv_, kWriteAsyncMaxBuffersThreshold * lengths_[0]); -} - -} // namespace net::test
diff --git a/net/socket/udp_socket_win.cc b/net/socket/udp_socket_win.cc index cefe415..df4cf61 100644 --- a/net/socket/udp_socket_win.cc +++ b/net/socket/udp_socket_win.cc
@@ -1182,37 +1182,6 @@ CHECK(tag == SocketTag()); } -void UDPSocketWin::SetWriteAsyncEnabled(bool enabled) {} -bool UDPSocketWin::WriteAsyncEnabled() { - return false; -} -void UDPSocketWin::SetMaxPacketSize(size_t max_packet_size) {} -void UDPSocketWin::SetWriteMultiCoreEnabled(bool enabled) {} -void UDPSocketWin::SetSendmmsgEnabled(bool enabled) {} -void UDPSocketWin::SetWriteBatchingActive(bool active) {} - -int UDPSocketWin::WriteAsync( - DatagramBuffers buffers, - CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& traffic_annotation) { - NOTIMPLEMENTED(); - return ERR_NOT_IMPLEMENTED; -} - -int UDPSocketWin::WriteAsync( - const char* buffer, - size_t buf_len, - CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& traffic_annotation) { - NOTIMPLEMENTED(); - return ERR_NOT_IMPLEMENTED; -} - -DatagramBuffers UDPSocketWin::GetUnwrittenBuffers() { - DatagramBuffers result; - NOTIMPLEMENTED(); - return result; -} DscpManager::DscpManager(QwaveApi* api, SOCKET socket) : api_(api), socket_(socket) { RequestHandle();
diff --git a/net/socket/udp_socket_win.h b/net/socket/udp_socket_win.h index 6248a68..99d2982 100644 --- a/net/socket/udp_socket_win.h +++ b/net/socket/udp_socket_win.h
@@ -22,7 +22,6 @@ #include "base/win/scoped_handle.h" #include "net/base/address_family.h" #include "net/base/completion_once_callback.h" -#include "net/base/datagram_buffer.h" #include "net/base/io_buffer.h" #include "net/base/ip_endpoint.h" #include "net/base/net_export.h" @@ -348,23 +347,6 @@ // to switch to non-blocking IO. void UseNonBlockingIO(); - void SetWriteAsyncEnabled(bool enabled); - bool WriteAsyncEnabled(); - void SetMaxPacketSize(size_t max_packet_size); - void SetWriteMultiCoreEnabled(bool enabled); - void SetSendmmsgEnabled(bool enabled); - void SetWriteBatchingActive(bool active); - - int WriteAsync(DatagramBuffers buffers, - CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& traffic_annotation); - int WriteAsync(const char* buffer, - size_t buf_len, - CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& traffic_annotation); - - DatagramBuffers GetUnwrittenBuffers(); - // Apply |tag| to this socket. void ApplySocketTag(const SocketTag& tag);
diff --git a/printing/backend/win_helper.cc b/printing/backend/win_helper.cc index 7f21c24..5e05794 100644 --- a/printing/backend/win_helper.cc +++ b/printing/backend/win_helper.cc
@@ -17,6 +17,7 @@ #include "base/files/file_path.h" #include "base/memory/free_deleter.h" #include "base/notreached.h" +#include "base/numerics/checked_math.h" #include "base/numerics/safe_conversions.h" #include "base/strings/string_piece.h" #include "base/strings/string_util.h" @@ -560,12 +561,19 @@ buffer_size = DocumentProperties(nullptr, printer, device_name_ptr, nullptr, nullptr, 0); } - if (buffer_size < static_cast<int>(sizeof(DEVMODE))) + // TODO(thestig): Consider limiting `buffer_size` to avoid buggy printer + // drivers that return excessively large values. + if (buffer_size < static_cast<LONG>(sizeof(DEVMODE))) return nullptr; // Some drivers request buffers with size smaller than dmSize + dmDriverExtra. - // crbug.com/421402 - buffer_size *= 2; + // Examples: crbug.com/421402, crbug.com/780016 + // Pad the `out` buffer so there is plenty of space. Calculate the size using + // `base::CheckedNumeric` to avoid a potential integer overflow. + base::CheckedNumeric<LONG> safe_buffer_size = buffer_size; + safe_buffer_size *= 2; + safe_buffer_size += 8192; + buffer_size = safe_buffer_size.ValueOrDie(); std::unique_ptr<DEVMODE, base::FreeDeleter> out( reinterpret_cast<DEVMODE*>(calloc(buffer_size, 1))); @@ -600,6 +608,8 @@ // recorded in crash dumps. // See https://crbug.com/780016 and https://crbug.com/806016 for example // crashes. + // TODO(crbug.com/780016): Remove this debug code if the CHECK_GE() below + // stops failing. base::debug::Alias(&size); base::debug::Alias(&extra_size); base::debug::Alias(&buffer_size);
diff --git a/services/network/first_party_sets/first_party_sets_access_delegate_unittest.cc b/services/network/first_party_sets/first_party_sets_access_delegate_unittest.cc index 221c66f7..7bcb2b7 100644 --- a/services/network/first_party_sets/first_party_sets_access_delegate_unittest.cc +++ b/services/network/first_party_sets/first_party_sets_access_delegate_unittest.cc
@@ -23,7 +23,11 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #include "url/gurl.h" +using ::testing::_; using ::testing::IsEmpty; +using ::testing::Optional; +using ::testing::Pair; +using ::testing::UnorderedElementsAre; using Type = net::SamePartyContext::Type; using OverrideSets = base::flat_map<net::SchemefulSite, absl::optional<net::SchemefulSite>>; @@ -239,94 +243,31 @@ } TEST_F(AsyncFirstPartySetsAccessDelegateTest, OverrideSets_ComputeMetadata) { - base::test::TestFuture<net::FirstPartySetMetadata> future; - { - // Force deallocation to provoke a UAF if the impl just copies the pointer. - net::SchemefulSite local_member1(kSet1Member1); - EXPECT_FALSE(delegate().ComputeMetadata( - kSet1Owner, &local_member1, {kSet1Member1}, future.GetCallback())); - } - - // The member of an override set is also an member of an existing set as an - // addition. delegate_remote()->NotifyReady(CreateFirstPartySetsReadyEvent({ {kSet1Member1, {kSet3Owner}}, - {kSet1Member2, {kSet3Owner}}, - {kSet1Owner, {kSet3Owner}}, {kSet3Owner, {kSet3Owner}}, })); - EXPECT_EQ(future.Get(), + EXPECT_EQ(ComputeMetadataAndWait(kSet3Owner, &kSet1Member1, {kSet1Member1}), net::FirstPartySetMetadata(net::SamePartyContext(Type::kSameParty), &kSet3Owner, &kSet3Owner)); } -TEST_F(AsyncFirstPartySetsAccessDelegateTest, OverrideSets_MemberIsOwner) { - base::test::TestFuture<FirstPartySetsAccessDelegate::OwnersResult> future; - EXPECT_FALSE(delegate().FindOwners( - { - kSet1Member1, - kSet1Member2, - kSet1Owner, - kSet2Member1, - kSet2Owner, - kSet3Member1, - kSet3Owner, - }, - future.GetCallback())); - // The member of an override set is also an owner of an existing set as an - // addition. +TEST_F(AsyncFirstPartySetsAccessDelegateTest, OverrideSets_FindOwner) { delegate_remote()->NotifyReady(CreateFirstPartySetsReadyEvent({ - {kSet3Member1, {kSet3Owner}}, - {kSet1Owner, {kSet3Owner}}, - {kSet1Member1, {kSet3Owner}}, - {kSet1Member2, {kSet3Owner}}, {kSet3Owner, {kSet3Owner}}, })); - EXPECT_EQ(future.Get(), FirstPartySetsAccessDelegate::OwnersResult({ - {kSet2Owner, kSet2Owner}, - {kSet2Member1, kSet2Owner}, - {kSet3Owner, kSet3Owner}, - {kSet2Member1, kSet3Owner}, - {kSet1Owner, kSet3Owner}, - {kSet1Member1, kSet3Owner}, - {kSet1Member2, kSet3Owner}, - {kSet3Member1, kSet3Owner}, - })); -} - -TEST_F(AsyncFirstPartySetsAccessDelegateTest, OverrideSets_FindOwner) { - base::test::TestFuture<FirstPartySetsAccessDelegate::OwnerResult> future; - EXPECT_FALSE(delegate().FindOwner(kSet1Member1, future.GetCallback())); - - // The owner of an override set is also an member of an existing set as an - // addition. - delegate_remote()->NotifyReady(CreateFirstPartySetsReadyEvent({ - {kSet1Owner, {kSet1Member1}}, - {kSet1Member1, {kSet1Member1}}, - {kSet1Member2, {kSet1Member1}}, - })); - - EXPECT_THAT(future.Get(), absl::make_optional(kSet1Member1)); + EXPECT_THAT(FindOwnerAndWait(kSet3Owner), Optional(_)); } TEST_F(AsyncFirstPartySetsAccessDelegateTest, OverrideSets_FindOwners) { - base::test::TestFuture<FirstPartySetsAccessDelegate::OwnersResult> future; - EXPECT_FALSE( - delegate().FindOwners({kSet1Member1, kSet1Owner}, future.GetCallback())); - - // The owner of a override set is also a member of an existing set as a - // replacement. delegate_remote()->NotifyReady(CreateFirstPartySetsReadyEvent({ - {kSet1Member2, {kSet1Member1}}, - {kSet1Member1, {kSet1Member1}}, - {kSet1Owner, absl::nullopt}, + {kSet3Owner, {kSet3Owner}}, })); - EXPECT_THAT(future.Get(), FirstPartySetsAccessDelegate::OwnersResult({ - {kSet1Member1, kSet1Member1}, - })); + EXPECT_THAT(FindOwnersAndWait({kSet3Owner}), + UnorderedElementsAre(Pair(kSet3Owner, _))); } class SyncFirstPartySetsAccessDelegateTest
diff --git a/services/network/first_party_sets/first_party_sets_manager_unittest.cc b/services/network/first_party_sets/first_party_sets_manager_unittest.cc index bf56e61..f5402fb 100644 --- a/services/network/first_party_sets/first_party_sets_manager_unittest.cc +++ b/services/network/first_party_sets/first_party_sets_manager_unittest.cc
@@ -921,330 +921,65 @@ {net::SchemefulSite(GURL("https://example.test")), net::SchemefulSite(GURL("https://example.test"))}, }); + + SetFirstPartySetsContextConfig( + true, + { + // New entry: + {net::SchemefulSite(GURL("https://foo.test")), + {net::SchemefulSite(GURL("https://foo.test"))}}, + // Removed entry: + {net::SchemefulSite(GURL("https://member1.test")), absl::nullopt}, + // Remapped entry: + {net::SchemefulSite(GURL("https://member2.test")), + {net::SchemefulSite(GURL("https://foo.test"))}}, + }); } }; -TEST_F(OverrideSetsFirstPartySetsManagerTest, FindOwner_NoIntersection) { - SetFirstPartySetsContextConfig( - true, { - {net::SchemefulSite(GURL("https://member3.test")), - {net::SchemefulSite(GURL("https://foo.test"))}}, - // Below are the owner self mappings. - {net::SchemefulSite(GURL("https://foo.test")), - {net::SchemefulSite(GURL("https://foo.test"))}}, - }); - - EXPECT_EQ(FindOwnerAndWait(net::SchemefulSite(GURL("https://member1.test"))), - net::SchemefulSite(GURL("https://example.test"))); - EXPECT_EQ(FindOwnerAndWait(net::SchemefulSite(GURL("https://member3.test"))), - net::SchemefulSite(GURL("https://foo.test"))); +TEST_F(OverrideSetsFirstPartySetsManagerTest, FindOwner) { EXPECT_EQ(FindOwnerAndWait(net::SchemefulSite(GURL("https://foo.test"))), net::SchemefulSite(GURL("https://foo.test"))); -} - -// The member of a override set is also a member of an existing set as a -// replacement. -TEST_F(OverrideSetsFirstPartySetsManagerTest, - FindOwner_ReplacesExistingMember) { - // The owner of the existing set is mapped to nullopt since it gets removed - // after its member is replaced due to an override set and the owner becomes a - // singleton. - SetFirstPartySetsContextConfig( - true, - { - {net::SchemefulSite(GURL("https://member1.test")), - {net::SchemefulSite(GURL("https://foo.test"))}}, - {net::SchemefulSite(GURL("https://example.test")), absl::nullopt}, - {net::SchemefulSite(GURL("https://member2.test")), absl::nullopt}, - // Below are the owner self mappings. - {net::SchemefulSite(GURL("https://foo.test")), - {net::SchemefulSite(GURL("https://foo.test"))}}, - }); - - EXPECT_EQ(FindOwnerAndWait(net::SchemefulSite(GURL("https://member1.test"))), - net::SchemefulSite(GURL("https://foo.test"))); - EXPECT_EQ(FindOwnerAndWait(net::SchemefulSite(GURL("https://member2.test"))), - absl::nullopt); - EXPECT_EQ(FindOwnerAndWait(net::SchemefulSite(GURL("https://example.test"))), - absl::nullopt); -} - -// The owner of a override set is also an owner of an existing set as a -// replacement. -TEST_F(OverrideSetsFirstPartySetsManagerTest, FindOwner_ReplacesExistingOwner) { - // The member of the existing set is mapped to nullopt since it gets removed - // after its owner is replaced to an override set and it becomes a singleton. - SetFirstPartySetsContextConfig( - true, - { - {net::SchemefulSite(GURL("https://member3.test")), - {net::SchemefulSite(GURL("https://example.test"))}}, - {net::SchemefulSite(GURL("https://member1.test")), absl::nullopt}, - {net::SchemefulSite(GURL("https://member2.test")), absl::nullopt}, - // Below are the owner self mappings. - {net::SchemefulSite(GURL("https://example.test")), - {net::SchemefulSite(GURL("https://example.test"))}}, - }); - EXPECT_EQ(FindOwnerAndWait(net::SchemefulSite(GURL("https://member1.test"))), absl::nullopt); EXPECT_EQ(FindOwnerAndWait(net::SchemefulSite(GURL("https://member2.test"))), - absl::nullopt); - EXPECT_EQ(FindOwnerAndWait(net::SchemefulSite(GURL("https://member3.test"))), - net::SchemefulSite(GURL("https://example.test"))); -} - -// The owner of an override set is also an owner of an existing set as an -// addition. -TEST_F(OverrideSetsFirstPartySetsManagerTest, FindOwner_AdditionMutualOwner) { - SetFirstPartySetsContextConfig( - true, { - {net::SchemefulSite(GURL("https://member3.test")), - {net::SchemefulSite(GURL("https://example.test"))}}, - // Below are the owner self mappings. - {net::SchemefulSite(GURL("https://example.test")), - {net::SchemefulSite(GURL("https://example.test"))}}, - }); - - EXPECT_EQ(FindOwnerAndWait(net::SchemefulSite(GURL("https://member1.test"))), - net::SchemefulSite(GURL("https://example.test"))); - EXPECT_EQ(FindOwnerAndWait(net::SchemefulSite(GURL("https://member2.test"))), - net::SchemefulSite(GURL("https://example.test"))); - EXPECT_EQ(FindOwnerAndWait(net::SchemefulSite(GURL("https://member3.test"))), - net::SchemefulSite(GURL("https://example.test"))); -} - -// The owner of a override set is a member of an existing set as an addition. -TEST_F(OverrideSetsFirstPartySetsManagerTest, FindOwner_AdditionOwnerIsMember) { - // All the sites in the existing set are reparented to the new owner. - SetFirstPartySetsContextConfig( - true, { - {net::SchemefulSite(GURL("https://member3.test")), - {net::SchemefulSite(GURL("https://member1.test"))}}, - {net::SchemefulSite(GURL("https://example.test")), - {net::SchemefulSite(GURL("https://member1.test"))}}, - {net::SchemefulSite(GURL("https://member2.test")), - {net::SchemefulSite(GURL("https://member1.test"))}}, - // Below are the owner self mappings. - {net::SchemefulSite(GURL("https://member1.test")), - {net::SchemefulSite(GURL("https://member1.test"))}}, - }); - - EXPECT_EQ(FindOwnerAndWait(net::SchemefulSite(GURL("https://member1.test"))), - net::SchemefulSite(GURL("https://member1.test"))); - EXPECT_EQ(FindOwnerAndWait(net::SchemefulSite(GURL("https://member2.test"))), - net::SchemefulSite(GURL("https://member1.test"))); - EXPECT_EQ(FindOwnerAndWait(net::SchemefulSite(GURL("https://member3.test"))), - net::SchemefulSite(GURL("https://member1.test"))); - EXPECT_EQ(FindOwnerAndWait(net::SchemefulSite(GURL("https://example.test"))), - net::SchemefulSite(GURL("https://member1.test"))); -} - -// The member of a override set is also an owner of an existing set as an -// addition. -TEST_F(OverrideSetsFirstPartySetsManagerTest, FindOwner_AdditionMemberIsOwner) { - // The member of the existing set for that owner is reparented to the new - // owner as addition. - SetFirstPartySetsContextConfig( - true, { - {net::SchemefulSite(GURL("https://example.test")), - {net::SchemefulSite(GURL("https://foo.test"))}}, - {net::SchemefulSite(GURL("https://member1.test")), - {net::SchemefulSite(GURL("https://foo.test"))}}, - {net::SchemefulSite(GURL("https://member2.test")), - {net::SchemefulSite(GURL("https://foo.test"))}}, - // Below are the owner self mappings. - {net::SchemefulSite(GURL("https://foo.test")), - {net::SchemefulSite(GURL("https://foo.test"))}}, - }); - - EXPECT_EQ(FindOwnerAndWait(net::SchemefulSite(GURL("https://example.test"))), - net::SchemefulSite(GURL("https://foo.test"))); - EXPECT_EQ(FindOwnerAndWait(net::SchemefulSite(GURL("https://member1.test"))), - net::SchemefulSite(GURL("https://foo.test"))); - EXPECT_EQ(FindOwnerAndWait(net::SchemefulSite(GURL("https://member2.test"))), net::SchemefulSite(GURL("https://foo.test"))); } -TEST_F(OverrideSetsFirstPartySetsManagerTest, NoIntersection) { - SetFirstPartySetsContextConfig( - true, { - {net::SchemefulSite(GURL("https://member3.test")), - {net::SchemefulSite(GURL("https://foo.test"))}}, - // Below are the owner self mappings. - {net::SchemefulSite(GURL("https://foo.test")), - {net::SchemefulSite(GURL("https://foo.test"))}}, - }); - +TEST_F(OverrideSetsFirstPartySetsManagerTest, FindOwners) { EXPECT_THAT(FindOwnersAndWait({ - net::SchemefulSite(GURL("https://foo.test")), - net::SchemefulSite(GURL("https://example.test")), net::SchemefulSite(GURL("https://member1.test")), net::SchemefulSite(GURL("https://member2.test")), - net::SchemefulSite(GURL("https://member3.test")), + net::SchemefulSite(GURL("https://foo.test")), }), UnorderedElementsAre(Pair(SerializesTo("https://foo.test"), SerializesTo("https://foo.test")), - Pair(SerializesTo("https://example.test"), - SerializesTo("https://example.test")), - Pair(SerializesTo("https://member1.test"), - SerializesTo("https://example.test")), - Pair(SerializesTo("https://member2.test"), - SerializesTo("https://example.test")), - Pair(SerializesTo("https://member3.test"), - SerializesTo("https://foo.test")))); -} - -// The member of a override set is also a member of an existing set as a -// replacement. -TEST_F(OverrideSetsFirstPartySetsManagerTest, ReplacesExistingMember) { - // The owner of the existing set is mapped to nullopt since it gets removed - // after its member is replaced to an override set and it becomes a singleton. - SetFirstPartySetsContextConfig( - true, - { - {net::SchemefulSite(GURL("https://member1.test")), - {net::SchemefulSite(GURL("https://foo.test"))}}, - {net::SchemefulSite(GURL("https://example.test")), absl::nullopt}, - {net::SchemefulSite(GURL("https://member2.test")), absl::nullopt}, - // Below are the owner self mappings. - {net::SchemefulSite(GURL("https://foo.test")), - {net::SchemefulSite(GURL("https://foo.test"))}}, - }); - - EXPECT_THAT(FindOwnersAndWait({ - net::SchemefulSite(GURL("https://foo.test")), - net::SchemefulSite(GURL("https://example.test")), - net::SchemefulSite(GURL("https://member1.test")), - net::SchemefulSite(GURL("https://member2.test")), - }), - UnorderedElementsAre(Pair(SerializesTo("https://foo.test"), - SerializesTo("https://foo.test")), - Pair(SerializesTo("https://member1.test"), - SerializesTo("https://foo.test")))); -} - -// The owner of a override set is also an owner of an existing set as a -// replacement. -TEST_F(OverrideSetsFirstPartySetsManagerTest, ReplacesExistingOwner) { - // The member of the existing set is mapped to nullopt since it gets removed - // after its owner is replaced to an override set and it becomes a singleton. - SetFirstPartySetsContextConfig( - true, - { - {net::SchemefulSite(GURL("https://member3.test")), - {net::SchemefulSite(GURL("https://example.test"))}}, - {net::SchemefulSite(GURL("https://member1.test")), absl::nullopt}, - {net::SchemefulSite(GURL("https://member2.test")), absl::nullopt}, - // Below are the owner self mappings. - {net::SchemefulSite(GURL("https://example.test")), - {net::SchemefulSite(GURL("https://example.test"))}}, - }); - - EXPECT_THAT(FindOwnersAndWait({ - net::SchemefulSite(GURL("https://example.test")), - net::SchemefulSite(GURL("https://member1.test")), - net::SchemefulSite(GURL("https://member2.test")), - net::SchemefulSite(GURL("https://member3.test")), - }), - UnorderedElementsAre(Pair(SerializesTo("https://example.test"), - SerializesTo("https://example.test")), - Pair(SerializesTo("https://member3.test"), - SerializesTo("https://example.test")))); -} - -// The owner of an override set is also an owner of an existing set as an -// addition. -TEST_F(OverrideSetsFirstPartySetsManagerTest, AdditionMutualOwner) { - SetFirstPartySetsContextConfig( - true, { - {net::SchemefulSite(GURL("https://member3.test")), - {net::SchemefulSite(GURL("https://example.test"))}}, - // Below are the owner self mappings. - {net::SchemefulSite(GURL("https://example.test")), - {net::SchemefulSite(GURL("https://example.test"))}}, - }); - - EXPECT_THAT(FindOwnersAndWait({ - net::SchemefulSite(GURL("https://example.test")), - net::SchemefulSite(GURL("https://member1.test")), - net::SchemefulSite(GURL("https://member2.test")), - net::SchemefulSite(GURL("https://member3.test")), - }), - UnorderedElementsAre(Pair(SerializesTo("https://example.test"), - SerializesTo("https://example.test")), - Pair(SerializesTo("https://member1.test"), - SerializesTo("https://example.test")), - Pair(SerializesTo("https://member2.test"), - SerializesTo("https://example.test")), - Pair(SerializesTo("https://member3.test"), - SerializesTo("https://example.test")))); -} - -// The owner of a override set is a member of an existing set as an addition. -TEST_F(OverrideSetsFirstPartySetsManagerTest, AdditionOwnerIsMember) { - // All the sites in the existing set are reparented to the new owner. - SetFirstPartySetsContextConfig( - true, { - {net::SchemefulSite(GURL("https://member3.test")), - {net::SchemefulSite(GURL("https://member1.test"))}}, - {net::SchemefulSite(GURL("https://example.test")), - {net::SchemefulSite(GURL("https://member1.test"))}}, - {net::SchemefulSite(GURL("https://member2.test")), - {net::SchemefulSite(GURL("https://member1.test"))}}, - // Below are the owner self mappings. - {net::SchemefulSite(GURL("https://member1.test")), - {net::SchemefulSite(GURL("https://member1.test"))}}, - }); - - EXPECT_THAT(FindOwnersAndWait({ - net::SchemefulSite(GURL("https://example.test")), - net::SchemefulSite(GURL("https://member1.test")), - net::SchemefulSite(GURL("https://member2.test")), - net::SchemefulSite(GURL("https://member3.test")), - }), - UnorderedElementsAre(Pair(SerializesTo("https://example.test"), - SerializesTo("https://member1.test")), - Pair(SerializesTo("https://member1.test"), - SerializesTo("https://member1.test")), - Pair(SerializesTo("https://member2.test"), - SerializesTo("https://member1.test")), - Pair(SerializesTo("https://member3.test"), - SerializesTo("https://member1.test")))); -} - -// The member of a override set is also an owner of an existing set as an -// addition. -TEST_F(OverrideSetsFirstPartySetsManagerTest, AdditionMemberIsOwner) { - // The member of the existing set for that owner is reparented to the new - // owner as addition. - SetFirstPartySetsContextConfig( - true, { - {net::SchemefulSite(GURL("https://example.test")), - {net::SchemefulSite(GURL("https://foo.test"))}}, - {net::SchemefulSite(GURL("https://member1.test")), - {net::SchemefulSite(GURL("https://foo.test"))}}, - {net::SchemefulSite(GURL("https://member2.test")), - {net::SchemefulSite(GURL("https://foo.test"))}}, - // Below are the owner self mappings. - {net::SchemefulSite(GURL("https://foo.test")), - {net::SchemefulSite(GURL("https://foo.test"))}}, - }); - - EXPECT_THAT(FindOwnersAndWait({ - net::SchemefulSite(GURL("https://foo.test")), - net::SchemefulSite(GURL("https://example.test")), - net::SchemefulSite(GURL("https://member1.test")), - net::SchemefulSite(GURL("https://member2.test")), - }), - UnorderedElementsAre(Pair(SerializesTo("https://foo.test"), - SerializesTo("https://foo.test")), - Pair(SerializesTo("https://example.test"), - SerializesTo("https://foo.test")), - Pair(SerializesTo("https://member1.test"), - SerializesTo("https://foo.test")), Pair(SerializesTo("https://member2.test"), SerializesTo("https://foo.test")))); } +TEST_F(OverrideSetsFirstPartySetsManagerTest, ComputeMetadata) { + net::SchemefulSite example(GURL("https://example.test")); + net::SchemefulSite foo(GURL("https://foo.test")); + net::SchemefulSite member1(GURL("https://member1.test")); + net::SchemefulSite member2(GURL("https://member2.test")); + + { + // member1 has been removed from its set. + net::FirstPartySetMetadata expected( + net::SamePartyContext(Type::kCrossParty), nullptr, &example); + + EXPECT_THAT(ComputeMetadataAndWait(member1, &example, {}), + testing::Eq(std::ref(expected))); + } + { + // member2 and foo are sites in a new set. + net::FirstPartySetMetadata expected(net::SamePartyContext(Type::kSameParty), + &foo, &foo); + + EXPECT_THAT(ComputeMetadataAndWait(member2, &foo, {}), + testing::Eq(std::ref(expected))); + } +} + } // namespace network \ No newline at end of file
diff --git a/services/network/proxy_auto_config_library_unittest.cc b/services/network/proxy_auto_config_library_unittest.cc index 015a83e..42fce9d1 100644 --- a/services/network/proxy_auto_config_library_unittest.cc +++ b/services/network/proxy_auto_config_library_unittest.cc
@@ -155,44 +155,6 @@ void ApplySocketTag(const net::SocketTag& tag) override { ADD_FAILURE() << "Called ApplySocketTag()"; } - int WriteAsync( - net::DatagramBuffers buffers, - net::CompletionOnceCallback callback, - const net::NetworkTrafficAnnotationTag& traffic_annotation) override { - ADD_FAILURE() << "Called WriteAsync()"; - return net::ERR_UNEXPECTED; - } - int WriteAsync( - const char* buffer, - size_t buf_len, - net::CompletionOnceCallback callback, - const net::NetworkTrafficAnnotationTag& traffic_annotation) override { - ADD_FAILURE() << "Called WriteAsync()"; - return net::ERR_UNEXPECTED; - } - net::DatagramBuffers GetUnwrittenBuffers() override { - ADD_FAILURE() << "Called GetUnwrittenBuffers()"; - return net::DatagramBuffers(); - } - void SetWriteAsyncEnabled(bool enabled) override { - ADD_FAILURE() << "Called SetWriteAsyncEnabled()"; - } - void SetMaxPacketSize(size_t max_packet_size) override { - ADD_FAILURE() << "Called SetWriteAsyncEnabled()"; - } - bool WriteAsyncEnabled() override { - ADD_FAILURE() << "Called WriteAsyncEnabled()"; - return false; - } - void SetWriteMultiCoreEnabled(bool enabled) override { - ADD_FAILURE() << "Called SetWriteMultiCoreEnabled()"; - } - void SetSendmmsgEnabled(bool enabled) override { - ADD_FAILURE() << "Called SetSendmmsgEnabled()"; - } - void SetWriteBatchingActive(bool active) override { - ADD_FAILURE() << "Called SetWriteBatchingActive()"; - } int SetMulticastInterface(uint32_t interface_index) override { ADD_FAILURE() << "Called SetMulticastInterface()"; return net::ERR_UNEXPECTED;
diff --git a/storage/browser/file_system/obfuscated_file_util_unittest.cc b/storage/browser/file_system/obfuscated_file_util_unittest.cc index d79d11d9..3fc1dd5 100644 --- a/storage/browser/file_system/obfuscated_file_util_unittest.cc +++ b/storage/browser/file_system/obfuscated_file_util_unittest.cc
@@ -405,7 +405,10 @@ sandbox_file_system->storage_type()); }, quota_manager_, &sandbox_file_system_)); - usage_cache()->Delete(sandbox_file_system_.GetUsageCachePath()); + base::FileErrorOr<base::FilePath> path = + sandbox_file_system_.GetUsageCachePath(); + if (!path.is_error()) + usage_cache()->Delete(path.value()); } int64_t SizeByQuotaUtil() { return sandbox_file_system_.GetCachedUsage(); } @@ -413,10 +416,11 @@ int64_t SizeInUsageFile() { task_environment_.RunUntilIdle(); int64_t usage = 0; - return usage_cache()->GetUsage(sandbox_file_system_.GetUsageCachePath(), - &usage) - ? usage - : -1; + base::FileErrorOr<base::FilePath> path = + sandbox_file_system_.GetUsageCachePath(); + if (path.is_error()) + return -1; + return usage_cache()->GetUsage(path.value(), &usage) ? usage : -1; } bool PathExists(const FileSystemURL& url) {
diff --git a/storage/browser/file_system/quota/quota_backend_impl.cc b/storage/browser/file_system/quota/quota_backend_impl.cc index 618bc3a..b6e7e81b 100644 --- a/storage/browser/file_system/quota/quota_backend_impl.cc +++ b/storage/browser/file_system/quota/quota_backend_impl.cc
@@ -13,6 +13,7 @@ #include "base/bind.h" #include "base/callback.h" #include "base/check_op.h" +#include "base/files/file_error_or.h" #include "base/numerics/safe_conversions.h" #include "base/task/sequenced_task_runner.h" #include "storage/browser/file_system/file_system_usage_cache.h" @@ -76,10 +77,11 @@ if (!delta) return; ReserveQuotaInternal(QuotaReservationInfo(origin, type, delta)); - base::FilePath path; - if (GetUsageCachePath(origin, type, &path) != base::File::FILE_OK) + base::FileErrorOr<base::FilePath> path = GetUsageCachePath(origin, type); + if (path.is_error()) return; - bool result = file_system_usage_cache_->AtomicUpdateUsageByDelta(path, delta); + bool result = + file_system_usage_cache_->AtomicUpdateUsageByDelta(path.value(), delta); DCHECK(result); } @@ -87,22 +89,22 @@ FileSystemType type) { DCHECK(file_task_runner_->RunsTasksInCurrentSequence()); DCHECK(!origin.opaque()); - base::FilePath path; - if (GetUsageCachePath(origin, type, &path) != base::File::FILE_OK) + base::FileErrorOr<base::FilePath> path = GetUsageCachePath(origin, type); + if (path.is_error()) return; DCHECK(file_system_usage_cache_); - file_system_usage_cache_->IncrementDirty(path); + file_system_usage_cache_->IncrementDirty(path.value()); } void QuotaBackendImpl::DecrementDirtyCount(const url::Origin& origin, FileSystemType type) { DCHECK(file_task_runner_->RunsTasksInCurrentSequence()); DCHECK(!origin.opaque()); - base::FilePath path; - if (GetUsageCachePath(origin, type, &path) != base::File::FILE_OK) + base::FileErrorOr<base::FilePath> path = GetUsageCachePath(origin, type); + if (path.is_error()) return; DCHECK(file_system_usage_cache_); - file_system_usage_cache_->DecrementDirty(path); + file_system_usage_cache_->DecrementDirty(path.value()); } void QuotaBackendImpl::DidGetUsageAndQuotaForReserveQuota( @@ -149,18 +151,14 @@ base::DoNothing()); } -base::File::Error QuotaBackendImpl::GetUsageCachePath( +base::FileErrorOr<base::FilePath> QuotaBackendImpl::GetUsageCachePath( const url::Origin& origin, - FileSystemType type, - base::FilePath* usage_file_path) { + FileSystemType type) { DCHECK(file_task_runner_->RunsTasksInCurrentSequence()); DCHECK(!origin.opaque()); - DCHECK(usage_file_path); - base::File::Error error = base::File::FILE_OK; - *usage_file_path = - SandboxFileSystemBackendDelegate::GetUsageCachePathForStorageKeyAndType( - obfuscated_file_util_, blink::StorageKey(origin), type, &error); - return error; + return SandboxFileSystemBackendDelegate:: + GetUsageCachePathForStorageKeyAndType(obfuscated_file_util_, + blink::StorageKey(origin), type); } QuotaBackendImpl::QuotaReservationInfo::QuotaReservationInfo(
diff --git a/storage/browser/file_system/quota/quota_backend_impl.h b/storage/browser/file_system/quota/quota_backend_impl.h index 7b3415dd..8bb50a14 100644 --- a/storage/browser/file_system/quota/quota_backend_impl.h +++ b/storage/browser/file_system/quota/quota_backend_impl.h
@@ -8,6 +8,7 @@ #include <stdint.h> #include "base/component_export.h" +#include "base/files/file_error_or.h" #include "base/memory/raw_ptr.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" @@ -79,9 +80,8 @@ int64_t quota); void ReserveQuotaInternal(const QuotaReservationInfo& info); - base::File::Error GetUsageCachePath(const url::Origin& origin, - FileSystemType type, - base::FilePath* usage_file_path); + base::FileErrorOr<base::FilePath> GetUsageCachePath(const url::Origin& origin, + FileSystemType type); const scoped_refptr<base::SequencedTaskRunner> file_task_runner_;
diff --git a/storage/browser/file_system/quota/quota_backend_impl_unittest.cc b/storage/browser/file_system/quota/quota_backend_impl_unittest.cc index 641f84f0..302a658 100644 --- a/storage/browser/file_system/quota/quota_backend_impl_unittest.cc +++ b/storage/browser/file_system/quota/quota_backend_impl_unittest.cc
@@ -12,6 +12,7 @@ #include "base/bind.h" #include "base/check.h" +#include "base/files/file_error_or.h" #include "base/files/scoped_temp_dir.h" #include "base/memory/scoped_refptr.h" #include "base/run_loop.h" @@ -154,11 +155,11 @@ base::FilePath GetUsageCachePath(const url::Origin& origin, FileSystemType type) { - base::FilePath path; - base::File::Error error = backend_->GetUsageCachePath(origin, type, &path); - EXPECT_EQ(base::File::FILE_OK, error); - EXPECT_FALSE(path.empty()); - return path; + base::FileErrorOr<base::FilePath> path = + backend_->GetUsageCachePath(origin, type); + EXPECT_FALSE(path.is_error()); + EXPECT_FALSE(path->empty()); + return path.value(); } base::test::SingleThreadTaskEnvironment task_environment_;
diff --git a/storage/browser/file_system/sandbox_file_system_backend_delegate.cc b/storage/browser/file_system/sandbox_file_system_backend_delegate.cc index fd415a1..d4ffe92 100644 --- a/storage/browser/file_system/sandbox_file_system_backend_delegate.cc +++ b/storage/browser/file_system/sandbox_file_system_backend_delegate.cc
@@ -14,6 +14,7 @@ #include "base/callback_helpers.h" #include "base/command_line.h" #include "base/containers/contains.h" +#include "base/files/file_error_or.h" #include "base/files/file_util.h" #include "base/metrics/histogram_macros.h" #include "base/task/task_runner_util.h" @@ -601,12 +602,12 @@ void SandboxFileSystemBackendDelegate::InvalidateUsageCache( const blink::StorageKey& storage_key, FileSystemType type) { - base::File::Error error = base::File::FILE_OK; - base::FilePath usage_file_path = GetUsageCachePathForStorageKeyAndType( - obfuscated_file_util(), storage_key, type, &error); - if (error != base::File::FILE_OK) + base::FileErrorOr<base::FilePath> usage_file_path = + GetUsageCachePathForStorageKeyAndType(obfuscated_file_util(), storage_key, + type); + if (usage_file_path.is_error()) return; - usage_cache()->IncrementDirty(usage_file_path); + usage_cache()->IncrementDirty(usage_file_path.value()); } void SandboxFileSystemBackendDelegate::StickyInvalidateUsageCache( @@ -670,66 +671,48 @@ return false; } -base::FilePath +base::FileErrorOr<base::FilePath> SandboxFileSystemBackendDelegate::GetUsageCachePathForStorageKeyAndType( const blink::StorageKey& storage_key, FileSystemType type) { - base::File::Error error; - base::FilePath path = GetUsageCachePathForStorageKeyAndType( - obfuscated_file_util(), storage_key, type, &error); - if (error != base::File::FILE_OK) - return base::FilePath(); - return path; + return GetUsageCachePathForStorageKeyAndType(obfuscated_file_util(), + storage_key, type); } // static -// TODO(https://crbug.com/1345419): refactor this functions to return -// base::FileErrorOr<base::FilePath> and remove the `error_out` parameter. -base::FilePath +base::FileErrorOr<base::FilePath> SandboxFileSystemBackendDelegate::GetUsageCachePathForStorageKeyAndType( ObfuscatedFileUtil* sandbox_file_util, const blink::StorageKey& storage_key, - FileSystemType type, - base::File::Error* error_out) { - DCHECK(error_out); - *error_out = base::File::FILE_OK; + FileSystemType type) { base::FileErrorOr<base::FilePath> base_path = sandbox_file_util->GetDirectoryForStorageKeyAndType( storage_key, GetTypeString(type), false /* create */); if (base_path.is_error()) { - *error_out = base_path.error(); - return base::FilePath(); + return base_path; } return base_path->Append(FileSystemUsageCache::kUsageFileName); } -base::FilePath +base::FileErrorOr<base::FilePath> SandboxFileSystemBackendDelegate::GetUsageCachePathForBucketAndType( const BucketLocator& bucket_locator, FileSystemType type) { - base::File::Error error; - base::FilePath path = GetUsageCachePathForBucketAndType( - obfuscated_file_util(), bucket_locator, type, &error); - if (error != base::File::FILE_OK) - return base::FilePath(); - return path; + return GetUsageCachePathForBucketAndType(obfuscated_file_util(), + bucket_locator, type); } // static -base::FilePath +base::FileErrorOr<base::FilePath> SandboxFileSystemBackendDelegate::GetUsageCachePathForBucketAndType( ObfuscatedFileUtil* sandbox_file_util, const BucketLocator& bucket_locator, - FileSystemType type, - base::File::Error* error_out) { - DCHECK(error_out); - *error_out = base::File::FILE_OK; + FileSystemType type) { base::FileErrorOr<base::FilePath> base_path = sandbox_file_util->GetDirectoryForBucketAndType( bucket_locator, GetTypeString(type), /*create=*/false); if (base_path.is_error()) { - *error_out = base_path.error(); - return base::FilePath(); + return base_path; } return base_path->Append(FileSystemUsageCache::kUsageFileName); }
diff --git a/storage/browser/file_system/sandbox_file_system_backend_delegate.h b/storage/browser/file_system/sandbox_file_system_backend_delegate.h index 8b24f6d..5655c3adf 100644 --- a/storage/browser/file_system/sandbox_file_system_backend_delegate.h +++ b/storage/browser/file_system/sandbox_file_system_backend_delegate.h
@@ -15,6 +15,7 @@ #include <vector> #include "base/component_export.h" +#include "base/files/file_error_or.h" #include "base/files/file_path.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" @@ -252,29 +253,27 @@ bool IsAllowedScheme(const GURL& url) const; // Returns a path to the usage cache file. - base::FilePath GetUsageCachePathForStorageKeyAndType( + base::FileErrorOr<base::FilePath> GetUsageCachePathForStorageKeyAndType( const blink::StorageKey& storage_key, FileSystemType type); // Returns a path to the usage cache file (static version). - static base::FilePath GetUsageCachePathForStorageKeyAndType( - ObfuscatedFileUtil* sandbox_file_util, - const blink::StorageKey& storage_key, - FileSystemType type, - base::File::Error* error_out); + static base::FileErrorOr<base::FilePath> + GetUsageCachePathForStorageKeyAndType(ObfuscatedFileUtil* sandbox_file_util, + const blink::StorageKey& storage_key, + FileSystemType type); // Returns a path to the usage cache file for a given bucket and type. - base::FilePath GetUsageCachePathForBucketAndType( + base::FileErrorOr<base::FilePath> GetUsageCachePathForBucketAndType( const BucketLocator& bucket_locator, FileSystemType type); // Returns a path to the usage cache file for a given bucket and type(static // version). - static base::FilePath GetUsageCachePathForBucketAndType( + static base::FileErrorOr<base::FilePath> GetUsageCachePathForBucketAndType( ObfuscatedFileUtil* sandbox_file_util, const BucketLocator& bucket_locator, - FileSystemType type, - base::File::Error* error_out); + FileSystemType type); // Helper function to obtain usage for a StorageKey value and optionally a // BucketLocator value. `storage_key` and `bucket_locator->storage_key` should
diff --git a/storage/browser/file_system/sandbox_quota_observer.cc b/storage/browser/file_system/sandbox_quota_observer.cc index 706c47fc..3b98154 100644 --- a/storage/browser/file_system/sandbox_quota_observer.cc +++ b/storage/browser/file_system/sandbox_quota_observer.cc
@@ -7,6 +7,7 @@ #include <stdint.h> #include "base/bind.h" +#include "base/files/file_error_or.h" #include "base/memory/scoped_refptr.h" #include "base/task/sequenced_task_runner.h" #include "storage/browser/file_system/file_system_usage_cache.h" @@ -33,10 +34,10 @@ void SandboxQuotaObserver::OnStartUpdate(const FileSystemURL& url) { DCHECK(update_notify_runner_->RunsTasksInCurrentSequence()); - base::FilePath usage_file_path = GetUsageCachePath(url); - if (usage_file_path.empty()) + base::FileErrorOr<base::FilePath> usage_file_path = GetUsageCachePath(url); + if (usage_file_path.is_error() || usage_file_path->empty()) return; - file_system_usage_cache_->IncrementDirty(usage_file_path); + file_system_usage_cache_->IncrementDirty(usage_file_path.value()); } void SandboxQuotaObserver::OnUpdate(const FileSystemURL& url, int64_t delta) { @@ -49,11 +50,11 @@ base::SequencedTaskRunnerHandle::Get(), base::DoNothing()); } - base::FilePath usage_file_path = GetUsageCachePath(url); - if (usage_file_path.empty()) + base::FileErrorOr<base::FilePath> usage_file_path = GetUsageCachePath(url); + if (usage_file_path.is_error() || usage_file_path->empty()) return; - pending_update_notification_[usage_file_path] += delta; + pending_update_notification_[usage_file_path.value()] += delta; if (!delayed_cache_update_helper_.IsRunning()) { delayed_cache_update_helper_.Start( FROM_HERE, @@ -66,17 +67,17 @@ void SandboxQuotaObserver::OnEndUpdate(const FileSystemURL& url) { DCHECK(update_notify_runner_->RunsTasksInCurrentSequence()); - base::FilePath usage_file_path = GetUsageCachePath(url); - if (usage_file_path.empty()) + base::FileErrorOr<base::FilePath> usage_file_path = GetUsageCachePath(url); + if (usage_file_path.is_error() || usage_file_path->empty()) return; - auto found = pending_update_notification_.find(usage_file_path); + auto found = pending_update_notification_.find(usage_file_path.value()); if (found != pending_update_notification_.end()) { UpdateUsageCacheFile(found->first, found->second); pending_update_notification_.erase(found); } - file_system_usage_cache_->DecrementDirty(usage_file_path); + file_system_usage_cache_->DecrementDirty(usage_file_path.value()); } void SandboxQuotaObserver::OnAccess(const FileSystemURL& url) { @@ -97,22 +98,20 @@ } } -base::FilePath SandboxQuotaObserver::GetUsageCachePath( +base::FileErrorOr<base::FilePath> SandboxQuotaObserver::GetUsageCachePath( const FileSystemURL& url) { DCHECK(sandbox_file_util_); - base::File::Error error = base::File::FILE_OK; - base::FilePath path; + base::FileErrorOr<base::FilePath> path = base::FilePath(); if (url.bucket().has_value()) { path = SandboxFileSystemBackendDelegate::GetUsageCachePathForBucketAndType( - sandbox_file_util_, url.bucket().value(), url.type(), &error); + sandbox_file_util_, url.bucket().value(), url.type()); } else { path = SandboxFileSystemBackendDelegate::GetUsageCachePathForStorageKeyAndType( - sandbox_file_util_, url.storage_key(), url.type(), &error); + sandbox_file_util_, url.storage_key(), url.type()); } - if (error != base::File::FILE_OK) { + if (path.is_error()) { LOG(WARNING) << "Could not get usage cache path for: " << url.DebugString(); - return base::FilePath(); } return path; }
diff --git a/storage/browser/file_system/sandbox_quota_observer.h b/storage/browser/file_system/sandbox_quota_observer.h index b0ad998..5b07259 100644 --- a/storage/browser/file_system/sandbox_quota_observer.h +++ b/storage/browser/file_system/sandbox_quota_observer.h
@@ -10,6 +10,7 @@ #include <map> #include "base/compiler_specific.h" +#include "base/files/file_error_or.h" #include "base/files/file_path.h" #include "base/memory/raw_ptr.h" #include "base/memory/ref_counted.h" @@ -65,7 +66,7 @@ void UpdateUsageCacheFile(const base::FilePath& usage_file_path, int64_t delta); - base::FilePath GetUsageCachePath(const FileSystemURL& url); + base::FileErrorOr<base::FilePath> GetUsageCachePath(const FileSystemURL& url); const scoped_refptr<QuotaManagerProxy> quota_manager_proxy_; const scoped_refptr<base::SequencedTaskRunner> update_notify_runner_;
diff --git a/storage/browser/test/sandbox_file_system_test_helper.cc b/storage/browser/test/sandbox_file_system_test_helper.cc index 22d1423..e9a5eb8 100644 --- a/storage/browser/test/sandbox_file_system_test_helper.cc +++ b/storage/browser/test/sandbox_file_system_test_helper.cc
@@ -7,6 +7,7 @@ #include <memory> #include <utility> +#include "base/files/file_error_or.h" #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/run_loop.h" @@ -106,12 +107,15 @@ return GetLocalPath(base::FilePath().AppendASCII(path)); } -base::FilePath SandboxFileSystemTestHelper::GetUsageCachePath() const { - if (bucket_locator_.has_value()) +base::FileErrorOr<base::FilePath> +SandboxFileSystemTestHelper::GetUsageCachePath() const { + if (bucket_locator_.has_value()) { return file_system_context_->sandbox_delegate() ->GetUsageCachePathForBucketAndType(bucket_locator_.value(), type_); - return file_system_context_->sandbox_delegate() - ->GetUsageCachePathForStorageKeyAndType(storage_key(), type_); + } else { + return file_system_context_->sandbox_delegate() + ->GetUsageCachePathForStorageKeyAndType(storage_key(), type_); + } } FileSystemURL SandboxFileSystemTestHelper::CreateURL( @@ -134,7 +138,8 @@ usage_cache()->CloseCacheFiles(); int64_t size = file_util_delegate()->ComputeDirectorySize(GetRootPath()); - if (file_util_delegate()->PathExists(GetUsageCachePath())) + base::FileErrorOr<base::FilePath> path = GetUsageCachePath(); + if (!path.is_error() && file_util_delegate()->PathExists(path.value())) size -= FileSystemUsageCache::kUsageFileSize; return size; @@ -197,9 +202,9 @@ ->GetBaseDirectoryForStorageKeyAndType(storage_key(), type_, /*create=*/true); } - base::FilePath usage_cache_path = GetUsageCachePath(); - if (!usage_cache_path.empty()) - usage_cache()->UpdateUsage(usage_cache_path, 0); + base::FileErrorOr<base::FilePath> usage_cache_path = GetUsageCachePath(); + if (!usage_cache_path.is_error() && !usage_cache_path->empty()) + usage_cache()->UpdateUsage(usage_cache_path.value(), 0); } } // namespace storage
diff --git a/storage/browser/test/sandbox_file_system_test_helper.h b/storage/browser/test/sandbox_file_system_test_helper.h index 87ac7ce..0dbabbf1 100644 --- a/storage/browser/test/sandbox_file_system_test_helper.h +++ b/storage/browser/test/sandbox_file_system_test_helper.h
@@ -9,6 +9,7 @@ #include <string> +#include "base/files/file_error_or.h" #include "base/files/file_path.h" #include "base/memory/raw_ptr.h" #include "base/memory/ref_counted.h" @@ -68,7 +69,7 @@ base::FilePath GetLocalPathFromASCII(const std::string& path); // Returns empty path if filesystem type is neither temporary nor persistent. - base::FilePath GetUsageCachePath() const; + base::FileErrorOr<base::FilePath> GetUsageCachePath() const; FileSystemURL CreateURL(const base::FilePath& path) const; FileSystemURL CreateURLFromUTF8(const std::string& utf8) const {
diff --git a/styleguide/c++/c++.md b/styleguide/c++/c++.md index 0863235..284ab800 100644 --- a/styleguide/c++/c++.md +++ b/styleguide/c++/c++.md
@@ -265,7 +265,7 @@ look like this: ```c++ -// Copyright $YEAR The Chromium Authors. All rights reserved. +// Copyright $YEAR The Chromium Authors. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. ```
diff --git a/testing/buildbot/chrome.json b/testing/buildbot/chrome.json index 7588080..733bd37 100644 --- a/testing/buildbot/chrome.json +++ b/testing/buildbot/chrome.json
@@ -1948,7 +1948,7 @@ { "args": [], "cros_board": "atlas", - "cros_img": "atlas-release/R104-14909.90.0", + "cros_img": "atlas-release/R104-14909.100.0", "name": "lacros_all_tast_tests ATLAS_RELEASE_BETA", "resultdb": { "enable": true, @@ -2012,7 +2012,7 @@ { "args": [], "cros_board": "eve", - "cros_img": "eve-release/R104-14909.79.0", + "cros_img": "eve-release/R104-14909.100.0", "name": "lacros_all_tast_tests EVE_RELEASE_BETA", "resultdb": { "enable": true, @@ -2119,7 +2119,7 @@ { "args": [], "cros_board": "hana", - "cros_img": "hana-release/R104-14909.79.0", + "cros_img": "hana-release/R104-14909.100.0", "name": "lacros_all_tast_tests HANA_RELEASE_BETA", "resultdb": { "enable": true, @@ -2183,7 +2183,7 @@ { "args": [], "cros_board": "jacuzzi", - "cros_img": "jacuzzi-release/R104-14909.90.0", + "cros_img": "jacuzzi-release/R104-14909.100.0", "name": "lacros_all_tast_tests JACUZZI_RELEASE_BETA", "resultdb": { "enable": true,
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json index f7bbdfa..57aa6ad 100644 --- a/testing/buildbot/chromium.chromiumos.json +++ b/testing/buildbot/chromium.chromiumos.json
@@ -5750,21 +5750,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5216.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5217.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5216.0", + "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5217.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5216.0", - "revision": "version:106.0.5216.0" + "location": "lacros_version_skew_tests_v106.0.5217.0", + "revision": "version:106.0.5217.0" } ], "dimension_sets": [ @@ -5777,7 +5777,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 106.0.5216.0" + "variant_id": "Lacros version skew testing ash 106.0.5217.0" }, { "isolate_profile_data": true, @@ -5915,21 +5915,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5216.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5217.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5216.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5217.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5216.0", - "revision": "version:106.0.5216.0" + "location": "lacros_version_skew_tests_v106.0.5217.0", + "revision": "version:106.0.5217.0" } ], "dimension_sets": [ @@ -5941,7 +5941,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 106.0.5216.0" + "variant_id": "Lacros version skew testing ash 106.0.5217.0" }, { "args": [ @@ -6061,21 +6061,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5216.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5217.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5216.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5217.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5216.0", - "revision": "version:106.0.5216.0" + "location": "lacros_version_skew_tests_v106.0.5217.0", + "revision": "version:106.0.5217.0" } ], "dimension_sets": [ @@ -6087,7 +6087,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 106.0.5216.0" + "variant_id": "Lacros version skew testing ash 106.0.5217.0" }, { "isolate_profile_data": true,
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index 0f8b1f7c..6b01014b 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -7571,6 +7571,1918 @@ } ] }, + "Mac12 Tests (py2 less)": { + "gtest_tests": [ + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "absl_hardening_tests", + "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "accessibility_unittests", + "test_id_prefix": "ninja://ui/accessibility:accessibility_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "angle_unittests", + "test_id_prefix": "ninja://third_party/angle/src/tests:angle_unittests/", + "use_isolated_scripts_api": true + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "app_shell_unittests", + "test_id_prefix": "ninja://extensions/shell:app_shell_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "base_unittests", + "test_id_prefix": "ninja://base:base_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "blink_common_unittests", + "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "blink_fuzzer_unittests", + "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_fuzzer_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "blink_heap_unittests", + "test_id_prefix": "ninja://third_party/blink/renderer/platform/heap:blink_heap_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "blink_platform_unittests", + "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_platform_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "webkit_unit_tests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "blink_unittests", + "test_id_prefix": "ninja://third_party/blink/renderer/controller:blink_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "boringssl_crypto_tests", + "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "boringssl_ssl_tests", + "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 10 + }, + "test": "browser_tests", + "test_id_prefix": "ninja://chrome/test:browser_tests/" + }, + { + "args": [ + "--gtest_filter=-*UsingRealWebcam*" + ], + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "capture_unittests", + "test_id_prefix": "ninja://media/capture:capture_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "cast_unittests", + "test_id_prefix": "ninja://media/cast:cast_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "cc_unittests", + "test_id_prefix": "ninja://cc:cc_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_app_unittests", + "test_id_prefix": "ninja://chrome/test:chrome_app_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chromedriver_unittests", + "test_id_prefix": "ninja://chrome/test/chromedriver:chromedriver_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "color_unittests", + "test_id_prefix": "ninja://ui/color:color_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "components_browsertests", + "test_id_prefix": "ninja://components:components_browsertests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "components_unittests", + "test_id_prefix": "ninja://components:components_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 8 + }, + "test": "content_browsertests", + "test_id_prefix": "ninja://content/test:content_browsertests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "content_nocompile_tests", + "test_id_prefix": "ninja://content/test:content_nocompile_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "content_unittests", + "test_id_prefix": "ninja://content/test:content_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "crashpad_tests", + "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "cronet_tests", + "test_id_prefix": "ninja://components/cronet:cronet_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "cronet_unittests", + "test_id_prefix": "ninja://components/cronet:cronet_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "crypto_unittests", + "test_id_prefix": "ninja://crypto:crypto_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "device_unittests", + "test_id_prefix": "ninja://device:device_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "display_unittests", + "test_id_prefix": "ninja://ui/display:display_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "events_unittests", + "test_id_prefix": "ninja://ui/events:events_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "extensions_browsertests", + "test_id_prefix": "ninja://extensions:extensions_browsertests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "extensions_unittests", + "test_id_prefix": "ninja://extensions:extensions_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "filesystem_service_unittests", + "test_id_prefix": "ninja://components/services/filesystem:filesystem_service_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gcm_unit_tests", + "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gfx_unittests", + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gin_unittests", + "test_id_prefix": "ninja://gin:gin_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "google_apis_unittests", + "test_id_prefix": "ninja://google_apis:google_apis_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gpu_unittests", + "test_id_prefix": "ninja://gpu:gpu_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gwp_asan_unittests", + "test_id_prefix": "ninja://components/gwp_asan:gwp_asan_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "headless_browsertests", + "test_id_prefix": "ninja://headless:headless_browsertests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "headless_unittests", + "test_id_prefix": "ninja://headless:headless_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 3 + }, + "test": "interactive_ui_tests", + "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "ipc_tests", + "test_id_prefix": "ninja://ipc:ipc_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "latency_unittests", + "test_id_prefix": "ninja://ui/latency:latency_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "libjingle_xmpp_unittests", + "test_id_prefix": "ninja://third_party/libjingle_xmpp:libjingle_xmpp_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "liburlpattern_unittests", + "test_id_prefix": "ninja://third_party/liburlpattern:liburlpattern_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "media_unittests", + "test_id_prefix": "ninja://media:media_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "message_center_unittests", + "test_id_prefix": "ninja://ui/message_center:message_center_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "midi_unittests", + "test_id_prefix": "ninja://media/midi:midi_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "mojo_unittests", + "test_id_prefix": "ninja://mojo:mojo_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "native_theme_unittests", + "test_id_prefix": "ninja://ui/native_theme:native_theme_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "net_unittests", + "test_id_prefix": "ninja://net:net_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "openscreen_unittests", + "test_id_prefix": "ninja://chrome/browser/media/router:openscreen_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "pdf_unittests", + "test_id_prefix": "ninja://pdf:pdf_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "perfetto_unittests", + "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "power_sampler_unittests", + "test_id_prefix": "ninja://tools/mac/power:power_sampler_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "ppapi_unittests", + "test_id_prefix": "ninja://ppapi:ppapi_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "printing_unittests", + "test_id_prefix": "ninja://printing:printing_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "remoting_unittests", + "test_id_prefix": "ninja://remoting:remoting_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "sandbox_unittests", + "test_id_prefix": "ninja://sandbox:sandbox_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "service_manager_unittests", + "test_id_prefix": "ninja://services/service_manager/tests:service_manager_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "services_unittests", + "test_id_prefix": "ninja://services:services_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "shell_dialogs_unittests", + "test_id_prefix": "ninja://ui/shell_dialogs:shell_dialogs_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "skia_unittests", + "test_id_prefix": "ninja://skia:skia_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "snapshot_unittests", + "test_id_prefix": "ninja://ui/snapshot:snapshot_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "sql_unittests", + "test_id_prefix": "ninja://sql:sql_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "storage_unittests", + "test_id_prefix": "ninja://storage:storage_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "sync_integration_tests", + "test_id_prefix": "ninja://chrome/test:sync_integration_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "ui_base_unittests", + "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "ui_touch_selection_unittests", + "test_id_prefix": "ninja://ui/touch_selection:ui_touch_selection_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "unit_tests", + "test_id_prefix": "ninja://chrome/test:unit_tests/" + }, + { + "args": [ + "--test-launcher-timeout=90000", + "--ui-test-action-max-timeout=45000", + "--ui-test-action-timeout=40000" + ], + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "updater_tests", + "test_id_prefix": "ninja://chrome/updater:updater_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "url_unittests", + "test_id_prefix": "ninja://url:url_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "views_unittests", + "test_id_prefix": "ninja://ui/views:views_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "viz_unittests", + "test_id_prefix": "ninja://components/viz:viz_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "wtf_unittests", + "test_id_prefix": "ninja://third_party/blink/renderer/platform/wtf:wtf_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "xr_browser_tests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "xr_browser_tests", + "test_id_prefix": "ninja://chrome/test:xr_browser_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "zlib_unittests", + "test_id_prefix": "ninja://third_party/zlib:zlib_unittests/" + } + ], + "isolated_scripts": [ + { + "isolate_name": "blink_python_tests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "blink_python_tests", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://:blink_python_tests/" + }, + { + "args": [ + "--num-retries=3", + "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json", + "--git-revision=${got_revision}" + ], + "check_flakiness_for_new_tests": false, + "isolate_name": "blink_web_tests", + "isolate_profile_data": true, + "merge": { + "args": [ + "--verbose" + ], + "script": "//third_party/blink/tools/merge_web_test_results.py" + }, + "name": "blink_web_tests", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true + }, + "results_handler": "layout tests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 5 + }, + "test_id_prefix": "ninja://:blink_web_tests/" + }, + { + "args": [ + "--num-retries=3", + "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json", + "--git-revision=${got_revision}" + ], + "check_flakiness_for_new_tests": false, + "isolate_name": "blink_wpt_tests", + "isolate_profile_data": true, + "merge": { + "args": [ + "--verbose" + ], + "script": "//third_party/blink/tools/merge_web_test_results.py" + }, + "name": "blink_wpt_tests", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true + }, + "results_handler": "layout tests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 7 + }, + "test_id_prefix": "ninja://:blink_wpt_tests/" + }, + { + "args": [ + "--test-type=integration" + ], + "check_flakiness_for_new_tests": false, + "isolate_name": "chromedriver_py_tests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "chromedriver_py_tests", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test/chromedriver:chromedriver_py_tests/" + }, + { + "isolate_name": "chromedriver_replay_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "chromedriver_replay_unittests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test/chromedriver:chromedriver_replay_unittests/" + }, + { + "args": [ + "--gtest-benchmark-name=components_perftests" + ], + "isolate_name": "components_perftests", + "isolate_profile_data": true, + "merge": { + "args": [ + "--smoke-test-mode" + ], + "script": "//tools/perf/process_perf_results.py" + }, + "name": "components_perftests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://components:components_perftests/" + }, + { + "isolate_name": "content_shell_crash_test", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "content_shell_crash_test", + "resultdb": { + "enable": true, + "result_format": "single" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://content/shell:content_shell_crash_test/" + }, + { + "isolate_name": "flatbuffers_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "flatbuffers_unittests", + "resultdb": { + "enable": true, + "result_format": "single" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://third_party/flatbuffers:flatbuffers_unittests/" + }, + { + "isolate_name": "grit_python_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "grit_python_unittests", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://tools/grit:grit_python_unittests/" + }, + { + "isolate_name": "mac_signing_tests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "mac_signing_tests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/installer/mac:mac_signing_tests/" + }, + { + "isolate_name": "mojo_python_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "mojo_python_unittests", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://mojo/public/tools:mojo_python_unittests/" + }, + { + "isolate_name": "telemetry_gpu_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "telemetry_gpu_unittests", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_unittests/" + }, + { + "args": [ + "--extra-browser-args=--enable-crashpad" + ], + "isolate_name": "telemetry_perf_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "telemetry_perf_unittests", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 12 + }, + "test_id_prefix": "ninja://chrome/test:telemetry_perf_unittests/" + }, + { + "args": [ + "--jobs=1", + "--extra-browser-args=--disable-gpu" + ], + "isolate_name": "telemetry_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "telemetry_unittests", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 8 + }, + "test_id_prefix": "ninja://chrome/test:telemetry_unittests/" + }, + { + "args": [ + "--gtest-benchmark-name=views_perftests" + ], + "isolate_name": "views_perftests", + "isolate_profile_data": true, + "merge": { + "args": [ + "--smoke-test-mode" + ], + "script": "//tools/perf/process_perf_results.py" + }, + "name": "views_perftests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ui/views:views_perftests/" + } + ] + }, "Site Isolation Android": { "additional_compile_targets": [ "content_browsertests", @@ -88612,21 +90524,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5216.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5217.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5216.0", + "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5217.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5216.0", - "revision": "version:106.0.5216.0" + "location": "lacros_version_skew_tests_v106.0.5217.0", + "revision": "version:106.0.5217.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -88634,7 +90546,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 106.0.5216.0" + "variant_id": "Lacros version skew testing ash 106.0.5217.0" }, { "isolate_profile_data": true, @@ -88747,28 +90659,28 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5216.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5217.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5216.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5217.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5216.0", - "revision": "version:106.0.5216.0" + "location": "lacros_version_skew_tests_v106.0.5217.0", + "revision": "version:106.0.5217.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 106.0.5216.0" + "variant_id": "Lacros version skew testing ash 106.0.5217.0" }, { "args": [ @@ -88868,28 +90780,28 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5216.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5217.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5216.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5217.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5216.0", - "revision": "version:106.0.5216.0" + "location": "lacros_version_skew_tests_v106.0.5217.0", + "revision": "version:106.0.5217.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 106.0.5216.0" + "variant_id": "Lacros version skew testing ash 106.0.5217.0" }, { "isolate_profile_data": true, @@ -90227,20 +92139,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5216.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5217.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5216.0", + "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5217.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5216.0", - "revision": "version:106.0.5216.0" + "location": "lacros_version_skew_tests_v106.0.5217.0", + "revision": "version:106.0.5217.0" } ], "dimension_sets": [ @@ -90254,7 +92166,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 106.0.5216.0" + "variant_id": "Lacros version skew testing ash 106.0.5217.0" }, { "merge": { @@ -90392,20 +92304,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5216.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5217.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5216.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5217.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5216.0", - "revision": "version:106.0.5216.0" + "location": "lacros_version_skew_tests_v106.0.5217.0", + "revision": "version:106.0.5217.0" } ], "dimension_sets": [ @@ -90418,7 +92330,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 106.0.5216.0" + "variant_id": "Lacros version skew testing ash 106.0.5217.0" }, { "args": [ @@ -90538,20 +92450,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5216.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5217.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5216.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5217.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5216.0", - "revision": "version:106.0.5216.0" + "location": "lacros_version_skew_tests_v106.0.5217.0", + "revision": "version:106.0.5217.0" } ], "dimension_sets": [ @@ -90564,7 +92476,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 106.0.5216.0" + "variant_id": "Lacros version skew testing ash 106.0.5217.0" }, { "merge": { @@ -92060,20 +93972,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5216.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5217.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5216.0", + "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5217.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5216.0", - "revision": "version:106.0.5216.0" + "location": "lacros_version_skew_tests_v106.0.5217.0", + "revision": "version:106.0.5217.0" } ], "dimension_sets": [ @@ -92087,7 +93999,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 106.0.5216.0" + "variant_id": "Lacros version skew testing ash 106.0.5217.0" }, { "merge": { @@ -92225,20 +94137,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5216.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5217.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5216.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5217.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5216.0", - "revision": "version:106.0.5216.0" + "location": "lacros_version_skew_tests_v106.0.5217.0", + "revision": "version:106.0.5217.0" } ], "dimension_sets": [ @@ -92251,7 +94163,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 106.0.5216.0" + "variant_id": "Lacros version skew testing ash 106.0.5217.0" }, { "args": [ @@ -92371,20 +94283,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5216.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5217.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5216.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5217.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5216.0", - "revision": "version:106.0.5216.0" + "location": "lacros_version_skew_tests_v106.0.5217.0", + "revision": "version:106.0.5217.0" } ], "dimension_sets": [ @@ -92397,7 +94309,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 106.0.5216.0" + "variant_id": "Lacros version skew testing ash 106.0.5217.0" }, { "merge": { @@ -93132,20 +95044,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5216.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5217.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5216.0", + "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5217.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5216.0", - "revision": "version:106.0.5216.0" + "location": "lacros_version_skew_tests_v106.0.5217.0", + "revision": "version:106.0.5217.0" } ], "dimension_sets": [ @@ -93158,7 +95070,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 106.0.5216.0" + "variant_id": "Lacros version skew testing ash 106.0.5217.0" } ] },
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json index d469f4b..1b6ea86 100644 --- a/testing/buildbot/chromium.memory.json +++ b/testing/buildbot/chromium.memory.json
@@ -20871,21 +20871,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5216.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5217.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5216.0", + "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5217.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5216.0", - "revision": "version:106.0.5216.0" + "location": "lacros_version_skew_tests_v106.0.5217.0", + "revision": "version:106.0.5217.0" } ], "dimension_sets": [ @@ -20898,7 +20898,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 106.0.5216.0" + "variant_id": "Lacros version skew testing ash 106.0.5217.0" }, { "isolate_profile_data": true, @@ -21036,21 +21036,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5216.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5217.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5216.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5217.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5216.0", - "revision": "version:106.0.5216.0" + "location": "lacros_version_skew_tests_v106.0.5217.0", + "revision": "version:106.0.5217.0" } ], "dimension_sets": [ @@ -21062,7 +21062,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 106.0.5216.0" + "variant_id": "Lacros version skew testing ash 106.0.5217.0" }, { "args": [ @@ -21182,21 +21182,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5216.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5217.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5216.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5217.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5216.0", - "revision": "version:106.0.5216.0" + "location": "lacros_version_skew_tests_v106.0.5217.0", + "revision": "version:106.0.5217.0" } ], "dimension_sets": [ @@ -21208,7 +21208,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 106.0.5216.0" + "variant_id": "Lacros version skew testing ash 106.0.5217.0" }, { "isolate_profile_data": true,
diff --git a/testing/buildbot/internal.chromeos.fyi.json b/testing/buildbot/internal.chromeos.fyi.json index 1537c71..800e57d 100644 --- a/testing/buildbot/internal.chromeos.fyi.json +++ b/testing/buildbot/internal.chromeos.fyi.json
@@ -1061,7 +1061,7 @@ { "args": [], "cros_board": "octopus", - "cros_img": "octopus-release/R104-14909.90.0", + "cros_img": "octopus-release/R104-14909.100.0", "name": "lacros_fyi_tast_tests OCTOPUS_RELEASE_BETA", "swarming": {}, "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", @@ -1107,7 +1107,7 @@ { "args": [], "cros_board": "octopus", - "cros_img": "octopus-release/R104-14909.90.0", + "cros_img": "octopus-release/R104-14909.100.0", "name": "ozone_unittests OCTOPUS_RELEASE_BETA", "swarming": {}, "test": "ozone_unittests", @@ -1160,7 +1160,7 @@ { "args": [], "cros_board": "strongbad", - "cros_img": "strongbad-release/R104-14909.90.0", + "cros_img": "strongbad-release/R104-14909.100.0", "name": "lacros_all_tast_tests STRONGBAD_RELEASE_BETA", "swarming": {}, "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", @@ -1206,7 +1206,7 @@ { "args": [], "cros_board": "strongbad", - "cros_img": "strongbad-release/R104-14909.90.0", + "cros_img": "strongbad-release/R104-14909.100.0", "name": "ozone_unittests STRONGBAD_RELEASE_BETA", "swarming": {}, "test": "ozone_unittests", @@ -1250,7 +1250,7 @@ { "args": [], "cros_board": "strongbad", - "cros_img": "strongbad-release/R104-14909.90.0", + "cros_img": "strongbad-release/R104-14909.100.0", "name": "viz_unittests STRONGBAD_RELEASE_BETA", "swarming": {}, "test": "viz_unittests",
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl index a0f3c57..4d9e634 100644 --- a/testing/buildbot/variants.pyl +++ b/testing/buildbot/variants.pyl
@@ -22,15 +22,15 @@ }, 'LACROS_VERSION_SKEW_CANARY': { 'args': [ - '--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5216.0/test_ash_chrome', + '--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5217.0/test_ash_chrome', ], - 'identifier': 'Lacros version skew testing ash 106.0.5216.0', + 'identifier': 'Lacros version skew testing ash 106.0.5217.0', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip', - 'location': 'lacros_version_skew_tests_v106.0.5216.0', - 'revision': 'version:106.0.5216.0', + 'location': 'lacros_version_skew_tests_v106.0.5217.0', + 'revision': 'version:106.0.5217.0', }, ], }, @@ -908,8 +908,8 @@ 'CROS_ATLAS_RELEASE_BETA': { 'skylab': { 'cros_board': 'atlas', - 'cros_chrome_version': '104.0.5112.64', - 'cros_img': 'atlas-release/R104-14909.90.0', + 'cros_chrome_version': '104.0.5112.83', + 'cros_img': 'atlas-release/R104-14909.100.0', }, 'enabled': True, 'identifier': 'ATLAS_RELEASE_BETA', @@ -953,8 +953,8 @@ 'CROS_EVE_RELEASE_BETA': { 'skylab': { 'cros_board': 'eve', - 'cros_chrome_version': '104.0.5112.57', - 'cros_img': 'eve-release/R104-14909.79.0', + 'cros_chrome_version': '104.0.5112.83', + 'cros_img': 'eve-release/R104-14909.100.0', }, 'enabled': True, 'identifier': 'EVE_RELEASE_BETA', @@ -998,8 +998,8 @@ 'CROS_HANA_RELEASE_BETA': { 'skylab': { 'cros_board': 'hana', - 'cros_chrome_version': '104.0.5112.57', - 'cros_img': 'hana-release/R104-14909.79.0', + 'cros_chrome_version': '104.0.5112.83', + 'cros_img': 'hana-release/R104-14909.100.0', }, 'enabled': True, 'identifier': 'HANA_RELEASE_BETA', @@ -1043,8 +1043,8 @@ 'CROS_JACUZZI_RELEASE_BETA': { 'skylab': { 'cros_board': 'jacuzzi', - 'cros_chrome_version': '104.0.5112.64', - 'cros_img': 'jacuzzi-release/R104-14909.90.0', + 'cros_chrome_version': '104.0.5112.83', + 'cros_img': 'jacuzzi-release/R104-14909.100.0', }, 'enabled': True, 'identifier': 'JACUZZI_RELEASE_BETA', @@ -1088,8 +1088,8 @@ 'CROS_OCTOPUS_RELEASE_BETA': { 'skylab': { 'cros_board': 'octopus', - 'cros_chrome_version': '104.0.5112.64', - 'cros_img': 'octopus-release/R104-14909.90.0', + 'cros_chrome_version': '104.0.5112.83', + 'cros_img': 'octopus-release/R104-14909.100.0', }, 'enabled': True, 'identifier': 'OCTOPUS_RELEASE_BETA', @@ -1124,8 +1124,8 @@ 'CROS_STRONGBAD_RELEASE_BETA': { 'skylab': { 'cros_board': 'strongbad', - 'cros_chrome_version': '104.0.5112.64', - 'cros_img': 'strongbad-release/R104-14909.90.0', + 'cros_chrome_version': '104.0.5112.83', + 'cros_img': 'strongbad-release/R104-14909.100.0', }, 'enabled': True, 'identifier': 'STRONGBAD_RELEASE_BETA',
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index 673a59a..84552d05 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -2849,6 +2849,17 @@ 'isolated_scripts': 'chromium_mac_rel_isolated_scripts', } }, + 'Mac12 Tests (py2 less)': { + # Copied from 'Mac12 Tests'. + 'mixins': [ + 'mac_12_x64', + 'isolate_profile_data', + ], + 'test_suites': { + 'gtest_tests': 'chromium_mac_gtests_no_nacl', + 'isolated_scripts': 'chromium_mac_rel_isolated_scripts', + }, + }, 'Site Isolation Android': { 'additional_compile_targets': [ 'content_browsertests',
diff --git a/testing/scripts/run_finch_smoke_tests_android.py b/testing/scripts/run_finch_smoke_tests_android.py index 721de683..0f7c34f 100755 --- a/testing/scripts/run_finch_smoke_tests_android.py +++ b/testing/scripts/run_finch_smoke_tests_android.py
@@ -16,13 +16,15 @@ import time from collections import OrderedDict +from PIL import Image SRC_DIR = os.path.abspath( os.path.join(os.path.dirname(__file__), os.pardir, os.pardir)) PAR_DIR = os.path.join(SRC_DIR, 'testing') OUT_DIR = os.path.join(SRC_DIR, 'out', 'Release') -BLINK_TOOLS = os.path.join( - SRC_DIR, 'third_party', 'blink', 'tools') +BLINK_DIR = os.path.join(SRC_DIR, 'third_party', 'blink') +BLINK_TOOLS = os.path.join(BLINK_DIR, 'tools') +BLINK_WEB_TESTS = os.path.join(BLINK_DIR, 'web_tests') BUILD_ANDROID = os.path.join(SRC_DIR, 'build', 'android') CATAPULT_DIR = os.path.join(SRC_DIR, 'third_party', 'catapult') PYUTILS = os.path.join(CATAPULT_DIR, 'common', 'py_utils') @@ -55,17 +57,20 @@ import devil_chromium import wpt_common +from blinkpy.web_tests.models import test_failures from blinkpy.web_tests.port.android import ( ANDROID_WEBLAYER, ANDROID_WEBVIEW, CHROME_ANDROID) from devil import devil_env from devil.android import apk_helper +from devil.android import device_temp_file from devil.android import flag_changer from devil.android import logcat_monitor from devil.android.tools import script_common from devil.android.tools import system_app from devil.android.tools import webview_app from devil.utils import logging_common +from pylib.local.device import local_device_environment from pylib.local.emulator import avd from py_utils.tempfile_ext import NamedTemporaryDirectory from scripts import common @@ -87,9 +92,17 @@ logger.setLevel(logging.INFO) TEST_CASES = {} + +def _merge_results_dicts(dict_to_merge, test_results_dict): + if 'actual' in dict_to_merge: + test_results_dict.update(dict_to_merge) + return + for key in dict_to_merge.keys(): + _merge_results_dicts(dict_to_merge[key], + test_results_dict.setdefault(key, {})) + + # pylint: disable=super-with-arguments - - class FinchTestCase(wpt_common.BaseWptScriptAdapter): @@ -97,8 +110,9 @@ super(FinchTestCase, self).__init__() self._device = device self.parse_args() - self.browser_package_name = apk_helper.GetPackageName( - self.options.browser_apk) + self._browser_apk_helper = apk_helper.ToHelper(self.options.browser_apk) + + self.browser_package_name = self._browser_apk_helper.GetPackageName() self.browser_activity_name = (self.options.browser_activity_name or self.default_browser_activity_name) self.layout_test_results_subdir = None @@ -130,6 +144,10 @@ ] @property + def pixel_tests(self): + return [] + + @property def default_browser_activity_name(self): raise NotImplementedError @@ -200,7 +218,7 @@ '--package-name', self.browser_package_name, '--keep-app-data-directory', - '--reftest-screenshot=always', + '--test-type=testharness', ]) for binary_arg in self.browser_command_line_args(): @@ -258,11 +276,11 @@ super(FinchTestCase, self).add_extra_arguments(parser) self.add_common_arguments(parser) - def _compare_screenshots_with_baselines(self, results_dict): - """Compare screenshots with baselines stored in skia gold + def _compare_screenshots_with_baselines(self, all_pixel_tests_results_dict): + """Compare pixel tests screenshots with baselines stored in skia gold Args: - results_dict: WPT results dictionary + all_pixel_tests_results_dict: Results dictionary for all pixel tests Returns: 1 if there was an error comparing images otherwise 0 @@ -287,26 +305,29 @@ os.path.join(os.path.dirname(self.wpt_output), artifact_path)) if status: - results_dict['num_failures_by_type'][test_result_dict['actual']] -= 1 test_result_dict['actual'] = 'FAIL' - results_dict['num_failures_by_type'].setdefault('FAIL', 0) - results_dict['num_failures_by_type']['FAIL'] += 1 + all_pixel_tests_results_dict['num_failures_by_type'].setdefault( + 'FAIL', 0) + all_pixel_tests_results_dict['num_failures_by_type']['FAIL'] += 1 triage_link = finch_skia_gold_utils.log_skia_gold_status_code( skia_gold_session, artifact_path, status, error) if triage_link: artifacts_dict['%s_triage_link' % artifact_name] = [triage_link] return_code = 1 + else: + test_result_dict['actual'] = 'PASS' + return return_code - def _process_test_leaves(node): + def _process_tests(node): return_code = 0 if 'actual' in node: return _process_test_leaf(node) for next_node in node.values(): - return_code |= _process_test_leaves(next_node) + return_code |= _process_tests(next_node) return return_code - return _process_test_leaves(results_dict['tests']) + return _process_tests(all_pixel_tests_results_dict['tests']) @contextlib.contextmanager def install_apks(self): @@ -315,6 +336,32 @@ self._device.Install(self.options.browser_apk, reinstall=True) for apk_path in self.options.additional_apk: self._device.Install(apk_path) + + self._device.ClearApplicationState( + self.browser_package_name, + permissions=self._browser_apk_helper.GetPermissions()) + + # TODO(rmhasan): For R+ test devices, store the files in the + # app's data directory. This is needed for R+ devices because + # of the scoped storage feature. + tests_root_dir = posixpath.join(self._device.GetExternalStoragePath(), + 'chromium_tests_root') + local_device_environment.place_nomedia_on_device(self._device, + tests_root_dir) + + # Store screenshot tests on the device's external storage. + for test_file in self.pixel_tests: + self._device.RunShellCommand( + ['mkdir', '-p', + posixpath.join(tests_root_dir, + 'pixel_tests', + posixpath.dirname(test_file))], + check_return=True) + self._device.adb.Push(os.path.join(BLINK_WEB_TESTS, test_file), + posixpath.join(tests_root_dir, + 'pixel_tests', + test_file)) + yield def browser_command_line_args(self): @@ -322,14 +369,14 @@ self.options.fake_variations_channel] + self.test_specific_browser_args) - def run_tests(self, test_run_variation, results_dict, + def run_tests(self, test_run_variation, all_test_results_dict, extra_browser_args=None): """Run browser test on test device Args: test_run_variation: Test run variation. - results_dict: Main results dictionary containing results - for all test variations. + all_test_results_dict: Main results dictionary containing + results for all test variations. extra_browser_args: Extra browser arguments. Returns: @@ -351,6 +398,10 @@ ret = super(FinchTestCase, self).run_test() self.stop_browser() + # Run screen shot tests + pixel_tests_results_dict, pixel_tests_ret = self._run_pixel_tests() + ret |= pixel_tests_ret + self._include_variation_prefix(test_run_variation) self.process_and_upload_results() @@ -360,18 +411,80 @@ shutil.move(os.path.join(isolate_root_dir, logcat_filename), final_logcat_path) - with open(self.wpt_output, 'r') as curr_test_results: - curr_results_dict = json.load(curr_test_results) - results_dict['tests'][test_run_variation] = curr_results_dict['tests'] - # Compare screenshots with baselines stored in Skia Gold - ret |= self._compare_screenshots_with_baselines(curr_results_dict) + with open(self.wpt_output, 'r') as test_harness_results: + test_harness_results_dict = json.load(test_harness_results) + all_test_results_dict['tests'][test_run_variation] = ( + test_harness_results_dict['tests']) + _merge_results_dicts(pixel_tests_results_dict['tests'], + all_test_results_dict['tests'][test_run_variation]) - for result, count in curr_results_dict['num_failures_by_type'].items(): - results_dict['num_failures_by_type'].setdefault(result, 0) - results_dict['num_failures_by_type'][result] += count + for test_results_dict in (test_harness_results_dict, + pixel_tests_results_dict): + for result, count in test_results_dict['num_failures_by_type'].items(): + all_test_results_dict['num_failures_by_type'].setdefault(result, 0) + all_test_results_dict['num_failures_by_type'][result] += count return ret + def _run_pixel_tests(self): + """Run pixel tests on device + + Returns: + A tuple containing a dictionary of pixel test results + and the skia gold status code. + """ + tests_root_dir = posixpath.join( + self._device.GetExternalStoragePath(), + 'chromium_tests_root', + 'pixel_tests') + + pixel_tests_results_dict = {'tests':{}, 'num_failures_by_type': {}} + for test_file in self.pixel_tests: + try: + # The test result will for each tests will be set after + # comparing the test screenshots to skia gold baselines. + url = 'file://{}'.format( + posixpath.join(tests_root_dir, test_file)) + self.start_browser(url) + + screenshot_artifact_relpath = os.path.join( + 'pixel_tests_artifacts', + self.layout_test_results_subdir.replace('_artifacts', ''), + self.port.output_filename(test_file, + test_failures.FILENAME_SUFFIX_ACTUAL, + '.png')) + screenshot_artifact_abspath = os.path.join( + os.path.dirname(self.options.isolated_script_test_output), + screenshot_artifact_relpath) + + self._device.TakeScreenshot(host_path=screenshot_artifact_abspath) + + # Crop away the Android status bar and the WebView shell's support + # action bar. We will do this by removing one fifth of the image + # from the top. We can do this by setting the new top point of the + # image to height / height_factor. height_factor is set to 5. + height_factor = 5 + image = Image.open(screenshot_artifact_abspath) + width, height = image.size + cropped_image = image.crop((0, height // height_factor, width, height)) + image.close() + cropped_image.save(screenshot_artifact_abspath) + + test_results_dict = pixel_tests_results_dict['tests'] + for key in test_file.split('/'): + test_results_dict = test_results_dict.setdefault(key, {}) + + test_results_dict['actual'] = 'PASS' + test_results_dict['expected'] = 'PASS' + test_results_dict['artifacts'] = { + 'actual_image': [screenshot_artifact_relpath]} + finally: + self.stop_browser() + + # Compare screenshots with baselines stored in Skia Gold. + return (pixel_tests_results_dict, + self._compare_screenshots_with_baselines(pixel_tests_results_dict)) + def _include_variation_prefix(self, test_run_variation): with open(self.wpt_output, 'r') as test_results_file: results = json.load(test_results_file) @@ -387,10 +500,11 @@ self._device.ForceStop( self.webview_provider_package_name) - def start_browser(self): + def start_browser(self, url=None): full_activity_name = '%s/%s' % (self.browser_package_name, self.browser_activity_name) logger.info('Starting activity %s', full_activity_name) + url = url or 'www.google.com' self._device.RunShellCommand([ 'am', @@ -399,7 +513,7 @@ '-n', full_activity_name, '-d', - 'data:,']) + url]) logger.info('Waiting 10 seconds') time.sleep(10) @@ -497,6 +611,12 @@ def wpt_product_name(cls): return ANDROID_WEBVIEW + @property + def pixel_tests(self): + return super(WebViewFinchTestCase, self).pixel_tests + [ + 'external/wpt/svg/pservers/reftests/radialgradient-basic-002.svg', + ] + @classmethod def finch_seed_download_args(cls): return [ @@ -508,7 +628,7 @@ @property def default_browser_activity_name(self): - return 'org.chromium.webview_shell.WebPlatformTestsActivity' + return 'org.chromium.webview_shell.WebViewBrowserActivity' @property def default_finch_seed_path(self): @@ -661,10 +781,6 @@ os.environ['PATH'] = os.pathsep.join([platform_tools_path] + os.environ['PATH'].split(os.pathsep)) - device.RunShellCommand( - ['pm', 'clear', test_case.browser_package_name], - check_return=True) - test_results_dict = OrderedDict({'version': 3, 'interrupted': False, 'num_failures_by_type': {}, 'tests': {}})
diff --git a/testing/test.gni b/testing/test.gni index 8f8ef703..094d4e8 100644 --- a/testing/test.gni +++ b/testing/test.gni
@@ -170,6 +170,7 @@ _test_runner_target = "${_output_name}__test_runner_script" _wrapper_script_vars = [ + "android_test_runner_script", "ignore_all_data_deps", "shard_timeout", ]
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 3f967f3..3a760127 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -1463,6 +1463,27 @@ ] } ], + "AutofillSectionUponRedundantNameInfo": [ + { + "platforms": [ + "android", + "chromeos", + "chromeos_lacros", + "ios", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "AutofillSectionUponRedundantNameInfo" + ] + } + ] + } + ], "AutofillServerTypeTakesPrecedence": [ { "platforms": [ @@ -1928,6 +1949,25 @@ ] } ], + "BatchFetchRequests": [ + { + "platforms": [ + "android", + "chromeos", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "BatchFetchRequests" + ] + } + ] + } + ], "BatchImageDecoding": [ { "platforms": [ @@ -2300,7 +2340,7 @@ { "name": "Enabled", "params": { - "impl": "3" + "use_crs": "true" }, "enable_features": [ "CertDualVerificationTrial" @@ -2330,11 +2370,7 @@ "experiments": [ { "name": "Enabled", - "params": { - "impl": "4" - }, "enable_features": [ - "CertVerifierBuiltin", "ChromeRootStoreUsed" ] } @@ -3174,6 +3210,21 @@ ] } ], + "CustomTabBrandTransparency": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "CCTBrandTransparency" + ] + } + ] + } + ], "CustomTabSessionRecording": [ { "platforms": [
diff --git a/third_party/abseil-cpp/README.chromium b/third_party/abseil-cpp/README.chromium index dbced4ee..f5126da 100644 --- a/third_party/abseil-cpp/README.chromium +++ b/third_party/abseil-cpp/README.chromium
@@ -4,7 +4,7 @@ License: Apache 2.0 License File: LICENSE Version: 0 -Revision: b0787ae6bcd7fc9bc7dc572dcc6d8ee83cd9b0d9 +Revision: 16af2bbcb9dd1770c64483aed8cd7d4ae7061064 Security Critical: yes Description:
diff --git a/third_party/abseil-cpp/absl/base/attributes.h b/third_party/abseil-cpp/absl/base/attributes.h index e4e7a3d8..e11a064 100644 --- a/third_party/abseil-cpp/absl/base/attributes.h +++ b/third_party/abseil-cpp/absl/base/attributes.h
@@ -759,4 +759,41 @@ #define ABSL_ATTRIBUTE_LIFETIME_BOUND #endif +// ABSL_ATTRIBUTE_TRIVIAL_ABI +// Indicates that a type is "trivially relocatable" -- meaning it can be +// relocated without invoking the constructor/destructor, using a form of move +// elision. +// +// From a memory safety point of view, putting aside destructor ordering, it's +// safe to apply ABSL_ATTRIBUTE_TRIVIAL_ABI if an object's location +// can change over the course of its lifetime: if a constructor can be run one +// place, and then the object magically teleports to another place where some +// methods are run, and then the object teleports to yet another place where it +// is destroyed. This is notably not true for self-referential types, where the +// move-constructor must keep the self-reference up to date. If the type changed +// location without invoking the move constructor, it would have a dangling +// self-reference. +// +// The use of this teleporting machinery means that the number of paired +// move/destroy operations can change, and so it is a bad idea to apply this to +// a type meant to count the number of moves. +// +// Warning: applying this can, rarely, break callers. Objects passed by value +// will be destroyed at the end of the call, instead of the end of the +// full-expression containing the call. In addition, it changes the ABI +// of functions accepting this type by value (e.g. to pass in registers). +// +// See also the upstream documentation: +// https://clang.llvm.org/docs/AttributeReference.html#trivial-abi +// +#if ABSL_HAVE_CPP_ATTRIBUTE(clang::trivial_abi) +#define ABSL_ATTRIBUTE_TRIVIAL_ABI [[clang::trivial_abi]] +#define ABSL_HAVE_ATTRIBUTE_TRIVIAL_ABI 1 +#elif ABSL_HAVE_ATTRIBUTE(trivial_abi) +#define ABSL_ATTRIBUTE_TRIVIAL_ABI __attribute__((trivial_abi)) +#define ABSL_HAVE_ATTRIBUTE_TRIVIAL_ABI 1 +#else +#define ABSL_ATTRIBUTE_TRIVIAL_ABI +#endif + #endif // ABSL_BASE_ATTRIBUTES_H_
diff --git a/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc b/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc index 229ab91..aa6c3c3 100644 --- a/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +++ b/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc
@@ -364,7 +364,7 @@ } // L < meta_data_arena->mu -LowLevelAlloc::Arena *LowLevelAlloc::NewArena(int32_t flags) { +LowLevelAlloc::Arena *LowLevelAlloc::NewArena(uint32_t flags) { Arena *meta_data_arena = DefaultArena(); #ifndef ABSL_LOW_LEVEL_ALLOC_ASYNC_SIGNAL_SAFE_MISSING if ((flags & LowLevelAlloc::kAsyncSignalSafe) != 0) {
diff --git a/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h b/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h index db91951..eabb14a 100644 --- a/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +++ b/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h
@@ -103,7 +103,7 @@ // the provided flags. For example, the call NewArena(kAsyncSignalSafe) // is itself async-signal-safe, as well as generatating an arena that provides // async-signal-safe Alloc/Free. - static Arena *NewArena(int32_t flags); + static Arena *NewArena(uint32_t flags); // Destroys an arena allocated by NewArena and returns true, // provided no allocated blocks remain in the arena.
diff --git a/third_party/abseil-cpp/absl/base/internal/raw_logging.cc b/third_party/abseil-cpp/absl/base/internal/raw_logging.cc index a5d9fa59..6273e84 100644 --- a/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +++ b/third_party/abseil-cpp/absl/base/internal/raw_logging.cc
@@ -89,12 +89,14 @@ bool VADoRawLog(char** buf, int* size, const char* format, va_list ap) ABSL_PRINTF_ATTRIBUTE(3, 0); bool VADoRawLog(char** buf, int* size, const char* format, va_list ap) { - int n = vsnprintf(*buf, *size, format, ap); + if (*size < 0) + return false; + int n = vsnprintf(*buf, static_cast<size_t>(*size), format, ap); bool result = true; if (n < 0 || n > *size) { result = false; if (static_cast<size_t>(*size) > sizeof(kTruncated)) { - n = *size - sizeof(kTruncated); // room for truncation message + n = *size - static_cast<int>(sizeof(kTruncated)); } else { n = 0; // no room for truncation message } @@ -116,9 +118,11 @@ bool DoRawLog(char** buf, int* size, const char* format, ...) ABSL_PRINTF_ATTRIBUTE(3, 4); bool DoRawLog(char** buf, int* size, const char* format, ...) { + if (*size < 0) + return false; va_list ap; va_start(ap, format); - int n = vsnprintf(*buf, *size, format, ap); + int n = vsnprintf(*buf, static_cast<size_t>(*size), format, ap); va_end(ap); if (n < 0 || n > *size) return false; *size -= n; @@ -206,7 +210,7 @@ #elif defined(ABSL_HAVE_POSIX_WRITE) write(STDERR_FILENO, s, len); #elif defined(ABSL_HAVE_RAW_IO) - _write(/* stderr */ 2, s, len); + _write(/* stderr */ 2, s, static_cast<unsigned>(len)); #else // stderr logging unsupported on this platform (void) s;
diff --git a/third_party/abseil-cpp/absl/base/internal/spinlock.cc b/third_party/abseil-cpp/absl/base/internal/spinlock.cc index 9b5ed6e..381b913b 100644 --- a/third_party/abseil-cpp/absl/base/internal/spinlock.cc +++ b/third_party/abseil-cpp/absl/base/internal/spinlock.cc
@@ -178,7 +178,7 @@ // reserve a unitary wait time to represent that a waiter exists without our // own acquisition having been contended. if ((lock_value & kWaitTimeMask) != kSpinLockSleeper) { - const uint64_t wait_cycles = DecodeWaitCycles(lock_value); + const int64_t wait_cycles = DecodeWaitCycles(lock_value); ABSL_TSAN_MUTEX_PRE_DIVERT(this, 0); submit_profile_data(this, wait_cycles); ABSL_TSAN_MUTEX_POST_DIVERT(this, 0); @@ -220,9 +220,9 @@ return clamped; } -uint64_t SpinLock::DecodeWaitCycles(uint32_t lock_value) { +int64_t SpinLock::DecodeWaitCycles(uint32_t lock_value) { // Cast to uint32_t first to ensure bits [63:32] are cleared. - const uint64_t scaled_wait_time = + const int64_t scaled_wait_time = static_cast<uint32_t>(lock_value & kWaitTimeMask); return scaled_wait_time << (kProfileTimestampShift - kLockwordReservedShift); }
diff --git a/third_party/abseil-cpp/absl/base/internal/spinlock.h b/third_party/abseil-cpp/absl/base/internal/spinlock.h index 6d8d8ddd..14303d1 100644 --- a/third_party/abseil-cpp/absl/base/internal/spinlock.h +++ b/third_party/abseil-cpp/absl/base/internal/spinlock.h
@@ -137,7 +137,7 @@ int64_t wait_end_time); // Extract number of wait cycles in a lock value. - static uint64_t DecodeWaitCycles(uint32_t lock_value); + static int64_t DecodeWaitCycles(uint32_t lock_value); // Provide access to protected method above. Use for testing only. friend struct SpinLockTest;
diff --git a/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc b/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc index 9d22481..934c201 100644 --- a/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +++ b/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc
@@ -27,7 +27,10 @@ } else if (loop == 1) { Sleep(0); } else { - Sleep(absl::base_internal::SpinLockSuggestedDelayNS(loop) / 1000000); + // SpinLockSuggestedDelayNS() always returns a positive integer, so this + // static_cast is safe. + Sleep(static_cast<DWORD>( + absl::base_internal::SpinLockSuggestedDelayNS(loop) / 1000000)); } }
diff --git a/third_party/abseil-cpp/absl/base/internal/strerror.cc b/third_party/abseil-cpp/absl/base/internal/strerror.cc index 0d6226fd..de91c05e 100644 --- a/third_party/abseil-cpp/absl/base/internal/strerror.cc +++ b/third_party/abseil-cpp/absl/base/internal/strerror.cc
@@ -66,8 +66,8 @@ std::array<std::string, kSysNerr>* NewStrErrorTable() { auto* table = new std::array<std::string, kSysNerr>; - for (int i = 0; i < static_cast<int>(table->size()); ++i) { - (*table)[i] = StrErrorInternal(i); + for (size_t i = 0; i < table->size(); ++i) { + (*table)[i] = StrErrorInternal(static_cast<int>(i)); } return table; } @@ -77,8 +77,8 @@ std::string StrError(int errnum) { absl::base_internal::ErrnoSaver errno_saver; static const auto* table = NewStrErrorTable(); - if (errnum >= 0 && errnum < static_cast<int>(table->size())) { - return (*table)[errnum]; + if (errnum >= 0 && static_cast<size_t>(errnum) < table->size()) { + return (*table)[static_cast<size_t>(errnum)]; } return StrErrorInternal(errnum); }
diff --git a/third_party/abseil-cpp/absl/base/internal/sysinfo.cc b/third_party/abseil-cpp/absl/base/internal/sysinfo.cc index c8366df..a3e08b9 100644 --- a/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +++ b/third_party/abseil-cpp/absl/base/internal/sysinfo.cc
@@ -117,7 +117,7 @@ } } free(info); - return logicalProcessorCount; + return static_cast<int>(logicalProcessorCount); } #endif @@ -128,7 +128,7 @@ #if defined(__myriad2__) return 1; #elif defined(_WIN32) - const unsigned hardware_concurrency = Win32NumCPUs(); + const int hardware_concurrency = Win32NumCPUs(); return hardware_concurrency ? hardware_concurrency : 1; #elif defined(_AIX) return sysconf(_SC_NPROCESSORS_ONLN);
diff --git a/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h b/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h index 2cbeae3..74bac8a 100644 --- a/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +++ b/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h
@@ -119,7 +119,7 @@ inline int64_t UnscaledCycleClock::Now() { uint64_t low, high; __asm__ volatile("rdtsc" : "=a"(low), "=d"(high)); - return (high << 32) | low; + return static_cast<int64_t>((high << 32) | low); } #endif
diff --git a/third_party/abseil-cpp/absl/base/optimization.h b/third_party/abseil-cpp/absl/base/optimization.h index db5cc09..57999a1 100644 --- a/third_party/abseil-cpp/absl/base/optimization.h +++ b/third_party/abseil-cpp/absl/base/optimization.h
@@ -249,4 +249,28 @@ #define ABSL_INTERNAL_UNIQUE_SMALL_NAME() #endif +// ABSL_IS_TRIVIALLY_RELOCATABLE(type) +// Detects whether a type is "trivially relocatable" -- meaning it can be +// relocated without invoking the constructor/destructor, using a form of move +// elision. +// +// Example: +// +// if constexpr (ABSL_IS_TRIVIALLY_RELOCATABLE(T)) { +// memcpy(new_location, old_location, sizeof(T)); +// } else { +// new(new_location) T(std::move(*old_location)); +// old_location->~T(); +// } +// +// Upstream documentation: +// +// https://clang.llvm.org/docs/LanguageExtensions.html#:~:text=__is_trivially_relocatable +// +#if ABSL_HAVE_BUILTIN(__is_trivially_relocatable) +#define ABSL_IS_TRIVIALLY_RELOCATABLE(type) __is_trivially_relocatable(type) +#else +#define ABSL_IS_TRIVIALLY_RELOCATABLE(type) false +#endif + #endif // ABSL_BASE_OPTIMIZATION_H_
diff --git a/third_party/abseil-cpp/absl/base/optimization_test.cc b/third_party/abseil-cpp/absl/base/optimization_test.cc index e83369f..5f7a8f4 100644 --- a/third_party/abseil-cpp/absl/base/optimization_test.cc +++ b/third_party/abseil-cpp/absl/base/optimization_test.cc
@@ -15,6 +15,7 @@ #include "absl/base/optimization.h" #include "gtest/gtest.h" +#include "absl/base/attributes.h" #include "absl/types/optional.h" namespace { @@ -126,4 +127,22 @@ if (ABSL_PREDICT_FALSE(is_false)) ADD_FAILURE(); } +TEST(TrivallyRelocatable, Sanity) { +#if !defined(ABSL_HAVE_ATTRIBUTE_TRIVIAL_ABI) || \ + !ABSL_HAVE_BUILTIN(__is_trivially_relocatable) + GTEST_SKIP() << "No trivial ABI support."; +#endif + + struct Trivial {}; + struct NonTrivial { + NonTrivial(const NonTrivial&) {} + }; + struct ABSL_ATTRIBUTE_TRIVIAL_ABI TrivialAbi { + TrivialAbi(const TrivialAbi&) {} + }; + EXPECT_TRUE(ABSL_IS_TRIVIALLY_RELOCATABLE(Trivial)); + EXPECT_FALSE(ABSL_IS_TRIVIALLY_RELOCATABLE(NonTrivial)); + EXPECT_TRUE(ABSL_IS_TRIVIALLY_RELOCATABLE(TrivialAbi)); +} + } // namespace
diff --git a/third_party/abseil-cpp/absl/base/spinlock_test_common.cc b/third_party/abseil-cpp/absl/base/spinlock_test_common.cc index 2b572c5..7b6e4b3 100644 --- a/third_party/abseil-cpp/absl/base/spinlock_test_common.cc +++ b/third_party/abseil-cpp/absl/base/spinlock_test_common.cc
@@ -48,7 +48,7 @@ int64_t wait_end_time) { return SpinLock::EncodeWaitCycles(wait_start_time, wait_end_time); } - static uint64_t DecodeWaitCycles(uint32_t lock_value) { + static int64_t DecodeWaitCycles(uint32_t lock_value) { return SpinLock::DecodeWaitCycles(lock_value); } }; @@ -133,20 +133,20 @@ // but the lower kProfileTimestampShift will be dropped. const int kMaxCyclesShift = 32 - kLockwordReservedShift + kProfileTimestampShift; - const uint64_t kMaxCycles = (int64_t{1} << kMaxCyclesShift) - 1; + const int64_t kMaxCycles = (int64_t{1} << kMaxCyclesShift) - 1; // These bits should be zero after encoding. const uint32_t kLockwordReservedMask = (1 << kLockwordReservedShift) - 1; // These bits are dropped when wait cycles are encoded. - const uint64_t kProfileTimestampMask = (1 << kProfileTimestampShift) - 1; + const int64_t kProfileTimestampMask = (1 << kProfileTimestampShift) - 1; // Test a bunch of random values std::default_random_engine generator; // Shift to avoid overflow below. - std::uniform_int_distribution<uint64_t> time_distribution( - 0, std::numeric_limits<uint64_t>::max() >> 4); - std::uniform_int_distribution<uint64_t> cycle_distribution(0, kMaxCycles); + std::uniform_int_distribution<int64_t> time_distribution( + 0, std::numeric_limits<int64_t>::max() >> 3); + std::uniform_int_distribution<int64_t> cycle_distribution(0, kMaxCycles); for (int i = 0; i < 100; i++) { int64_t start_time = time_distribution(generator); @@ -154,7 +154,7 @@ int64_t end_time = start_time + cycles; uint32_t lock_value = SpinLockTest::EncodeWaitCycles(start_time, end_time); EXPECT_EQ(0, lock_value & kLockwordReservedMask); - uint64_t decoded = SpinLockTest::DecodeWaitCycles(lock_value); + int64_t decoded = SpinLockTest::DecodeWaitCycles(lock_value); EXPECT_EQ(0, decoded & kProfileTimestampMask); EXPECT_EQ(cycles & ~kProfileTimestampMask, decoded); } @@ -178,21 +178,21 @@ // Test clamping uint32_t max_value = SpinLockTest::EncodeWaitCycles(start_time, start_time + kMaxCycles); - uint64_t max_value_decoded = SpinLockTest::DecodeWaitCycles(max_value); - uint64_t expected_max_value_decoded = kMaxCycles & ~kProfileTimestampMask; + int64_t max_value_decoded = SpinLockTest::DecodeWaitCycles(max_value); + int64_t expected_max_value_decoded = kMaxCycles & ~kProfileTimestampMask; EXPECT_EQ(expected_max_value_decoded, max_value_decoded); const int64_t step = (1 << kProfileTimestampShift); uint32_t after_max_value = SpinLockTest::EncodeWaitCycles(start_time, start_time + kMaxCycles + step); - uint64_t after_max_value_decoded = + int64_t after_max_value_decoded = SpinLockTest::DecodeWaitCycles(after_max_value); EXPECT_EQ(expected_max_value_decoded, after_max_value_decoded); uint32_t before_max_value = SpinLockTest::EncodeWaitCycles( start_time, start_time + kMaxCycles - step); - uint64_t before_max_value_decoded = - SpinLockTest::DecodeWaitCycles(before_max_value); + int64_t before_max_value_decoded = + SpinLockTest::DecodeWaitCycles(before_max_value); EXPECT_GT(expected_max_value_decoded, before_max_value_decoded); }
diff --git a/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc b/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc index efc1be5..5b8cf34 100644 --- a/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +++ b/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc
@@ -215,21 +215,20 @@ } } -int32_t GetHashtablezMaxSamples() { +size_t GetHashtablezMaxSamples() { return GlobalHashtablezSampler().GetMaxSamples(); } -void SetHashtablezMaxSamples(int32_t max) { +void SetHashtablezMaxSamples(size_t max) { SetHashtablezMaxSamplesInternal(max); TriggerHashtablezConfigListener(); } -void SetHashtablezMaxSamplesInternal(int32_t max) { +void SetHashtablezMaxSamplesInternal(size_t max) { if (max > 0) { GlobalHashtablezSampler().SetMaxSamples(max); } else { - ABSL_RAW_LOG(ERROR, "Invalid hashtablez max samples: %lld", - static_cast<long long>(max)); // NOLINT(runtime/int) + ABSL_RAW_LOG(ERROR, "Invalid hashtablez max samples: 0"); } }
diff --git a/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h b/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h index d4016d8..a89518b 100644 --- a/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +++ b/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h
@@ -281,9 +281,9 @@ void SetHashtablezSampleParameterInternal(int32_t rate); // Sets a soft max for the number of samples that will be kept. -int32_t GetHashtablezMaxSamples(); -void SetHashtablezMaxSamples(int32_t max); -void SetHashtablezMaxSamplesInternal(int32_t max); +size_t GetHashtablezMaxSamples(); +void SetHashtablezMaxSamples(size_t max); +void SetHashtablezMaxSamplesInternal(size_t max); // Configuration override. // This allows process-wide sampling without depending on order of
diff --git a/third_party/abseil-cpp/absl/container/internal/inlined_vector.h b/third_party/abseil-cpp/absl/container/internal/inlined_vector.h index 54c92a0..741821fa 100644 --- a/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +++ b/third_party/abseil-cpp/absl/container/internal/inlined_vector.h
@@ -784,9 +784,9 @@ -> Iterator<A> { StorageView<A> storage_view = MakeStorageView(); - SizeType<A> erase_size = std::distance(from, to); - SizeType<A> erase_index = - std::distance(ConstIterator<A>(storage_view.data), from); + auto erase_size = static_cast<SizeType<A>>(std::distance(from, to)); + auto erase_index = static_cast<SizeType<A>>( + std::distance(ConstIterator<A>(storage_view.data), from)); SizeType<A> erase_end_index = erase_index + erase_size; IteratorValueAdapter<A, MoveIterator<A>> move_values(
diff --git a/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h b/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h index 8f00f09..b8118cd 100644 --- a/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +++ b/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h
@@ -545,7 +545,7 @@ // Returns a bitmask representing the positions of slots that match hash. BitMask<uint32_t, kWidth> Match(h2_t hash) const { - auto match = _mm_set1_epi8(hash); + auto match = _mm_set1_epi8(static_cast<char>(hash)); return BitMask<uint32_t, kWidth>( static_cast<uint32_t>(_mm_movemask_epi8(_mm_cmpeq_epi8(match, ctrl)))); } @@ -557,7 +557,7 @@ return NonIterableBitMask<uint32_t, kWidth>( static_cast<uint32_t>(_mm_movemask_epi8(_mm_sign_epi8(ctrl, ctrl)))); #else - auto match = _mm_set1_epi8(static_cast<h2_t>(ctrl_t::kEmpty)); + auto match = _mm_set1_epi8(static_cast<char>(ctrl_t::kEmpty)); return NonIterableBitMask<uint32_t, kWidth>( static_cast<uint32_t>(_mm_movemask_epi8(_mm_cmpeq_epi8(match, ctrl)))); #endif @@ -565,14 +565,14 @@ // Returns a bitmask representing the positions of empty or deleted slots. NonIterableBitMask<uint32_t, kWidth> MaskEmptyOrDeleted() const { - auto special = _mm_set1_epi8(static_cast<uint8_t>(ctrl_t::kSentinel)); + auto special = _mm_set1_epi8(static_cast<char>(ctrl_t::kSentinel)); return NonIterableBitMask<uint32_t, kWidth>(static_cast<uint32_t>( _mm_movemask_epi8(_mm_cmpgt_epi8_fixed(special, ctrl)))); } // Returns the number of trailing empty or deleted elements in the group. uint32_t CountLeadingEmptyOrDeleted() const { - auto special = _mm_set1_epi8(static_cast<uint8_t>(ctrl_t::kSentinel)); + auto special = _mm_set1_epi8(static_cast<char>(ctrl_t::kSentinel)); return TrailingZeros(static_cast<uint32_t>( _mm_movemask_epi8(_mm_cmpgt_epi8_fixed(special, ctrl)) + 1)); } @@ -635,7 +635,8 @@ // Clang and GCC optimize countr_zero to rbit+clz without any check for 0, // so we should be fine. constexpr uint64_t bits = 0x0101010101010101ULL; - return countr_zero((mask | ~(mask >> 7)) & bits) >> 3; + return static_cast<uint32_t>(countr_zero((mask | ~(mask >> 7)) & bits) >> + 3); } void ConvertSpecialToEmptyAndFullToDeleted(ctrl_t* dst) const {
diff --git a/third_party/abseil-cpp/absl/debugging/failure_signal_handler.cc b/third_party/abseil-cpp/absl/debugging/failure_signal_handler.cc index 6672ee60..b127a98 100644 --- a/third_party/abseil-cpp/absl/debugging/failure_signal_handler.cc +++ b/third_party/abseil-cpp/absl/debugging/failure_signal_handler.cc
@@ -291,7 +291,7 @@ // some platforms. static void PortableSleepForSeconds(int seconds) { #ifdef _WIN32 - Sleep(seconds * 1000); + Sleep(static_cast<DWORD>(seconds * 1000)); #else struct timespec sleep_time; sleep_time.tv_sec = seconds; @@ -325,9 +325,9 @@ const GetTidType this_tid = absl::base_internal::GetTID(); GetTidType previous_failed_tid = 0; - if (!failed_tid.compare_exchange_strong( - previous_failed_tid, static_cast<intptr_t>(this_tid), - std::memory_order_acq_rel, std::memory_order_relaxed)) { + if (!failed_tid.compare_exchange_strong(previous_failed_tid, this_tid, + std::memory_order_acq_rel, + std::memory_order_relaxed)) { ABSL_RAW_LOG( ERROR, "Signal %d raised at PC=%p while already in AbslFailureSignalHandler()",
diff --git a/third_party/abseil-cpp/absl/debugging/internal/demangle.cc b/third_party/abseil-cpp/absl/debugging/internal/demangle.cc index 9ac644e..161de846 100644 --- a/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +++ b/third_party/abseil-cpp/absl/debugging/internal/demangle.cc
@@ -151,12 +151,12 @@ // State needed for demangling. This struct is copied in almost every stack // frame, so every byte counts. typedef struct { - int mangled_idx; // Cursor of mangled name. - int out_cur_idx; // Cursor of output string. - int prev_name_idx; // For constructors/destructors. - signed int prev_name_length : 16; // For constructors/destructors. - signed int nest_level : 15; // For nested names. - unsigned int append : 1; // Append flag. + int mangled_idx; // Cursor of mangled name. + int out_cur_idx; // Cursor of output string. + int prev_name_idx; // For constructors/destructors. + unsigned int prev_name_length : 16; // For constructors/destructors. + signed int nest_level : 15; // For nested names. + unsigned int append : 1; // Append flag. // Note: for some reason MSVC can't pack "bool append : 1" into the same int // with the above two fields, so we use an int instead. Amusingly it can pack // "signed bool" as expected, but relying on that to continue to be a legal @@ -235,8 +235,8 @@ } // Returns true if "str" has at least "n" characters remaining. -static bool AtLeastNumCharsRemaining(const char *str, int n) { - for (int i = 0; i < n; ++i) { +static bool AtLeastNumCharsRemaining(const char *str, size_t n) { + for (size_t i = 0; i < n; ++i) { if (str[i] == '\0') { return false; } @@ -264,7 +264,7 @@ state->parse_state.mangled_idx = 0; state->parse_state.out_cur_idx = 0; state->parse_state.prev_name_idx = 0; - state->parse_state.prev_name_length = -1; + state->parse_state.prev_name_length = 0; state->parse_state.nest_level = -1; state->parse_state.append = true; } @@ -356,8 +356,8 @@ // Append "str" at "out_cur_idx". If there is an overflow, out_cur_idx is // set to out_end_idx+1. The output string is ensured to // always terminate with '\0' as long as there is no overflow. -static void Append(State *state, const char *const str, const int length) { - for (int i = 0; i < length; ++i) { +static void Append(State *state, const char *const str, const size_t length) { + for (size_t i = 0; i < length; ++i) { if (state->parse_state.out_cur_idx + 1 < state->out_end_idx) { // +1 for '\0' state->out[state->parse_state.out_cur_idx++] = str[i]; @@ -420,7 +420,7 @@ // Append "str" with some tweaks, iff "append" state is true. static void MaybeAppendWithLength(State *state, const char *const str, - const int length) { + const size_t length) { if (state->parse_state.append && length > 0) { // Append a space if the output buffer ends with '<' and "str" // starts with '<' to avoid <<<. @@ -432,14 +432,14 @@ if (state->parse_state.out_cur_idx < state->out_end_idx && (IsAlpha(str[0]) || str[0] == '_')) { state->parse_state.prev_name_idx = state->parse_state.out_cur_idx; - state->parse_state.prev_name_length = length; + state->parse_state.prev_name_length = static_cast<unsigned int>(length); } Append(state, str, length); } } // Appends a positive decimal number to the output if appending is enabled. -static bool MaybeAppendDecimal(State *state, unsigned int val) { +static bool MaybeAppendDecimal(State *state, int val) { // Max {32-64}-bit unsigned int is 20 digits. constexpr size_t kMaxLength = 20; char buf[kMaxLength]; @@ -456,7 +456,7 @@ } while (p > buf && val != 0); // 'p' landed on the last character we set. How convenient. - Append(state, p, kMaxLength - (p - buf)); + Append(state, p, kMaxLength - static_cast<size_t>(p - buf)); } return true; @@ -466,7 +466,7 @@ // Returns true so that it can be placed in "if" conditions. static bool MaybeAppend(State *state, const char *const str) { if (state->parse_state.append) { - int length = StrLen(str); + size_t length = StrLen(str); MaybeAppendWithLength(state, str, length); } return true; @@ -521,10 +521,10 @@ // Returns true if the identifier of the given length pointed to by // "mangled_cur" is anonymous namespace. -static bool IdentifierIsAnonymousNamespace(State *state, int length) { +static bool IdentifierIsAnonymousNamespace(State *state, size_t length) { // Returns true if "anon_prefix" is a proper prefix of "mangled_cur". static const char anon_prefix[] = "_GLOBAL__N_"; - return (length > static_cast<int>(sizeof(anon_prefix) - 1) && + return (length > (sizeof(anon_prefix) - 1) && StrPrefix(RemainingInput(state), anon_prefix)); } @@ -542,7 +542,7 @@ static bool ParseNumber(State *state, int *number_out); static bool ParseFloatNumber(State *state); static bool ParseSeqId(State *state); -static bool ParseIdentifier(State *state, int length); +static bool ParseIdentifier(State *state, size_t length); static bool ParseOperatorName(State *state, int *arity); static bool ParseSpecialName(State *state); static bool ParseCallOffset(State *state); @@ -786,7 +786,8 @@ if (guard.IsTooComplex()) return false; ParseState copy = state->parse_state; int length = -1; - if (ParseNumber(state, &length) && ParseIdentifier(state, length)) { + if (ParseNumber(state, &length) && + ParseIdentifier(state, static_cast<size_t>(length))) { return true; } state->parse_state = copy; @@ -864,7 +865,7 @@ uint64_t number = 0; for (; *p != '\0'; ++p) { if (IsDigit(*p)) { - number = number * 10 + (*p - '0'); + number = number * 10 + static_cast<uint64_t>(*p - '0'); } else { break; } @@ -879,7 +880,7 @@ state->parse_state.mangled_idx += p - RemainingInput(state); if (number_out != nullptr) { // Note: possibly truncate "number". - *number_out = number; + *number_out = static_cast<int>(number); } return true; } @@ -923,10 +924,10 @@ } // <identifier> ::= <unqualified source code identifier> (of given length) -static bool ParseIdentifier(State *state, int length) { +static bool ParseIdentifier(State *state, size_t length) { ComplexityGuard guard(state); if (guard.IsTooComplex()) return false; - if (length < 0 || !AtLeastNumCharsRemaining(RemainingInput(state), length)) { + if (!AtLeastNumCharsRemaining(RemainingInput(state), length)) { return false; } if (IdentifierIsAnonymousNamespace(state, length)) {
diff --git a/third_party/abseil-cpp/absl/debugging/internal/examine_stack.cc b/third_party/abseil-cpp/absl/debugging/internal/examine_stack.cc index 5bdd341e..57863228 100644 --- a/third_party/abseil-cpp/absl/debugging/internal/examine_stack.cc +++ b/third_party/abseil-cpp/absl/debugging/internal/examine_stack.cc
@@ -278,13 +278,14 @@ void* stack_buf[kDefaultDumpStackFramesLimit]; void** stack = stack_buf; int num_stack = kDefaultDumpStackFramesLimit; - int allocated_bytes = 0; + size_t allocated_bytes = 0; if (num_stack >= max_num_frames) { // User requested fewer frames than we already have space for. num_stack = max_num_frames; } else { - const size_t needed_bytes = max_num_frames * sizeof(stack[0]); + const size_t needed_bytes = + static_cast<size_t>(max_num_frames) * sizeof(stack[0]); void* p = Allocate(needed_bytes); if (p != nullptr) { // We got the space. num_stack = max_num_frames; @@ -293,12 +294,13 @@ } } - size_t depth = absl::GetStackTrace(stack, num_stack, min_dropped_frames + 1); - for (size_t i = 0; i < depth; i++) { + int depth = absl::GetStackTrace(stack, num_stack, min_dropped_frames + 1); + for (int i = 0; i < depth; i++) { if (symbolize_stacktrace) { - DumpPCAndSymbol(writer, writer_arg, stack[i], " "); + DumpPCAndSymbol(writer, writer_arg, stack[static_cast<size_t>(i)], + " "); } else { - DumpPC(writer, writer_arg, stack[i], " "); + DumpPC(writer, writer_arg, stack[static_cast<size_t>(i)], " "); } }
diff --git a/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc b/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc index 70b11e5..a0f23739 100644 --- a/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +++ b/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc
@@ -115,7 +115,13 @@ // $sp ->| ... | // +----------------+ void **new_frame_pointer = reinterpret_cast<void **>(old_frame_pointer[-2]); - bool check_frame_size = true; + + // The RISCV ELF psABI mandates that the stack pointer is always 16-byte + // aligned. + // TODO(#1236) this doesn't hold for ILP32E which only mandates a 4-byte + // alignment. + if ((reinterpret_cast<uintptr_t>(new_frame_pointer) & 15) != 0) + return nullptr; #if defined(__linux__) if (WITH_CONTEXT && uc != nullptr) { @@ -139,34 +145,28 @@ // Alleged frame pointer is readable, use it for further unwinding. new_frame_pointer = pre_signal_frame_pointer; - - // Skip frame size check if we return from a signal. We may be using an - // alterate stack for signals. - check_frame_size = false; } + return new_frame_pointer; } #endif - // The RISCV ELF psABI mandates that the stack pointer is always 16-byte - // aligned. - // FIXME(abdulras) this doesn't hold for ILP32E which only mandates a 4-byte - // alignment. - if ((reinterpret_cast<uintptr_t>(new_frame_pointer) & 15) != 0) - return nullptr; - // Check frame size. In strict mode, we assume frames to be under 100,000 // bytes. In non-strict mode, we relax the limit to 1MB. - if (check_frame_size) { - const uintptr_t max_size = STRICT_UNWINDING ? 100000 : 1000000; - const uintptr_t frame_size = - ComputeStackFrameSize(old_frame_pointer, new_frame_pointer); - if (frame_size == kUnknownFrameSize && - (reinterpret_cast<uintptr_t>(new_frame_pointer) < range.first || - reinterpret_cast<uintptr_t>(new_frame_pointer) > range.second)) + const uintptr_t max_size = STRICT_UNWINDING ? 100000 : 1000000; + const uintptr_t frame_size = + ComputeStackFrameSize(old_frame_pointer, new_frame_pointer); + if (frame_size == kUnknownFrameSize) { + if (STRICT_UNWINDING) return nullptr; - if (frame_size > max_size) + + // In non-strict mode permit non-contiguous stacks (e.g. alternate signal + // frame handling). + if (reinterpret_cast<uintptr_t>(new_frame_pointer) < range.first || + reinterpret_cast<uintptr_t>(new_frame_pointer) > range.second) return nullptr; } + if (frame_size > max_size) + return nullptr; return new_frame_pointer; }
diff --git a/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc b/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc index 1c666c8b..ef2b973e 100644 --- a/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +++ b/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc
@@ -63,11 +63,12 @@ template <bool IS_STACK_FRAMES, bool IS_WITH_CONTEXT> static int UnwindImpl(void** result, int* sizes, int max_depth, int skip_count, const void*, int* min_dropped_frames) { - int n = 0; - if (!RtlCaptureStackBackTrace_fn) { - // can't find a stacktrace with no function to call + USHORT n = 0; + if (!RtlCaptureStackBackTrace_fn || skip_count < 0 || max_depth < 0) { + // can't get a stacktrace with no function/invalid args } else { - n = (int)RtlCaptureStackBackTrace_fn(skip_count + 2, max_depth, result, 0); + n = RtlCaptureStackBackTrace_fn(static_cast<ULONG>(skip_count) + 2, + static_cast<ULONG>(max_depth), result, 0); } if (IS_STACK_FRAMES) { // No implementation for finding out the stack frame sizes yet.
diff --git a/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc b/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc index c3df46f..53a099a 100644 --- a/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +++ b/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc
@@ -65,14 +65,15 @@ if (!SymFromAddr(process, reinterpret_cast<DWORD64>(pc), nullptr, symbol)) { return false; } - strncpy(out, symbol->Name, out_size); - if (out[out_size - 1] != '\0') { + const size_t out_size_t = static_cast<size_t>(out_size); + strncpy(out, symbol->Name, out_size_t); + if (out[out_size_t - 1] != '\0') { // strncpy() does not '\0' terminate when it truncates. static constexpr char kEllipsis[] = "..."; - int ellipsis_size = - std::min<int>(sizeof(kEllipsis) - 1, out_size - 1); - memcpy(out + out_size - ellipsis_size - 1, kEllipsis, ellipsis_size); - out[out_size - 1] = '\0'; + size_t ellipsis_size = + std::min(sizeof(kEllipsis) - 1, out_size_t - 1); + memcpy(out + out_size_t - ellipsis_size - 1, kEllipsis, ellipsis_size); + out[out_size_t - 1] = '\0'; } return true; }
diff --git a/third_party/abseil-cpp/absl/hash/internal/city.cc b/third_party/abseil-cpp/absl/hash/internal/city.cc index 5460134..f0d3196 100644 --- a/third_party/abseil-cpp/absl/hash/internal/city.cc +++ b/third_party/abseil-cpp/absl/hash/internal/city.cc
@@ -97,7 +97,7 @@ uint32_t d = Fetch32(s + (len >> 1)); uint32_t e = Fetch32(s); uint32_t f = Fetch32(s + len - 4); - uint32_t h = len; + uint32_t h = static_cast<uint32_t>(len); return fmix(Mur(f, Mur(e, Mur(d, Mur(c, Mur(b, Mur(a, h))))))); } @@ -106,15 +106,15 @@ uint32_t b = 0; uint32_t c = 9; for (size_t i = 0; i < len; i++) { - signed char v = s[i]; - b = b * c1 + v; + signed char v = static_cast<signed char>(s[i]); + b = b * c1 + static_cast<uint32_t>(v); c ^= b; } - return fmix(Mur(b, Mur(len, c))); + return fmix(Mur(b, Mur(static_cast<uint32_t>(len), c))); } static uint32_t Hash32Len5to12(const char *s, size_t len) { - uint32_t a = len, b = len * 5, c = 9, d = b; + uint32_t a = static_cast<uint32_t>(len), b = a * 5, c = 9, d = b; a += Fetch32(s); b += Fetch32(s + len - 4); c += Fetch32(s + ((len >> 1) & 4)); @@ -129,7 +129,7 @@ } // len > 24 - uint32_t h = len, g = c1 * len, f = g; + uint32_t h = static_cast<uint32_t>(len), g = c1 * h, f = g; uint32_t a0 = Rotate32(Fetch32(s + len - 4) * c1, 17) * c2; uint32_t a1 = Rotate32(Fetch32(s + len - 8) * c1, 17) * c2; @@ -230,11 +230,11 @@ return HashLen16(len + (a << 3), Fetch32(s + len - 4), mul); } if (len > 0) { - uint8_t a = s[0]; - uint8_t b = s[len >> 1]; - uint8_t c = s[len - 1]; + uint8_t a = static_cast<uint8_t>(s[0]); + uint8_t b = static_cast<uint8_t>(s[len >> 1]); + uint8_t c = static_cast<uint8_t>(s[len - 1]); uint32_t y = static_cast<uint32_t>(a) + (static_cast<uint32_t>(b) << 8); - uint32_t z = len + (static_cast<uint32_t>(c) << 2); + uint32_t z = static_cast<uint32_t>(len) + (static_cast<uint32_t>(c) << 2); return ShiftMix(y * k2 ^ z * k0) * k2; } return k2;
diff --git a/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc b/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc index d288f3ec..e05e788 100644 --- a/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +++ b/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc
@@ -106,7 +106,8 @@ } else if (len > 0) { // If we have at least 1 and at most 3 bytes, read all of the provided // bits into A, with some adjustments. - a = ((ptr[0] << 16) | (ptr[len >> 1] << 8) | ptr[len - 1]); + a = static_cast<uint64_t>((ptr[0] << 16) | (ptr[len >> 1] << 8) | + ptr[len - 1]); b = 0; } else { a = 0;
diff --git a/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h b/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h index 5f65983bc..ef1489b 100644 --- a/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +++ b/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h
@@ -77,8 +77,8 @@ // samples that have been dropped. int64_t Iterate(const std::function<void(const T& stack)>& f); - int32_t GetMaxSamples() const; - void SetMaxSamples(int32_t max); + size_t GetMaxSamples() const; + void SetMaxSamples(size_t max); private: void PushNew(T* sample); @@ -88,7 +88,7 @@ std::atomic<size_t> dropped_samples_; std::atomic<size_t> size_estimate_; - std::atomic<int32_t> max_samples_{1 << 20}; + std::atomic<size_t> max_samples_{1 << 20}; // Intrusive lock free linked lists for tracking samples. // @@ -186,7 +186,7 @@ template <typename T> template <typename... Targs> T* SampleRecorder<T>::Register(Targs&&... args) { - int64_t size = size_estimate_.fetch_add(1, std::memory_order_relaxed); + size_t size = size_estimate_.fetch_add(1, std::memory_order_relaxed); if (size > max_samples_.load(std::memory_order_relaxed)) { size_estimate_.fetch_sub(1, std::memory_order_relaxed); dropped_samples_.fetch_add(1, std::memory_order_relaxed); @@ -229,12 +229,12 @@ } template <typename T> -void SampleRecorder<T>::SetMaxSamples(int32_t max) { +void SampleRecorder<T>::SetMaxSamples(size_t max) { max_samples_.store(max, std::memory_order_release); } template <typename T> -int32_t SampleRecorder<T>::GetMaxSamples() const { +size_t SampleRecorder<T>::GetMaxSamples() const { return max_samples_.load(std::memory_order_acquire); }
diff --git a/third_party/abseil-cpp/absl/strings/cord_buffer.h b/third_party/abseil-cpp/absl/strings/cord_buffer.h index 56a6ce6f..09a74ad 100644 --- a/third_party/abseil-cpp/absl/strings/cord_buffer.h +++ b/third_party/abseil-cpp/absl/strings/cord_buffer.h
@@ -330,8 +330,7 @@ // Returns the available area of the internal SSO data absl::Span<char> short_available() { - assert(is_short()); - const size_t length = (short_rep.raw_size >> 1); + const size_t length = short_length(); return absl::Span<char>(short_rep.data + length, kInlineCapacity - length); } @@ -347,7 +346,7 @@ // Returns the length of the internal SSO data. size_t short_length() const { assert(is_short()); - return short_rep.raw_size >> 1; + return static_cast<size_t>(short_rep.raw_size >> 1); } // Sets the length of the internal SSO data.
diff --git a/third_party/abseil-cpp/absl/strings/internal/char_map.h b/third_party/abseil-cpp/absl/strings/internal/char_map.h index 61484de..5aabc1fc6 100644 --- a/third_party/abseil-cpp/absl/strings/internal/char_map.h +++ b/third_party/abseil-cpp/absl/strings/internal/char_map.h
@@ -103,10 +103,9 @@ constexpr Charmap(uint64_t b0, uint64_t b1, uint64_t b2, uint64_t b3) : m_{b0, b1, b2, b3} {} - static constexpr uint64_t RangeForWord(unsigned char lo, unsigned char hi, - uint64_t word) { - return OpenRangeFromZeroForWord(hi + 1, word) & - ~OpenRangeFromZeroForWord(lo, word); + static constexpr uint64_t RangeForWord(char lo, char hi, uint64_t word) { + return OpenRangeFromZeroForWord(static_cast<unsigned char>(hi) + 1, word) & + ~OpenRangeFromZeroForWord(static_cast<unsigned char>(lo), word); } // All the chars in the specified word of the range [0, upper). @@ -119,13 +118,16 @@ : (~static_cast<uint64_t>(0) >> (64 - upper % 64)); } - static constexpr uint64_t CharMaskForWord(unsigned char x, uint64_t word) { - return (x / 64 == word) ? (static_cast<uint64_t>(1) << (x % 64)) : 0; + static constexpr uint64_t CharMaskForWord(char x, uint64_t word) { + const auto unsigned_x = static_cast<unsigned char>(x); + return (unsigned_x / 64 == word) + ? (static_cast<uint64_t>(1) << (unsigned_x % 64)) + : 0; } - private: - void SetChar(unsigned char c) { - m_[c / 64] |= static_cast<uint64_t>(1) << (c % 64); + void SetChar(char c) { + const auto unsigned_c = static_cast<unsigned char>(c); + m_[unsigned_c / 64] |= static_cast<uint64_t>(1) << (unsigned_c % 64); } uint64_t m_[4];
diff --git a/third_party/abseil-cpp/absl/strings/internal/cord_internal.h b/third_party/abseil-cpp/absl/strings/internal/cord_internal.h index b50fb79..29954112 100644 --- a/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +++ b/third_party/abseil-cpp/absl/strings/internal/cord_internal.h
@@ -570,7 +570,7 @@ // Requires the current instance to hold inline data. size_t inline_size() const { assert(!is_tree()); - return tag() >> 1; + return static_cast<size_t>(tag()) >> 1; } // Sets the size of the inlined character data inside this instance.
diff --git a/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h b/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h index 32b91d03..a81bac8 100644 --- a/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +++ b/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h
@@ -155,10 +155,11 @@ static_cast<const char*>(memchr(p, '%', static_cast<size_t>(end - p))); if (!percent) { // We found the last substring. - return consumer.Append(string_view(p, end - p)); + return consumer.Append(string_view(p, static_cast<size_t>(end - p))); } // We found a percent, so push the text run then process the percent. - if (ABSL_PREDICT_FALSE(!consumer.Append(string_view(p, percent - p)))) { + if (ABSL_PREDICT_FALSE(!consumer.Append( + string_view(p, static_cast<size_t>(percent - p))))) { return false; } if (ABSL_PREDICT_FALSE(percent + 1 >= end)) return false; @@ -189,7 +190,8 @@ p = ConsumeUnboundConversion(percent + 1, end, &conv, &next_arg); if (ABSL_PREDICT_FALSE(p == nullptr)) return false; if (ABSL_PREDICT_FALSE(!consumer.ConvertOne( - conv, string_view(percent + 1, p - (percent + 1))))) { + conv, string_view(percent + 1, + static_cast<size_t>(p - (percent + 1)))))) { return false; } } else {
diff --git a/third_party/abseil-cpp/absl/strings/substitute.h b/third_party/abseil-cpp/absl/strings/substitute.h index 6d2b08a..692fd03c 100644 --- a/third_party/abseil-cpp/absl/strings/substitute.h +++ b/third_party/abseil-cpp/absl/strings/substitute.h
@@ -125,28 +125,44 @@ } Arg(short value) // NOLINT(*) : piece_(scratch_, - numbers_internal::FastIntToBuffer(value, scratch_) - scratch_) {} + static_cast<size_t>( + numbers_internal::FastIntToBuffer(value, scratch_) - + scratch_)) {} Arg(unsigned short value) // NOLINT(*) : piece_(scratch_, - numbers_internal::FastIntToBuffer(value, scratch_) - scratch_) {} + static_cast<size_t>( + numbers_internal::FastIntToBuffer(value, scratch_) - + scratch_)) {} Arg(int value) // NOLINT(runtime/explicit) : piece_(scratch_, - numbers_internal::FastIntToBuffer(value, scratch_) - scratch_) {} + static_cast<size_t>( + numbers_internal::FastIntToBuffer(value, scratch_) - + scratch_)) {} Arg(unsigned int value) // NOLINT(runtime/explicit) : piece_(scratch_, - numbers_internal::FastIntToBuffer(value, scratch_) - scratch_) {} + static_cast<size_t>( + numbers_internal::FastIntToBuffer(value, scratch_) - + scratch_)) {} Arg(long value) // NOLINT(*) : piece_(scratch_, - numbers_internal::FastIntToBuffer(value, scratch_) - scratch_) {} + static_cast<size_t>( + numbers_internal::FastIntToBuffer(value, scratch_) - + scratch_)) {} Arg(unsigned long value) // NOLINT(*) : piece_(scratch_, - numbers_internal::FastIntToBuffer(value, scratch_) - scratch_) {} + static_cast<size_t>( + numbers_internal::FastIntToBuffer(value, scratch_) - + scratch_)) {} Arg(long long value) // NOLINT(*) : piece_(scratch_, - numbers_internal::FastIntToBuffer(value, scratch_) - scratch_) {} + static_cast<size_t>( + numbers_internal::FastIntToBuffer(value, scratch_) - + scratch_)) {} Arg(unsigned long long value) // NOLINT(*) : piece_(scratch_, - numbers_internal::FastIntToBuffer(value, scratch_) - scratch_) {} + static_cast<size_t>( + numbers_internal::FastIntToBuffer(value, scratch_) - + scratch_)) {} Arg(float value) // NOLINT(runtime/explicit) : piece_(scratch_, numbers_internal::SixDigitsToBuffer(value, scratch_)) { }
diff --git a/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h b/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h index bbd4d2d..44a3a2e 100644 --- a/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +++ b/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h
@@ -111,7 +111,8 @@ constexpr uint64_t max_nanos = (std::numeric_limits<int64_t>::max)() - 999999u; uint64_t ms_from_now = - (std::min<uint64_t>(max_nanos, ns_ - now) + 999999u) / 1000000u; + ((std::min)(max_nanos, static_cast<uint64_t>(ns_ - now)) + 999999u) / + 1000000u; if (ms_from_now > kInfinite) { return kInfinite; }
diff --git a/third_party/abseil-cpp/absl/synchronization/mutex.cc b/third_party/abseil-cpp/absl/synchronization/mutex.cc index 52e2455..6417736 100644 --- a/third_party/abseil-cpp/absl/synchronization/mutex.cc +++ b/third_party/abseil-cpp/absl/synchronization/mutex.cc
@@ -36,6 +36,7 @@ #include <algorithm> #include <atomic> #include <cinttypes> +#include <cstddef> #include <thread> // NOLINT(build/c++11) #include "absl/base/attributes.h" @@ -430,7 +431,11 @@ char buffer[ABSL_ARRAYSIZE(pcs) * 24]; int pos = snprintf(buffer, sizeof (buffer), " @"); for (int i = 0; i != n; i++) { - pos += snprintf(&buffer[pos], sizeof (buffer) - pos, " %p", pcs[i]); + int b = snprintf(&buffer[pos], sizeof(buffer) - pos, " %p", pcs[i]); + if (b < 0 || static_cast<size_t>(b) >= sizeof(buffer) - pos) { + break; + } + pos += b; } ABSL_RAW_LOG(INFO, "%s%p %s %s", event_properties[ev].msg, obj, (e == nullptr ? "" : e->name), buffer);
diff --git a/third_party/abseil-cpp/symbols_arm64_dbg.def b/third_party/abseil-cpp/symbols_arm64_dbg.def index 22b8d9d..eb2b817 100644 --- a/third_party/abseil-cpp/symbols_arm64_dbg.def +++ b/third_party/abseil-cpp/symbols_arm64_dbg.def
@@ -215,7 +215,7 @@ ??$?RAEAY0O@$$CBDPEAVCondVar@absl@@@?$AtomicHook@P6AXPEBDPEBX@Z@base_internal@absl@@QEBAXAEAY0O@$$CBD$$QEAPEAVCondVar@2@@Z ??$?RAEA_J@?$AtomicHook@P6AX_J@Z@base_internal@absl@@QEBAXAEA_J@Z ??$?RAEBUTransition@cctz@time_internal@absl@@@__identity@Cr@std@@QEBAAEBUTransition@cctz@time_internal@absl@@AEBU3456@@Z - ??$?RPEAVSpinLock@base_internal@absl@@AEB_K@?$AtomicHook@P6AXPEBX_J@Z@base_internal@absl@@QEBAX$$QEAPEAVSpinLock@12@AEB_K@Z + ??$?RPEAVSpinLock@base_internal@absl@@AEB_J@?$AtomicHook@P6AXPEBX_J@Z@base_internal@absl@@QEBAX$$QEAPEAVSpinLock@12@AEB_J@Z ??$?RW4LogSeverity@absl@@AEBQEBDHAEAPEBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAPEBD@Z ??$?RW4LogSeverity@absl@@AEBQEBDHAEAV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z ??$?RW4LogSeverity@absl@@AEBQEBDHV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAH$$QEAV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z @@ -1647,7 +1647,7 @@ ?DeallocateIfAllocated@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ ?DeallocateIfAllocated@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ ?DeallocateIfAllocated@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ - ?DecodeWaitCycles@SpinLock@base_internal@absl@@KA_KI@Z + ?DecodeWaitCycles@SpinLock@base_internal@absl@@KA_JI@Z ?Decrement@RefcountAndFlags@cord_internal@absl@@QEAA_NXZ ?DecrementCount@BlockingCounter@absl@@QEAA_NXZ ?DecrementExpectHighRefcount@RefcountAndFlags@cord_internal@absl@@QEAA_NXZ @@ -1882,7 +1882,7 @@ ?GetFirstChunk@Cord@absl@@CA?AVstring_view@2@AEBV12@@Z ?GetFirstChunk@Cord@absl@@CA?AVstring_view@2@V32@@Z ?GetFlatAux@Cord@absl@@CA_NPEAUCordRep@cord_internal@2@PEAVstring_view@2@@Z - ?GetHashtablezMaxSamples@container_internal@absl@@YAHXZ + ?GetHashtablezMaxSamples@container_internal@absl@@YA_KXZ ?GetHashtablezSampleParameter@container_internal@absl@@YAHXZ ?GetId@GraphCycles@synchronization_internal@absl@@QEAA?AUGraphId@23@PEAX@Z ?GetInlinedCapacity@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@Cr@std@@@inlined_vector_internal@absl@@QEBA_KXZ @@ -1900,7 +1900,7 @@ ?GetKeys@RandenSlow@random_internal@absl@@SAPEBXXZ ?GetLeafData@CordRepRing@cord_internal@absl@@SAPEBDPEBUCordRep@23@@Z ?GetLock@WinHelper@Waiter@synchronization_internal@absl@@SAPEAU_RTL_SRWLOCK@@PEAV234@@Z - ?GetMaxSamples@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QEBAHXZ + ?GetMaxSamples@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QEBA_KXZ ?GetOrCreateCurrentThreadIdentity@synchronization_internal@absl@@YAPEAUThreadIdentity@base_internal@2@XZ ?GetParentMethod@CordzInfo@cord_internal@absl@@CA?AW4MethodIdentifier@CordzUpdateTracker@23@PEBV123@@Z ?GetParentStack@CordzInfo@cord_internal@absl@@QEBA?AV?$Span@QEAX@3@XZ @@ -2110,7 +2110,7 @@ ?New@CordRepFlat@cord_internal@absl@@SAPEAU123@ULarge@123@_K@Z ?New@CordRepFlat@cord_internal@absl@@SAPEAU123@_K@Z ?New@CordRepRing@cord_internal@absl@@CAPEAV123@_K0@Z - ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@H@Z + ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@I@Z ?Next@CordRepBtreeNavigator@cord_internal@absl@@QEAAPEAUCordRep@23@XZ ?Next@CordRepBtreeReader@cord_internal@absl@@QEAA?AVstring_view@3@XZ ?Next@CordzInfo@cord_internal@absl@@QEBAPEAV123@AEBVCordzSnapshot@23@@Z @@ -2267,14 +2267,14 @@ ?SetHashtablezConfigListener@container_internal@absl@@YAXP6AXXZ@Z ?SetHashtablezEnabled@container_internal@absl@@YAX_N@Z ?SetHashtablezEnabledInternal@container_internal@absl@@YAX_N@Z - ?SetHashtablezMaxSamples@container_internal@absl@@YAXH@Z - ?SetHashtablezMaxSamplesInternal@container_internal@absl@@YAXH@Z + ?SetHashtablezMaxSamples@container_internal@absl@@YAX_K@Z + ?SetHashtablezMaxSamplesInternal@container_internal@absl@@YAX_K@Z ?SetHashtablezSampleParameter@container_internal@absl@@YAXH@Z ?SetHashtablezSampleParameterInternal@container_internal@absl@@YAXH@Z ?SetIsAllocated@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ ?SetIsAllocated@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ ?SetLength@CordBuffer@absl@@QEAAX_K@Z - ?SetMaxSamples@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QEAAXH@Z + ?SetMaxSamples@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QEAAX_K@Z ?SetMutexDeadlockDetectionMode@absl@@YAXW4OnDeadlockCycle@1@@Z ?SetPayload@Status@absl@@QEAAXVstring_view@2@VCord@2@@Z ?SetPrecision@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXHPEAVFormatConversionSpecImpl@23@@Z
diff --git a/third_party/abseil-cpp/symbols_arm64_rel.def b/third_party/abseil-cpp/symbols_arm64_rel.def index c1e42e8..5b48369 100644 --- a/third_party/abseil-cpp/symbols_arm64_rel.def +++ b/third_party/abseil-cpp/symbols_arm64_rel.def
@@ -329,7 +329,7 @@ ?DataLength@Header@TimeZoneInfo@cctz@time_internal@absl@@QEBA_K_K@Z ?DataLossError@absl@@YA?AVStatus@1@Vstring_view@1@@Z ?DeadlineExceededError@absl@@YA?AVStatus@1@Vstring_view@1@@Z - ?DecodeWaitCycles@SpinLock@base_internal@absl@@KA_KI@Z + ?DecodeWaitCycles@SpinLock@base_internal@absl@@KA_JI@Z ?DecrementCount@BlockingCounter@absl@@QEAA_NXZ ?DecrementSynchSem@Mutex@absl@@CA_NPEAV12@PEAUPerThreadSynch@base_internal@2@VKernelTimeout@synchronization_internal@2@@Z ?DefaultArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@XZ @@ -405,7 +405,6 @@ ?Find@ByChar@absl@@QEBA?AVstring_view@2@V32@_K@Z ?Find@ByLength@absl@@QEBA?AVstring_view@2@V32@_K@Z ?Find@ByString@absl@@QEBA?AVstring_view@2@V32@_K@Z - ?FindFlatStartPiece@InlineRep@Cord@absl@@QEBA?AVstring_view@3@XZ ?FindPath@GraphCycles@synchronization_internal@absl@@QEBAHUGraphId@23@0HQEAU423@@Z ?FindSlow@CordRepRing@cord_internal@absl@@AEBA?AUPosition@123@I_K@Z ?FindTailSlow@CordRepRing@cord_internal@absl@@AEBA?AUPosition@123@I_K@Z @@ -480,7 +479,7 @@ ?GetEstimatedFairShareMemoryUsage@cord_internal@absl@@YA_KPEBUCordRep@12@@Z ?GetEstimatedMemoryUsage@cord_internal@absl@@YA_KPEBUCordRep@12@@Z ?GetFlatAux@Cord@absl@@CA_NPEAUCordRep@cord_internal@2@PEAVstring_view@2@@Z - ?GetHashtablezMaxSamples@container_internal@absl@@YAHXZ + ?GetHashtablezMaxSamples@container_internal@absl@@YA_KXZ ?GetHashtablezSampleParameter@container_internal@absl@@YAHXZ ?GetId@GraphCycles@synchronization_internal@absl@@QEAA?AUGraphId@23@PEAX@Z ?GetKeys@RandenHwAes@random_internal@absl@@SAPEBXXZ @@ -599,7 +598,7 @@ ?MutexDelay@synchronization_internal@absl@@YAHHH@Z ?New@CordRepCrc@cord_internal@absl@@SAPEAU123@PEAUCordRep@23@I@Z ?New@CordRepRing@cord_internal@absl@@CAPEAV123@_K0@Z - ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@H@Z + ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@I@Z ?Next@CordzInfo@cord_internal@absl@@QEBAPEAV123@AEBVCordzSnapshot@23@@Z ?NextTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z ?NextTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@Cr@std@@V?$duration@_JV?$ratio@$00$00@Cr@std@@@234@@chrono@Cr@std@@PEAUcivil_transition@time_zone@234@@Z @@ -707,8 +706,8 @@ ?SetHashtablezConfigListener@container_internal@absl@@YAXP6AXXZ@Z ?SetHashtablezEnabled@container_internal@absl@@YAX_N@Z ?SetHashtablezEnabledInternal@container_internal@absl@@YAX_N@Z - ?SetHashtablezMaxSamples@container_internal@absl@@YAXH@Z - ?SetHashtablezMaxSamplesInternal@container_internal@absl@@YAXH@Z + ?SetHashtablezMaxSamples@container_internal@absl@@YAX_K@Z + ?SetHashtablezMaxSamplesInternal@container_internal@absl@@YAX_K@Z ?SetHashtablezSampleParameter@container_internal@absl@@YAXH@Z ?SetHashtablezSampleParameterInternal@container_internal@absl@@YAXH@Z ?SetMutexDeadlockDetectionMode@absl@@YAXW4OnDeadlockCycle@1@@Z
diff --git a/third_party/abseil-cpp/symbols_x64_dbg.def b/third_party/abseil-cpp/symbols_x64_dbg.def index f09fd255..3619911 100644 --- a/third_party/abseil-cpp/symbols_x64_dbg.def +++ b/third_party/abseil-cpp/symbols_x64_dbg.def
@@ -215,7 +215,7 @@ ??$?RAEAY0O@$$CBDPEAVCondVar@absl@@@?$AtomicHook@P6AXPEBDPEBX@Z@base_internal@absl@@QEBAXAEAY0O@$$CBD$$QEAPEAVCondVar@2@@Z ??$?RAEA_J@?$AtomicHook@P6AX_J@Z@base_internal@absl@@QEBAXAEA_J@Z ??$?RAEBUTransition@cctz@time_internal@absl@@@__identity@Cr@std@@QEBAAEBUTransition@cctz@time_internal@absl@@AEBU3456@@Z - ??$?RPEAVSpinLock@base_internal@absl@@AEB_K@?$AtomicHook@P6AXPEBX_J@Z@base_internal@absl@@QEBAX$$QEAPEAVSpinLock@12@AEB_K@Z + ??$?RPEAVSpinLock@base_internal@absl@@AEB_J@?$AtomicHook@P6AXPEBX_J@Z@base_internal@absl@@QEBAX$$QEAPEAVSpinLock@12@AEB_J@Z ??$?RW4LogSeverity@absl@@AEBQEBDHAEAPEBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAPEBD@Z ??$?RW4LogSeverity@absl@@AEBQEBDHAEAV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z ??$?RW4LogSeverity@absl@@AEBQEBDHV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAH$$QEAV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z @@ -1650,7 +1650,7 @@ ?DeallocateIfAllocated@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ ?DeallocateIfAllocated@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ ?DeallocateIfAllocated@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ - ?DecodeWaitCycles@SpinLock@base_internal@absl@@KA_KI@Z + ?DecodeWaitCycles@SpinLock@base_internal@absl@@KA_JI@Z ?Decrement@RefcountAndFlags@cord_internal@absl@@QEAA_NXZ ?DecrementCount@BlockingCounter@absl@@QEAA_NXZ ?DecrementExpectHighRefcount@RefcountAndFlags@cord_internal@absl@@QEAA_NXZ @@ -1884,7 +1884,7 @@ ?GetFirstChunk@Cord@absl@@CA?AVstring_view@2@AEBV12@@Z ?GetFirstChunk@Cord@absl@@CA?AVstring_view@2@V32@@Z ?GetFlatAux@Cord@absl@@CA_NPEAUCordRep@cord_internal@2@PEAVstring_view@2@@Z - ?GetHashtablezMaxSamples@container_internal@absl@@YAHXZ + ?GetHashtablezMaxSamples@container_internal@absl@@YA_KXZ ?GetHashtablezSampleParameter@container_internal@absl@@YAHXZ ?GetId@GraphCycles@synchronization_internal@absl@@QEAA?AUGraphId@23@PEAX@Z ?GetInlinedCapacity@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@Cr@std@@@inlined_vector_internal@absl@@QEBA_KXZ @@ -1902,7 +1902,7 @@ ?GetKeys@RandenSlow@random_internal@absl@@SAPEBXXZ ?GetLeafData@CordRepRing@cord_internal@absl@@SAPEBDPEBUCordRep@23@@Z ?GetLock@WinHelper@Waiter@synchronization_internal@absl@@SAPEAU_RTL_SRWLOCK@@PEAV234@@Z - ?GetMaxSamples@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QEBAHXZ + ?GetMaxSamples@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QEBA_KXZ ?GetOrCreateCurrentThreadIdentity@synchronization_internal@absl@@YAPEAUThreadIdentity@base_internal@2@XZ ?GetParentMethod@CordzInfo@cord_internal@absl@@CA?AW4MethodIdentifier@CordzUpdateTracker@23@PEBV123@@Z ?GetParentStack@CordzInfo@cord_internal@absl@@QEBA?AV?$Span@QEAX@3@XZ @@ -2112,7 +2112,7 @@ ?New@CordRepFlat@cord_internal@absl@@SAPEAU123@ULarge@123@_K@Z ?New@CordRepFlat@cord_internal@absl@@SAPEAU123@_K@Z ?New@CordRepRing@cord_internal@absl@@CAPEAV123@_K0@Z - ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@H@Z + ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@I@Z ?Next@CordRepBtreeNavigator@cord_internal@absl@@QEAAPEAUCordRep@23@XZ ?Next@CordRepBtreeReader@cord_internal@absl@@QEAA?AVstring_view@3@XZ ?Next@CordzInfo@cord_internal@absl@@QEBAPEAV123@AEBVCordzSnapshot@23@@Z @@ -2269,14 +2269,14 @@ ?SetHashtablezConfigListener@container_internal@absl@@YAXP6AXXZ@Z ?SetHashtablezEnabled@container_internal@absl@@YAX_N@Z ?SetHashtablezEnabledInternal@container_internal@absl@@YAX_N@Z - ?SetHashtablezMaxSamples@container_internal@absl@@YAXH@Z - ?SetHashtablezMaxSamplesInternal@container_internal@absl@@YAXH@Z + ?SetHashtablezMaxSamples@container_internal@absl@@YAX_K@Z + ?SetHashtablezMaxSamplesInternal@container_internal@absl@@YAX_K@Z ?SetHashtablezSampleParameter@container_internal@absl@@YAXH@Z ?SetHashtablezSampleParameterInternal@container_internal@absl@@YAXH@Z ?SetIsAllocated@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ ?SetIsAllocated@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@inlined_vector_internal@absl@@QEAAXXZ ?SetLength@CordBuffer@absl@@QEAAX_K@Z - ?SetMaxSamples@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QEAAXH@Z + ?SetMaxSamples@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QEAAX_K@Z ?SetMutexDeadlockDetectionMode@absl@@YAXW4OnDeadlockCycle@1@@Z ?SetPayload@Status@absl@@QEAAXVstring_view@2@VCord@2@@Z ?SetPrecision@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXHPEAVFormatConversionSpecImpl@23@@Z
diff --git a/third_party/abseil-cpp/symbols_x64_rel.def b/third_party/abseil-cpp/symbols_x64_rel.def index d99945f..8b5588e 100644 --- a/third_party/abseil-cpp/symbols_x64_rel.def +++ b/third_party/abseil-cpp/symbols_x64_rel.def
@@ -323,7 +323,7 @@ ?DataLength@Header@TimeZoneInfo@cctz@time_internal@absl@@QEBA_K_K@Z ?DataLossError@absl@@YA?AVStatus@1@Vstring_view@1@@Z ?DeadlineExceededError@absl@@YA?AVStatus@1@Vstring_view@1@@Z - ?DecodeWaitCycles@SpinLock@base_internal@absl@@KA_KI@Z + ?DecodeWaitCycles@SpinLock@base_internal@absl@@KA_JI@Z ?DecrementCount@BlockingCounter@absl@@QEAA_NXZ ?DecrementSynchSem@Mutex@absl@@CA_NPEAV12@PEAUPerThreadSynch@base_internal@2@VKernelTimeout@synchronization_internal@2@@Z ?DefaultArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@XZ @@ -473,7 +473,7 @@ ?GetEstimatedFairShareMemoryUsage@cord_internal@absl@@YA_KPEBUCordRep@12@@Z ?GetEstimatedMemoryUsage@cord_internal@absl@@YA_KPEBUCordRep@12@@Z ?GetFlatAux@Cord@absl@@CA_NPEAUCordRep@cord_internal@2@PEAVstring_view@2@@Z - ?GetHashtablezMaxSamples@container_internal@absl@@YAHXZ + ?GetHashtablezMaxSamples@container_internal@absl@@YA_KXZ ?GetHashtablezSampleParameter@container_internal@absl@@YAHXZ ?GetId@GraphCycles@synchronization_internal@absl@@QEAA?AUGraphId@23@PEAX@Z ?GetKeys@RandenHwAes@random_internal@absl@@SAPEBXXZ @@ -592,7 +592,7 @@ ?MutexDelay@synchronization_internal@absl@@YAHHH@Z ?New@CordRepCrc@cord_internal@absl@@SAPEAU123@PEAUCordRep@23@I@Z ?New@CordRepRing@cord_internal@absl@@CAPEAV123@_K0@Z - ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@H@Z + ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@I@Z ?Next@CordzInfo@cord_internal@absl@@QEBAPEAV123@AEBVCordzSnapshot@23@@Z ?NextTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z ?NextTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@Cr@std@@V?$duration@_JV?$ratio@$00$00@Cr@std@@@234@@chrono@Cr@std@@PEAUcivil_transition@time_zone@234@@Z @@ -699,8 +699,8 @@ ?SetHashtablezConfigListener@container_internal@absl@@YAXP6AXXZ@Z ?SetHashtablezEnabled@container_internal@absl@@YAX_N@Z ?SetHashtablezEnabledInternal@container_internal@absl@@YAX_N@Z - ?SetHashtablezMaxSamples@container_internal@absl@@YAXH@Z - ?SetHashtablezMaxSamplesInternal@container_internal@absl@@YAXH@Z + ?SetHashtablezMaxSamples@container_internal@absl@@YAX_K@Z + ?SetHashtablezMaxSamplesInternal@container_internal@absl@@YAX_K@Z ?SetHashtablezSampleParameter@container_internal@absl@@YAXH@Z ?SetHashtablezSampleParameterInternal@container_internal@absl@@YAXH@Z ?SetMutexDeadlockDetectionMode@absl@@YAXW4OnDeadlockCycle@1@@Z
diff --git a/third_party/abseil-cpp/symbols_x64_rel_asan.def b/third_party/abseil-cpp/symbols_x64_rel_asan.def index a3d8719..ba97aefb 100644 --- a/third_party/abseil-cpp/symbols_x64_rel_asan.def +++ b/third_party/abseil-cpp/symbols_x64_rel_asan.def
@@ -328,7 +328,7 @@ ?DataLength@Header@TimeZoneInfo@cctz@time_internal@absl@@QEBA_K_K@Z ?DataLossError@absl@@YA?AVStatus@1@Vstring_view@1@@Z ?DeadlineExceededError@absl@@YA?AVStatus@1@Vstring_view@1@@Z - ?DecodeWaitCycles@SpinLock@base_internal@absl@@KA_KI@Z + ?DecodeWaitCycles@SpinLock@base_internal@absl@@KA_JI@Z ?DecrementCount@BlockingCounter@absl@@QEAA_NXZ ?DecrementSynchSem@Mutex@absl@@CA_NPEAV12@PEAUPerThreadSynch@base_internal@2@VKernelTimeout@synchronization_internal@2@@Z ?DefaultArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@XZ @@ -478,7 +478,7 @@ ?GetEstimatedFairShareMemoryUsage@cord_internal@absl@@YA_KPEBUCordRep@12@@Z ?GetEstimatedMemoryUsage@cord_internal@absl@@YA_KPEBUCordRep@12@@Z ?GetFlatAux@Cord@absl@@CA_NPEAUCordRep@cord_internal@2@PEAVstring_view@2@@Z - ?GetHashtablezMaxSamples@container_internal@absl@@YAHXZ + ?GetHashtablezMaxSamples@container_internal@absl@@YA_KXZ ?GetHashtablezSampleParameter@container_internal@absl@@YAHXZ ?GetId@GraphCycles@synchronization_internal@absl@@QEAA?AUGraphId@23@PEAX@Z ?GetKeys@RandenHwAes@random_internal@absl@@SAPEBXXZ @@ -597,7 +597,7 @@ ?MutexDelay@synchronization_internal@absl@@YAHHH@Z ?New@CordRepCrc@cord_internal@absl@@SAPEAU123@PEAUCordRep@23@I@Z ?New@CordRepRing@cord_internal@absl@@CAPEAV123@_K0@Z - ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@H@Z + ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@I@Z ?Next@CordzInfo@cord_internal@absl@@QEBAPEAV123@AEBVCordzSnapshot@23@@Z ?NextTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z ?NextTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@Cr@std@@V?$duration@_JV?$ratio@$00$00@Cr@std@@@234@@chrono@Cr@std@@PEAUcivil_transition@time_zone@234@@Z @@ -704,8 +704,8 @@ ?SetHashtablezConfigListener@container_internal@absl@@YAXP6AXXZ@Z ?SetHashtablezEnabled@container_internal@absl@@YAX_N@Z ?SetHashtablezEnabledInternal@container_internal@absl@@YAX_N@Z - ?SetHashtablezMaxSamples@container_internal@absl@@YAXH@Z - ?SetHashtablezMaxSamplesInternal@container_internal@absl@@YAXH@Z + ?SetHashtablezMaxSamples@container_internal@absl@@YAX_K@Z + ?SetHashtablezMaxSamplesInternal@container_internal@absl@@YAX_K@Z ?SetHashtablezSampleParameter@container_internal@absl@@YAXH@Z ?SetHashtablezSampleParameterInternal@container_internal@absl@@YAXH@Z ?SetMutexDeadlockDetectionMode@absl@@YAXW4OnDeadlockCycle@1@@Z
diff --git a/third_party/abseil-cpp/symbols_x86_dbg.def b/third_party/abseil-cpp/symbols_x86_dbg.def index 7c2043e..53807a66 100644 --- a/third_party/abseil-cpp/symbols_x86_dbg.def +++ b/third_party/abseil-cpp/symbols_x86_dbg.def
@@ -215,7 +215,7 @@ ??$?RAAY0O@$$CBDPAVCondVar@absl@@@?$AtomicHook@P6AXPBDPBX@Z@base_internal@absl@@QBEXAAY0O@$$CBD$$QAPAVCondVar@2@@Z ??$?RAA_J@?$AtomicHook@P6AX_J@Z@base_internal@absl@@QBEXAA_J@Z ??$?RABUTransition@cctz@time_internal@absl@@@__identity@Cr@std@@QBEABUTransition@cctz@time_internal@absl@@ABU3456@@Z - ??$?RPAVSpinLock@base_internal@absl@@AB_K@?$AtomicHook@P6AXPBX_J@Z@base_internal@absl@@QBEX$$QAPAVSpinLock@12@AB_K@Z + ??$?RPAVSpinLock@base_internal@absl@@AB_J@?$AtomicHook@P6AXPBX_J@Z@base_internal@absl@@QBEX$$QAPAVSpinLock@12@AB_J@Z ??$?RW4LogSeverity@absl@@ABQBDHAAPBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PBDHABV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z@base_internal@absl@@QBEX$$QAW4LogSeverity@2@ABQBD$$QAHAAPBD@Z ??$?RW4LogSeverity@absl@@ABQBDHAAV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@?$AtomicHook@P6AXW4LogSeverity@absl@@PBDHABV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z@base_internal@absl@@QBEX$$QAW4LogSeverity@2@ABQBD$$QAHAAV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z ??$?RW4LogSeverity@absl@@ABQBDHV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@?$AtomicHook@P6AXW4LogSeverity@absl@@PBDHABV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z@base_internal@absl@@QBEX$$QAW4LogSeverity@2@ABQBD$$QAH$$QAV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z @@ -1645,7 +1645,7 @@ ?DeallocateIfAllocated@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@Cr@std@@@inlined_vector_internal@absl@@QAEXXZ ?DeallocateIfAllocated@?$Storage@PAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PAUCordRep@cord_internal@absl@@@Cr@std@@@inlined_vector_internal@absl@@QAEXXZ ?DeallocateIfAllocated@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@inlined_vector_internal@absl@@QAEXXZ - ?DecodeWaitCycles@SpinLock@base_internal@absl@@KA_KI@Z + ?DecodeWaitCycles@SpinLock@base_internal@absl@@KA_JI@Z ?Decrement@RefcountAndFlags@cord_internal@absl@@QAE_NXZ ?DecrementCount@BlockingCounter@absl@@QAE_NXZ ?DecrementExpectHighRefcount@RefcountAndFlags@cord_internal@absl@@QAE_NXZ @@ -1879,7 +1879,7 @@ ?GetFirstChunk@Cord@absl@@CA?AVstring_view@2@ABV12@@Z ?GetFirstChunk@Cord@absl@@CA?AVstring_view@2@V32@@Z ?GetFlatAux@Cord@absl@@CA_NPAUCordRep@cord_internal@2@PAVstring_view@2@@Z - ?GetHashtablezMaxSamples@container_internal@absl@@YAHXZ + ?GetHashtablezMaxSamples@container_internal@absl@@YAIXZ ?GetHashtablezSampleParameter@container_internal@absl@@YAHXZ ?GetId@GraphCycles@synchronization_internal@absl@@QAE?AUGraphId@23@PAX@Z ?GetInlinedCapacity@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@Cr@std@@@inlined_vector_internal@absl@@QBEIXZ @@ -1897,7 +1897,7 @@ ?GetKeys@RandenSlow@random_internal@absl@@SAPBXXZ ?GetLeafData@CordRepRing@cord_internal@absl@@SAPBDPBUCordRep@23@@Z ?GetLock@WinHelper@Waiter@synchronization_internal@absl@@SAPAU_RTL_SRWLOCK@@PAV234@@Z - ?GetMaxSamples@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QBEHXZ + ?GetMaxSamples@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QBEIXZ ?GetOrCreateCurrentThreadIdentity@synchronization_internal@absl@@YAPAUThreadIdentity@base_internal@2@XZ ?GetParentMethod@CordzInfo@cord_internal@absl@@CA?AW4MethodIdentifier@CordzUpdateTracker@23@PBV123@@Z ?GetParentStack@CordzInfo@cord_internal@absl@@QBE?AV?$Span@QAX@3@XZ @@ -2107,7 +2107,7 @@ ?New@CordRepFlat@cord_internal@absl@@SAPAU123@I@Z ?New@CordRepFlat@cord_internal@absl@@SAPAU123@ULarge@123@I@Z ?New@CordRepRing@cord_internal@absl@@CAPAV123@II@Z - ?NewArena@LowLevelAlloc@base_internal@absl@@SAPAUArena@123@H@Z + ?NewArena@LowLevelAlloc@base_internal@absl@@SAPAUArena@123@I@Z ?Next@CordRepBtreeNavigator@cord_internal@absl@@QAEPAUCordRep@23@XZ ?Next@CordRepBtreeReader@cord_internal@absl@@QAE?AVstring_view@3@XZ ?Next@CordzInfo@cord_internal@absl@@QBEPAV123@ABVCordzSnapshot@23@@Z @@ -2264,14 +2264,14 @@ ?SetHashtablezConfigListener@container_internal@absl@@YAXP6AXXZ@Z ?SetHashtablezEnabled@container_internal@absl@@YAX_N@Z ?SetHashtablezEnabledInternal@container_internal@absl@@YAX_N@Z - ?SetHashtablezMaxSamples@container_internal@absl@@YAXH@Z - ?SetHashtablezMaxSamplesInternal@container_internal@absl@@YAXH@Z + ?SetHashtablezMaxSamples@container_internal@absl@@YAXI@Z + ?SetHashtablezMaxSamplesInternal@container_internal@absl@@YAXI@Z ?SetHashtablezSampleParameter@container_internal@absl@@YAXH@Z ?SetHashtablezSampleParameterInternal@container_internal@absl@@YAXH@Z ?SetIsAllocated@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@Cr@std@@@inlined_vector_internal@absl@@QAEXXZ ?SetIsAllocated@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@inlined_vector_internal@absl@@QAEXXZ ?SetLength@CordBuffer@absl@@QAEXI@Z - ?SetMaxSamples@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QAEXH@Z + ?SetMaxSamples@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@QAEXI@Z ?SetMutexDeadlockDetectionMode@absl@@YAXW4OnDeadlockCycle@1@@Z ?SetPayload@Status@absl@@QAEXVstring_view@2@VCord@2@@Z ?SetPrecision@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXHPAVFormatConversionSpecImpl@23@@Z
diff --git a/third_party/abseil-cpp/symbols_x86_rel.def b/third_party/abseil-cpp/symbols_x86_rel.def index 218d02e..af116a056 100644 --- a/third_party/abseil-cpp/symbols_x86_rel.def +++ b/third_party/abseil-cpp/symbols_x86_rel.def
@@ -325,7 +325,7 @@ ?DataLength@Header@TimeZoneInfo@cctz@time_internal@absl@@QBEII@Z ?DataLossError@absl@@YA?AVStatus@1@Vstring_view@1@@Z ?DeadlineExceededError@absl@@YA?AVStatus@1@Vstring_view@1@@Z - ?DecodeWaitCycles@SpinLock@base_internal@absl@@KA_KI@Z + ?DecodeWaitCycles@SpinLock@base_internal@absl@@KA_JI@Z ?DecrementCount@BlockingCounter@absl@@QAE_NXZ ?DecrementSynchSem@Mutex@absl@@CA_NPAV12@PAUPerThreadSynch@base_internal@2@VKernelTimeout@synchronization_internal@2@@Z ?DefaultArena@LowLevelAlloc@base_internal@absl@@SAPAUArena@123@XZ @@ -475,7 +475,7 @@ ?GetEstimatedFairShareMemoryUsage@cord_internal@absl@@YAIPBUCordRep@12@@Z ?GetEstimatedMemoryUsage@cord_internal@absl@@YAIPBUCordRep@12@@Z ?GetFlatAux@Cord@absl@@CA_NPAUCordRep@cord_internal@2@PAVstring_view@2@@Z - ?GetHashtablezMaxSamples@container_internal@absl@@YAHXZ + ?GetHashtablezMaxSamples@container_internal@absl@@YAIXZ ?GetHashtablezSampleParameter@container_internal@absl@@YAHXZ ?GetId@GraphCycles@synchronization_internal@absl@@QAE?AUGraphId@23@PAX@Z ?GetKeys@RandenHwAes@random_internal@absl@@SAPBXXZ @@ -594,7 +594,7 @@ ?MutexDelay@synchronization_internal@absl@@YAHHH@Z ?New@CordRepCrc@cord_internal@absl@@SAPAU123@PAUCordRep@23@I@Z ?New@CordRepRing@cord_internal@absl@@CAPAV123@II@Z - ?NewArena@LowLevelAlloc@base_internal@absl@@SAPAUArena@123@H@Z + ?NewArena@LowLevelAlloc@base_internal@absl@@SAPAUArena@123@I@Z ?Next@CordzInfo@cord_internal@absl@@QBEPAV123@ABVCordzSnapshot@23@@Z ?NextTransition@TimeZone@absl@@QBE_NVTime@2@PAUCivilTransition@12@@Z ?NextTransition@TimeZoneInfo@cctz@time_internal@absl@@UBE_NABV?$time_point@Vsystem_clock@chrono@Cr@std@@V?$duration@_JV?$ratio@$00$00@Cr@std@@@234@@chrono@Cr@std@@PAUcivil_transition@time_zone@234@@Z @@ -702,8 +702,8 @@ ?SetHashtablezConfigListener@container_internal@absl@@YAXP6AXXZ@Z ?SetHashtablezEnabled@container_internal@absl@@YAX_N@Z ?SetHashtablezEnabledInternal@container_internal@absl@@YAX_N@Z - ?SetHashtablezMaxSamples@container_internal@absl@@YAXH@Z - ?SetHashtablezMaxSamplesInternal@container_internal@absl@@YAXH@Z + ?SetHashtablezMaxSamples@container_internal@absl@@YAXI@Z + ?SetHashtablezMaxSamplesInternal@container_internal@absl@@YAXI@Z ?SetHashtablezSampleParameter@container_internal@absl@@YAXH@Z ?SetHashtablezSampleParameterInternal@container_internal@absl@@YAXH@Z ?SetMutexDeadlockDetectionMode@absl@@YAXW4OnDeadlockCycle@1@@Z
diff --git a/third_party/apache-portable-runtime/BUILD.gn b/third_party/apache-portable-runtime/BUILD.gn index cc253d8..f1d1768f 100644 --- a/third_party/apache-portable-runtime/BUILD.gn +++ b/third_party/apache-portable-runtime/BUILD.gn
@@ -10,6 +10,9 @@ cflags = [ # TODO(https://crbug.com/1347226): Investigate, fix. "-Wno-deprecated-declarations", + + # TODO(https://crbug.com/1343303): Remove once fix is rolled in. + "-Wno-array-parameter", ] } }
diff --git a/third_party/apache-portable-runtime/OWNERS b/third_party/apache-portable-runtime/OWNERS index fb59c70..78c2d80 100644 --- a/third_party/apache-portable-runtime/OWNERS +++ b/third_party/apache-portable-runtime/OWNERS
@@ -1 +1 @@ -file://net/OWNERS +file://components/cronet/OWNERS
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc index 267944f..f1271ac 100644 --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc
@@ -67,6 +67,12 @@ const base::Feature kBackForwardCacheDedicatedWorker{ "BackForwardCacheDedicatedWorker", base::FEATURE_ENABLED_BY_DEFAULT}; +// Accumulates the fetch requests for resources while parsing chunks of HTML so +// they can be evaluated, prioritized and processed as a group rather than as +// they are discovered. +const base::Feature kBatchFetchRequests{"BatchFetchRequests", + base::FEATURE_DISABLED_BY_DEFAULT}; + // Enable intervention for download that was initiated from or occurred in an ad // frame without user activation. const base::Feature kBlockingDownloadsInAdFrameWithoutUserActivation{
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h index c61f996..808e224 100644 --- a/third_party/blink/public/common/features.h +++ b/third_party/blink/public/common/features.h
@@ -31,6 +31,7 @@ BLINK_COMMON_EXPORT extern const base::Feature kAutomaticLazyFrameLoadingToEmbedUrls; BLINK_COMMON_EXPORT extern const base::Feature kBackForwardCacheDedicatedWorker; +BLINK_COMMON_EXPORT extern const base::Feature kBatchFetchRequests; BLINK_COMMON_EXPORT extern const base::Feature kBlockingDownloadsInAdFrameWithoutUserActivation; BLINK_COMMON_EXPORT extern const base::Feature kCSSContainerQueries;
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl index ebfcc5da..bdd2ca0b 100644 --- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl +++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -845,7 +845,6 @@ ClientMetadataHttpNotFound ClientMetadataNoResponse ClientMetadataInvalidResponse - ClientMetadataMissingPrivacyPolicyUrl DisabledInSettings ErrorFetchingSignin InvalidSigninResponse
diff --git a/third_party/blink/public/mojom/devtools/inspector_issue.mojom b/third_party/blink/public/mojom/devtools/inspector_issue.mojom index a1fc160..95e547d 100644 --- a/third_party/blink/public/mojom/devtools/inspector_issue.mojom +++ b/third_party/blink/public/mojom/devtools/inspector_issue.mojom
@@ -202,7 +202,6 @@ kErrorFetchingClientMetadataHttpNotFound, kErrorFetchingClientMetadataNoResponse, kErrorFetchingClientMetadataInvalidResponse, - kErrorClientMetadataMissingPrivacyPolicyUrl, kErrorFetchingAccountsHttpNotFound, kErrorFetchingAccountsNoResponse, kErrorFetchingAccountsInvalidResponse,
diff --git a/third_party/blink/public/mojom/frame/frame.mojom b/third_party/blink/public/mojom/frame/frame.mojom index c15b8c7..45e43e6c 100644 --- a/third_party/blink/public/mojom/frame/frame.mojom +++ b/third_party/blink/public/mojom/frame/frame.mojom
@@ -156,6 +156,12 @@ // to accept in the browser process. const uint16 kMaxTitleChars = 4096; // 4 * 1024; +// Struct for communication channels of the RemoteMainFrame in blink. +struct RemoteMainFrameInterfaces { + pending_associated_remote<blink.mojom.RemoteMainFrameHost> main_frame_host; + pending_associated_receiver<blink.mojom.RemoteMainFrame> main_frame; +}; + // Struct for passing RemoteFrame interfaces from renderer. struct RemoteFrameInterfacesFromRenderer { pending_associated_remote<blink.mojom.RemoteFrame> frame; @@ -1248,7 +1254,7 @@ ChildProcessGone(); // Tells the RemoteFrame to create a new RemoteFrame child. See - // content.mojom.AgentSchedulingGroup.CreateRemoteMainFrame for creation + // blink.mojom.PageBroadcast.CreateRemoteMainFrame for creation // of main frames. // // `token`: The frame token. Used to map between RemoteFrame and
diff --git a/third_party/blink/public/mojom/page/page.mojom b/third_party/blink/public/mojom/page/page.mojom index 39bfc22..cfce94f 100644 --- a/third_party/blink/public/mojom/page/page.mojom +++ b/third_party/blink/public/mojom/page/page.mojom
@@ -4,9 +4,13 @@ module blink.mojom; import "mojo/public/mojom/base/time.mojom"; +import "mojo/public/mojom/base/unguessable_token.mojom"; import "skia/public/mojom/skcolor.mojom"; +import "third_party/blink/public/mojom/frame/frame.mojom"; +import "third_party/blink/public/mojom/frame/frame_replication_state.mojom"; import "third_party/blink/public/mojom/navigation/was_activated_option.mojom"; import "third_party/blink/public/mojom/page/page_visibility_state.mojom"; +import "third_party/blink/public/mojom/tokens/tokens.mojom"; import "third_party/blink/public/mojom/webpreferences/web_preferences.mojom"; import "third_party/blink/public/mojom/renderer_preferences.mojom"; @@ -108,4 +112,29 @@ // Sent to whole page, but should only be used by the main frame. SetPageBaseBackgroundColor(skia.mojom.SkColor? color); + + // Tells the renderer to create a new RemoteFrame main frame. See + // blink.mojom.RemoteFrame.CreateRemoteChild for creating child frames + // of RemoteFrames. + // + // `token`: The frame token. Used to map between RemoteFrame and + // RenderFrameProxyHost. + // `opener_frame_token`: Frame token that identifies the opener frame if one + // exists, or absl::nullopt otherwise. + // `devtools_frame_token`: Used for devtools instrumentation and + // trace-ability. The token is shared across all frames (local or remotes) + // representing the same logical frame tree node, and is used by Blink and + // content to tag calls and requests for instrumentation purposes, + // allowing them to be attributed to a context frame. + // + // Must not be used to look up a RenderFrameHostImpl or + // RenderFrameProxyHost in the browser process, as the token is shared, + // making the mapping ambiguous and non-authoritative. + CreateRemoteMainFrame( + RemoteFrameToken token, + FrameToken? opener_frame_token, + FrameReplicationState replication_state, + mojo_base.mojom.UnguessableToken devtools_frame_token, + RemoteFrameInterfacesFromBrowser remote_frame_interfaces, + RemoteMainFrameInterfaces remote_main_frame_interfaces); };
diff --git a/third_party/blink/public/platform/platform.h b/third_party/blink/public/platform/platform.h index b3845ea3..0655dca 100644 --- a/third_party/blink/public/platform/platform.h +++ b/third_party/blink/public/platform/platform.h
@@ -357,10 +357,6 @@ virtual void SetThreadType(base::PlatformThreadId, base::ThreadType) {} #endif - // Returns a blame context for attributing top-level work which does not - // belong to a particular frame scope. - virtual BlameContext* GetTopLevelBlameContext() { return nullptr; } - // Resources ----------------------------------------------------------- // Returns a blob of data corresponding to |resource_id|. This should not be
diff --git a/third_party/blink/public/platform/scheduler/test/web_fake_thread_scheduler.h b/third_party/blink/public/platform/scheduler/test/web_fake_thread_scheduler.h index 5144c5c2..955c1f5 100644 --- a/third_party/blink/public/platform/scheduler/test/web_fake_thread_scheduler.h +++ b/third_party/blink/public/platform/scheduler/test/web_fake_thread_scheduler.h
@@ -31,8 +31,6 @@ void ResumeTimersForAndroidWebView() override; #endif void Shutdown() override; - void SetTopLevelBlameContext( - base::trace_event::BlameContext* blame_context) override; void SetRendererProcessType(WebRendererProcessType type) override; };
diff --git a/third_party/blink/public/platform/scheduler/test/web_mock_thread_scheduler.h b/third_party/blink/public/platform/scheduler/test/web_mock_thread_scheduler.h index 5c8ec08..21a1c4e 100644 --- a/third_party/blink/public/platform/scheduler/test/web_mock_thread_scheduler.h +++ b/third_party/blink/public/platform/scheduler/test/web_mock_thread_scheduler.h
@@ -51,7 +51,6 @@ MOCK_METHOD0(Shutdown, void()); MOCK_METHOD0(VirtualTimePaused, void()); MOCK_METHOD0(VirtualTimeResumed, void()); - MOCK_METHOD1(SetTopLevelBlameContext, void(base::trace_event::BlameContext*)); MOCK_METHOD1(SetRendererProcessType, void(WebRendererProcessType)); };
diff --git a/third_party/blink/public/platform/scheduler/web_thread_scheduler.h b/third_party/blink/public/platform/scheduler/web_thread_scheduler.h index 28583ab..5857f99 100644 --- a/third_party/blink/public/platform/scheduler/web_thread_scheduler.h +++ b/third_party/blink/public/platform/scheduler/web_thread_scheduler.h
@@ -15,12 +15,6 @@ #include "third_party/blink/public/platform/scheduler/web_rail_mode_observer.h" #include "third_party/blink/public/platform/web_common.h" -namespace base { -namespace trace_event { -class BlameContext; -} // namespace trace_event -} // namespace base - namespace blink { class Thread; } // namespace blink @@ -111,11 +105,6 @@ virtual void ResumeTimersForAndroidWebView(); #endif // BUILDFLAG(IS_ANDROID) - // Sets the default blame context to which top level work should be - // attributed in this renderer. |blame_context| must outlive this scheduler. - virtual void SetTopLevelBlameContext( - base::trace_event::BlameContext* blame_context); - // Sets the kind of renderer process. Should be called on the main thread // once. virtual void SetRendererProcessType(WebRendererProcessType type);
diff --git a/third_party/blink/public/platform/web_runtime_features.h b/third_party/blink/public/platform/web_runtime_features.h index d8935b6..a038d8b 100644 --- a/third_party/blink/public/platform/web_runtime_features.h +++ b/third_party/blink/public/platform/web_runtime_features.h
@@ -80,6 +80,7 @@ EnableAccessibilityUseAXPositionForDocumentMarkers(bool); BLINK_PLATFORM_EXPORT static void EnableAdTagging(bool); BLINK_PLATFORM_EXPORT static void EnableBackgroundFetch(bool); + BLINK_PLATFORM_EXPORT static void EnableBatchFetchRequests(bool); BLINK_PLATFORM_EXPORT static void EnableBrowserVerifiedUserActivationKeyboard( bool); BLINK_PLATFORM_EXPORT static void EnableBrowserVerifiedUserActivationMouse(
diff --git a/third_party/blink/public/web/web_local_frame_client.h b/third_party/blink/public/web/web_local_frame_client.h index 544ea3f..014a378 100644 --- a/third_party/blink/public/web/web_local_frame_client.h +++ b/third_party/blink/public/web/web_local_frame_client.h
@@ -597,9 +597,6 @@ return nullptr; } - // WebRTC - virtual bool AllowRTCLegacyTLSProtocols() { return false; } - // Encrypted Media ------------------------------------------------- virtual WebEncryptedMediaClient* EncryptedMediaClient() { return nullptr; } @@ -618,12 +615,6 @@ return absl::nullopt; } - // Do not track ---------------------------------------------------- - - // Asks the embedder what value the network stack will send for the DNT - // header. An empty string indicates that no DNT header will be send. - virtual WebString DoNotTrackValue() { return WebString(); } - // // Accessibility ------------------------------------------------------- //
diff --git a/third_party/blink/public/web/web_view.h b/third_party/blink/public/web/web_view.h index 3af33a4d..ead76f1f 100644 --- a/third_party/blink/public/web/web_view.h +++ b/third_party/blink/public/web/web_view.h
@@ -467,6 +467,9 @@ // Returns whether this WebView represents a fenced frame root or not. virtual bool IsFencedFrameRoot() const = 0; + // Return the Client associated with this WebView. + virtual WebViewClient* Client() = 0; + // Misc ------------------------------------------------------------- // Returns the number of live WebView instances in this process.
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc b/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc index b82a10d9..f378caa 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc +++ b/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc
@@ -101,12 +101,6 @@ ScriptForbiddenScope::Enter(); - // Attribute garbage collection to the all frames instead of a specific - // frame. - if (BlameContext* blame_context = - Platform::Current()->GetTopLevelBlameContext()) - blame_context->Enter(); - v8::HandleScope scope(isolate); switch (type) { case v8::kGCTypeIncrementalMarking: @@ -139,10 +133,6 @@ ScriptForbiddenScope::Exit(); - if (BlameContext* blame_context = - Platform::Current()->GetTopLevelBlameContext()) - blame_context->Leave(); - ThreadState* current_thread_state = ThreadState::Current(); if (current_thread_state) { current_thread_state->NotifyGarbageCollection(type, flags);
diff --git a/third_party/blink/renderer/core/accessibility/ax_object_cache.h b/third_party/blink/renderer/core/accessibility/ax_object_cache.h index 849b5d0..2e4756c 100644 --- a/third_party/blink/renderer/core/accessibility/ax_object_cache.h +++ b/third_party/blink/renderer/core/accessibility/ax_object_cache.h
@@ -172,7 +172,18 @@ virtual void OnTouchAccessibilityHover(const gfx::Point&) = 0; + // Gets the AXID of the given Node. If there is not yet an associated + // AXObject, this method will create one (along with its parent chain) and + // return the id. virtual AXID GetAXID(Node*) = 0; + + // Crash dumps have shown there are times where AXID's are queried + // 'out-of-band' where we may not be in a state where creating AXObjects and + // repairing parent chains is possible. This will look for the current + // AXObject associated with the given node and return its id without creating + // or recomputing any state. + virtual AXID GetExistingAXID(Node*) = 0; + virtual AXObject* ObjectFromAXID(AXID) const = 0; typedef AXObjectCache* (*AXObjectCacheCreateFunction)(Document&,
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index c7671e2..6efa49d 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -89,6 +89,7 @@ #include "third_party/blink/renderer/core/dom/events/event_dispatcher.h" #include "third_party/blink/renderer/core/dom/events/event_path.h" #include "third_party/blink/renderer/core/dom/first_letter_pseudo_element.h" +#include "third_party/blink/renderer/core/dom/flat_tree_traversal.h" #include "third_party/blink/renderer/core/dom/focus_params.h" #include "third_party/blink/renderer/core/dom/layout_tree_builder.h" #include "third_party/blink/renderer/core/dom/mutation_observer_interest_group.h" @@ -2988,14 +2989,23 @@ } if (inclusive) { // For inclusive mode, we need to walk up the tree until we find an open - // pop-up, and then modify the upper bound to include that pop-up, if found. + // pop-up, or an invoker for an open pop-up, and then modify the upper bound + // to include the highest such pop-up found, if any. for (const Node* current_node = node; current_node; current_node = FlatTreeTraversal::Parent(*current_node)) { if (auto* current_element = DynamicTo<Element>(current_node); current_element && current_element->HasValidPopupAttribute() && current_element->popupOpen()) { - upper_bound = popup_positions.at(current_element) + 1; // Include it. - break; + upper_bound = + std::max(upper_bound, popup_positions.at(current_element) + 1); + } + if (auto* form_control = + DynamicTo<HTMLFormControlElement>(current_node)) { + if (auto target_pop_up = form_control->popupTargetElement().element; + target_pop_up && target_pop_up->popupOpen()) { + upper_bound = + std::max(upper_bound, popup_positions.at(target_pop_up) + 1); + } } } }
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc index 8f15822..04f247a 100644 --- a/third_party/blink/renderer/core/exported/web_view_impl.cc +++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
@@ -55,6 +55,7 @@ #include "third_party/blink/public/common/renderer_preferences/renderer_preferences.h" #include "third_party/blink/public/common/switches.h" #include "third_party/blink/public/common/web_preferences/web_preferences.h" +#include "third_party/blink/public/mojom/frame/frame_replication_state.mojom-blink.h" #include "third_party/blink/public/mojom/input/focus_type.mojom-blink.h" #include "third_party/blink/public/platform/interface_registry.h" #include "third_party/blink/public/platform/platform.h" @@ -3839,4 +3840,29 @@ FROM_HERE, WTF::Bind(&WebViewImpl::Close, WTF::Unretained(this))); } +void WebViewImpl::CreateRemoteMainFrame( + const RemoteFrameToken& frame_token, + const absl::optional<FrameToken>& opener_frame_token, + mojom::blink::FrameReplicationStatePtr replicated_state, + const base::UnguessableToken& devtools_frame_token, + mojom::blink::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, + mojom::blink::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) { + blink::WebFrame* opener = nullptr; + if (opener_frame_token) + opener = WebFrame::FromFrameToken(*opener_frame_token); + // Create a top level WebRemoteFrame. + WebRemoteFrameImpl::CreateMainFrame( + this, frame_token, devtools_frame_token, opener, + std::move(remote_frame_interfaces->frame_host), + std::move(remote_frame_interfaces->frame_receiver), + std::move(replicated_state)); + // Root frame proxy has no ancestors to point to their RenderWidget. + + // The WebRemoteFrame created here was already attached to the Page as its + // main frame, so we can call WebView's DidAttachRemoteMainFrame(). + DidAttachRemoteMainFrame( + std::move(remote_main_frame_interfaces->main_frame_host), + std::move(remote_main_frame_interfaces->main_frame)); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.h b/third_party/blink/renderer/core/exported/web_view_impl.h index 1b0e781..13b6877 100644 --- a/third_party/blink/renderer/core/exported/web_view_impl.h +++ b/third_party/blink/renderer/core/exported/web_view_impl.h
@@ -219,6 +219,7 @@ int32_t HistoryListLength() const { return history_list_length_; } const SessionStorageNamespaceId& GetSessionStorageNamespaceId() override; bool IsFencedFrameRoot() const override; + WebViewClient* Client() override { return web_view_client_; } // Functions to add and remove observers for this object. void AddObserver(WebViewObserver* observer); @@ -291,6 +292,14 @@ void SetHistoryOffsetAndLength(int32_t history_offset, int32_t history_length) override; void SetPageBaseBackgroundColor(absl::optional<SkColor> color) override; + void CreateRemoteMainFrame( + const RemoteFrameToken& frame_token, + const absl::optional<FrameToken>& opener_frame_token, + mojom::blink::FrameReplicationStatePtr replicated_state, + const base::UnguessableToken& devtools_frame_token, + mojom::blink::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, + mojom::blink::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) + override; void DispatchPageshow(base::TimeTicks navigation_start); void DispatchPagehide(mojom::blink::PagehideDispatch pagehide_dispatch); @@ -323,8 +332,6 @@ // Returns the currently focused Element or null if no element has focus. Element* FocusedElement() const; - WebViewClient* Client() { return web_view_client_; } - // Returns the page object associated with this view. This may be null when // the page is shutting down, but will be valid at all other times. Page* GetPage() const { return page_.Get(); }
diff --git a/third_party/blink/renderer/core/frame/frame_test_helpers.cc b/third_party/blink/renderer/core/frame/frame_test_helpers.cc index 17b2d894..0991df46 100644 --- a/third_party/blink/renderer/core/frame/frame_test_helpers.cc +++ b/third_party/blink/renderer/core/frame/frame_test_helpers.cc
@@ -486,17 +486,19 @@ InitializeWebView(web_view_client, nullptr, absl::nullopt); - WebRemoteFrameImpl* frame = WebRemoteFrameImpl::CreateMainFrame( + if (!security_origin) + security_origin = SecurityOrigin::CreateUniqueOpaque(); + auto replication_state = mojom::blink::FrameReplicationState::New(); + replication_state->origin = security_origin; + + WebRemoteFrameImpl::CreateMainFrame( web_view_, RemoteFrameToken(), /*devtools_frame_token=*/base::UnguessableToken(), opener, CreateStubRemoteIfNeeded<mojom::blink::RemoteFrameHost>( mojo::NullAssociatedRemote()), mojo::AssociatedRemote<mojom::blink::RemoteFrame>() .BindNewEndpointAndPassDedicatedReceiver(), - mojom::FrameReplicationState::New()); - if (!security_origin) - security_origin = SecurityOrigin::CreateUniqueOpaque(); - frame->GetFrame()->SetReplicatedOrigin(std::move(security_origin), false); + std::move(replication_state)); return web_view_; }
diff --git a/third_party/blink/renderer/core/frame/local_frame_client_impl.cc b/third_party/blink/renderer/core/frame/local_frame_client_impl.cc index f40f022..2ac22a0 100644 --- a/third_party/blink/renderer/core/frame/local_frame_client_impl.cc +++ b/third_party/blink/renderer/core/frame/local_frame_client_impl.cc
@@ -838,9 +838,8 @@ } String LocalFrameClientImpl::DoNotTrackValue() { - WebString do_not_track = web_frame_->Client()->DoNotTrackValue(); - if (!do_not_track.IsEmpty()) - return do_not_track; + if (web_frame_->View()->GetRendererPreferences().enable_do_not_track) + return "1"; return String(); }
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc index 6ffbe59..93fd9d0 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.cc +++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -1085,8 +1085,6 @@ owner->SetNeedsOcclusionTracking(needs_occlusion_tracking); #if DCHECK_IS_ON() DCHECK(was_dirty || !NeedsLayout()); - // This is to prevent invalidations during IntersectionObserver delivery. - DisallowLayoutInvalidationScope disallow_invalidations(this); #endif DeliverSynchronousIntersectionObservations(); }
diff --git a/third_party/blink/renderer/core/frame/web_remote_frame_impl.cc b/third_party/blink/renderer/core/frame/web_remote_frame_impl.cc index a2f137d..d85c181 100644 --- a/third_party/blink/renderer/core/frame/web_remote_frame_impl.cc +++ b/third_party/blink/renderer/core/frame/web_remote_frame_impl.cc
@@ -103,7 +103,7 @@ return WebRemoteFrameImpl::CreateMainFrame( web_view, frame_token, devtools_frame_token, opener, std::move(remote_frame_host), std::move(receiver), - std::move(replicated_state)); + ToBlinkFrameReplicationState(std::move(replicated_state))); } // static @@ -115,7 +115,7 @@ mojo::PendingAssociatedRemote<mojom::blink::RemoteFrameHost> remote_frame_host, mojo::PendingAssociatedReceiver<mojom::blink::RemoteFrame> receiver, - mojom::FrameReplicationStatePtr replicated_state) { + mojom::blink::FrameReplicationStatePtr replicated_state) { WebRemoteFrameImpl* frame = MakeGarbageCollected<WebRemoteFrameImpl>( mojom::blink::TreeScopeType::kDocument, frame_token); Page& page = *To<WebViewImpl>(web_view)->GetPage();
diff --git a/third_party/blink/renderer/core/frame/web_remote_frame_impl.h b/third_party/blink/renderer/core/frame/web_remote_frame_impl.h index 68a4cd2..2701a00 100644 --- a/third_party/blink/renderer/core/frame/web_remote_frame_impl.h +++ b/third_party/blink/renderer/core/frame/web_remote_frame_impl.h
@@ -38,7 +38,7 @@ mojo::PendingAssociatedRemote<mojom::blink::RemoteFrameHost> remote_frame_host, mojo::PendingAssociatedReceiver<mojom::blink::RemoteFrame> receiver, - mojom::FrameReplicationStatePtr replicated_state); + mojom::blink::FrameReplicationStatePtr replicated_state); static WebRemoteFrameImpl* CreateForPortalOrFencedFrame( mojom::blink::TreeScopeType,
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element.cc b/third_party/blink/renderer/core/html/forms/html_form_control_element.cc index 003480a4..c647146 100644 --- a/third_party/blink/renderer/core/html/forms/html_form_control_element.cc +++ b/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
@@ -443,6 +443,15 @@ if (!document.IsActive() || !document.View()) return 0; if (AXObjectCache* cache = document.ExistingAXObjectCache()) { + LocalFrameView* local_frame_view = document.View(); + if (local_frame_view->IsUpdatingLifecycle()) { + // Autofill (the caller of this code) can end up making calls to get AXIDs + // of form elements during, e.g. resize observer callbacks, which are + // in the middle up updating the document lifecycle. In these cases, just + // return the existing AXID of the element. + return cache->GetExistingAXID(const_cast<HTMLFormControlElement*>(this)); + } + if (document.NeedsLayoutTreeUpdate() || document.View()->NeedsLayout() || document.Lifecycle().GetState() < DocumentLifecycle::kPrePaintClean) { document.View()->UpdateAllLifecyclePhasesExceptPaint(
diff --git a/third_party/blink/renderer/core/html/html_script_element.cc b/third_party/blink/renderer/core/html/html_script_element.cc index 734e9b2bd..14fb92f 100644 --- a/third_party/blink/renderer/core/html/html_script_element.cc +++ b/third_party/blink/renderer/core/html/html_script_element.cc
@@ -214,7 +214,7 @@ } bool HTMLScriptElement::async() const { - return FastHasAttribute(html_names::kAsyncAttr) || loader_->IsNonBlocking(); + return FastHasAttribute(html_names::kAsyncAttr) || loader_->IsForceAsync(); } String HTMLScriptElement::SourceAttributeValue() const {
diff --git a/third_party/blink/renderer/core/html/parser/html_document_parser.cc b/third_party/blink/renderer/core/html/parser/html_document_parser.cc index 1e71f9b..7b9d2573 100644 --- a/third_party/blink/renderer/core/html/parser/html_document_parser.cc +++ b/third_party/blink/renderer/core/html/parser/html_document_parser.cc
@@ -410,6 +410,19 @@ HTMLDocumentParserState* state_; }; +class FetchBatchScope { + STACK_ALLOCATED(); + + public: + explicit FetchBatchScope(HTMLDocumentParser* parser) : parser_(parser) { + parser_->StartFetchBatch(); + } + ~FetchBatchScope() { parser_->EndFetchBatch(); } + + private: + HTMLDocumentParser* const parser_; +}; + // This is a direct transcription of step 4 from: // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#fragment-case static HTMLTokenizer::State TokenizerStateForContextElement( @@ -579,6 +592,9 @@ } void HTMLDocumentParser::Detach() { + // Unwind any nested batch operations before being detached + FlushFetchBatch(); + // Deschedule any pending tokenizer pumps. task_runner_state_->SetState( HTMLDocumentParserState::DeferredParserState::kNotScheduled); @@ -801,6 +817,8 @@ // DidWriteHTML instead of WillWriteHTML. probe::ParseHTML probe(GetDocument(), this); + FetchBatchScope fetch_batch(this); + bool should_yield = false; // If we've yielded more than 2 times, then set the budget to a very large // number, to attempt to consume all available tokens in one go. This @@ -1449,6 +1467,9 @@ HTMLMetaElement::ProcessMetaCH(*GetDocument(), value.value, value.type, value.is_doc_preloader); } + + FetchBatchScope fetch_batch(this); + // Make sure that the viewport is up-to-date, so that the correct viewport // dimensions will be fed to the preload scanner. if (GetDocument()->Loader() && @@ -1587,4 +1608,26 @@ } } +void HTMLDocumentParser::StartFetchBatch() { + GetDocument()->Fetcher()->StartBatch(); + pending_batch_operations_++; +} + +void HTMLDocumentParser::EndFetchBatch() { + if (!IsDetached() && pending_batch_operations_ > 0) { + pending_batch_operations_--; + GetDocument()->Fetcher()->EndBatch(); + } +} + +void HTMLDocumentParser::FlushFetchBatch() { + if (!IsDetached() && pending_batch_operations_ > 0) { + ResourceFetcher* fetcher = GetDocument()->Fetcher(); + while (pending_batch_operations_ > 0) { + pending_batch_operations_--; + fetcher->EndBatch(); + } + } +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/html/parser/html_document_parser.h b/third_party/blink/renderer/core/html/parser/html_document_parser.h index 66deb72..9d3cc6e8 100644 --- a/third_party/blink/renderer/core/html/parser/html_document_parser.h +++ b/third_party/blink/renderer/core/html/parser/html_document_parser.h
@@ -59,6 +59,7 @@ class Document; class DocumentFragment; class Element; +class FetchBatchScope; class HTMLDocument; class HTMLParserMetrics; class HTMLParserScriptRunner; @@ -82,6 +83,8 @@ class CORE_EXPORT HTMLDocumentParser : public ScriptableDocumentParser, private HTMLParserScriptRunnerHost { + friend FetchBatchScope; + public: HTMLDocumentParser(HTMLDocument&, ParserSynchronizationPolicy, @@ -258,6 +261,20 @@ GUARDED_BY(pending_preload_lock_); ThreadScheduler* scheduler_; + + // Handle the ref counting of nested batch fetches. Usually the batching is + // handled by a scope-lock for the duration of the batch (and can be nested + // within other batches). + // + // When the parser gets detached from the document, if it happens during a + // scope-locked batch operation, the scope-based batching will not be able + // to end the batches properly. By keeping track of how deep the request + // batching is, the outstanding batches can be cleared outside of the scope + // lock at the time that the document is detached from the parser. + void StartFetchBatch(); + void EndFetchBatch(); + void FlushFetchBatch(); + uint32_t pending_batch_operations_ = 0u; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/paint/fragment_data.cc b/third_party/blink/renderer/core/paint/fragment_data.cc index 899d1c8..f8a38073 100644 --- a/third_party/blink/renderer/core/paint/fragment_data.cc +++ b/third_party/blink/renderer/core/paint/fragment_data.cc
@@ -96,10 +96,6 @@ const ClipPaintPropertyNodeOrAlias& FragmentData::PreClip() const { if (const auto* properties = PaintProperties()) { - if (const auto* clip = properties->PixelMovingFilterClipExpander()) { - DCHECK(clip->Parent()); - return *clip->Parent(); - } if (const auto* clip = properties->ClipPathClip()) { DCHECK(clip->Parent()); return *clip->Parent(); @@ -112,6 +108,10 @@ DCHECK(css_clip->Parent()); return *css_clip->Parent(); } + if (const auto* clip = properties->PixelMovingFilterClipExpander()) { + DCHECK(clip->Parent()); + return *clip->Parent(); + } } return LocalBorderBoxProperties().Clip(); }
diff --git a/third_party/blink/renderer/core/paint/fragment_data_test.cc b/third_party/blink/renderer/core/paint/fragment_data_test.cc index 9333229..83b12bc 100644 --- a/third_party/blink/renderer/core/paint/fragment_data_test.cc +++ b/third_party/blink/renderer/core/paint/fragment_data_test.cc
@@ -16,6 +16,7 @@ width: 400px; height: 400px; position: absolute; clip: rect(0, 50px, 100px, 0); clip-path: inset(0%); + filter: blur(10px); } </style> <div id='target'></div> @@ -26,6 +27,9 @@ target->FirstFragment().PaintProperties(); EXPECT_TRUE(properties->ClipPathClip()); EXPECT_TRUE(properties->CssClip()); + EXPECT_TRUE(properties->PixelMovingFilterClipExpander()); + EXPECT_EQ(properties->CssClip(), + properties->PixelMovingFilterClipExpander()->Parent()); EXPECT_EQ(properties->ClipPathClip(), properties->CssClip()->Parent()); EXPECT_EQ(properties->ClipPathClip()->Parent(), &target->FirstFragment().PreClip());
diff --git a/third_party/blink/renderer/core/paint/object_paint_properties.h b/third_party/blink/renderer/core/paint/object_paint_properties.h index 020a882..e4ab3aa 100644 --- a/third_party/blink/renderer/core/paint/object_paint_properties.h +++ b/third_party/blink/renderer/core/paint/object_paint_properties.h
@@ -221,10 +221,6 @@ // [ FragmentClip ] // | Clips to a fragment's bounds. // | This is only present for content under a fragmentation container. - // +-[ PixelMovingFilterClipExpander ] - // | Clip created by pixel-moving filter. Instead of intersecting with the - // / current clip, this clip expands the current clip to include all pixels - // / in the filtered content that may affect the pixels in the current clip. // +-[ ClipPathClip ] // | Clip created by path-based CSS clip-path. Only exists if the // / clip-path is "simple" that can be applied geometrically. This and @@ -245,6 +241,11 @@ // +-[ OverflowControlsClip ] // | Clip created by overflow clip to clip overflow controls // | (scrollbars, resizer, scroll corner) that would overflow the box. + // +-[ PixelMovingFilterClipExpander ] + // | Clip created by pixel-moving filter. Instead of intersecting with + // | the current clip, this clip expands the current clip to include all + // / pixels in the filtered content that may affect the pixels in the + // / current clip. // +-[ InnerBorderRadiusClip ] // | Clip created by a rounded border with overflow clip. This clip is // | not inset by scrollbars.
diff --git a/third_party/blink/renderer/core/paint/paint_layer_clipper.cc b/third_party/blink/renderer/core/paint/paint_layer_clipper.cc index 8e2b7515..4880cd7c 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_clipper.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_clipper.cc
@@ -356,9 +356,8 @@ // overflow induced by paint, prior to applying filters. This function is // expected the return the final visual rect after filtering. if (layer_->PaintsWithFilters() && - // If we use GeometryMapper to map to an ancestor layer, GeometryMapper - // will handle filter effects. - (!use_geometry_mapper_ || context.root_layer == layer_)) { + // GeometryMapper will handle filter effects. + !use_geometry_mapper_) { layer_bounds_with_visual_overflow = layer_->MapRectForFilter(layer_bounds_with_visual_overflow); }
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc index 8279424..04981e52 100644 --- a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc +++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
@@ -1798,7 +1798,7 @@ OnUpdateClip(properties_->UpdatePixelMovingFilterClipExpander( *context_.current.clip, ClipPaintPropertyNode::State(context_.current.transform, - properties_->Filter()))); + *properties_->Filter()))); } else { OnClearClip(properties_->ClearPixelMovingFilterClipExpander()); }
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_printer.cc b/third_party/blink/renderer/core/paint/paint_property_tree_printer.cc index 849e14e..3079982f0 100644 --- a/third_party/blink/renderer/core/paint/paint_property_tree_printer.cc +++ b/third_party/blink/renderer/core/paint/paint_property_tree_printer.cc
@@ -113,11 +113,11 @@ const ObjectPaintProperties& properties, PropertyTreePrinter<ClipPaintPropertyNodeOrAlias>& printer) { printer.AddNode(properties.FragmentClip()); - printer.AddNode(properties.PixelMovingFilterClipExpander()); printer.AddNode(properties.ClipPathClip()); printer.AddNode(properties.MaskClip()); printer.AddNode(properties.CssClip()); printer.AddNode(properties.CssClipFixedPosition()); + printer.AddNode(properties.PixelMovingFilterClipExpander()); printer.AddNode(properties.OverflowControlsClip()); printer.AddNode(properties.InnerBorderRadiusClip()); printer.AddNode(properties.OverflowClip()); @@ -250,13 +250,13 @@ object); SetDebugName(properties.FragmentClip(), "FragmentClip", object); - SetDebugName(properties.PixelMovingFilterClipExpander(), - "PixelMovingFilterClip", object); SetDebugName(properties.ClipPathClip(), "ClipPathClip", object); SetDebugName(properties.MaskClip(), "MaskClip", object); SetDebugName(properties.CssClip(), "CssClip", object); SetDebugName(properties.CssClipFixedPosition(), "CssClipFixedPosition", object); + SetDebugName(properties.PixelMovingFilterClipExpander(), + "PixelMovingFilterClip", object); SetDebugName(properties.OverflowControlsClip(), "OverflowControlsClip", object); SetDebugName(properties.InnerBorderRadiusClip(), "InnerBorderRadiusClip",
diff --git a/third_party/blink/renderer/core/script/html_parser_script_runner.cc b/third_party/blink/renderer/core/script/html_parser_script_runner.cc index 1485e86..f56e55bf 100644 --- a/third_party/blink/renderer/core/script/html_parser_script_runner.cc +++ b/third_party/blink/renderer/core/script/html_parser_script_runner.cc
@@ -199,13 +199,16 @@ // <specdef href="https://html.spec.whatwg.org/C/#scriptEndTag"> void HTMLParserScriptRunner:: ExecutePendingParserBlockingScriptAndDispatchEvent() { + // <spec step="B.1">Let the script be the pending parsing-blocking + // script.</spec> + PendingScript* pending_script = parser_blocking_script_; + // Stop watching loads before executeScript to prevent recursion if the script // reloads itself. // TODO(kouhei): Consider merging this w/ pendingScript->dispose() after the // if block. // TODO(kouhei, hiroshige): Consider merging this w/ the code clearing // |parser_blocking_script_| below. - PendingScript* pending_script = parser_blocking_script_; pending_script->StopWatchingForLoad(); if (!IsExecutingScript()) { @@ -217,22 +220,21 @@ return; } - // <spec step="B.1">Let the script be the pending parsing-blocking script. - // There is no longer a pending parsing-blocking script.</spec> + // <spec step="B.2">Set the pending parsing-blocking script to null.</spec> parser_blocking_script_ = nullptr; { - // <spec step="B.7">Increment the parser's script nesting level by one (it + // <spec step="B.10">Increment the parser's script nesting level by one (it // should be zero before this step, so this sets it to one).</spec> HTMLParserReentryPermit::ScriptNestingLevelIncrementer nesting_level_incrementer = reentry_permit_->IncrementScriptNestingLevel(); - // <spec step="B.8">Execute the script.</spec> + // <spec step="B.11">Execute the script element the script.</spec> DCHECK(IsExecutingScript()); DoExecuteScript(pending_script, DocumentURLForScriptExecution(document_)); - // <spec step="B.9">Decrement the parser's script nesting level by one. If + // <spec step="B.12">Decrement the parser's script nesting level by one. If // the parser's script nesting level is zero (which it always should be at // this point), then set the parser pause flag to false.</spec> // @@ -245,7 +247,7 @@ // Should be correspond to // // <specdef -// href="https://html.spec.whatwg.org/C/#execute-the-script-block"> +// href="https://html.spec.whatwg.org/C/#execute-the-script-element"> // // but currently does more than specced, because historically this and // ExecutePendingParserBlockingScriptAndDispatchEvent() was the same method. @@ -308,10 +310,9 @@ // Try to execute the script given to us. ProcessScriptElementInternal(script_element, script_start_position); - // <spec>... At this stage, if there is a pending parsing-blocking script, - // then:</spec> + // <spec>... At this stage, if the pending parsing-blocking script is not + // null, then:</spec> if (HasParserBlockingScript()) { - // <spec step="A">If the script nesting level is not zero: ...</spec> if (IsExecutingScript()) { // <spec step="A">If the script nesting level is not zero: // @@ -319,8 +320,6 @@ // nested invocations of the tokenizer, yielding control back to the // caller. (Tokenization will resume when the caller returns to the // "outer" tree construction stage.)</spec> - // - // <spec>... set the parser pause flag to ...</spec> // Unwind to the outermost HTMLParserScriptRunner::processScriptElement // before continuing parsing. @@ -350,14 +349,18 @@ // // <spec>An end tag whose tag name is "script" ...</spec> void HTMLParserScriptRunner::ExecuteParsingBlockingScripts() { - // <spec step="B.3">If the parser's Document has a style sheet that is - // blocking scripts or the script's "ready to be parser-executed" flag is not - // set: spin the event loop until the parser's Document has no style sheet - // that is blocking scripts and the script's "ready to be parser-executed" - // flag is set.</spec> + // <spec step="B">Otherwise: + // + // While the pending parsing-blocking script is not null:</spec> + // + // <spec step="B.5">If the parser's Document has a style sheet that is + // blocking scripts or the script's ready to be parser-executed is false: spin + // the event loop until the parser's Document has no style sheet that is + // blocking scripts and the script's ready to be parser-executed becomes + // true.</spec> // // These conditions correspond to IsParserBlockingScriptReady(). - // If it is false at the time of #prepare-a-script, + // If it is false at the time of #prepare-the-script-element, // ExecuteParsingBlockingScripts() will be called later // when IsParserBlockingScriptReady() might become true: // - Called from HTMLParserScriptRunner::ExecuteScriptsWaitingForResources() @@ -375,19 +378,15 @@ DCHECK(!IsExecutingScript()); DCHECK(document_->IsScriptExecutionReady()); - // <spec step="B.6">Let the insertion point be just before the next input + // <spec step="B.9">Let the insertion point be just before the next input // character.</spec> InsertionPointRecord insertion_point_record(host_->InputStream()); - // 1., 7.--9. ExecutePendingParserBlockingScriptAndDispatchEvent(); - // <spec step="B.10">Let the insertion point be undefined again.</spec> + // <spec step="B.13">Let the insertion point be undefined again.</spec> // // Implemented as ~InsertionPointRecord(). - - // <spec step="B.11">If there is once again a pending parsing-blocking - // script, then repeat these steps from step 1.</spec> } } @@ -414,14 +413,15 @@ ExecuteParsingBlockingScripts(); } +// <specdef href="https://html.spec.whatwg.org/C/#stop-parsing"> PendingScript* HTMLParserScriptRunner::TryTakeReadyScriptWaitingForParsing( HeapDeque<Member<PendingScript>>* waiting_scripts) { DCHECK(!waiting_scripts->IsEmpty()); - // <spec step="3.1">Spin the event loop until the first script in the list - // of scripts that will execute when the document has finished parsing has - // its "ready to be parser-executed" flag set and the parser's Document has - // no style sheet that is blocking scripts.</spec> + // <spec step="5.1">Spin the event loop until the first script in the list of + // scripts that will execute when the document has finished parsing has its + // ready to be parser-executed set to true and the parser's Document has no + // style sheet that is blocking scripts.</spec> if (!document_->IsScriptExecutionReady()) return nullptr; PendingScript* script = waiting_scripts->front(); @@ -444,15 +444,14 @@ // <specdef href="https://html.spec.whatwg.org/C/#stop-parsing"> // -// <spec step="3">If the list of scripts that will execute when the document has -// finished parsing is not empty, run these substeps:</spec> -// // This will also run any forced deferred scripts before running any developer // deferred scripts. bool HTMLParserScriptRunner::ExecuteScriptsWaitingForParsing() { TRACE_EVENT0("blink", "HTMLParserScriptRunner::executeScriptsWaitingForParsing"); + // <spec step="5">While the list of scripts that will execute when the + // document has finished parsing is not empty:</spec> while (!force_deferred_scripts_.IsEmpty() || !scripts_to_execute_after_parsing_.IsEmpty()) { DCHECK(!IsExecutingScript()); @@ -460,7 +459,7 @@ DCHECK(scripts_to_execute_after_parsing_.IsEmpty() || scripts_to_execute_after_parsing_.front()->IsExternalOrModule()); - // <spec step="3.3">Remove the first script element from the list of scripts + // <spec step="5.3">Remove the first script element from the list of scripts // that will execute when the document has finished parsing (i.e. shift out // the first entry in the list).</spec> PendingScript* first = nullptr; @@ -479,17 +478,14 @@ if (!first) return false; - // <spec step="3.2">Execute the first script in the list of scripts that - // will execute when the document has finished parsing.</spec> + // <spec step="5.2">Execute the script element given by the first script in + // the list of scripts that will execute when the document has finished + // parsing.</spec> ExecutePendingDeferredScriptAndDispatchEvent(first); // FIXME: What is this m_document check for? if (!document_) return false; - - // <spec step="3.4">If the list of scripts that will execute when the - // document has finished parsing is still not empty, repeat these substeps - // again from substep 1.</spec> } // All scripts waiting for parsing have now executed (end of spec step 3), @@ -500,62 +496,10 @@ return true; } -void HTMLParserScriptRunner::RequestParsingBlockingScript( - ScriptLoader* script_loader) { - // <spec href="https://html.spec.whatwg.org/C/#prepare-a-script" - // step="26.B">... The element is the pending parsing-blocking script of the - // Document of the parser that created the element. (There can only be one - // such script per Document at a time.) ...</spec> - CHECK(!ParserBlockingScript()); - parser_blocking_script_ = - script_loader->TakePendingScript(ScriptSchedulingType::kParserBlocking); - if (!ParserBlockingScript()) - return; - - DCHECK(ParserBlockingScript()->IsExternal()); - - // We only care about a load callback if resource is not already in the cache. - // Callers will attempt to run the m_parserBlockingScript if possible before - // returning control to the parser. - if (!ParserBlockingScript()->IsReady()) { - parser_blocking_script_->WatchForLoad(this); - } -} - -void HTMLParserScriptRunner::RequestDeferredScript( - ScriptLoader* script_loader) { - PendingScript* pending_script = - script_loader->TakePendingScript(ScriptSchedulingType::kDefer); - - DCHECK(!script_loader->IsForceDeferred()); - DCHECK(pending_script->IsExternalOrModule()); - - // <spec href="https://html.spec.whatwg.org/C/#prepare-a-script" - // step="26.A">... Add the element to the end of the list of scripts that will - // execute when the document has finished parsing associated with the Document - // of the parser that created the element. ...</spec> - scripts_to_execute_after_parsing_.push_back(pending_script); -} - -void HTMLParserScriptRunner::RequestForceDeferredScript( - ScriptLoader* script_loader) { - PendingScript* pending_script = - script_loader->TakePendingScript(ScriptSchedulingType::kForceDefer); - - DCHECK(base::FeatureList::IsEnabled(features::kForceDeferScriptIntervention)); - DCHECK(script_loader->IsForceDeferred()); - - // Add the element to the end of the list of forced deferred scripts that will - // execute when the document has finished parsing associated with the Document - // of the parser that created the element. - force_deferred_scripts_.push_back(pending_script); - delayer_for_force_defer_->Activate(); -} - // The initial steps for 'An end tag whose tag name is "script"' // <specdef href="https://html.spec.whatwg.org/C/#scriptEndTag"> -// <specdef label="prepare-a-script" -// href="https://html.spec.whatwg.org/C/#prepare-a-script"> +// <specdef label="prepare-the-script-element" +// href="https://html.spec.whatwg.org/C/#prepare-the-script-element"> void HTMLParserScriptRunner::ProcessScriptElementInternal( Element* script, const TextPosition& script_start_position) { @@ -570,6 +514,9 @@ NullURL())); DCHECK(script_loader->IsParserInserted()); + // <spec>... If the active speculative HTML parser is null and the + // JavaScript execution context stack is empty, then perform a microtask + // checkpoint. ...</spec> if (!IsExecutingScript()) Microtask::PerformCheckpoint(V8PerIsolateData::MainThreadIsolate()); @@ -583,50 +530,66 @@ nesting_level_incrementer = reentry_permit_->IncrementScriptNestingLevel(); - // <spec>... Prepare the script. This might cause some script to execute, - // which might cause new characters to be inserted into the tokenizer, and - // might cause the tokenizer to output more tokens, resulting in a reentrant - // invocation of the parser. ...</spec> - script_loader->PrepareScript(script_start_position); + // <spec>... prepare the script element script. This might cause some script + // to execute, which might cause new characters to be inserted into the + // tokenizer, and might cause the tokenizer to output more tokens, resulting + // in a reentrant invocation of the parser. ...</spec> + PendingScript* pending_script = script_loader->PrepareScript( + reentry_permit_->ScriptNestingLevel() == 1u + ? ScriptLoader::ParserBlockingInlineOption::kAllow + : ScriptLoader::ParserBlockingInlineOption::kDeny, + script_start_position); - if (!script_loader->WillBeParserExecuted()) + if (!pending_script) return; - if (script_loader->WillExecuteWhenDocumentFinishedParsing()) { - // Developer deferred. - RequestDeferredScript(script_loader); - } else if (script_loader->IsForceDeferred()) { - // Force defer this otherwise parser-blocking script. - RequestForceDeferredScript(script_loader); - } else if (script_loader->ReadyToBeParserExecuted()) { - // <spec label="prepare-a-script" step="26.E">... it's an HTML parser - // whose script nesting level is not greater than one, ...</spec> - if (reentry_permit_->ScriptNestingLevel() == 1u) { - // <spec label="prepare-a-script" step="26.E">... The element is the - // pending parsing-blocking script of the Document of the parser that - // created the element. (There can only be one such script per Document - // at a time.) ...</spec> + switch (pending_script->GetSchedulingType()) { + case ScriptSchedulingType::kDefer: + // Developer deferred. + DCHECK(pending_script->IsExternalOrModule()); + // <spec + // href="https://html.spec.whatwg.org/C/#prepare-the-script-element" + // step="31.4.1">Append el to its parser document's list of scripts that + // will execute when the document has finished parsing.</spec> + scripts_to_execute_after_parsing_.push_back(pending_script); + break; + + case ScriptSchedulingType::kForceDefer: + // Force defer this otherwise parser-blocking script. + DCHECK(base::FeatureList::IsEnabled( + features::kForceDeferScriptIntervention)); + // Add the element to the end of the list of forced deferred scripts + // that will execute when the document has finished parsing associated + // with the Document of the parser that created the element. + force_deferred_scripts_.push_back(pending_script); + delayer_for_force_defer_->Activate(); + break; + + case ScriptSchedulingType::kParserBlocking: + // <spec label="prepare-the-script-element" step="31.5.1">Set el's + // parser document's pending parsing-blocking script to el.</spec> + case ScriptSchedulingType::kParserBlockingInline: + // <spec label="prepare-the-script-element" step="32.2.1">Set el's + // parser document's pending parsing-blocking script to el.</spec> + CHECK(!parser_blocking_script_); - parser_blocking_script_ = script_loader->TakePendingScript( - ScriptSchedulingType::kParserBlockingInline); - } else { - // <spec label="prepare-a-script" step="26.F">Otherwise - // - // Immediately execute the script block, even if other scripts are - // already executing.</spec> - // - // TODO(hiroshige): Merge the block into ScriptLoader::prepareScript(). - DCHECK_GT(reentry_permit_->ScriptNestingLevel(), 1u); - if (parser_blocking_script_) - parser_blocking_script_->Dispose(); - parser_blocking_script_ = nullptr; - DoExecuteScript( - script_loader->TakePendingScript(ScriptSchedulingType::kImmediate), - DocumentURLForScriptExecution(document_)); - } - } else { - // [PS] Step 25.B. - RequestParsingBlockingScript(script_loader); + parser_blocking_script_ = pending_script; + + // We only care about a load callback if resource is not yet ready. + // The caller of `ProcessScriptElementInternal()` will attempt to run + // `parser_blocking_script_` if ready before returning control to the + // parser. + if (!parser_blocking_script_->IsReady()) + parser_blocking_script_->WatchForLoad(this); + break; + + case ScriptSchedulingType::kAsync: + case ScriptSchedulingType::kInOrder: + case ScriptSchedulingType::kForceInOrder: + case ScriptSchedulingType::kImmediate: + case ScriptSchedulingType::kNotSet: + NOTREACHED(); + break; } // <spec>... Decrement the parser's script nesting level by one. If the
diff --git a/third_party/blink/renderer/core/script/html_parser_script_runner.h b/third_party/blink/renderer/core/script/html_parser_script_runner.h index 2266ba5..e39b57d 100644 --- a/third_party/blink/renderer/core/script/html_parser_script_runner.h +++ b/third_party/blink/renderer/core/script/html_parser_script_runner.h
@@ -41,7 +41,6 @@ class Document; class Element; class HTMLParserScriptRunnerHost; -class ScriptLoader; class ScriptRunnerDelayer; // HTMLParserScriptRunner is responsible for for arranging the execution of @@ -120,10 +119,6 @@ void ExecutePendingDeferredScriptAndDispatchEvent(PendingScript*); void ExecuteParsingBlockingScripts(); - void RequestParsingBlockingScript(ScriptLoader*); - void RequestDeferredScript(ScriptLoader*); - void RequestForceDeferredScript(ScriptLoader*); - // Processes the provided script element, but does not execute any // parsing-blocking scripts that may remain after execution. void ProcessScriptElementInternal(Element*,
diff --git a/third_party/blink/renderer/core/script/script_loader.cc b/third_party/blink/renderer/core/script/script_loader.cc index cf1acb9..539f0d00 100644 --- a/third_party/blink/renderer/core/script/script_loader.cc +++ b/third_party/blink/renderer/core/script/script_loader.cc
@@ -88,9 +88,9 @@ ScriptLoader::ScriptLoader(ScriptElementBase* element, const CreateElementFlags flags) : element_(element) { - // <spec href="https://html.spec.whatwg.org/C/#already-started">... The - // cloning steps for script elements must set the "already started" flag on - // the copy if it is set on the element being cloned.</spec> + // <spec href="https://html.spec.whatwg.org/C/#script-processing-model"> + // The cloning steps for a script element el being cloned to a copy copy are + // to set copy's already started to el's already started.</spec> // // TODO(hiroshige): Cloning is implemented together with // {HTML,SVG}ScriptElement::cloneElementWithoutAttributesAndChildren(). @@ -99,22 +99,23 @@ already_started_ = true; if (flags.IsCreatedByParser()) { - // <spec href="https://html.spec.whatwg.org/C/#parser-inserted">script + // <spec href="https://html.spec.whatwg.org/C/#parser-inserted">... script // elements with non-null parser documents are known as - // "parser-inserted".</spec> + // parser-inserted.</spec> + // // For more information on why this is not implemented in terms of a // non-null parser document, see the documentation in the header file. parser_inserted_ = true; // <spec href="https://html.spec.whatwg.org/C/#parser-document">... It is - // set by the HTML parser and the XML parser on script elements they insert + // set by the HTML parser and the XML parser on script elements they insert, // ...</spec> parser_document_ = flags.ParserDocument(); - // <spec href="https://html.spec.whatwg.org/C/#non-blocking">... It is unset - // by the HTML parser and the XML parser on script elements they insert. - // ...</spec> - non_blocking_ = false; + // <spec href="https://html.spec.whatwg.org/C/#script-force-async">... It is + // set to false by the HTML parser and the XML parser on script elements + // they insert, ...</spec> + force_async_ = false; } } @@ -130,29 +131,57 @@ ResourceFinishObserver::Trace(visitor); } +// <specdef +// href="https://html.spec.whatwg.org/C/#script-processing-model"> +// +// <spec>When a script element el that is not parser-inserted experiences one of +// the events listed in the following list, the user agent must immediately +// prepare the script element el:</spec> +// +// The following three `PrepareScript()` are for non-parser-inserted scripts and +// thus +// - Should deny ParserBlockingInline scripts. +// - Should return nullptr, i.e. there should no PendingScript to be controlled +// by parsers. +// - TextPosition is not given. + +// <spec step="A">The script element becomes connected.</spec> void ScriptLoader::DidNotifySubtreeInsertionsToDocument() { - if (!parser_inserted_) - PrepareScript(); // FIXME: Provide a real starting line number here. + if (!parser_inserted_) { + PendingScript* pending_script = PrepareScript( + ParserBlockingInlineOption::kDeny, TextPosition::MinimumPosition()); + DCHECK(!pending_script); + } } +// <spec step="B">The script element is connected and a node or document +// fragment is inserted into the script element, after any script elements +// inserted at that time.</spec> void ScriptLoader::ChildrenChanged() { - if (!parser_inserted_ && element_->IsConnected()) - PrepareScript(); // FIXME: Provide a real starting line number here. + if (!parser_inserted_ && element_->IsConnected()) { + PendingScript* pending_script = PrepareScript( + ParserBlockingInlineOption::kDeny, TextPosition::MinimumPosition()); + DCHECK(!pending_script); + } } +// <spec step="C">The script element is connected and has a src attribute set +// where previously the element had no such attribute.</spec> void ScriptLoader::HandleSourceAttribute(const String& source_url) { - if (IgnoresLoadRequest() || source_url.IsEmpty()) - return; - - PrepareScript(); // FIXME: Provide a real starting line number here. + if (!parser_inserted_ && element_->IsConnected() && !source_url.IsEmpty()) { + PendingScript* pending_script = PrepareScript( + ParserBlockingInlineOption::kDeny, TextPosition::MinimumPosition()); + DCHECK(!pending_script); + } } -// <specdef href="https://html.spec.whatwg.org/C/#non-blocking"> void ScriptLoader::HandleAsyncAttribute() { - // <spec>... In addition, whenever a script element whose "non-blocking" flag - // is set has an async content attribute added, the element's "non-blocking" - // flag must be unset.</spec> - non_blocking_ = false; + // <spec>When an async attribute is added to a script element el, the user + // agent must set el's force async to false.</spec> + // + // <spec href="https://html.spec.whatwg.org/C/#the-script-element" + // step="1">Set this's force async to false.</spec> + force_async_ = false; dynamic_async_ = true; } @@ -174,34 +203,34 @@ namespace { -// <specdef href="https://html.spec.whatwg.org/C/#prepare-a-script"> +// <specdef href="https://html.spec.whatwg.org/C/#prepare-the-script-element"> bool IsValidClassicScriptTypeAndLanguage(const String& type, const String& language) { if (type.IsNull()) { - // <spec step="8">the script element has no type attribute but it has a - // language attribute and that attribute's value is the empty string, - // or</spec> + // <spec step="8.B">el has no type attribute but it has a language attribute + // and that attribute's value is the empty string; or</spec> // - // <spec step="8">the script element has neither a type attribute - // nor a language attribute, then</spec> + // <spec step="8.C">el has neither a type attribute nor a language + // attribute</spec> if (language.IsEmpty()) return true; - // <spec step="8">Otherwise, the element has a non-empty language attribute; - // let the script block's type string for this script element be the - // concatenation of the string "text/" followed by the value of the language - // attribute.</spec> + // <spec step="8">... Otherwise, el has a non-empty language attribute; let + // the script block's type string be the concatenation of "text/" and the + // value of el's language attribute.</spec> if (MIMETypeRegistry::IsSupportedJavaScriptMIMEType("text/" + language)) return true; } else if (type.IsEmpty()) { - // <spec step="8">the script element has a type attribute and its value is - // the empty string, or</spec> + // <spec step="8.A">el has a type attribute whose value is the empty + // string;</spec> return true; } else { - // <spec step="8">Otherwise, if the script element has a type attribute, let - // the script block's type string for this script element be the value of - // that attribute with leading and trailing ASCII whitespace - // stripped.</spec> + // <spec step="8">... Otherwise, if el has a type attribute, then let the + // script block's type string be the value of that attribute with leading + // and trailing ASCII whitespace stripped. ...</spec> + // + // <spec step="9">If the script block's type string is a JavaScript MIME + // type essence match, then set el's type to "classic".</spec> if (MIMETypeRegistry::IsSupportedJavaScriptMIMEType( type.StripWhiteSpace())) { return true; @@ -232,15 +261,15 @@ const String& type, const String& language) { if (IsValidClassicScriptTypeAndLanguage(type, language)) { - // <spec step="8">... If the script block's type string is a JavaScript MIME - // type essence match, the script's type is "classic". ...</spec> + // <spec step="9">If the script block's type string is a JavaScript MIME + // type essence match, then set el's type to "classic".</spec> return ScriptTypeAtPrepare::kClassic; } if (EqualIgnoringASCIICase(type, script_type_names::kModule)) { - // <spec step="8">... If the script block's type string is an ASCII - // case-insensitive match for the string "module", the script's type is - // "module". ...</spec> + // <spec step="10">Otherwise, if the script block's type string is an ASCII + // case-insensitive match for the string "module", then set el's type to + // "module".</spec> return ScriptTypeAtPrepare::kModule; } @@ -255,8 +284,8 @@ return ScriptTypeAtPrepare::kWebBundle; } - // <spec step="8">... If neither of the above conditions are true, then - // return. No script is executed.</spec> + // <spec step="11">Otherwise, return. (No script is executed, and el's type is + // left as null.)</spec> return ScriptTypeAtPrepare::kInvalid; } @@ -270,7 +299,7 @@ // which is a translation of the CORS settings attribute in the context of // module scripts. This is used in: // - Step 17 of -// https://html.spec.whatwg.org/C/#prepare-a-script +// https://html.spec.whatwg.org/C/#prepare-the-script-element // - Step 6 of obtaining a preloaded module script // https://html.spec.whatwg.org/C/#link-type-modulepreload. network::mojom::CredentialsMode ScriptLoader::ModuleScriptCredentialsMode( @@ -309,31 +338,29 @@ return !element->DeferAttributeValue() && !element->AsyncAttributeValue(); } -// <specdef href="https://html.spec.whatwg.org/C/#prepare-a-script"> -bool ScriptLoader::PrepareScript(const TextPosition& script_start_position) { - // <spec step="1">If the script element is marked as having "already started", - // then return. The script is not executed.</spec> +// <specdef href="https://html.spec.whatwg.org/C/#prepare-the-script-element"> +PendingScript* ScriptLoader::PrepareScript( + ParserBlockingInlineOption parser_blocking_inline_option, + const TextPosition& script_start_position) { + // <spec step="1">If el's already started is true, then return.</spec> if (already_started_) - return false; + return nullptr; - // <spec step="2">If the element has its "parser-inserted" flag set, then set - // was-parser-inserted to true and unset the element's "parser-inserted" flag. - // Otherwise, set was-parser-inserted to false.</spec> - bool was_parser_inserted; - if (parser_inserted_) { - was_parser_inserted = true; - parser_inserted_ = false; - } else { - was_parser_inserted = false; - } + // <spec step="2">Let parser document be el's parser document.</spec> + // + // Here and below we manipulate `parser_inserted_` flag instead of + // `parser_document_`. See the comment at the `parser_document_` declaration. + bool was_parser_inserted = parser_inserted_; - // <spec step="3">If was-parser-inserted is true and the element does not have - // an async attribute, then set the element's "non-blocking" flag to - // true.</spec> + // <spec step="3">Set el's parser document to null.</spec> + parser_inserted_ = false; + + // <spec step="4">If parser document is non-null and el does not have an async + // attribute, then set el's force async to true.</spec> if (was_parser_inserted && !element_->AsyncAttributeValue()) - non_blocking_ = true; + force_async_ = true; - // <spec step="4">Let source text be the element's child text content.</spec> + // <spec step="5">Let source text be el's child text content.</spec> // // Trusted Types additionally requires: // https://w3c.github.io/webappsec-trusted-types/dist/spec/#slot-value-verification @@ -344,37 +371,36 @@ // value. const String source_text = GetScriptText(); - // <spec step="5">If the element has no src attribute, and source text is the - // empty string, then return. The script is not executed.</spec> + // <spec step="6">If el has no src attribute, and source text is the empty + // string, then return.</spec> if (!element_->HasSourceAttribute() && source_text.IsEmpty()) - return false; + return nullptr; - // <spec step="6">If the element is not connected, then return. The script is - // not executed.</spec> + // <spec step="7">If el is not connected, then return.</spec> if (!element_->IsConnected()) - return false; + return nullptr; Document& element_document = element_->GetDocument(); LocalDOMWindow* context_window = element_document.domWindow(); - // <spec step="7">... Determine the script's type as follows: ...</spec> + // Steps 8-11. script_type_ = GetScriptTypeAtPrepare(element_->TypeAttributeValue(), element_->LanguageAttributeValue()); switch (GetScriptType()) { case ScriptTypeAtPrepare::kInvalid: - return false; + return nullptr; case ScriptTypeAtPrepare::kSpeculationRules: if (!RuntimeEnabledFeatures::SpeculationRulesEnabled(context_window)) - return false; + return nullptr; break; case ScriptTypeAtPrepare::kWebBundle: if (!RuntimeEnabledFeatures::SubresourceWebBundlesEnabled( element_document.GetExecutionContext())) { script_type_ = ScriptTypeAtPrepare::kInvalid; - return false; + return nullptr; } break; @@ -384,40 +410,37 @@ break; } - // <spec step="8">If was-parser-inserted is true, then flag the element as - // "parser-inserted" again, and set the element's "non-blocking" flag to - // false.</spec> + // <spec step="12">If parser document is non-null, then set el's parser + // document back to parser document and set el's force async to false.</spec> if (was_parser_inserted) { parser_inserted_ = true; - non_blocking_ = false; + force_async_ = false; } - // <spec step="9">Set the element's "already started" flag.</spec> + // <spec step="13">Set el's already started to true.</spec> already_started_ = true; - // <spec step="10">If the element is flagged as "parser-inserted", but the - // element's node document is not the Document of the parser that created the - // element, then return.</spec> + // <spec step="15">If parser document is non-null, and parser document is not + // equal to el's preparation-time document, then return.</spec> if (parser_inserted_ && parser_document_ != &element_->GetDocument()) { - return false; + return nullptr; } - // <spec step="11">If scripting is disabled for the script element, then - // return. The script is not executed.</spec> + // <spec step="16">If scripting is disabled for el, then return.</spec> // // <spec href="https://html.spec.whatwg.org/C/#concept-n-noscript">Scripting - // is disabled for a node if there is no such browsing context, or if - // scripting is disabled in that browsing context.</spec> + // is disabled for a node when scripting is not enabled, i.e., when its node + // document's browsing context is null or when scripting is disabled for its + // relevant settings object.</spec> if (!context_window) - return false; + return nullptr; if (!context_window->CanExecuteScripts(kAboutToExecuteScript)) - return false; + return nullptr; - // <spec step="12">If the script element has a nomodule content attribute and - // the script's type is "classic", then return. The script is not - // executed.</spec> + // <spec step="17">If el has a nomodule content attribute and its type is + // "classic", then return.</spec> if (BlockForNoModule(GetScriptType(), element_->NomoduleAttributeValue())) - return false; + return nullptr; // TODO(csharrison): This logic only works if the tokenizer/parser was not // blocked waiting for scripts when the element was inserted. This usually @@ -432,20 +455,19 @@ TextPosition position = is_in_document_write ? TextPosition::MinimumPosition() : script_start_position; - // <spec step="13">If the script element does not have a src content - // attribute, and the Should element's inline behavior be blocked by Content - // Security Policy? algorithm returns "Blocked" when executed upon the script - // element, "script", and source text, then return. The script is not - // executed. [CSP]</spec> + // <spec step="18">If el does not have a src content attribute, and the Should + // element's inline behavior be blocked by Content Security Policy? algorithm + // returns "Blocked" when given el, "script", and source text, then return. + // [CSP]</spec> if (!element_->HasSourceAttribute() && !element_->AllowInlineScriptForCSP(element_->GetNonceForElement(), position.line_, source_text)) { - return false; + return nullptr; } - // 14. + // Step 19. if (!IsScriptForEventSupported()) - return false; + return nullptr; if (ShouldBlockSyncScriptForDocumentPolicy(element_.Get(), GetScriptType(), parser_inserted_)) { @@ -453,28 +475,28 @@ mojom::blink::DocumentPolicyFeature::kSyncScript, mojom::blink::PolicyDisposition::kEnforce, "Synchronous script execution is disabled by Document Policy"); - return false; + return nullptr; } // 14. is handled below. - // <spec step="16">Let classic script CORS setting be the current state of the - // element's crossorigin content attribute.</spec> + // <spec step="21">Let classic script CORS setting be the current state of + // el's crossorigin content attribute.</spec> CrossOriginAttributeValue cross_origin = GetCrossOriginAttributeValue(element_->CrossOriginAttributeValue()); - // <spec step="17">Let module script credentials mode be the module script - // credentials mode for the element's crossorigin content attribute.</spec> + // <spec step="22">Let module script credentials mode be the CORS settings + // attribute credentials mode for el's crossorigin content attribute.</spec> network::mojom::CredentialsMode credentials_mode = ModuleScriptCredentialsMode(cross_origin); - // <spec step="18">Let cryptographic nonce be the element's - // [[CryptographicNonce]] internal slot's value.</spec> + // <spec step="23">Let cryptographic nonce be el's [[CryptographicNonce]] + // internal slot's value.</spec> String nonce = element_->GetNonceForElement(); - // <spec step="19">If the script element has an integrity attribute, then let - // integrity metadata be that attribute's value. Otherwise, let integrity - // metadata be the empty string.</spec> + // <spec step="24">If el has an integrity attribute, then let integrity + // metadata be that attribute's value. Otherwise, let integrity metadata be + // the empty string.</spec> String integrity_attr = element_->IntegrityAttributeValue(); IntegrityMetadataSet integrity_metadata; if (!integrity_attr.IsEmpty()) { @@ -488,7 +510,7 @@ report_info); } - // <spec step="20">Let referrer policy be the current state of the element's + // <spec step="25">Let referrer policy be the current state of el's // referrerpolicy content attribute.</spec> String referrerpolicy_attr = element_->ReferrerPolicyAttributeValue(); network::mojom::ReferrerPolicy referrer_policy = @@ -499,16 +521,15 @@ &referrer_policy); } - // <spec href="https://wicg.github.io/priority-hints/#script" step="8"> - // Let fetchpriority be the current state of the element’s fetchpriority + // <spec href="https://wicg.github.io/priority-hints/#script" step="8">... Let + // fetchpriority be the current state of the element’s fetchpriority // attribute.</spec> String fetch_priority_attr = element_->FetchPriorityAttributeValue(); mojom::blink::FetchPriorityHint fetch_priority_hint = GetFetchPriorityAttributeValue(fetch_priority_attr); - // <spec step="21">Let parser metadata be "parser-inserted" if the script - // element has been flagged as "parser-inserted", and "not-parser-inserted" - // otherwise.</spec> + // <spec step="26">Let parser metadata be "parser-inserted" if el is + // ...</spec> ParserDisposition parser_state = IsParserInserted() ? kParserInserted : kNotParserInserted; @@ -533,7 +554,7 @@ ? ScriptFetchOptions::AttributionReportingEligibility::kEligible : ScriptFetchOptions::AttributionReportingEligibility::kIneligible; - // <spec step="22">Let options be a script fetch options whose cryptographic + // <spec step="27">Let options be a script fetch options whose cryptographic // nonce is cryptographic nonce, integrity metadata is integrity metadata, // parser metadata is parser metadata, credentials mode is module script // credentials mode, and referrer policy is referrer policy.</spec> @@ -542,8 +563,8 @@ referrer_policy, fetch_priority_hint, render_blocking_behavior, RejectCoepUnsafeNone(false), attribution_reporting_eligibility); - // <spec step="23">Let settings object be the element's node document's - // relevant settings object.</spec> + // <spec step="28">Let settings object be el's node document's relevant + // settings object.</spec> // // In some cases (mainly for classic scripts) |element_document| is used as // the "settings object", while in other cases (mainly for module scripts) @@ -576,7 +597,7 @@ ->PostTask(FROM_HERE, WTF::Bind(&ScriptElementBase::DispatchErrorEvent, WrapPersistent(element_.Get()))); - return false; + return nullptr; case Modulator::AcquiringImportMapsState::kAcquiring: // 2. Set the element’s node document's acquiring import maps to false. @@ -593,54 +614,62 @@ } } - // <spec step="24">If the element has a src content attribute, then:</spec> + // <spec step="29">If el has a src content attribute, then:</spec> if (element_->HasSourceAttribute()) { - // <spec step="24.1">Let src be the value of the element's src - // attribute.</spec> + // <spec step="29.1">Let src be the value of el's src attribute.</spec> String src = StripLeadingAndTrailingHTMLSpaces(element_->SourceAttributeValue()); - // <spec step="24.2">If src is the empty string, queue a task to fire an - // event named error at the element, and return.</spec> + // <spec step="29.2">If src is the empty string, then queue a task to fire + // an event named error at el, and return.</spec> if (src.IsEmpty()) { element_document.GetTaskRunner(TaskType::kDOMManipulation) ->PostTask(FROM_HERE, WTF::Bind(&ScriptElementBase::DispatchErrorEvent, WrapPersistent(element_.Get()))); - return false; + return nullptr; } - // <spec step="24.3">Set the element's from an external file flag.</spec> + // <spec step="29.3">Set el's from an external file to true.</spec> is_external_script_ = true; - // <spec step="24.4">Parse src relative to the element's node - // document.</spec> + // <spec step="29.4">Parse src relative to el's node document.</spec> KURL url = element_document.CompleteURL(src); - // <spec step="24.5">If the previous step failed, queue a task to fire an - // event named error at the element, and return. Otherwise, let url be the - // resulting URL record.</spec> + // <spec step="29.5">If the previous step failed, queue a task to fire an + // event named error at el, and return. Otherwise, let url be the resulting + // URL record.</spec> if (!url.IsValid()) { element_document.GetTaskRunner(TaskType::kDOMManipulation) ->PostTask(FROM_HERE, WTF::Bind(&ScriptElementBase::DispatchErrorEvent, WrapPersistent(element_.Get()))); - return false; + return nullptr; } - // If the element is potentially render-blocking, block rendering on the - // element. + // <spec step="29.6">If el is potentially render-blocking, then block + // rendering on el.</spec> if (potentially_render_blocking && element_document.GetRenderBlockingResourceManager()) { element_document.GetRenderBlockingResourceManager()->AddPendingScript( *element_); } - // <spec step="24.6">Switch on the script's type:</spec> + // <spec step="29.7">Set el's delaying the load event to true.</spec> + // + // <spec step="30.2.B.1">Set el's delaying the load event to true.</spec> + // + // When controlled by ScriptRunner, implemented by + // ScriptRunner::QueueScriptForExecution(). Otherwise (controlled by a + // parser), then the parser evaluates the script (e.g. parser-blocking, + // defer, etc.) before DOMContentLoaded, and thus explicit logic for this is + // not needed. + + // <spec step="29.9">Switch on el's type:</spec> switch (GetScriptType()) { case ScriptTypeAtPrepare::kInvalid: NOTREACHED(); - return false; + return nullptr; case ScriptTypeAtPrepare::kImportMap: // TODO(crbug.com/922212): Implement external import maps. @@ -652,7 +681,7 @@ ->PostTask(FROM_HERE, WTF::Bind(&ScriptElementBase::DispatchErrorEvent, WrapPersistent(element_.Get()))); - return false; + return nullptr; case ScriptTypeAtPrepare::kSpeculationRules: // TODO(crbug.com/1182803): Implement external speculation rules. @@ -660,7 +689,7 @@ mojom::blink::ConsoleMessageSource::kJavaScript, mojom::blink::ConsoleMessageLevel::kError, "External speculation rules are not yet supported.")); - return false; + return nullptr; case ScriptTypeAtPrepare::kWebBundle: element_document.AddConsoleMessage(MakeGarbageCollected<ConsoleMessage>( @@ -671,16 +700,16 @@ ->PostTask(FROM_HERE, WTF::Bind(&ScriptElementBase::DispatchErrorEvent, WrapPersistent(element_.Get()))); - return false; + return nullptr; case ScriptTypeAtPrepare::kClassic: { // - "classic": - // <spec step="15">If the script element has a charset attribute, then - // let encoding be the result of getting an encoding from the value of - // the charset attribute. If the script element does not have a charset - // attribute, or if getting an encoding failed, let encoding be the same - // as the encoding of the script element's node document.</spec> + // <spec step="20">If el has a charset attribute, then let encoding be + // the result of getting an encoding from the value of the charset + // attribute. If el does not have a charset attribute, or if getting an + // encoding failed, then let encoding be el's node document's the + // encoding.</spec> // // TODO(hiroshige): Should we handle failure in getting an encoding? WTF::TextEncoding encoding; @@ -689,7 +718,7 @@ else encoding = element_document.Encoding(); - // <spec step="24.6.A">"classic" + // <spec step="29.9.A">"classic" // // Fetch a classic script given url, settings object, options, classic // script CORS setting, and encoding.</spec> @@ -703,7 +732,7 @@ // Step 15 is skipped because they are not used in module // scripts. - // <spec step="24.6.B">"module" + // <spec step="29.9.B">"module" // // Fetch an external module script graph given url, settings object, and // options.</spec> @@ -711,48 +740,22 @@ ToScriptStateForMainWorld(context_window->GetFrame())); FetchModuleScriptTree(url, fetch_client_settings_object_fetcher, modulator, options); - } - // <spec step="24.6">When the chosen algorithm asynchronously completes, - // set the script's script to the result. At that time, the script is - // ready. - // ...</spec> - // - // When the script is ready, - // PendingScriptClient::pendingScriptFinished() is used as the - // notification, and the action to take when the script is ready is - // specified later, in - // - ScriptLoader::PrepareScript(), or - // - HTMLParserScriptRunner, - // depending on the conditions in Step 25 of "prepare a script". - break; + } break; } } - // <spec step="25">If the element does not have a src content attribute, run - // these substeps:</spec> + // <spec step="30">If el does not have a src content attribute:</spec> if (!element_->HasSourceAttribute()) { - // <spec step="24.1">Let src be the value of the element's src - // attribute.</spec> - // - // This step is done later as ScriptElementBase::ChildTextContent(): - // - in ScriptLoader::PrepareScript() (Step 26, 6th Clause), - // - in HTMLParserScriptRunner::ProcessScriptElementInternal() - // (Duplicated code of Step 26, 6th Clause), - // - in XMLDocumentParser::EndElementNs() (Step 26, 5th Clause), or - // - in PendingScript::GetSource() (Indirectly used via - // HTMLParserScriptRunner::ProcessScriptElementInternal(), - // Step 26, 5th Clause). - - // <spec step="25.1">Let base URL be the script element's node document's - // document base URL.</spec> + // <spec step="30.1">Let base URL be el's node document's document base + // URL.</spec> KURL base_url = element_document.BaseURL(); - // <spec step="25.2">Switch on the script's type:</spec> + // <spec step="30.2">Switch on el's type:</spec> switch (GetScriptType()) { case ScriptTypeAtPrepare::kInvalid: NOTREACHED(); - return false; + return nullptr; case ScriptTypeAtPrepare::kImportMap: { UseCounter::Count(*context_window, WebFeature::kImportMap); @@ -769,7 +772,7 @@ // map` synchronously here. pending_import_map->RegisterImportMap(); - return false; + return nullptr; } case ScriptTypeAtPrepare::kWebBundle: { DCHECK(RuntimeEnabledFeatures::SubresourceWebBundlesEnabled( @@ -805,7 +808,7 @@ } } } - return false; + return nullptr; } case ScriptTypeAtPrepare::kSpeculationRules: { @@ -831,12 +834,12 @@ {element_->GetDOMNodeId()}); element_document.AddConsoleMessage(console_message); } - return false; + return nullptr; } - // <spec step="25.2.A">"classic"</spec> + // <spec step="30.2.A">"classic"</spec> case ScriptTypeAtPrepare::kClassic: { - // <spec step="25.2.A.1">Let script be the result of creating a classic + // <spec step="30.2.A.1">Let script be the result of creating a classic // script using source text, settings object, base URL, and // options.</spec> @@ -854,20 +857,18 @@ element_, position, base_url, source_text, script_location_type, options); - // <spec step="25.2.A.2">Set the script's script to script.</spec> - // - // <spec step="25.2.A.3">The script is ready.</spec> + // <spec step="30.2.A.2">Mark as ready el given script.</spec> // // Implemented by ClassicPendingScript. break; } - // <spec step="25.2.B">"module"</spec> + // <spec step="30.2.B">"module"</spec> case ScriptTypeAtPrepare::kModule: { - // <spec step="25.2.B.1">Fetch an inline module script graph, given + // <spec step="30.2.B.2">Fetch an inline module script graph, given // source text, base URL, settings object, and options. When this - // asynchronously completes, set the script's script to the result. At - // that time, the script is ready.</spec> + // asynchronously completes with result, mark as ready el given + // result.</spec> // // <specdef label="fetch-an-inline-module-script-graph" // href="https://html.spec.whatwg.org/C/#fetch-an-inline-module-script-graph"> @@ -892,13 +893,13 @@ JSModuleScript::Create(params, modulator, options, position); // <spec label="fetch-an-inline-module-script-graph" step="2">If script - // is null, asynchronously complete this algorithm with null, and abort - // these steps.</spec> + // is null, asynchronously complete this algorithm with null, and + // return.</spec> if (!module_script) - return false; + return nullptr; // <spec label="fetch-an-inline-module-script-graph" step="4">Fetch the - // descendants of and instantiate script, given settings object, the + // descendants of and link script, given settings object, the // destination "script", and visited set. When this asynchronously // completes with final result, asynchronously complete this algorithm // with final result.</spec> @@ -915,218 +916,168 @@ } } - DCHECK_NE(GetScriptType(), ScriptLoader::ScriptTypeAtPrepare::kImportMap); + ScriptSchedulingType script_scheduling_type = GetScriptSchedulingTypePerSpec( + element_document, parser_blocking_inline_option); - DCHECK(prepared_pending_script_); - - // <spec step="26">Then, follow the first of the following options that - // describes the situation:</spec> - - // Three flags are used to instruct the caller of prepareScript() to execute - // a part of Step 25, when |m_willBeParserExecuted| is true: - // - |m_willBeParserExecuted| - // - |m_willExecuteWhenDocumentFinishedParsing| - // - |m_readyToBeParserExecuted| - // TODO(hiroshige): Clean up the dependency. - - // <spec step="26.A">If the script's type is "classic", and the element has a - // src attribute, and the element has a defer attribute, and the element has - // been flagged as "parser-inserted", and the element does not have an async - // attribute - // - // If the script's type is "module", and the element has been flagged as - // "parser-inserted", and the element does not have an async attribute - // ...</spec> - if ((GetScriptType() == ScriptTypeAtPrepare::kClassic && - element_->HasSourceAttribute() && element_->DeferAttributeValue() && - parser_inserted_ && !element_->AsyncAttributeValue()) || - (GetScriptType() == ScriptTypeAtPrepare::kModule && parser_inserted_ && - !element_->AsyncAttributeValue())) { - // This clause is implemented by the caller-side of prepareScript(): - // - HTMLParserScriptRunner::requestDeferredScript(), and - // - TODO(hiroshige): Investigate XMLDocumentParser::endElementNs() - will_execute_when_document_finished_parsing_ = true; - will_be_parser_executed_ = true; - - return true; - } - - // Check for external script that should be force deferred. - if (GetScriptType() == ScriptTypeAtPrepare::kClassic && - element_->HasSourceAttribute() && ShouldForceDeferScript() && - IsA<HTMLDocument>(context_window->document()) && parser_inserted_ && - !element_->AsyncAttributeValue()) { - // In terms of ScriptLoader flags, force deferred scripts behave like - // parser-blocking scripts, except that |force_deferred_| is set. - // The caller of PrepareScript() - // - Force-defers such scripts if the caller supports force-defer - // (i.e., HTMLParserScriptRunner); or - // - Ignores the |force_deferred_| flag and handles such scripts as - // parser-blocking scripts (e.g., XMLParserScriptRunner). - force_deferred_ = true; - will_be_parser_executed_ = true; - - return true; - } - - // Check for external script that should be force in-order. - // Not only the pending scripts that would be marked (without the - // intervention) as ScriptSchedulingType::kParserBlocking or kInOrder, but - // also the scripts that would be marked as kAsync are put into the force - // in-order queue in ScriptRunner because we have to guarantee the execution - // order of the scripts. - if (GetScriptType() == ScriptTypeAtPrepare::kClassic && - element_->HasSourceAttribute() && ShouldForceInOrderScript() && + // [intervention, https://crbug.com/1339112] Force-defer parser-blocking and + // inline scripts. + if (ShouldForceDeferScript() && parser_inserted_ && IsA<HTMLDocument>(context_window->document())) { - context_window->document()->GetScriptRunner()->QueueScriptForExecution( - TakePendingScript(ScriptSchedulingType::kForceInOrder)); - - return true; + switch (script_scheduling_type) { + case ScriptSchedulingType::kParserBlocking: + case ScriptSchedulingType::kImmediate: + case ScriptSchedulingType::kParserBlockingInline: + script_scheduling_type = ScriptSchedulingType::kForceDefer; + break; + default: + break; + } } - // <spec step="26.B">If the script's type is "classic", and the element has a - // src attribute, and the element has been flagged as "parser-inserted", and - // the element does not have an async attribute ...</spec> - if (GetScriptType() == ScriptTypeAtPrepare::kClassic && - element_->HasSourceAttribute() && parser_inserted_ && - !element_->AsyncAttributeValue()) { - // This clause is implemented by the caller-side of prepareScript(): - // - HTMLParserScriptRunner::requestParsingBlockingScript() - // - TODO(hiroshige): Investigate XMLDocumentParser::endElementNs() - will_be_parser_executed_ = true; - - return true; + // [intervention, https://crbug.com/1344772] Check for external script that + // should be force in-order. Not only the pending scripts that would be marked + // (without the intervention) as ScriptSchedulingType::kParserBlocking or + // kInOrder, but also the scripts that would be marked as kAsync are put into + // the force in-order queue in ScriptRunner because we have to guarantee the + // execution order of the scripts. + if (ShouldForceInOrderScript() && + IsA<HTMLDocument>(context_window->document())) { + switch (script_scheduling_type) { + case ScriptSchedulingType::kAsync: + case ScriptSchedulingType::kInOrder: + case ScriptSchedulingType::kParserBlocking: + script_scheduling_type = ScriptSchedulingType::kForceInOrder; + break; + default: + break; + } } - // <spec step="26.C">If the script's type is "classic", and the element has a - // src attribute, and the element does not have an async attribute, and the - // element does not have the "non-blocking" flag set - // - // If the script's type is "module", and the element does not have an async - // attribute, and the element does not have the "non-blocking" flag set - // ...</spec> - if ((GetScriptType() == ScriptTypeAtPrepare::kClassic && - element_->HasSourceAttribute() && !element_->AsyncAttributeValue() && - !non_blocking_) || - (GetScriptType() == ScriptTypeAtPrepare::kModule && - !element_->AsyncAttributeValue() && !non_blocking_)) { - // <spec step="26.C">... Add the element to the end of the list of scripts - // that will execute in order as soon as possible associated with the node - // document of the script element at the time the prepare a script algorithm - // started. ...</spec> - // - // TODO(hiroshige): Here the context document is used as "node document" - // while Step 14 uses |elementDocument| as "node document". Fix this. - context_window->document()->GetScriptRunner()->QueueScriptForExecution( - TakePendingScript(ScriptSchedulingType::kInOrder)); - // The part "When the script is ready..." is implemented in - // ScriptRunner::PendingScriptFinished(). - // TODO(hiroshige): Annotate it. + // [intervention, https://crbug.com/1344772] If ScriptRunner still has + // ForceInOrder scripts not executed yet, attempt to mark the inline script as + // parser blocking so that the inline script is evaluated after the + // ForceInOrder scripts are evaluated. + if (script_scheduling_type == ScriptSchedulingType::kImmediate && + parser_inserted_ && + parser_blocking_inline_option == ParserBlockingInlineOption::kAllow && + context_window->document()->GetScriptRunner()->HasForceInOrderScripts()) { + DCHECK(base::FeatureList::IsEnabled(features::kForceInOrderScript)); + script_scheduling_type = ScriptSchedulingType::kParserBlockingInline; + } - if (resource_keep_alive_) { - resource_keep_alive_->AddFinishObserver( - this, element_document.GetTaskRunner(TaskType::kNetworking).get()); + // <spec step="31">If el's type is "classic" and el has a src attribute, or + // el's type is "module":</spec> + switch (script_scheduling_type) { + case ScriptSchedulingType::kAsync: + // <spec step="31.2.1">Let scripts be el's preparation-time document's set + // of scripts that will execute as soon as possible.</spec> + // + // <spec step="31.2.2">Append el to scripts.</spec> + case ScriptSchedulingType::kInOrder: + // <spec step="31.3.1">Let scripts be el's preparation-time document's + // list of scripts that will execute in order as soon as possible.</spec> + // + // <spec step="31.3.2">Append el to scripts.</spec> + case ScriptSchedulingType::kForceInOrder: + // [intervention, https://crbug.com/1344772] Append el to el's + // preparation-time document's list of force-in-order scripts. + + // TODO(hiroshige): Here the context document is used as "node document" + // while Step 14 uses |elementDocument| as "node document". Fix this. + context_window->document()->GetScriptRunner()->QueueScriptForExecution( + TakePendingScript(script_scheduling_type)); + // The #mark-as-ready part is implemented in ScriptRunner. + + // [no-spec] Do not keep alive ScriptResource controlled by ScriptRunner + // after loaded. + if (resource_keep_alive_) { + resource_keep_alive_->AddFinishObserver( + this, element_document.GetTaskRunner(TaskType::kNetworking).get()); + } + + return nullptr; + + case ScriptSchedulingType::kDefer: + case ScriptSchedulingType::kForceDefer: + case ScriptSchedulingType::kParserBlocking: + case ScriptSchedulingType::kParserBlockingInline: + // The remaining part is implemented by the caller-side of + // PrepareScript(). + DCHECK(parser_inserted_); + if (script_scheduling_type == + ScriptSchedulingType::kParserBlockingInline) { + DCHECK_EQ(parser_blocking_inline_option, + ParserBlockingInlineOption::kAllow); + } + + return TakePendingScript(script_scheduling_type); + + case ScriptSchedulingType::kImmediate: { + // <spec step="32.3">Otherwise, immediately execute the script element el, + // even if other scripts are already executing.</spec> + KURL script_url = (!is_in_document_write && parser_inserted_) + ? element_document.Url() + : KURL(); + TakePendingScript(ScriptSchedulingType::kImmediate) + ->ExecuteScriptBlock(script_url); + return nullptr; } - return true; + case ScriptSchedulingType::kNotSet: + NOTREACHED(); + return nullptr; } +} - // <spec step="26.D">If the script's type is "classic", and the element has a - // src attribute - // - // If the script's type is "module" ...</spec> +ScriptSchedulingType ScriptLoader::GetScriptSchedulingTypePerSpec( + Document& element_document, + ParserBlockingInlineOption parser_blocking_inline_option) const { + DCHECK_NE(GetScriptType(), ScriptLoader::ScriptTypeAtPrepare::kImportMap); + DCHECK(prepared_pending_script_); + + // <spec step="31">If el's type is "classic" and el has a src attribute, or + // el's type is "module":</spec> if ((GetScriptType() == ScriptTypeAtPrepare::kClassic && element_->HasSourceAttribute()) || GetScriptType() == ScriptTypeAtPrepare::kModule) { - // <spec step="26.D">... The element must be added to the set of scripts - // that will execute as soon as possible of the node document of the script - // element at the time the prepare a script algorithm started. When the - // script is ready, execute the script block and then remove the element - // from the set of scripts that will execute as soon as possible.</spec> - // - // TODO(hiroshige): Here the context document is used as "node document" - // while Step 14 uses |elementDocument| as "node document". Fix this. - context_window->document()->GetScriptRunner()->QueueScriptForExecution( - TakePendingScript(ScriptSchedulingType::kAsync)); - // The part "When the script is ready..." is implemented in - // ScriptRunner::PendingScriptFinished(). - // TODO(hiroshige): Annotate it. + // <spec step="31.2">If el has an async attribute or el's force async is + // true:</spec> + if (element_->AsyncAttributeValue() || force_async_) + return ScriptSchedulingType::kAsync; - if (resource_keep_alive_) { - resource_keep_alive_->AddFinishObserver( - this, element_document.GetTaskRunner(TaskType::kNetworking).get()); + // <spec step="31.3">Otherwise, if el is not parser-inserted:</spec> + if (!parser_inserted_) + return ScriptSchedulingType::kInOrder; + + // <spec step="31.4">Otherwise, if el has a defer attribute or el's type is + // "module":</spec> + if (element_->DeferAttributeValue() || + GetScriptType() == ScriptTypeAtPrepare::kModule) { + return ScriptSchedulingType::kDefer; } - return true; + // <spec step="31.5">Otherwise:</spec> + return ScriptSchedulingType::kParserBlocking; + } else { + // <spec step="32">Otherwise:</spec> + DCHECK_EQ(GetScriptType(), ScriptTypeAtPrepare::kClassic); + DCHECK(!element_->HasSourceAttribute()); + DCHECK(!is_external_script_); + + // <spec step="32.2">If el is parser-inserted, and either the parser that + // created el is an XML parser or it's an HTML parser whose script nesting + // level is not greater than one, and el's parser document has a style sheet + // that is blocking scripts:</spec> + if (parser_inserted_ && + parser_blocking_inline_option == ParserBlockingInlineOption::kAllow && + !element_document.IsScriptExecutionReady()) { + return ScriptSchedulingType::kParserBlockingInline; + } + + // <spec step="32.3">Otherwise, immediately execute the script element el, + // even if other scripts are already executing.</spec> + return ScriptSchedulingType::kImmediate; } - - // The following clauses are executed only if the script's type is "classic" - // and the element doesn't have a src attribute. - DCHECK_EQ(GetScriptType(), ScriptTypeAtPrepare::kClassic); - DCHECK(!is_external_script_); - - // Check for inline script that should be force deferred. - if (ShouldForceDeferScript() && - IsA<HTMLDocument>(context_window->document()) && parser_inserted_) { - force_deferred_ = true; - will_be_parser_executed_ = true; - return true; - } - - // <spec step="26.E">If the element does not have a src attribute, and the - // element has been flagged as "parser-inserted", and either the parser that - // created the script is an XML parser or it's an HTML parser whose script - // nesting level is not greater than one, and the Document of the HTML parser - // or XML parser that created the script element has a style sheet that is - // blocking scripts ...</spec> - // - // <spec step="26.E">... has a style sheet that is blocking scripts ...</spec> - // - // is implemented in Document::isScriptExecutionReady(). - // Part of the condition check is done in - // HTMLParserScriptRunner::processScriptElementInternal(). - // TODO(hiroshige): Clean up the split condition check. - if (!element_->HasSourceAttribute() && parser_inserted_ && - !element_document.IsScriptExecutionReady()) { - // The former part of this clause is - // implemented by the caller-side of prepareScript(): - // - HTMLParserScriptRunner::requestParsingBlockingScript() - // - TODO(hiroshige): Investigate XMLDocumentParser::endElementNs() - will_be_parser_executed_ = true; - // <spec step="26.E">... Set the element's "ready to be parser-executed" - // flag. ...</spec> - ready_to_be_parser_executed_ = true; - - return true; - } - - // If ScriptRunner still has ForceInOrder scripts not executed yet, attempt to - // mark the inline script as parser blocking so that the inline script is - // evaluated after the ForceInOrder scripts are evaluated. - // TODO(crbug.com/1344772): Clean up this code block. - if (!element_->HasSourceAttribute() && parser_inserted_ && - context_window->document()->GetScriptRunner()->HasForceInOrderScripts()) { - DCHECK(base::FeatureList::IsEnabled(features::kForceInOrderScript)); - will_be_parser_executed_ = true; - ready_to_be_parser_executed_ = true; - - return true; - } - - // <spec step="26.F">Otherwise - // - // Immediately execute the script block, even if other scripts are already - // executing.</spec> - // - // Note: this block is also duplicated in - // HTMLParserScriptRunner::processScriptElementInternal(). - // TODO(hiroshige): Merge the duplicated code. - KURL script_url = (!is_in_document_write && parser_inserted_) - ? element_document.Url() - : KURL(); - TakePendingScript(ScriptSchedulingType::kImmediate) - ->ExecuteScriptBlock(script_url); - return true; } // https://html.spec.whatwg.org/C/#fetch-a-classic-script @@ -1146,16 +1097,11 @@ resource_keep_alive_ = pending_script->GetResource(); } -// <specdef href="https://html.spec.whatwg.org/C/#prepare-a-script"> void ScriptLoader::FetchModuleScriptTree( const KURL& url, ResourceFetcher* fetch_client_settings_object_fetcher, Modulator* modulator, const ScriptFetchOptions& options) { - // <spec step="24.6.B">"module" - // - // Fetch an external module script graph given url, settings object, and - // options.</spec> auto* module_tree_client = MakeGarbageCollected<ModulePendingScriptTreeClient>(); modulator->FetchTree(url, ModuleType::kJavaScript, @@ -1222,35 +1168,29 @@ } } -bool ScriptLoader::IgnoresLoadRequest() const { - return already_started_ || is_external_script_ || parser_inserted_ || - !element_->IsConnected(); -} - -// <specdef href="https://html.spec.whatwg.org/C/#prepare-a-script"> +// <specdef href="https://html.spec.whatwg.org/C/#prepare-the-script-element"> bool ScriptLoader::IsScriptForEventSupported() const { - // <spec step="14.1">Let for be the value of the for attribute.</spec> + // <spec step="19.1">Let for be the value of el's' for attribute.</spec> String event_attribute = element_->EventAttributeValue(); - // <spec step="14.2">Let event be the value of the event attribute.</spec> + // <spec step="19.2">Let event be the value of el's event attribute.</spec> String for_attribute = element_->ForAttributeValue(); - // <spec step="14">If the script element has an event attribute and a for - // attribute, and the script's type is "classic", then:</spec> + // <spec step="19">If el has an event attribute and a for attribute, and el's + // type is "classic", then:</spec> if (GetScriptType() != ScriptTypeAtPrepare::kClassic || event_attribute.IsNull() || for_attribute.IsNull()) return true; - // <spec step="14.3">Strip leading and trailing ASCII whitespace from event + // <spec step="19.3">Strip leading and trailing ASCII whitespace from event // and for.</spec> for_attribute = for_attribute.StripWhiteSpace(); - // <spec step="14.4">If for is not an ASCII case-insensitive match for the - // string "window", then return. The script is not executed.</spec> + // <spec step="19.4">If for is not an ASCII case-insensitive match for the + // string "window", then return.</spec> if (!EqualIgnoringASCIICase(for_attribute, "window")) return false; event_attribute = event_attribute.StripWhiteSpace(); - // <spec step="14.5">If event is not an ASCII case-insensitive match for - // either the string "onload" or the string "onload()", then return. The - // script is not executed.</spec> + // <spec step="19.5">If event is not an ASCII case-insensitive match for + // either the string "onload" or the string "onload()", then return.</spec> return EqualIgnoringASCIICase(event_attribute, "onload") || EqualIgnoringASCIICase(event_attribute, "onload()"); }
diff --git a/third_party/blink/renderer/core/script/script_loader.h b/third_party/blink/renderer/core/script/script_loader.h index 3a0cf57..5811dbe 100644 --- a/third_party/blink/renderer/core/script/script_loader.h +++ b/third_party/blink/renderer/core/script/script_loader.h
@@ -53,9 +53,9 @@ const char* NameInHeapSnapshot() const override { return "ScriptLoader"; } String DebugName() const override { return "ScriptLoader"; } - // Script type at the time of #prepare-a-script. Import maps are included here - // but not in `mojom::blink::ScriptType` because import maps are handled - // differently from ordinal scripts after PrepareScript(). + // Script type at the time of #prepare-the-script-element. Import maps are + // included here but not in `mojom::blink::ScriptType` because import maps are + // handled differently from ordinal scripts after PrepareScript(). enum class ScriptTypeAtPrepare { kClassic, kModule, @@ -74,24 +74,29 @@ static network::mojom::CredentialsMode ModuleScriptCredentialsMode( CrossOriginAttributeValue); - // https://html.spec.whatwg.org/C/#prepare-a-script - bool PrepareScript(const TextPosition& script_start_position = - TextPosition::MinimumPosition()); + // Indicate whether the caller of `PrepareScript()` allows + // `kParserBlockingInline` scripts. This matches with the spec: + // + // <spec href="https://html.spec.whatwg.org/C/#prepare-the-script-element" + // step="32.2">... either the parser that created el is an XML parser or it's + // an HTML parser whose script nesting level is not greater than one, + // ...</spec> + enum ParserBlockingInlineOption { kDeny, kAllow }; - // Gets a PendingScript for external script whose fetch is started in - // FetchClassicScript()/FetchModuleScriptTree(). - // This should be called only once. - PendingScript* TakePendingScript(ScriptSchedulingType); + // https://html.spec.whatwg.org/C/#prepare-the-script-element + // Returns a `PendingScript` when the script is to be managed by the parser + // and the parser should perform some remaining steps of + // `#prepare-the-script-element`. Otherwise returns a `nullptr`, i.e. + // - when called from non-parser call sites, + // - when no scripts are to be evaluated, or + // - when the script is handled by ScriptLoader/ScriptRunner, not by parsers. + [[nodiscard]] PendingScript* PrepareScript( + ParserBlockingInlineOption, + const TextPosition& script_start_position); - bool WillBeParserExecuted() const { return will_be_parser_executed_; } - bool ReadyToBeParserExecuted() const { return ready_to_be_parser_executed_; } - bool WillExecuteWhenDocumentFinishedParsing() const { - return will_execute_when_document_finished_parsing_; - } - bool IsForceDeferred() const { return force_deferred_; } bool IsParserInserted() const { return parser_inserted_; } bool AlreadyStarted() const { return already_started_; } - bool IsNonBlocking() const { return non_blocking_; } + bool IsForceAsync() const { return force_async_; } ScriptTypeAtPrepare GetScriptType() const { return script_type_; } // Helper functions used by our parent classes. @@ -104,53 +109,54 @@ void SetFetchDocWrittenScriptDeferIdle(); private: - bool IgnoresLoadRequest() const; - bool IsScriptForEventSupported() const; - - // FetchClassicScript corresponds to Step 21.6 of - // https://html.spec.whatwg.org/C/#prepare-a-script - // and must NOT be called from outside of PendingScript(). - // - // https://html.spec.whatwg.org/C/#fetch-a-classic-script - void FetchClassicScript(const KURL&, - Document&, - const ScriptFetchOptions&, - CrossOriginAttributeValue, - const WTF::TextEncoding&); - // https://html.spec.whatwg.org/C/#fetch-a-module-script-tree - void FetchModuleScriptTree(const KURL&, - ResourceFetcher*, - Modulator*, - const ScriptFetchOptions&); - // ResourceFinishObserver. This should be used only for managing // `resource_keep_alive_` lifetime and shouldn't be used for script // evaluation. void NotifyFinished() override; + // Helpers that implement parts of `PrepareScript()` that should be called + // only from `PrepareScript()`. + bool IsScriptForEventSupported() const; + PendingScript* TakePendingScript(ScriptSchedulingType); // Get the effective script text (after Trusted Types checking). String GetScriptText() const; + void FetchClassicScript(const KURL&, + Document&, + const ScriptFetchOptions&, + CrossOriginAttributeValue, + const WTF::TextEncoding&); + void FetchModuleScriptTree(const KURL&, + ResourceFetcher*, + Modulator*, + const ScriptFetchOptions&); + // Calculate ScriptSchedulingType per spec (#prepare-the-script-element Steps + // 31-32), before any intervention applied. + ScriptSchedulingType GetScriptSchedulingTypePerSpec( + Document& element_document, + ParserBlockingInlineOption) const; Member<ScriptElementBase> element_; // https://html.spec.whatwg.org/C/#script-processing-model // "A script element has several associated pieces of state.": - // <spec href="https://html.spec.whatwg.org/C/#already-started">... Initially, - // script elements must have this flag unset ...</spec> + // <spec href="https://html.spec.whatwg.org/C/#already-started">... initially + // false.</spec> bool already_started_ = false; - // <spec href="https://html.spec.whatwg.org/C/#parser-document">... Initially, - // its value must be null. It is set by the HTML parser and the XML parser on - // script elements they insert ...</spec> + // <spec href="https://html.spec.whatwg.org/C/#parser-document">... initially + // null. It is set by the HTML parser and the XML parser on script elements + // they insert, ...</spec> + // // We use a WeakMember here because we're keeping the parser-inserted // information separately from the parser document, so ScriptLoader doesn't // need to keep the parser document alive. WeakMember<Document> parser_document_; - // <spec href="https://html.spec.whatwg.org/C/#parser-inserted">script + // <spec href="https://html.spec.whatwg.org/C/#parser-inserted">... script // elements with non-null parser documents are known as - // "parser-inserted".</spec> + // parser-inserted.</spec> + // // Note that we don't actually implement "parser inserted" in terms of a // non-null |parser_document_| like the spec, because it is possible for // |CreateElementFlags::created_by_parser_| to be true even when @@ -158,34 +164,24 @@ // store this information separately. bool parser_inserted_ = false; - // <spec href="https://html.spec.whatwg.org/C/#non-blocking">... Initially, - // script elements must have this flag set. ...</spec> - bool non_blocking_ = true; + // <spec href="https://html.spec.whatwg.org/C/#script-force-async">... + // initially true. ...</spec> + bool force_async_ = true; // Non-specified flag. Indicating that the script is a dynamically injected // one with an async attribute, and therefore not render blocking. bool dynamic_async_ = false; - // <spec href="https://html.spec.whatwg.org/C/#ready-to-be-parser-executed"> - // ... Initially, script elements must have this flag unset ...</spec> - bool ready_to_be_parser_executed_ = false; - - // <spec href="https://html.spec.whatwg.org/C/#concept-script-type">... It is - // determined when the script is prepared, ...</spec> + // <spec href="https://html.spec.whatwg.org/C/#concept-script-type">... + // initially null. It is determined when the element is prepared, based on the + // type attribute of the element at that time.</spec> ScriptTypeAtPrepare script_type_ = ScriptTypeAtPrepare::kInvalid; // <spec href="https://html.spec.whatwg.org/C/#concept-script-external"> - // ... It is determined when the script is prepared, ...</spec> + // ... initially false. It is determined when the script is prepared, based on + // the src attribute of the element at that time.</spec> bool is_external_script_ = false; - // Same as "The parser will handle executing the script." - bool will_be_parser_executed_ = false; - - bool will_execute_when_document_finished_parsing_ = false; - - // The script will be force deferred (https://crbug.com/1339112). - bool force_deferred_ = false; - // A PendingScript is first created in PrepareScript() and stored in // |prepared_pending_script_|. // Later, TakePendingScript() is called, and its caller holds a reference
diff --git a/third_party/blink/renderer/core/script/script_scheduling_type.h b/third_party/blink/renderer/core/script/script_scheduling_type.h index 35e811e1..89d85d5 100644 --- a/third_party/blink/renderer/core/script/script_scheduling_type.h +++ b/third_party/blink/renderer/core/script/script_scheduling_type.h
@@ -9,9 +9,8 @@ // Type of <script>'s scheduling. // -// <specdef href="https://html.spec.whatwg.org/C/#prepare-a-script"> -// This is determined by which clause of <spec step="28">Then, follow the first -// of the following options that describes the situation:</spec> is taken. +// This is determined by Steps 31-32 of +// https://html.spec.whatwg.org/C/#prepare-the-script-element. // // The enum values are used in histograms and thus do not change existing // enum values when modifying. @@ -23,7 +22,7 @@ // Deferred scripts controlled by HTMLParserScriptRunner. // - // Spec: 1st Clause. + // Spec: Step 31.4. // // Examples: // - <script defer> (parser inserted) @@ -32,7 +31,7 @@ // Parser-blocking external scripts controlled by XML/HTMLParserScriptRunner. // - // Spec: 2nd Clause. + // Spec: Step 31.5. // // Examples: // - <script> (parser inserted) @@ -40,12 +39,12 @@ // Parser-blocking inline scripts controlled by XML/HTMLParserScriptRunner. // - // Spec: 5th Clause. + // Spec: Step 32.2. kParserBlockingInline, // In-order scripts controlled by ScriptRunner. // - // Spec: 3rd Clause. + // Spec: Step 31.3. // // Examples (either classic or module): // - Dynamically inserted <script>s with s.async = false @@ -53,7 +52,7 @@ // Async scripts controlled by ScriptRunner. // - // Spec: 4nd Clause. + // Spec: Step 31.2. // // Examples (either classic or module): // - <script async> and <script async defer> (parser inserted) @@ -61,7 +60,8 @@ // - Dynamically inserted <script>s with s.async = true kAsync, - // Inline <script> executed immediately within prepare-a-script. + // Inline <script> executed immediately within prepare-the-script-element. + // Spec: Step 32.3. kImmediate, // Force deferred scripts controlled by HTMLParserScriptRunner.
diff --git a/third_party/blink/renderer/core/script/xml_parser_script_runner.cc b/third_party/blink/renderer/core/script/xml_parser_script_runner.cc index ec57087..652c0fe 100644 --- a/third_party/blink/renderer/core/script/xml_parser_script_runner.cc +++ b/third_party/blink/renderer/core/script/xml_parser_script_runner.cc
@@ -17,7 +17,7 @@ // <specdef label="Parsing" // href="https://html.spec.whatwg.org/C/#parsing-xhtml-documents"> // <specdef label="Prepare" -// href="https://html.spec.whatwg.org/C/#prepare-a-script"> +// href="https://html.spec.whatwg.org/C/#prepare-the-script-element"> XMLParserScriptRunner::XMLParserScriptRunner(XMLParserScriptRunnerHost* host) : host_(host) {} @@ -49,12 +49,12 @@ CHECK_EQ(pending_script->GetScriptType(), mojom::blink::ScriptType::kClassic); - // <spec label="Parsing" step="4">Execute the pending parsing-blocking - // script.</spec> + // <spec label="Parsing" step="4">Execute the script element given by the + // pending parsing-blocking script.</spec> pending_script->ExecuteScriptBlock(NullURL()); - // <spec label="Parsing" step="5">There is no longer a pending - // parsing-blocking script.</spec> + // <spec label="Parsing" step="5">Set the pending parsing-blocking script to + // null.</spec> DCHECK(!parser_blocking_script_); // <spec label="Parsing" step="3">Unblock this instance of the XML parser, @@ -69,64 +69,73 @@ DCHECK(element); DCHECK(!parser_blocking_script_); - ScriptLoader* script_loader = ScriptLoaderFromElement(element); - // [Parsing] When the element's end tag is subsequently parsed, the user agent // must perform a microtask checkpoint, and then prepare the script element. // [spec text] - bool success = script_loader->PrepareScript(script_start_position); + PendingScript* pending_script = + ScriptLoaderFromElement(element)->PrepareScript( + ScriptLoader::ParserBlockingInlineOption::kAllow, + script_start_position); - if (script_loader->GetScriptType() == - ScriptLoader::ScriptTypeAtPrepare::kModule) { - // XMLDocumentParser does not support a module script, and thus ignores it. - success = false; + if (!pending_script) + return; + + if (pending_script->GetScriptType() == mojom::blink::ScriptType::kModule) { + // XMLDocumentParser does not support defer scripts, and thus ignores all + // module scripts. document.AddConsoleMessage(MakeGarbageCollected<ConsoleMessage>( mojom::ConsoleMessageSource::kJavaScript, mojom::ConsoleMessageLevel::kError, "Module scripts in XML documents are currently " "not supported. See crbug.com/717643")); + return; } - if (!success) - return; + switch (pending_script->GetSchedulingType()) { + case ScriptSchedulingType::kParserBlockingInline: + // <spec label="Prepare" step="31.4.2">... (The parser will handle + // executing the script.)</spec> + // + // <spec label="Parsing" step="4">Execute the script element given by the + // pending parsing-blocking script.</spec> + // + // TODO(hiroshige): XMLParserScriptRunner doesn't check style sheet that + // is blocking scripts and thus the script is executed immediately here, + // and thus Steps 1-3 are skipped. + pending_script->ExecuteScriptBlock(document.Url()); + break; - // [Parsing] If this causes there to be a pending parsing-blocking script, - // then the user agent must run the following steps: [spec text] - if (script_loader->ReadyToBeParserExecuted()) { - // <spec label="Prepare" step="26.E">... The parser will handle executing - // the script.</spec> - // - // <spec label="Parsing" step="4">Execute the pending parsing-blocking - // script.</spec> - // - // TODO(hiroshige): XMLParserScriptRunner doesn't check style sheet that - // is blocking scripts and thus the script is executed immediately here, - // and thus Steps 1-3 are skipped. - script_loader - ->TakePendingScript(ScriptSchedulingType::kParserBlockingInline) - ->ExecuteScriptBlock(document.Url()); - } else if (script_loader->WillBeParserExecuted()) { - // <spec label="Prepare" step="26.B">... The element is the pending - // parsing-blocking script of the Document of the parser that created the - // element. (There can only be one such script per Document at a time.) - // ...</spec> - parser_blocking_script_ = - script_loader->TakePendingScript(ScriptSchedulingType::kParserBlocking); - parser_blocking_script_->MarkParserBlockingLoadStartTime(); + case ScriptSchedulingType::kDefer: + // XMLParserScriptRunner doesn't support defer scripts and handle them as + // if parser-blocking scripts. + case ScriptSchedulingType::kParserBlocking: + // <spec label="Prepare" step="31.5.1">Set el's parser document's pending + // parsing-blocking script to el.</spec> + parser_blocking_script_ = pending_script; + parser_blocking_script_->MarkParserBlockingLoadStartTime(); - // <spec label="Parsing" step="1">Block this instance of the XML parser, - // such that the event loop will not run tasks that invoke it.</spec> - // - // This is done in XMLDocumentParser::EndElementNs(). + // <spec label="Parsing" step="1">Block this instance of the XML parser, + // such that the event loop will not run tasks that invoke it.</spec> + // + // This is done in XMLDocumentParser::EndElementNs(). - // <spec label="Parsing" step="2">Spin the event loop until the parser's - // Document has no style sheet that is blocking scripts and the pending - // parsing-blocking script's "ready to be parser-executed" flag is - // set.</spec> + // <spec label="Parsing" step="2">Spin the event loop until the parser's + // Document has no style sheet that is blocking scripts and the pending + // parsing-blocking script's ready to be parser-executed is true.</spec> - // TODO(hiroshige): XMLParserScriptRunner doesn't check style sheet that - // is blocking scripts. - parser_blocking_script_->WatchForLoad(this); + // TODO(hiroshige): XMLParserScriptRunner doesn't check style sheet that + // is blocking scripts. + parser_blocking_script_->WatchForLoad(this); + break; + + case ScriptSchedulingType::kAsync: + case ScriptSchedulingType::kInOrder: + case ScriptSchedulingType::kForceInOrder: + case ScriptSchedulingType::kImmediate: + case ScriptSchedulingType::kNotSet: + case ScriptSchedulingType::kForceDefer: + NOTREACHED(); + break; } }
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc index 6a736d93..cee57f1 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
@@ -2664,15 +2664,35 @@ if (GetElement()) { ListedElement* form_control = ListedElement::From(*GetElement()); if (form_control) { - if (form_control->IsNotCandidateOrValid()) - return ax::mojom::blink::InvalidState::kFalse; - else - return ax::mojom::blink::InvalidState::kTrue; + return IsValidFormControl(form_control) + ? ax::mojom::blink::InvalidState::kFalse + : ax::mojom::blink::InvalidState::kTrue; } } + return AXObject::GetInvalidState(); } +bool AXNodeObject::IsValidFormControl(ListedElement* form_control) const { + // If the control is marked with a custom error, the form control is invalid. + if (form_control->CustomError()) + return false; + + // If the form control checks for validity, and has passed the checks, + // then consider it valid. + if (form_control->IsNotCandidateOrValid()) + return true; + + // The control is invalid, as far as CSS is concerned. + // However, we ignore a failed check inside of an empty required text field, + // in order to avoid redundant verbalizations (screen reader already says + // required). + if (IsAtomicTextField() && IsRequired() && GetValueForControl().length() == 0) + return true; + + return false; +} + int AXNodeObject::PosInSet() const { if (RoleValue() == ax::mojom::blink::Role::kPopUpButton && GetNode() && !AXObjectCache().UseAXMenuList()) {
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.h b/third_party/blink/renderer/modules/accessibility/ax_node_object.h index c8a04b8..cf3ba98 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_node_object.h +++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.h
@@ -31,6 +31,7 @@ #include "base/dcheck_is_on.h" #include "third_party/blink/renderer/core/editing/markers/document_marker.h" +#include "third_party/blink/renderer/core/html/forms/html_form_control_element.h" #include "third_party/blink/renderer/modules/accessibility/ax_object.h" #include "third_party/blink/renderer/modules/modules_export.h" @@ -168,6 +169,7 @@ // Properties of interactive elements. ax::mojom::blink::AriaCurrentState GetAriaCurrentState() const final; ax::mojom::blink::InvalidState GetInvalidState() const final; + bool IsValidFormControl(ListedElement* form_control) const; bool ValueForRange(float* out_value) const override; bool MaxValueForRange(float* out_value) const override; bool MinValueForRange(float* out_value) const override;
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc index b297217..a0b5086 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -997,6 +997,13 @@ return ax_object->AXObjectID(); } +AXID AXObjectCacheImpl::GetExistingAXID(Node* node) { + AXObject* ax_object = SafeGet(node); + if (!ax_object) + return 0; + return ax_object->AXObjectID(); +} + AXObject* AXObjectCacheImpl::Get(AccessibleNode* accessible_node) { if (!accessible_node) return nullptr; @@ -1195,18 +1202,25 @@ return false; // Is the clearfix hack: ignore pseudo element. } - // The only other pseudo elements that matter are ::first-letter. - // E.g. backdrop does not get an accessibility object. - if (!node.IsFirstLetterPseudoElement()) - return false; - - if (LayoutObject* layout_parent = node.GetLayoutObject()->Parent()) { - if (Node* layout_parent_node = layout_parent->GetNode()) { - if (layout_parent_node->IsPseudoElement()) - return IsRelevantPseudoElement(*layout_parent_node); - } + // ::first-letter is relevant if and only if its parent layout object is a + // relevant pseudo element. If it's not a pseudo element, then this the + // ::first-letter text would end up being repeated in the AX Tree. + if (node.IsFirstLetterPseudoElement()) { + LayoutObject* layout_parent = node.GetLayoutObject()->Parent(); + DCHECK(layout_parent); + Node* layout_parent_node = layout_parent->GetNode(); + return layout_parent_node && layout_parent_node->IsPseudoElement() && + IsRelevantPseudoElement(*layout_parent_node); } + // The remaining possible pseudo element types are not relevant. + if (node.IsBackdropPseudoElement()) + return false; + + // If this is reached, then a new pseudo element type was added and is not + // yet handled by accessibility. See PseudoElementTagName() in + // pseudo_element.cc for all possible types. + SANITIZER_NOTREACHED() << "Unhandled type of pseudo element on: " << node; return false; } @@ -1502,10 +1516,11 @@ DCHECK(layout_text_parent->IsText()); parent = GetOrCreate(layout_text_parent); if (!parent) { - // Allowed to not have a parent if the text was irrelevant whitespace. - DCHECK(inline_text_box->GetText().ContainsOnlyWhitespaceOrEmpty()) + DCHECK(inline_text_box->GetText().ContainsOnlyWhitespaceOrEmpty() || + !IsRelevantPseudoElementDescendant(*layout_text_parent)) << "No parent for non-whitespace inline textbox: " - << layout_text_parent; + << layout_text_parent + << "\nParent of parent: " << layout_text_parent->Parent(); return nullptr; } }
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h index 55f5585..7a6795d4 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h +++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
@@ -227,6 +227,8 @@ AXID GetAXID(Node*) override; + AXID GetExistingAXID(Node*) override; + AXObject* Get(AccessibleNode*); AXObject* Get(AbstractInlineTextBox*);
diff --git a/third_party/blink/renderer/modules/cache_storage/cache_storage.cc b/third_party/blink/renderer/modules/cache_storage/cache_storage.cc index 9d1da09..37fdd2c 100644 --- a/third_party/blink/renderer/modules/cache_storage/cache_storage.cc +++ b/third_party/blink/renderer/modules/cache_storage/cache_storage.cc
@@ -7,7 +7,7 @@ #include <utility> #include "base/memory/scoped_refptr.h" -#include "base/metrics/histogram_macros.h" +#include "base/metrics/histogram_functions.h" #include "third_party/blink/public/common/browser_interface_broker_proxy.h" #include "third_party/blink/public/common/cache_storage/cache_storage_utils.h" #include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom-blink.h" @@ -62,28 +62,66 @@ namespace blink { -namespace { +void CacheStorage::IsCacheStorageAllowed(ExecutionContext* context, + ScriptPromiseResolver* resolver, + base::OnceCallback<void()> callback) { + DCHECK(context->IsWindow() || context->IsWorkerGlobalScope()); -bool IsCacheStorageAllowed(ScriptState* script_state) { - if (!script_state->ContextIsValid()) - return false; + auto wrapped_callback = + WTF::Bind(&CacheStorage::OnCacheStorageAllowed, WrapWeakPersistent(this), + WrapPersistent(resolver), std::move(callback)); - ExecutionContext* context = ExecutionContext::From(script_state); + if (allowed_.has_value()) { + std::move(wrapped_callback).Run(allowed_.value()); + return; + } WebContentSettingsClient* settings_client = nullptr; - if (auto* window = DynamicTo<LocalDOMWindow>(context)) - settings_client = window->GetFrame()->GetContentSettingsClient(); - else - settings_client = To<WorkerGlobalScope>(context)->ContentSettingsClient(); - // This triggers a sync IPC. - return settings_client - ? settings_client->AllowStorageAccessSync( - WebContentSettingsClient::StorageType::kCacheStorage) - : true; + if (auto* window = DynamicTo<LocalDOMWindow>(context)) { + LocalFrame* frame = window->GetFrame(); + if (!frame) { + std::move(wrapped_callback).Run(false); + return; + } + settings_client = window->GetFrame()->GetContentSettingsClient(); + } else { + settings_client = To<WorkerGlobalScope>(context)->ContentSettingsClient(); + } + + if (!settings_client) { + std::move(wrapped_callback).Run(true); + return; + } + settings_client->AllowStorageAccess( + WebContentSettingsClient::StorageType::kCacheStorage, + std::move(wrapped_callback)); } -} // namespace +void CacheStorage::OnCacheStorageAllowed(ScriptPromiseResolver* resolver, + base::OnceCallback<void()> callback, + bool allow_access) { + if (allowed_.has_value()) { + DCHECK_EQ(allowed_.value(), allow_access); + } else { + allowed_ = allow_access; + } + + ScriptState* script_state = resolver->GetScriptState(); + + if (!script_state->ContextIsValid()) { + return; + } + + if (allowed_.value()) { + std::move(callback).Run(); + return; + } + + ScriptState::Scope scope(script_state); + resolver->Reject( + MakeGarbageCollected<DOMException>(DOMExceptionCode::kSecurityError)); +} ScriptPromise CacheStorage::open(ScriptState* script_state, const String& cache_name) { @@ -95,12 +133,20 @@ auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); ScriptPromise promise = resolver->Promise(); - if (!IsAllowed(script_state)) { - resolver->Reject( - MakeGarbageCollected<DOMException>(DOMExceptionCode::kSecurityError)); - return promise; - } + ExecutionContext* context = ExecutionContext::From(script_state); + DCHECK(context->IsContextThread()); + IsCacheStorageAllowed( + context, resolver, + WTF::Bind(&CacheStorage::OpenImpl, WrapWeakPersistent(this), + WrapPersistent(resolver), cache_name, trace_id)); + + return promise; +} + +void CacheStorage::OpenImpl(ScriptPromiseResolver* resolver, + const String& cache_name, + int64_t trace_id) { MaybeInit(); // The context may be destroyed and the mojo connection unbound. However the @@ -108,11 +154,9 @@ if (!cache_storage_remote_.is_bound()) { resolver->Reject(MakeGarbageCollected<DOMException>( DOMExceptionCode::kInvalidStateError)); - return promise; + return; } - ever_used_ = true; - // Make sure to bind the CacheStorage object to keep the mojo interface // pointer alive during the operation. Otherwise GC might prevent the // callback from ever being executed. @@ -124,8 +168,9 @@ CacheStorageBlobClientList* blob_client_list, base::TimeTicks start_time, int64_t trace_id, mojom::blink::OpenResultPtr result) { - UMA_HISTOGRAM_TIMES("ServiceWorkerCache.CacheStorage.Renderer.Open", - base::TimeTicks::Now() - start_time); + base::UmaHistogramTimes( + "ServiceWorkerCache.CacheStorage.Renderer.Open", + base::TimeTicks::Now() - start_time); if (!resolver->GetExecutionContext() || resolver->GetExecutionContext()->IsContextDestroyed()) { return; @@ -151,8 +196,6 @@ WrapPersistent(resolver), WrapPersistent(scoped_fetcher_.Get()), WrapPersistent(blob_client_list_.Get()), base::TimeTicks::Now(), trace_id)); - - return promise; } ScriptPromise CacheStorage::has(ScriptState* script_state, @@ -165,12 +208,20 @@ auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); ScriptPromise promise = resolver->Promise(); - if (!IsAllowed(script_state)) { - resolver->Reject( - MakeGarbageCollected<DOMException>(DOMExceptionCode::kSecurityError)); - return promise; - } + ExecutionContext* context = ExecutionContext::From(script_state); + DCHECK(context->IsContextThread()); + IsCacheStorageAllowed( + context, resolver, + WTF::Bind(&CacheStorage::HasImpl, WrapWeakPersistent(this), + WrapPersistent(resolver), cache_name, trace_id)); + + return promise; +} + +void CacheStorage::HasImpl(ScriptPromiseResolver* resolver, + const String& cache_name, + int64_t trace_id) { MaybeInit(); // The context may be destroyed and the mojo connection unbound. However the @@ -178,9 +229,8 @@ if (!cache_storage_remote_.is_bound()) { resolver->Reject(MakeGarbageCollected<DOMException>( DOMExceptionCode::kInvalidStateError)); - return promise; + return; } - ever_used_ = true; // Make sure to bind the CacheStorage object to keep the mojo interface @@ -191,8 +241,9 @@ WTF::Bind( [](ScriptPromiseResolver* resolver, base::TimeTicks start_time, int64_t trace_id, mojom::blink::CacheStorageError result) { - UMA_HISTOGRAM_TIMES("ServiceWorkerCache.CacheStorage.Renderer.Has", - base::TimeTicks::Now() - start_time); + base::UmaHistogramTimes( + "ServiceWorkerCache.CacheStorage.Renderer.Has", + base::TimeTicks::Now() - start_time); TRACE_EVENT_WITH_FLOW1( "CacheStorage", "CacheStorage::Has::Callback", TRACE_ID_GLOBAL(trace_id), TRACE_EVENT_FLAG_FLOW_IN, "status", @@ -213,8 +264,6 @@ } }, WrapPersistent(resolver), base::TimeTicks::Now(), trace_id)); - - return promise; } ScriptPromise CacheStorage::Delete(ScriptState* script_state, @@ -227,12 +276,20 @@ auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); ScriptPromise promise = resolver->Promise(); - if (!IsAllowed(script_state)) { - resolver->Reject( - MakeGarbageCollected<DOMException>(DOMExceptionCode::kSecurityError)); - return promise; - } + ExecutionContext* context = ExecutionContext::From(script_state); + DCHECK(context->IsContextThread()); + IsCacheStorageAllowed( + context, resolver, + WTF::Bind(&CacheStorage::DeleteImpl, WrapWeakPersistent(this), + WrapPersistent(resolver), cache_name, trace_id)); + + return promise; +} + +void CacheStorage::DeleteImpl(ScriptPromiseResolver* resolver, + const String& cache_name, + int64_t trace_id) { MaybeInit(); // The context may be destroyed and the mojo connection unbound. However the @@ -240,9 +297,8 @@ if (!cache_storage_remote_.is_bound()) { resolver->Reject(MakeGarbageCollected<DOMException>( DOMExceptionCode::kInvalidStateError)); - return promise; + return; } - ever_used_ = true; // Make sure to bind the CacheStorage object to keep the mojo interface @@ -253,7 +309,7 @@ WTF::Bind( [](ScriptPromiseResolver* resolver, base::TimeTicks start_time, int64_t trace_id, mojom::blink::CacheStorageError result) { - UMA_HISTOGRAM_TIMES( + base::UmaHistogramTimes( "ServiceWorkerCache.CacheStorage.Renderer.Delete", base::TimeTicks::Now() - start_time); TRACE_EVENT_WITH_FLOW1( @@ -277,8 +333,6 @@ } }, WrapPersistent(resolver), base::TimeTicks::Now(), trace_id)); - - return promise; } ScriptPromise CacheStorage::keys(ScriptState* script_state) { @@ -289,12 +343,18 @@ auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); ScriptPromise promise = resolver->Promise(); - if (!IsAllowed(script_state)) { - resolver->Reject( - MakeGarbageCollected<DOMException>(DOMExceptionCode::kSecurityError)); - return promise; - } + ExecutionContext* context = ExecutionContext::From(script_state); + DCHECK(context->IsContextThread()); + IsCacheStorageAllowed( + context, resolver, + WTF::Bind(&CacheStorage::KeysImpl, WrapWeakPersistent(this), + WrapPersistent(resolver), trace_id)); + + return promise; +} + +void CacheStorage::KeysImpl(ScriptPromiseResolver* resolver, int64_t trace_id) { MaybeInit(); // The context may be destroyed and the mojo connection unbound. However the @@ -302,9 +362,8 @@ if (!cache_storage_remote_.is_bound()) { resolver->Reject(MakeGarbageCollected<DOMException>( DOMExceptionCode::kInvalidStateError)); - return promise; + return; } - ever_used_ = true; // Make sure to bind the CacheStorage object to keep the mojo interface @@ -315,8 +374,9 @@ WTF::Bind( [](ScriptPromiseResolver* resolver, base::TimeTicks start_time, int64_t trace_id, const Vector<String>& keys) { - UMA_HISTOGRAM_TIMES("ServiceWorkerCache.CacheStorage.Renderer.Keys", - base::TimeTicks::Now() - start_time); + base::UmaHistogramTimes( + "ServiceWorkerCache.CacheStorage.Renderer.Keys", + base::TimeTicks::Now() - start_time); TRACE_EVENT_WITH_FLOW1( "CacheStorage", "CacheStorage::Keys::Callback", TRACE_ID_GLOBAL(trace_id), TRACE_EVENT_FLAG_FLOW_IN, "key_list", @@ -327,8 +387,6 @@ resolver->Resolve(keys); }, WrapPersistent(resolver), base::TimeTicks::Now(), trace_id)); - - return promise; } ScriptPromise CacheStorage::match(ScriptState* script_state, @@ -376,17 +434,29 @@ auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); const ScriptPromise promise = resolver->Promise(); - if (!IsAllowed(script_state)) { - resolver->Reject( - MakeGarbageCollected<DOMException>(DOMExceptionCode::kSecurityError)); - return promise; - } - if (request->method() != http_names::kGET && !options->ignoreMethod()) { resolver->Resolve(); return promise; } + IsCacheStorageAllowed( + context, resolver, + WTF::Bind(&CacheStorage::MatchImplHelper, WrapWeakPersistent(this), + WrapPersistent(resolver), WrapPersistent(options), + std::move(mojo_request), std::move(mojo_options), + in_related_fetch_event, in_range_fetch_event, trace_id)); + + return promise; +} + +void CacheStorage::MatchImplHelper( + ScriptPromiseResolver* resolver, + const MultiCacheQueryOptions* options, + mojom::blink::FetchAPIRequestPtr mojo_request, + mojom::blink::MultiCacheQueryOptionsPtr mojo_options, + bool in_related_fetch_event, + bool in_range_fetch_event, + int64_t trace_id) { MaybeInit(); // The context may be destroyed and the mojo connection unbound. However the @@ -394,9 +464,8 @@ if (!cache_storage_remote_.is_bound()) { resolver->Reject(MakeGarbageCollected<DOMException>( DOMExceptionCode::kInvalidStateError)); - return promise; + return; } - ever_used_ = true; // Make sure to bind the CacheStorage object to keep the mojo interface @@ -411,11 +480,11 @@ CacheStorage* self, mojom::blink::MatchResultPtr result) { base::TimeDelta elapsed = base::TimeTicks::Now() - start_time; if (!options->hasCacheName() || options->cacheName().IsEmpty()) { - UMA_HISTOGRAM_LONG_TIMES( + base::UmaHistogramLongTimes( "ServiceWorkerCache.CacheStorage.Renderer.MatchAllCaches", elapsed); } else { - UMA_HISTOGRAM_LONG_TIMES( + base::UmaHistogramLongTimes( "ServiceWorkerCache.CacheStorage.Renderer.MatchOneCache", elapsed); } @@ -463,8 +532,6 @@ }, WrapPersistent(resolver), base::TimeTicks::Now(), WrapPersistent(options), trace_id, WrapPersistent(this))); - - return promise; } CacheStorage::CacheStorage(ExecutionContext* context, @@ -514,14 +581,6 @@ ExecutionContextClient::Trace(visitor); } -bool CacheStorage::IsAllowed(ScriptState* script_state) { - if (!allowed_.has_value()) { - // Cache the IsCacheStorageAllowed() because it triggers a sync IPC. - allowed_.emplace(IsCacheStorageAllowed(script_state)); - } - return allowed_.value(); -} - void CacheStorage::MaybeInit() { if (cache_storage_remote_.is_bound()) return;
diff --git a/third_party/blink/renderer/modules/cache_storage/cache_storage.h b/third_party/blink/renderer/modules/cache_storage/cache_storage.h index 2c18113..b52c222 100644 --- a/third_party/blink/renderer/modules/cache_storage/cache_storage.h +++ b/third_party/blink/renderer/modules/cache_storage/cache_storage.h
@@ -48,13 +48,37 @@ void Trace(Visitor*) const override; private: + void MaybeInit(); + + // The callback passed into IsCacheStorageAllowed is invoked upon success, + // and the resolver is rejected upon failure. + void IsCacheStorageAllowed(ExecutionContext* context, + ScriptPromiseResolver* resolver, + base::OnceCallback<void()> callback); + void OnCacheStorageAllowed(ScriptPromiseResolver* resolver, + base::OnceCallback<void()> callback, + bool allow_access); + + void OpenImpl(ScriptPromiseResolver* resolver, + const String& cache_name, + int64_t trace_id); + void HasImpl(ScriptPromiseResolver* resolver, + const String& cache_name, + int64_t trace_id); + void DeleteImpl(ScriptPromiseResolver* resolver, + const String& cache_name, + int64_t trace_id); + void KeysImpl(ScriptPromiseResolver* resolver, int64_t trace_id); ScriptPromise MatchImpl(ScriptState*, const Request*, const MultiCacheQueryOptions*); - - bool IsAllowed(ScriptState*); - - void MaybeInit(); + void MatchImplHelper(ScriptPromiseResolver* resolver, + const MultiCacheQueryOptions* options, + mojom::blink::FetchAPIRequestPtr mojo_request, + mojom::blink::MultiCacheQueryOptionsPtr mojo_options, + bool in_related_fetch_event, + bool in_range_fetch_event, + int64_t trace_id); Member<GlobalFetch::ScopedFetcher> scoped_fetcher_; Member<CacheStorageBlobClientList> blob_client_list_;
diff --git a/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc b/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc index 0f24439..e43a4c5 100644 --- a/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc +++ b/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc
@@ -37,7 +37,7 @@ #include "third_party/blink/public/web/modules/mediastream/media_stream_video_source.h" #include "third_party/blink/public/web/web_document.h" #include "third_party/blink/public/web/web_local_frame.h" -#include "third_party/blink/public/web/web_local_frame_client.h" +#include "third_party/blink/public/web/web_view.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h" #include "third_party/blink/renderer/modules/peerconnection/rtc_error_util.h" @@ -693,8 +693,9 @@ // |web_frame| may be null in tests, e.g. if // RTCPeerConnectionHandler::InitializeForTest() is used. if (web_frame) { - rtc::SetAllowLegacyTLSProtocols( - web_frame->Client()->AllowRTCLegacyTLSProtocols()); + rtc::SetAllowLegacyTLSProtocols(web_frame->View() + ->GetRendererPreferences() + .webrtc_allow_legacy_tls_protocols); dependencies.allocator = CreatePortAllocator(web_frame); } dependencies.async_resolver_factory = CreateAsyncResolverFactory();
diff --git a/third_party/blink/renderer/modules/webcodecs/image_decoder_external.cc b/third_party/blink/renderer/modules/webcodecs/image_decoder_external.cc index 8dd1fe0..6aa7540 100644 --- a/third_party/blink/renderer/modules/webcodecs/image_decoder_external.cc +++ b/third_party/blink/renderer/modules/webcodecs/image_decoder_external.cc
@@ -184,7 +184,7 @@ } decoder_ = std::make_unique<WTF::SequenceBound<ImageDecoderCore>>( - decode_task_runner_, mime_type_.IsolatedCopy(), /*data=*/nullptr, + decode_task_runner_, mime_type_, /*data=*/nullptr, /*data_complete=*/false, alpha_option, color_behavior, desired_size, animation_option_); @@ -249,7 +249,7 @@ data_complete_ = true; completed_property_->ResolveWithUndefined(); decoder_ = std::make_unique<WTF::SequenceBound<ImageDecoderCore>>( - decode_task_runner_, mime_type_.IsolatedCopy(), std::move(segment_reader), + decode_task_runner_, mime_type_, std::move(segment_reader), data_complete_, alpha_option, color_behavior, desired_size, animation_option_);
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 44afba3fd..4927162 100644 --- a/third_party/blink/renderer/platform/exported/web_runtime_features.cc +++ b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
@@ -140,6 +140,10 @@ RuntimeEnabledFeatures::SetAdTaggingEnabled(enable); } +void WebRuntimeFeatures::EnableBatchFetchRequests(bool enable) { + RuntimeEnabledFeatures::SetBatchFetchRequestsEnabled(enable); +} + void WebRuntimeFeatures::EnableCanvas2dImageChromium(bool enable) { RuntimeEnabledFeatures::SetCanvas2dImageChromiumEnabled(enable); }
diff --git a/third_party/blink/renderer/platform/graphics/compositing/chunk_to_layer_mapper.cc b/third_party/blink/renderer/platform/graphics/compositing/chunk_to_layer_mapper.cc index 8da3e5a..cfa358fd 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/chunk_to_layer_mapper.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/chunk_to_layer_mapper.cc
@@ -42,23 +42,13 @@ -layer_offset_.y()); } - bool new_has_filter_that_moves_pixels = has_filter_that_moves_pixels_; - if (&new_chunk_state.Effect() != &chunk_state_.Effect()) { - new_has_filter_that_moves_pixels = false; - for (const auto* effect = &new_chunk_state.Effect(); - effect && effect != &layer_state_.Effect(); - effect = effect->UnaliasedParent()) { - if (effect->HasFilterThatMovesPixels()) { - new_has_filter_that_moves_pixels = true; - break; - } - } - } + has_filter_that_moves_pixels_ = + new_chunk_state.Clip().NearestPixelMovingFilterClip() != + layer_state_.Clip().NearestPixelMovingFilterClip(); - bool needs_clip_recalculation = - new_has_filter_that_moves_pixels != has_filter_that_moves_pixels_ || - &new_chunk_state.Clip() != &chunk_state_.Clip(); - if (needs_clip_recalculation) { + if (has_filter_that_moves_pixels_) { + clip_rect_ = InfiniteLooseFloatClipRect(); + } else if (&new_chunk_state.Clip() != &chunk_state_.Clip()) { clip_rect_ = GeometryMapper::LocalToAncestorClipRect(new_chunk_state, layer_state_); if (!clip_rect_.IsInfinite()) @@ -66,7 +56,6 @@ } chunk_state_ = new_chunk_state; - has_filter_that_moves_pixels_ = new_has_filter_that_moves_pixels; } gfx::Rect ChunkToLayerMapper::MapVisualRect(const gfx::Rect& rect) const {
diff --git a/third_party/blink/renderer/platform/graphics/compositing/chunk_to_layer_mapper_test.cc b/third_party/blink/renderer/platform/graphics/compositing/chunk_to_layer_mapper_test.cc index 965676a3..c589c743 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/chunk_to_layer_mapper_test.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/chunk_to_layer_mapper_test.cc
@@ -162,14 +162,16 @@ CompositorFilterOperations filter2; filter2.AppendBlurFilter(20); auto effect2 = CreateFilterEffect(LayerState().Effect(), std::move(filter2)); - auto chunk2 = Chunk(PropertyTreeState(LayerState().Transform(), - LayerState().Clip(), *effect2)); + auto clip_expander = + CreatePixelMovingFilterClipExpander(LayerState().Clip(), *effect2); + auto chunk2 = Chunk( + PropertyTreeState(LayerState().Transform(), *clip_expander, *effect2)); // Chunk3 has a different effect which inherits from chunk2's effect. // Should use the slow path. auto effect3 = CreateOpacityEffect(*effect2, 1.f); - auto chunk3 = Chunk(PropertyTreeState(LayerState().Transform(), - LayerState().Clip(), *effect3)); + auto chunk3 = Chunk( + PropertyTreeState(LayerState().Transform(), *clip_expander, *effect3)); // Chunk4 has an opacity filter effect which inherits from the layer's effect. // Should use the fast path.
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc index 9c7e54bb..d239989 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc
@@ -4749,8 +4749,7 @@ filter_op.AppendBlurFilter(5); auto filter = CreateFilterEffect(e0(), filter_op, CompositingReason::kWillChangeFilter); - auto clip_expander = ClipPaintPropertyNode::Create( - c0(), ClipPaintPropertyNode::State(&t0(), filter.get())); + auto clip_expander = CreatePixelMovingFilterClipExpander(c0(), *filter); Update(TestPaintArtifact() .Chunk(t0(), *clip_expander, *filter) @@ -4769,8 +4768,7 @@ CompositorFilterOperations filter_op; filter_op.AppendBlurFilter(5); auto filter = CreateFilterEffect(e0(), filter_op); - auto clip_expander = ClipPaintPropertyNode::Create( - c0(), ClipPaintPropertyNode::State(&t0(), filter.get())); + auto clip_expander = CreatePixelMovingFilterClipExpander(c0(), *filter); EffectPaintPropertyNode::State mask_state; mask_state.local_transform_space = &t0();
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc index 8dcda12..5179e52 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc
@@ -374,11 +374,14 @@ // This should never happen unless the DCHECK in step 1 failed. if (!clip) break; - pending_clips.push_back(clip); + if (!clip->PixelMovingFilter()) + pending_clips.push_back(clip); } + if (pending_clips.IsEmpty()) + return; + // Step 3: Now apply the list of clips in top-down order. - DCHECK(pending_clips.size()); auto pending_combined_clip_rect = pending_clips.back()->PaintClipRect(); const auto* lowest_combined_clip_node = pending_clips.back(); for (auto i = pending_clips.size() - 1; i--;) {
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer_test.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer_test.cc index 442cad6..3ba9947 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer_test.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer_test.cc
@@ -1273,8 +1273,9 @@ filter.SetReferenceBox(gfx::RectF(11, 22, 33, 44)); ASSERT_TRUE(filter.HasReferenceFilter()); auto e1 = CreateFilterEffect(e0(), t0(), &c0(), filter); + auto clip_expander = CreatePixelMovingFilterClipExpander(c0(), *e1); TestChunks chunks; - chunks.AddChunk(t0(), c0(), *e1, gfx::Rect(5, 10, 200, 300), + chunks.AddChunk(t0(), *clip_expander, *e1, gfx::Rect(5, 10, 200, 300), gfx::Rect(10, 15, 20, 30)); auto cc_list = base::MakeRefCounted<cc::DisplayItemList>(
diff --git a/third_party/blink/renderer/platform/graphics/paint/clip_paint_property_node.h b/third_party/blink/renderer/platform/graphics/paint/clip_paint_property_node.h index a23cea4..4814b8b 100644 --- a/third_party/blink/renderer/platform/graphics/paint/clip_paint_property_node.h +++ b/third_party/blink/renderer/platform/graphics/paint/clip_paint_property_node.h
@@ -89,9 +89,9 @@ } State(scoped_refptr<const TransformPaintPropertyNodeOrAlias> local_transform_space, - const EffectPaintPropertyNode* pixel_moving_filter) + const EffectPaintPropertyNode& pixel_moving_filter) : local_transform_space(std::move(local_transform_space)), - pixel_moving_filter(pixel_moving_filter) { + pixel_moving_filter(&pixel_moving_filter) { DCHECK(layout_clip_rect_.IsInfinite()); paint_clip_rect_ = FloatRoundedRect(layout_clip_rect_.Rect()); } @@ -179,6 +179,10 @@ return state_.pixel_moving_filter; } + const ClipPaintPropertyNode* NearestPixelMovingFilterClip() const { + return GetClipCache().NearestPixelMovingFilterClip(); + } + std::unique_ptr<JSONObject> ToJSON() const; private: @@ -203,20 +207,18 @@ // For access to GetClipCache(); friend class GeometryMapper; + friend class GeometryMapperClipCache; friend class GeometryMapperTest; GeometryMapperClipCache& GetClipCache() const { - return const_cast<ClipPaintPropertyNode*>(this)->GetClipCache(); - } - - GeometryMapperClipCache& GetClipCache() { if (!clip_cache_) - clip_cache_.reset(new GeometryMapperClipCache()); - return *clip_cache_.get(); + clip_cache_ = std::make_unique<GeometryMapperClipCache>(); + clip_cache_->UpdateIfNeeded(*this); + return *clip_cache_; } State state_; - std::unique_ptr<GeometryMapperClipCache> clip_cache_; + mutable std::unique_ptr<GeometryMapperClipCache> clip_cache_; }; } // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.cc b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.cc index 81396d1..137f047 100644 --- a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.cc +++ b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.cc
@@ -207,15 +207,75 @@ FloatClipRect& rect_to_map, OverlayScrollbarClipBehavior clip_behavior, InclusiveIntersectOrNot inclusive_behavior) { - if (local_state == ancestor_state) - return true; + // Many effects (e.g. filters, clip-paths) can make a clip rect not tight. + if (&local_state.Effect() != &ancestor_state.Effect()) + rect_to_map.ClearIsTight(); - if (&local_state.Effect() != &ancestor_state.Effect()) { - return SlowLocalToAncestorVisualRectWithEffects<for_compositing_overlap>( - local_state, ancestor_state, rect_to_map, clip_behavior, - inclusive_behavior); + // The transform tree and the clip tree contain all information needed for + // visual rect mapping. Pixel-moving filters should have corresponding + // pixel-moving filter clip expanders in the clip tree. + if (&local_state.Transform() == &ancestor_state.Transform() && + &local_state.Clip() == &ancestor_state.Clip()) { + return true; } + PropertyTreeState last_state = local_state; + const auto* ancestor_filter_clip = + ancestor_state.Clip().NearestPixelMovingFilterClip(); + const auto* filter_clip = local_state.Clip().NearestPixelMovingFilterClip(); + while (filter_clip != ancestor_filter_clip) { + if (!filter_clip) { + // Abnormal clip hierarchy. + rect_to_map = InfiniteLooseFloatClipRect(); + return true; + } + + PropertyTreeState new_state(filter_clip->LocalTransformSpace().Unalias(), + *filter_clip, last_state.Effect()); + const auto* filter = filter_clip->PixelMovingFilter(); + DCHECK(filter); + DCHECK_EQ(&filter->LocalTransformSpace().Unalias(), &new_state.Transform()); + if (for_compositing_overlap == ForCompositingOverlap::kYes && + filter->HasActiveFilterAnimation()) { + // Assume during the animation the filter can map |rect_to_map| to + // anywhere. Ancestor clips will still apply. + // TODO(crbug.com/1026653): Use animation bounds instead of infinite rect. + rect_to_map = InfiniteLooseFloatClipRect(); + } else { + bool intersects = + LocalToAncestorVisualRectUnderSameFilterClip<for_compositing_overlap>( + last_state, new_state, rect_to_map, clip_behavior, + inclusive_behavior); + if (!intersects) { + rect_to_map = FloatClipRect(gfx::RectF()); + return false; + } + if (!rect_to_map.IsInfinite()) + rect_to_map.Rect() = filter->MapRect(rect_to_map.Rect()); + } + + last_state = new_state; + const auto* next_clip = filter_clip->UnaliasedParent(); + DCHECK(next_clip); + last_state.SetClip(*next_clip); + filter_clip = next_clip->NearestPixelMovingFilterClip(); + } + + return LocalToAncestorVisualRectUnderSameFilterClip<for_compositing_overlap>( + last_state, ancestor_state, rect_to_map, clip_behavior, + inclusive_behavior); +} + +template <GeometryMapper::ForCompositingOverlap for_compositing_overlap> +bool GeometryMapper::LocalToAncestorVisualRectUnderSameFilterClip( + const PropertyTreeState& local_state, + const PropertyTreeState& ancestor_state, + FloatClipRect& rect_to_map, + OverlayScrollbarClipBehavior clip_behavior, + InclusiveIntersectOrNot inclusive_behavior) { + DCHECK_EQ(local_state.Clip().NearestPixelMovingFilterClip(), + ancestor_state.Clip().NearestPixelMovingFilterClip()); + ExtraProjectionResult extra_result; bool success = false; const auto& translation_2d_or_matrix = SourceToDestinationProjectionInternal( @@ -270,64 +330,6 @@ return !rect_to_map.Rect().IsEmpty(); } -template <GeometryMapper::ForCompositingOverlap for_compositing_overlap> -bool GeometryMapper::SlowLocalToAncestorVisualRectWithEffects( - const PropertyTreeState& local_state, - const PropertyTreeState& ancestor_state, - FloatClipRect& mapping_rect, - OverlayScrollbarClipBehavior clip_behavior, - InclusiveIntersectOrNot inclusive_behavior) { - PropertyTreeState last_transform_and_clip_state( - local_state.Transform(), local_state.Clip(), - EffectPaintPropertyNode::Root()); - - const auto& ancestor_effect = ancestor_state.Effect(); - for (const auto* effect = &local_state.Effect(); - effect && effect != &ancestor_effect; - effect = effect->UnaliasedParent()) { - if (for_compositing_overlap == ForCompositingOverlap::kYes && - effect->HasActiveFilterAnimation()) { - // Assume during the animation the filter can map |rect_to_map| to - // anywhere. Ancestor clips will still apply. - // TODO(crbug.com/1026653): Use animation bounds instead of infinite rect. - mapping_rect = InfiniteLooseFloatClipRect(); - last_transform_and_clip_state.SetTransform( - effect->LocalTransformSpace().Unalias()); - last_transform_and_clip_state.SetClip(effect->OutputClip()->Unalias()); - continue; - } - - if (!effect->HasFilterThatMovesPixels()) - continue; - - PropertyTreeState transform_and_clip_state( - effect->LocalTransformSpace().Unalias(), - effect->OutputClip()->Unalias(), EffectPaintPropertyNode::Root()); - bool intersects = - LocalToAncestorVisualRectInternal<for_compositing_overlap>( - last_transform_and_clip_state, transform_and_clip_state, - mapping_rect, clip_behavior, inclusive_behavior); - if (!intersects) { - mapping_rect = FloatClipRect(gfx::RectF()); - return false; - } - - mapping_rect = FloatClipRect(effect->MapRect(mapping_rect.Rect())); - last_transform_and_clip_state = transform_and_clip_state; - } - - PropertyTreeState final_transform_and_clip_state( - ancestor_state.Transform(), ancestor_state.Clip(), - EffectPaintPropertyNode::Root()); - bool intersects = LocalToAncestorVisualRectInternal<for_compositing_overlap>( - last_transform_and_clip_state, final_transform_and_clip_state, - mapping_rect, clip_behavior, inclusive_behavior); - - // Many effects (e.g. filters, clip-paths) can make a clip rect not tight. - mapping_rect.ClearIsTight(); - return intersects; -} - FloatClipRect GeometryMapper::LocalToAncestorClipRect( const PropertyTreeState& local_state, const PropertyTreeState& ancestor_state,
diff --git a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.h b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.h index cede29b..4250c1fb 100644 --- a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.h +++ b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.h
@@ -280,10 +280,8 @@ OverlayScrollbarClipBehavior, InclusiveIntersectOrNot); - // The return value has the same meaning as that for - // LocalToAncestorVisualRect. template <ForCompositingOverlap> - static bool SlowLocalToAncestorVisualRectWithEffects( + static bool LocalToAncestorVisualRectUnderSameFilterClip( const PropertyTreeState& local_state, const PropertyTreeState& ancestor_state, FloatClipRect& mapping_rect,
diff --git a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_clip_cache.cc b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_clip_cache.cc index 5feb0102..261964b2 100644 --- a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_clip_cache.cc +++ b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_clip_cache.cc
@@ -4,37 +4,44 @@ #include "third_party/blink/renderer/platform/graphics/paint/geometry_mapper_clip_cache.h" +#include "third_party/blink/renderer/platform/graphics/paint/clip_paint_property_node.h" #include "third_party/blink/renderer/platform/graphics/paint/float_clip_rect.h" namespace blink { // All clip caches invalidate themselves by tracking a local cache generation, // and invalidating their cache if their cache generation disagrees with -// s_clipCacheGeneration. -static unsigned g_clip_cache_generation = 0; - -GeometryMapperClipCache::GeometryMapperClipCache() - : cache_generation_(g_clip_cache_generation) {} +// s_global_generation_. +unsigned GeometryMapperClipCache::s_global_generation_ = 1; void GeometryMapperClipCache::ClearCache() { - g_clip_cache_generation++; + s_global_generation_++; } bool GeometryMapperClipCache::IsValid() const { - return cache_generation_ == g_clip_cache_generation; + return cache_generation_ == s_global_generation_; } -void GeometryMapperClipCache::InvalidateCacheIfNeeded() { - if (cache_generation_ != g_clip_cache_generation) { - clip_cache_.clear(); - cache_generation_ = g_clip_cache_generation; +void GeometryMapperClipCache::Update(const ClipPaintPropertyNode& node) { + DCHECK_NE(cache_generation_, s_global_generation_); + cache_generation_ = s_global_generation_; + + clip_cache_.clear(); + + if (node.PixelMovingFilter()) { + nearest_pixel_moving_filter_clip_ = &node; + } else if (const auto* parent = node.UnaliasedParent()) { + nearest_pixel_moving_filter_clip_ = + parent->GetClipCache().nearest_pixel_moving_filter_clip_; + } else { + nearest_pixel_moving_filter_clip_ = nullptr; } } const GeometryMapperClipCache::ClipCacheEntry* GeometryMapperClipCache::GetCachedClip( const ClipAndTransform& clip_and_transform) { - InvalidateCacheIfNeeded(); + DCHECK(IsValid()); for (const auto& entry : clip_cache_) { if (entry.clip_and_transform == clip_and_transform) { return &entry; @@ -44,7 +51,7 @@ } void GeometryMapperClipCache::SetCachedClip(const ClipCacheEntry& entry) { - InvalidateCacheIfNeeded(); + DCHECK(IsValid()); // There should be no existing entry. DCHECK(!GetCachedClip(entry.clip_and_transform)); clip_cache_.push_back(entry);
diff --git a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_clip_cache.h b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_clip_cache.h index bd8454e90..1db60f2e 100644 --- a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_clip_cache.h +++ b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_clip_cache.h
@@ -23,7 +23,7 @@ USING_FAST_MALLOC(GeometryMapperClipCache); public: - GeometryMapperClipCache(); + GeometryMapperClipCache() = default; GeometryMapperClipCache(const GeometryMapperClipCache&) = delete; GeometryMapperClipCache& operator=(const GeometryMapperClipCache&) = delete; @@ -47,21 +47,28 @@ } }; + void UpdateIfNeeded(const ClipPaintPropertyNode& node) { + if (cache_generation_ != s_global_generation_) + Update(node); + DCHECK_EQ(cache_generation_, s_global_generation_); + } + struct ClipCacheEntry { const ClipAndTransform clip_and_transform; // The clip visual rect of the associated clip node in the space of // |clip_and_transform|. const FloatClipRect clip_rect; + // Whether there is any transform animation between the transform space - // of the associated clip node and |clip_and_transform|. + // of the associated clip node (inclusive) and |clip_and_transform| + // (exclusive). const bool has_transform_animation = false; // Similarly, for sticky transform. const bool has_sticky_transform = false; }; - // Returns the clip visual rect of the owning - // clip of |this| in the space of |ancestors|, if there is one cached. - // Otherwise returns null. + // Returns the clip visual rect of the owning clip of |this| in the space of + // |ancestors|, if there is one cached. Otherwise returns null. const ClipCacheEntry* GetCachedClip(const ClipAndTransform& ancestors); // Stores cached the "clip visual rect" of |this| in the space of |ancestors|, @@ -71,11 +78,19 @@ static void ClearCache(); bool IsValid() const; + const ClipPaintPropertyNode* NearestPixelMovingFilterClip() const { + return nearest_pixel_moving_filter_clip_; + } + private: - void InvalidateCacheIfNeeded(); + void Update(const ClipPaintPropertyNode&); Vector<ClipCacheEntry> clip_cache_; - unsigned cache_generation_; + // The nearest ancestor that has non-null PixelMovingFilter(). + const ClipPaintPropertyNode* nearest_pixel_moving_filter_clip_ = nullptr; + + unsigned cache_generation_ = s_global_generation_ - 1; + static unsigned s_global_generation_; }; } // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_test.cc b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_test.cc index 8584f68..8c69431 100644 --- a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_test.cc +++ b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_test.cc
@@ -879,33 +879,35 @@ // This clip is between transformAboveEffect and the effect. auto clip_above_effect = CreateClip(c0(), *transform_above_effect, FloatRoundedRect(-100, -100, 200, 200)); - // This clip is between the effect and transformBelowEffect. - auto clip_below_effect = - CreateClip(*clip_above_effect, *transform_above_effect, - FloatRoundedRect(10, 10, 100, 100)); CompositorFilterOperations filters; filters.AppendBlurFilter(20); auto effect = CreateFilterEffect(e0(), *transform_above_effect, clip_above_effect.get(), filters); + auto clip_expander = + CreatePixelMovingFilterClipExpander(*clip_above_effect, *effect); + + // This clip is between the effect and transform_below_effect. + auto clip_below_effect = CreateClip(*clip_expander, *transform_above_effect, + FloatRoundedRect(10, 10, 100, 100)); local_state = PropertyTreeState(*transform_below_effect, *clip_below_effect, *effect); input_rect = gfx::RectF(0, 0, 100, 100); - // 1. transformBelowEffect + // 1. transform_below_effect auto output = input_rect; output.Offset(transform_below_effect->Translation2D()); - // 2. clipBelowEffect + // 2. clip_below_effect output.Intersect(clip_below_effect->LayoutClipRect().Rect()); EXPECT_EQ(gfx::RectF(20, 30, 90, 80), output); // 3. effect (the outset is 3 times of blur amount). output = filters.MapRect(output); EXPECT_EQ(gfx::RectF(-40, -30, 210, 200), output); - // 4. clipAboveEffect + // 4. clip_above_effect output.Intersect(clip_above_effect->LayoutClipRect().Rect()); EXPECT_EQ(gfx::RectF(-40, -30, 140, 130), output); - // 5. transformAboveEffect + // 5. transform_above_effect output.Offset(transform_above_effect->Translation2D()); EXPECT_EQ(gfx::RectF(0, 20, 140, 130), output); @@ -928,17 +930,19 @@ // This clip is between transformAboveEffect and the effect. auto clip_above_effect = CreateClip(c0(), *transform_above_effect, FloatRoundedRect(-100, -100, 200, 200)); - // This clip is between the effect and transformBelowEffect. - auto clip_below_effect = - CreateClip(*clip_above_effect, *transform_above_effect, - FloatRoundedRect(10, 10, 100, 100)); CompositorFilterOperations filters; filters.AppendBlurFilter(20); auto real_effect = CreateFilterEffect(e0(), *transform_above_effect, clip_above_effect.get(), filters); + auto clip_expander = + CreatePixelMovingFilterClipExpander(*clip_above_effect, *real_effect); auto effect = EffectPaintPropertyNodeAlias::Create(*real_effect); + // This clip is between the effect and transformBelowEffect. + auto clip_below_effect = CreateClip(*clip_expander, *transform_above_effect, + FloatRoundedRect(10, 10, 100, 100)); + local_state = PropertyTreeStateOrAlias(*transform_below_effect, *clip_below_effect, *effect); @@ -975,7 +979,10 @@ auto clip1 = CreateClip(c0(), t0(), FloatRoundedRect(10, 10, 200, 200)); auto effect = CreateAnimatingFilterEffect(e0(), CompositorFilterOperations(), clip1.get()); - auto clip2 = CreateClip(*clip1, t0(), FloatRoundedRect(50, 0, 200, 50)); + auto clip_expander = CreatePixelMovingFilterClipExpander(*clip1, *effect); + + auto clip2 = + CreateClip(*clip_expander, t0(), FloatRoundedRect(50, 0, 200, 50)); local_state.SetClip(*clip2); local_state.SetEffect(*effect); @@ -1003,13 +1010,17 @@ filters.AppendReferenceFilter(paint_filter_builder::BuildBoxReflectFilter( BoxReflection(BoxReflection::kHorizontalReflection, 0), nullptr)); auto effect = CreateFilterEffect(e0(), filters); + auto clip_expander = CreatePixelMovingFilterClipExpander(c0(), *effect); + local_state.SetEffect(*effect); + local_state.SetClip(*clip_expander); input_rect = gfx::RectF(100, 100, 50, 50); expected_transformed_rect = input_rect; // Reflection is at (50, 100, 50, 50). expected_visual_rect = FloatClipRect(gfx::RectF(-150, 100, 300, 50)); expected_visual_rect.ClearIsTight(); + expected_clip.ClearIsTight(); CheckMappings(); }
diff --git a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_transform_cache.cc b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_transform_cache.cc index ab4ed345f..c98a1c9 100644 --- a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_transform_cache.cc +++ b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_transform_cache.cc
@@ -13,7 +13,7 @@ // All transform caches invalidate themselves by tracking a local cache // generation, and invalidating their cache if their cache generation disagrees // with s_global_generation. -unsigned GeometryMapperTransformCache::s_global_generation; +unsigned GeometryMapperTransformCache::s_global_generation = 1; void GeometryMapperTransformCache::ClearCache() { s_global_generation++;
diff --git a/third_party/blink/renderer/platform/graphics/paint/raster_invalidator_test.cc b/third_party/blink/renderer/platform/graphics/paint/raster_invalidator_test.cc index 093a875..1e31bda4 100644 --- a/third_party/blink/renderer/platform/graphics/paint/raster_invalidator_test.cc +++ b/third_party/blink/renderer/platform/graphics/paint/raster_invalidator_test.cc
@@ -805,10 +805,13 @@ CompositorFilterOperations filter; filter.AppendBlurFilter(20); auto e1 = CreateFilterEffect(e0(), *t1, &c0(), filter); + auto clip_expander = CreatePixelMovingFilterClipExpander(c0(), *e1); PropertyTreeState layer_state = DefaultPropertyTreeState(); - PaintChunkSubset chunks( - TestPaintArtifact().Chunk(0).Properties(*t2, c0(), *e1).Build()); + PaintChunkSubset chunks(TestPaintArtifact() + .Chunk(0) + .Properties(*t2, *clip_expander, *e1) + .Build()); invalidator_.Generate(base::DoNothing(), chunks, kDefaultLayerOffset, kDefaultLayerBounds, layer_state);
diff --git a/third_party/blink/renderer/platform/graphics/paint/transform_paint_property_node.h b/third_party/blink/renderer/platform/graphics/paint/transform_paint_property_node.h index 0717a03..0a09a2d 100644 --- a/third_party/blink/renderer/platform/graphics/paint/transform_paint_property_node.h +++ b/third_party/blink/renderer/platform/graphics/paint/transform_paint_property_node.h
@@ -483,7 +483,7 @@ const GeometryMapperTransformCache& GetTransformCache() const { if (!transform_cache_) - transform_cache_.reset(new GeometryMapperTransformCache); + transform_cache_ = std::make_unique<GeometryMapperTransformCache>(); transform_cache_->UpdateIfNeeded(*this); return *transform_cache_; }
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h index 8611ea4..750f472 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h +++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h
@@ -279,6 +279,9 @@ void LoosenLoadThrottlingPolicy() { scheduler_->LoosenThrottlingPolicy(); } + void StartBatch() { scheduler_->StartBatch(); } + void EndBatch() { scheduler_->EndBatch(); } + // Workaround for https://crbug.com/666214. // TODO(hiroshige): Remove this hack. void EmulateLoadStartedForInspector(Resource*,
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.cc b/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.cc index ea79b44..db0d376 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.cc
@@ -22,6 +22,7 @@ #include "third_party/blink/renderer/platform/loader/fetch/loading_behavior_observer.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher_properties.h" #include "third_party/blink/renderer/platform/network/network_state_notifier.h" +#include "third_party/blink/renderer/platform/runtime_enabled_features.h" #include "third_party/blink/renderer/platform/scheduler/public/aggregated_metric_reporter.h" #include "third_party/blink/renderer/platform/scheduler/public/frame_status.h" #include "third_party/blink/renderer/platform/wtf/functional.h" @@ -173,7 +174,14 @@ // Remember the ClientId since MaybeRun() below may destruct the caller // instance and |id| may be inaccessible after the call. - MaybeRun(); + // Don't run if we are still batching fetch requests. + + // MaybeRun() will get called directly at the end of the batch if a batch + // operation is active. + if (0 == pending_batch_operations_ || + !RuntimeEnabledFeatures::BatchFetchRequestsEnabled()) { + MaybeRun(); + } } void ResourceLoadScheduler::SetPriority(ClientId client_id, @@ -474,6 +482,19 @@ MaybeRun(); } +void ResourceLoadScheduler::StartBatch() { + pending_batch_operations_++; +} + +void ResourceLoadScheduler::EndBatch() { + DCHECK_NE(0U, pending_batch_operations_); + + pending_batch_operations_--; + if (0 == pending_batch_operations_) { + MaybeRun(); + } +} + bool ResourceLoadScheduler::CanRequestForMultiplexedConnectionsInTight() const { // `kDelayLowPriorityRequestAccordingToNetworkState` will be triggered // practically iff it's in the tight mode and the value of RTT is less than
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.h b/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.h index 84b56d6..a1c7d9d4f 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.h +++ b/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.h
@@ -241,6 +241,15 @@ void SetConnectionInfo(ClientId id, net::HttpResponseInfo::ConnectionInfo connection_info); + // Start accumulating delayable fetches as part of a batch operation. If + // multiple batch operations are nested, they will be ref-counted and only + // released once all of the batches have ended. + void StartBatch(); + + // End the collection of delayable fetches as part of a batch operation. This + // function may initiate new resources loading. + void EndBatch(); + // Sets the HTTP RTT for testing. void SetHttpRttForTesting(base::TimeDelta http_rtt) { http_rtt_for_testing_ = http_rtt; @@ -391,6 +400,9 @@ absl::optional<base::TimeDelta> http_rtt_ = absl::nullopt; absl::optional<base::TimeDelta> http_rtt_for_testing_ = absl::nullopt; + + // The ref count of batch operations to accumulate fetches. + uint32_t pending_batch_operations_ = 0u; }; } // namespace blink
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler_test.cc b/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler_test.cc index b0d96076..8cd080c 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler_test.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler_test.cc
@@ -825,5 +825,124 @@ EXPECT_TRUE(Release(id1)); } +TEST_F(ResourceLoadSchedulerTest, UnbatchedRequestsRunInInsertOrder) { + Scheduler()->OnLifecycleStateChanged( + scheduler::SchedulingLifecycleState::kThrottled); + Scheduler()->SetOutstandingLimitForTesting(2, 5); + + MockClient::MockClientDelegate delegate; + + // Push two requests. + MockClient* client1 = MakeGarbageCollected<MockClient>(); + MockClient* client2 = MakeGarbageCollected<MockClient>(); + + client1->SetDelegate(&delegate); + client2->SetDelegate(&delegate); + + ResourceLoadScheduler::ClientId id1 = ResourceLoadScheduler::kInvalidClientId; + Scheduler()->Request(client1, ThrottleOption::kThrottleable, + ResourceLoadPriority::kLowest, 10 /* intra_priority */, + &id1); + EXPECT_NE(ResourceLoadScheduler::kInvalidClientId, id1); + + ResourceLoadScheduler::ClientId id2 = ResourceLoadScheduler::kInvalidClientId; + Scheduler()->Request(client2, ThrottleOption::kThrottleable, + ResourceLoadPriority::kHighest, 1 /* intra_priority */, + &id2); + EXPECT_NE(ResourceLoadScheduler::kInvalidClientId, id2); + + EXPECT_TRUE(client1->WasRun()); + EXPECT_TRUE(client2->WasRun()); + + // Release all. + EXPECT_TRUE(Release(id1)); + EXPECT_TRUE(Release(id2)); + + // Verify low priority request ran first. + auto& order = delegate.client_order(); + EXPECT_EQ(order[0], client1); + EXPECT_EQ(order[1], client2); +} + +TEST_F(ResourceLoadSchedulerTest, BatchedRequestsRunInPriorityOrder) { + Scheduler()->OnLifecycleStateChanged( + scheduler::SchedulingLifecycleState::kThrottled); + Scheduler()->SetOutstandingLimitForTesting(2, 5); + + MockClient::MockClientDelegate delegate; + + Scheduler()->StartBatch(); + + // Push two requests. + MockClient* client1 = MakeGarbageCollected<MockClient>(); + MockClient* client2 = MakeGarbageCollected<MockClient>(); + + client1->SetDelegate(&delegate); + client2->SetDelegate(&delegate); + + ResourceLoadScheduler::ClientId id1 = ResourceLoadScheduler::kInvalidClientId; + Scheduler()->Request(client1, ThrottleOption::kThrottleable, + ResourceLoadPriority::kLowest, 10 /* intra_priority */, + &id1); + EXPECT_NE(ResourceLoadScheduler::kInvalidClientId, id1); + + ResourceLoadScheduler::ClientId id2 = ResourceLoadScheduler::kInvalidClientId; + Scheduler()->Request(client2, ThrottleOption::kThrottleable, + ResourceLoadPriority::kHighest, 1 /* intra_priority */, + &id2); + EXPECT_NE(ResourceLoadScheduler::kInvalidClientId, id2); + + EXPECT_FALSE(client1->WasRun()); + EXPECT_FALSE(client2->WasRun()); + + Scheduler()->EndBatch(); + + EXPECT_TRUE(client1->WasRun()); + EXPECT_TRUE(client2->WasRun()); + + // Release all. + EXPECT_TRUE(Release(id1)); + EXPECT_TRUE(Release(id2)); + + // Verify high priority request ran first. + auto& order = delegate.client_order(); + EXPECT_EQ(order[0], client2); + EXPECT_EQ(order[1], client1); +} + +TEST_F(ResourceLoadSchedulerTest, NestedBatchesAccumulateCorrectly) { + Scheduler()->OnLifecycleStateChanged( + scheduler::SchedulingLifecycleState::kThrottled); + Scheduler()->SetOutstandingLimitForTesting(2, 5); + + MockClient::MockClientDelegate delegate; + + // Create 2 nested batches + Scheduler()->StartBatch(); + Scheduler()->StartBatch(); + + MockClient* client1 = MakeGarbageCollected<MockClient>(); + client1->SetDelegate(&delegate); + + ResourceLoadScheduler::ClientId id1 = ResourceLoadScheduler::kInvalidClientId; + Scheduler()->Request(client1, ThrottleOption::kThrottleable, + ResourceLoadPriority::kLowest, 10 /* intra_priority */, + &id1); + EXPECT_NE(ResourceLoadScheduler::kInvalidClientId, id1); + + EXPECT_FALSE(client1->WasRun()); + + // Exit the inner batch and make sure the requests are not released + Scheduler()->EndBatch(); + EXPECT_FALSE(client1->WasRun()); + + // Exit the outer batch and verify that the requests are no longer accumulated + Scheduler()->EndBatch(); + EXPECT_TRUE(client1->WasRun()); + + // Release all. + EXPECT_TRUE(Release(id1)); +} + } // namespace } // namespace blink
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 787a85a..3c21c752 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -261,6 +261,10 @@ }, }, { + name: "BatchFetchRequests", + status: "test", + }, + { // https://github.com/WICG/display-locking/blob/master/explainer-beforematch.md name: "BeforeMatchEvent", origin_trial_feature_name: "BeforeMatchEvent",
diff --git a/third_party/blink/renderer/platform/scheduler/common/web_thread_scheduler.cc b/third_party/blink/renderer/platform/scheduler/common/web_thread_scheduler.cc index fd4305c5..3bea2e3 100644 --- a/third_party/blink/renderer/platform/scheduler/common/web_thread_scheduler.cc +++ b/third_party/blink/renderer/platform/scheduler/common/web_thread_scheduler.cc
@@ -76,11 +76,6 @@ } #endif // BUILDFLAG(IS_ANDROID) -void WebThreadScheduler::SetTopLevelBlameContext( - base::trace_event::BlameContext* blame_context) { - NOTREACHED(); -} - void WebThreadScheduler::SetRendererProcessType(WebRendererProcessType type) { NOTREACHED(); }
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc index de734e4..ba10c19 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
@@ -2060,24 +2060,6 @@ UpdatePolicyLocked(UpdateType::kMayEarlyOutIfPolicyUnchanged); } -void MainThreadSchedulerImpl::SetTopLevelBlameContext( - base::trace_event::BlameContext* blame_context) { - // Any task that runs in the default task runners belongs to the context of - // all frames (as opposed to a particular frame). Note that the task itself - // may still enter a more specific blame context if necessary. - // - // Per-frame task runners (loading, timers, etc.) are configured with a more - // specific blame context by FrameSchedulerImpl. - // - // TODO(altimin): automatically enter top-level for all task queues associated - // with renderer scheduler which do not have a corresponding frame. - control_task_queue_->SetBlameContext(blame_context); - DefaultTaskQueue()->SetBlameContext(blame_context); - compositor_task_queue_->SetBlameContext(blame_context); - idle_helper_.IdleTaskRunner()->SetBlameContext(blame_context); - v8_task_queue_->SetBlameContext(blame_context); -} - void MainThreadSchedulerImpl::AddRAILModeObserver(RAILModeObserver* observer) { main_thread_only().rail_mode_observers.AddObserver(observer); observer->OnRAILModeChanged(main_thread_only().current_policy.rail_mode());
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h index 9a08cdcf..cf3cd823 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h
@@ -186,8 +186,6 @@ void AddTaskObserver(base::TaskObserver* task_observer) override; void RemoveTaskObserver(base::TaskObserver* task_observer) override; void Shutdown() override; - void SetTopLevelBlameContext( - base::trace_event::BlameContext* blame_context) override; void AddRAILModeObserver(RAILModeObserver* observer) override; void RemoveRAILModeObserver(RAILModeObserver const* observer) override; void SetRendererProcessType(WebRendererProcessType type) override;
diff --git a/third_party/blink/renderer/platform/scheduler/test/web_fake_thread_scheduler.cc b/third_party/blink/renderer/platform/scheduler/test/web_fake_thread_scheduler.cc index d0700747..3fdb625 100644 --- a/third_party/blink/renderer/platform/scheduler/test/web_fake_thread_scheduler.cc +++ b/third_party/blink/renderer/platform/scheduler/test/web_fake_thread_scheduler.cc
@@ -49,9 +49,6 @@ void WebFakeThreadScheduler::Shutdown() {} -void WebFakeThreadScheduler::SetTopLevelBlameContext( - base::trace_event::BlameContext* blame_context) {} - void WebFakeThreadScheduler::SetRendererProcessType( WebRendererProcessType type) {}
diff --git a/third_party/blink/renderer/platform/testing/paint_property_test_helpers.h b/third_party/blink/renderer/platform/testing/paint_property_test_helpers.h index befe7ef..c3a68431 100644 --- a/third_party/blink/renderer/platform/testing/paint_property_test_helpers.h +++ b/third_party/blink/renderer/platform/testing/paint_property_test_helpers.h
@@ -180,6 +180,14 @@ return CreateClip(parent, local_transform_space, clip_rect.Rect(), clip_rect); } +inline scoped_refptr<ClipPaintPropertyNode> CreatePixelMovingFilterClipExpander( + const ClipPaintPropertyNodeOrAlias& parent, + const EffectPaintPropertyNode& pixel_moving_filter) { + ClipPaintPropertyNode::State state(&pixel_moving_filter.LocalTransformSpace(), + pixel_moving_filter); + return ClipPaintPropertyNode::Create(parent, std::move(state)); +} + inline void UpdateClip(ClipPaintPropertyNode& clip, const gfx::RectF& layout_clip_rect, const FloatRoundedRect& paint_clip_rect) {
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 33e44ff..e7673a0 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -1037,6 +1037,7 @@ crbug.com/1299442 [ Mac11 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/geometry-background-image-002.https.html [ Failure ] crbug.com/1299442 [ Mac10.15 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/registered-property-value-006.https.html [ Failure ] crbug.com/1299442 [ Mac11 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/registered-property-value-006.https.html [ Failure ] +crbug.com/1299442 [ Mac10.15 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/background-image-multiple.https.html [ Failure ] # ====== Paint team owned tests to here ====== @@ -3368,7 +3369,6 @@ crbug.com/626703 [ Win ] virtual/partitioned-cookies/http/tests/inspector-protocol/network/disabled-cache-navigation.js [ Failure ] # ====== New tests from wpt-importer added here ====== -crbug.com/626703 [ Mac10.15 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/background-image-multiple.https.html [ Failure ] crbug.com/626703 [ Mac10.15 ] external/wpt/fullscreen/api/document-fullscreen-enabled-cross-origin.sub.html [ Timeout ] crbug.com/626703 [ Win10.20h2 ] virtual/attribution-reporting-debug-mode/wpt_internal/attribution-reporting/debug-key.sub.https.html?include=trigger [ Failure Timeout ] crbug.com/626703 [ Mac11 ] virtual/attribution-reporting-debug-mode/wpt_internal/attribution-reporting/source-registration.sub.https.html?method=img&eligible [ Timeout ] @@ -7065,3 +7065,6 @@ # Flaky timeouts on WebKit Linux MSAN crbug.com/1218100 [ Linux ] external/wpt/IndexedDB/idb-partitioned-coverage.tentative.sub.html [ Pass Timeout ] + +# Sheriff 2022-08-03 +crbug.com/1349910 [ Mac ] external/wpt/html/semantics/popups/popup-hover-hide.tentative.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/external/wpt/accessibility/crashtests/object-with-unrendered-text-fallback.html b/third_party/blink/web_tests/external/wpt/accessibility/crashtests/object-with-unrendered-text-fallback.html new file mode 100644 index 0000000..0128213 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/accessibility/crashtests/object-with-unrendered-text-fallback.html
@@ -0,0 +1,11 @@ +<!DOCTYPE html> +<style> +caption:first-letter { color: red; } +</style> + +<object> + <table> + <caption dir="rtl">)))XX?</caption> + </table> +</object> +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/replaced-element-003.html b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/replaced-element-003.html index 83187fc..306976a 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/replaced-element-003.html +++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/replaced-element-003.html
@@ -5,7 +5,7 @@ <link rel="match" href="../../reference/ref-filled-green-100px-square.xht" /> <!-- The pixel values from the video can be slightly different; allow for fuzzy matching. --> -<meta name="fuzzy" content="0-3;0-5000"> +<meta name="fuzzy" content="0-30;0-5000"> <p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
diff --git a/third_party/blink/web_tests/external/wpt/html/interaction/focus/the-autofocus-attribute/autofocus-dialog.html b/third_party/blink/web_tests/external/wpt/html/interaction/focus/the-autofocus-attribute/autofocus-dialog.html new file mode 100644 index 0000000..08a0913 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/interaction/focus/the-autofocus-attribute/autofocus-dialog.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#the-autofocus-attribute"> +<link rel='author' href='mailto:masonf@chromium.org'> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/utils.js"></script> + +<body> +<script> +promise_test(async t => { + let w = window.open('/common/blank.html'); + await waitForLoad(w); + t.add_cleanup(() => { w.close(); }); + w.document.body.innerHTML = '<dialog><div tabindex=0 autofocus></dialog><input autofocus>'; + await waitUntilStableAutofocusState(w); + assert_equals(w.document.activeElement.tagName, 'INPUT'); +}, '<dialog> can contain autofocus, without stopping page autofocus content from working'); + +promise_test(async t => { + let w = window.open('/common/blank.html'); + await waitForLoad(w); + t.add_cleanup(() => { w.close(); }); + w.document.body.innerHTML = '<dialog><div tabindex=0 autofocus></dialog><input autofocus>'; + await waitUntilStableAutofocusState(w); + w.document.querySelector('dialog').show(); + assert_equals(w.document.activeElement.tagName, 'DIV'); +}, '<dialog>-contained autofocus element gets focused when the dialog is shown'); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-light-dismiss.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-light-dismiss.tentative.html index 2e94eed..75539b0 100644 --- a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-light-dismiss.tentative.html +++ b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-light-dismiss.tentative.html
@@ -17,7 +17,7 @@ <span id=outside>Outside all popups</span> <div popup id=p1 anchor=p1anchor> <span id=inside1>Inside popup 1</span> - <button id=b2 popuptoggletarget='p2'>Popup 2</button> + <button id=b2 popupshowtarget='p2'>Popup 2</button> <span id=inside1after>Inside popup 1 after button</span> </div> <div popup id=p2 anchor=b2> @@ -38,6 +38,7 @@ const button1show = document.querySelector('#b1s'); const popup1anchor = document.querySelector('#p1anchor'); const inside1After = document.querySelector('#inside1after'); + const button2 = document.querySelector('#b2'); const popup2 = document.querySelector('#p2'); const outside = document.querySelector('#outside'); const inside1 = document.querySelector('#inside1'); @@ -128,6 +129,35 @@ },'Clicking on invoking element, after using it for activation, shouldn\'t close its popup'); promise_test(async () => { + popup1.showPopUp(); + assert_true(popup1.matches(':top-layer')); + assert_false(popup2.matches(':top-layer')); + await clickOn(button2); + assert_true(popup2.matches(':top-layer'),'button2 should activate popup2'); + p2HideCount = popup2HideCount; + await clickOn(button2); + assert_true(popup2.matches(':top-layer'),'popup2 should stay open'); + assert_equals(popup2HideCount,p2HideCount,'popup2 should not get hidden and reshown'); + popup1.hidePopUp(); // Cleanup + assert_false(popup1.matches(':top-layer')); + assert_false(popup2.matches(':top-layer')); + },'Clicking on invoking element, after using it for activation, shouldn\'t close its popup (nested case)'); + + promise_test(async () => { + popup1.showPopUp(); + popup2.showPopUp(); + assert_true(popup1.matches(':top-layer')); + assert_true(popup2.matches(':top-layer')); + p2HideCount = popup2HideCount; + await clickOn(button2); + assert_true(popup2.matches(':top-layer'),'popup2 should stay open'); + assert_equals(popup2HideCount,p2HideCount,'popup2 should not get hidden and reshown'); + popup1.hidePopUp(); // Cleanup + assert_false(popup1.matches(':top-layer')); + assert_false(popup2.matches(':top-layer')); + },'Clicking on invoking element, after using it for activation, shouldn\'t close its popup (nested case, not used for invocation)'); + + promise_test(async () => { popup1.showPopUp(); // Directly show the popup assert_true(popup1.matches(':top-layer')); await waitForRender();
diff --git a/third_party/blink/web_tests/external/wpt/largest-contentful-paint/observe-css-generated-text.html b/third_party/blink/web_tests/external/wpt/largest-contentful-paint/observe-css-generated-text.html index 529e8ecc..4869f42 100644 --- a/third_party/blink/web_tests/external/wpt/largest-contentful-paint/observe-css-generated-text.html +++ b/third_party/blink/web_tests/external/wpt/largest-contentful-paint/observe-css-generated-text.html
@@ -45,13 +45,17 @@ // and 100px across based on font size and text length. const elemSizeLowerBound = 1200; promise_test(t => { - return new Promise(resolve => { + return new Promise((resolve, reject) => { assert_implements(window.LargestContentfulPaint, "LargestContentfulPaint is not implemented"); const observer = new PerformanceObserver(resolve); observer.observe({ type: 'largest-contentful-paint' }); beforeRender = performance.now(); document.body.appendChild(element); + + step_timeout(() => { + reject(new Error('timeout, LCP candidate not detected')); + }, 1000) }).then(entryList => { assert_equals(entryList.getEntries().length, 1); const entry = entryList.getEntries()[0]; @@ -72,9 +76,12 @@ runTest(cssGeneratedTextAttrElem, "Text generated with CSS using content:attr() is observable as a LargestContentfulPaint candidate"); + const cssGeneratedTextAttrInlineElemBlockWrapper = document.createElement('div'); + cssGeneratedTextAttrInlineElemBlockWrapper.id = 'css-generated-text-inline-elem-block-wrapper'; const cssGeneratedTextInlineElem = document.createElement('span'); cssGeneratedTextInlineElem.id = 'css-generated-text-inline-elem'; - runTest(cssGeneratedTextInlineElem, + cssGeneratedTextAttrInlineElemBlockWrapper.appendChild(cssGeneratedTextInlineElem); + runTest(cssGeneratedTextAttrInlineElemBlockWrapper, "CSS generated text on a inline element is observable as a LargestContentfulPaint candidate"); </script> -</body> \ No newline at end of file +</body>
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/largest-contentful-paint/observe-css-generated-text-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/largest-contentful-paint/observe-css-generated-text-expected.txt deleted file mode 100644 index 6f2d7add7..0000000 --- a/third_party/blink/web_tests/platform/generic/external/wpt/largest-contentful-paint/observe-css-generated-text-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -PASS CSS generated text is observable as a LargestContentfulPaint candidate -PASS Text generated with CSS using content:attr() is observable as a LargestContentfulPaint candidate -FAIL CSS generated text on a inline element is observable as a LargestContentfulPaint candidate assert_equals: ID should match expected ID expected "css-generated-text-inline-elem" but got "" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/document-referrer.https.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/document-referrer.https.html index fadaf625..2bbc319 100644 --- a/third_party/blink/web_tests/wpt_internal/fenced_frame/document-referrer.https.html +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/document-referrer.https.html
@@ -41,7 +41,11 @@ // Test a top-level fenced frame after it navigates itself. // Navigate the fenced frame. (Refresh it, so we can still send it scripts.) - await fenced_frame.execute(() => { location.href = location.href; }); + await fenced_frame.execute(() => { + window.executor.suspend(() => { + location.href = location.href; + }); + }); // Check that it now sees its original URL as the referrer. await fenced_frame.execute((expected_referrer) => {
diff --git a/third_party/nearby/README.chromium b/third_party/nearby/README.chromium index 47871ffe..18b19f6f 100644 --- a/third_party/nearby/README.chromium +++ b/third_party/nearby/README.chromium
@@ -1,7 +1,7 @@ Name: Nearby Connections Library Short Name: Nearby URL: https://github.com/google/nearby -Version: 0d4964da7babe0a0ae01cd4950c5215dbd7dd8d1 +Version: a732616a979b6761100dd53949eed4fc4070a93f License: Apache 2.0 License File: LICENSE Security Critical: yes
diff --git a/third_party/updater/chromium_mac_amd64/3pp/fetch.py b/third_party/updater/chromium_mac_amd64/3pp/fetch.py index 1f3708a3..0ba0820 100755 --- a/third_party/updater/chromium_mac_amd64/3pp/fetch.py +++ b/third_party/updater/chromium_mac_amd64/3pp/fetch.py
@@ -67,16 +67,14 @@ def lastDatum(platform): """ - Returns a version from GCS that is at least k versions old, and only - updates every n versions. - """ + Returns a version from GCS that only updates every n versions. + """ latest = int( urllib.request.urlopen( 'https://storage.googleapis.com/storage/v1/b/' 'chromium-browser-snapshots/o/%s%%2FLAST_CHANGE?alt=media' % platform).read()) - min_datum = latest - 3000 - min_datum -= min_datum % 10000 - return max(MIN_VERSION, find(platform, min_datum, latest)) + return max(MIN_VERSION, + find(platform, latest - latest % 1000, latest)) def print_latest():
diff --git a/third_party/updater/chromium_mac_arm64/3pp/fetch.py b/third_party/updater/chromium_mac_arm64/3pp/fetch.py index 462f695f..6868671 100755 --- a/third_party/updater/chromium_mac_arm64/3pp/fetch.py +++ b/third_party/updater/chromium_mac_arm64/3pp/fetch.py
@@ -67,16 +67,14 @@ def lastDatum(platform): """ - Returns a version from GCS that is at least k versions old, and only - updates every n versions. - """ + Returns a version from GCS that only updates every n versions. + """ latest = int( urllib.request.urlopen( 'https://storage.googleapis.com/storage/v1/b/' 'chromium-browser-snapshots/o/%s%%2FLAST_CHANGE?alt=media' % platform).read()) - min_datum = latest - 3000 - min_datum -= min_datum % 10000 - return max(MIN_VERSION, find(platform, min_datum, latest)) + return max(MIN_VERSION, + find(platform, latest - latest % 1000, latest)) def print_latest():
diff --git a/third_party/updater/chromium_win_x86/3pp/fetch.py b/third_party/updater/chromium_win_x86/3pp/fetch.py index 1092ee0..4a9cab09 100755 --- a/third_party/updater/chromium_win_x86/3pp/fetch.py +++ b/third_party/updater/chromium_win_x86/3pp/fetch.py
@@ -67,16 +67,14 @@ def lastDatum(platform): """ - Returns a version from GCS that is at least k versions old, and only - updates every n versions. - """ + Returns a version from GCS that only updates every n versions. + """ latest = int( urllib.request.urlopen( 'https://storage.googleapis.com/storage/v1/b/' 'chromium-browser-snapshots/o/%s%%2FLAST_CHANGE?alt=media' % platform).read()) - min_datum = latest - 3000 - min_datum -= min_datum % 10000 - return max(MIN_VERSION, find(platform, min_datum, latest)) + return max(MIN_VERSION, + find(platform, latest - latest % 1000, latest)) def print_latest():
diff --git a/third_party/updater/chromium_win_x86_64/3pp/fetch.py b/third_party/updater/chromium_win_x86_64/3pp/fetch.py index 6ea53e32..ae21895 100755 --- a/third_party/updater/chromium_win_x86_64/3pp/fetch.py +++ b/third_party/updater/chromium_win_x86_64/3pp/fetch.py
@@ -67,16 +67,14 @@ def lastDatum(platform): """ - Returns a version from GCS that is at least k versions old, and only - updates every n versions. - """ + Returns a version from GCS that only updates every n versions. + """ latest = int( urllib.request.urlopen( 'https://storage.googleapis.com/storage/v1/b/' 'chromium-browser-snapshots/o/%s%%2FLAST_CHANGE?alt=media' % platform).read()) - min_datum = latest - 3000 - min_datum -= min_datum % 10000 - return max(MIN_VERSION, find(platform, min_datum, latest)) + return max(MIN_VERSION, + find(platform, latest - latest % 1000, latest)) def print_latest():
diff --git a/third_party/widevine/cdm/BUILD.gn b/third_party/widevine/cdm/BUILD.gn index 94d5d07..6ad37b9 100644 --- a/third_party/widevine/cdm/BUILD.gn +++ b/third_party/widevine/cdm/BUILD.gn
@@ -8,10 +8,13 @@ import("//build/config/chromeos/ui_mode.gni") import("//build/config/features.gni") import("//build/toolchain/toolchain.gni") -import("//media/cdm/library_cdm/cdm_paths.gni") import("//media/media_options.gni") import("//third_party/widevine/cdm/widevine.gni") +if (bundle_widevine_cdm) { + import("//media/cdm/library_cdm/cdm_paths.gni") +} + assert(!bundle_widevine_cdm || (enable_widevine && enable_library_cdms)) buildflag_header("buildflags") {
diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_chrome_branded.h b/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_chrome_branded.h index b5d93cf..cd4c08ff 100644 --- a/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_chrome_branded.h +++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_chrome_branded.h
@@ -777,7 +777,7 @@ #if defined(__cplusplus) && !defined(CINTERFACE) - MIDL_INTERFACE("DD42475D-6D46-496a-924E-BD5630B4CBBA") + MIDL_INTERFACE("DD42475D-6D46-496A-924E-BD5630B4CBBA") IAppBundleWeb : public IDispatch { public: @@ -1085,7 +1085,7 @@ #if defined(__cplusplus) && !defined(CINTERFACE) - MIDL_INTERFACE("18D0F672-18B4-48e6-AD36-6E6BF01DBBC4") + MIDL_INTERFACE("18D0F672-18B4-48E6-AD36-6E6BF01DBBC4") IAppWeb : public IDispatch { public: @@ -2514,7 +2514,7 @@ #if defined(__cplusplus) && !defined(CINTERFACE) - MIDL_INTERFACE("128C2DA6-2BC0-44c0-B3F6-4EC22E647964") + MIDL_INTERFACE("128C2DA6-2BC0-44C0-B3F6-4EC22E647964") IProcessLauncher : public IUnknown { public: @@ -2761,7 +2761,7 @@ #ifdef __cplusplus -class DECLSPEC_UUID("22181302-A8A6-4f84-A541-E5CBFC70CC43") +class DECLSPEC_UUID("22181302-A8A6-4F84-A541-E5CBFC70CC43") GoogleUpdate3WebUserClass; #endif @@ -2793,7 +2793,7 @@ #ifdef __cplusplus -class DECLSPEC_UUID("ABC01078-F197-4b0b-ADBC-CFE684B39C82") +class DECLSPEC_UUID("ABC01078-F197-4B0B-ADBC-CFE684B39C82") ProcessLauncherClass; #endif #endif /* __UpdaterLegacyLib_LIBRARY_DEFINED__ */
diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_chrome_branded_i.c b/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_chrome_branded_i.c index 60c84ac..a566237 100644 --- a/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_chrome_branded_i.c +++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_chrome_branded_i.c
@@ -73,10 +73,10 @@ MIDL_DEFINE_GUID(IID, IID_IGoogleUpdate3Web,0x494B20CF,0x282E,0x4BDD,0x9F,0x5D,0xB7,0x0C,0xB0,0x9D,0x35,0x1E); -MIDL_DEFINE_GUID(IID, IID_IAppBundleWeb,0xDD42475D,0x6D46,0x496a,0x92,0x4E,0xBD,0x56,0x30,0xB4,0xCB,0xBA); +MIDL_DEFINE_GUID(IID, IID_IAppBundleWeb,0xDD42475D,0x6D46,0x496A,0x92,0x4E,0xBD,0x56,0x30,0xB4,0xCB,0xBA); -MIDL_DEFINE_GUID(IID, IID_IAppWeb,0x18D0F672,0x18B4,0x48e6,0xAD,0x36,0x6E,0x6B,0xF0,0x1D,0xBB,0xC4); +MIDL_DEFINE_GUID(IID, IID_IAppWeb,0x18D0F672,0x18B4,0x48E6,0xAD,0x36,0x6E,0x6B,0xF0,0x1D,0xBB,0xC4); MIDL_DEFINE_GUID(IID, IID_IAppCommandWeb,0x8476CE12,0xAE1F,0x4198,0x80,0x5C,0xBA,0x0F,0x9B,0x78,0x3F,0x57); @@ -94,7 +94,7 @@ MIDL_DEFINE_GUID(IID, IID_IPolicyStatus3,0x05A30352,0xEB25,0x45B6,0x84,0x49,0xBC,0xA7,0xB0,0x54,0x2C,0xE5); -MIDL_DEFINE_GUID(IID, IID_IProcessLauncher,0x128C2DA6,0x2BC0,0x44c0,0xB3,0xF6,0x4E,0xC2,0x2E,0x64,0x79,0x64); +MIDL_DEFINE_GUID(IID, IID_IProcessLauncher,0x128C2DA6,0x2BC0,0x44C0,0xB3,0xF6,0x4E,0xC2,0x2E,0x64,0x79,0x64); MIDL_DEFINE_GUID(IID, IID_IProcessLauncher2,0xD106AB5F,0xA70E,0x400E,0xA2,0x1B,0x96,0x20,0x8C,0x1D,0x8D,0xBB); @@ -103,7 +103,7 @@ MIDL_DEFINE_GUID(IID, LIBID_UpdaterLegacyLib,0x69464FF0,0xD9EC,0x4037,0xA3,0x5F,0x8A,0xE4,0x35,0x81,0x06,0xCC); -MIDL_DEFINE_GUID(CLSID, CLSID_GoogleUpdate3WebUserClass,0x22181302,0xA8A6,0x4f84,0xA5,0x41,0xE5,0xCB,0xFC,0x70,0xCC,0x43); +MIDL_DEFINE_GUID(CLSID, CLSID_GoogleUpdate3WebUserClass,0x22181302,0xA8A6,0x4F84,0xA5,0x41,0xE5,0xCB,0xFC,0x70,0xCC,0x43); MIDL_DEFINE_GUID(CLSID, CLSID_GoogleUpdate3WebSystemClass,0x8A1D4361,0x2C08,0x4700,0xA3,0x51,0x3E,0xAA,0x9C,0xBF,0xF5,0xE4); @@ -115,7 +115,7 @@ MIDL_DEFINE_GUID(CLSID, CLSID_PolicyStatusSystemClass,0x521FDB42,0x7130,0x4806,0x82,0x2A,0xFC,0x51,0x63,0xFA,0xD9,0x83); -MIDL_DEFINE_GUID(CLSID, CLSID_ProcessLauncherClass,0xABC01078,0xF197,0x4b0b,0xAD,0xBC,0xCF,0xE6,0x84,0xB3,0x9C,0x82); +MIDL_DEFINE_GUID(CLSID, CLSID_ProcessLauncherClass,0xABC01078,0xF197,0x4B0B,0xAD,0xBC,0xCF,0xE6,0x84,0xB3,0x9C,0x82); #undef MIDL_DEFINE_GUID
diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_chrome_branded_p.c b/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_chrome_branded_p.c index d636795..37b0b1d1 100644 --- a/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_chrome_branded_p.c +++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_chrome_branded_p.c
@@ -3987,7 +3987,7 @@ /* Object interface: IAppBundleWeb, ver. 0.0, - GUID={0xDD42475D,0x6D46,0x496a,{0x92,0x4E,0xBD,0x56,0x30,0xB4,0xCB,0xBA}} */ + GUID={0xDD42475D,0x6D46,0x496A,{0x92,0x4E,0xBD,0x56,0x30,0xB4,0xCB,0xBA}} */ #pragma code_seg(".orpc") static const unsigned short IAppBundleWeb_FormatStringOffsetTable[] = @@ -4103,7 +4103,7 @@ /* Object interface: IAppWeb, ver. 0.0, - GUID={0x18D0F672,0x18B4,0x48e6,{0xAD,0x36,0x6E,0x6B,0xF0,0x1D,0xBB,0xC4}} */ + GUID={0x18D0F672,0x18B4,0x48E6,{0xAD,0x36,0x6E,0x6B,0xF0,0x1D,0xBB,0xC4}} */ #pragma code_seg(".orpc") static const unsigned short IAppWeb_FormatStringOffsetTable[] = @@ -4676,7 +4676,7 @@ /* Object interface: IProcessLauncher, ver. 0.0, - GUID={0x128C2DA6,0x2BC0,0x44c0,{0xB3,0xF6,0x4E,0xC2,0x2E,0x64,0x79,0x64}} */ + GUID={0x128C2DA6,0x2BC0,0x44C0,{0xB3,0xF6,0x4E,0xC2,0x2E,0x64,0x79,0x64}} */ #pragma code_seg(".orpc") static const unsigned short IProcessLauncher_FormatStringOffsetTable[] =
diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_chrome_branded.h b/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_chrome_branded.h index c333185..995360a1 100644 --- a/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_chrome_branded.h +++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_chrome_branded.h
@@ -777,7 +777,7 @@ #if defined(__cplusplus) && !defined(CINTERFACE) - MIDL_INTERFACE("DD42475D-6D46-496a-924E-BD5630B4CBBA") + MIDL_INTERFACE("DD42475D-6D46-496A-924E-BD5630B4CBBA") IAppBundleWeb : public IDispatch { public: @@ -1085,7 +1085,7 @@ #if defined(__cplusplus) && !defined(CINTERFACE) - MIDL_INTERFACE("18D0F672-18B4-48e6-AD36-6E6BF01DBBC4") + MIDL_INTERFACE("18D0F672-18B4-48E6-AD36-6E6BF01DBBC4") IAppWeb : public IDispatch { public: @@ -2514,7 +2514,7 @@ #if defined(__cplusplus) && !defined(CINTERFACE) - MIDL_INTERFACE("128C2DA6-2BC0-44c0-B3F6-4EC22E647964") + MIDL_INTERFACE("128C2DA6-2BC0-44C0-B3F6-4EC22E647964") IProcessLauncher : public IUnknown { public: @@ -2761,7 +2761,7 @@ #ifdef __cplusplus -class DECLSPEC_UUID("22181302-A8A6-4f84-A541-E5CBFC70CC43") +class DECLSPEC_UUID("22181302-A8A6-4F84-A541-E5CBFC70CC43") GoogleUpdate3WebUserClass; #endif @@ -2793,7 +2793,7 @@ #ifdef __cplusplus -class DECLSPEC_UUID("ABC01078-F197-4b0b-ADBC-CFE684B39C82") +class DECLSPEC_UUID("ABC01078-F197-4B0B-ADBC-CFE684B39C82") ProcessLauncherClass; #endif #endif /* __UpdaterLegacyLib_LIBRARY_DEFINED__ */
diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_chrome_branded_i.c b/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_chrome_branded_i.c index 2716859..15ee2b9 100644 --- a/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_chrome_branded_i.c +++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_chrome_branded_i.c
@@ -73,10 +73,10 @@ MIDL_DEFINE_GUID(IID, IID_IGoogleUpdate3Web,0x494B20CF,0x282E,0x4BDD,0x9F,0x5D,0xB7,0x0C,0xB0,0x9D,0x35,0x1E); -MIDL_DEFINE_GUID(IID, IID_IAppBundleWeb,0xDD42475D,0x6D46,0x496a,0x92,0x4E,0xBD,0x56,0x30,0xB4,0xCB,0xBA); +MIDL_DEFINE_GUID(IID, IID_IAppBundleWeb,0xDD42475D,0x6D46,0x496A,0x92,0x4E,0xBD,0x56,0x30,0xB4,0xCB,0xBA); -MIDL_DEFINE_GUID(IID, IID_IAppWeb,0x18D0F672,0x18B4,0x48e6,0xAD,0x36,0x6E,0x6B,0xF0,0x1D,0xBB,0xC4); +MIDL_DEFINE_GUID(IID, IID_IAppWeb,0x18D0F672,0x18B4,0x48E6,0xAD,0x36,0x6E,0x6B,0xF0,0x1D,0xBB,0xC4); MIDL_DEFINE_GUID(IID, IID_IAppCommandWeb,0x8476CE12,0xAE1F,0x4198,0x80,0x5C,0xBA,0x0F,0x9B,0x78,0x3F,0x57); @@ -94,7 +94,7 @@ MIDL_DEFINE_GUID(IID, IID_IPolicyStatus3,0x05A30352,0xEB25,0x45B6,0x84,0x49,0xBC,0xA7,0xB0,0x54,0x2C,0xE5); -MIDL_DEFINE_GUID(IID, IID_IProcessLauncher,0x128C2DA6,0x2BC0,0x44c0,0xB3,0xF6,0x4E,0xC2,0x2E,0x64,0x79,0x64); +MIDL_DEFINE_GUID(IID, IID_IProcessLauncher,0x128C2DA6,0x2BC0,0x44C0,0xB3,0xF6,0x4E,0xC2,0x2E,0x64,0x79,0x64); MIDL_DEFINE_GUID(IID, IID_IProcessLauncher2,0xD106AB5F,0xA70E,0x400E,0xA2,0x1B,0x96,0x20,0x8C,0x1D,0x8D,0xBB); @@ -103,7 +103,7 @@ MIDL_DEFINE_GUID(IID, LIBID_UpdaterLegacyLib,0x69464FF0,0xD9EC,0x4037,0xA3,0x5F,0x8A,0xE4,0x35,0x81,0x06,0xCC); -MIDL_DEFINE_GUID(CLSID, CLSID_GoogleUpdate3WebUserClass,0x22181302,0xA8A6,0x4f84,0xA5,0x41,0xE5,0xCB,0xFC,0x70,0xCC,0x43); +MIDL_DEFINE_GUID(CLSID, CLSID_GoogleUpdate3WebUserClass,0x22181302,0xA8A6,0x4F84,0xA5,0x41,0xE5,0xCB,0xFC,0x70,0xCC,0x43); MIDL_DEFINE_GUID(CLSID, CLSID_GoogleUpdate3WebSystemClass,0x8A1D4361,0x2C08,0x4700,0xA3,0x51,0x3E,0xAA,0x9C,0xBF,0xF5,0xE4); @@ -115,7 +115,7 @@ MIDL_DEFINE_GUID(CLSID, CLSID_PolicyStatusSystemClass,0x521FDB42,0x7130,0x4806,0x82,0x2A,0xFC,0x51,0x63,0xFA,0xD9,0x83); -MIDL_DEFINE_GUID(CLSID, CLSID_ProcessLauncherClass,0xABC01078,0xF197,0x4b0b,0xAD,0xBC,0xCF,0xE6,0x84,0xB3,0x9C,0x82); +MIDL_DEFINE_GUID(CLSID, CLSID_ProcessLauncherClass,0xABC01078,0xF197,0x4B0B,0xAD,0xBC,0xCF,0xE6,0x84,0xB3,0x9C,0x82); #undef MIDL_DEFINE_GUID
diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_chrome_branded_p.c b/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_chrome_branded_p.c index a9fa509..85f75496 100644 --- a/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_chrome_branded_p.c +++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_chrome_branded_p.c
@@ -3701,7 +3701,7 @@ /* Object interface: IAppBundleWeb, ver. 0.0, - GUID={0xDD42475D,0x6D46,0x496a,{0x92,0x4E,0xBD,0x56,0x30,0xB4,0xCB,0xBA}} */ + GUID={0xDD42475D,0x6D46,0x496A,{0x92,0x4E,0xBD,0x56,0x30,0xB4,0xCB,0xBA}} */ #pragma code_seg(".orpc") static const unsigned short IAppBundleWeb_FormatStringOffsetTable[] = @@ -3817,7 +3817,7 @@ /* Object interface: IAppWeb, ver. 0.0, - GUID={0x18D0F672,0x18B4,0x48e6,{0xAD,0x36,0x6E,0x6B,0xF0,0x1D,0xBB,0xC4}} */ + GUID={0x18D0F672,0x18B4,0x48E6,{0xAD,0x36,0x6E,0x6B,0xF0,0x1D,0xBB,0xC4}} */ #pragma code_seg(".orpc") static const unsigned short IAppWeb_FormatStringOffsetTable[] = @@ -4390,7 +4390,7 @@ /* Object interface: IProcessLauncher, ver. 0.0, - GUID={0x128C2DA6,0x2BC0,0x44c0,{0xB3,0xF6,0x4E,0xC2,0x2E,0x64,0x79,0x64}} */ + GUID={0x128C2DA6,0x2BC0,0x44C0,{0xB3,0xF6,0x4E,0xC2,0x2E,0x64,0x79,0x64}} */ #pragma code_seg(".orpc") static const unsigned short IProcessLauncher_FormatStringOffsetTable[] =
diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_chrome_branded.h b/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_chrome_branded.h index 9f1f30d..a869b1d0a 100644 --- a/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_chrome_branded.h +++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_chrome_branded.h
@@ -777,7 +777,7 @@ #if defined(__cplusplus) && !defined(CINTERFACE) - MIDL_INTERFACE("DD42475D-6D46-496a-924E-BD5630B4CBBA") + MIDL_INTERFACE("DD42475D-6D46-496A-924E-BD5630B4CBBA") IAppBundleWeb : public IDispatch { public: @@ -1085,7 +1085,7 @@ #if defined(__cplusplus) && !defined(CINTERFACE) - MIDL_INTERFACE("18D0F672-18B4-48e6-AD36-6E6BF01DBBC4") + MIDL_INTERFACE("18D0F672-18B4-48E6-AD36-6E6BF01DBBC4") IAppWeb : public IDispatch { public: @@ -2514,7 +2514,7 @@ #if defined(__cplusplus) && !defined(CINTERFACE) - MIDL_INTERFACE("128C2DA6-2BC0-44c0-B3F6-4EC22E647964") + MIDL_INTERFACE("128C2DA6-2BC0-44C0-B3F6-4EC22E647964") IProcessLauncher : public IUnknown { public: @@ -2761,7 +2761,7 @@ #ifdef __cplusplus -class DECLSPEC_UUID("22181302-A8A6-4f84-A541-E5CBFC70CC43") +class DECLSPEC_UUID("22181302-A8A6-4F84-A541-E5CBFC70CC43") GoogleUpdate3WebUserClass; #endif @@ -2793,7 +2793,7 @@ #ifdef __cplusplus -class DECLSPEC_UUID("ABC01078-F197-4b0b-ADBC-CFE684B39C82") +class DECLSPEC_UUID("ABC01078-F197-4B0B-ADBC-CFE684B39C82") ProcessLauncherClass; #endif #endif /* __UpdaterLegacyLib_LIBRARY_DEFINED__ */
diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_chrome_branded_i.c b/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_chrome_branded_i.c index 25e9357a..59010d2 100644 --- a/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_chrome_branded_i.c +++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_chrome_branded_i.c
@@ -73,10 +73,10 @@ MIDL_DEFINE_GUID(IID, IID_IGoogleUpdate3Web,0x494B20CF,0x282E,0x4BDD,0x9F,0x5D,0xB7,0x0C,0xB0,0x9D,0x35,0x1E); -MIDL_DEFINE_GUID(IID, IID_IAppBundleWeb,0xDD42475D,0x6D46,0x496a,0x92,0x4E,0xBD,0x56,0x30,0xB4,0xCB,0xBA); +MIDL_DEFINE_GUID(IID, IID_IAppBundleWeb,0xDD42475D,0x6D46,0x496A,0x92,0x4E,0xBD,0x56,0x30,0xB4,0xCB,0xBA); -MIDL_DEFINE_GUID(IID, IID_IAppWeb,0x18D0F672,0x18B4,0x48e6,0xAD,0x36,0x6E,0x6B,0xF0,0x1D,0xBB,0xC4); +MIDL_DEFINE_GUID(IID, IID_IAppWeb,0x18D0F672,0x18B4,0x48E6,0xAD,0x36,0x6E,0x6B,0xF0,0x1D,0xBB,0xC4); MIDL_DEFINE_GUID(IID, IID_IAppCommandWeb,0x8476CE12,0xAE1F,0x4198,0x80,0x5C,0xBA,0x0F,0x9B,0x78,0x3F,0x57); @@ -94,7 +94,7 @@ MIDL_DEFINE_GUID(IID, IID_IPolicyStatus3,0x05A30352,0xEB25,0x45B6,0x84,0x49,0xBC,0xA7,0xB0,0x54,0x2C,0xE5); -MIDL_DEFINE_GUID(IID, IID_IProcessLauncher,0x128C2DA6,0x2BC0,0x44c0,0xB3,0xF6,0x4E,0xC2,0x2E,0x64,0x79,0x64); +MIDL_DEFINE_GUID(IID, IID_IProcessLauncher,0x128C2DA6,0x2BC0,0x44C0,0xB3,0xF6,0x4E,0xC2,0x2E,0x64,0x79,0x64); MIDL_DEFINE_GUID(IID, IID_IProcessLauncher2,0xD106AB5F,0xA70E,0x400E,0xA2,0x1B,0x96,0x20,0x8C,0x1D,0x8D,0xBB); @@ -103,7 +103,7 @@ MIDL_DEFINE_GUID(IID, LIBID_UpdaterLegacyLib,0x69464FF0,0xD9EC,0x4037,0xA3,0x5F,0x8A,0xE4,0x35,0x81,0x06,0xCC); -MIDL_DEFINE_GUID(CLSID, CLSID_GoogleUpdate3WebUserClass,0x22181302,0xA8A6,0x4f84,0xA5,0x41,0xE5,0xCB,0xFC,0x70,0xCC,0x43); +MIDL_DEFINE_GUID(CLSID, CLSID_GoogleUpdate3WebUserClass,0x22181302,0xA8A6,0x4F84,0xA5,0x41,0xE5,0xCB,0xFC,0x70,0xCC,0x43); MIDL_DEFINE_GUID(CLSID, CLSID_GoogleUpdate3WebSystemClass,0x8A1D4361,0x2C08,0x4700,0xA3,0x51,0x3E,0xAA,0x9C,0xBF,0xF5,0xE4); @@ -115,7 +115,7 @@ MIDL_DEFINE_GUID(CLSID, CLSID_PolicyStatusSystemClass,0x521FDB42,0x7130,0x4806,0x82,0x2A,0xFC,0x51,0x63,0xFA,0xD9,0x83); -MIDL_DEFINE_GUID(CLSID, CLSID_ProcessLauncherClass,0xABC01078,0xF197,0x4b0b,0xAD,0xBC,0xCF,0xE6,0x84,0xB3,0x9C,0x82); +MIDL_DEFINE_GUID(CLSID, CLSID_ProcessLauncherClass,0xABC01078,0xF197,0x4B0B,0xAD,0xBC,0xCF,0xE6,0x84,0xB3,0x9C,0x82); #undef MIDL_DEFINE_GUID
diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_chrome_branded_p.c b/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_chrome_branded_p.c index a57ff75..908ef13a4 100644 --- a/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_chrome_branded_p.c +++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_chrome_branded_p.c
@@ -3703,7 +3703,7 @@ /* Object interface: IAppBundleWeb, ver. 0.0, - GUID={0xDD42475D,0x6D46,0x496a,{0x92,0x4E,0xBD,0x56,0x30,0xB4,0xCB,0xBA}} */ + GUID={0xDD42475D,0x6D46,0x496A,{0x92,0x4E,0xBD,0x56,0x30,0xB4,0xCB,0xBA}} */ #pragma code_seg(".orpc") static const unsigned short IAppBundleWeb_FormatStringOffsetTable[] = @@ -3819,7 +3819,7 @@ /* Object interface: IAppWeb, ver. 0.0, - GUID={0x18D0F672,0x18B4,0x48e6,{0xAD,0x36,0x6E,0x6B,0xF0,0x1D,0xBB,0xC4}} */ + GUID={0x18D0F672,0x18B4,0x48E6,{0xAD,0x36,0x6E,0x6B,0xF0,0x1D,0xBB,0xC4}} */ #pragma code_seg(".orpc") static const unsigned short IAppWeb_FormatStringOffsetTable[] = @@ -4392,7 +4392,7 @@ /* Object interface: IProcessLauncher, ver. 0.0, - GUID={0x128C2DA6,0x2BC0,0x44c0,{0xB3,0xF6,0x4E,0xC2,0x2E,0x64,0x79,0x64}} */ + GUID={0x128C2DA6,0x2BC0,0x44C0,{0xB3,0xF6,0x4E,0xC2,0x2E,0x64,0x79,0x64}} */ #pragma code_seg(".orpc") static const unsigned short IProcessLauncher_FormatStringOffsetTable[] =
diff --git a/tools/android/checkxmlstyle/PRESUBMIT.py b/tools/android/checkxmlstyle/PRESUBMIT.py index e493e44..f4ff22e 100644 --- a/tools/android/checkxmlstyle/PRESUBMIT.py +++ b/tools/android/checkxmlstyle/PRESUBMIT.py
@@ -22,6 +22,10 @@ def _CommonChecks(input_api, output_api): result = [] - result.extend(input_api.canned_checks.RunUnitTests( - input_api, output_api, ['./checkxmlstyle_test.py'])) + result.extend( + input_api.canned_checks.RunUnitTests(input_api, + output_api, + ['./checkxmlstyle_test.py'], + run_on_python2=False, + run_on_python3=True)) return result
diff --git a/tools/android/checkxmlstyle/checkxmlstyle_test.py b/tools/android/checkxmlstyle/checkxmlstyle_test.py index b0b307d..d01dc2c3 100755 --- a/tools/android/checkxmlstyle/checkxmlstyle_test.py +++ b/tools/android/checkxmlstyle/checkxmlstyle_test.py
@@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # 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. @@ -473,7 +473,7 @@ class StringResourcesTest(unittest.TestCase): def testInfavoredQuotations(self): - xmlChanges = (u'''<grit><release><messages> + xmlChanges = ('''<grit><release><messages> <message name="IDS_TEST_0"> <ph><ex>Hi</ex></ph>, it\u0027s a good idea </message> @@ -493,7 +493,7 @@ \u201CMenus\u201D </message> <part file="site_settings.grdp" /> - </messages></release></grit>'''.encode('utf-8')).splitlines() + </messages></release></grit>''').splitlines() mock_input_api = MockInputApi() mock_input_api.files = [ @@ -515,7 +515,7 @@ def testInfavoredEllipsis(self): - xmlChanges = (u'''<grit><release><messages> + xmlChanges = ('''<grit><release><messages> <message name="IDS_TEST_0"> <ph><ex>Hi</ex></ph>, file is downloading\u002E\u002E\u002E </message> @@ -526,7 +526,7 @@ <ph><ex>Oh</ex></ph>, file is downloaded\u002E </message> <part file="site_settings.grdp" /> - </messages></release></grit>'''.encode('utf-8')).splitlines() + </messages></release></grit>''').splitlines() mock_input_api = MockInputApi() mock_input_api.files = [
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index a17c7d0..58ce65cc 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -368,7 +368,7 @@ 'Mac Builder (reclient compare)': 'gpu_tests_release_bot_minimal_symbols_reclient', # TODO(crbug.com/1244441): remove this after the migration. 'Mac Builder (reclient)': 'gpu_tests_release_bot_minimal_symbols_reclient', - 'Mac Builder Next': 'mac_arm64_gpu_tests_release_bot_minimal_symbols_no_nacl', + 'Mac Builder Next': 'mac_arm64_gpu_tests_debug_bot_minimal_symbols_no_nacl', 'Mac deterministic': 'release_bot_mac_strip_minimal_symbols', 'Mac deterministic (dbg)': 'debug_bot', 'Mac deterministic (reclient shadow)': 'release_bot_mac_strip_minimal_symbols_reclient', @@ -1229,7 +1229,7 @@ 'mac-builder-next-rel': 'mac_arm64_gpu_tests_release_bot_minimal_symbols_no_nacl', 'mac-fieldtrial-rel': 'mac_arm64_gpu_tests_release_bot_minimal_symbols_no_nacl', 'mac-inverse-fieldtrials-fyi-rel': 'gpu_tests_release_trybot_invert_fieldtrials', - 'mac-osxbeta-rel': 'gpu_tests_release_trybot', + 'mac-osxbeta-rel': 'gpu_tests_debug_trybot', 'mac-rel': 'gpu_tests_release_trybot_no_symbols_mac_code_coverage', 'mac11-arm64-rel': 'mac_arm64_gpu_tests_release_trybot_no_symbols', 'mac12-arm64-rel': 'mac_arm64_gpu_tests_release_trybot_no_symbols', @@ -2697,6 +2697,10 @@ 'gpu_tests', 'debug_bot_reclient', 'x86', 'no_symbols' ], + 'gpu_tests_debug_trybot': [ + 'gpu_tests', 'debug', 'no_symbols', 'dcheck_always_on', 'static', 'goma' + ], + 'gpu_tests_ozone_linux_non_x11_release_trybot': [ 'gpu_tests', 'ozone_linux', 'ozone_linux_non_x11', 'release_trybot_minimal_symbols', ], @@ -3120,6 +3124,11 @@ 'cfm', 'release_trybot', 'chromeos', ], + 'mac_arm64_gpu_tests_debug_bot_minimal_symbols_no_nacl': [ + 'arm64', 'gpu_tests', 'static_bot', 'minimal_symbols', 'disable_nacl', + 'dcheck_off', 'debug', + ], + 'mac_arm64_gpu_tests_release_bot_minimal_symbols_no_nacl': [ 'arm64', 'gpu_tests', 'release_bot', 'minimal_symbols', 'disable_nacl', ], @@ -4568,6 +4577,10 @@ 'gn_args': 'use_static_angle=true', }, + 'static_bot': { + 'mixins': ['static', 'goma'], + }, + 'strip_absolute_paths_from_debug_symbols': { 'gn_args': 'strip_absolute_paths_from_debug_symbols=true' },
diff --git a/tools/mb/mb_config_expectations/chromium.fyi.json b/tools/mb/mb_config_expectations/chromium.fyi.json index 84f1404..0f37ca0 100644 --- a/tools/mb/mb_config_expectations/chromium.fyi.json +++ b/tools/mb/mb_config_expectations/chromium.fyi.json
@@ -450,7 +450,7 @@ "enable_nacl": false, "ffmpeg_branding": "Chrome", "is_component_build": false, - "is_debug": false, + "is_debug": true, "proprietary_codecs": true, "symbol_level": 1, "target_cpu": "arm64",
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.mac.json b/tools/mb/mb_config_expectations/tryserver.chromium.mac.json index 097fe3a..b5ea7d67 100644 --- a/tools/mb/mb_config_expectations/tryserver.chromium.mac.json +++ b/tools/mb/mb_config_expectations/tryserver.chromium.mac.json
@@ -514,7 +514,7 @@ "dcheck_always_on": true, "ffmpeg_branding": "Chrome", "is_component_build": false, - "is_debug": false, + "is_debug": true, "proprietary_codecs": true, "symbol_level": 0, "use_goma": true
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 6010575f..cbdd7f0 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -47611,6 +47611,17 @@ <int value="2" label="Both devices, pointing and keyboard, detected."/> </enum> +<enum name="HidsMissing"> + <summary> + Possible combination of human input device types that may be missing when + OOBE starts. + </summary> + <int value="0" label="None"/> + <int value="1" label="Pointer"/> + <int value="2" label="Keyboard"/> + <int value="3" label="Pointer and keyboard"/> +</enum> + <enum name="HidType"> <summary> Possible device types of HIDs interfaced with in the OOBE HID detection @@ -53629,12 +53640,6 @@ <int value="14" label="Add language to 'Always Translate' list"/> <int value="15" label="Remove site from 'Never translate sites' list"/> <int value="16" label="Restart Chrome for split install"/> - <int value="17" label="Spell check enabled globally"/> - <int value="18" label="Spell check disabled globally"/> - <int value="19" label="Spell check enabled for a language"/> - <int value="20" label="Spell check disabled for a language"/> - <int value="21" label="Basic spell check selected"/> - <int value="22" label="Enhanced spell check selected"/> </enum> <enum name="LanguageSettingsAppLanguagePromptAction"> @@ -57640,6 +57645,7 @@ <int value="-816895294" label="DiscoverApp:disabled"/> <int value="-816404462" label="TabGroupsAutoCreate:disabled"/> <int value="-815213125" label="SplitSettings:enabled"/> + <int value="-814305011" label="BatchFetchRequests:disabled"/> <int value="-814097014" label="disable-session-crashed-bubble"/> <int value="-813753274" label="VrBrowsing:disabled"/> <int value="-813474479" label="site-per-process"/> @@ -60239,6 +60245,7 @@ <int value="854391022" label="SmartLockUIRevamp:enabled"/> <int value="854730848" label="disable-app-info-dialog-mac"/> <int value="855746780" label="disable-physical-keyboard-autocorrect"/> + <int value="855981832" label="BatchFetchRequests:enabled"/> <int value="857391671" label="BluetoothNextHandsfreeProfile:disabled"/> <int value="857445869" label="enable-captive-portal-bypass-proxy"/> <int value="857716462" label="FeedInteractiveRefresh:enabled"/> @@ -67045,6 +67052,12 @@ <int value="13" label="A navigation suggestion is found using a character swap match against a top 500 domain."/> + <int value="14" + label="A navigation suggestion is found using a combo squatting match + against a popular brand name."/> + <int value="15" + label="A navigation suggestion is found using a combo squatting match + against an engaged site."/> </enum> <enum name="NavigationURLScheme">
diff --git a/tools/metrics/histograms/metadata/browser/histograms.xml b/tools/metrics/histograms/metadata/browser/histograms.xml index 8a89c53..00eaa80 100644 --- a/tools/metrics/histograms/metadata/browser/histograms.xml +++ b/tools/metrics/histograms/metadata/browser/histograms.xml
@@ -85,8 +85,9 @@ </histogram> <histogram name="Browser.ChromeOS.HatsSatisfaction{Survey}" units="score" - expires_after="2022-08-01"> + expires_after="2023-01-01"> <owner>aalsum@chromium.org</owner> + <owner>jackshira@google.org</owner> <owner>cros-telemetry@google.com</owner> <summary> Records the overall satisfaction score for HaTS, to be analyzed against @@ -152,6 +153,45 @@ </token> </histogram> +<histogram name="Browser.MainThreadsCongestion{Phase}" units="janks" + expires_after="2023-01-15"> +<!-- on probation: expected to graduate as a go/chrome-browser-guiding-metrics --> + + <owner>etienneb@chromium.org</owner> + <owner>gab@chromium.org</owner> + <summary> + This metric is emitted every 30 seconds after main message loop start, when + there is user activity. Each 30 second duration is divided into 100ms + intervals. This metric counts the number of these intervals that were + "congested". An interval is congested if during it the UI or IO + thread executes an "important" task that was queued more than 100 + ms ago, or a non-important task or a native event handler that started + executing more than 100 ms ago. See + https://docs.google.com/document/d/1vDSGFvJblh7yJ3U3RVB_7qZLubyfTbQdQjuN1GoUNkc/edit + for more details. + + This metrics graduated from + Browser.Responsiveness.JankyIntervalsPerThirtySeconds(1,2,3) and their + history might be useful to understand how we got here. + + Suffixed phases can be useful as diagnosis metrics: {Phase} + </summary> + <token key="Phase"> + <variant name="" + summary="Default view, includes all congested intervals after + OnFirstIdle()."/> + <variant name=".Initial" summary="The first interval after OnFirstIdle()."/> + <variant name=".Periodic" summary="All intervals but .Initial"/> + <variant name=".RunningOnly" + summary="Diagnostic metric which ignores queuing congestion."/> + <variant name=".RunningOnly.Initial" + summary="The first interval, before first idle and ignoring queuing + congestion."/> + <variant name=".RunningOnly.Periodic" + summary="All RunningOnly intervals but the first one."/> + </token> +</histogram> + <histogram name="Browser.PaintPreview.Capture.CompressedOnDiskSize" units="KB" expires_after="2022-12-11"> <owner>ckitagawa@chromium.org</owner> @@ -396,8 +436,8 @@ </histogram> <histogram name="Browser.Responsiveness.JankyIntervalsPerThirtySeconds3{Phase}" - units="janks" expires_after="2022-09-05"> -<!-- on probation: expected to graduate as a go/chrome-browser-guiding-metrics --> + units="janks" expires_after="M108"> +<!-- to graduate as Browser.MainThreadsCongestion as a go/chrome-browser-guiding-metrics) --> <owner>etienneb@chromium.org</owner> <owner>gab@chromium.org</owner> @@ -426,8 +466,8 @@ </histogram> <histogram name="Browser.Responsiveness.JankyIntervalsPerThirtySeconds{Phase}" - units="janks" expires_after="never"> -<!-- expires-never: guiding metric (internal: go/chrome-browser-guiding-metrics) --> + units="janks" expires_after="M108"> +<!-- to be replaced by Browser.MainThreadsCongestion as a go/chrome-browser-guiding-metrics) --> <owner>gab@chromium.org</owner> <owner>etienneb@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/commerce/histograms.xml b/tools/metrics/histograms/metadata/commerce/histograms.xml index b9a026d..d95bd83 100644 --- a/tools/metrics/histograms/metadata/commerce/histograms.xml +++ b/tools/metrics/histograms/metadata/commerce/histograms.xml
@@ -129,8 +129,10 @@ <owner>wychen@chromium.org</owner> <owner>chrome-shopping@google.com</owner> <summary> - Logged when we try to get cart extraction script to record the source of - this script data. + Cart extraction script could come from local resources or component updater. + This histogram is logged when we try to get the extraction script to record + from which source we are getting the script. The action of getting script is + triggered when users visit the cart page which would trigger extractions. </summary> </histogram> @@ -140,8 +142,11 @@ <owner>wychen@chromium.org</owner> <owner>chrome-shopping@google.com</owner> <summary> - Logged when we try to get general checkout URL detection pattern to record - the source of this pattern data. + Checkout URL pattern could come from Finch feature parameter or component + updater. This histogram is logged when we try to get checkout URL pattern to + record from which source we are getting the pattern. The action of getting + checkout URL pattern is triggered on every eligible navigation to decide if + users have visited the checkout page. </summary> </histogram> @@ -151,8 +156,41 @@ <owner>wychen@chromium.org</owner> <owner>chrome-shopping@google.com</owner> <summary> - Logged when we try to get merchant name of a domain to record the source of - this name data. + Merchant name could come from local resources or component updater. This + histogram is logged when we try to get merchant name data to record from + which source we are getting the data. The action of getting merchant name is + triggered every time when a new abadoned cart is detected by ChromeCart, so + that we can look up merchant name for the abadoned cart merchant. + </summary> +</histogram> + +<histogram name="Commerce.Heuristics.PartnerMerchantPatternSource" + enum="CommerceHeuristicsDataSource" expires_after="2022-12-04"> + <owner>yuezhanggg@chromium.org</owner> + <owner>wychen@chromium.org</owner> + <owner>chrome-shopping@google.com</owner> + <summary> + Partner merchant pattern heuristics could come from Finch feature parameter + or component updater. This histogram is logged when we try to get partner + merchant pattern to record from which source we are getting the pattern. The + action of getting partner merchant pattern is triggered every time when we + need to decide if an abandoned cart in ChromeCart is from a partner + merchant, which could happen both with and without user actions. + </summary> +</histogram> + +<histogram name="Commerce.Heuristics.SkipProductPatternSource" + enum="CommerceHeuristicsDataSource" expires_after="2022-12-04"> + <owner>yuezhanggg@chromium.org</owner> + <owner>wychen@chromium.org</owner> + <owner>chrome-shopping@google.com</owner> + <summary> + Skip product pattern heuristics could come from Finch feature parameter or + component updater. This histogram is logged when we try to get skip product + pattern to record from which source we are getting the pattern. The action + of getting skip product pattern is triggered every time when a new abadoned + cart is detected by ChromeCart, so that we can check if products in abadoned + cart need to be skipped. </summary> </histogram>
diff --git a/tools/metrics/histograms/metadata/ios/histograms.xml b/tools/metrics/histograms/metadata/ios/histograms.xml index 2b93c964..7283231 100644 --- a/tools/metrics/histograms/metadata/ios/histograms.xml +++ b/tools/metrics/histograms/metadata/ios/histograms.xml
@@ -537,7 +537,7 @@ </histogram> <histogram name="IOS.ExperienceKitCalendar.Present" - enum="ExperienceKitCalendarTypes" expires_after="2022-09-08"> + enum="ExperienceKitCalendarTypes" expires_after="2022-12-31"> <owner>djean@chromium.org</owner> <owner>erahmaoui@google.com</owner> <summary> @@ -546,7 +546,7 @@ </histogram> <histogram name="IOS.ExperienceKitCalendar.Success" - enum="ExperienceKitCalendarTypes" expires_after="2022-09-08"> + enum="ExperienceKitCalendarTypes" expires_after="2022-12-31"> <owner>djean@chromium.org</owner> <owner>erahmaoui@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/oobe/histograms.xml b/tools/metrics/histograms/metadata/oobe/histograms.xml index 9af1f07..900ab964 100644 --- a/tools/metrics/histograms/metadata/oobe/histograms.xml +++ b/tools/metrics/histograms/metadata/oobe/histograms.xml
@@ -402,6 +402,17 @@ </summary> </histogram> +<histogram name="OOBE.HidDetectionScreen.InitialHidsMissing" enum="HidsMissing" + expires_after="2023-05-06"> + <owner>gordonseto@google.com</owner> + <owner>cros-connectivity@google.com</owner> + <summary> + Records the types of human interface devices (HIDs) that are not connected + when OOBE starts. This metric is not emitted for Chrome OS devices that have + the OOBE HID detection screen disabled. + </summary> +</histogram> + <histogram name="OOBE.MarketingOptInScreen.BackendConnector.{OOBEMarketingCountry}" enum="MarketingOptInBackendConnectorEvent" expires_after="2023-08-01">
diff --git a/tools/metrics/histograms/metadata/v8/histograms.xml b/tools/metrics/histograms/metadata/v8/histograms.xml index 16b47e39..d110f0db 100644 --- a/tools/metrics/histograms/metadata/v8/histograms.xml +++ b/tools/metrics/histograms/metadata/v8/histograms.xml
@@ -1696,6 +1696,21 @@ </summary> </histogram> +<histogram name="V8.WasmCompilationUntilStreamFinishedMilliSeconds" units="ms" + expires_after="2023-01-15"> + <owner>ahaas@chromium.org</owner> + <owner>clemensb@chromium.org</owner> + <owner>ecmziegler@chromium.org</owner> + <owner>wasm-v8@google.com</owner> + <summary> + Time from finishing compilation of a WebAssembly module until downloading + the module finishes with streaming compilation. Recorded when streaming + compilation finishes and the compilation of the WebAssembly module finished + before the download. If the download finishes first, then the histogram + V8.WasmStreamingUntilCompilationFinishedMilliSeconds is recorded. + </summary> +</histogram> + <histogram name="V8.WasmCompileAfterDeserializeMilliSeconds" units="ms" expires_after="2023-01-15"> <owner>ahaas@chromium.org</owner> @@ -2077,6 +2092,21 @@ </summary> </histogram> +<histogram name="V8.WasmStreamingUntilCompilationFinishedMilliSeconds" + units="ms" expires_after="2023-01-15"> + <owner>ahaas@chromium.org</owner> + <owner>clemensb@chromium.org</owner> + <owner>ecmziegler@chromium.org</owner> + <owner>wasm-v8@google.com</owner> + <summary> + Time from finishing downloading a WebAssembly module until streaming + compilation finishes. Recorded when streaming compilation finishes and the + download of the WebAssembly module finished before compilation. If + compilation finishes first, then the histogram + V8.WasmCompilationUntilStreamFinishedMilliSeconds is recorded. + </summary> +</histogram> + <histogram name="V8.WasmThrowCount" units="count" expires_after="2023-01-22"> <owner>thibaudm@chromium.org</owner> <owner>ecmziegler@chromium.org</owner>
diff --git a/tools/perf/contrib/system_health_scroll_jank/system_health_scroll_jank.py b/tools/perf/contrib/system_health_scroll_jank/system_health_scroll_jank.py index 307118e..eca4cc2 100644 --- a/tools/perf/contrib/system_health_scroll_jank/system_health_scroll_jank.py +++ b/tools/perf/contrib/system_health_scroll_jank/system_health_scroll_jank.py
@@ -8,7 +8,7 @@ from contrib.system_health_scroll_jank import janky_story_set _BENCHMARK_UMA = [ - 'Browser.Responsiveness.JankyIntervalsPerThirtySeconds', + 'Browser.MainThreadsCongestion', 'Compositing.Display.DrawToSwapUs', 'CompositorLatency.TotalLatency', 'CompositorLatency.Type',
diff --git a/tools/vim/UltiSnips.md b/tools/vim/UltiSnips.md index f635c580..3ffc67a 100644 --- a/tools/vim/UltiSnips.md +++ b/tools/vim/UltiSnips.md
@@ -36,7 +36,7 @@ ```UltiSnips snippet copyright -// Copyright `date +%Y` The Chromium Authors. All rights reserved. +// Copyright `date +%Y` The Chromium Authors. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/tools/visual_debugger/server.py b/tools/visual_debugger/server.py index 7b77e3e..f0985940 100755 --- a/tools/visual_debugger/server.py +++ b/tools/visual_debugger/server.py
@@ -54,7 +54,7 @@ # Creates a partial object that will behave like a function called with args # and kwargs, while overriding directory with the given path. Handler = partial(CORSRequestHandler, - directory=os.path.relpath(os.path.dirname(__file__))) + directory=os.path.dirname(os.path.abspath(__file__))) socketserver.TCPServer.allow_reuse_address = True tpc_server = socketserver.TCPServer(("", debugger_port), Handler) # If socket is not specified it was assigned so we must grab it.
diff --git a/ui/accessibility/platform/inspect/ax_call_statement_invoker_mac.h b/ui/accessibility/platform/inspect/ax_call_statement_invoker_mac.h index b85701f..85b2b7e 100644 --- a/ui/accessibility/platform/inspect/ax_call_statement_invoker_mac.h +++ b/ui/accessibility/platform/inspect/ax_call_statement_invoker_mac.h
@@ -66,7 +66,7 @@ // Invokes setAccessibilityFocused method. AXOptionalNSObject InvokeSetAccessibilityFocused( - const id target, + const AXElementWrapper& ax_element, const AXPropertyNode& property_node) const; // Returns a parameterized attribute parameter by a property node representing
diff --git a/ui/accessibility/platform/inspect/ax_call_statement_invoker_mac.mm b/ui/accessibility/platform/inspect/ax_call_statement_invoker_mac.mm index 57eb7aa..71134318 100644 --- a/ui/accessibility/platform/inspect/ax_call_statement_invoker_mac.mm +++ b/ui/accessibility/platform/inspect/ax_call_statement_invoker_mac.mm
@@ -242,28 +242,18 @@ SEL selector = NSSelectorFromString(base::SysUTF8ToNSString(selector_string)); - if (![ax_element.AsId() respondsToSelector:selector]) + if (!ax_element.RespondsToSelector(selector)) return AXOptionalNSObject::Error(); - NSInvocation* invocation = - [NSInvocation invocationWithMethodSignature: - [[ax_element.AsId() class] - instanceMethodSignatureForSelector:selector]]; - [invocation setSelector:selector]; - [invocation setTarget:ax_element.AsId()]; - if (optional_arg_selector) { - // The ax_element is at index 0 and the selector at index 1, so arguments - // start at index 2. - [invocation setArgument:&*optional_arg_selector atIndex:2]; - } - [invocation invoke]; - BOOL return_value; - [invocation getReturnValue:&return_value]; + BOOL return_value = + optional_arg_selector + ? ax_element.Invoke<BOOL, SEL>(selector, *optional_arg_selector) + : ax_element.Invoke<BOOL>(selector); return AXOptionalNSObject([NSNumber numberWithBool:return_value]); } if (property_node.name_or_value == "setAccessibilityFocused") - return InvokeSetAccessibilityFocused(ax_element.AsId(), property_node); + return InvokeSetAccessibilityFocused(ax_element, property_node); // accessibilityAttributeValue if (property_node.name_or_value == "accessibilityAttributeValue") { @@ -402,7 +392,7 @@ } AXOptionalNSObject AXCallStatementInvoker::InvokeSetAccessibilityFocused( - const id target, + const AXElementWrapper& ax_element, const AXPropertyNode& property_node) const { std::string selector_string = property_node.name_or_value + ":"; if (property_node.arguments.size() != 1) { @@ -413,24 +403,13 @@ } SEL selector = NSSelectorFromString(base::SysUTF8ToNSString(selector_string)); - if (![target respondsToSelector:selector]) { + if (!ax_element.RespondsToSelector(selector)) { LOG(ERROR) << "Target doesn't answer to " << selector_string << " selector"; return AXOptionalNSObject::Error(); } - NSInvocation* invocation = [NSInvocation - invocationWithMethodSignature: - [[target class] instanceMethodSignatureForSelector:selector]]; - - [invocation setSelector:selector]; - [invocation setTarget:target]; - - // The target is at index 0 and the selector at index 1, so arguments - // start at index 2. BOOL val = property_node.arguments[0].name_or_value == "FALSE" ? FALSE : TRUE; - [invocation setArgument:&val atIndex:2]; - [invocation invoke]; - + ax_element.Invoke<void, BOOL>(selector, val); return AXOptionalNSObject(nil); }
diff --git a/ui/accessibility/platform/inspect/ax_element_wrapper_mac.h b/ui/accessibility/platform/inspect/ax_element_wrapper_mac.h index 83c0e25c..4aae5e0 100644 --- a/ui/accessibility/platform/inspect/ax_element_wrapper_mac.h +++ b/ui/accessibility/platform/inspect/ax_element_wrapper_mac.h
@@ -89,7 +89,53 @@ // Performs the given action on the object. void PerformAction(NSString* action) const; + // Returns true if the object responds to the given selector. + bool RespondsToSelector(SEL selector) const { + return [node_ respondsToSelector:selector]; + } + + // Invokes a method of the given signature. + template <typename ReturnType, typename... Args> + typename std::enable_if<!std::is_same<ReturnType, void>::value, + ReturnType>::type + Invoke(SEL selector, Args... args) const { + NSInvocation* invocation = InvokeInternal(selector, args...); + ReturnType return_value; + [invocation getReturnValue:&return_value]; + return return_value; + } + + template <typename ReturnType, typename... Args> + typename std::enable_if<std::is_same<ReturnType, void>::value, void>::type + Invoke(SEL selector, Args... args) const { + InvokeInternal(selector, args...); + } + private: + template <typename... Args> + NSInvocation* InvokeInternal(SEL selector, Args... args) const { + NSInvocation* invocation = [NSInvocation + invocationWithMethodSignature: + [[node_ class] instanceMethodSignatureForSelector:selector]]; + [invocation setSelector:selector]; + [invocation setTarget:node_]; + SetInvocationArguments<Args...>(invocation, 2, args...); + [invocation invoke]; + return invocation; + } + + template <typename Arg, typename... Args> + void SetInvocationArguments(NSInvocation* invocation, + int argument_index, + Arg& arg, + Args&... args) const { + [invocation setArgument:&arg atIndex:argument_index]; + SetInvocationArguments<Args...>(invocation, argument_index + 1, args...); + } + + template <typename... Args> + void SetInvocationArguments(NSInvocation*, int) const {} + // Returns true on success, otherwise returns false and logs error. bool AXSuccess(AXError, const std::string& message) const;
diff --git a/ui/chromeos/styles/cros_sys_colors.json5 b/ui/chromeos/styles/cros_sys_colors.json5 index 231ae25..5c31e35 100644 --- a/ui/chromeos/styles/cros_sys_colors.json5 +++ b/ui/chromeos/styles/cros_sys_colors.json5
@@ -127,10 +127,30 @@ }, /* Surfaces */ + surface: { + light: '$cros.ref.neutral99', + dark: '$cros.ref.neutral10', + }, surface1: { - light: 'blend(rgba($cros.ref.primary10.rgb, 0.05), blend(rgba($cros.ref.neutral50.rgb, 0.02), $cros.ref.neutral99))', + light: 'blend(rgba($cros.ref.primary40.rgb, 0.05), blend(rgba($cros.ref.neutral50.rgb, 0.02), $cros.ref.neutral99))', dark: 'blend(rgba($cros.ref.primary80.rgb, 0.05), blend(rgba($cros.ref.neutral80.rgb, 0.02), $cros.ref.neutral10))', }, + surface2: { + light: 'blend(rgba($cros.ref.primary40.rgb, 0.08), blend(rgba($cros.ref.neutral50.rgb, 0.02), $cros.ref.neutral99))', + dark: 'blend(rgba($cros.ref.primary80.rgb, 0.08), blend(rgba($cros.ref.neutral80.rgb, 0.02), $cros.ref.neutral10))', + }, + surface3: { + light: 'blend(rgba($cros.ref.primary40.rgb, 0.11), blend(rgba($cros.ref.neutral50.rgb, 0.02), $cros.ref.neutral99))', + dark: 'blend(rgba($cros.ref.primary80.rgb, 0.11), blend(rgba($cros.ref.neutral80.rgb, 0.02), $cros.ref.neutral10))', + }, + surface4: { + light: 'blend(rgba($cros.ref.primary40.rgb, 0.12), blend(rgba($cros.ref.neutral50.rgb, 0.02), $cros.ref.neutral99))', + dark: 'blend(rgba($cros.ref.primary80.rgb, 0.12), blend(rgba($cros.ref.neutral80.rgb, 0.02), $cros.ref.neutral10))', + }, + surface5: { + light: 'blend(rgba($cros.ref.primary40.rgb, 0.14), blend(rgba($cros.ref.neutral50.rgb, 0.02), $cros.ref.neutral99))', + dark: 'blend(rgba($cros.ref.primary80.rgb, 0.14), blend(rgba($cros.ref.neutral80.rgb, 0.02), $cros.ref.neutral10))', + }, scrim: { light: 'rgba($cros.ref.neutralvariant60.rgb, 0.6)', dark: 'rgba($cros.ref.neutralvariant10.rgb, 0.6)',
diff --git a/ui/chromeos/translations/ui_chromeos_strings_it.xtb b/ui/chromeos/translations/ui_chromeos_strings_it.xtb index 5fd2fbcd..00eebd1 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_it.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_it.xtb
@@ -604,7 +604,7 @@ <translation id="6146563240635539929">Video</translation> <translation id="6150853954427645995">Se desideri salvare il file per l'utilizzo offline, torna in linea, fai clic con il pulsante destro del mouse sul file e seleziona l'opzione <ph name="OFFLINE_CHECKBOX_NAME" />.</translation> <translation id="6164412158936057769">Farfalle</translation> -<translation id="6165508094623778733">Ulteriori informazioni</translation> +<translation id="6165508094623778733">Scopri di più</translation> <translation id="6170470584681422115">Sandwich</translation> <translation id="6187719147498869044">Ungherese</translation> <translation id="6198252989419008588">Modifica PIN</translation>
diff --git a/ui/file_manager/file_manager/background/js/file_operation_manager.js b/ui/file_manager/file_manager/background/js/file_operation_manager.js index b6dcbc6..f090e3f 100644 --- a/ui/file_manager/file_manager/background/js/file_operation_manager.js +++ b/ui/file_manager/file_manager/background/js/file_operation_manager.js
@@ -694,7 +694,11 @@ notifyExtractDone(taskId) { if (window.isSWA) { // TODO(crbug.com/953256) Add closure annotation. - this.fileManager_.taskController.deleteExtractTaskDetails(taskId); + // taskController is set asynchronously, this can be called on startup + // if another SWA window is finishing an extract (crbug.com/1348432). + if (this.fileManager_.taskController) { + this.fileManager_.taskController.deleteExtractTaskDetails(taskId); + } } } @@ -707,7 +711,11 @@ */ handleMissingPassword(taskId) { // TODO(crbug.com/953256) Add closure annotation. - this.fileManager_.taskController.handleMissingPassword(taskId); + // null check is unlikely to be needed, but there's no guarantee + // that taskController has been initialized on a password event. + if (this.fileManager_.taskController) { + this.fileManager_.taskController.handleMissingPassword(taskId); + } } /**
diff --git a/ui/file_manager/file_manager/common/js/BUILD.gn b/ui/file_manager/file_manager/common/js/BUILD.gn index 7c82c62..1d2fb05e 100644 --- a/ui/file_manager/file_manager/common/js/BUILD.gn +++ b/ui/file_manager/file_manager/common/js/BUILD.gn
@@ -37,7 +37,6 @@ ":icon_util", ":importer_common", ":lru_cache", - ":mediasession_types", ":metrics", ":metrics_base", ":notifications_browser_proxy", @@ -266,9 +265,6 @@ ] } -js_library("mediasession_types") { -} - js_library("metrics") { visibility = [] visibility = [ "//ui/file_manager/file_manager/*" ]
diff --git a/ui/file_manager/file_manager/common/js/mediasession_types.js b/ui/file_manager/file_manager/common/js/mediasession_types.js deleted file mode 100644 index 754ee76..0000000 --- a/ui/file_manager/file_manager/common/js/mediasession_types.js +++ /dev/null
@@ -1,17 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview - */ - -/** - * @see https://wicg.github.io/mediasession/#enumdef-mediasessionplaybackstate - * @enum {string} - */ -export const MediaSessionPlaybackState = { - NONE: 'none', - PAUSED: 'paused', - PLAYING: 'playing', -};
diff --git a/ui/file_manager/file_manager/externs/audio_player_foreground.js b/ui/file_manager/file_manager/externs/audio_player_foreground.js deleted file mode 100644 index d98f097de..0000000 --- a/ui/file_manager/file_manager/externs/audio_player_foreground.js +++ /dev/null
@@ -1,23 +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. - -/** - * @typedef {?{ - * position: (number|undefined), - * time: (number|undefined), - * expanded: (boolean|undefined), - * items: (!Array<string>|undefined) - * }} - */ -let Playlist; - -/** - * @type {(Playlist|Object|undefined)} - */ -Window.prototype.appState; - -/** - * @type {(boolean|undefined)} - */ -Window.prototype.appReopen;
diff --git a/ui/file_manager/file_manager/externs/chrome_cast.js b/ui/file_manager/file_manager/externs/chrome_cast.js deleted file mode 100644 index b819bf32..0000000 --- a/ui/file_manager/file_manager/externs/chrome_cast.js +++ /dev/null
@@ -1,1249 +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. - -/** - * @namespace - */ -chrome.cast = {}; - - -/** - * @enum {string} - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast#.AutoJoinPolicy - */ -chrome.cast.AutoJoinPolicy = { - TAB_AND_ORIGIN_SCOPED: 'tab_and_origin_scoped', - ORIGIN_SCOPED: 'origin_scoped', - PAGE_SCOPED: 'page_scoped', -}; - - -/** - * @enum {string} - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast#.DefaultActionPolicy - */ -chrome.cast.DefaultActionPolicy = { - CREATE_SESSION: 'create_session', - CAST_THIS_TAB: 'cast_this_tab', -}; - - -/** - * @enum {string} - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast#.Capability - */ -chrome.cast.Capability = { - VIDEO_OUT: 'video_out', - AUDIO_OUT: 'audio_out', - VIDEO_IN: 'video_in', - AUDIO_IN: 'audio_in', -}; - - -/** - * @enum {string} - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast#.ErrorCode - */ -chrome.cast.ErrorCode = { - CANCEL: 'cancel', - TIMEOUT: 'timeout', - API_NOT_INITIALIZED: 'api_not_initialized', - INVALID_PARAMETER: 'invalid_parameter', - EXTENSION_NOT_COMPATIBLE: 'extension_not_compatible', - EXTENSION_MISSING: 'extension_missing', - RECEIVER_UNAVAILABLE: 'receiver_unavailable', - SESSION_ERROR: 'session_error', - CHANNEL_ERROR: 'channel_error', - LOAD_MEDIA_FAILED: 'load_media_failed', -}; - - -/** - * @enum {string} - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast#.ReceiverAvailability - */ -chrome.cast.ReceiverAvailability = { - AVAILABLE: 'available', - UNAVAILABLE: 'unavailable', -}; - - -/** - * @enum {string} - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast#.SenderPlatform - */ -chrome.cast.SenderPlatform = { - CHROME: 'chrome', - IOS: 'ios', - ANDROID: 'android', -}; - - -/** - * @enum {string} - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast#.ReceiverType - */ -chrome.cast.ReceiverType = { - CAST: 'cast', - HANGOUT: 'hangout', - CUSTOM: 'custom', -}; - - -/** - * @enum {string} - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast#.ReceiverAction - */ -chrome.cast.ReceiverAction = { - CAST: 'cast', - STOP: 'stop', -}; - - -/** - * @enum {string} - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast#.SessionStatus - */ -chrome.cast.SessionStatus = { - CONNECTED: 'connected', - DISCONNECTED: 'disconnected', - STOPPED: 'stopped', -}; - - -/** - * @namespace - */ -chrome.cast.media = {}; - - -/** - * @enum {string} - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media#.MediaCommand - */ -chrome.cast.media.MediaCommand = { - PAUSE: 'pause', - SEEK: 'seek', - STREAM_VOLUME: 'stream_volume', - STREAM_MUTE: 'stream_mute', -}; - - -/** - * @enum {number} - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media#.MetadataType - */ -chrome.cast.media.MetadataType = { - GENERIC: 0, - TV_SHOW: 1, - MOVIE: 2, - MUSIC_TRACK: 3, - PHOTO: 4, -}; - - -/** - * @enum {string} - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media#.PlayerState - */ -chrome.cast.media.PlayerState = { - IDLE: 'IDLE', - PLAYING: 'PLAYING', - PAUSED: 'PAUSED', - BUFFERING: 'BUFFERING', -}; - - -/** - * @enum {string} - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media#.ResumeState - */ -chrome.cast.media.ResumeState = { - PLAYBACK_START: 'PLAYBACK_START', - PLAYBACK_PAUSE: 'PLAYBACK_PAUSE', -}; - - -/** - * @enum {string} - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media#.StreamType - */ -chrome.cast.media.StreamType = { - BUFFERED: 'BUFFERED', - LIVE: 'LIVE', - OTHER: 'OTHER', -}; - - -/** - * @enum {string} - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media#.IdleReason - */ -chrome.cast.media.IdleReason = { - CANCELLED: 'CANCELLED', - INTERRUPTED: 'INTERRUPTED', - FINISHED: 'FINISHED', - ERROR: 'ERROR', -}; - - -/** - * @enum {string} - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media#.TrackType - */ -chrome.cast.media.TrackType = { - TEXT: 'TEXT', - AUDIO: 'AUDIO', - VIDEO: 'VIDEO', -}; - - -/** - * @enum {string} - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media#.TextTrackType - */ -chrome.cast.media.TextTrackType = { - SUBTITLES: 'SUBTITLES', - CAPTIONS: 'CAPTIONS', - DESCRIPTIONS: 'DESCRIPTIONS', - CHAPTERS: 'CHAPTERS', - METADATA: 'METADATA', -}; - - -/** - * @enum {string} - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media#.TextTrackEdgeType - */ -chrome.cast.media.TextTrackEdgeType = { - NONE: 'NONE', - OUTLINE: 'OUTLINE', - DROP_SHADOW: 'DROP_SHADOW', - RAISED: 'RAISED', - DEPRESSED: 'DEPRESSED', -}; - - -/** - * @enum {string} - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media#.TextTrackWindowType - */ -chrome.cast.media.TextTrackWindowType = { - NONE: 'NONE', - NORMAL: 'NORMAL', - ROUNDED_CORNERS: 'ROUNDED_CORNERS', -}; - - -/** - * @enum {string} - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media#.TextTrackFontGenericFamily - */ -chrome.cast.media.TextTrackFontGenericFamily = { - SANS_SERIF: 'SANS_SERIF', - MONOSPACED_SANS_SERIF: 'MONOSPACED_SANS_SERIF', - SERIF: 'SERIF', - MONOSPACED_SERIF: 'MONOSPACED_SERIF', - CASUAL: 'CASUAL', - CURSIVE: 'CURSIVE', - SMALL_CAPITALS: 'SMALL_CAPITALS', -}; - - -/** - * @enum {string} - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media#.TextTrackFontStyle - */ -chrome.cast.media.TextTrackFontStyle = { - NORMAL: 'NORMAL', - BOLD: 'BOLD', - BOLD_ITALIC: 'BOLD_ITALIC', - ITALIC: 'ITALIC', -}; - - -/** - * @param {!chrome.cast.ErrorCode} code - * @param {string=} opt_description - * @param {Object=} opt_details - * @constructor - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.Error - */ -chrome.cast.Error = function(code, opt_description, opt_details) {}; - -/** @type {!chrome.cast.ErrorCode} */ -chrome.cast.Error.prototype.code; - -/** @type {?string} */ -chrome.cast.Error.prototype.description; - -/** @type {Object} */ -chrome.cast.Error.prototype.details; - - -/** - * @param {!chrome.cast.SenderPlatform} platform - * @constructor - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.SenderApplication - */ -chrome.cast.SenderApplication = function(platform) {}; - -/** @type {!chrome.cast.SenderPlatform} */ -chrome.cast.SenderApplication.prototype.platform; - -/** @type {?string} */ -chrome.cast.SenderApplication.prototype.url; - -/** @type {?string} */ -chrome.cast.SenderApplication.prototype.packageId; - - -/** - * @param {string} url - * @constructor - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.Image - */ -chrome.cast.Image = function(url) {}; - -/** @type {string} */ -chrome.cast.Image.prototype.url; - -/** @type {?number} */ -chrome.cast.Image.prototype.height; - -/** @type {?number} */ -chrome.cast.Image.prototype.width; - - -/** - * @param {?number=} opt_level - * @param {?boolean=} opt_muted - * @constructor - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.Volume - */ -chrome.cast.Volume = function(opt_level, opt_muted) {}; - -/** @type {?number} */ -chrome.cast.Volume.prototype.level; - -/** @type {?boolean} */ -chrome.cast.Volume.prototype.muted; - - -/** - * @param {!chrome.cast.SessionRequest} sessionRequest - * @param {function(!chrome.cast.Session)} sessionListener - * @param {function(!chrome.cast.ReceiverAvailability,Array<Object>)} - * receiverListener - * @param {chrome.cast.AutoJoinPolicy=} opt_autoJoinPolicy - * @param {chrome.cast.DefaultActionPolicy=} opt_defaultActionPolicy - * @constructor - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.ApiConfig - */ -chrome.cast.ApiConfig = function( - sessionRequest, sessionListener, receiverListener, opt_autoJoinPolicy, - opt_defaultActionPolicy) {}; - -/** @type {!chrome.cast.SessionRequest} */ -chrome.cast.ApiConfig.prototype.sessionRequest; - -/** @type {function(!chrome.cast.Session)} */ -chrome.cast.ApiConfig.prototype.sessionListener; - -/** @type {function(!chrome.cast.ReceiverAvailability)} */ -chrome.cast.ApiConfig.prototype.receiverListener; - -/** @type {!chrome.cast.AutoJoinPolicy} */ -chrome.cast.ApiConfig.prototype.autoJoinPolicy; - -/** @type {!chrome.cast.DefaultActionPolicy} */ -chrome.cast.ApiConfig.prototype.defaultActionPolicy; - - -/** - * @param {string} appId - * @param {!Array<chrome.cast.Capability>=} opt_capabilities - * @param {number=} opt_timeout - * @constructor - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.SessionRequest - */ -chrome.cast.SessionRequest = function(appId, opt_capabilities, opt_timeout) {}; - -/** @type {string} */ -chrome.cast.SessionRequest.prototype.appId; - -/** @type {!Array<chrome.cast.Capability>} */ -chrome.cast.SessionRequest.prototype.capabilities; - -/** @type {number} */ -chrome.cast.SessionRequest.prototype.requestSessionTimeout; - -/** @type {?string} */ -chrome.cast.SessionRequest.prototype.language; - - -/** - * @param {string} label - * @param {string} friendlyName - * @param {Array<chrome.cast.Capability>=} opt_capabilities - * @param {chrome.cast.Volume=} opt_volume - * @constructor - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.Receiver - */ -chrome.cast.Receiver = function( - label, friendlyName, opt_capabilities, opt_volume) {}; - -/** @type {string} */ -chrome.cast.Receiver.prototype.label; - -/** @type {string} */ -chrome.cast.Receiver.prototype.friendlyName; - -/** @type {!Array<!chrome.cast.Capability>} */ -chrome.cast.Receiver.prototype.capabilities; - -/** @type {chrome.cast.Volume} */ -chrome.cast.Receiver.prototype.volume; - -/** @type {!chrome.cast.ReceiverType} */ -chrome.cast.Receiver.prototype.receiverType; - -/** @type {chrome.cast.ReceiverDisplayStatus} */ -chrome.cast.Receiver.prototype.displayStatus; - - -/** - * @param {string} statusText - * @param {!Array<chrome.cast.Image>} appImages - * @constructor - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.ReceiverDisplayStatus - */ -chrome.cast.ReceiverDisplayStatus = function(statusText, appImages) {}; - -/** @type {string} */ -chrome.cast.ReceiverDisplayStatus.prototype.statusText; - -/** @type {!Array<chrome.cast.Image>} */ -chrome.cast.ReceiverDisplayStatus.prototype.appImages; - - -/** - * @param {string} sessionId - * @param {string} appId - * @param {string} displayName - * @param {!Array<chrome.cast.Image>} appImages - * @param {!chrome.cast.Receiver} receiver - * @constructor - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.Session - */ -chrome.cast.Session = function( - sessionId, appId, displayName, appImages, receiver) {}; - -/** @type {string} */ -chrome.cast.Session.prototype.sessionId; - -/** @type {string} */ -chrome.cast.Session.prototype.appId; - -/** @type {string} */ -chrome.cast.Session.prototype.displayName; - -/** @type {?string} */ -chrome.cast.Session.prototype.statusText; - -/** @type {!Array<chrome.cast.Image>} */ -chrome.cast.Session.prototype.appImages; - -/** @type {!chrome.cast.Receiver} */ -chrome.cast.Session.prototype.receiver; - -/** @type {!Array<!chrome.cast.SenderApplication>} The applications. */ -chrome.cast.Session.prototype.senderApps; - -/** @type {!Array<!{name: string}>} The namespaces. */ -chrome.cast.Session.prototype.namespaces; - -/** @type {!Array<!chrome.cast.media.Media>} */ -chrome.cast.Session.prototype.media; - -/** @type {!chrome.cast.SessionStatus} */ -chrome.cast.Session.prototype.status; - -/** - * @param {number} newLevel - * @param {function()} successCallback - * @param {function(chrome.cast.Error)} errorCallback - */ -chrome.cast.Session.prototype.setReceiverVolumeLevel = function( - newLevel, successCallback, errorCallback) {}; - -/** - * @param {boolean} muted - * @param {function()} successCallback - * @param {function(chrome.cast.Error)} errorCallback - */ -chrome.cast.Session.prototype.setReceiverMuted = function( - muted, successCallback, errorCallback) {}; - -/** - * @param {function()} successCallback - * @param {function(chrome.cast.Error)} errorCallback - */ -chrome.cast.Session.prototype.leave = function( - successCallback, errorCallback) {}; - -/** - * @param {function()} successCallback - * @param {function(chrome.cast.Error)} errorCallback - */ -chrome.cast.Session.prototype.stop = function( - successCallback, errorCallback) {}; - -/** - * @param {string} namespace - * @param {!Object|string} message - * @param {!function()} successCallback - * @param {function(!chrome.cast.Error)} errorCallback - */ -chrome.cast.Session.prototype.sendMessage = function( - namespace, message, successCallback, errorCallback) {}; - -/** - * @param {function(boolean)} listener - */ -chrome.cast.Session.prototype.addUpdateListener = function(listener) {}; - -/** - * @param {function(boolean)} listener - */ -chrome.cast.Session.prototype.removeUpdateListener = function(listener) {}; - -/** - * @param {string} namespace - * @param {function(string,string)} listener - */ -chrome.cast.Session.prototype.addMessageListener = function( - namespace, listener) {}; - -/** - * @param {string} namespace - * @param {function(string,string)} listener - */ -chrome.cast.Session.prototype.removeMessageListener = function( - namespace, listener) {}; - -/** - * @param {function(!chrome.cast.media.Media)} listener - */ -chrome.cast.Session.prototype.addMediaListener = function(listener) {}; - -/** - * @param {function(chrome.cast.media.Media)} listener - */ -chrome.cast.Session.prototype.removeMediaListener = function(listener) {}; - -/** - * @param {!chrome.cast.media.LoadRequest} loadRequest - * @param {function(!chrome.cast.media.Media)} successCallback - * @param {function(!chrome.cast.Error)} errorCallback - */ -chrome.cast.Session.prototype.loadMedia = function( - loadRequest, successCallback, errorCallback) {}; - - -/** - * @namespace - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast#.timeout - */ -chrome.cast.timeout = {}; - - -/** - * @const {!Array<number>} - * @see https://developers.google.com/cast/docs/reference/chrome/ - */ -chrome.cast.VERSION; - - -/** - * @typedef {!function(?chrome.cast.Receiver, !chrome.cast.ReceiverAction)} - */ -chrome.cast.ReceiverActionListener; - - -/** - * @type {boolean} - */ -chrome.cast.isAvailable; - - -/** - * @type {boolean} - */ -chrome.cast.usingPresentationApi; - - -/** - * @param {!chrome.cast.ApiConfig} apiConfig - * @param {function()} successCallback - * @param {function(chrome.cast.Error)} errorCallback - */ -chrome.cast.initialize = function(apiConfig, successCallback, errorCallback) {}; - - -/** - * @param {function(!chrome.cast.Session)} successCallback - * @param {function(chrome.cast.Error)} errorCallback - * @param {chrome.cast.SessionRequest=} opt_sessionRequest - * @param {string=} opt_label - */ -chrome.cast.requestSession = function( - successCallback, errorCallback, opt_sessionRequest, opt_label) {}; - - -/** - * @param {string} sessionId The id of the session to join. - */ -chrome.cast.requestSessionById = function(sessionId) {}; - - -/** - * @param {chrome.cast.ReceiverActionListener} listener - */ -chrome.cast.addReceiverActionListener = function(listener) {}; - - -/** - * @param {chrome.cast.ReceiverActionListener} listener - */ -chrome.cast.removeReceiverActionListener = function(listener) {}; - - -/** - * @param {string} message The message to log. - */ -chrome.cast.logMessage = function(message) {}; - - -/** - * @param {!Array<chrome.cast.Receiver>} receivers - * @param {function()} successCallback - * @param {function(chrome.cast.Error)} errorCallback - */ -chrome.cast.setCustomReceivers = function( - receivers, successCallback, errorCallback) {}; - - -/** - * @param {!chrome.cast.Receiver} receiver - * @param {function()} successCallback - * @param {function(chrome.cast.Error)} errorCallback - */ -chrome.cast.setReceiverDisplayStatus = function( - receiver, successCallback, errorCallback) {}; - - -/** - * @constructor - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media.GetStatusRequest - */ -chrome.cast.media.GetStatusRequest = function() {}; - -/** @type {Object} */ -chrome.cast.media.GetStatusRequest.prototype.customData; - - -/** - * @constructor - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media.PauseRequest - */ -chrome.cast.media.PauseRequest = function() {}; - -/** @type {Object} */ -chrome.cast.media.PauseRequest.prototype.customData; - - -/** - * @constructor - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media.PlayRequest - */ -chrome.cast.media.PlayRequest = function() {}; - -/** @type {Object} */ -chrome.cast.media.PlayRequest.prototype.customData; - - -/** - * @constructor - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media.SeekRequest - */ -chrome.cast.media.SeekRequest = function() {}; - -/** @type {?number} */ -chrome.cast.media.SeekRequest.prototype.currentTime; - -/** @type {?chrome.cast.media.ResumeState} */ -chrome.cast.media.SeekRequest.prototype.resumeState; - -/** @type {Object} */ -chrome.cast.media.SeekRequest.prototype.customData; - - -/** - * @constructor - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media.StopRequest - */ -chrome.cast.media.StopRequest = function() {}; - -/** @type {Object} */ -chrome.cast.media.StopRequest.prototype.customData; - - -/** - * @param {!chrome.cast.Volume} volume - * @constructor - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media.VolumeRequest - */ -chrome.cast.media.VolumeRequest = function(volume) {}; - -/** @type {!chrome.cast.Volume} */ -chrome.cast.media.VolumeRequest.prototype.volume = volume; - -/** @type {Object} */ -chrome.cast.media.VolumeRequest.prototype.customData; - - -/** - * @param {!chrome.cast.media.MediaInfo} mediaInfo - * @constructor - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media.LoadRequest - */ -chrome.cast.media.LoadRequest = function(mediaInfo) {}; - -/** @type {Array<number>} */ -chrome.cast.media.LoadRequest.prototype.activeTrackIds; - -/** @type {boolean} */ -chrome.cast.media.LoadRequest.prototype.autoplay; - -/** @type {?number} */ -chrome.cast.media.LoadRequest.prototype.currentTime; - -/** @type {Object} */ -chrome.cast.media.LoadRequest.prototype.customData; - -/** @type {!chrome.cast.media.MediaInfo} */ -chrome.cast.media.LoadRequest.prototype.media; - - -/** - * @param {Array<number>=} opt_activeTrackIds - * @param {chrome.cast.media.TextTrackStyle=} opt_textTrackStyle - * @constructor - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media.EditTracksInfoRequest - */ -chrome.cast.media.EditTracksInfoRequest = function( - opt_activeTrackIds, opt_textTrackStyle) {}; - -/** @type {Array<number>} */ -chrome.cast.media.EditTracksInfoRequest.prototype.activeTrackIds; - -/** @type {?chrome.cast.media.TextTrackStyle} */ -chrome.cast.media.EditTracksInfoRequest.prototype.textTrackStyle; - - -/** - * @constructor - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media.GenericMediaMetadata - */ -chrome.cast.media.GenericMediaMetadata = function() {}; - -/** @type {chrome.cast.media.MetadataType} */ -chrome.cast.media.GenericMediaMetadata.prototype.metadataType; - -/** @type {?string} */ -chrome.cast.media.GenericMediaMetadata.prototype.title; - -/** @type {?string} */ -chrome.cast.media.GenericMediaMetadata.prototype.subtitle; - -/** @type {Array<chrome.cast.Image>} */ -chrome.cast.media.GenericMediaMetadata.prototype.images; - -/** @type {?string} */ -chrome.cast.media.GenericMediaMetadata.prototype.releaseDate; - -/** - * @type {chrome.cast.media.MetadataType} - * @deprecated Please use metadataType instead. - */ -chrome.cast.media.GenericMediaMetadata.prototype.type; - -/** - * @type {?number} - * @deprecated Use releaseDate instead. - */ -chrome.cast.media.GenericMediaMetadata.prototype.releaseYear; - - -/** - * @constructor - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media.MovieMediaMetadata - */ -chrome.cast.media.MovieMediaMetadata = function() {}; - -/** @type {chrome.cast.media.MetadataType} */ -chrome.cast.media.MovieMediaMetadata.prototype.metadataType; - -/** @type {?string} */ -chrome.cast.media.MovieMediaMetadata.prototype.title; - -/** @type {?string} */ -chrome.cast.media.MovieMediaMetadata.prototype.studio; - -/** @type {?string} */ -chrome.cast.media.MovieMediaMetadata.prototype.subtitle; - -/** @type {Array<chrome.cast.Image>} */ -chrome.cast.media.MovieMediaMetadata.prototype.images; - -/** @type {?string} */ -chrome.cast.media.MovieMediaMetadata.prototype.releaseDate; - -/** - * @type {chrome.cast.media.MetadataType} - * @deprecated Please use metadataType instead. - */ -chrome.cast.media.MovieMediaMetadata.prototype.type; - -/** - * @type {?number} - * @deprecated Use releaseDate instead. - */ -chrome.cast.media.MovieMediaMetadata.prototype.releaseYear; - - -/** - * @constructor - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media.TvShowMediaMetadata - */ -chrome.cast.media.TvShowMediaMetadata = function() {}; - -/** @type {chrome.cast.media.MetadataType} */ -chrome.cast.media.TvShowMediaMetadata.prototype.metadataType; - -/** @type {?string} */ -chrome.cast.media.TvShowMediaMetadata.prototype.seriesTitle; - -/** @type {?string} */ -chrome.cast.media.TvShowMediaMetadata.prototype.title; - -/** @type {?number} */ -chrome.cast.media.TvShowMediaMetadata.prototype.season; - -/** @type {?number} */ -chrome.cast.media.TvShowMediaMetadata.prototype.episode; - -/** @type {Array<chrome.cast.Image>} */ -chrome.cast.media.TvShowMediaMetadata.prototype.images; - -/** @type {?string} */ -chrome.cast.media.TvShowMediaMetadata.prototype.originalAirdate; - -/** - * @type {chrome.cast.media.MetadataType} - * @deprecated Please use metadataType instead. - */ -chrome.cast.media.TvShowMediaMetadata.prototype.type; - -/** - * @type {?string} - * @deprecated Use title instead. - */ -chrome.cast.media.TvShowMediaMetadata.prototype.episodeTitle; - -/** - * @type {?number} - * @deprecated Use season instead. - */ -chrome.cast.media.TvShowMediaMetadata.prototype.seasonNumber; - -/** - * @type {?number} - * @deprecated Use episode instead. - */ -chrome.cast.media.TvShowMediaMetadata.prototype.episodeNumber; - -/** - * @type {?number} - * @deprecated Use originalAirdate instead. - */ -chrome.cast.media.TvShowMediaMetadata.prototype.releaseYear; - - -/** - * @constructor - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media.MusicTrackMediaMetadata - */ -chrome.cast.media.MusicTrackMediaMetadata = function() {}; - - -/** @type {chrome.cast.media.MetadataType} */ -chrome.cast.media.MusicTrackMediaMetadata.prototype.metadataType; - -/** @type {?string} */ -chrome.cast.media.MusicTrackMediaMetadata.prototype.albumName; - -/** @type {?string} */ -chrome.cast.media.MusicTrackMediaMetadata.prototype.title; - -/** @type {?string} */ -chrome.cast.media.MusicTrackMediaMetadata.prototype.albumArtist; - -/** @type {?string} */ -chrome.cast.media.MusicTrackMediaMetadata.prototype.artist; - -/** @type {?string} */ -chrome.cast.media.MusicTrackMediaMetadata.prototype.composer; - -/** @type {?string} */ -chrome.cast.media.MusicTrackMediaMetadata.prototype.songName; - -/** @type {?number} */ -chrome.cast.media.MusicTrackMediaMetadata.prototype.trackNumber; - -/** @type {?number} */ -chrome.cast.media.MusicTrackMediaMetadata.prototype.discNumber; - -/** @type {Array<chrome.cast.Image>} */ -chrome.cast.media.MusicTrackMediaMetadata.prototype.images; - -/** - * @type {chrome.cast.media.MetadataType} - * @deprecated Please use metadataType instead. - */ -chrome.cast.media.MusicTrackMediaMetadata.prototype.type; - -/** - * @type {?string} - * @deprecated Use artist instead. - */ -chrome.cast.media.MusicTrackMediaMetadata.prototype.artistName; - -/** - * @type {?number} - * @deprecated Use releaseDate instead. - */ -chrome.cast.media.MusicTrackMediaMetadata.prototype.releaseYear; - -/** - * @type {?string} - */ -chrome.cast.media.MusicTrackMediaMetadata.prototype.releaseDate; - - -/** - * @constructor - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media.PhotoMediaMetadata - */ -chrome.cast.media.PhotoMediaMetadata = function() {}; - -/** @type {chrome.cast.media.MetadataType} */ -chrome.cast.media.PhotoMediaMetadata.prototype.metadataType; - -/** @type {?string} */ -chrome.cast.media.PhotoMediaMetadata.prototype.title; - -/** @type {?string} */ -chrome.cast.media.PhotoMediaMetadata.prototype.artist; - -/** @type {?string} */ -chrome.cast.media.PhotoMediaMetadata.prototype.location; - -/** @type {Array<chrome.cast.Image>} */ -chrome.cast.media.PhotoMediaMetadata.prototype.images; - -/** @type {?number} */ -chrome.cast.media.PhotoMediaMetadata.prototype.latitude; - -/** @type {?number} */ -chrome.cast.media.PhotoMediaMetadata.prototype.longitude; - -/** @type {?number} */ -chrome.cast.media.PhotoMediaMetadata.prototype.width; - -/** @type {?number} */ -chrome.cast.media.PhotoMediaMetadata.prototype.height; - -/** @type {?string} */ -chrome.cast.media.PhotoMediaMetadata.prototype.creationDateTime; - -/** - * @type {chrome.cast.media.MetadataType} - * @deprecated Please use metadataType instead. - */ -chrome.cast.media.PhotoMediaMetadata.prototype.type; - - -/** - * @param {string} contentId - * @param {string} contentType - * @constructor - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media.MediaInfo - */ -chrome.cast.media.MediaInfo = function(contentId, contentType) {}; - -/** @type {string} */ -chrome.cast.media.MediaInfo.prototype.contentId; - -/** @type {chrome.cast.media.StreamType} */ -chrome.cast.media.MediaInfo.prototype.streamType; - -/** @type {string} */ -chrome.cast.media.MediaInfo.prototype.contentType; - -/** @type {*} */ -chrome.cast.media.MediaInfo.prototype.metadata; - -/** @type {?number} */ -chrome.cast.media.MediaInfo.prototype.duration; - -/** @type {Array<!chrome.cast.media.Track>} */ -chrome.cast.media.MediaInfo.prototype.tracks; - -/** @type {?chrome.cast.media.TextTrackStyle} */ -chrome.cast.media.MediaInfo.prototype.textTrackStyle; - -/** @type {Object} */ -chrome.cast.media.MediaInfo.prototype.customData; - - -/** - * @param {string} sessionId - * @param {number} mediaSessionId - * @constructor - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media.Media - */ -chrome.cast.media.Media = function(sessionId, mediaSessionId) {}; - -/** @type {string} */ -chrome.cast.media.Media.prototype.sessionId; - -/** @type {number} */ -chrome.cast.media.Media.prototype.mediaSessionId; - -/** @type {chrome.cast.media.MediaInfo} */ -chrome.cast.media.Media.prototype.media; - -/** @type {number} */ -chrome.cast.media.Media.prototype.playbackRate; - -/** @type {!chrome.cast.media.PlayerState} */ -chrome.cast.media.Media.prototype.playerState; - -/** @type {!Array<!chrome.cast.media.MediaCommand>} */ -chrome.cast.media.Media.prototype.supportedMediaCommands; - -/** @type {!chrome.cast.Volume} */ -chrome.cast.media.Media.prototype.volume; - -/** @type {?chrome.cast.media.IdleReason} */ -chrome.cast.media.Media.prototype.idleReason; - -/** @type {Array<number>} */ -chrome.cast.media.Media.prototype.activeTrackIds; - -/** @type {Object} */ -chrome.cast.media.Media.prototype.customData; - -/** - * @type {number} - * @deprecated Use getEstimatedTime instead. - */ -chrome.cast.media.Media.prototype.currentTime; - -/** - * @param {chrome.cast.media.GetStatusRequest} getStatusRequest - * @param {function()} successCallback - * @param {function(!chrome.cast.Error)} errorCallback - */ -chrome.cast.media.Media.prototype.getStatus = function( - getStatusRequest, successCallback, errorCallback) {}; - -/** - * @param {chrome.cast.media.PlayRequest} playRequest - * @param {function()} successCallback - * @param {function(!chrome.cast.Error)} errorCallback - */ -chrome.cast.media.Media.prototype.play = function( - playRequest, successCallback, errorCallback) {}; - -/** - * @param {chrome.cast.media.PauseRequest} pauseRequest - * @param {function()} successCallback - * @param {function(!chrome.cast.Error)} errorCallback - */ -chrome.cast.media.Media.prototype.pause = function( - pauseRequest, successCallback, errorCallback) {}; - -/** - * @param {!chrome.cast.media.SeekRequest} seekRequest - * @param {function()} successCallback - * @param {function(!chrome.cast.Error)} errorCallback - */ -chrome.cast.media.Media.prototype.seek = function( - seekRequest, successCallback, errorCallback) {}; - -/** - * @param {chrome.cast.media.StopRequest} stopRequest - * @param {function()} successCallback - * @param {function(!chrome.cast.Error)} errorCallback - */ -chrome.cast.media.Media.prototype.stop = function( - stopRequest, successCallback, errorCallback) {}; - -/** - * @param {!chrome.cast.media.VolumeRequest} volumeRequest - * @param {function()} successCallback - * @param {function(!chrome.cast.Error)} errorCallback - */ -chrome.cast.media.Media.prototype.setVolume = function( - volumeRequest, successCallback, errorCallback) {}; - -/** - * @param {!chrome.cast.media.EditTracksInfoRequest} editTracksInfoRequest - * @param {function()} successCallback - * @param {function(!chrome.cast.Error)} errorCallback - */ -chrome.cast.media.Media.prototype.editTracksInfo = function( - editTracksInfoRequest, successCallback, errorCallback) {}; - -/** - * @param {!chrome.cast.media.MediaCommand} command - * @return {boolean} - */ -chrome.cast.media.Media.prototype.supportsCommand = function(command) {}; - -/** - * @return {number} - * @suppress {deprecated} Uses currentTime member to compute estimated time. - */ -chrome.cast.media.Media.prototype.getEstimatedTime = function() {}; - -/** - * @param {function(boolean)} listener - */ -chrome.cast.media.Media.prototype.addUpdateListener = function(listener) {}; - -/** - * @param {function(boolean)} listener - */ -chrome.cast.media.Media.prototype.removeUpdateListener = function(listener) {}; - - -/** - * @namespace - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media#.timeout - */ -chrome.cast.media.timeout = {}; - -/** @type {number} */ -chrome.cast.media.timeout.load; - -/** @type {number} */ -chrome.cast.media.timeout.getStatus; - -/** @type {number} */ -chrome.cast.media.timeout.play; - -/** @type {number} */ -chrome.cast.media.timeout.pause; - -/** @type {number} */ -chrome.cast.media.timeout.seek; - -/** @type {number} */ -chrome.cast.media.timeout.stop; - -/** @type {number} */ -chrome.cast.media.timeout.setVolume; - -/** @type {number} */ -chrome.cast.media.timeout.editTracksInfo; - - -/** - * @param {number} trackId - * @param {!chrome.cast.media.TrackType} trackType - * @constructor - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media.Track - */ -chrome.cast.media.Track = function(trackId, trackType) {}; - -/** @type {number} */ -chrome.cast.media.Track.prototype.trackId; - -/** @type {?string} */ -chrome.cast.media.Track.prototype.trackContentId; - -/** @type {?string} */ -chrome.cast.media.Track.prototype.trackContentType; - -/** @type {!chrome.cast.media.TrackType} */ -chrome.cast.media.Track.prototype.type; - -/** @type {?string} */ -chrome.cast.media.Track.prototype.name; - -/** @type {?string} */ -chrome.cast.media.Track.prototype.language; - -/** @type {?chrome.cast.media.TextTrackType} */ -chrome.cast.media.Track.prototype.subtype; - -/** @type {Object} */ -chrome.cast.media.Track.prototype.customData; - - -/** - * @constructor - * @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media.TextTrackStyle - */ -chrome.cast.media.TextTrackStyle = function() {}; - -/** @type {?string} */ -chrome.cast.media.TextTrackStyle.prototype.foregroundColor; - -/** @type {?string} */ -chrome.cast.media.TextTrackStyle.prototype.backgroundColor; - -/** @type {?chrome.cast.media.TextTrackEdgeType} */ -chrome.cast.media.TextTrackStyle.prototype.edgeType; - -/** @type {?string} */ -chrome.cast.media.TextTrackStyle.prototype.edgeColor; - -/** @type {?chrome.cast.media.TextTrackWindowType} */ -chrome.cast.media.TextTrackStyle.prototype.windowType; - -/** @type {?string} */ -chrome.cast.media.TextTrackStyle.prototype.windowColor; - -/** @type {?number} */ -chrome.cast.media.TextTrackStyle.prototype.windowRoundedCornerRadius; - -/** @type {?number} */ -chrome.cast.media.TextTrackStyle.prototype.fontScale; - -/** @type {?string} */ -chrome.cast.media.TextTrackStyle.prototype.fontFamily; - -/** @type {?chrome.cast.media.TextTrackFontGenericFamily} */ -chrome.cast.media.TextTrackStyle.prototype.fontGenericFamily; - -/** @type {?chrome.cast.media.TextTrackFontStyle} */ -chrome.cast.media.TextTrackStyle.prototype.fontStyle; - -/** @type {Object} */ -chrome.cast.media.TextTrackStyle.prototype.customData;
diff --git a/ui/file_manager/file_manager/externs/chrome_echo_private.js b/ui/file_manager/file_manager/externs/chrome_echo_private.js deleted file mode 100644 index bdf0e290..0000000 --- a/ui/file_manager/file_manager/externs/chrome_echo_private.js +++ /dev/null
@@ -1,49 +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. - -/** @fileoverview Externs generated from namespace: echoPrivate */ - -/** - * @const - */ -chrome.echoPrivate = {}; - -/** - * Sets the offer info in Local State. - * @param {string} id The service id of the echo offer. - * @param {Object} offerInfo The offer info. - */ -chrome.echoPrivate.setOfferInfo = function(id, offerInfo) {}; - -/** - * Check in Local State for the offer info. - * @param {string} id The service id of the offer eligibility check. - * @param {Function} callback - */ -chrome.echoPrivate.getOfferInfo = function(id, callback) {}; - -/** - * Get the group or coupon code from underlying storage. - * @param {string} type Type of coupon code requested to be read (coupon or - * group). - * @param {Function} callback - */ -chrome.echoPrivate.getRegistrationCode = function(type, callback) {}; - -/** - * Get the OOBE timestamp. - * @param {Function} callback - */ -chrome.echoPrivate.getOobeTimestamp = function(callback) {}; - -/** - * If device policy allows user to redeem offer, displays a native dialog - * asking user for a consent to verify device's eligibility for the offer. If - * the device policy forbids user to redeem offers, displays a native dialog - * informing user the offer redeeming is disabled. - * @param {Object} consentRequester Information about the service requesting - * user consent. - * @param {Function} callback - */ -chrome.echoPrivate.getUserConsent = function(consentRequester, callback) {};
diff --git a/ui/file_manager/file_manager/externs/css_rule.js b/ui/file_manager/file_manager/externs/css_rule.js deleted file mode 100644 index b147475..0000000 --- a/ui/file_manager/file_manager/externs/css_rule.js +++ /dev/null
@@ -1,44 +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. - -/** - * @constructor - * @extends {CSSRule} - * @see http://dev.w3.org/csswg/css-animations/#interface-csskeyframerule - */ -function CSSKeyframeRule() {} - -/** @type {string} */ -CSSKeyframeRule.prototype.keyText; - -/** @type {CSSStyleDeclaration} */ -CSSKeyframeRule.prototype.style; - - -/** - * @constructor - * @extends {CSSRule} - * @see http://dev.w3.org/csswg/css-animations/#interface-csskeyframesrule - */ -function CSSKeyframesRule() {} - -/** @type {string} */ -CSSKeyframesRule.prototype.name; - -/** @type {!CSSRuleList} */ -CSSKeyframesRule.prototype.cssRules; - - -/** - * @type {number} - * @see http://dev.w3.org/csswg/css-animations/#interface-cssrule - */ -CSSRule.KEYFRAMES_RULE = 7; - - -/** - * @type {number} - * @see http://dev.w3.org/csswg/css-animations/#interface-cssrule - */ -CSSRule.KEYFRAME_RULE = 8;
diff --git a/ui/file_manager/file_manager/externs/gallery_background.js b/ui/file_manager/file_manager/externs/gallery_background.js deleted file mode 100644 index 548f369..0000000 --- a/ui/file_manager/file_manager/externs/gallery_background.js +++ /dev/null
@@ -1,16 +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. - -/** - * This is a type to let closure compiler recognize extended methods to Window - * instance at gallery/js/gallery.js. - */ -class GalleryWindow extends Window { - constructor() { - /** - * @type {Promise} - */ - this.initializePromise; - } -}
diff --git a/ui/file_manager/file_manager/externs/gallery_foreground.js b/ui/file_manager/file_manager/externs/gallery_foreground.js deleted file mode 100644 index 0f9bcbd..0000000 --- a/ui/file_manager/file_manager/externs/gallery_foreground.js +++ /dev/null
@@ -1,33 +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. - -/** - * BackgroundComponents. - */ -class BackgroundComponents { - constructor() { - /** - * @type {!Object<string>} - */ - this.stringData; - - /** - * @type {!VolumeManager} - */ - this.volumeManager; - } -} - -/** - * A global flag which indicates whether it is in tests or not. This is set in - * gallery/js/background.js. - * - * @type {boolean} - */ -Window.prototype.IN_TEST; - -/** - * @type {string} - */ -Entry.prototype.cachedUrl;
diff --git a/ui/file_manager/file_manager/externs/platform.js b/ui/file_manager/file_manager/externs/platform.js index e0727797..856fe38 100644 --- a/ui/file_manager/file_manager/externs/platform.js +++ b/ui/file_manager/file_manager/externs/platform.js
@@ -11,35 +11,3 @@ */ Window.prototype.webkitResolveLocalFileSystemURL = function( url, successCallback, opt_errorCallback) {}; - -/** - * Media error: MEDIA_ERR_ABORTED. - * @type {number} - * @const - * @see http://dev.w3.org/html5/spec-author-view/video.html#mediaerror - */ -MediaError.MEDIA_ERR_ABORTED = 1; - -/** - * Media error: MEDIA_ERR_NETWORK. - * @type {number} - * @const - * @see http://dev.w3.org/html5/spec-author-view/video.html#mediaerror - */ -MediaError.MEDIA_ERR_NETWORK = 2; - -/** - * Media error: MEDIA_ERR_DECODE. - * @type {number} - * @const - * @see http://dev.w3.org/html5/spec-author-view/video.html#mediaerror - */ -MediaError.MEDIA_ERR_DECODE = 3; - -/** - * Media error: MEDIA_ERR_SRC_NOT_SUPPORTED. - * @type {number} - * @const - * @see http://dev.w3.org/html5/spec-author-view/video.html#mediaerror - */ -MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
diff --git a/ui/file_manager/file_manager/manifest.json b/ui/file_manager/file_manager/manifest.json index 983426af..1d853df9 100644 --- a/ui/file_manager/file_manager/manifest.json +++ b/ui/file_manager/file_manager/manifest.json
@@ -25,7 +25,6 @@ "clipboardWrite", "commandLinePrivate", "contextMenus", - "echoPrivate", "fileManagerPrivate", { "fileSystem": ["requestFileSystem", "write"]
diff --git a/ui/file_manager/file_names.gni b/ui/file_manager/file_names.gni index 0f34cf5..0f92576 100644 --- a/ui/file_manager/file_names.gni +++ b/ui/file_manager/file_names.gni
@@ -1,14 +1,4 @@ # Static files are used as-is from the repository. -audio_static_js_files = [ - "audio_player/js/audio_player.js", - "audio_player/js/background.js", - "audio_player/js/error_util.js", - "audio_player/js/main.js", - "audio_player/js/main_background.js", - "audio_player/js/metadata_worker.js", - "audio_player/js/test_util.js", -] - image_loader_static_js_files = [ "image_loader/background.js", "image_loader/cache.js", @@ -79,7 +69,6 @@ "file_manager/common/js/icon_util.js", "file_manager/common/js/importer_common.js", "file_manager/common/js/lru_cache.js", - "file_manager/common/js/mediasession_types.js", "file_manager/common/js/metrics.js", "file_manager/common/js/metrics_base.js", "file_manager/common/js/mock_chrome.js", @@ -289,14 +278,6 @@ # Generated files are built from the repository and the final JS files is only # available in the "gen/" folder. -audio_generated_js_files = [ - "audio_player/elements/audio_player.js", - "audio_player/elements/control_panel.js", - "audio_player/elements/repeat_button.js", - "audio_player/elements/track_info_panel.js", - "audio_player/elements/track_list.js", -] - image_loader_generated_js_files = [ "image_loader/image_orientation.js", "image_loader/lru_cache.js",
diff --git a/ui/gfx/geometry/linear_gradient.cc b/ui/gfx/geometry/linear_gradient.cc index ea769b3..05f9c39 100644 --- a/ui/gfx/geometry/linear_gradient.cc +++ b/ui/gfx/geometry/linear_gradient.cc
@@ -49,6 +49,9 @@ } void LinearGradient::Transform(const gfx::Transform& transform) { + if (transform.IsIdentity()) + return; + gfx::PointF origin, end; float radian = gfx::DegToRad(static_cast<float>(angle_)); float y = -sin(radian); @@ -57,19 +60,17 @@ transform.TransformPoint(&origin); transform.TransformPoint(&end); gfx::Vector2dF diff = end - origin; - int16_t new_angle = - -static_cast<int16_t>(gfx::RadToDeg(atan2(diff.y(), diff.x()))); - angle_ = new_angle; + float new_angle = gfx::RadToDeg(atan2(diff.y(), diff.x())); + angle_ = -static_cast<int16_t>(std::round(new_angle)); } std::string LinearGradient::ToString() const { std::string result = base::StringPrintf( - "LinearGradient{angle=%u, step_count=%zu [", angle_, step_count_); - for (size_t i = 0; i < step_count_; i++) { + "LinearGradient{angle=%d, step_count=%zu [", angle_, step_count_); + for (size_t i = 0; i < step_count_; ++i) { if (i) result += " - "; - result += base::NumberToString(steps_[i].percent) + ":" + - base::NumberToString(static_cast<int>(steps_[i].alpha)); + result += base::StringPrintf("%f:%u", steps_[i].percent, steps_[i].alpha); } return result + "]}"; }
diff --git a/ui/gfx/geometry/mask_filter_info.h b/ui/gfx/geometry/mask_filter_info.h index 37da7d7..22cc295 100644 --- a/ui/gfx/geometry/mask_filter_info.h +++ b/ui/gfx/geometry/mask_filter_info.h
@@ -73,7 +73,8 @@ }; inline bool operator==(const MaskFilterInfo& lhs, const MaskFilterInfo& rhs) { - return lhs.rounded_corner_bounds() == rhs.rounded_corner_bounds(); + return (lhs.rounded_corner_bounds() == rhs.rounded_corner_bounds()) && + (lhs.gradient_mask() == rhs.gradient_mask()); } inline bool operator!=(const MaskFilterInfo& lhs, const MaskFilterInfo& rhs) {
diff --git a/ui/lottie/animation.cc b/ui/lottie/animation.cc index 52513a1..03fcdb28 100644 --- a/ui/lottie/animation.cc +++ b/ui/lottie/animation.cc
@@ -35,6 +35,11 @@ boundaries.start_offset < boundaries.end_offset; } +bool IsInCycleBoundaries(base::TimeDelta offset, + const Animation::CycleBoundaries& boundaries) { + return offset >= boundaries.start_offset && offset < boundaries.end_offset; +} + Animation::CycleBoundaries GetCycleAtIndex( const std::vector<Animation::CycleBoundaries>& scheduled_cycles, int cycle_idx) { @@ -47,6 +52,8 @@ Animation::TimerControl::TimerControl( std::vector<CycleBoundaries> scheduled_cycles, + base::TimeDelta initial_offset, + int initial_completed_cycles, const base::TimeDelta& total_duration, const base::TimeTicks& start_timestamp, bool should_reverse, @@ -54,9 +61,10 @@ : scheduled_cycles_(std::move(scheduled_cycles)), total_duration_(total_duration), previous_tick_(start_timestamp), - current_cycle_progress_(scheduled_cycles_.front().start_offset), + current_cycle_progress_(initial_offset), should_reverse_(should_reverse), - current_cycle_(scheduled_cycles_.front()) { + completed_cycles_(initial_completed_cycles), + current_cycle_(GetCycleAtIndex(scheduled_cycles_, completed_cycles_)) { SetPlaybackSpeed(playback_speed); } @@ -127,7 +135,8 @@ const Animation& animation) { return PlaybackConfig( /*scheduled_cycles=*/{CycleBoundaries::FullCycle(animation)}, - Animation::Style::kLoop); + /*initial_offset=*/base::TimeDelta(), + /*initial_completed_cycles=*/0, Animation::Style::kLoop); } // static @@ -143,8 +152,13 @@ Animation::PlaybackConfig::PlaybackConfig( std::vector<CycleBoundaries> scheduled_cycles, + base::TimeDelta initial_offset, + int initial_completed_cycles, Style style) - : scheduled_cycles(std::move(scheduled_cycles)), style(style) {} + : scheduled_cycles(std::move(scheduled_cycles)), + initial_offset(initial_offset), + initial_completed_cycles(initial_completed_cycles), + style(style) {} Animation::PlaybackConfig::PlaybackConfig(const PlaybackConfig& other) = default; @@ -266,6 +280,23 @@ } } +absl::optional<int> Animation::GetNumCompletedCycles() const { + if (state_ == PlayState::kStopped) + return absl::nullopt; + + // This can happen if Start() has been called but a single frame has not been + // painted yet. + if (!timer_control_) + return playback_config_.initial_completed_cycles; + + if (state_ == PlayState::kEnded) { + DCHECK_EQ(playback_config_.style, Style::kLinear); + return 1; + } + + return timer_control_->completed_cycles(); +} + absl::optional<Animation::PlaybackConfig> Animation::GetPlaybackConfig() const { if (state_ == PlayState::kStopped) { return absl::nullopt; @@ -378,8 +409,9 @@ void Animation::InitTimer(const base::TimeTicks& timestamp) { DCHECK(!timer_control_); timer_control_ = std::make_unique<TimerControl>( - playback_config_.scheduled_cycles, GetAnimationDuration(), timestamp, - playback_config_.style == Style::kThrobbing, playback_speed_); + playback_config_.scheduled_cycles, playback_config_.initial_offset, + playback_config_.initial_completed_cycles, GetAnimationDuration(), + timestamp, playback_config_.style == Style::kThrobbing, playback_speed_); } void Animation::TryNotifyAnimationCycleEnded() const { @@ -416,6 +448,11 @@ if (playback_config.style == Style::kLinear) { DCHECK_EQ(playback_config.scheduled_cycles.size(), 1u); } + DCHECK_GE(playback_config.initial_completed_cycles, 0); + DCHECK(IsInCycleBoundaries( + playback_config.initial_offset, + GetCycleAtIndex(playback_config.scheduled_cycles, + playback_config.initial_completed_cycles))); } } // namespace lottie
diff --git a/ui/lottie/animation.h b/ui/lottie/animation.h index 46358ca..ed13bd1 100644 --- a/ui/lottie/animation.h +++ b/ui/lottie/animation.h
@@ -122,7 +122,10 @@ const Animation& animation); PlaybackConfig(); - PlaybackConfig(std::vector<CycleBoundaries> scheduled_cycles, Style style); + PlaybackConfig(std::vector<CycleBoundaries> scheduled_cycles, + base::TimeDelta initial_offset, + int initial_completed_cycles, + Style style); PlaybackConfig(const PlaybackConfig& other); PlaybackConfig& operator=(const PlaybackConfig& other); ~PlaybackConfig(); @@ -139,6 +142,20 @@ // // If |style| is kLinear, |scheduled_cycles| must have exactly one entry. std::vector<CycleBoundaries> scheduled_cycles; + + // |initial_offset| and |initial_completed_cycles| combined dictate + // where to start playing the animation from within the |scheduled_cycles| + // above. The most common thing is to start playing from the very beginning + // (|initial_offset| is the |start_offset| of the first scheduled cycle + // and |initial_completed_cycles| is 0). But this allows the caller to + // specify an arbitrary starting point. + base::TimeDelta initial_offset; + // The animation will start playing as if it has already completed the + // number of cycles specified below. Note this not only dictates which + // scheduled cycle the animation starts within, but also the initial + // direction of the animation for throbbing animations. + int initial_completed_cycles = 0; + Style style = Style::kLoop; }; @@ -192,6 +209,10 @@ // yet. absl::optional<float> GetCurrentProgress() const; + // Returns the number of animation cycles that have been completed since + // Play() was called, or nullopt if the animation is currently Stop()ed. + absl::optional<int> GetNumCompletedCycles() const; + // Returns the currently active PlaybackConfig, or nullopt if the animation // is currently Stop()ed. absl::optional<PlaybackConfig> GetPlaybackConfig() const; @@ -245,6 +266,8 @@ class COMPONENT_EXPORT(UI_LOTTIE) TimerControl final { public: TimerControl(std::vector<CycleBoundaries> scheduled_cycles, + base::TimeDelta initial_offset, + int initial_completed_cycles, const base::TimeDelta& total_duration, const base::TimeTicks& start_timestamp, bool should_reverse,
diff --git a/ui/lottie/animation_unittest.cc b/ui/lottie/animation_unittest.cc index f5036bc1..f25da65 100644 --- a/ui/lottie/animation_unittest.cc +++ b/ui/lottie/animation_unittest.cc
@@ -435,7 +435,8 @@ EXPECT_FALSE(observer.animation_cycle_ended()); animation_->Start(Animation::PlaybackConfig( - {{kStartTime, kStartTime + kDuration}}, Animation::Style::kLinear)); + {{kStartTime, kStartTime + kDuration}}, /*initial_offset=*/kStartTime, + /*initial_completed_cycles=*/0, Animation::Style::kLinear)); EXPECT_TRUE(IsScheduledToPlay()); EXPECT_FALSE(observer.animation_will_start_playing()); @@ -497,7 +498,8 @@ AdvanceClock(base::Milliseconds(200)); animation_->Start(Animation::PlaybackConfig( - {{kStartTime, kStartTime + kDuration}}, Animation::Style::kLinear)); + {{kStartTime, kStartTime + kDuration}}, /*initial_offset=*/kStartTime, + /*initial_completed_cycles=*/0, Animation::Style::kLinear)); animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize()); @@ -597,7 +599,8 @@ EXPECT_TRUE(IsStopped()); animation_->Start(Animation::PlaybackConfig( - {{kStartTime, kStartTime + kDuration}}, Animation::Style::kLoop)); + {{kStartTime, kStartTime + kDuration}}, /*initial_offset=*/kStartTime, + /*initial_completed_cycles=*/0, Animation::Style::kLoop)); EXPECT_TRUE(IsScheduledToPlay()); EXPECT_FALSE(observer.animation_will_start_playing()); @@ -662,10 +665,11 @@ AdvanceClock(base::Milliseconds(300)); - animation_->Start( - Animation::PlaybackConfig({{kStartTime1, kStartTime1 + kDuration1}, - {kStartTime2, kStartTime2 + kDuration2}}, - Animation::Style::kLoop)); + animation_->Start(Animation::PlaybackConfig( + {{kStartTime1, kStartTime1 + kDuration1}, + {kStartTime2, kStartTime2 + kDuration2}}, + /*initial_offset=*/kStartTime1, + /*initial_completed_cycles=*/0, Animation::Style::kLoop)); // T: 400 ms animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize()); @@ -729,10 +733,11 @@ AdvanceClock(base::Milliseconds(300)); - animation_->Start( - Animation::PlaybackConfig({{kStartTime1, kStartTime1 + kDuration1}, - {kStartTime2, kStartTime2 + kDuration2}}, - Animation::Style::kLoop)); + animation_->Start(Animation::PlaybackConfig( + {{kStartTime1, kStartTime1 + kDuration1}, + {kStartTime2, kStartTime2 + kDuration2}}, + /*initial_offset=*/kStartTime1, + /*initial_completed_cycles=*/0, Animation::Style::kLoop)); // T: 400 ms animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize()); @@ -764,7 +769,8 @@ AdvanceClock(base::Milliseconds(200)); animation_->Start(Animation::PlaybackConfig( - {{kStartTime, kStartTime + kDuration}}, Animation::Style::kLoop)); + {{kStartTime, kStartTime + kDuration}}, /*initial_offset=*/kStartTime, + /*initial_completed_cycles=*/0, Animation::Style::kLoop)); animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize()); ASSERT_TRUE(animation_->GetCurrentProgress()); @@ -884,7 +890,8 @@ AdvanceClock(base::Milliseconds(300)); animation_->Start(Animation::PlaybackConfig( - {{kStartTime, kStartTime + kDuration}}, Animation::Style::kThrobbing)); + {{kStartTime, kStartTime + kDuration}}, /*initial_offset=*/kStartTime, + /*initial_completed_cycles=*/0, Animation::Style::kThrobbing)); EXPECT_TRUE(IsScheduledToPlay()); EXPECT_FALSE(observer.animation_will_start_playing()); @@ -972,10 +979,11 @@ AdvanceClock(base::Milliseconds(300)); - animation_->Start( - Animation::PlaybackConfig({{kStartTime1, kStartTime1 + kDuration1}, - {kStartTime2, kStartTime2 + kDuration2}}, - Animation::Style::kThrobbing)); + animation_->Start(Animation::PlaybackConfig( + {{kStartTime1, kStartTime1 + kDuration1}, + {kStartTime2, kStartTime2 + kDuration2}}, + /*initial_offset=*/kStartTime1, + /*initial_completed_cycles=*/0, Animation::Style::kThrobbing)); // T: 400 ms animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize()); @@ -1046,10 +1054,11 @@ AdvanceClock(base::Milliseconds(300)); - animation_->Start( - Animation::PlaybackConfig({{kStartTime1, kStartTime1 + kDuration1}, - {kStartTime2, kStartTime2 + kDuration2}}, - Animation::Style::kThrobbing)); + animation_->Start(Animation::PlaybackConfig( + {{kStartTime1, kStartTime1 + kDuration1}, + {kStartTime2, kStartTime2 + kDuration2}}, + /*initial_offset=*/kStartTime1, + /*initial_completed_cycles=*/0, Animation::Style::kThrobbing)); // T: 400 ms animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize()); @@ -1080,7 +1089,8 @@ AdvanceClock(base::Milliseconds(200)); animation_->Start(Animation::PlaybackConfig( - {{kStartTime, kStartTime + kDuration}}, Animation::Style::kThrobbing)); + {{kStartTime, kStartTime + kDuration}}, /*initial_offset=*/kStartTime, + /*initial_completed_cycles=*/0, Animation::Style::kThrobbing)); animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize()); EXPECT_TRUE(IsPlaying()); @@ -1528,25 +1538,131 @@ Animation::PlaybackConfig test_config( {{/*start_offset=*/kAnimationDuration / 4, /*end_offset=*/kAnimationDuration * 3 / 4}}, - Animation::Style::kThrobbing); + /*initial_offset=*/kAnimationDuration / 2, + /*initial_completed_cycles=*/2, Animation::Style::kThrobbing); animation_->Start(test_config); ASSERT_TRUE(animation_->GetPlaybackConfig()); - EXPECT_THAT(*animation_->GetPlaybackConfig(), - FieldsAre(ElementsAre(FieldsAre( - test_config.scheduled_cycles.front().start_offset, - test_config.scheduled_cycles.front().end_offset)), - test_config.style)); + EXPECT_THAT( + *animation_->GetPlaybackConfig(), + FieldsAre(ElementsAre( + FieldsAre(test_config.scheduled_cycles.front().start_offset, + test_config.scheduled_cycles.front().end_offset)), + test_config.initial_offset, + test_config.initial_completed_cycles, test_config.style)); animation_->Stop(); EXPECT_FALSE(animation_->GetPlaybackConfig()); test_config.scheduled_cycles.front().start_offset = kAnimationDuration / 2; test_config.style = Animation::Style::kLoop; animation_->Start(test_config); ASSERT_TRUE(animation_->GetPlaybackConfig()); - EXPECT_THAT(*animation_->GetPlaybackConfig(), - FieldsAre(ElementsAre(FieldsAre( - test_config.scheduled_cycles.front().start_offset, - test_config.scheduled_cycles.front().end_offset)), - test_config.style)); + EXPECT_THAT( + *animation_->GetPlaybackConfig(), + FieldsAre(ElementsAre( + FieldsAre(test_config.scheduled_cycles.front().start_offset, + test_config.scheduled_cycles.front().end_offset)), + test_config.initial_offset, + test_config.initial_completed_cycles, test_config.style)); +} + +TEST_F(AnimationTest, GetNumCompletedCycles) { + EXPECT_FALSE(animation_->GetNumCompletedCycles()); + animation_->Start(Animation::PlaybackConfig::CreateDefault(*animation_)); + + ASSERT_TRUE(animation_->GetNumCompletedCycles()); + EXPECT_THAT(*animation_->GetNumCompletedCycles(), Eq(0)); + + animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize()); + ASSERT_TRUE(animation_->GetNumCompletedCycles()); + EXPECT_THAT(*animation_->GetNumCompletedCycles(), Eq(0)); + + AdvanceClock(kAnimationDuration / 2); + animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize()); + ASSERT_TRUE(animation_->GetNumCompletedCycles()); + EXPECT_THAT(*animation_->GetNumCompletedCycles(), Eq(0)); + + AdvanceClock(kAnimationDuration / 2); + animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize()); + ASSERT_TRUE(animation_->GetNumCompletedCycles()); + EXPECT_THAT(*animation_->GetNumCompletedCycles(), Eq(1)); + + AdvanceClock(kAnimationDuration); + animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize()); + ASSERT_TRUE(animation_->GetNumCompletedCycles()); + EXPECT_THAT(*animation_->GetNumCompletedCycles(), Eq(2)); + + animation_->Stop(); + EXPECT_FALSE(animation_->GetNumCompletedCycles()); +} + +TEST_F(AnimationTest, GetNumCompletedCyclesLinear) { + animation_->Start(Animation::PlaybackConfig::CreateWithStyle( + Animation::Style::kLinear, *animation_)); + + animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize()); + ASSERT_TRUE(animation_->GetNumCompletedCycles()); + EXPECT_THAT(*animation_->GetNumCompletedCycles(), Eq(0)); + + AdvanceClock(kAnimationDuration / 2); + animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize()); + ASSERT_TRUE(animation_->GetNumCompletedCycles()); + EXPECT_THAT(*animation_->GetNumCompletedCycles(), Eq(0)); + + AdvanceClock(kAnimationDuration / 2); + animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize()); + ASSERT_TRUE(animation_->GetNumCompletedCycles()); + EXPECT_THAT(*animation_->GetNumCompletedCycles(), Eq(1)); + + AdvanceClock(kAnimationDuration); + animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize()); + ASSERT_TRUE(animation_->GetNumCompletedCycles()); + EXPECT_THAT(*animation_->GetNumCompletedCycles(), Eq(1)); +} + +TEST_F(AnimationTest, StartsAtArbitraryInitialTimestamp) { + constexpr auto kStartTime = base::Milliseconds(400); + constexpr auto kDuration = base::Milliseconds(1000); + + AdvanceClock(base::Milliseconds(300)); + + animation_->Start(Animation::PlaybackConfig( + {{kStartTime, kStartTime + kDuration}}, + /*initial_offset=*/kStartTime + base::Milliseconds(100), + /*initial_completed_cycles=*/0, Animation::Style::kThrobbing)); + + // T: 500 ms + animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize()); + ASSERT_TRUE(animation_->GetCurrentProgress()); + EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), + (kStartTime + base::Milliseconds(100)) / kAnimationDuration); + + // T: 600 ms + AdvanceClock(base::Milliseconds(100)); + animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize()); + ASSERT_TRUE(animation_->GetCurrentProgress()); + EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), + (kStartTime + base::Milliseconds(200)) / kAnimationDuration); + + animation_->Stop(); + + // The animation has 1 completed cycle, so for a throbbing animation, it + // should immediately start playing in reverse. + animation_->Start(Animation::PlaybackConfig( + {{kStartTime, kStartTime + kDuration}}, + /*initial_offset=*/kStartTime + base::Milliseconds(500), + /*initial_completed_cycles=*/1, Animation::Style::kThrobbing)); + + // T: 900 ms + animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize()); + ASSERT_TRUE(animation_->GetCurrentProgress()); + EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), + (kStartTime + base::Milliseconds(500)) / kAnimationDuration); + + // T: 800 ms + AdvanceClock(base::Milliseconds(100)); + animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize()); + ASSERT_TRUE(animation_->GetCurrentProgress()); + EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), + (kStartTime + base::Milliseconds(400)) / kAnimationDuration); } } // namespace lottie
diff --git a/ui/ozone/platform/wayland/host/wayland_surface.cc b/ui/ozone/platform/wayland/host/wayland_surface.cc index accaa6a..77e002a 100644 --- a/ui/ozone/platform/wayland/host/wayland_surface.cc +++ b/ui/ozone/platform/wayland/host/wayland_surface.cc
@@ -278,38 +278,17 @@ wl::Object<wl_region> region( wl_compositor_create_region(connection_->compositor())); - auto window_shape_in_dips = root_window_->GetWindowShape(); - - bool surface_submission_in_pixel_coordinates = + const bool surface_submission_in_pixel_coordinates = SurfaceSubmissionInPixelCoordinates(); - // Only root_surface and primary_subsurface should use |window_shape_in_dips|. - // Do not use non empty |window_shape_in_dips| if |region_px| is empty, i.e. - // this surface is transluscent. - bool is_primary_or_root = - root_window_->root_surface() == this || - (root_window()->primary_subsurface() && - root_window()->primary_subsurface()->wayland_surface() == this); - bool is_empty = - std::all_of(region_px.begin(), region_px.end(), - [](const gfx::Rect& rect) { return rect.IsEmpty(); }); - if (window_shape_in_dips.has_value() && !is_empty && is_primary_or_root) { - for (auto& rect : window_shape_in_dips.value()) { - if (surface_submission_in_pixel_coordinates) - rect = gfx::ScaleToEnclosingRect(rect, root_window_->window_scale()); + for (const auto& rect_px : region_px) { + if (surface_submission_in_pixel_coordinates) { + wl_region_add(region.get(), rect_px.x(), rect_px.y(), rect_px.width(), + rect_px.height()); + } else { + gfx::Rect rect = gfx::ScaleToEnclosingRect(rect_px, 1.f / buffer_scale); wl_region_add(region.get(), rect.x(), rect.y(), rect.width(), rect.height()); } - } else { - for (const auto& rect_px : region_px) { - if (surface_submission_in_pixel_coordinates) { - wl_region_add(region.get(), rect_px.x(), rect_px.y(), rect_px.width(), - rect_px.height()); - } else { - gfx::Rect rect = gfx::ScaleToEnclosingRect(rect_px, 1.f / buffer_scale); - wl_region_add(region.get(), rect.x(), rect.y(), rect.width(), - rect.height()); - } - } } return region; }
diff --git a/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc b/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc index 63ea86e..2980a69 100644 --- a/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc +++ b/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc
@@ -328,11 +328,6 @@ } } -absl::optional<std::vector<gfx::Rect>> WaylandToplevelWindow::GetWindowShape() - const { - return window_shape_in_dips_; -} - bool WaylandToplevelWindow::IsScreenCoordinatesEnabled() const { return screen_coordinates_enabled_; }
diff --git a/ui/ozone/platform/wayland/host/wayland_toplevel_window.h b/ui/ozone/platform/wayland/host/wayland_toplevel_window.h index 936c326..b934c3f 100644 --- a/ui/ozone/platform/wayland/host/wayland_toplevel_window.h +++ b/ui/ozone/platform/wayland/host/wayland_toplevel_window.h
@@ -79,7 +79,6 @@ void SetOrigin(const gfx::Point& origin); // WaylandWindow overrides: - absl::optional<std::vector<gfx::Rect>> GetWindowShape() const override; bool IsScreenCoordinatesEnabled() const override; // Client-side decorations on Wayland take some portion of the window surface, @@ -251,8 +250,6 @@ // e.g. lacros-taskmanager. bool use_native_frame_ = false; - absl::optional<std::vector<gfx::Rect>> window_shape_in_dips_; - absl::optional<std::vector<gfx::Rect>> opaque_region_px_; absl::optional<gfx::Rect> input_region_px_;
diff --git a/ui/ozone/platform/wayland/host/wayland_window.cc b/ui/ozone/platform/wayland/host/wayland_window.cc index b76841f..8a02abe 100644 --- a/ui/ozone/platform/wayland/host/wayland_window.cc +++ b/ui/ozone/platform/wayland/host/wayland_window.cc
@@ -570,10 +570,6 @@ delegate_->OnCloseRequest(); } -absl::optional<std::vector<gfx::Rect>> WaylandWindow::GetWindowShape() const { - return absl::nullopt; -} - void WaylandWindow::OnDragEnter(const gfx::PointF& point, std::unique_ptr<OSExchangeData> data, int operation) {
diff --git a/ui/ozone/platform/wayland/host/wayland_window.h b/ui/ozone/platform/wayland/host/wayland_window.h index 2ae137f..9a925c8 100644 --- a/ui/ozone/platform/wayland/host/wayland_window.h +++ b/ui/ozone/platform/wayland/host/wayland_window.h
@@ -262,8 +262,6 @@ virtual void OnDragLeave(); virtual void OnDragSessionClose(ui::mojom::DragOperation operation); - virtual absl::optional<std::vector<gfx::Rect>> GetWindowShape() const; - // Tells if the surface has already been configured. virtual bool IsSurfaceConfigured() = 0;
diff --git a/ui/views/cocoa/native_widget_mac_ns_window_host.mm b/ui/views/cocoa/native_widget_mac_ns_window_host.mm index eaca66e6..a3b06fbf 100644 --- a/ui/views/cocoa/native_widget_mac_ns_window_host.mm +++ b/ui/views/cocoa/native_widget_mac_ns_window_host.mm
@@ -232,12 +232,6 @@ gfx::NativeWindow native_window) { NSWindow* window = native_window.GetNativeNSWindow(); - // TODO(bur): Get tab dragging working. - // For tab dragging we need to map browser_view_->overlay_view_'s window to - // browser_view_'s window. However we can't do this all the time since - // browser_view_->overlay_view_ is a valid wigdet for some things. window = - // window.parentWindow ?: window; - if (NativeWidgetMacNSWindow* widget_window = base::mac::ObjCCast<NativeWidgetMacNSWindow>(window)) { return GetFromId([widget_window bridgedNativeWidgetId]);
diff --git a/ui/views/focus/focus_traversal_unittest.cc b/ui/views/focus/focus_traversal_unittest.cc index a16b093f..0bd3edd5 100644 --- a/ui/views/focus/focus_traversal_unittest.cc +++ b/ui/views/focus/focus_traversal_unittest.cc
@@ -155,11 +155,12 @@ if (details.child == this && details.is_add) { if (!widget_) { - widget_ = std::make_unique<Widget>(); + auto widget = std::make_unique<Widget>(); + widget_ = widget.get(); Widget::InitParams params(Widget::InitParams::TYPE_CONTROL); params.parent = details.parent->GetWidget()->GetNativeView(); - params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; widget_->Init(std::move(params)); + widget.release(); // Widget now owned by widget hierarchy. widget_->SetFocusTraversableParentView(this); widget_->SetContentsView(std::move(child_)); } @@ -174,7 +175,7 @@ private: std::unique_ptr<View> child_; - std::unique_ptr<Widget> widget_; + Widget* widget_ = nullptr; }; } // namespace
diff --git a/ui/webui/resources/cr_components/history_clusters/cluster.html b/ui/webui/resources/cr_components/history_clusters/cluster.html index df5732b..ed08663 100644 --- a/ui/webui/resources/cr_components/history_clusters/cluster.html +++ b/ui/webui/resources/cr_components/history_clusters/cluster.html
@@ -7,10 +7,6 @@ padding-bottom: var(--cluster-padding-vertical); } - :host([in-side-panel]) { - padding-bottom: 0; - } - :host-context(.focus-outline-visible):host(:focus) #container { box-shadow: inset 0 0 0 2px var(--cr-focus-outline-color); } @@ -21,20 +17,16 @@ margin-bottom: var(--cluster-padding-vertical); } - :host([in-side-panel]) #container { - border-bottom: 3px solid var(--cr-separator-color); - } - /* We need an inner container div to apply spacing between clusters. This is because iron-list ignores the margin on the host element. */ - :host(:not([in-side-panel])) #container { + #container { background-color: var(--cr-card-background-color); border-radius: var(--cr-card-border-radius); box-shadow: var(--cr-card-shadow); padding: var(--cluster-padding-vertical) 0; } - .label-row { + #label-row { align-items: center; display: flex; flex-grow: 1; @@ -45,20 +37,12 @@ user-select: none; } - .label { + #label { color: var(--cr-primary-text-color); font-size: 1rem; /* 16px */ font-weight: 500; } - #label-and-timestamp { - align-items: center; - display: flex; - flex-direction: column; - flex-shrink: 0; - row-gap: 6px; - } - #related-searches { display: flex; flex-wrap: wrap; @@ -115,18 +99,8 @@ on-open-all-visits="onOpenAllVisits_" on-remove-all-visits="onRemoveAllVisits_" on-remove-visit="onRemoveVisit_"> - <!-- In the side panel the label and timestamp should be stacked on the - left, while outside the side panel the timestamp and the menu should - be side by side on the right. --> - <div class="label-row" hidden="[[!inSidePanel]]"> - <div id="label-and-timestamp"> - <div id="labelSidePanel" class="label"></div> - <div class="timestamp">[[cluster.visits.0.relativeDate]]</div> - </div> - <menu-container></menu-container> - </div> - <div class="label-row" hidden="[[inSidePanel]]"> - <div id="label" class="label"></div> + <div id="label-row"> + <div id="label"></div> <div class="timestamp-and-menu"> <div class="timestamp">[[cluster.visits.0.relativeDate]]</div> <menu-container></menu-container>
diff --git a/ui/webui/resources/cr_components/history_clusters/cluster.ts b/ui/webui/resources/cr_components/history_clusters/cluster.ts index e0950aaa..0287cfb 100644 --- a/ui/webui/resources/cr_components/history_clusters/cluster.ts +++ b/ui/webui/resources/cr_components/history_clusters/cluster.ts
@@ -37,7 +37,6 @@ interface HistoryClusterElement { $: { label: HTMLElement, - labelSidePanel: HTMLElement, container: HTMLElement, }; } @@ -67,15 +66,6 @@ }, /** - * Whether the cluster is in the side panel. - */ - inSidePanel: { - type: Boolean, - value: loadTimeData.getBoolean('inSidePanel'), - reflectToAttribute: true, - }, - - /** * The current query for which related clusters are requested and shown. */ query: String, @@ -123,7 +113,6 @@ cluster: Cluster; index: number; - inSidePanel: boolean; query: string; private callbackRouter_: PageCallbackRouter; private expanded_: boolean; @@ -311,9 +300,8 @@ return 'no_label'; } - const label = this.inSidePanel ? this.$.labelSidePanel : this.$.label; insertHighlightedTextWithMatchesIntoElement( - label, this.cluster.label!, this.cluster.labelMatchPositions); + this.$.label, this.cluster.label!, this.cluster.labelMatchPositions); return this.cluster.label!; }
diff --git a/ui/webui/resources/cr_components/history_clusters/clusters.html b/ui/webui/resources/cr_components/history_clusters/clusters.html index 51d4060c..2cde804 100644 --- a/ui/webui/resources/cr_components/history_clusters/clusters.html +++ b/ui/webui/resources/cr_components/history_clusters/clusters.html
@@ -13,11 +13,6 @@ padding: var(--first-cluster-padding-top) var(--cluster-padding-horizontal) 0; } - :host([in-side-panel]) #clusters { - min-width: 0; - padding: 0 0 0; - } - #placeholder { align-items: center; color: var(--md-loading-message-color);
diff --git a/ui/webui/resources/cr_components/history_clusters/clusters.ts b/ui/webui/resources/cr_components/history_clusters/clusters.ts index 50f81c4..1f24556 100644 --- a/ui/webui/resources/cr_components/history_clusters/clusters.ts +++ b/ui/webui/resources/cr_components/history_clusters/clusters.ts
@@ -68,15 +68,6 @@ static get properties() { return { /** - * Whether the clusters are in the side panel. - */ - inSidePanel: { - type: Boolean, - value: loadTimeData.getBoolean('inSidePanel'), - reflectToAttribute: true, - }, - - /** * The current query for which related clusters are requested and shown. */ query: { @@ -122,7 +113,6 @@ // Properties //============================================================================ - inSidePanel: boolean; query: string; private callbackRouter_: PageCallbackRouter; private headerText_: string;
diff --git a/ui/webui/resources/cr_components/history_clusters/shared_vars.css b/ui/webui/resources/cr_components/history_clusters/shared_vars.css index 05ffceb..6146827 100644 --- a/ui/webui/resources/cr_components/history_clusters/shared_vars.css +++ b/ui/webui/resources/cr_components/history_clusters/shared_vars.css
@@ -31,11 +31,6 @@ /* Sizes: */ html { - --card-max-width: 960px; - --card-min-width: 550px; - --card-padding-between: 16px; - --card-padding-side: 24px; - --first-card-padding-top: 24px; --cluster-max-width: var(--card-max-width); --cluster-min-width: var(--card-min-width); --cluster-padding-horizontal: var(--card-padding-side);
diff --git a/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.d.ts b/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.d.ts index 6190d5c..5d1bd058 100644 --- a/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.d.ts +++ b/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.d.ts
@@ -4,7 +4,6 @@ import {CrLottieElement} from 'chrome://resources/cr_elements/cr_lottie/cr_lottie.m.js'; import {IronIconElement} from 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; -import {LegacyElementMixin} from 'chrome://resources/polymer/v3_0/polymer/lib/legacy/legacy-element-mixin.js'; export const FINGERPRINT_SCANNED_ICON_DARK: string; export const FINGERPRINT_SCANNED_ICON_LIGHT: string; @@ -15,8 +14,7 @@ export const PROGRESS_CIRCLE_FILL_COLOR_DARK: string; export const PROGRESS_CIRCLE_FILL_COLOR_LIGHT: string; -interface CrFingerprintProgressArcElement extends LegacyElementMixin, - HTMLElement { +interface CrFingerprintProgressArcElement extends HTMLElement { circleRadius: number; reset(): void;
diff --git a/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.js b/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.js index 37feb7c2..61803514 100644 --- a/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.js +++ b/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.js
@@ -7,7 +7,7 @@ import './cr_fingerprint_icon.js'; import '../cr_lottie/cr_lottie.m.js'; -import {html, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {html, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; /** * The dark-mode fingerprint icon displayed temporarily each time a user scans @@ -110,81 +110,90 @@ */ const PROGRESS_CIRCLE_STROKE_WIDTH = 4; -Polymer({ - is: 'cr-fingerprint-progress-arc', - _template: html`{__html_template__}`, +/** @polymer */ +export class CrFingerprintProgressArcElement extends PolymerElement { + static get is() { + return 'cr-fingerprint-progress-arc'; + } - properties: { - /** - * Radius of the fingerprint progress circle being displayed. - * @type {number} - */ - circleRadius: { - type: Number, - value: DEFAULT_PROGRESS_CIRCLE_RADIUS, - }, + static get template() { + return html`{__html_template__}`; + } + + static get properties() { + return { + /** + * Radius of the fingerprint progress circle being displayed. + * @type {number} + */ + circleRadius: { + type: Number, + value: DEFAULT_PROGRESS_CIRCLE_RADIUS, + }, + + /** + * Whether lottie animation should be autoplayed. + * @type {boolean} + */ + autoplay: { + type: Boolean, + value: false, + }, + + /** + * Scale factor based the configured radius (circleRadius) vs the default + * radius (DEFAULT_PROGRESS_CIRCLE_RADIUS). + * This will affect the size of icons and check mark. + * @type {number} + * @private + */ + scale_: { + type: Number, + value: 1.0, + }, + + /** + * Whether fingerprint enrollment is complete. + * @type {boolean} + * @private + */ + isComplete_: Boolean, + + /** + * Whether the fingerprint progress page is being rendered in dark mode. + * @type {boolean} + * @private + */ + isDarkModeActive_: { + type: Boolean, + value: false, + observer: 'onDarkModeChanged_', + }, + }; + } + + constructor() { + super(); /** - * Whether lottie animation should be autoplayed. - * @type {boolean} + * Animation ID for the fingerprint progress circle. + * @private {number|undefined} */ - autoplay: { - type: Boolean, - value: false, - }, + this.progressAnimationIntervalId_ = undefined; /** - * Scale factor based the configured radius (circleRadius) vs the default - * radius (DEFAULT_PROGRESS_CIRCLE_RADIUS). - * This will affect the size of icons and check mark. - * @type {number} - * @private + * Percentage of the enrollment process completed as of the last update. + * @private {number} */ - scale_: { - type: Number, - value: 1.0, - }, + this.progressPercentDrawn_ = 0; /** - * Whether fingerprint enrollment is complete. - * @type {boolean} - * @private + * Timer ID for fingerprint scan success update. + * @private {number|undefined} */ - isComplete_: Boolean, - - /** - * Whether the fingerprint progress page is being rendered in dark mode. - * @type {boolean} - * @private - */ - isDarkModeActive_: { - type: Boolean, - value: false, - observer: 'onDarkModeChanged_', - }, - }, - - /** - * Animation ID for the fingerprint progress circle. - * @type {number|undefined} - * @private - */ - progressAnimationIntervalId_: undefined, - - /** - * Percentage of the enrollment process completed as of the last update. - * @type {number} - * @private - */ - progressPercentDrawn_: 0, - - /** - * Timer ID for fingerprint scan success update. - * @type {number|undefined} - * @private - */ - updateTimerId_: undefined, + this.updateTimerId_ = undefined; + } /** * Updates the current state to account for whether dark mode is enabled. @@ -195,14 +204,16 @@ this.drawProgressCircle_(this.progressPercentDrawn_); this.updateAnimationAsset_(); this.updateIconAsset_(); - }, + } /** @override */ - attached() { + connectedCallback() { + super.connectedCallback(); + this.scale_ = this.circleRadius / DEFAULT_PROGRESS_CIRCLE_RADIUS; this.updateIconAsset_(); this.updateImages_(); - }, + } /** * Reset the element to initial state, when the enrollment just starts. @@ -223,7 +234,7 @@ this.updateAnimationAsset_(); this.resizeAndCenterIcon_(scanningAnimation); scanningAnimation.hidden = false; - }, + } /** * Animates the progress circle. Animates an arc that starts at the top of @@ -264,7 +275,9 @@ this.clearCanvas_(); this.drawProgressCircle_(nextPercentToDraw); if (!this.progressAnimationIntervalId_) { - this.fire('cr-fingerprint-progress-arc-drawn'); + this.dispatchEvent(new CustomEvent( + 'cr-fingerprint-progress-arc-drawn', + {bubbles: true, composed: true})); } nextPercentToDraw += step; }; @@ -277,7 +290,7 @@ } else { this.animateScanProgress_(); } - }, + } /** * Controls the animation based on the value of |shouldPlay|. @@ -288,12 +301,12 @@ const scanningAnimation = /** @type {CrLottieElement|HTMLElement} */ (this.$.scanningAnimation); scanningAnimation.setPlay(shouldPlay); - }, + } /** @public */ isComplete() { return this.isComplete_; - }, + } /** * Draws an arc on the canvas element around the center with radius @@ -314,7 +327,7 @@ ctx.lineWidth = PROGRESS_CIRCLE_STROKE_WIDTH; ctx.strokeStyle = color; ctx.stroke(); - }, + } /** * Draws a circle on the canvas element around the center with radius @@ -346,7 +359,7 @@ this.isDarkModeActive_ ? PROGRESS_CIRCLE_BACKGROUND_COLOR_DARK : PROGRESS_CIRCLE_BACKGROUND_COLOR_LIGHT); this.progressPercentDrawn_ = currentPercent; - }, + } /** * Updates the lottie animation taking into account the current state and @@ -365,7 +378,7 @@ scanningAnimation.animationUrl = this.isDarkModeActive_ ? 'chrome://theme/IDR_FINGERPRINT_ICON_ANIMATION_DARK' : 'chrome://theme/IDR_FINGERPRINT_ICON_ANIMATION_LIGHT'; - }, + } /** * Updates the fingerprint-scanned icon based on whether dark mode is enabled. @@ -377,7 +390,7 @@ fingerprintScanned.icon = this.isDarkModeActive_ ? FINGERPRINT_SCANNED_ICON_DARK : FINGERPRINT_SCANNED_ICON_LIGHT; - }, + } /* * Cleans up any pending animation update created by setInterval(). @@ -393,7 +406,7 @@ window.clearTimeout(this.updateTimerId_); this.updateTimerId_ = undefined; } - }, + } /** * Show animation for enrollment completion. @@ -408,7 +421,7 @@ this.updateAnimationAsset_(); this.resizeCheckMark_(scanningAnimation); this.$.fingerprintScanned.hidden = false; - }, + } /** * Show animation for enrollment in progress. @@ -421,7 +434,7 @@ this.$.scanningAnimation.hidden = false; this.$.fingerprintScanned.hidden = true; }, FINGERPRINT_SCAN_SUCCESS_MS); - }, + } /** * Clear the canvas of any renderings. @@ -431,7 +444,7 @@ const c = this.$.canvas; const ctx = c.getContext('2d'); ctx.clearRect(0, 0, c.width, c.height); - }, + } /** * Update the size and position of the animation images. @@ -442,7 +455,7 @@ /** @type {!HTMLElement} */ (this.$.scanningAnimation)); this.resizeAndCenterIcon_( /** @type {!HTMLElement} */ (this.$.fingerprintScanned)); - }, + } /** * Resize the icon based on the scale and place it in the center of the @@ -460,7 +473,7 @@ const top = this.$.canvas.height / 2 - ICON_HEIGHT * this.scale_ / 2; target.style.left = left + 'px'; target.style.top = top + 'px'; - }, + } /** * Resize the check mark based on the scale and place it in the bottom-right @@ -480,5 +493,8 @@ CHECK_MARK_SIZE * this.scale_; target.style.left = left + 'px'; target.style.top = top + 'px'; - }, -}); + } +} + +customElements.define( + CrFingerprintProgressArcElement.is, CrFingerprintProgressArcElement);
diff --git a/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.html b/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.html index b60246b..30eb59e 100644 --- a/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.html +++ b/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.html
@@ -84,6 +84,12 @@ display: none; } + #extra-aria-label { + clip: rect(0,0,0,0); + display: inline-block; + position: fixed; + } + :host .tree-row > * { box-sizing: border-box; display: inline-block; @@ -163,9 +169,10 @@ } </style> <div class="tree-row" role="treeitem" aria-owns="tree-children" - aria-labelledby="label"> + aria-labelledby="label extra-aria-label"> <span class="expand-icon"></span> <span class="tree-label-icon"></span> <span class="tree-label" id="label"></span> + <span id="extra-aria-label"></span> </div> <div class="tree-children" id="tree-children" role="group"></div>
diff --git a/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.ts b/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.ts index 12553e3c2..43d6401 100644 --- a/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.ts +++ b/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.ts
@@ -48,12 +48,17 @@ } private label_: string = ''; + private extraAriaLabel_: string = ''; private depth_: number = 0; private rowElement_: HTMLElement|null = null; connectedCallback() { this.id = 'tree-item-autogen-id-' + treeItemAutoGeneratedIdCounter++; this.labelElement.textContent = this.label_; + const extraAriaLabel = + this.shadowRoot!.querySelector<HTMLElement>('#extra-aria-label'); + assert(extraAriaLabel); + extraAriaLabel.textContent = this.extraAriaLabel_; this.toggleAttribute(SELECTED_ATTR, false); this.rowElement.setAttribute('aria-selected', 'false'); const expand = this.shadowRoot!.querySelector<HTMLElement>('.expand-icon'); @@ -267,6 +272,14 @@ this.labelElement.textContent = s; } } + + setExtraAriaLabel(s: string) { + this.extraAriaLabel_ = s; + if (this.shadowRoot && this.shadowRoot.querySelector('#extra-aria-label')) { + this.shadowRoot!.querySelector<HTMLElement>( + '#extra-aria-label')!.textContent = s; + } + } } declare global {