diff --git a/DEPS b/DEPS index 4cbd8cb..5ec6e754 100644 --- a/DEPS +++ b/DEPS
@@ -294,11 +294,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': '224b97c1401fed1bfd0c157c677da4eedc14f239', + 'skia_revision': '849628568612d515babc5552365ad30b86142984', # 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': '1af2eb8ac8af6e547cbfde966ddcc52e80e6d163', + 'v8_revision': '8e3082bcd894f62a58d151e436c07dc794e991c6', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. @@ -365,7 +365,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': '880567709d857be348bd9d88d3a1de43abc16ed3', + 'catapult_revision': '788dd53c401be1a0b1506ebd684bc975fe7a498e', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -409,7 +409,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': 'e0ecd86e73ff9e6def9e1460cb0291f175044046', + 'dawn_revision': '30d672963c4c2277fc000655bd484b1bba03583c', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -1181,7 +1181,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '26bc518eaef421d8ef3cadb1be19c1255d5b51ea', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '8168f76753ed3d622fc4b7b94bb1dbf7b8abdb95', 'src/third_party/devtools-frontend/src': Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), @@ -1581,7 +1581,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '16075d13d01a9078bb4ca7de52c489b01dae4677', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '9277dbf0aab13088323e637449d702bebdc3fc15', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1712,7 +1712,7 @@ 'dep_type': 'cipd', }, - 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@7be8321fe0029b7158bb6613af883bd7f19e51fd', + 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@a3bb01d7ca91008bf0532186450e79f554ae9feb', 'src/third_party/vulkan_memory_allocator': Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'ebe84bec02c041d28f902da0214bf442743fc907', @@ -1748,7 +1748,7 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '44e4c8770158c505b03ee7feafa4859d083b0912', 'src/third_party/webgpu-cts/src': - Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'bbd7445ddefbc94823b6f9129e493fd41f057d07', + Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '6dfee4caf6c44aa49cf9ef7e7b0aab7d80319fe6', 'src/third_party/webrtc': Var('webrtc_git') + '/src.git' + '@' + '98c78cdd20215e5fb9b429e4a136f477c7a4b445', @@ -1824,7 +1824,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@93539e762dc653af59dbbd13e2e48cfbb45e11f9', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@b8e109d332bdfefdc1fbfd34cba94ce72b44cbd5', 'condition': 'checkout_src_internal', },
diff --git a/android_webview/browser/aw_enterprise_authentication_app_link_manager.cc b/android_webview/browser/aw_enterprise_authentication_app_link_manager.cc index b8312292..39bee561 100644 --- a/android_webview/browser/aw_enterprise_authentication_app_link_manager.cc +++ b/android_webview/browser/aw_enterprise_authentication_app_link_manager.cc
@@ -30,21 +30,16 @@ ~EnterpriseAuthenticationAppLinkManager() = default; void EnterpriseAuthenticationAppLinkManager::OnPolicyUpdated() { - const base::Value* authentication_urls_policy = - pref_service_->GetList(prefs::kEnterpriseAuthAppLinkPolicy); - if (authentication_urls_policy == nullptr) { - url_matcher_.reset(nullptr); - return; - } + const base::Value::List& authentication_urls_policy = + pref_service_->GetValueList(prefs::kEnterpriseAuthAppLinkPolicy); url_matcher_ = std::make_unique<url_matcher::URLMatcher>(); - url_matcher::util::AddAllowFilters( - url_matcher_.get(), - &base::Value::AsListValue(*authentication_urls_policy)); + url_matcher::util::AddAllowFilters(url_matcher_.get(), + authentication_urls_policy); } bool EnterpriseAuthenticationAppLinkManager::IsEnterpriseAuthenticationUrl( const GURL& url) { return url_matcher_ && !(url_matcher_->MatchURL(url).empty()); } -} // namespace android_webview \ No newline at end of file +} // namespace android_webview
diff --git a/ash/accelerators/accelerator_notifications.cc b/ash/accelerators/accelerator_notifications.cc index 14c54cfc..15e2967 100644 --- a/ash/accelerators/accelerator_notifications.cc +++ b/ash/accelerators/accelerator_notifications.cc
@@ -41,8 +41,6 @@ constexpr char kNotifierAccelerator[] = "ash.accelerator-controller"; constexpr char kSpokenFeedbackToggleAccelNotificationId[] = "chrome://settings/accessibility/spokenfeedback"; -constexpr char kStartupNewShortcutNotificationId[] = - "accelerator_controller.new_shortcuts_in_release"; // Ensures that there are no word breaks at the "+"s in the shortcut texts such // as "Ctrl+Shift+Space". @@ -193,45 +191,6 @@ message, kNotificationKeyboardIcon, on_click_handler); } -void ShowShortcutsChangedNotification() { - const std::u16string title = l10n_util::GetStringUTF16( - IDS_SHORTCUT_CHANGES_IN_RELEASE_NOTIFICATION_TITLE); - const std::u16string message = l10n_util::GetStringUTF16( - IDS_SHORTCUT_CHANGES_IN_RELEASE_NOTIFICATION_BODY); - - // The notification only has one button, "Learn more". - RichNotificationData rich_data; - rich_data.buttons.push_back(ButtonInfo(l10n_util::GetStringUTF16( - IDS_SHORTCUT_CHANGES_IN_RELEASE_NOTIFICATION_LEARN_MORE_BUTTON_TEXT))); - - // When the learn more button is clicked, open the keyboard shortcuts help - // page. Otherwise if the body is clicked, open the shortcut viewer app. - auto on_click_handler = base::MakeRefCounted<HandleNotificationClickDelegate>( - base::BindRepeating([](absl::optional<int> button_index) { - if (Shell::Get()->session_controller()->IsUserSessionBlocked()) - return; - - if (button_index.has_value()) { - DCHECK_EQ(0, button_index.value()); - NewWindowDelegate::GetInstance()->OpenUrl( - GURL(kKeyboardShortcutHelpPageUrl), - NewWindowDelegate::OpenUrlFrom::kUserInteraction); - } else { - NewWindowDelegate::GetInstance()->ShowKeyboardShortcutViewer(); - } - })); - - CreateAndShowNotification(kStartupNewShortcutNotificationId, - NotificationCatalogName::kShortcutsChanged, title, - message, kNotificationKeyboardIcon, - on_click_handler, rich_data); -} - -Notification* FindShortcutsChangedNotificationForTest() { - return MessageCenter::Get()->FindVisibleNotificationById( - kStartupNewShortcutNotificationId); -} - void ShowDockedMagnifierNotification() { ShowAccessibilityNotification( IDS_DOCKED_MAGNIFIER_ACCEL_TITLE, IDS_DOCKED_MAGNIFIER_ACCEL_MSG,
diff --git a/ash/accelerators/accelerator_notifications.h b/ash/accelerators/accelerator_notifications.h index 6c4a3e0..84ae8e6 100644 --- a/ash/accelerators/accelerator_notifications.h +++ b/ash/accelerators/accelerator_notifications.h
@@ -7,10 +7,6 @@ #include "ash/ash_export.h" -namespace message_center { -class Notification; -} - namespace ash { // Identifiers for toggling accessibility notifications. @@ -28,11 +24,6 @@ int old_shortcut_id, int new_shortcut_id); -ASH_EXPORT void ShowShortcutsChangedNotification(); - -ASH_EXPORT message_center::Notification* -FindShortcutsChangedNotificationForTest(); - ASH_EXPORT void ShowDockedMagnifierNotification(); ASH_EXPORT void ShowDockedMagnifierDisabledByAdminNotification(
diff --git a/ash/app_list/views/app_list_item_view.cc b/ash/app_list/views/app_list_item_view.cc index 826da0fd..bd8cf60 100644 --- a/ash/app_list/views/app_list_item_view.cc +++ b/ash/app_list/views/app_list_item_view.cc
@@ -151,6 +151,18 @@ } }; +// Returns whether the `index` is considered on the left edge of a grid with +// `cols` columns. +bool IsIndexOnLeftEdge(GridIndex index, int cols) { + return (index.slot % cols) == 0; +} + +// Returns whether the `index` is considered on the right edge of a grid with +// `cols` columns. +bool IsIndexOnRightEdge(GridIndex index, int cols) { + return ((index.slot + 1) % cols) == 0; +} + } // namespace // The badge which is activated when the app corresponding with this @@ -1128,14 +1140,12 @@ } if (most_recent_grid_index_.IsValid()) { - // Set row change only for items which move to a new row and a new column. - // This is done because row change animations should not be shown when - // animating items up from the next page into a new row but on the same - // column, which could happen when closing a reorder toast. - if ((most_recent_grid_index_.slot / columns != - new_grid_index.slot / columns) && - (most_recent_grid_index_.slot % columns != - new_grid_index.slot % columns)) { + // Pending row changes are only flagged when the item index changes from one + // edge of the grid to the other. + if ((IsIndexOnLeftEdge(new_grid_index, columns) && + IsIndexOnRightEdge(most_recent_grid_index_, columns)) || + (IsIndexOnLeftEdge(most_recent_grid_index_, columns) && + IsIndexOnRightEdge(new_grid_index, columns))) { has_pending_row_change_ = true; } else { has_pending_row_change_ = false;
diff --git a/ash/app_list/views/apps_grid_view.h b/ash/app_list/views/apps_grid_view.h index b8db951..f8d668e 100644 --- a/ash/app_list/views/apps_grid_view.h +++ b/ash/app_list/views/apps_grid_view.h
@@ -61,6 +61,7 @@ class GhostImageView; class AppsGridViewTest; class ScrollableAppsGridViewTest; +class PagedAppsGridViewTestBase; // AppsGridView displays a grid of app icons. It is used for: // - The main grid of apps in the launcher @@ -599,6 +600,7 @@ friend class PagedAppsGridView; friend class PagedViewStructure; friend class AppsGridRowChangeAnimator; + friend class PagedAppsGridViewTestBase; enum DropTargetRegion { NO_TARGET,
diff --git a/ash/app_list/views/paged_apps_grid_view.cc b/ash/app_list/views/paged_apps_grid_view.cc index 19cdd34..04d5475 100644 --- a/ash/app_list/views/paged_apps_grid_view.cc +++ b/ash/app_list/views/paged_apps_grid_view.cc
@@ -9,6 +9,7 @@ #include "ash/app_list/app_list_metrics.h" #include "ash/app_list/app_list_util.h" +#include "ash/app_list/apps_grid_row_change_animator.h" #include "ash/app_list/model/app_list_item.h" #include "ash/app_list/views/app_list_folder_view.h" #include "ash/app_list/views/app_list_item_view.h" @@ -1145,6 +1146,13 @@ GetWidget()->LayoutRootViewIfNecessary(); } + // Resizing of AppListItemView icons can invalidate layout and cause a layout + // while exiting cardified state. Keep ignoring layouts when exiting + // cardified state, so that any row change animations that need to take place + // while exiting do not get interrupted by a layout. + if (!cardified_state_) + ignore_layout_ = true; + CalculateIdealBounds(); // Cache the current item container position, as RecenterItemsContainer() may @@ -1230,8 +1238,13 @@ } } - if (!items_need_animating) + // When no items need animating, make sure that OnCardifiedStateEnded() gets + // called because MaybeCallOnBoundsAnimatorDone() is not called. + if (!items_need_animating) { + if (!cardified_state_) + OnCardifiedStateEnded(); return; + } views::AnimationBuilder item_animations; item_animations @@ -1260,6 +1273,14 @@ entry_view->ExitCardifyState(); gfx::Rect target_bounds(view_model()->ideal_bounds(i)); + + if (entry_view->has_pending_row_change()) { + entry_view->reset_has_pending_row_change(); + row_change_animator_->AnimateBetweenRows(entry_view, current_bounds, + target_bounds); + continue; + } + entry_view->SetBoundsRect(target_bounds); // Skip animating the item view if it is already hidden. @@ -1286,16 +1307,19 @@ if (bounds_animation_for_cardified_state_in_progress_ == 0) { DestroyLayerItemsIfNotNeeded(); - // Notify container that cardified state has ended once ending animations - // are complete. - if (!cardified_state_) { - if (cardified_state_ended_test_callback_) - cardified_state_ended_test_callback_.Run(); - container_delegate_->OnCardifiedStateEnded(); - } + if (!cardified_state_) + OnCardifiedStateEnded(); } } +void PagedAppsGridView::OnCardifiedStateEnded() { + ignore_layout_ = false; + + if (cardified_state_ended_test_callback_) + cardified_state_ended_test_callback_.Run(); + container_delegate_->OnCardifiedStateEnded(); +} + void PagedAppsGridView::RecenterItemsContainer() { const int pages = pagination_model_.total_pages(); const int current_page = pagination_model_.selected_page();
diff --git a/ash/app_list/views/paged_apps_grid_view.h b/ash/app_list/views/paged_apps_grid_view.h index d4f52ee9..78b90a97 100644 --- a/ash/app_list/views/paged_apps_grid_view.h +++ b/ash/app_list/views/paged_apps_grid_view.h
@@ -259,29 +259,43 @@ // The cardified state scales down apps and is shown when the user drags an // app in the AppList. void StartAppsGridCardifiedView(); + // Ends the Apps Grid Cardified state and sets it to normal. void EndAppsGridCardifiedView(); + // Animates individual elements of the apps grid to and from cardified state. void AnimateCardifiedState(); + // Animate app list items in the app grid to and from cardified state. void AnimateAppListItemsForCardifiedState( const gfx::Vector2d& translate_offset); + // Call OnBoundsAnimatorDone when all layer animations finish. void MaybeCallOnBoundsAnimatorDone(); + + // Called when app item animations are completed for ending cardified state. + void OnCardifiedStateEnded(); + // Translates the items container view to center the current page in the apps // grid. void RecenterItemsContainer(); + // Calculates the background bounds for the grid depending on the value of // |cardified_state_| gfx::Rect BackgroundCardBounds(int new_page_index); + // Appends a background card to the back of |background_cards_|. void AppendBackgroundCard(); + // Removes the background card at the end of |background_cards_|. void RemoveBackgroundCard(); + // Masks the apps grid container to background cards bounds. void MaskContainerToBackgroundBounds(); + // Removes all background cards from |background_cards_|. void RemoveAllBackgroundCards(); + // Updates the highlighted background card. Used only for cardified state. void SetHighlightedBackgroundCard(int new_highlighted_page);
diff --git a/ash/app_list/views/paged_apps_grid_view_unittest.cc b/ash/app_list/views/paged_apps_grid_view_unittest.cc index 92c1d0f1..c09b8998 100644 --- a/ash/app_list/views/paged_apps_grid_view_unittest.cc +++ b/ash/app_list/views/paged_apps_grid_view_unittest.cc
@@ -8,6 +8,7 @@ #include "ash/app_list/app_list_controller_impl.h" #include "ash/app_list/app_list_model_provider.h" +#include "ash/app_list/apps_grid_row_change_animator.h" #include "ash/app_list/model/app_list_item.h" #include "ash/app_list/model/app_list_model.h" #include "ash/app_list/test/app_list_test_helper.h" @@ -61,6 +62,8 @@ PaginationModel* model_ = nullptr; }; +} // namespace + class PagedAppsGridViewTestBase : public AshTestBase { public: PagedAppsGridViewTestBase() @@ -108,6 +111,15 @@ std::move(closure).Run(); } + int GetNumberOfRowChangeLayersForTest() { + return GetPagedAppsGridView() + ->row_change_animator_->GetNumberOfRowChangeLayersForTest(); + } + + bool IsRowChangeAnimatorAnimating() { + return GetPagedAppsGridView()->row_change_animator_->IsAnimating(); + } + std::unique_ptr<test::AppsGridViewTestApi> grid_test_api_; std::unique_ptr<test::AppListTestModel> app_list_test_model_; std::unique_ptr<SearchModel> search_model_; @@ -800,6 +812,8 @@ generator->MoveMouseBy(100, 100); generator->ReleaseLeftButton(); + EXPECT_FALSE(IsRowChangeAnimatorAnimating()); + // Wait for each item's layer animation to complete. LayerAnimationStoppedWaiter animation_waiter; for (size_t i = 0; i < view_model->view_size(); i++) { @@ -820,5 +834,69 @@ EXPECT_EQ(1, number_of_times_cardified_state_ended); } -} // namespace +// When quickly dragging and dropping an item from one row to another, test that +// row change animations are not interrupted during cardified state exit. +TEST_F(PagedAppsGridViewTest, QuicklyDragAndDropItemToNewRow) { + ui::ScopedAnimationDurationScaleMode scope_duration( + ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION); + app_list_test_model_->PopulateApps(10); + UpdateLayout(); + + auto* generator = GetEventGenerator(); + + // Set the callback to count how many times the cardified state is ended. + int number_of_times_cardified_state_ended = 0; + GetPagedAppsGridView()->SetCardifiedStateEndedTestCallback( + base::BindLambdaForTesting( + [&]() { number_of_times_cardified_state_ended++; })); + + const views::ViewModelT<AppListItemView>* view_model = + GetPagedAppsGridView()->view_model(); + AppListItemView* item_view = view_model->view_at(1); + generator->MoveMouseTo(item_view->GetBoundsInScreen().CenterPoint()); + + // Begin drag. + generator->PressLeftButton(); + item_view->FireMouseDragTimerForTest(); + + // Quickly drag the item from the first row to the second row, which should + // cause a row change animation when the drag is released. + gfx::Point second_row_drag_point = + view_model->view_at(5)->GetBoundsInScreen().right_center(); + second_row_drag_point.Offset(50, 0); + generator->MoveMouseTo(second_row_drag_point); + generator->ReleaseLeftButton(); + + // There should be a row change animation happening. + EXPECT_TRUE(IsRowChangeAnimatorAnimating()); + EXPECT_EQ(1, GetNumberOfRowChangeLayersForTest()); + + // Fast forward and make sure that the row change animator was not interrupted + // and is still animating. + task_environment()->FastForwardBy(base::Milliseconds(100)); + EXPECT_TRUE(IsRowChangeAnimatorAnimating()); + EXPECT_EQ(1, GetNumberOfRowChangeLayersForTest()); + + // Wait for each item's layer animation to complete. + LayerAnimationStoppedWaiter animation_waiter; + for (size_t i = 0; i < view_model->view_size(); i++) { + if (view_model->view_at(i)->layer()) + animation_waiter.Wait(view_model->view_at(i)->layer()); + } + + // When each item's layer animation is complete, their layers should have been + // removed. + for (size_t i = 0; i < view_model->view_size(); i++) + EXPECT_FALSE(view_model->view_at(i)->layer()); + EXPECT_EQ(0, + GetPagedAppsGridView() + ->GetBoundsAnimationForCardifiedStateInProgressCountForTest()); + EXPECT_FALSE(IsRowChangeAnimatorAnimating()); + EXPECT_EQ(0, GetNumberOfRowChangeLayersForTest()); + + // Now that cardified item animations are complete, make sure that + // `OnCardifiedStateEnded()` is only called once. + EXPECT_EQ(1, number_of_times_cardified_state_ended); +} + } // namespace ash
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd index ac3a500..084a342 100644 --- a/ash/ash_strings.grd +++ b/ash/ash_strings.grd
@@ -4382,15 +4382,6 @@ <message name="IDS_ASH_SHORTCUT_DEPRECATION_SEARCH_PERIOD_INSERT" desc="Message telling user to use search/launcher + shift + backspace instead of search/launcher + period to emulate the delete key. The name of the launcher key varies by device and may be either Search or Launcher depending on the glyph on the keyboard."> The <ph name="LAUNCHER_KEY_NAME">$1<ex>Launcher</ex></ph> + Period keyboard shortcut has changed. To use the Insert key, press the <ph name="LAUNCHER_KEY_NAME">$1<ex>Launcher</ex></ph> key + Shift + Backspace. </message> - <message name="IDS_SHORTCUT_CHANGES_IN_RELEASE_NOTIFICATION_BODY" desc="Message body of notification telling user that this release has changes to keyboard shortcuts."> - To see the updates, open the Shortcuts app - </message> - <message name="IDS_SHORTCUT_CHANGES_IN_RELEASE_NOTIFICATION_TITLE" desc="Title of notification telling user that this release has changes to keyboard shortcuts."> - Keyboard shortcuts have been improved - </message> - <message name="IDS_SHORTCUT_CHANGES_IN_RELEASE_NOTIFICATION_LEARN_MORE_BUTTON_TEXT" desc="Button text on notification to learn more. Links to a help page."> - Learn more - </message> <!-- PciePeripheral notifications --> <message name="IDS_ASH_PCIE_PERIPHERAL_NOTIFICATION_PERFORMANCE_LIMITED_TITLE" desc="Notification title to indicate to users that their peripheral device's performance may be limited.">
diff --git a/ash/ash_strings_grd/IDS_SHORTCUT_CHANGES_IN_RELEASE_NOTIFICATION_BODY.png.sha1 b/ash/ash_strings_grd/IDS_SHORTCUT_CHANGES_IN_RELEASE_NOTIFICATION_BODY.png.sha1 deleted file mode 100644 index 3874f19..0000000 --- a/ash/ash_strings_grd/IDS_SHORTCUT_CHANGES_IN_RELEASE_NOTIFICATION_BODY.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -e68a8a66fc8366ea6ed4ea72f5a91700af893c2c \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_SHORTCUT_CHANGES_IN_RELEASE_NOTIFICATION_LEARN_MORE_BUTTON_TEXT.png.sha1 b/ash/ash_strings_grd/IDS_SHORTCUT_CHANGES_IN_RELEASE_NOTIFICATION_LEARN_MORE_BUTTON_TEXT.png.sha1 deleted file mode 100644 index 3874f19..0000000 --- a/ash/ash_strings_grd/IDS_SHORTCUT_CHANGES_IN_RELEASE_NOTIFICATION_LEARN_MORE_BUTTON_TEXT.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -e68a8a66fc8366ea6ed4ea72f5a91700af893c2c \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_SHORTCUT_CHANGES_IN_RELEASE_NOTIFICATION_TITLE.png.sha1 b/ash/ash_strings_grd/IDS_SHORTCUT_CHANGES_IN_RELEASE_NOTIFICATION_TITLE.png.sha1 deleted file mode 100644 index 3874f19..0000000 --- a/ash/ash_strings_grd/IDS_SHORTCUT_CHANGES_IN_RELEASE_NOTIFICATION_TITLE.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -e68a8a66fc8366ea6ed4ea72f5a91700af893c2c \ No newline at end of file
diff --git a/ash/components/audio/public/mojom/BUILD.gn b/ash/components/audio/public/mojom/BUILD.gn index a27a6b5..2bfe1f4e3 100644 --- a/ash/components/audio/public/mojom/BUILD.gn +++ b/ash/components/audio/public/mojom/BUILD.gn
@@ -9,4 +9,5 @@ mojom("mojom") { sources = [ "cros_audio_config.mojom" ] public_deps = [ "//mojo/public/mojom/base" ] + webui_module_path = "/audio" }
diff --git a/ash/constants/notifier_catalogs.h b/ash/constants/notifier_catalogs.h index 96467449..3e8b19ba 100644 --- a/ash/constants/notifier_catalogs.h +++ b/ash/constants/notifier_catalogs.h
@@ -9,7 +9,7 @@ // A living catalog that registers notifications. // Current values should not be renumbered or removed. -// To deprecate add a 'DEPRECATED_' prefix to the entry. +// To deprecate comment out the entry. enum class NotificationCatalogName { kNone = 0, kTestCatalogName = 1, @@ -23,7 +23,7 @@ kDockThunderboltError = 9, kLowPowerCharger = 10, kDeprecatedAccelerator = 11, - kShortcutsChanged = 12, + // [Deprecated] kShortcutsChanged = 12, kDockedMagnifierEnabled = 13, kHighContrastEnabled = 14, kFullScreenMagnifierEnabled = 15, @@ -154,7 +154,7 @@ // A living catalog that registers toasts. // Current values should not be renumbered or removed. Please keep in sync with // "ToastCatalogName" in tools/metrics/histograms/enums.xml. -// To deprecate add a 'DEPRECATED_' prefix to the entry. +// To deprecate comment out the entry. enum class ToastCatalogName { kVirtualDesksLimitMax = 0, kVirtualDesksLimitMin = 1,
diff --git a/ash/frame/caption_buttons/frame_size_button_unittest.cc b/ash/frame/caption_buttons/frame_size_button_unittest.cc index 59486a9..ca731e5 100644 --- a/ash/frame/caption_buttons/frame_size_button_unittest.cc +++ b/ash/frame/caption_buttons/frame_size_button_unittest.cc
@@ -7,12 +7,16 @@ #include "ash/shell.h" #include "ash/test/ash_test_base.h" #include "ash/wm/window_state.h" +#include "base/check_op.h" #include "base/i18n/rtl.h" #include "base/run_loop.h" #include "base/test/scoped_feature_list.h" #include "chromeos/ui/base/window_properties.h" #include "chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h" #include "chromeos/ui/frame/default_frame_header.h" +#include "chromeos/ui/frame/multitask_menu/multitask_button.h" +#include "chromeos/ui/frame/multitask_menu/multitask_menu.h" +#include "chromeos/ui/frame/multitask_menu/split_button.h" #include "chromeos/ui/vector_icons/vector_icons.h" #include "chromeos/ui/wm/features.h" #include "ui/aura/window.h" @@ -33,6 +37,9 @@ using ::chromeos::FrameCaptionButtonContainerView; using ::chromeos::FrameSizeButton; +using ::chromeos::MultitaskBaseButton; +using ::chromeos::MultitaskMenu; +using ::chromeos::SplitButtonView; using ::chromeos::WindowStateType; class TestWidgetDelegate : public views::WidgetDelegateView { @@ -137,7 +144,6 @@ params.context = GetContext(); widget->Init(std::move(params)); widget->Show(); - return widget; } @@ -671,6 +677,72 @@ EXPECT_TRUE(HasStateType(WindowStateType::kPrimarySnapped)); } +// Test multitask menu requires kFloatWindow feature to be enabled during setup. +class MultitaskMenuTest : public FrameSizeButtonTest { + public: + MultitaskMenuTest() = default; + + MultitaskMenuTest(const MultitaskMenuTest&) = delete; + MultitaskMenuTest& operator=(const MultitaskMenuTest&) = delete; + + ~MultitaskMenuTest() override = default; + + void SetUp() override { + // Ensure float feature is enabled. + scoped_feature_list_.InitAndEnableFeature( + chromeos::wm::features::kFloatWindow); + FrameSizeButtonTest::SetUp(); + } + + void ShowMultitaskMenu() { + DCHECK(size_button()); + multitask_menu_ = static_cast<FrameSizeButton*>(size_button()) + ->GetMultitaskMenuForTesting(); + } + + MultitaskMenu* multitask_menu() { return multitask_menu_; } + + private: + MultitaskMenu* multitask_menu_; + base::test::ScopedFeatureList scoped_feature_list_; +}; + +// Test Float Button Functionality. +TEST_F(MultitaskMenuTest, TestMultitaskMenuFloatFunctionality) { + EXPECT_TRUE(window_state()->IsNormalStateType()); + ui::test::EventGenerator* generator = GetEventGenerator(); + ShowMultitaskMenu(); + generator->MoveMouseTo( + CenterPointInScreen(multitask_menu()->float_button_for_testing())); + generator->ClickLeftButton(); + EXPECT_TRUE(window_state()->IsFloated()); +} + +// Test Half Button Functionality. +TEST_F(MultitaskMenuTest, TestMultitaskMenuHalfFunctionality) { + EXPECT_TRUE(window_state()->IsNormalStateType()); + ui::test::EventGenerator* generator = GetEventGenerator(); + ShowMultitaskMenu(); + generator->MoveMouseTo(multitask_menu() + ->half_button_for_testing() + ->GetBoundsInScreen() + .left_center()); + generator->ClickLeftButton(); + EXPECT_TRUE(window_state()->GetStateType() == + WindowStateType::kPrimarySnapped); +} + +// Test Full Button Functionality. +TEST_F(MultitaskMenuTest, TestMultitaskMenuFullFunctionality) { + ASSERT_TRUE(window_state()->IsNormalStateType()); + ui::test::EventGenerator* generator = GetEventGenerator(); + ShowMultitaskMenu(); + generator->MoveMouseTo( + CenterPointInScreen(multitask_menu()->full_button_for_testing())); + generator->ClickLeftButton(); + EXPECT_TRUE(window_state()->IsFullscreen()); +} + INSTANTIATE_TEST_SUITE_P(All, FrameSizeButtonPortraitDisplayTest, ::testing::Bool());
diff --git a/ash/login/ui/lock_contents_view.cc b/ash/login/ui/lock_contents_view.cc index edb181f..4c305c9 100644 --- a/ash/login/ui/lock_contents_view.cc +++ b/ash/login/ui/lock_contents_view.cc
@@ -1670,7 +1670,7 @@ ->status_area_widget_delegate() ->set_default_last_focusable_child(reverse); Shell::Get()->focus_cycler()->FocusWidget(shelf->GetStatusAreaWidget()); - } else { + } else if (!features::IsUseLoginShelfWidgetEnabled()) { shelf->shelf_widget()->set_default_last_focusable_child(reverse); Shell::Get()->focus_cycler()->FocusWidget(shelf->shelf_widget()); }
diff --git a/ash/login/ui/lock_screen_sanity_unittest.cc b/ash/login/ui/lock_screen_sanity_unittest.cc index 1d89c8e2..6a0671c 100644 --- a/ash/login/ui/lock_screen_sanity_unittest.cc +++ b/ash/login/ui/lock_screen_sanity_unittest.cc
@@ -34,6 +34,15 @@ namespace ash { namespace { +// Returns the widget contents view that contains login shelf in the same root +// window as `native_window`. +views::View* GetLoginShelfContentsView(gfx::NativeWindow native_window) { + // TODO(https://crbug.com/1343114): refactor the code below after the login + // shelf widget is ready. + + return Shelf::ForWindow(native_window)->shelf_widget()->GetContentsView(); +} + class LockScreenAppFocuser { public: explicit LockScreenAppFocuser(views::Widget* lock_screen_app_widget) @@ -186,23 +195,22 @@ std::make_unique<FakeLoginDetachableBaseModel>(DataDispatcher())); SetUserCount(1); std::unique_ptr<views::Widget> widget = CreateWidgetWithContent(lock); - views::View* shelf = Shelf::ForWindow(lock->GetWidget()->GetNativeWindow()) - ->shelf_widget() - ->GetContentsView(); + views::View* login_shelf_contents_view = + GetLoginShelfContentsView(lock->GetWidget()->GetNativeView()); // Lock has focus. EXPECT_TRUE(VerifyFocused(lock)); - EXPECT_TRUE(VerifyNotFocused(shelf)); + EXPECT_TRUE(VerifyNotFocused(login_shelf_contents_view)); // Tab (eventually) goes to the shelf. ASSERT_TRUE(TabThroughView(GetEventGenerator(), lock, false /*reverse*/)); EXPECT_TRUE(VerifyNotFocused(lock)); - EXPECT_TRUE(VerifyFocused(shelf)); + EXPECT_TRUE(VerifyFocused(login_shelf_contents_view)); // A single shift+tab brings focus back to the lock screen. GetEventGenerator()->PressKey(ui::KeyboardCode::VKEY_TAB, ui::EF_SHIFT_DOWN); EXPECT_TRUE(VerifyFocused(lock)); - EXPECT_TRUE(VerifyNotFocused(shelf)); + EXPECT_TRUE(VerifyNotFocused(login_shelf_contents_view)); } // Verifies that shift-tabbing from the lock screen will eventually focus the @@ -251,9 +259,8 @@ SetUserCount(1); std::unique_ptr<views::Widget> widget = CreateWidgetWithContent(lock); - views::View* shelf = Shelf::ForWindow(lock->GetWidget()->GetNativeWindow()) - ->shelf_widget() - ->GetContentsView(); + views::View* login_shelf_contents_view = + GetLoginShelfContentsView((lock->GetWidget()->GetNativeView())); views::View* status_area = RootWindowController::ForWindow(lock->GetWidget()->GetNativeWindow()) @@ -282,7 +289,7 @@ // focus (notified via mojo interface), shelf should get the focus next. EXPECT_TRUE(VerifyFocused(lock_screen_app)); DataDispatcher()->HandleFocusLeavingLockScreenApps(false /*reverse*/); - EXPECT_TRUE(VerifyFocused(shelf)); + EXPECT_TRUE(VerifyFocused(login_shelf_contents_view)); // Reversing focus should bring focus back to the lock screen app. GetEventGenerator()->PressKey(ui::KeyboardCode::VKEY_TAB, ui::EF_SHIFT_DOWN); @@ -303,7 +310,7 @@ // Tab out of the lock screen app once more - the shelf should get the focus // again. DataDispatcher()->HandleFocusLeavingLockScreenApps(false /*reverse*/); - EXPECT_TRUE(VerifyFocused(shelf)); + EXPECT_TRUE(VerifyFocused(login_shelf_contents_view)); } TEST_F(LockScreenSanityTest, FocusLockScreenWhenLockScreenAppExit) { @@ -317,9 +324,8 @@ SetUserCount(1); std::unique_ptr<views::Widget> widget = CreateWidgetWithContent(lock); - views::View* shelf = Shelf::ForWindow(lock->GetWidget()->GetNativeWindow()) - ->shelf_widget() - ->GetContentsView(); + views::View* login_shelf_contents_view = + GetLoginShelfContentsView(lock->GetWidget()->GetNativeWindow()); // Setup and focus a lock screen app. DataDispatcher()->SetLockScreenNoteState(mojom::TrayActionState::kActive); @@ -332,7 +338,7 @@ // Tab out of the lock screen app - shelf should get the focus. DataDispatcher()->HandleFocusLeavingLockScreenApps(false /*reverse*/); - EXPECT_TRUE(VerifyFocused(shelf)); + EXPECT_TRUE(VerifyFocused(login_shelf_contents_view)); // Move the lock screen note taking to available state (which happens when the // app session ends) - this should focus the lock screen. @@ -341,7 +347,7 @@ // Tab through the lock screen - the focus should eventually get to the shelf. ASSERT_TRUE(TabThroughView(GetEventGenerator(), lock, false /*reverse*/)); - EXPECT_TRUE(VerifyFocused(shelf)); + EXPECT_TRUE(VerifyFocused(login_shelf_contents_view)); } TEST_F(LockScreenSanityTest, RemoveUser) {
diff --git a/ash/rgb_keyboard/rgb_keyboard_manager_unittest.cc b/ash/rgb_keyboard/rgb_keyboard_manager_unittest.cc index 17ba62d..876c2d18 100644 --- a/ash/rgb_keyboard/rgb_keyboard_manager_unittest.cc +++ b/ash/rgb_keyboard/rgb_keyboard_manager_unittest.cc
@@ -172,7 +172,8 @@ } TEST_F(RgbKeyboardManagerTest, SetCapsLockStateDisallowedForZonedKeyboards) { - InitializeManagerWithCapability(rgbkbd::RgbKeyboardCapabilities::kFiveZone); + InitializeManagerWithCapability( + rgbkbd::RgbKeyboardCapabilities::kFourZoneFortyLed); EXPECT_FALSE(client_->get_caps_lock_state()); ime_controller_->UpdateCapsLockState(/*caps_enabled=*/true); // Caps lock state should still be false since RgbKeyboardManager should have
diff --git a/ash/session/fullscreen_controller.cc b/ash/session/fullscreen_controller.cc index 990f6d4..1640d45 100644 --- a/ash/session/fullscreen_controller.cc +++ b/ash/session/fullscreen_controller.cc
@@ -164,9 +164,9 @@ // Always exit full screen if the allowlist policy is unset. auto* prefs = Shell::Get()->session_controller()->GetPrimaryUserPrefService(); - const auto* url_allow_list = - prefs->GetList(prefs::kKeepFullscreenWithoutNotificationUrlAllowList); - if (url_allow_list->GetListDeprecated().size() == 0) + const auto& url_allow_list = prefs->GetValueList( + prefs::kKeepFullscreenWithoutNotificationUrlAllowList); + if (url_allow_list.size() == 0) return true; // Get the URL of the active window from the shell delegate. @@ -176,8 +176,7 @@ // Check if it is allowed by user pref to keep full screen for the active URL. url_matcher::URLMatcher url_matcher; - url_matcher::util::AddAllowFilters( - &url_matcher, &base::Value::AsListValue(*url_allow_list)); + url_matcher::util::AddAllowFilters(&url_matcher, url_allow_list); return url_matcher.MatchURL(url).empty(); }
diff --git a/ash/shelf/login_shelf_view_unittest.cc b/ash/shelf/login_shelf_view_unittest.cc index 78be155..8aacc6fa 100644 --- a/ash/shelf/login_shelf_view_unittest.cc +++ b/ash/shelf/login_shelf_view_unittest.cc
@@ -160,6 +160,27 @@ return login_shelf_view_->GetViewByID(id)->GetEnabled(); } + void FocusOnLoginShelfButton() { + // TODO(https://crbug.com/1343114): refactor the code below after the login + // shelf widget is ready. + + ShelfWidget* shelf_widget = GetLoginShelfWidget(); + shelf_widget->set_default_last_focusable_child( + /*default_last_focusable_child=*/false); + Shell::Get()->focus_cycler()->FocusWidget(shelf_widget); + ExpectFocused(shelf_widget->GetContentsView()); + } + + // Returns the widget where the login shelf view lives. + ShelfWidget* GetLoginShelfWidget() { + // TODO(https://crbug.com/1343114): refactor the code below after the login + // shelf widget is ready. + + gfx::NativeWindow window = + login_shelf_view_->GetWidget()->GetNativeWindow(); + return Shelf::ForWindow(window)->shelf_widget(); + } + TestTrayActionClient tray_action_client_; LoginShelfView* login_shelf_view_ = nullptr; // Unowned. @@ -626,39 +647,34 @@ ShowsShelfButtons({LoginShelfView::kShutdown, LoginShelfView::kSignOut})); gfx::NativeWindow window = login_shelf_view_->GetWidget()->GetNativeWindow(); - views::View* shelf = - Shelf::ForWindow(window)->shelf_widget()->GetContentsView(); views::View* status_area = RootWindowController::ForWindow(window) ->GetStatusAreaWidget() ->GetContentsView(); // Give focus to the shelf. The tabbing between lock screen and shelf is // verified by |LockScreenSanityTest::TabGoesFromLockToShelfAndBackToLock|. - Shelf::ForWindow(window)->shelf_widget()->set_default_last_focusable_child( - false /*reverse*/); - Shell::Get()->focus_cycler()->FocusWidget( - Shelf::ForWindow(window)->shelf_widget()); - // The first shelf button has focus. - ExpectFocused(shelf); + FocusOnLoginShelfButton(); ExpectNotFocused(status_area); EXPECT_TRUE( login_shelf_view_->GetViewByID(LoginShelfView::kShutdown)->HasFocus()); // Focus from the first button to the second button. + views::View* login_shelf_contents_view = + GetLoginShelfWidget()->GetContentsView(); PressAndReleaseKey(ui::KeyboardCode::VKEY_TAB); - ExpectFocused(shelf); + ExpectFocused(login_shelf_contents_view); ExpectNotFocused(status_area); EXPECT_TRUE( login_shelf_view_->GetViewByID(LoginShelfView::kSignOut)->HasFocus()); // Focus from the second button to the status area. PressAndReleaseKey(ui::KeyboardCode::VKEY_TAB); - ExpectNotFocused(shelf); + ExpectNotFocused(login_shelf_contents_view); ExpectFocused(status_area); // A single shift+tab brings focus back to the second shelf button. PressAndReleaseKey(ui::KeyboardCode::VKEY_TAB, ui::EF_SHIFT_DOWN); - ExpectFocused(shelf); + ExpectFocused(login_shelf_contents_view); ExpectNotFocused(status_area); EXPECT_TRUE( login_shelf_view_->GetViewByID(LoginShelfView::kSignOut)->HasFocus()); @@ -719,11 +735,9 @@ gfx::NativeWindow window = login_shelf_view_->GetWidget()->GetNativeWindow(); ShelfWidget* shelf_widget = Shelf::ForWindow(window)->shelf_widget(); - // Focus shelf widget (which could happen if user tabs to login shelf - // buttons). - shelf_widget->set_default_last_focusable_child(/*reverse=*/false); - Shell::Get()->focus_cycler()->FocusWidget(shelf_widget); - ExpectFocused(shelf_widget->GetContentsView()); + // Focus on the login shelf button (which could happen if user tabs to move + // the focus). + FocusOnLoginShelfButton(); // Verify that shelf widget is no longer focused, and is stacked at the bottom // of shelf container when the session is activated. @@ -1118,14 +1132,9 @@ // Dismiss shutdown confirmation bubble. void DismissShutdown() { - // Focus shelf widget (which could happen if user tabs to login shelf - // buttons). - gfx::NativeWindow window = - login_shelf_view_->GetWidget()->GetNativeWindow(); - ShelfWidget* shelf_widget = Shelf::ForWindow(window)->shelf_widget(); - shelf_widget->set_default_last_focusable_child(/*reverse=*/false); - Shell::Get()->focus_cycler()->FocusWidget(shelf_widget); - ExpectFocused(shelf_widget->GetContentsView()); + // Focus on the login shelf button (which could happen if user tabs to move + // the focus). + FocusOnLoginShelfButton(); base::RunLoop().RunUntilIdle(); }
diff --git a/ash/shelf/shelf_focus_cycler.cc b/ash/shelf/shelf_focus_cycler.cc index 16c461f..8e4c58b 100644 --- a/ash/shelf/shelf_focus_cycler.cc +++ b/ash/shelf/shelf_focus_cycler.cc
@@ -72,9 +72,14 @@ void ShelfFocusCycler::FocusShelf(bool last_element) { if (shelf_->shelf_widget()->GetLoginShelfView()->GetVisible()) { - ShelfWidget* shelf_widget = shelf_->shelf_widget(); - shelf_widget->set_default_last_focusable_child(last_element); - Shell::Get()->focus_cycler()->FocusWidget(shelf_widget); + // TODO(https://crbug.com/1343114): refactor the code below after the login + // shelf widget is ready. + + if (!features::IsUseLoginShelfWidgetEnabled()) { + ShelfWidget* shelf_widget = shelf_->shelf_widget(); + shelf_widget->set_default_last_focusable_child(last_element); + Shell::Get()->focus_cycler()->FocusWidget(shelf_widget); + } } else { HotseatWidget* hotseat_widget = shelf_->hotseat_widget(); hotseat_widget->scrollable_shelf_view()->set_default_last_focusable_child(
diff --git a/ash/shelf/shelf_layout_manager.cc b/ash/shelf/shelf_layout_manager.cc index db52bed..02daa85 100644 --- a/ash/shelf/shelf_layout_manager.cc +++ b/ash/shelf/shelf_layout_manager.cc
@@ -1229,7 +1229,9 @@ } void ShelfLayoutManager::OnLocaleChanged() { - shelf_->shelf_widget()->HandleLocaleChange(); + if (!features::IsUseLoginShelfWidgetEnabled()) + shelf_->shelf_widget()->HandleLocaleChange(); + shelf_->status_area_widget()->HandleLocaleChange(); shelf_->navigation_widget()->HandleLocaleChange(); @@ -1616,7 +1618,8 @@ AnimateOpacity(GetLayer(shelf_->status_area_widget()), target_opacity_, dim_animation_duration, dim_animation_tween); - shelf_widget_->SetLoginShelfButtonOpacity(target_opacity_); + if (!features::IsUseLoginShelfWidgetEnabled()) + shelf_widget_->SetLoginShelfButtonOpacity(target_opacity_); return true; }
diff --git a/ash/shelf/shelf_widget.cc b/ash/shelf/shelf_widget.cc index 2c75a036..10995687 100644 --- a/ash/shelf/shelf_widget.cc +++ b/ash/shelf/shelf_widget.cc
@@ -160,7 +160,9 @@ layer()->SchedulePaint(gfx::Rect(layer()->size())); } - void SetLoginShelfView(LoginShelfView* view) { login_shelf_view_ = view; } + void SetLoginShelfFromShelfWidget(LoginShelfView* view) { + login_shelf_from_shelf_widget_ = view; + } SkColor background_color() const { return background_color_; } @@ -178,8 +180,10 @@ canvas->DrawRoundRect(gfx::Rect(layer()->size()), corner_radius_, flags); // Don't draw highlight border in login screen. - if (login_shelf_view_ && login_shelf_view_->GetVisible()) + if (login_shelf_from_shelf_widget_ && + login_shelf_from_shelf_widget_->GetVisible()) { return; + } if (corner_radius_ > 0) { views::HighlightBorder::PaintBorderToCanvas( @@ -272,7 +276,12 @@ views::View* const owner_view_; const bool draw_highlight_border_; - LoginShelfView* login_shelf_view_ = nullptr; + // The pointer to the login shelf view that resides in the shelf widget. Set + // only when the login shelf widget is not in use. + // TODO(https://crbug.com/1343114): remove this data member and its related + // code after the login shelf widget is ready. + LoginShelfView* login_shelf_from_shelf_widget_ = nullptr; + SkColor background_color_; float corner_radius_ = 0.0f; views::HighlightBorder::Type highlight_border_type_ = @@ -308,8 +317,10 @@ // Returns a pointer to the login shelf view passed in as an argument. LoginShelfView* AddLoginShelfView( std::unique_ptr<LoginShelfView> login_shelf_view) { + DCHECK(!features::IsUseLoginShelfWidgetEnabled()); + login_shelf_view_ = AddChildView(std::move(login_shelf_view)); - opaque_background_.SetLoginShelfView(login_shelf_view_); + opaque_background_.SetLoginShelfFromShelfWidget(login_shelf_view_); return login_shelf_view_; } @@ -378,6 +389,9 @@ // Pointer to the login shelf view - visible only when the session is // inactive. The view is owned by this view's hierarchy. + // Set only when the login shelf widget is not in use. + // TODO(https://crbug.com/1343114): remove this data member when the login + // shelf widget is in use. LoginShelfView* login_shelf_view_ = nullptr; // A background layer that may be visible depending on a @@ -597,6 +611,8 @@ } views::View* ShelfWidget::DelegateView::GetDefaultFocusableChild() { + DCHECK(!features::IsUseLoginShelfWidgetEnabled()); + if (login_shelf_view_->GetVisible()) { return FindFirstOrLastFocusableChild(login_shelf_view_, default_last_focusable_child_); @@ -607,7 +623,8 @@ } void ShelfWidget::DelegateView::Layout() { - login_shelf_view_->SetBoundsRect(GetLocalBounds()); + if (!features::IsUseLoginShelfWidgetEnabled()) + login_shelf_view_->SetBoundsRect(GetLocalBounds()); // Center drag handle within the expected in-app shelf bounds - it's safe to // assume bottom shelf, given that the drag handle is only shown within the @@ -661,6 +678,7 @@ gfx::Rect* hit_test_rect_touch) { // TODO(https://crbug.com/1343114): refactor the code below after the login // shelf widget is ready. + DCHECK(!features::IsUseLoginShelfWidgetEnabled()); // This should only get called when the login shelf is visible, i.e. not // during an active session. In an active session, hit test rects should be @@ -721,6 +739,7 @@ void ShelfWidget::SetLoginShelfButtonOpacity(float target_opacity) { // TODO(https://crbug.com/1343114): remove this function after the login shelf // widget is ready. + DCHECK(!features::IsUseLoginShelfWidgetEnabled()); if (login_shelf_view_->GetVisible()) login_shelf_view_->SetButtonOpacity(target_opacity); } @@ -742,12 +761,14 @@ void ShelfWidget::Initialize(aura::Window* shelf_container) { DCHECK(shelf_container); - // TODO(https://crbug.com/1343114): remove this line after the login shelf - // widget is ready. - login_shelf_view_ = - delegate_view_->AddLoginShelfView(std::make_unique<LoginShelfView>( - RootWindowController::ForWindow(shelf_container) - ->lock_screen_action_background_controller())); + // TODO(https://crbug.com/1343114): remove it after the login shelf view is + // moved to its own widget. + if (!features::IsUseLoginShelfWidgetEnabled()) { + login_shelf_view_ = + delegate_view_->AddLoginShelfView(std::make_unique<LoginShelfView>( + RootWindowController::ForWindow(shelf_container) + ->lock_screen_action_background_controller())); + } views::Widget::InitParams params( views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); @@ -1045,6 +1066,7 @@ void ShelfWidget::HandleLocaleChange() { // TODO(https://crbug.com/1343114): remove this function when the login shelf // widget is ready. + DCHECK(!features::IsUseLoginShelfWidgetEnabled()); login_shelf_view_->HandleLocaleChange(); } @@ -1072,9 +1094,10 @@ if (show_hotseat && IsActive()) wm::DeactivateWindow(shelf_window); - // TODO(https://crbug.com/1343114): remove this line when the login shelf - // widget is ready. - GetLoginShelfView()->SetVisible(!show_hotseat); + // TODO(https://crbug.com/1343114): remove it when the login shelf widget is + // used as default. + if (!features::IsUseLoginShelfWidgetEnabled()) + GetLoginShelfView()->SetVisible(!show_hotseat); ShowIfHidden(); @@ -1097,17 +1120,19 @@ // might change on session state changes. delegate_view_->drag_handle()->UpdateColor(); - // TODO(https://crbug.com/1343114): remove this line when the login shelf - // widget is ready. - login_shelf_view_->UpdateAfterSessionChange(); + // TODO(https://crbug.com/1343114): remove it when the login shelf widget is + // ready. + if (!features::IsUseLoginShelfWidgetEnabled()) + login_shelf_view_->UpdateAfterSessionChange(); } void ShelfWidget::OnUserSessionAdded(const AccountId& account_id) { shelf_layout_manager_->SetDimmed(false); - // TODO(https://crbug.com/1343114): remove this line when the login shelf - // widget is ready. - login_shelf_view_->UpdateAfterSessionChange(); + // TODO(https://crbug.com/1343114): remove it when the login shelf widget is + // ready. + if (!features::IsUseLoginShelfWidgetEnabled()) + login_shelf_view_->UpdateAfterSessionChange(); } SkColor ShelfWidget::GetShelfBackgroundColor() const {
diff --git a/ash/shelf/shelf_window_targeter.cc b/ash/shelf/shelf_window_targeter.cc index 41a7615..405e29a 100644 --- a/ash/shelf/shelf_window_targeter.cc +++ b/ash/shelf/shelf_window_targeter.cc
@@ -54,13 +54,16 @@ // currently in an active session (or unknown session state) and change only // the behavior of the login shelf. On secondary displays, the login shelf // will not be visible. + // TODO(https://crbug.com/1343114): remove this code block after the login + // shelf widget is in use. bool target_is_shelf_widget = target == shelf_->shelf_widget()->GetNativeWindow(); if (target_is_shelf_widget && Shell::Get()->session_controller()->GetSessionState() != session_manager::SessionState::ACTIVE && Shell::Get()->session_controller()->GetSessionState() != - session_manager::SessionState::UNKNOWN) { + session_manager::SessionState::UNKNOWN && + !features::IsUseLoginShelfWidgetEnabled()) { // When this is the case, let events pass through the "empty" part of // the shelf. return shelf_->shelf_widget()->GetHitTestRects(target, hit_test_rect_mouse,
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb index 41e2257..76010b65 100644 --- a/ash/strings/ash_strings_am.xtb +++ b/ash/strings/ash_strings_am.xtb
@@ -165,6 +165,7 @@ <translation id="1882897271359938046">ወደ <ph name="DISPLAY_NAME" /> በማንጸባረቅ ላይ</translation> <translation id="1885785240814121742">በጣት አሻራ ይክፈቱ</translation> <translation id="1888656773939766144"><ph name="DISPLAY_NAME" /> <ph name="SPECIFIED_RESOLUTION" />ን (<ph name="SPECIFIED_REFRESH_RATE" /> ኸዝ) አይደግፍም። የምስል ጥራቱ ወደ <ph name="FALLBACK_RESOLUTION" /> (<ph name="FALLBACK_REFRESH_RATE" />) ተቀይሯል። ለውጦቹን ለማስቀመጥ ጠቅ ያድርጉት። ቀዳሚ ቅንብሮቹ በ<ph name="TIMEOUT_SECONDS" /> ውስጥ ወደነበሩበት ይመለሳሉ።</translation> +<translation id="1908992311423394684">አዲስ ጭነት</translation> <translation id="1915307458270490472">ዝጋ</translation> <translation id="1918022425394817322">ካሜራ ላይኛው ቀኝ ጥግ ላይ ገጥሟል</translation> <translation id="1919743966458266018">የተግባር መሪው የሚከፈትበት አቋራጭ ተቀይሯል። እባክዎ ከ<ph name="OLD_SHORTCUT" /> ይልቅ <ph name="NEW_SHORTCUT" />ን ይጠቀሙ።</translation>
diff --git a/ash/strings/ash_strings_fr-CA.xtb b/ash/strings/ash_strings_fr-CA.xtb index 068f5d8..47518dcd 100644 --- a/ash/strings/ash_strings_fr-CA.xtb +++ b/ash/strings/ash_strings_fr-CA.xtb
@@ -165,6 +165,7 @@ <translation id="1882897271359938046">Mise en miroir pour <ph name="DISPLAY_NAME" /></translation> <translation id="1885785240814121742">Déverrouillage avec empreinte digitale</translation> <translation id="1888656773939766144"><ph name="DISPLAY_NAME" /> n'est pas compatible avec la résolution de <ph name="SPECIFIED_RESOLUTION" /> (<ph name="SPECIFIED_REFRESH_RATE" /> Hz). La résolution de <ph name="FALLBACK_RESOLUTION" /> (<ph name="FALLBACK_REFRESH_RATE" />) sera utilisée à la place. Cliquez sur Confirmer pour valider cette modification. Les paramètres précédents seront restaurés dans <ph name="TIMEOUT_SECONDS" />.</translation> +<translation id="1908992311423394684">Nouvelle installation</translation> <translation id="1915307458270490472">Raccrocher</translation> <translation id="1918022425394817322">Caméra alignée sur le coin supérieur droit</translation> <translation id="1919743966458266018">Le raccourci qui permet d'ouvrir le gestionnaire de tâches a changé. Veuillez utiliser <ph name="NEW_SHORTCUT" /> à la place de <ph name="OLD_SHORTCUT" />.</translation>
diff --git a/ash/strings/ash_strings_lo.xtb b/ash/strings/ash_strings_lo.xtb index 1daaae81..4e7e363 100644 --- a/ash/strings/ash_strings_lo.xtb +++ b/ash/strings/ash_strings_lo.xtb
@@ -165,6 +165,7 @@ <translation id="1882897271359938046">ການສ່ອງໜ້າຈໍໃສ່ <ph name="DISPLAY_NAME" /></translation> <translation id="1885785240814121742">ປົດລັອກດ້ວຍລາຍນີ້ວມື</translation> <translation id="1888656773939766144"><ph name="DISPLAY_NAME" /> ບໍ່ຮອງຮັບ <ph name="SPECIFIED_RESOLUTION" /> (<ph name="SPECIFIED_REFRESH_RATE" /> Hz). ຄວາມລະອຽດໄດ້ຖືກປ່ຽນເປັນ <ph name="FALLBACK_RESOLUTION" /> (<ph name="FALLBACK_REFRESH_RATE" />) ແລ້ວ. ກະລຸນາຄລິກຢືນຢັນເພື່ອຮັກສາການປ່ຽນແປງ. ລະບົບຈະກູ້ຄືນການຕັ້ງຄ່າກ່ອນໜ້າໃນ <ph name="TIMEOUT_SECONDS" />.</translation> +<translation id="1908992311423394684">ຕິດຕັ້ງໃໝ່</translation> <translation id="1915307458270490472">ວາງສາຍ</translation> <translation id="1918022425394817322">ແນບກ້ອງຖ່າຍຮູບໄປໃສ່ມຸມຂວາເທິງແລ້ວ</translation> <translation id="1919743966458266018">ປ່ຽນທາງລັດເພື່ອເປີດຕົວຈັດການໜ້າວຽກແລ້ວ. ກະລຸນາໃຊ້ <ph name="NEW_SHORTCUT" /> ແທນ <ph name="OLD_SHORTCUT" />.</translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb index da53e2a..e867255a 100644 --- a/ash/strings/ash_strings_pt-PT.xtb +++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -265,7 +265,7 @@ <translation id="2542089167727451762">Toque na imagem do perfil.</translation> <translation id="255671100581129685">O Assistente Google não está disponível para sessões públicas.</translation> <translation id="256712445991462162">a lupa ancorada</translation> -<translation id="2570734079541893434">Faça a gestão das definições</translation> +<translation id="2570734079541893434">Gerir definições</translation> <translation id="2573588302192866788">Não foi possível ligar ao dispositivo <ph name="NAME" /></translation> <translation id="2575685495496069081">O início de sessão integrado foi desativado</translation> <translation id="2582112259361606227">Reiniciar para atualizar</translation>
diff --git a/ash/system/network/network_detailed_view.cc b/ash/system/network/network_detailed_view.cc index c3fd03f..93e32e4 100644 --- a/ash/system/network/network_detailed_view.cc +++ b/ash/system/network/network_detailed_view.cc
@@ -8,6 +8,7 @@ #include "ash/session/session_controller_impl.h" #include "ash/shell.h" #include "ash/strings/grit/ash_strings.h" +#include "ash/system/machine_learning/user_settings_event_logger.h" #include "ash/system/model/system_tray_model.h" #include "ash/system/network/network_list_item_view.h" #include "ash/system/network/tray_network_state_model.h" @@ -15,6 +16,7 @@ #include "ash/system/tray/tri_view.h" #include "base/check.h" #include "base/memory/weak_ptr.h" +#include "base/metrics/user_metrics.h" #include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h" #include "ui/views/bubble/bubble_dialog_delegate_view.h" #include "ui/views/controls/button/button.h" @@ -105,7 +107,13 @@ } void NetworkDetailedView::OnSettingsClicked() { - // TODO(b/207089013): Record user action metrics here + base::RecordAction( + list_type_ == LIST_TYPE_VPN + ? base::UserMetricsAction("StatusArea_VPN_Settings") + : base::UserMetricsAction("StatusArea_Network_Settings")); + + base::RecordAction(base::UserMetricsAction( + "ChromeOS.SystemTray.Network.SettingsButtonPressed")); const std::string guid = model_->default_network() ? model_->default_network()->guid
diff --git a/ash/system/network/network_detailed_view_controller.cc b/ash/system/network/network_detailed_view_controller.cc index 468caf62..cdccbbe 100644 --- a/ash/system/network/network_detailed_view_controller.cc +++ b/ash/system/network/network_detailed_view_controller.cc
@@ -196,6 +196,8 @@ } void NetworkDetailedViewController::OnMobileToggleClicked(bool new_state) { + RecordNetworkTypeToggled(NetworkType::kMobile, new_state); + const DeviceStateType cellular_state = model_->GetDeviceState(NetworkType::kCellular); @@ -231,6 +233,7 @@ } void NetworkDetailedViewController::OnWifiToggleClicked(bool new_state) { + RecordNetworkTypeToggled(NetworkType::kWiFi, new_state); model_->SetNetworkTypeEnabledState(NetworkType::kWiFi, new_state); }
diff --git a/ash/system/network/network_detailed_view_controller_unittest.cc b/ash/system/network/network_detailed_view_controller_unittest.cc index 87e878b..fd5f8781 100644 --- a/ash/system/network/network_detailed_view_controller_unittest.cc +++ b/ash/system/network/network_detailed_view_controller_unittest.cc
@@ -12,6 +12,7 @@ #include "ash/system/network/network_utils.h" #include "ash/test/ash_test_base.h" #include "ash/test/ash_test_helper.h" +#include "base/strings/strcat.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/metrics/user_action_tester.h" #include "base/test/scoped_feature_list.h" @@ -54,6 +55,9 @@ constexpr char kNetworkConnectionDetails[] = "StatusArea_Network_ConnectionDetails"; +const std::string kNetworkTechnologyWiFi = "WiFi"; +const std::string kNetworkTechnologyMobile = "Mobile"; + class NetworkConnectTestDelegate : public chromeos::NetworkConnect::Delegate { public: NetworkConnectTestDelegate() {} @@ -120,15 +124,29 @@ network_connect_delegate_.reset(); } - void CheckHistogramBuckets(NetworkRowClickedAction action, - size_t count, - size_t total_count) { + void CheckRowClickedActionHistogramBuckets(NetworkRowClickedAction action, + size_t count, + size_t total_count) { histogram_tester_.ExpectBucketCount( "ChromeOS.SystemTray.Network.RowClickedAction", action, count); histogram_tester_.ExpectTotalCount( "ChromeOS.SystemTray.Network.RowClickedAction", total_count); } + void CheckNetworkTypeToggledHistogramBuckets(const std::string& network_type, + bool new_state, + size_t count, + size_t total_count) { + histogram_tester_.ExpectBucketCount( + base::StrCat( + {"ChromeOS.SystemTray.Network.", network_type, ".Toggled"}), + new_state, count); + histogram_tester_.ExpectTotalCount( + base::StrCat( + {"ChromeOS.SystemTray.Network.", network_type, ".Toggled"}), + total_count); + } + void SelectNetworkListItem(const NetworkStatePropertiesPtr& network) { (static_cast<NetworkDetailedView::Delegate*>( network_detailed_view_controller_.get())) @@ -266,8 +284,9 @@ EXPECT_EQ(0, user_action_tester.GetActionCount(kNetworkConnectionDetails)); EXPECT_EQ(0, user_action_tester.GetActionCount(kNetworkConnectConfigured)); - CheckHistogramBuckets(NetworkRowClickedAction::kOpenNetworkSettingsPage, - /*count=*/0u, /*total_count=*/0u); + CheckRowClickedActionHistogramBuckets( + NetworkRowClickedAction::kOpenNetworkSettingsPage, + /*count=*/0u, /*total_count=*/0u); NetworkStatePropertiesPtr cellular_network = CreateStandaloneNetworkProperties(kCellular, NetworkType::kCellular, @@ -281,8 +300,9 @@ SelectNetworkListItem(cellular_network); EXPECT_EQ(0, GetSystemTrayClient()->show_network_settings_count()); EXPECT_EQ(0, GetSystemTrayClient()->show_sim_unlock_settings_count()); - CheckHistogramBuckets(NetworkRowClickedAction::kOpenNetworkSettingsPage, - /*count=*/0u, /*total_count=*/0u); + CheckRowClickedActionHistogramBuckets( + NetworkRowClickedAction::kOpenNetworkSettingsPage, + /*count=*/0u, /*total_count=*/0u); // Show network details page for a connected cellular network. GetSessionControllerClient()->SetSessionState( @@ -292,8 +312,9 @@ EXPECT_EQ(0, GetSystemTrayClient()->show_sim_unlock_settings_count()); EXPECT_EQ(1, user_action_tester.GetActionCount(kNetworkConnectionDetails)); EXPECT_EQ(0, user_action_tester.GetActionCount(kNetworkConnectConfigured)); - CheckHistogramBuckets(NetworkRowClickedAction::kOpenNetworkSettingsPage, - /*count=*/1u, /*total_count=*/1u); + CheckRowClickedActionHistogramBuckets( + NetworkRowClickedAction::kOpenNetworkSettingsPage, + /*count=*/1u, /*total_count=*/1u); } TEST_F(NetworkDetailedViewControllerTest, EmptyNetworkListItemSelected) { @@ -303,16 +324,18 @@ EXPECT_EQ(0, user_action_tester.GetActionCount(kNetworkConnectConfigured)); EXPECT_EQ(0, GetSystemTrayClient()->show_network_settings_count()); EXPECT_EQ(0, GetSystemTrayClient()->show_sim_unlock_settings_count()); - CheckHistogramBuckets(NetworkRowClickedAction::kOpenNetworkSettingsPage, - /*count=*/0u, /*total_count=*/0u); + CheckRowClickedActionHistogramBuckets( + NetworkRowClickedAction::kOpenNetworkSettingsPage, + /*count=*/0u, /*total_count=*/0u); SelectNetworkListItem(/*network=*/nullptr); EXPECT_EQ(1, GetSystemTrayClient()->show_network_settings_count()); EXPECT_EQ(0, GetSystemTrayClient()->show_sim_unlock_settings_count()); EXPECT_EQ(1, user_action_tester.GetActionCount(kNetworkConnectionDetails)); EXPECT_EQ(0, user_action_tester.GetActionCount(kNetworkConnectConfigured)); - CheckHistogramBuckets(NetworkRowClickedAction::kOpenNetworkSettingsPage, - /*count=*/1u, /*total_count=*/1u); + CheckRowClickedActionHistogramBuckets( + NetworkRowClickedAction::kOpenNetworkSettingsPage, + /*count=*/1u, /*total_count=*/1u); } TEST_F(NetworkDetailedViewControllerTest, CellularNetworkListItemSelected) { @@ -323,10 +346,12 @@ EXPECT_EQ(0, GetSystemTrayClient()->show_network_settings_count()); EXPECT_EQ(0, GetSystemTrayClient()->show_sim_unlock_settings_count()); - CheckHistogramBuckets(NetworkRowClickedAction::kOpenNetworkSettingsPage, - /*count=*/0u, /*total_count=*/0u); - CheckHistogramBuckets(NetworkRowClickedAction::kOpenSimUnlockDialog, - /*count=*/0u, /*total_count=*/0u); + CheckRowClickedActionHistogramBuckets( + NetworkRowClickedAction::kOpenNetworkSettingsPage, + /*count=*/0u, /*total_count=*/0u); + CheckRowClickedActionHistogramBuckets( + NetworkRowClickedAction::kOpenSimUnlockDialog, + /*count=*/0u, /*total_count=*/0u); NetworkStatePropertiesPtr cellular_network = CreateStandaloneNetworkProperties(kCellular, NetworkType::kCellular, @@ -343,10 +368,12 @@ EXPECT_EQ(1, user_action_tester.GetActionCount(kNetworkConnectionDetails)); EXPECT_EQ(0, user_action_tester.GetActionCount(kNetworkConnectConfigured)); - CheckHistogramBuckets(NetworkRowClickedAction::kOpenNetworkSettingsPage, - /*count=*/1u, /*total_count=*/1u); - CheckHistogramBuckets(NetworkRowClickedAction::kOpenSimUnlockDialog, - /*count=*/0u, /*total_count=*/1u); + CheckRowClickedActionHistogramBuckets( + NetworkRowClickedAction::kOpenNetworkSettingsPage, + /*count=*/1u, /*total_count=*/1u); + CheckRowClickedActionHistogramBuckets( + NetworkRowClickedAction::kOpenSimUnlockDialog, + /*count=*/0u, /*total_count=*/1u); // When cellular network is SIM locked, we show the SIM unlock settings page. cellular_network->type_state->get_cellular()->sim_locked = true; @@ -356,10 +383,12 @@ EXPECT_EQ(1, user_action_tester.GetActionCount(kNetworkConnectionDetails)); EXPECT_EQ(0, user_action_tester.GetActionCount(kNetworkConnectConfigured)); - CheckHistogramBuckets(NetworkRowClickedAction::kOpenNetworkSettingsPage, - /*count=*/1u, /*total_count=*/2u); - CheckHistogramBuckets(NetworkRowClickedAction::kOpenSimUnlockDialog, - /*count=*/1u, /*total_count=*/2u); + CheckRowClickedActionHistogramBuckets( + NetworkRowClickedAction::kOpenNetworkSettingsPage, + /*count=*/1u, /*total_count=*/2u); + CheckRowClickedActionHistogramBuckets( + NetworkRowClickedAction::kOpenSimUnlockDialog, + /*count=*/1u, /*total_count=*/2u); } TEST_F(NetworkDetailedViewControllerTest, WifiNetworkListItemSelected) { @@ -370,10 +399,12 @@ EXPECT_EQ(0, GetSystemTrayClient()->show_network_settings_count()); EXPECT_EQ(0, GetSystemTrayClient()->show_sim_unlock_settings_count()); - CheckHistogramBuckets(NetworkRowClickedAction::kOpenNetworkSettingsPage, - /*count=*/0u, /*total_count=*/0u); - CheckHistogramBuckets(NetworkRowClickedAction::kConnectToNetwork, - /*count=*/0u, /*total_count=*/0u); + CheckRowClickedActionHistogramBuckets( + NetworkRowClickedAction::kOpenNetworkSettingsPage, + /*count=*/0u, /*total_count=*/0u); + CheckRowClickedActionHistogramBuckets( + NetworkRowClickedAction::kConnectToNetwork, + /*count=*/0u, /*total_count=*/0u); // Clicking on an already connected network opens settings page. // Since this network is already connected, selecting this network @@ -389,10 +420,12 @@ EXPECT_EQ(0, user_action_tester.GetActionCount(kNetworkConnectConfigured)); EXPECT_EQ(shill::kStateIdle, GetWifiNetworkState()); - CheckHistogramBuckets(NetworkRowClickedAction::kOpenNetworkSettingsPage, - /*count=*/1u, /*total_count=*/1u); - CheckHistogramBuckets(NetworkRowClickedAction::kConnectToNetwork, - /*count=*/0u, /*total_count=*/1u); + CheckRowClickedActionHistogramBuckets( + NetworkRowClickedAction::kOpenNetworkSettingsPage, + /*count=*/1u, /*total_count=*/1u); + CheckRowClickedActionHistogramBuckets( + NetworkRowClickedAction::kConnectToNetwork, + /*count=*/0u, /*total_count=*/1u); // Set to be connectable and make sure network is connected to. wifi_network->connection_state = ConnectionStateType::kNotConnected; @@ -407,10 +440,12 @@ EXPECT_EQ(1, user_action_tester.GetActionCount(kNetworkConnectConfigured)); EXPECT_EQ(shill::kStateOnline, GetWifiNetworkState()); - CheckHistogramBuckets(NetworkRowClickedAction::kOpenNetworkSettingsPage, - /*count=*/1u, /*total_count=*/2u); - CheckHistogramBuckets(NetworkRowClickedAction::kConnectToNetwork, - /*count=*/1u, /*total_count=*/2u); + CheckRowClickedActionHistogramBuckets( + NetworkRowClickedAction::kOpenNetworkSettingsPage, + /*count=*/1u, /*total_count=*/2u); + CheckRowClickedActionHistogramBuckets( + NetworkRowClickedAction::kConnectToNetwork, + /*count=*/1u, /*total_count=*/2u); // Reset network state to idle. DisconnectWifiNetwork(); @@ -431,10 +466,12 @@ EXPECT_EQ(2, user_action_tester.GetActionCount(kNetworkConnectConfigured)); EXPECT_EQ(shill::kStateOnline, GetWifiNetworkState()); - CheckHistogramBuckets(NetworkRowClickedAction::kOpenNetworkSettingsPage, - /*count=*/1u, /*total_count=*/3u); - CheckHistogramBuckets(NetworkRowClickedAction::kConnectToNetwork, - /*count=*/2u, /*total_count=*/3u); + CheckRowClickedActionHistogramBuckets( + NetworkRowClickedAction::kOpenNetworkSettingsPage, + /*count=*/1u, /*total_count=*/3u); + CheckRowClickedActionHistogramBuckets( + NetworkRowClickedAction::kConnectToNetwork, + /*count=*/2u, /*total_count=*/3u); // Reset network to idle. DisconnectWifiNetwork(); @@ -455,20 +492,30 @@ EXPECT_EQ(2, user_action_tester.GetActionCount(kNetworkConnectConfigured)); EXPECT_EQ(shill::kStateIdle, GetWifiNetworkState()); - CheckHistogramBuckets(NetworkRowClickedAction::kOpenNetworkSettingsPage, - /*count=*/2u, /*total_count=*/4u); - CheckHistogramBuckets(NetworkRowClickedAction::kConnectToNetwork, - /*count=*/2u, /*total_count=*/4u); + CheckRowClickedActionHistogramBuckets( + NetworkRowClickedAction::kOpenNetworkSettingsPage, + /*count=*/2u, /*total_count=*/4u); + CheckRowClickedActionHistogramBuckets( + NetworkRowClickedAction::kConnectToNetwork, + /*count=*/2u, /*total_count=*/4u); } TEST_F(NetworkDetailedViewControllerTest, WifiStateChange) { // By default ash test instantiates WiFi networks and enables them. EXPECT_EQ(chromeos::NetworkStateHandler::TechnologyState::TECHNOLOGY_ENABLED, GetTechnologyState(chromeos::NetworkTypePattern::WiFi())); + CheckNetworkTypeToggledHistogramBuckets( + /*network_type=*/kNetworkTechnologyWiFi, + /*new_state=*/false, /*count=*/0u, + /*total_count=*/0u); // Disable wifi. ToggleWifiState(/*new_state=*/false); + CheckNetworkTypeToggledHistogramBuckets( + /*network_type=*/kNetworkTechnologyWiFi, + /*new_state=*/false, /*count=*/1u, + /*total_count=*/1u); EXPECT_EQ( chromeos::NetworkStateHandler::TechnologyState::TECHNOLOGY_AVAILABLE, GetTechnologyState(chromeos::NetworkTypePattern::WiFi())); @@ -476,6 +523,10 @@ // Renable wifi. ToggleWifiState(/*new_state=*/true); + CheckNetworkTypeToggledHistogramBuckets( + /*network_type=*/kNetworkTechnologyWiFi, + /*new_state=*/true, /*count=*/1u, + /*total_count=*/2u); EXPECT_EQ(chromeos::NetworkStateHandler::TechnologyState::TECHNOLOGY_ENABLED, GetTechnologyState(chromeos::NetworkTypePattern::WiFi())); } @@ -483,11 +534,19 @@ TEST_F(NetworkDetailedViewControllerTest, MobileToggleClicked) { AddCellularDevice(); + CheckNetworkTypeToggledHistogramBuckets( + /*network_type=*/kNetworkTechnologyMobile, + /*new_state=*/false, /*count=*/0u, + /*total_count=*/0u); EXPECT_EQ(chromeos::NetworkStateHandler::TechnologyState::TECHNOLOGY_ENABLED, GetTechnologyState(chromeos::NetworkTypePattern::Cellular())); ToggleMobileState(/*new_state=*/false); + CheckNetworkTypeToggledHistogramBuckets( + /*network_type=*/kNetworkTechnologyMobile, + /*new_state=*/false, /*count=*/1u, + /*total_count=*/1u); EXPECT_EQ( chromeos::NetworkStateHandler::TechnologyState::TECHNOLOGY_AVAILABLE, GetTechnologyState(chromeos::NetworkTypePattern::Cellular())); @@ -501,6 +560,10 @@ EXPECT_EQ( chromeos::NetworkStateHandler::TechnologyState::TECHNOLOGY_AVAILABLE, GetTechnologyState(chromeos::NetworkTypePattern::Cellular())); + CheckNetworkTypeToggledHistogramBuckets( + /*network_type=*/kNetworkTechnologyMobile, + /*new_state=*/true, /*count=*/1u, + /*total_count=*/2u); // When Cellular and Tether are both available toggle should control cellular. AddTetherDevice(); @@ -520,6 +583,10 @@ GetTechnologyState(chromeos::NetworkTypePattern::Tether())); EXPECT_EQ(chromeos::NetworkStateHandler::TechnologyState::TECHNOLOGY_ENABLED, GetTechnologyState(chromeos::NetworkTypePattern::Cellular())); + CheckNetworkTypeToggledHistogramBuckets( + /*network_type=*/kNetworkTechnologyMobile, + /*new_state=*/true, /*count=*/2u, + /*total_count=*/3u); ClearDevices(); AddTetherDevice(); @@ -533,6 +600,10 @@ EXPECT_EQ( chromeos::NetworkStateHandler::TechnologyState::TECHNOLOGY_AVAILABLE, GetTechnologyState(chromeos::NetworkTypePattern::Tether())); + CheckNetworkTypeToggledHistogramBuckets( + /*network_type=*/kNetworkTechnologyMobile, + /*new_state=*/false, /*count=*/2u, + /*total_count=*/4u); // When Tether is uninitialized and Bluetooth is disabled, toggling Mobile on // should enable Bluetooth. @@ -546,6 +617,10 @@ EXPECT_EQ( chromeos::NetworkStateHandler::TechnologyState::TECHNOLOGY_UNINITIALIZED, GetTechnologyState(chromeos::NetworkTypePattern::Tether())); + CheckNetworkTypeToggledHistogramBuckets( + /*network_type=*/kNetworkTechnologyMobile, + /*new_state=*/true, /*count=*/3u, + /*total_count=*/5u); // Simulate Bluetooth adapter being enabled. Note that when testing Bluetooth // will be set to kEnabling and needs to be manually changed to kEnabled using
diff --git a/ash/system/network/network_detailed_view_unittest.cc b/ash/system/network/network_detailed_view_unittest.cc index af9f0b3..38a4b48f 100644 --- a/ash/system/network/network_detailed_view_unittest.cc +++ b/ash/system/network/network_detailed_view_unittest.cc
@@ -18,6 +18,7 @@ #include "ash/system/tray/tri_view.h" #include "ash/test/ash_test_base.h" #include "base/run_loop.h" +#include "base/test/metrics/user_action_tester.h" #include "base/test/scoped_feature_list.h" #include "mojo/public/cpp/bindings/clone_traits.h" #include "ui/base/l10n/l10n_util.h" @@ -92,6 +93,13 @@ return network_detailed_view_; } + void CheckHistogramBuckets(int count) { + EXPECT_EQ(count, user_action_tester_.GetActionCount( + "ChromeOS.SystemTray.Network.SettingsButtonPressed")); + EXPECT_EQ(count, user_action_tester_.GetActionCount( + "StatusArea_Network_Settings")); + } + private: template <class T> T FindViewById(NetworkDetailedView::NetworkDetailedViewChildId id) { @@ -105,22 +113,29 @@ FakeDetailedViewDelegate fake_detailed_view_delegate_; NetworkDetailedView::ListType list_type_; base::test::ScopedFeatureList feature_list_; + base::UserActionTester user_action_tester_; }; TEST_F(NetworkDetailedViewTest, PressingSettingsButtonOpensSettings) { views::Button* settings_button = FindSettingsButton(); + CheckHistogramBuckets(/*count=*/0); + GetSessionControllerClient()->SetSessionState( session_manager::SessionState::LOCKED); LeftClickOn(settings_button); EXPECT_EQ(0, GetSystemTrayClient()->show_network_settings_count()); EXPECT_EQ(0u, fake_detailed_view_delegate()->close_bubble_call_count()); + CheckHistogramBuckets(/*count=*/0); + GetSessionControllerClient()->SetSessionState( session_manager::SessionState::ACTIVE); LeftClickOn(settings_button); EXPECT_EQ(1, GetSystemTrayClient()->show_network_settings_count()); EXPECT_EQ(1u, fake_detailed_view_delegate()->close_bubble_call_count()); + + CheckHistogramBuckets(/*count=*/1); } TEST_F(NetworkDetailedViewTest, PressingInfoButtonOpensInfoBubble) {
diff --git a/ash/system/network/network_utils.cc b/ash/system/network/network_utils.cc index ec33448..ec978d8d 100644 --- a/ash/system/network/network_utils.cc +++ b/ash/system/network/network_utils.cc
@@ -5,9 +5,33 @@ #include "ash/system/network/network_utils.h" #include "base/metrics/histogram_functions.h" +#include "base/strings/strcat.h" namespace ash { +namespace { + +std::string GetNetworkTypeName( + chromeos::network_config::mojom::NetworkType network_type) { + switch (network_type) { + case chromeos::network_config::mojom::NetworkType::kCellular: + [[fallthrough]]; + case chromeos::network_config::mojom::NetworkType::kTether: + [[fallthrough]]; + case chromeos::network_config::mojom::NetworkType::kMobile: + return "Mobile"; + case chromeos::network_config::mojom::NetworkType::kWiFi: + return "WiFi"; + default: + // A network type of other is unexpected, and no success + // metric for it exists. + NOTREACHED(); + return ""; + } +} + +} // namespace + void RecordNetworkRowClickedAction(NetworkRowClickedAction action) { base::UmaHistogramEnumeration("ChromeOS.SystemTray.Network.RowClickedAction", action); @@ -18,4 +42,16 @@ section); } +void RecordNetworkTypeToggled( + chromeos::network_config::mojom::NetworkType network_type, + bool new_state) { + const std::string network_name = GetNetworkTypeName(network_type); + + DCHECK(!network_name.empty()); + + base::UmaHistogramBoolean( + base::StrCat({"ChromeOS.SystemTray.Network.", network_name, ".Toggled"}), + new_state); +} + } // namespace ash \ No newline at end of file
diff --git a/ash/system/network/network_utils.h b/ash/system/network/network_utils.h index 6f94cc7..cf4d4dc 100644 --- a/ash/system/network/network_utils.h +++ b/ash/system/network/network_utils.h
@@ -6,6 +6,7 @@ #define ASH_SYSTEM_NETWORK_NETWORK_UTILS_H_ #include "ash/ash_export.h" +#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h" namespace ash { @@ -34,6 +35,10 @@ ASH_EXPORT void RecordDetailedViewSection(DetailedViewSection section); +ASH_EXPORT void RecordNetworkTypeToggled( + chromeos::network_config::mojom::NetworkType network_type, + bool new_state); + } // namespace ash #endif // ASH_SYSTEM_NETWORK_NETWORK_UTILS_H_ \ No newline at end of file
diff --git a/ash/webui/common/resources/keyboard_diagram.js b/ash/webui/common/resources/keyboard_diagram.js index e748ceb..f25788b 100644 --- a/ash/webui/common/resources/keyboard_diagram.js +++ b/ash/webui/common/resources/keyboard_diagram.js
@@ -60,35 +60,35 @@ kBack: {icon: 'keyboard:back', ariaNameI18n: 'keyboardDiagramAriaNameBack'}, kForward: { icon: 'keyboard:forward', - ariaNameI18n: 'keyboardDiagramAriaNameForward' + ariaNameI18n: 'keyboardDiagramAriaNameForward', }, kRefresh: { icon: 'keyboard:refresh', - ariaNameI18n: 'keyboardDiagramAriaNameRefresh' + ariaNameI18n: 'keyboardDiagramAriaNameRefresh', }, kFullscreen: { icon: 'keyboard:fullscreen', - ariaNameI18n: 'keyboardDiagramAriaNameFullscreen' + ariaNameI18n: 'keyboardDiagramAriaNameFullscreen', }, kOverview: { icon: 'keyboard:overview', - ariaNameI18n: 'keyboardDiagramAriaNameOverview' + ariaNameI18n: 'keyboardDiagramAriaNameOverview', }, kScreenshot: { icon: 'keyboard:screenshot', - ariaNameI18n: 'keyboardDiagramAriaNameScreenshot' + ariaNameI18n: 'keyboardDiagramAriaNameScreenshot', }, kScreenBrightnessDown: { icon: 'keyboard:display-brightness-down', - ariaNameI18n: 'keyboardDiagramAriaNameScreenBrightnessDown' + ariaNameI18n: 'keyboardDiagramAriaNameScreenBrightnessDown', }, kScreenBrightnessUp: { icon: 'keyboard:display-brightness-up', - ariaNameI18n: 'keyboardDiagramAriaNameScreenBrightnessUp' + ariaNameI18n: 'keyboardDiagramAriaNameScreenBrightnessUp', }, kPrivacyScreenToggle: { icon: 'keyboard:electronic-privacy-screen', - ariaNameI18n: 'keyboardDiagramAriaNamePrivacyScreenToggle' + ariaNameI18n: 'keyboardDiagramAriaNamePrivacyScreenToggle', }, kMicrophoneMute: { icon: 'keyboard:microphone-mute', @@ -96,15 +96,15 @@ }, kVolumeMute: { icon: 'keyboard:volume-mute', - ariaNameI18n: 'keyboardDiagramAriaNameMute' + ariaNameI18n: 'keyboardDiagramAriaNameMute', }, kVolumeDown: { icon: 'keyboard:volume-down', - ariaNameI18n: 'keyboardDiagramAriaNameVolumeDown' + ariaNameI18n: 'keyboardDiagramAriaNameVolumeDown', }, kVolumeUp: { icon: 'keyboard:volume-up', - ariaNameI18n: 'keyboardDiagramAriaNameVolumeUp' + ariaNameI18n: 'keyboardDiagramAriaNameVolumeUp', }, kKeyboardBacklightToggle: { icon: 'keyboard:keyboard-brightness-toggle', @@ -112,27 +112,27 @@ }, kKeyboardBacklightDown: { icon: 'keyboard:keyboard-brightness-down', - ariaNameI18n: 'keyboardDiagramAriaNameKeyboardBacklightDown' + ariaNameI18n: 'keyboardDiagramAriaNameKeyboardBacklightDown', }, kKeyboardBacklightUp: { icon: 'keyboard:keyboard-brightness-up', - ariaNameI18n: 'keyboardDiagramAriaNameKeyboardBacklightUp' + ariaNameI18n: 'keyboardDiagramAriaNameKeyboardBacklightUp', }, kNextTrack: { icon: 'keyboard:next-track', - ariaNameI18n: 'keyboardDiagramAriaNameTrackNext' + ariaNameI18n: 'keyboardDiagramAriaNameTrackNext', }, kPreviousTrack: { icon: 'keyboard:last-track', - ariaNameI18n: 'keyboardDiagramAriaNameTrackPrevious' + ariaNameI18n: 'keyboardDiagramAriaNameTrackPrevious', }, kPlayPause: { icon: 'keyboard:play-pause', - ariaNameI18n: 'keyboardDiagramAriaNamePlayPause' + ariaNameI18n: 'keyboardDiagramAriaNamePlayPause', }, kScreenMirror: { icon: 'keyboard:screen-mirror', - ariaNameI18n: 'keyboardDiagramAriaNameScreenMirror' + ariaNameI18n: 'keyboardDiagramAriaNameScreenMirror', }, // TODO(crbug.com/1207678): work out the localization scheme for keys like // delete and unknown.
diff --git a/ash/webui/common/resources/keyboard_layouts.js b/ash/webui/common/resources/keyboard_layouts.js index 675ea4d..5fb491d2 100644 --- a/ash/webui/common/resources/keyboard_layouts.js +++ b/ash/webui/common/resources/keyboard_layouts.js
@@ -512,14 +512,14 @@ 'be': [ ...kAzertyLetters, [41, {bottomLeft: '²', topLeft: '³'}], - [ 2, {bottomLeft: '&', topLeft: '1', bottomRight: '|'}], - [ 3, {bottomLeft: 'é', topLeft: '2', bottomRight: '@'}], - [ 4, {bottomLeft: '"', topLeft: '3', bottomRight: '#'}], - [ 5, {bottomLeft: '\'', topLeft: '4'}], - [ 6, {bottomLeft: '(', topLeft: '5'}], - [ 7, {bottomLeft: '§', topLeft: '6', bottomRight: '◌̂'}], - [ 8, {bottomLeft: 'è', topLeft: '7'}], - [ 9, {bottomLeft: '!', topLeft: '8'}], + [2, {bottomLeft: '&', topLeft: '1', bottomRight: '|'}], + [3, {bottomLeft: 'é', topLeft: '2', bottomRight: '@'}], + [4, {bottomLeft: '"', topLeft: '3', bottomRight: '#'}], + [5, {bottomLeft: '\'', topLeft: '4'}], + [6, {bottomLeft: '(', topLeft: '5'}], + [7, {bottomLeft: '§', topLeft: '6', bottomRight: '◌̂'}], + [8, {bottomLeft: 'è', topLeft: '7'}], + [9, {bottomLeft: '!', topLeft: '8'}], [10, {bottomLeft: 'ç', topLeft: '9', bottomRight: '{'}], [11, {bottomLeft: 'à', topLeft: '0', bottomRight: '}'}], [12, {bottomLeft: ')', topLeft: '°'}], @@ -542,14 +542,14 @@ /* Bulgaria */ 'bg': [ [41, {bottomLeft: '`', topLeft: '~', topRight: ' '}], - [ 2, {bottomLeft: '1', topLeft: '!', topRight: ' '}], - [ 3, {bottomLeft: '2', topLeft: '@', topRight: '?'}], - [ 4, {bottomLeft: '3', topLeft: '#', topRight: '+'}], - [ 5, {bottomLeft: '4', topLeft: '$', topRight: '"'}], - [ 6, {bottomLeft: '5', topLeft: '%', topRight: ' '}], - [ 7, {bottomLeft: '6', topLeft: '^', topRight: '='}], - [ 8, {bottomLeft: '7', topLeft: '&', topRight: ':'}], - [ 9, {bottomLeft: '8', topLeft: '*', topRight: '/'}], + [2, {bottomLeft: '1', topLeft: '!', topRight: ' '}], + [3, {bottomLeft: '2', topLeft: '@', topRight: '?'}], + [4, {bottomLeft: '3', topLeft: '#', topRight: '+'}], + [5, {bottomLeft: '4', topLeft: '$', topRight: '"'}], + [6, {bottomLeft: '5', topLeft: '%', topRight: ' '}], + [7, {bottomLeft: '6', topLeft: '^', topRight: '='}], + [8, {bottomLeft: '7', topLeft: '&', topRight: ':'}], + [9, {bottomLeft: '8', topLeft: '*', topRight: '/'}], [10, {bottomLeft: '9', topLeft: '(', topRight: '_'}], [11, {bottomLeft: '0', topLeft: ')', topRight: '№'}], [12, {bottomLeft: '-', topLeft: '_', topRight: '|'}], @@ -613,14 +613,14 @@ 'ch': [ ...kQwertzLetters, [41, {bottomLeft: '§', topLeft: '°'}], - [ 2, {bottomLeft: '1', topLeft: '+', bottomRight: '¦'}], - [ 3, {bottomLeft: '2', topLeft: '"', bottomRight: '@'}], - [ 4, {bottomLeft: '3', topLeft: '*', bottomRight: '#'}], - [ 5, {bottomLeft: '4', topLeft: 'ç'}], - [ 6, {bottomLeft: '5', topLeft: '%'}], - [ 7, {bottomLeft: '6', topLeft: '&', bottomRight: '¬'}], - [ 8, {bottomLeft: '7', topLeft: '/', bottomRight: '|'}], - [ 9, {bottomLeft: '8', topLeft: '(', bottomRight: '¢'}], + [2, {bottomLeft: '1', topLeft: '+', bottomRight: '¦'}], + [3, {bottomLeft: '2', topLeft: '"', bottomRight: '@'}], + [4, {bottomLeft: '3', topLeft: '*', bottomRight: '#'}], + [5, {bottomLeft: '4', topLeft: 'ç'}], + [6, {bottomLeft: '5', topLeft: '%'}], + [7, {bottomLeft: '6', topLeft: '&', bottomRight: '¬'}], + [8, {bottomLeft: '7', topLeft: '/', bottomRight: '|'}], + [9, {bottomLeft: '8', topLeft: '(', bottomRight: '¢'}], [10, {bottomLeft: '9', topLeft: ')'}], [11, {bottomLeft: '0', topLeft: '='}], [12, {bottomLeft: '\'', topLeft: '?', bottomRight: '◌́'}], @@ -655,14 +655,14 @@ 'cz': [ ...kQwertzLetters, [41, {bottomLeft: ';', topLeft: '°'}], - [ 2, {bottomLeft: '+', topLeft: '1', bottomRight: '!'}], - [ 3, {bottomLeft: 'ě', topLeft: '2', bottomRight: '@'}], - [ 4, {bottomLeft: 'š', topLeft: '3', bottomRight: '#'}], - [ 5, {bottomLeft: 'č', topLeft: '4', bottomRight: '$'}], - [ 6, {bottomLeft: 'ř', topLeft: '5', bottomRight: '%'}], - [ 7, {bottomLeft: 'ž', topLeft: '6', bottomRight: '^'}], - [ 8, {bottomLeft: 'ý', topLeft: '7', bottomRight: '&'}], - [ 9, {bottomLeft: 'á', topLeft: '8', bottomRight: '*'}], + [2, {bottomLeft: '+', topLeft: '1', bottomRight: '!'}], + [3, {bottomLeft: 'ě', topLeft: '2', bottomRight: '@'}], + [4, {bottomLeft: 'š', topLeft: '3', bottomRight: '#'}], + [5, {bottomLeft: 'č', topLeft: '4', bottomRight: '$'}], + [6, {bottomLeft: 'ř', topLeft: '5', bottomRight: '%'}], + [7, {bottomLeft: 'ž', topLeft: '6', bottomRight: '^'}], + [8, {bottomLeft: 'ý', topLeft: '7', bottomRight: '&'}], + [9, {bottomLeft: 'á', topLeft: '8', bottomRight: '*'}], [10, {bottomLeft: 'í', topLeft: '9', bottomRight: '{'}], [11, {bottomLeft: 'é', topLeft: '0', bottomRight: '}'}], [12, {bottomLeft: '=', topLeft: '%', bottomRight: '\\'}], @@ -695,14 +695,14 @@ 'ee': [ ...kQwertyLetters, [41, {bottomLeft: '◌̌', topLeft: '~'}], - [ 2, {bottomLeft: '1', topLeft: '!'}], - [ 3, {bottomLeft: '2', topLeft: '"', bottomRight: '@'}], - [ 4, {bottomLeft: '3', topLeft: '#', bottomRight: '£'}], - [ 5, {bottomLeft: '4', topLeft: '¤', bottomRight: '$'}], - [ 6, {bottomLeft: '5', topLeft: '%'}], - [ 7, {bottomLeft: '6', topLeft: '&'}], - [ 8, {bottomLeft: '7', topLeft: '/', bottomRight: '{'}], - [ 9, {bottomLeft: '8', topLeft: '(', bottomRight: '['}], + [2, {bottomLeft: '1', topLeft: '!'}], + [3, {bottomLeft: '2', topLeft: '"', bottomRight: '@'}], + [4, {bottomLeft: '3', topLeft: '#', bottomRight: '£'}], + [5, {bottomLeft: '4', topLeft: '¤', bottomRight: '$'}], + [6, {bottomLeft: '5', topLeft: '%'}], + [7, {bottomLeft: '6', topLeft: '&'}], + [8, {bottomLeft: '7', topLeft: '/', bottomRight: '{'}], + [9, {bottomLeft: '8', topLeft: '(', bottomRight: '['}], [10, {bottomLeft: '9', topLeft: ')', bottomRight: ']'}], [11, {bottomLeft: '0', topLeft: '=', bottomRight: '}'}], [12, {bottomLeft: '+', topLeft: '?', bottomRight: '\\'}], @@ -729,14 +729,14 @@ 'es': [ ...kQwertyLetters, [41, {bottomLeft: 'º', topLeft: 'ª', bottomRight: '\\'}], - [ 2, {bottomLeft: '1', topLeft: '!', bottomRight: '|'}], - [ 3, {bottomLeft: '2', topLeft: '"', bottomRight: '@'}], - [ 4, {bottomLeft: '3', topLeft: '·', bottomRight: '#'}], - [ 5, {bottomLeft: '4', topLeft: '$', bottomRight: '~'}], - [ 6, {bottomLeft: '5', topLeft: '%'}], - [ 7, {bottomLeft: '6', topLeft: '&', bottomRight: '¬'}], - [ 8, {bottomLeft: '7', topLeft: '/'}], - [ 9, {bottomLeft: '8', topLeft: '('}], + [2, {bottomLeft: '1', topLeft: '!', bottomRight: '|'}], + [3, {bottomLeft: '2', topLeft: '"', bottomRight: '@'}], + [4, {bottomLeft: '3', topLeft: '·', bottomRight: '#'}], + [5, {bottomLeft: '4', topLeft: '$', bottomRight: '~'}], + [6, {bottomLeft: '5', topLeft: '%'}], + [7, {bottomLeft: '6', topLeft: '&', bottomRight: '¬'}], + [8, {bottomLeft: '7', topLeft: '/'}], + [9, {bottomLeft: '8', topLeft: '('}], [10, {bottomLeft: '9', topLeft: ')'}], [11, {bottomLeft: '0', topLeft: '='}], [12, {bottomLeft: '\'', topLeft: '?'}], @@ -768,14 +768,14 @@ [1, 'échap'], [41, {bottomLeft: '²'}], - [ 2, {bottomLeft: '&', topLeft: '1'}], - [ 3, {bottomLeft: 'é', topLeft: '2'}], - [ 4, {bottomLeft: '"', topLeft: '3'}], - [ 5, {bottomLeft: '\'', topLeft: '4'}], - [ 6, {bottomLeft: '(', topLeft: '5'}], - [ 7, {bottomLeft: '-', topLeft: '6'}], - [ 8, {bottomLeft: 'è', topLeft: '7'}], - [ 9, {bottomLeft: '_', topLeft: '8'}], + [2, {bottomLeft: '&', topLeft: '1'}], + [3, {bottomLeft: 'é', topLeft: '2'}], + [4, {bottomLeft: '"', topLeft: '3'}], + [5, {bottomLeft: '\'', topLeft: '4'}], + [6, {bottomLeft: '(', topLeft: '5'}], + [7, {bottomLeft: '-', topLeft: '6'}], + [8, {bottomLeft: 'è', topLeft: '7'}], + [9, {bottomLeft: '_', topLeft: '8'}], [10, {bottomLeft: 'ç', topLeft: '9'}], [11, {bottomLeft: 'à', topLeft: '0'}], [12, {bottomLeft: ')', topLeft: '°'}], @@ -804,14 +804,14 @@ /* Greece */ 'gr': [ [41, {bottomLeft: '◌̀', topLeft: '~'}], - [ 2, {bottomLeft: '1', topLeft: '!'}], - [ 3, {bottomLeft: '2', topLeft: '@'}], - [ 4, {bottomLeft: '3', topLeft: '#'}], - [ 5, {bottomLeft: '4', topLeft: '$'}], - [ 6, {bottomLeft: '5', topLeft: '%'}], - [ 7, {bottomLeft: '6', topLeft: '◌̂'}], - [ 8, {bottomLeft: '7', topLeft: '&'}], - [ 9, {bottomLeft: '8', topLeft: '*'}], + [2, {bottomLeft: '1', topLeft: '!'}], + [3, {bottomLeft: '2', topLeft: '@'}], + [4, {bottomLeft: '3', topLeft: '#'}], + [5, {bottomLeft: '4', topLeft: '$'}], + [6, {bottomLeft: '5', topLeft: '%'}], + [7, {bottomLeft: '6', topLeft: '◌̂'}], + [8, {bottomLeft: '7', topLeft: '&'}], + [9, {bottomLeft: '8', topLeft: '*'}], [10, {bottomLeft: '9', topLeft: '('}], [11, {bottomLeft: '0', topLeft: ')'}], [12, {bottomLeft: '-', topLeft: '_'}], @@ -867,14 +867,14 @@ 'hr': [ ...kQwertzLetters, [41, {bottomLeft: '◌̧', topLeft: '◌̈'}], - [ 2, {bottomLeft: '1', topLeft: '!', bottomRight: '~'}], - [ 3, {bottomLeft: '2', topLeft: '"', bottomRight: '◌̌'}], - [ 4, {bottomLeft: '3', topLeft: '#', bottomRight: '◌̂'}], - [ 5, {bottomLeft: '4', topLeft: '$', bottomRight: '◌̆'}], - [ 6, {bottomLeft: '5', topLeft: '%', bottomRight: '◌̊'}], - [ 7, {bottomLeft: '6', topLeft: '&', bottomRight: '◌̢'}], - [ 8, {bottomLeft: '7', topLeft: '/', bottomRight: '◌̀'}], - [ 9, {bottomLeft: '8', topLeft: '(', bottomRight: '◌̇'}], + [2, {bottomLeft: '1', topLeft: '!', bottomRight: '~'}], + [3, {bottomLeft: '2', topLeft: '"', bottomRight: '◌̌'}], + [4, {bottomLeft: '3', topLeft: '#', bottomRight: '◌̂'}], + [5, {bottomLeft: '4', topLeft: '$', bottomRight: '◌̆'}], + [6, {bottomLeft: '5', topLeft: '%', bottomRight: '◌̊'}], + [7, {bottomLeft: '6', topLeft: '&', bottomRight: '◌̢'}], + [8, {bottomLeft: '7', topLeft: '/', bottomRight: '◌̀'}], + [9, {bottomLeft: '8', topLeft: '(', bottomRight: '◌̇'}], [10, {bottomLeft: '9', topLeft: ')', bottomRight: '◌́'}], [11, {bottomLeft: '0', topLeft: '=', bottomRight: '◌̋'}], [12, {bottomLeft: '\'', topLeft: '?', bottomRight: '◌̈'}], @@ -912,14 +912,14 @@ /* Israel */ 'il': [ [41, {bottomLeft: '`', topLeft: '~'}], - [ 2, {bottomLeft: '1', topLeft: '!'}], - [ 3, {bottomLeft: '2', topLeft: '@'}], - [ 4, {bottomLeft: '3', topLeft: '#', bottomRight: '€'}], - [ 5, {bottomLeft: '4', topLeft: '$', bottomRight: '₪'}], - [ 6, {bottomLeft: '5', topLeft: '%'}], - [ 7, {bottomLeft: '6', topLeft: '^'}], - [ 8, {bottomLeft: '7', topLeft: '&'}], - [ 9, {bottomLeft: '8', topLeft: '*'}], + [2, {bottomLeft: '1', topLeft: '!'}], + [3, {bottomLeft: '2', topLeft: '@'}], + [4, {bottomLeft: '3', topLeft: '#', bottomRight: '€'}], + [5, {bottomLeft: '4', topLeft: '$', bottomRight: '₪'}], + [6, {bottomLeft: '5', topLeft: '%'}], + [7, {bottomLeft: '6', topLeft: '^'}], + [8, {bottomLeft: '7', topLeft: '&'}], + [9, {bottomLeft: '8', topLeft: '*'}], [10, {bottomLeft: '9', topLeft: ')'}], [11, {bottomLeft: '0', topLeft: '('}], [12, {bottomLeft: '-', topLeft: '_'}], @@ -970,14 +970,14 @@ 'is': [ ...kQwertyLetters, [41, {bottomLeft: '◌̊', topLeft: '◌̈'}], - [ 2, {bottomLeft: '1', topLeft: '!'}], - [ 3, {bottomLeft: '2', topLeft: '"'}], - [ 4, {bottomLeft: '3', topLeft: '#'}], - [ 5, {bottomLeft: '4', topLeft: '$'}], - [ 6, {bottomLeft: '5', topLeft: '%'}], - [ 7, {bottomLeft: '6', topLeft: '&'}], - [ 8, {bottomLeft: '7', topLeft: '/', bottomRight: '{'}], - [ 9, {bottomLeft: '8', topLeft: '(', bottomRight: '['}], + [2, {bottomLeft: '1', topLeft: '!'}], + [3, {bottomLeft: '2', topLeft: '"'}], + [4, {bottomLeft: '3', topLeft: '#'}], + [5, {bottomLeft: '4', topLeft: '$'}], + [6, {bottomLeft: '5', topLeft: '%'}], + [7, {bottomLeft: '6', topLeft: '&'}], + [8, {bottomLeft: '7', topLeft: '/', bottomRight: '{'}], + [9, {bottomLeft: '8', topLeft: '(', bottomRight: '['}], [10, {bottomLeft: '9', topLeft: ')', bottomRight: ']'}], [11, {bottomLeft: '0', topLeft: '=', bottomRight: '}'}], [12, {main: 'ö', bottomRight: '\\'}], @@ -1004,14 +1004,14 @@ 'it': [ ...kQwertyLetters, [41, {bottomLeft: '\\', topLeft: '|'}], - [ 2, {bottomLeft: '1', topLeft: '!'}], - [ 3, {bottomLeft: '2', topLeft: '"'}], - [ 4, {bottomLeft: '3', topLeft: '£'}], - [ 5, {bottomLeft: '4', topLeft: '$'}], - [ 6, {bottomLeft: '5', topLeft: '%'}], - [ 7, {bottomLeft: '6', topLeft: '&'}], - [ 8, {bottomLeft: '7', topLeft: '/'}], - [ 9, {bottomLeft: '8', topLeft: '('}], + [2, {bottomLeft: '1', topLeft: '!'}], + [3, {bottomLeft: '2', topLeft: '"'}], + [4, {bottomLeft: '3', topLeft: '£'}], + [5, {bottomLeft: '4', topLeft: '$'}], + [6, {bottomLeft: '5', topLeft: '%'}], + [7, {bottomLeft: '6', topLeft: '&'}], + [8, {bottomLeft: '7', topLeft: '/'}], + [9, {bottomLeft: '8', topLeft: '('}], [10, {bottomLeft: '9', topLeft: ')'}], [11, {bottomLeft: '0', topLeft: '='}], [12, {bottomLeft: '\'', topLeft: '?'}], @@ -1037,18 +1037,21 @@ ], /* Japan */ 'jp': [ - [41, { - icon: 'keyboard:jis-letter-switch', - ariaNameI18n: 'keyboardDiagramAriaNameJisLetterSwitch' - }], - [ 2, {bottomLeft: '1', topLeft: '!', bottomRight: 'ぬ'}], - [ 3, {bottomLeft: '2', topLeft: '"', bottomRight: 'ふ'}], - [ 4, {bottomLeft: '3', topLeft: '#', bottomRight: 'あ'}], - [ 5, {bottomLeft: '4', topLeft: '$', bottomRight: 'う'}], - [ 6, {bottomLeft: '5', topLeft: '%', bottomRight: 'え'}], - [ 7, {bottomLeft: '6', topLeft: '&', bottomRight: 'お'}], - [ 8, {bottomLeft: '7', topLeft: '\'', bottomRight: 'や'}], - [ 9, {bottomLeft: '8', topLeft: '(', bottomRight: 'ゆ'}], + [ + 41, + { + icon: 'keyboard:jis-letter-switch', + ariaNameI18n: 'keyboardDiagramAriaNameJisLetterSwitch', + }, + ], + [2, {bottomLeft: '1', topLeft: '!', bottomRight: 'ぬ'}], + [3, {bottomLeft: '2', topLeft: '"', bottomRight: 'ふ'}], + [4, {bottomLeft: '3', topLeft: '#', bottomRight: 'あ'}], + [5, {bottomLeft: '4', topLeft: '$', bottomRight: 'う'}], + [6, {bottomLeft: '5', topLeft: '%', bottomRight: 'え'}], + [7, {bottomLeft: '6', topLeft: '&', bottomRight: 'お'}], + [8, {bottomLeft: '7', topLeft: '\'', bottomRight: 'や'}], + [9, {bottomLeft: '8', topLeft: '(', bottomRight: 'ゆ'}], [10, {bottomLeft: '9', topLeft: ')', bottomRight: 'よ'}], [11, {bottomLeft: '0', topLeft: ' ', topRight: 'を', bottomRight: 'わ'}], [12, {bottomLeft: '-', topLeft: '=', bottomRight: 'ほ'}], @@ -1098,14 +1101,14 @@ /* South Korea */ 'kr': [ [41, {bottomLeft: '◌̀', topLeft: '~'}], - [ 2, {bottomLeft: '1', topLeft: '!'}], - [ 3, {bottomLeft: '2', topLeft: '@'}], - [ 4, {bottomLeft: '3', topLeft: '#'}], - [ 5, {bottomLeft: '4', topLeft: '$'}], - [ 6, {bottomLeft: '5', topLeft: '%'}], - [ 7, {bottomLeft: '6', topLeft: '^'}], - [ 8, {bottomLeft: '7', topLeft: '&'}], - [ 9, {bottomLeft: '8', topLeft: '*'}], + [2, {bottomLeft: '1', topLeft: '!'}], + [3, {bottomLeft: '2', topLeft: '@'}], + [4, {bottomLeft: '3', topLeft: '#'}], + [5, {bottomLeft: '4', topLeft: '$'}], + [6, {bottomLeft: '5', topLeft: '%'}], + [7, {bottomLeft: '6', topLeft: '^'}], + [8, {bottomLeft: '7', topLeft: '&'}], + [9, {bottomLeft: '8', topLeft: '*'}], [10, {bottomLeft: '9', topLeft: '('}], [11, {bottomLeft: '0', topLeft: ')'}], [12, {bottomLeft: '-', topLeft: '_'}], @@ -1189,14 +1192,14 @@ 'pt': [ ...kQwertyLetters, [41, {bottomLeft: '\\', topLeft: '|'}], - [ 2, {bottomLeft: '1', topLeft: '!'}], - [ 3, {bottomLeft: '2', topLeft: '"', bottomRight: '@'}], - [ 4, {bottomLeft: '3', topLeft: '#', bottomRight: '£'}], - [ 5, {bottomLeft: '4', topLeft: '$', bottomRight: '§'}], - [ 6, {bottomLeft: '5', topLeft: '%'}], - [ 7, {bottomLeft: '6', topLeft: '&'}], - [ 8, {bottomLeft: '7', topLeft: '/', bottomRight: '{'}], - [ 9, {bottomLeft: '8', topLeft: '(', bottomRight: '['}], + [2, {bottomLeft: '1', topLeft: '!'}], + [3, {bottomLeft: '2', topLeft: '"', bottomRight: '@'}], + [4, {bottomLeft: '3', topLeft: '#', bottomRight: '£'}], + [5, {bottomLeft: '4', topLeft: '$', bottomRight: '§'}], + [6, {bottomLeft: '5', topLeft: '%'}], + [7, {bottomLeft: '6', topLeft: '&'}], + [8, {bottomLeft: '7', topLeft: '/', bottomRight: '{'}], + [9, {bottomLeft: '8', topLeft: '(', bottomRight: '['}], [10, {bottomLeft: '9', topLeft: ')', bottomRight: ']'}], [11, {bottomLeft: '0', topLeft: '=', bottomRight: '}'}], [12, {bottomLeft: '\'', topLeft: '?'}], @@ -1225,14 +1228,14 @@ /* Russia */ 'ru': [ [41, {bottomLeft: '`', topLeft: '~', bottomRight: 'ë'}], - [ 2, {bottomLeft: '1', topLeft: '!', topRight: ' '}], - [ 3, {bottomLeft: '2', topLeft: '@', topRight: '"'}], - [ 4, {bottomLeft: '3', topLeft: '#', topRight: '№'}], - [ 5, {bottomLeft: '4', topLeft: '$', topRight: ';'}], - [ 6, {bottomLeft: '5', topLeft: '%', topRight: ' '}], - [ 7, {bottomLeft: '6', topLeft: '◌̂', topRight: ':'}], - [ 8, {bottomLeft: '7', topLeft: '&', topRight: '?'}], - [ 9, {bottomLeft: '8', topLeft: '*', topRight: ' '}], + [2, {bottomLeft: '1', topLeft: '!', topRight: ' '}], + [3, {bottomLeft: '2', topLeft: '@', topRight: '"'}], + [4, {bottomLeft: '3', topLeft: '#', topRight: '№'}], + [5, {bottomLeft: '4', topLeft: '$', topRight: ';'}], + [6, {bottomLeft: '5', topLeft: '%', topRight: ' '}], + [7, {bottomLeft: '6', topLeft: '◌̂', topRight: ':'}], + [8, {bottomLeft: '7', topLeft: '&', topRight: '?'}], + [9, {bottomLeft: '8', topLeft: '*', topRight: ' '}], [10, {bottomLeft: '9', topLeft: '(', topRight: ' '}], [11, {bottomLeft: '0', topLeft: ')', topRight: ' '}], [12, {bottomLeft: '-', topLeft: '_', topRight: ' '}], @@ -1285,14 +1288,14 @@ 'sk': [ ...kQwertzLetters, [41, {bottomLeft: ';', topLeft: '°'}], - [ 2, {bottomLeft: '+', topLeft: '1'}], - [ 3, {bottomLeft: 'ľ', topLeft: '2'}], - [ 4, {bottomLeft: 'š', topLeft: '3'}], - [ 5, {bottomLeft: 'č', topLeft: '4'}], - [ 6, {bottomLeft: 'ť', topLeft: '5'}], - [ 7, {bottomLeft: 'ž', topLeft: '6'}], - [ 8, {bottomLeft: 'ý', topLeft: '7'}], - [ 9, {bottomLeft: 'á', topLeft: '8'}], + [2, {bottomLeft: '+', topLeft: '1'}], + [3, {bottomLeft: 'ľ', topLeft: '2'}], + [4, {bottomLeft: 'š', topLeft: '3'}], + [5, {bottomLeft: 'č', topLeft: '4'}], + [6, {bottomLeft: 'ť', topLeft: '5'}], + [7, {bottomLeft: 'ž', topLeft: '6'}], + [8, {bottomLeft: 'ý', topLeft: '7'}], + [9, {bottomLeft: 'á', topLeft: '8'}], [10, {bottomLeft: 'í', topLeft: '9'}], [11, {bottomLeft: 'é', topLeft: '0'}], [12, {bottomLeft: '=', topLeft: '%'}], @@ -1316,14 +1319,14 @@ /* Thailand */ 'th': [ [41, {bottomLeft: '◌̀', topLeft: '~', bottomRight: '_', topRight: '%'}], - [ 2, {bottomLeft: '1', topLeft: '!', bottomRight: 'ๅ', topRight: '+'}], - [ 3, {bottomLeft: '2', topLeft: '@', bottomRight: '/', topRight: '๑'}], - [ 4, {bottomLeft: '3', topLeft: '#', bottomRight: '-', topRight: '๒'}], - [ 5, {bottomLeft: '4', topLeft: '$', bottomRight: 'ภ', topRight: '๓'}], - [ 6, {bottomLeft: '5', topLeft: '%', bottomRight: 'ถ', topRight: '๔'}], - [ 7, {bottomLeft: '6', topLeft: '◌̂', bottomRight: '◌ุ', topRight: '◌ู'}], - [ 8, {bottomLeft: '7', topLeft: '&', bottomRight: '◌ึ', topRight: '฿'}], - [ 9, {bottomLeft: '8', topLeft: '*', bottomRight: 'ค', topRight: '๕'}], + [2, {bottomLeft: '1', topLeft: '!', bottomRight: 'ๅ', topRight: '+'}], + [3, {bottomLeft: '2', topLeft: '@', bottomRight: '/', topRight: '๑'}], + [4, {bottomLeft: '3', topLeft: '#', bottomRight: '-', topRight: '๒'}], + [5, {bottomLeft: '4', topLeft: '$', bottomRight: 'ภ', topRight: '๓'}], + [6, {bottomLeft: '5', topLeft: '%', bottomRight: 'ถ', topRight: '๔'}], + [7, {bottomLeft: '6', topLeft: '◌̂', bottomRight: '◌ุ', topRight: '◌ู'}], + [8, {bottomLeft: '7', topLeft: '&', bottomRight: '◌ึ', topRight: '฿'}], + [9, {bottomLeft: '8', topLeft: '*', bottomRight: 'ค', topRight: '๕'}], [10, {bottomLeft: '9', topLeft: '(', bottomRight: 'ต', topRight: '๖'}], [11, {bottomLeft: '0', topLeft: ')', bottomRight: 'จ', topRight: '๗'}], [12, {bottomLeft: '-', topLeft: '_', bottomRight: 'ข', topRight: '๘'}], @@ -1371,14 +1374,14 @@ // TODO(b/221920512): We apparently ship two very different layouts in // Turkey: F-type and Q-type. It's unclear how to distinguish between them // in code, so for now only the glyphs they have in common are shown. - [ 2, {bottomLeft: '1', topLeft: '!'}], - [ 3, {bottomLeft: '2', topLeft: ' '}], - [ 4, {bottomLeft: '3', topLeft: '◌̂'}], - [ 5, {bottomLeft: '4', topLeft: ' '}], - [ 6, {bottomLeft: '5', topLeft: '%'}], - [ 7, {bottomLeft: '6', topLeft: '&'}], - [ 8, {bottomLeft: '7', topLeft: ' '}], - [ 9, {bottomLeft: '8', topLeft: '('}], + [2, {bottomLeft: '1', topLeft: '!'}], + [3, {bottomLeft: '2', topLeft: ' '}], + [4, {bottomLeft: '3', topLeft: '◌̂'}], + [5, {bottomLeft: '4', topLeft: ' '}], + [6, {bottomLeft: '5', topLeft: '%'}], + [7, {bottomLeft: '6', topLeft: '&'}], + [8, {bottomLeft: '7', topLeft: ' '}], + [9, {bottomLeft: '8', topLeft: '('}], [10, {bottomLeft: '9', topLeft: ')'}], [11, {bottomLeft: '0', topLeft: '='}], [12, {bottomLeft: ' ', topLeft: '?'}],
diff --git a/ash/webui/common/resources/navigation_selector.js b/ash/webui/common/resources/navigation_selector.js index 896c176b..4048a20 100644 --- a/ash/webui/common/resources/navigation_selector.js +++ b/ash/webui/common/resources/navigation_selector.js
@@ -56,7 +56,7 @@ selectorItems: { type: Array, value: () => [], - } + }, }; }
diff --git a/ash/webui/connectivity_diagnostics/resources/connectivity_diagnostics.js b/ash/webui/connectivity_diagnostics/resources/connectivity_diagnostics.js index e10cad8..b511dc8 100644 --- a/ash/webui/connectivity_diagnostics/resources/connectivity_diagnostics.js +++ b/ash/webui/connectivity_diagnostics/resources/connectivity_diagnostics.js
@@ -76,5 +76,5 @@ sendWithPromise('getShowFeedbackButton').then(result => { this.set('showFeedbackBtn_', result[0]); }); - } + }, });
diff --git a/ash/webui/diagnostics_ui/resources/battery_status_card.js b/ash/webui/diagnostics_ui/resources/battery_status_card.js index 2e9bbcfa..af9f470 100644 --- a/ash/webui/diagnostics_ui/resources/battery_status_card.js +++ b/ash/webui/diagnostics_ui/resources/battery_status_card.js
@@ -345,5 +345,5 @@ ExternalPowerSource.kAc) ? 'remove-stroke' : ''; - } + }, });
diff --git a/ash/webui/diagnostics_ui/resources/cpu_card.js b/ash/webui/diagnostics_ui/resources/cpu_card.js index a4321b4..32c3d94 100644 --- a/ash/webui/diagnostics_ui/resources/cpu_card.js +++ b/ash/webui/diagnostics_ui/resources/cpu_card.js
@@ -52,7 +52,7 @@ RoutineType.kCpuFloatingPoint, RoutineType.kCpuPrime, ]; - } + }, }, /** @private {!CpuUsage} */
diff --git a/ash/webui/diagnostics_ui/resources/fake_data.js b/ash/webui/diagnostics_ui/resources/fake_data.js index 746d111..0de082b8 100644 --- a/ash/webui/diagnostics_ui/resources/fake_data.js +++ b/ash/webui/diagnostics_ui/resources/fake_data.js
@@ -34,7 +34,7 @@ powerAdapterStatus: ExternalPowerSource.kAc, powerTime: stringToMojoString16('2h 45m'), batteryState: BatteryState.kFull, - } + }, ]; /** @type {!Array<!BatteryChargeStatus>} */ @@ -68,7 +68,7 @@ chargeFullDesignMilliampHours: 6000, chargeFullNowMilliampHours: 5699, cycleCount: 73, - } + }, ]; /** @type {!BatteryInfo} */ @@ -156,7 +156,7 @@ availableMemoryKib: 650000, freeMemoryKib: 150000, totalMemoryKib: 1280000, - } + }, ]; /** @type {!Array<!MemoryUsage>} */ @@ -180,7 +180,7 @@ availableMemoryKib: 65000, freeMemoryKib: 15000, totalMemoryKib: 128000, - } + }, ]; /** @type {!SystemInfo} */ @@ -256,20 +256,22 @@ /** @type {!Map<!RoutineType, !PowerRoutineResult>} */ export const fakePowerRoutineResults = new Map([ [ - RoutineType.kBatteryCharge, { + RoutineType.kBatteryCharge, + { result: StandardRoutineResult.kTestPassed, is_charging: true, percent_delta: 5, - time_delta_seconds: 10 - } + time_delta_seconds: 10, + }, ], [ - RoutineType.kBatteryDischarge, { + RoutineType.kBatteryDischarge, + { result: StandardRoutineResult.kUnableToRun, is_charging: false, percent_delta: 0, - time_delta_seconds: 0 - } + time_delta_seconds: 0, + }, ], ]); @@ -631,10 +633,16 @@ regionCode: 'jp', hasAssistantKey: true, topRowKeys: [ - TopRowKey.kBack, TopRowKey.kForward, TopRowKey.kRefresh, - TopRowKey.kFullscreen, TopRowKey.kOverview, - TopRowKey.kScreenBrightnessDown, TopRowKey.kScreenBrightnessUp, - TopRowKey.kVolumeMute, TopRowKey.kVolumeDown, TopRowKey.kVolumeUp + TopRowKey.kBack, + TopRowKey.kForward, + TopRowKey.kRefresh, + TopRowKey.kFullscreen, + TopRowKey.kOverview, + TopRowKey.kScreenBrightnessDown, + TopRowKey.kScreenBrightnessUp, + TopRowKey.kVolumeMute, + TopRowKey.kVolumeDown, + TopRowKey.kVolumeUp, ], topRightKey: TopRightKey.kPower, numberPadPresent: NumberPadPresence.kPresent,
diff --git a/ash/webui/diagnostics_ui/resources/memory_card.js b/ash/webui/diagnostics_ui/resources/memory_card.js index 6632be0..f7efed3 100644 --- a/ash/webui/diagnostics_ui/resources/memory_card.js +++ b/ash/webui/diagnostics_ui/resources/memory_card.js
@@ -51,7 +51,7 @@ return [ RoutineType.kMemory, ]; - } + }, }, /** @private {!MemoryUsage} */
diff --git a/ash/webui/diagnostics_ui/resources/network_card.js b/ash/webui/diagnostics_ui/resources/network_card.js index a413819..1fa2698 100644 --- a/ash/webui/diagnostics_ui/resources/network_card.js +++ b/ash/webui/diagnostics_ui/resources/network_card.js
@@ -312,7 +312,8 @@ const isDisabled = this.network.state === NetworkState.kDisabled; // Show the not connected state for the Not Connected/Portal states. const isNotConnected = [ - NetworkState.kNotConnected, NetworkState.kPortal + NetworkState.kNotConnected, + NetworkState.kPortal, ].includes(this.network.state); // Override the |troubleshootingState| value if necessary since the // disabled and not connected states take precedence.
diff --git a/ash/webui/diagnostics_ui/resources/overview_card.js b/ash/webui/diagnostics_ui/resources/overview_card.js index 4de59d6..7528355 100644 --- a/ash/webui/diagnostics_ui/resources/overview_card.js +++ b/ash/webui/diagnostics_ui/resources/overview_card.js
@@ -37,7 +37,7 @@ type: String, value: '', computed: 'getDeviceInfo_(systemInfo_.versionInfo.fullVersionString,' + - 'systemInfo_.boardName)' + 'systemInfo_.boardName)', }, },
diff --git a/ash/webui/diagnostics_ui/resources/percent_bar_chart.js b/ash/webui/diagnostics_ui/resources/percent_bar_chart.js index 1fbdfd9..1d083b2 100644 --- a/ash/webui/diagnostics_ui/resources/percent_bar_chart.js +++ b/ash/webui/diagnostics_ui/resources/percent_bar_chart.js
@@ -48,5 +48,5 @@ */ getAdjustedValue_() { return this.value <= this.max ? this.value : this.max; - } + }, });
diff --git a/ash/webui/diagnostics_ui/resources/realtime_cpu_chart.js b/ash/webui/diagnostics_ui/resources/realtime_cpu_chart.js index be7b5cc..ca9ab2c 100644 --- a/ash/webui/diagnostics_ui/resources/realtime_cpu_chart.js +++ b/ash/webui/diagnostics_ui/resources/realtime_cpu_chart.js
@@ -128,15 +128,15 @@ graphWidth_: { readOnly: true, type: Number, - computed: 'getGraphDimension_(width_, padding_.left, padding_.right)' + computed: 'getGraphDimension_(width_, padding_.left, padding_.right)', }, /** @private {number} */ graphHeight_: { readOnly: true, type: Number, - computed: 'getGraphDimension_(height_, padding_.top, padding_.bottom)' - } + computed: 'getGraphDimension_(height_, padding_.top, padding_.bottom)', + }, }, observers: ['setScaling_(graphWidth_)'], @@ -209,7 +209,8 @@ // 2) to smooth out the curve function. this.xAxisScaleFn_ = d3.scaleLinear().domain([0, this.numDataPoints_ - 2]).range([ - 0, this.graphWidth_ + 0, + this.graphWidth_, ]); // Draw the y-axis legend and also draw the horizontal gridlines by @@ -221,8 +222,8 @@ .tickValues(this.yAxisTicks_) .tickFormat((y) => this.getPercentageLabel_(y)) .tickPadding(this.padding_.tick) - .tickSize(-this.graphWidth_) // Extend the ticks into the - // entire graph as gridlines. + .tickSize(-this.graphWidth_), // Extend the ticks into the + // entire graph as gridlines. ); }, @@ -335,5 +336,5 @@ */ getPercentageLabel_(value) { return loadTimeData.getStringF('percentageLabel', value); - } + }, });
diff --git a/ash/webui/diagnostics_ui/resources/routine_section.js b/ash/webui/diagnostics_ui/resources/routine_section.js index 2d926bc..d11d5a4 100644 --- a/ash/webui/diagnostics_ui/resources/routine_section.js +++ b/ash/webui/diagnostics_ui/resources/routine_section.js
@@ -220,7 +220,7 @@ observers: [ 'routineStatusChanged_(executionStatus_, currentTestName_,' + 'additionalMessage)', - 'onActivePageChanged_(isActive)' + 'onActivePageChanged_(isActive)', ], /** @override */ @@ -550,7 +550,7 @@ setBadgeAndStatusText_(badgeType, statusText) { this.setProperties({ badgeType_: badgeType, - statusText_: statusText + statusText_: statusText, }); }, @@ -610,7 +610,7 @@ this.dispatchEvent(new CustomEvent('show-caution-banner', { bubbles: true, composed: true, - detail: {message: this.bannerMessage} + detail: {message: this.bannerMessage}, })); },
diff --git a/ash/webui/diagnostics_ui/resources/wifi_info.js b/ash/webui/diagnostics_ui/resources/wifi_info.js index e8db3de..0b241f2 100644 --- a/ash/webui/diagnostics_ui/resources/wifi_info.js +++ b/ash/webui/diagnostics_ui/resources/wifi_info.js
@@ -38,7 +38,7 @@ */ security_: { type: String, - computed: 'computeSecurity_(network.typeProperties.wifi.security)' + computed: 'computeSecurity_(network.typeProperties.wifi.security)', }, /** @@ -48,8 +48,8 @@ signalStrength_: { type: String, computed: - 'computeSignalStrength_(network.typeProperties.wifi.signalStrength)' - } + 'computeSignalStrength_(network.typeProperties.wifi.signalStrength)', + }, }, /** @@ -105,5 +105,5 @@ return getSignalStrength(this.network.typeProperties.wifi.signalStrength); } return ''; - } + }, });
diff --git a/ash/webui/firmware_update_ui/resources/firmware_confirmation_dialog.js b/ash/webui/firmware_update_ui/resources/firmware_confirmation_dialog.js index d8976078..1f66edd 100644 --- a/ash/webui/firmware_update_ui/resources/firmware_confirmation_dialog.js +++ b/ash/webui/firmware_update_ui/resources/firmware_confirmation_dialog.js
@@ -82,7 +82,7 @@ this.dispatchEvent(new CustomEvent('open-update-dialog', { bubbles: true, composed: true, - detail: {update: this.update, inflight: false} + detail: {update: this.update, inflight: false}, })); }
diff --git a/ash/webui/firmware_update_ui/resources/firmware_update_dialog.js b/ash/webui/firmware_update_ui/resources/firmware_update_dialog.js index 039e111e..53d888d7 100644 --- a/ash/webui/firmware_update_ui/resources/firmware_update_dialog.js +++ b/ash/webui/firmware_update_ui/resources/firmware_update_dialog.js
@@ -26,7 +26,7 @@ const initialDialogContent = { title: '', body: '', - footer: '' + footer: '', }; /**
diff --git a/ash/webui/firmware_update_ui/resources/peripheral_updates_list.js b/ash/webui/firmware_update_ui/resources/peripheral_updates_list.js index 96d9c2c..213068ad 100644 --- a/ash/webui/firmware_update_ui/resources/peripheral_updates_list.js +++ b/ash/webui/firmware_update_ui/resources/peripheral_updates_list.js
@@ -94,7 +94,7 @@ this.dispatchEvent(new CustomEvent('open-update-dialog', { bubbles: true, composed: true, - detail: {update: result.update, inflight: true} + detail: {update: result.update, inflight: true}, })); } this.hasCheckedInitialInflightProgress_ = true; @@ -116,7 +116,7 @@ this.dispatchEvent(new CustomEvent('iron-announce', { bubbles: true, composed: true, - detail: {text: this.i18n('numUpdatesText', this.firmwareUpdates_.length)} + detail: {text: this.i18n('numUpdatesText', this.firmwareUpdates_.length)}, })); } }
diff --git a/ash/webui/help_app_ui/resources/browser_proxy.js b/ash/webui/help_app_ui/resources/browser_proxy.js index 5a385eb..1621d1e 100644 --- a/ash/webui/help_app_ui/resources/browser_proxy.js +++ b/ash/webui/help_app_ui/resources/browser_proxy.js
@@ -12,7 +12,7 @@ import {Message} from './message_types.js'; const help_app = { - handler: new ash.helpApp.mojom.PageHandlerRemote() + handler: new ash.helpApp.mojom.PageHandlerRemote(), }; // Set up a page handler to talk to the browser process.
diff --git a/ash/webui/help_app_ui/resources/mock/app_bin.js b/ash/webui/help_app_ui/resources/mock/app_bin.js index 01d373f..de5b153 100644 --- a/ash/webui/help_app_ui/resources/mock/app_bin.js +++ b/ash/webui/help_app_ui/resources/mock/app_bin.js
@@ -31,7 +31,7 @@ mainCategoryName: 'Help', tags: ['verycomplicatedsearchquery'], urlPathWithParameters: 'help/sub/3399763/', - locale: '' + locale: '', }]); window.customLaunchData.delegate.closeBackgroundPage(); } @@ -51,6 +51,6 @@ body: 'Test body', mainCategoryName: 'Help', locale: 'en-US', - } + }, ]); }
diff --git a/ash/webui/help_app_ui/resources/receiver.js b/ash/webui/help_app_ui/resources/receiver.js index e024606..1604dba 100644 --- a/ash/webui/help_app_ui/resources/receiver.js +++ b/ash/webui/help_app_ui/resources/receiver.js
@@ -68,7 +68,7 @@ async maybeShowReleaseNotesNotification() { await parentMessagePipe.sendMessage( Message.MAYBE_SHOW_RELEASE_NOTES_NOTIFICATION); - } + }, }; window.customLaunchData = {
diff --git a/ash/webui/help_app_ui/test/help_app_guest_ui_browsertest.js b/ash/webui/help_app_ui/test/help_app_guest_ui_browsertest.js index c935349..9759a42e 100644 --- a/ash/webui/help_app_ui/test/help_app_guest_ui_browsertest.js +++ b/ash/webui/help_app_ui/test/help_app_guest_ui_browsertest.js
@@ -69,7 +69,7 @@ body: 'Body text', mainCategoryName: 'Help', locale: 'en-US', - } + }, ]); // Keep polling until the index finishes updating or too much time has passed. @@ -145,7 +145,7 @@ body: 'Body text', mainCategoryName: 'Help', locale: 'en-US', - } + }, ]); // Keep polling until the index finishes updating or too much time has passed. @@ -190,24 +190,28 @@ GUEST_TEST('GuestCanLimitMaxSearchResults', async () => { const delegate = await waitForInitialIndexUpdate(); - await delegate.addOrUpdateSearchIndex([{ - // Main category match. No subcategories. - id: 'test-id-1', - title: 'Title with of article', - body: 'Body text', - mainCategoryName: 'Verycomplicatedsearchtoken', - locale: 'en-US', - },{ - // Subcategory match. - id: 'test-id-2', - title: 'Title 2', - subcategoryNames: [ - 'Subcategory 1', 'verycomplicatedsearchtoken in subcategory.' - ], - body: 'Body text', - mainCategoryName: 'Help', - locale: 'en-US', - }]); + await delegate.addOrUpdateSearchIndex([ + { + // Main category match. No subcategories. + id: 'test-id-1', + title: 'Title with of article', + body: 'Body text', + mainCategoryName: 'Verycomplicatedsearchtoken', + locale: 'en-US', + }, + { + // Subcategory match. + id: 'test-id-2', + title: 'Title 2', + subcategoryNames: [ + 'Subcategory 1', + 'verycomplicatedsearchtoken in subcategory.', + ], + body: 'Body text', + mainCategoryName: 'Help', + locale: 'en-US', + }, + ]); // Limit to 1 result. This search query was chosen because it is unlikely to // show any search results for the real app's data.
diff --git a/ash/webui/help_app_ui/test/help_app_ui_gtest_browsertest.js b/ash/webui/help_app_ui/test/help_app_ui_gtest_browsertest.js index 1fa08026..3c7b9ce4 100644 --- a/ash/webui/help_app_ui/test/help_app_ui_gtest_browsertest.js +++ b/ash/webui/help_app_ui/test/help_app_ui_gtest_browsertest.js
@@ -34,7 +34,7 @@ return { enabled: [ 'ash::features::kHelpAppLauncherSearch', - ] + ], }; } @@ -54,7 +54,7 @@ enabled: [ ...super.featureList.enabled, 'chromeos::features::kDarkLightMode', - ] + ], }; }
diff --git a/ash/webui/multidevice_debug/resources/proximity_auth.js b/ash/webui/multidevice_debug/resources/proximity_auth.js index 63cdfdc..c5c85e6 100644 --- a/ash/webui/multidevice_debug/resources/proximity_auth.js +++ b/ash/webui/multidevice_debug/resources/proximity_auth.js
@@ -55,7 +55,7 @@ ProximityAuth.remoteDevicesController_ = new DeviceListController( document.querySelector('#remote-devices-control')); WebUI.getLocalState(); - } + }, }; /** @@ -351,7 +351,7 @@ /** @param {!Array<!RemoteDevice>} remoteDevices */ onRemoteDevicesChanged: function(remoteDevices) { ProximityAuth.remoteDevicesController_.updateRemoteDevices(remoteDevices); - } + }, }; document.addEventListener('DOMContentLoaded', function() {
diff --git a/ash/webui/os_feedback_ui/resources/confirmation_page.js b/ash/webui/os_feedback_ui/resources/confirmation_page.js index 36151467..99d4c76 100644 --- a/ash/webui/os_feedback_ui/resources/confirmation_page.js +++ b/ash/webui/os_feedback_ui/resources/confirmation_page.js
@@ -98,7 +98,7 @@ this.dispatchEvent(new CustomEvent('go-back-click', { composed: true, bubbles: true, - detail: {currentState: FeedbackFlowState.CONFIRMATION} + detail: {currentState: FeedbackFlowState.CONFIRMATION}, })); }
diff --git a/ash/webui/os_feedback_ui/resources/fake_data.js b/ash/webui/os_feedback_ui/resources/fake_data.js index 7e37881..6989b92 100644 --- a/ash/webui/os_feedback_ui/resources/fake_data.js +++ b/ash/webui/os_feedback_ui/resources/fake_data.js
@@ -15,13 +15,13 @@ { title: stringToMojoString16('fake article'), url: {url: 'https://support.google.com/chromebook/?q=article'}, - contentType: HelpContentType.kArticle + contentType: HelpContentType.kArticle, }, { title: stringToMojoString16('fake forum'), url: {url: 'https://support.google.com/chromebook/?q=forum'}, - contentType: HelpContentType.kForum - } + contentType: HelpContentType.kForum, + }, ]; /** @type {!HelpContentList} */ @@ -29,30 +29,30 @@ { title: stringToMojoString16('Fix connection problems'), url: {url: 'https://support.google.com/chromebook/?q=6318213'}, - contentType: HelpContentType.kArticle + contentType: HelpContentType.kArticle, }, { title: stringToMojoString16( 'Why won\'t my wireless mouse with a USB piece wor...?'), url: {url: 'https://support.google.com/chromebook/?q=123920509'}, - contentType: HelpContentType.kForum + contentType: HelpContentType.kForum, }, { title: stringToMojoString16('Wifi Issues - only on Chromebooks'), url: {url: 'https://support.google.com/chromebook/?q=114174470'}, - contentType: HelpContentType.kForum + contentType: HelpContentType.kForum, }, { title: stringToMojoString16('Network Connectivity Fault'), url: {url: 'https://support.google.com/chromebook/?q=131459420'}, - contentType: HelpContentType.kForum + contentType: HelpContentType.kForum, }, { title: stringToMojoString16( 'Connected to WiFi but can\'t connect to the internet'), url: {url: 'https://support.google.com/chromebook/?q=22864239'}, - contentType: HelpContentType.kUnknown - } + contentType: HelpContentType.kUnknown, + }, ]; /** @type {!SearchRequest} */ @@ -86,5 +86,5 @@ 220, 0, 0, 0, 34, 73, 68, 65, 84, 8, 215, 99, 120, 173, 168, 135, 21, 49, 0, 241, 255, 15, 90, 104, 8, 33, 129, 83, 7, 97, 163, 136, 214, 129, 93, 2, 43, 2, 0, 181, 31, 90, 179, 225, 252, 176, 37, 0, - 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130 + 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130, ];
diff --git a/ash/webui/os_feedback_ui/resources/file_attachment.js b/ash/webui/os_feedback_ui/resources/file_attachment.js index 3e2b1580..70f6f33 100644 --- a/ash/webui/os_feedback_ui/resources/file_attachment.js +++ b/ash/webui/os_feedback_ui/resources/file_attachment.js
@@ -112,7 +112,7 @@ /** @type {!AttachedFile} */ const attachedFile = { fileName: {path: {path: this.selectedFile_.name}}, - fileData: fileData + fileData: fileData, }; return attachedFile;
diff --git a/ash/webui/os_feedback_ui/resources/help_content.js b/ash/webui/os_feedback_ui/resources/help_content.js index 5548405f6..d387b3a2 100644 --- a/ash/webui/os_feedback_ui/resources/help_content.js +++ b/ash/webui/os_feedback_ui/resources/help_content.js
@@ -59,7 +59,7 @@ this.searchResult = { contentList: [], isQueryEmpty: true, - isPopularContent: true + isPopularContent: true, }; }
diff --git a/ash/webui/os_feedback_ui/resources/index.html b/ash/webui/os_feedback_ui/resources/index.html index 99bb9c77..ab37fea 100644 --- a/ash/webui/os_feedback_ui/resources/index.html +++ b/ash/webui/os_feedback_ui/resources/index.html
@@ -7,7 +7,10 @@ <head> <meta charset="utf-8"> <style> - html, + html { + background-color: var(--cros-bg-color); + } + body { height: 100%; }
diff --git a/ash/webui/os_feedback_ui/resources/search_page.js b/ash/webui/os_feedback_ui/resources/search_page.js index 7b20d8c..acc01a5 100644 --- a/ash/webui/os_feedback_ui/resources/search_page.js +++ b/ash/webui/os_feedback_ui/resources/search_page.js
@@ -62,7 +62,7 @@ descriptionTemplate: { type: String, readonly: true, - observer: SearchPageElement.prototype.descriptionTemplateChanged_ + observer: SearchPageElement.prototype.descriptionTemplateChanged_, }, }; } @@ -182,7 +182,7 @@ isPopularContent ? this.popularHelpContentList_ : response.response.results), isQueryEmpty: isQueryEmpty, - isPopularContent: isPopularContent + isPopularContent: isPopularContent, }; // Wait for the iframe to complete loading before postMessage. @@ -270,7 +270,8 @@ this.dispatchEvent(new CustomEvent('continue-click', { composed: true, bubbles: true, - detail: {currentState: FeedbackFlowState.SEARCH, description: textInput} + detail: + {currentState: FeedbackFlowState.SEARCH, description: textInput}, })); } }
diff --git a/ash/webui/os_feedback_ui/resources/share_data_page.html b/ash/webui/os_feedback_ui/resources/share_data_page.html index fad506d..21b3fec 100644 --- a/ash/webui/os_feedback_ui/resources/share_data_page.html +++ b/ash/webui/os_feedback_ui/resources/share_data_page.html
@@ -97,6 +97,7 @@ #pageUrl { display: flex; + margin-bottom: 8px; white-space: nowrap; } @@ -133,9 +134,15 @@ width: 68px; } + #sysInfoContainer, + #userConsent { + display: flex; + } + cr-checkbox { --cr-checkbox-label-padding-start: 0; --cr-checkbox-size: 20px; + margin-inline-end: 12px; } </style> <div id="container"> @@ -175,8 +182,7 @@ </div> <!-- User consent --> <div id="userConsent" class="checkbox-field-container"> - <input id="userConsentCheckbox" type="checkbox" - aria-labelledby="userConsentLabel"> + <cr-checkbox id="userConsentCheckbox" aria-labelledby="userConsentLabel"></cr-checkbox> <label id="userConsentLabel">[[i18n('userConsentLabel')]]</label> </div> <!-- Diagnostic data --> @@ -184,8 +190,7 @@ <h2 id="shareDiagnosticDataLabel">[[i18n('shareDiagnosticDataLabel')]]</h2> <!-- URL --> <div id="pageUrl" class="checkbox-field-container"> - <input id="pageUrlCheckbox" type="checkbox" aria-labelledby="pageUrlLabel" - checked> + <cr-checkbox id="pageUrlCheckbox" aria-labelledby="pageUrlLabel" checked></cr-checkbox> <label id="pageUrlLabel">[[i18n('sharePageUrlLabel')]] </label> <a href="[[feedbackContext.pageUrl.url]]" class="overflow-text" id="pageUrlText" target="_blank"> [[feedbackContext.pageUrl.url]] @@ -196,8 +201,8 @@ </div> <!-- System Information --> <div id="sysInfoContainer" class="checkbox-field-container"> - <input id="sysInfoCheckbox" type="checkbox" aria-labelledby="sysInfoCheckboxLabel" - checked> + <cr-checkbox id="sysInfoCheckbox" aria-labelledby="sysInfoCheckboxLabel" checked> + </cr-checkbox> <label id="sysInfoCheckboxLabel" inner-h-t-m-l="[[sysInfoCheckboxLabel_]]"></label> </div> </div>
diff --git a/ash/webui/personalization_app/test/personalization_app_browsertest.js b/ash/webui/personalization_app/test/personalization_app_browsertest.js index 7a64510..3610964e 100644 --- a/ash/webui/personalization_app/test/personalization_app_browsertest.js +++ b/ash/webui/personalization_app/test/personalization_app_browsertest.js
@@ -28,7 +28,7 @@ enabled: [ 'ash::features::kPersonalizationHub', 'chromeos::features::kDarkLightMode', - ] + ], }; }
diff --git a/ash/webui/print_management/resources/print_job_clear_history_dialog.js b/ash/webui/print_management/resources/print_job_clear_history_dialog.js index 9ad5501..08ce54a2 100644 --- a/ash/webui/print_management/resources/print_job_clear_history_dialog.js +++ b/ash/webui/print_management/resources/print_job_clear_history_dialog.js
@@ -30,7 +30,7 @@ /** @private */ shouldDisableClearButton_: { type: Boolean, - value: false + value: false, }, },
diff --git a/ash/webui/print_management/resources/print_management.js b/ash/webui/print_management/resources/print_management.js index 4a24779..1ecfbbd 100644 --- a/ash/webui/print_management/resources/print_management.js +++ b/ash/webui/print_management/resources/print_management.js
@@ -150,7 +150,7 @@ type: Boolean, computed: 'computeShouldDisableClearAllButton_(printJobs_,' + 'deletePrintJobHistoryAllowedByPolicy_)', - } + }, }, listeners: { @@ -311,10 +311,9 @@ loadTimeData.getString('printJobHistorySingleDay'); break; default: - this.printJobHistoryExpirationPeriod_ = - loadTimeData.getStringF( - 'printJobHistoryExpirationPeriod', - expirationPeriod + this.printJobHistoryExpirationPeriod_ = loadTimeData.getStringF( + 'printJobHistoryExpirationPeriod', + expirationPeriod, ); } }, @@ -353,7 +352,7 @@ */ getIndexOfOngoingPrintJob_(expectedId) { return this.ongoingPrintJobs_.findIndex( - arr_job => arr_job.id === expectedId + arr_job => arr_job.id === expectedId, ); }, @@ -372,5 +371,5 @@ 'delete-enabled', !this.shouldDisableClearAllButton_); this.$.deleteIcon.classList.toggle( 'delete-disabled', this.shouldDisableClearAllButton_); - } + }, });
diff --git a/ash/webui/projector_app/resources/app/sandboxed_load_time_data.js b/ash/webui/projector_app/resources/app/sandboxed_load_time_data.js index 55f2544..2289cc9b 100644 --- a/ash/webui/projector_app/resources/app/sandboxed_load_time_data.js +++ b/ash/webui/projector_app/resources/app/sandboxed_load_time_data.js
@@ -32,6 +32,6 @@ getString: (id) => /** @type{string} */ (impl.data_[id]), getBoolean: (id) => /** @type{boolean} */ (impl.data_[id]), getInteger: (id) => /** @type{number} */ (impl.data_[id]), - valueExists: (id) => impl.data_[id] !== undefined + valueExists: (id) => impl.data_[id] !== undefined, }; window['loadTimeData'] = impl;
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 75d4c73..5c406a5 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
@@ -101,7 +101,7 @@ if (!values || values.length != 5) { return { success: false, - error: 'INVALID_ARGUMENTS' + error: 'INVALID_ARGUMENTS', }; } return this.browserProxy_.sendXhr(
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 67662fd..312812bf 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
@@ -118,7 +118,11 @@ sendXhr(url, method, requestBody, useCredentials, headers) { return AppUntrustedCommFactory.getPostMessageAPIClient().callApiFn( 'sendXhr', [ - url, method, requestBody ? requestBody : '', !!useCredentials, headers + url, + method, + requestBody ? requestBody : '', + !!useCredentials, + headers, ]); },
diff --git a/ash/webui/scanning/resources/scan_done_section.js b/ash/webui/scanning/resources/scan_done_section.js index d7a1fa9..09753e9 100644 --- a/ash/webui/scanning/resources/scan_done_section.js +++ b/ash/webui/scanning/resources/scan_done_section.js
@@ -169,5 +169,5 @@ /* @type {string} */ (pluralString) => { this.editButtonLabel_ = pluralString; }); - } + }, });
diff --git a/ash/webui/shimless_rma/resources/data.js b/ash/webui/shimless_rma/resources/data.js index 6f3df35..81da1ec 100644 --- a/ash/webui/shimless_rma/resources/data.js +++ b/ash/webui/shimless_rma/resources/data.js
@@ -28,5 +28,5 @@ [ComponentType.kLidGyroscope]: 'componentLidGyroscope', [ComponentType.kScreen]: 'componentScreen', [ComponentType.kKeyboard]: 'componentKeyboard', - [ComponentType.kPowerButton]: 'componentPowerButton' + [ComponentType.kPowerButton]: 'componentPowerButton', };
diff --git a/ash/webui/shimless_rma/resources/fake_data.js b/ash/webui/shimless_rma/resources/fake_data.js index 1b78205..4ebc492 100644 --- a/ash/webui/shimless_rma/resources/fake_data.js +++ b/ash/webui/shimless_rma/resources/fake_data.js
@@ -12,127 +12,127 @@ state: State.kWelcomeScreen, canExit: true, canGoBack: false, - error: RmadErrorCode.kOk + error: RmadErrorCode.kOk, }, { state: State.kConfigureNetwork, canExit: true, canGoBack: true, - error: RmadErrorCode.kOk + error: RmadErrorCode.kOk, }, { state: State.kUpdateOs, canExit: true, canGoBack: true, - error: RmadErrorCode.kOk + error: RmadErrorCode.kOk, }, { state: State.kSelectComponents, canExit: true, canGoBack: true, - error: RmadErrorCode.kOk + error: RmadErrorCode.kOk, }, { state: State.kChooseDestination, canExit: true, canGoBack: true, - error: RmadErrorCode.kOk + error: RmadErrorCode.kOk, }, { state: State.kChooseWipeDevice, canExit: true, canGoBack: true, - error: RmadErrorCode.kOk + error: RmadErrorCode.kOk, }, { state: State.kChooseWriteProtectDisableMethod, canExit: true, canGoBack: true, - error: RmadErrorCode.kOk + error: RmadErrorCode.kOk, }, { state: State.kEnterRSUWPDisableCode, canExit: true, canGoBack: true, - error: RmadErrorCode.kOk + error: RmadErrorCode.kOk, }, { state: State.kWaitForManualWPDisable, canExit: true, canGoBack: true, - error: RmadErrorCode.kOk + error: RmadErrorCode.kOk, }, { state: State.kWPDisableComplete, canExit: true, canGoBack: true, - error: RmadErrorCode.kOk + error: RmadErrorCode.kOk, }, { state: State.kUpdateRoFirmware, canExit: true, canGoBack: true, - error: RmadErrorCode.kOk + error: RmadErrorCode.kOk, }, { state: State.kUpdateDeviceInformation, canExit: true, canGoBack: true, - error: RmadErrorCode.kOk + error: RmadErrorCode.kOk, }, { state: State.kRestock, canExit: true, canGoBack: true, - error: RmadErrorCode.kOk + error: RmadErrorCode.kOk, }, { state: State.kCheckCalibration, canExit: true, canGoBack: true, - error: RmadErrorCode.kOk + error: RmadErrorCode.kOk, }, { state: State.kSetupCalibration, canExit: true, canGoBack: true, - error: RmadErrorCode.kOk + error: RmadErrorCode.kOk, }, { state: State.kRunCalibration, canExit: true, canGoBack: true, - error: RmadErrorCode.kOk + error: RmadErrorCode.kOk, }, { state: State.kProvisionDevice, canExit: true, canGoBack: true, - error: RmadErrorCode.kOk + error: RmadErrorCode.kOk, }, { state: State.kWaitForManualWPEnable, canExit: true, canGoBack: true, - error: RmadErrorCode.kOk + error: RmadErrorCode.kOk, }, { state: State.kFinalize, canExit: true, canGoBack: true, - error: RmadErrorCode.kOk + error: RmadErrorCode.kOk, }, { state: State.kRepairComplete, canExit: true, canGoBack: true, - error: RmadErrorCode.kOk + error: RmadErrorCode.kOk, }, { state: State.kUnknown, canExit: false, canGoBack: false, - error: RmadErrorCode.kOk + error: RmadErrorCode.kOk, }, ]; @@ -158,17 +158,17 @@ { component: ComponentType.kCamera, state: ComponentRepairStatus.kOriginal, - identifier: 'Camera_XYZ_1' + identifier: 'Camera_XYZ_1', }, { component: ComponentType.kBattery, state: ComponentRepairStatus.kMissing, - identifier: 'Battery_XYZ_Lithium' + identifier: 'Battery_XYZ_Lithium', }, { component: ComponentType.kTouchpad, state: ComponentRepairStatus.kOriginal, - identifier: 'Touchpad_XYZ_2' + identifier: 'Touchpad_XYZ_2', }, ]; @@ -179,17 +179,17 @@ { component: ComponentType.kCamera, state: ComponentRepairStatus.kOriginal, - identifier: 'Camera_XYZ_1' + identifier: 'Camera_XYZ_1', }, { component: ComponentType.kBattery, state: ComponentRepairStatus.kMissing, - identifier: 'Battery_XYZ_Lithium' + identifier: 'Battery_XYZ_Lithium', }, { component: ComponentType.kTouchpad, state: ComponentRepairStatus.kReplaced, - identifier: 'Touchpad_XYZ_2' + identifier: 'Touchpad_XYZ_2', }, ]; @@ -198,27 +198,27 @@ { component: ComponentType.kCamera, status: CalibrationStatus.kCalibrationWaiting, - progress: 0.0 + progress: 0.0, }, { component: ComponentType.kBattery, status: CalibrationStatus.kCalibrationComplete, - progress: 1.0 + progress: 1.0, }, { component: ComponentType.kBaseAccelerometer, status: CalibrationStatus.kCalibrationInProgress, - progress: 1.0 + progress: 1.0, }, { component: ComponentType.kLidAccelerometer, status: CalibrationStatus.kCalibrationFailed, - progress: 1.0 + progress: 1.0, }, { component: ComponentType.kTouchpad, status: CalibrationStatus.kCalibrationSkip, - progress: 0.0 + progress: 0.0, }, ]; @@ -227,27 +227,27 @@ { component: ComponentType.kCamera, status: CalibrationStatus.kCalibrationComplete, - progress: 0.0 + progress: 0.0, }, { component: ComponentType.kBattery, status: CalibrationStatus.kCalibrationComplete, - progress: 1.0 + progress: 1.0, }, { component: ComponentType.kBaseAccelerometer, status: CalibrationStatus.kCalibrationComplete, - progress: 1.0 + progress: 1.0, }, { component: ComponentType.kLidAccelerometer, status: CalibrationStatus.kCalibrationComplete, - progress: 1.0 + progress: 1.0, }, { component: ComponentType.kTouchpad, status: CalibrationStatus.kCalibrationComplete, - progress: 0.0 + progress: 0.0, }, ];
diff --git a/ash/webui/shimless_rma/resources/fake_shimless_rma_service.js b/ash/webui/shimless_rma/resources/fake_shimless_rma_service.js index b373760..aaf0fb93 100644 --- a/ash/webui/shimless_rma/resources/fake_shimless_rma_service.js +++ b/ash/webui/shimless_rma/resources/fake_shimless_rma_service.js
@@ -860,63 +860,63 @@ { component: ComponentType.kBaseAccelerometer, status: CalibrationStatus.kCalibrationWaiting, - progress: 0.0 + progress: 0.0, }, 1000); this.triggerCalibrationObserver( { component: ComponentType.kBaseAccelerometer, status: CalibrationStatus.kCalibrationInProgress, - progress: 0.2 + progress: 0.2, }, 2000); this.triggerCalibrationObserver( { component: ComponentType.kBaseAccelerometer, status: CalibrationStatus.kCalibrationInProgress, - progress: 0.4 + progress: 0.4, }, 3000); this.triggerCalibrationObserver( { component: ComponentType.kBaseAccelerometer, status: CalibrationStatus.kCalibrationInProgress, - progress: 0.6 + progress: 0.6, }, 4000); this.triggerCalibrationObserver( { component: ComponentType.kBaseAccelerometer, status: CalibrationStatus.kCalibrationInProgress, - progress: 0.8 + progress: 0.8, }, 5000); this.triggerCalibrationObserver( { component: ComponentType.kLidAccelerometer, status: CalibrationStatus.kCalibrationWaiting, - progress: 0.0 + progress: 0.0, }, 6000); this.triggerCalibrationObserver( { component: ComponentType.kBaseAccelerometer, status: CalibrationStatus.kCalibrationComplete, - progress: 0.5 + progress: 0.5, }, 7000); this.triggerCalibrationObserver( { component: ComponentType.kBaseAccelerometer, status: CalibrationStatus.kCalibrationFailed, - progress: 1.0 + progress: 1.0, }, 8000); this.triggerCalibrationObserver( { component: ComponentType.kBaseGyroscope, status: CalibrationStatus.kCalibrationSkip, - progress: 1.0 + progress: 1.0, }, 9000); this.triggerCalibrationOverallObserver( @@ -1434,8 +1434,8 @@ state: state, canExit: canExit, canGoBack: canGoBack, - error: error - } + error: error, + }, })); } }
diff --git a/ash/webui/shimless_rma/resources/onboarding_network_page.js b/ash/webui/shimless_rma/resources/onboarding_network_page.js index df0ecc8c..fba34d4 100644 --- a/ash/webui/shimless_rma/resources/onboarding_network_page.js +++ b/ash/webui/shimless_rma/resources/onboarding_network_page.js
@@ -339,7 +339,7 @@ { bubbles: true, composed: true, - detail: this.isOnline_ ? 'nextButtonLabel' : 'skipButtonLabel' + detail: this.isOnline_ ? 'nextButtonLabel' : 'skipButtonLabel', }, )); }
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 f71d926..077dee1 100644 --- a/ash/webui/shimless_rma/resources/onboarding_select_components_page.js +++ b/ash/webui/shimless_rma/resources/onboarding_select_components_page.js
@@ -118,7 +118,7 @@ identifier: item.identifier, name: this.i18n(ComponentTypeToId[item.component]), checked: item.state === ComponentRepairStatus.kReplaced, - disabled: item.state === ComponentRepairStatus.kMissing + disabled: item.state === ComponentRepairStatus.kMissing, }; }); });
diff --git a/ash/webui/shimless_rma/resources/onboarding_update_page.js b/ash/webui/shimless_rma/resources/onboarding_update_page.js index c0b760e7..6d1732b 100644 --- a/ash/webui/shimless_rma/resources/onboarding_update_page.js +++ b/ash/webui/shimless_rma/resources/onboarding_update_page.js
@@ -36,7 +36,7 @@ [OsUpdateOperation.kReportingErrorEvent]: 'onboardingUpdateError', [OsUpdateOperation.kAttemptingRollback]: 'onboardingUpdateRollback', [OsUpdateOperation.kDisabled]: 'onboardingUpdateDisabled', - [OsUpdateOperation.kNeedPermissionToUpdate]: 'onboardingUpdatePermission' + [OsUpdateOperation.kNeedPermissionToUpdate]: 'onboardingUpdatePermission', }; /**
diff --git a/ash/webui/shimless_rma/resources/reimaging_calibration_failed_page.js b/ash/webui/shimless_rma/resources/reimaging_calibration_failed_page.js index aaca3d1..e0b8a9e9 100644 --- a/ash/webui/shimless_rma/resources/reimaging_calibration_failed_page.js +++ b/ash/webui/shimless_rma/resources/reimaging_calibration_failed_page.js
@@ -153,7 +153,7 @@ component: item.component, status: item.checked ? CalibrationStatus.kCalibrationWaiting : CalibrationStatus.kCalibrationSkip, - progress: 0.0 + progress: 0.0, }; }); } @@ -167,7 +167,7 @@ return { component: item.component, status: CalibrationStatus.kCalibrationSkip, - progress: 0.0 + progress: 0.0, }; }); return this.shimlessRmaService_.startCalibration(skippedComponents);
diff --git a/ash/webui/shimless_rma/resources/reimaging_calibration_setup_page.js b/ash/webui/shimless_rma/resources/reimaging_calibration_setup_page.js index efec463..ff7e886 100644 --- a/ash/webui/shimless_rma/resources/reimaging_calibration_setup_page.js +++ b/ash/webui/shimless_rma/resources/reimaging_calibration_setup_page.js
@@ -21,7 +21,7 @@ [CalibrationSetupInstruction.kCalibrationInstructionPlaceBaseOnFlatSurface]: 'calibrateBaseInstructionsText', [CalibrationSetupInstruction.kCalibrationInstructionPlaceLidOnFlatSurface]: - 'calibrateLidInstructionsText' + 'calibrateLidInstructionsText', }; /** @type {!Object<!CalibrationSetupInstruction, string>} */
diff --git a/ash/webui/shimless_rma/resources/shimless_rma.js b/ash/webui/shimless_rma/resources/shimless_rma.js index 7ee54f64..25196be 100644 --- a/ash/webui/shimless_rma/resources/shimless_rma.js +++ b/ash/webui/shimless_rma/resources/shimless_rma.js
@@ -41,7 +41,7 @@ export const ButtonState = { VISIBLE: 'visible', DISABLED: 'disabled', - HIDDEN: 'hidden' + HIDDEN: 'hidden', }; /** @type {number} */ @@ -515,8 +515,8 @@ state: State.kUnknown, canExit: false, canGoBack: false, - error: RmadErrorCode.kRmaNotRequired - } + error: RmadErrorCode.kRmaNotRequired, + }, }; this.showState_(errorState); return true;
diff --git a/ash/webui/shortcut_customization_ui/resources/accelerator_edit_view.js b/ash/webui/shortcut_customization_ui/resources/accelerator_edit_view.js index 39e0631..72a646a 100644 --- a/ash/webui/shortcut_customization_ui/resources/accelerator_edit_view.js +++ b/ash/webui/shortcut_customization_ui/resources/accelerator_edit_view.js
@@ -131,7 +131,7 @@ this.dispatchEvent(new CustomEvent('request-update-accelerator', { bubbles: true, composed: true, - detail: {source: this.source, action: this.action} + detail: {source: this.source, action: this.action}, })); } });
diff --git a/ash/webui/shortcut_customization_ui/resources/accelerator_row.js b/ash/webui/shortcut_customization_ui/resources/accelerator_row.js index 20ec8ee..c352cc2 100644 --- a/ash/webui/shortcut_customization_ui/resources/accelerator_row.js +++ b/ash/webui/shortcut_customization_ui/resources/accelerator_row.js
@@ -104,8 +104,8 @@ description: this.description, accelerators: this.acceleratorInfos, action: this.action, - source: this.source - } + source: this.source, + }, }, )); }
diff --git a/ash/webui/shortcut_customization_ui/resources/accelerator_subsection.js b/ash/webui/shortcut_customization_ui/resources/accelerator_subsection.js index 4c96292..fca2c2b 100644 --- a/ash/webui/shortcut_customization_ui/resources/accelerator_subsection.js +++ b/ash/webui/shortcut_customization_ui/resources/accelerator_subsection.js
@@ -53,7 +53,7 @@ acceleratorContainer: { type: Array, value: [], - } + }, }; }
diff --git a/ash/webui/shortcut_customization_ui/resources/accelerator_view.js b/ash/webui/shortcut_customization_ui/resources/accelerator_view.js index 756adf8..8c9fad36 100644 --- a/ash/webui/shortcut_customization_ui/resources/accelerator_view.js +++ b/ash/webui/shortcut_customization_ui/resources/accelerator_view.js
@@ -528,7 +528,7 @@ this.dispatchEvent(new CustomEvent('request-update-accelerator', { bubbles: true, composed: true, - detail: {source: this.source, action: this.action} + detail: {source: this.source, action: this.action}, })); // Always end input capturing if an update event was fired.
diff --git a/ash/webui/shortcut_customization_ui/resources/fake_data.js b/ash/webui/shortcut_customization_ui/resources/fake_data.js index 78dfe39..226929c 100644 --- a/ash/webui/shortcut_customization_ui/resources/fake_data.js +++ b/ash/webui/shortcut_customization_ui/resources/fake_data.js
@@ -29,10 +29,12 @@ /* @type {!AcceleratorConfig} */ export const fakeAcceleratorConfig = new Map([ [ - AcceleratorSource.kAsh, new Map([ + AcceleratorSource.kAsh, + new Map([ // Snap Window Left [ - 0, [{ + 0, + [{ type: AcceleratorType.kDefault, state: AcceleratorState.kEnabled, locked: true, @@ -40,12 +42,13 @@ modifiers: Modifier.ALT, key: 219, key_display: '[', - } - }] + }, + }], ], // Snap Window Right [ - 1, [{ + 1, + [{ type: AcceleratorType.kDefault, state: AcceleratorState.kEnabled, locked: false, @@ -53,12 +56,13 @@ modifiers: Modifier.ALT, key: 221, key_display: ']', - } - }] + }, + }], ], // New Desk [ - 2, [{ + 2, + [{ type: AcceleratorType.kDefault, state: AcceleratorState.kEnabled, locked: false, @@ -66,12 +70,13 @@ modifiers: Modifier.COMMAND | Modifier.SHIFT, key: 187, key_display: '+', - } - }] + }, + }], ], // Remove Desk [ - 3, [{ + 3, + [{ type: AcceleratorType.kDefault, state: AcceleratorState.kEnabled, locked: false, @@ -79,16 +84,18 @@ modifiers: Modifier.COMMAND | Modifier.SHIFT, key: 189, key_display: '-', - } - }] + }, + }], ], - ]) + ]), ], [ - AcceleratorSource.kBrowser, new Map([ + AcceleratorSource.kBrowser, + new Map([ // New Tab [ - 1001, [{ + 1001, + [{ type: AcceleratorType.kDefault, state: AcceleratorState.kEnabled, locked: true, @@ -96,10 +103,10 @@ modifiers: Modifier.CONTROL, key: 84, key_display: 't', - } - }] + }, + }], ], - ]) + ]), ], ]);
diff --git a/ash/webui/shortcut_customization_ui/resources/shortcut_input.js b/ash/webui/shortcut_customization_ui/resources/shortcut_input.js index f2af162..6ef9d14 100644 --- a/ash/webui/shortcut_customization_ui/resources/shortcut_input.js +++ b/ash/webui/shortcut_customization_ui/resources/shortcut_input.js
@@ -46,7 +46,7 @@ capturing_: { type: Boolean, value: false, - } + }, }; }
diff --git a/ash/webui/system_apps/public/js/message_pipe.js b/ash/webui/system_apps/public/js/message_pipe.js index 333eebd..e43a08c 100644 --- a/ash/webui/system_apps/public/js/message_pipe.js +++ b/ash/webui/system_apps/public/js/message_pipe.js
@@ -64,7 +64,7 @@ return { message: error.message || '', name: error.name || '', - stack: error.stack || '' + stack: error.stack || '', }; } @@ -131,7 +131,7 @@ * Indicates a autogenerated error message for a previously received * message. */ - ERROR_TYPE: '___error' + ERROR_TYPE: '___error', }; /** @@ -439,7 +439,7 @@ const messageWrapper = { messageId, type: messageType, - message: message || {} + message: message || {}, }; // The next line should probably be passing a transfer argument, but that // causes Chrome to send a "null" message. The transfer seems to work
diff --git a/ash/webui/system_apps/public/js/message_pipe_browsertest.js b/ash/webui/system_apps/public/js/message_pipe_browsertest.js index d63412a..2f4846a 100644 --- a/ash/webui/system_apps/public/js/message_pipe_browsertest.js +++ b/ash/webui/system_apps/public/js/message_pipe_browsertest.js
@@ -119,7 +119,7 @@ 'Error from chrome-untrusted://system-app-test', 'Error: No handler registered for message type \'unknown-message\'', 'at MessagePipe.receiveMessage_ \\(chrome-untrusted://system-app-test/', - 'at MessagePipe.messageListener_ \\(chrome-untrusted://system-app-test/' + 'at MessagePipe.messageListener_ \\(chrome-untrusted://system-app-test/', ]); testDone(); }); @@ -150,7 +150,7 @@ 'at chrome-untrusted://system-app-test/test_data/message_pipe_browsertest_untrusted.js', 'at MessagePipe.callHandlerForMessageType_ \\(chrome-untrusted://system-app-test/', 'at MessagePipe.receiveMessage_ \\(chrome-untrusted://system-app-test/', - 'at MessagePipe.messageListener_ \\(chrome-untrusted://system-app-test/' + 'at MessagePipe.messageListener_ \\(chrome-untrusted://system-app-test/', ]); testDone(); }); @@ -190,9 +190,11 @@ 'at async MessagePipe.callHandlerForMessageType_ \\(chrome-untrusted://system-app-test/', // Error stack of the trusted context. 'Error from chrome://system-app-test', - 'Error: This is an error from trusted', 'at .*message_pipe_browsertest.js', + 'Error: This is an error from trusted', + 'at .*message_pipe_browsertest.js', 'at MessagePipe.callHandlerForMessageType_', - 'at MessagePipe.receiveMessage_', 'at MessagePipe.messageListener_' + 'at MessagePipe.receiveMessage_', + 'at MessagePipe.messageListener_', ]); testDone(); });
diff --git a/ash/webui/system_apps/public/js/sandboxed_load_time_data.js b/ash/webui/system_apps/public/js/sandboxed_load_time_data.js index 55f2544..2289cc9b 100644 --- a/ash/webui/system_apps/public/js/sandboxed_load_time_data.js +++ b/ash/webui/system_apps/public/js/sandboxed_load_time_data.js
@@ -32,6 +32,6 @@ getString: (id) => /** @type{string} */ (impl.data_[id]), getBoolean: (id) => /** @type{boolean} */ (impl.data_[id]), getInteger: (id) => /** @type{number} */ (impl.data_[id]), - valueExists: (id) => impl.data_[id] !== undefined + valueExists: (id) => impl.data_[id] !== undefined, }; window['loadTimeData'] = impl;
diff --git a/ash/webui/system_extensions_internals_ui/test/system_extensions_internals_ui_browsertest.js b/ash/webui/system_extensions_internals_ui/test/system_extensions_internals_ui_browsertest.js index b7f33440..da6aa4a4 100644 --- a/ash/webui/system_extensions_internals_ui/test/system_extensions_internals_ui_browsertest.js +++ b/ash/webui/system_extensions_internals_ui/test/system_extensions_internals_ui_browsertest.js
@@ -26,7 +26,7 @@ return { enabled: [ 'ash::features::kSystemExtensions', - ] + ], }; }
diff --git a/ash/webui/web_applications/js2gtest_support.externs.js b/ash/webui/web_applications/js2gtest_support.externs.js index f2b3aabb..d8e3f5d 100644 --- a/ash/webui/web_applications/js2gtest_support.externs.js +++ b/ash/webui/web_applications/js2gtest_support.externs.js
@@ -32,7 +32,7 @@ get featureList() {} get typedefCppFixture() {} setUp() {} - } + }, }; function testDone() {} function assertEquals(expected, actual, message = undefined) {}
diff --git a/ash/wm/base_state.cc b/ash/wm/base_state.cc index 3af5ca27..205f7d2c 100644 --- a/ash/wm/base_state.cc +++ b/ash/wm/base_state.cc
@@ -211,6 +211,16 @@ gfx::Rect BaseState::GetSnappedWindowBoundsInParent( aura::Window* window, const WindowStateType state_type) { + return BaseState::GetSnappedWindowBoundsInParent(window, state_type, + kDefaultSnapRatio); +} + +gfx::Rect BaseState::GetSnappedWindowBoundsInParent( + aura::Window* window, + const WindowStateType state_type, + float snap_ratio) { + DCHECK(state_type == WindowStateType::kPrimarySnapped || + state_type == WindowStateType::kSecondarySnapped); gfx::Rect bounds_in_parent; if (ShouldAllowSplitView()) { bounds_in_parent = @@ -218,13 +228,15 @@ (state_type == WindowStateType::kPrimarySnapped) ? SplitViewController::LEFT : SplitViewController::RIGHT, - window); + window, snap_ratio); } else { - bounds_in_parent = (state_type == WindowStateType::kPrimarySnapped) - ? GetDefaultSnappedWindowBoundsInParent( - window, SnapViewType::kPrimary) - : GetDefaultSnappedWindowBoundsInParent( - window, SnapViewType::kSecondary); + // Use `window_positioning_utils` to calculate the snapped window bounds. + bounds_in_parent = ash::GetSnappedWindowBoundsInParent( + window, + state_type == WindowStateType::kPrimarySnapped + ? SnapViewType::kPrimary + : SnapViewType::kSecondary, + snap_ratio); } return bounds_in_parent; }
diff --git a/ash/wm/base_state.h b/ash/wm/base_state.h index 5cbfab2..79eb819 100644 --- a/ash/wm/base_state.h +++ b/ash/wm/base_state.h
@@ -63,6 +63,14 @@ aura::Window* window, const chromeos::WindowStateType state_type); + // Returns the window bounds for snapped window state for given `snap_ratio`. + // Note that even when `snap_ratio` is provided, it might get ignored to meet + // the window's minimum size requirement. + gfx::Rect GetSnappedWindowBoundsInParent( + aura::Window* window, + const chromeos::WindowStateType state_type, + float snap_ratio); + // Prepares for the window snap event. Check if the window can be snapped in // split screen and if so, SplitViewController will start observe this window. // This needs to be done before the window's state and bounds change to its
diff --git a/ash/wm/default_state.cc b/ash/wm/default_state.cc index 81cfe85..a774e38 100644 --- a/ash/wm/default_state.cc +++ b/ash/wm/default_state.cc
@@ -40,6 +40,19 @@ namespace ash { namespace { +float GetFloatValueForSnapRatio(WindowSnapWMEvent::SnapRatio snap_ratio) { + switch (snap_ratio) { + case WindowSnapWMEvent::SnapRatio::kOneThirdSnapRatio: + return kOneThirdPositionRatio; + case WindowSnapWMEvent::SnapRatio::kDefaultSnapRatio: + return kDefaultPositionRatio; + case WindowSnapWMEvent::SnapRatio::kTwoThirdSnapRatio: + return kTwoThirdPositionRatio; + default: + return kDefaultPositionRatio; + } +} + using ::chromeos::WindowStateType; // This specifies how much percent (30%) of a window rect @@ -359,10 +372,14 @@ HandleWindowSnapping(window_state, type); if (next_state_type == current_state_type && window_state->IsSnapped()) { - gfx::Rect snapped_bounds = GetSnappedWindowBoundsInParent( - window_state->window(), event->type() == WM_EVENT_SNAP_PRIMARY - ? WindowStateType::kPrimarySnapped - : WindowStateType::kSecondarySnapped); + float snap_ratio = GetFloatValueForSnapRatio( + static_cast<const WindowSnapWMEvent*>(event)->snap_ratio()); + gfx::Rect snapped_bounds = + GetSnappedWindowBoundsInParent(window_state->window(), + event->type() == WM_EVENT_SNAP_PRIMARY + ? WindowStateType::kPrimarySnapped + : WindowStateType::kSecondarySnapped, + snap_ratio); window_state->SetBoundsDirectAnimated(snapped_bounds); return; } @@ -375,9 +392,15 @@ } window_state->RecordAndResetWindowSnapActionSource(current_state_type, next_state_type); + + EnterToNextState( + window_state, next_state_type, + absl::make_optional( + static_cast<const WindowSnapWMEvent*>(event)->snap_ratio())); + return; } - EnterToNextState(window_state, next_state_type); + EnterToNextState(window_state, next_state_type, absl::nullopt); } // static @@ -425,8 +448,10 @@ } } -void DefaultState::EnterToNextState(WindowState* window_state, - WindowStateType next_state_type) { +void DefaultState::EnterToNextState( + WindowState* window_state, + WindowStateType next_state_type, + absl::optional<WindowSnapWMEvent::SnapRatio> snap_ratio) { // Do nothing if we're already in the same state. if (state_type_ == next_state_type) return; @@ -477,7 +502,11 @@ if (window_state->IsMaximizedOrFullscreenOrPinned()) MoveToDisplayForRestore(window_state); - UpdateBoundsFromState(window_state, previous_state_type); + UpdateBoundsFromState( + window_state, previous_state_type, + snap_ratio.has_value() + ? absl::make_optional(GetFloatValueForSnapRatio(snap_ratio.value())) + : absl::nullopt); UpdateMinimizedState(window_state, previous_state_type); // Normal state should have no restore bounds unless it's @@ -520,7 +549,9 @@ window_state->SetRestoreBoundsInParent(stored_bounds_); } - UpdateBoundsFromState(window_state, state_in_previous_mode->GetType()); + // When reentering a state, use the saved `snap_ratio_`. + UpdateBoundsFromState(window_state, state_in_previous_mode->GetType(), + window_state->snap_ratio()); UpdateMinimizedState(window_state, state_in_previous_mode->GetType()); // Then restore the restore bounds to their previous value. @@ -533,14 +564,20 @@ } void DefaultState::UpdateBoundsFromState(WindowState* window_state, - WindowStateType previous_state_type) { + WindowStateType previous_state_type, + absl::optional<float> snap_ratio) { aura::Window* window = window_state->window(); gfx::Rect bounds_in_parent; + switch (state_type_) { + // TODO(crbug.com/1335500): Refactor snap state type handling. Since only + // snap state types define `snap_ratio`, it makes sense to handle them + // separately. case WindowStateType::kPrimarySnapped: case WindowStateType::kSecondarySnapped: - bounds_in_parent = - GetSnappedWindowBoundsInParent(window_state->window(), state_type_); + DCHECK(snap_ratio.has_value()); + bounds_in_parent = GetSnappedWindowBoundsInParent( + window_state->window(), state_type_, snap_ratio.value()); base::UmaHistogramEnumeration( kSnapWindowDeviceOrientationHistogramName, chromeos::IsDisplayLayoutHorizontal(
diff --git a/ash/wm/default_state.h b/ash/wm/default_state.h index 03dbc4e..9e89f28 100644 --- a/ash/wm/default_state.h +++ b/ash/wm/default_state.h
@@ -50,9 +50,12 @@ const SetBoundsWMEvent* bounds_event); // Enters next state. This is used when the state moves from one to another - // within the same desktop mode. - void EnterToNextState(WindowState* window_state, - chromeos::WindowStateType next_state_type); + // within the same desktop mode. Uses `snap_ratio` for the next state type if + // provided. + void EnterToNextState( + WindowState* window_state, + chromeos::WindowStateType next_state_type, + absl::optional<WindowSnapWMEvent::SnapRatio> snap_ratio); // Reenters the current state. This is called when migrating from // previous desktop mode, and the window's state needs to re-construct the @@ -60,9 +63,11 @@ void ReenterToCurrentState(WindowState* window_state, WindowState::State* state_in_previous_mode); - // Animates to new window bounds based on the current and previous state type. + // Animates to new window bounds, using `snap_ratio` if provided, based on the + // current and previous state type. void UpdateBoundsFromState(WindowState* window_state, - chromeos::WindowStateType old_state_type); + chromeos::WindowStateType old_state_type, + absl::optional<float> snap_ratio); // Updates the window bounds for display bounds, or display work area bounds // changes.
diff --git a/ash/wm/desks/desks_controller.cc b/ash/wm/desks/desks_controller.cc index 803738f..4dfb22b 100644 --- a/ash/wm/desks/desks_controller.cc +++ b/ash/wm/desks/desks_controller.cc
@@ -1122,9 +1122,6 @@ aura::Window* existing_app_instance_window = nullptr; Desk* src_desk = nullptr; for (auto& desk : desks()) { - if (desk->is_active()) - continue; - for (aura::Window* window : desk->windows()) { const std::string* const app_id_ptr = window->GetProperty(kAppIDKey); if (app_id_ptr && *app_id_ptr == app_id) { @@ -1143,114 +1140,123 @@ if (!existing_app_instance_window) return true; + // We have a window that we are going to move to the right desk and then apply + // properties to. In order to do this, we need the restore data. If we are in + // this function, then we are dealing with a single instance app and there + // should be at most one entry in the launch list. + DCHECK_LE(launch_list.size(), 1u); + if (launch_list.empty() || !launch_list.begin()->second) + return false; + + auto& app_restore_data = *launch_list.begin()->second; + // No need to shift a window that is visible on all desks. // TODO(sammiequon): Remove this property if the window on the new desk should // not be visible on all desks. if (!desks_util::IsWindowVisibleOnAllWorkspaces( existing_app_instance_window)) { - DCHECK(src_desk); - DCHECK_NE(src_desk, active_desk_); + // The index of the target desk is found in `app_restore_data`. If it isn't + // set, or out of bounds, then we default to the rightmost desk. + const int rightmost_desk_index = desks_.size() - 1; + const int target_desk_index = + std::min(app_restore_data.desk_id.value_or(rightmost_desk_index), + rightmost_desk_index); + Desk* target_desk = desks_[target_desk_index].get(); - base::AutoReset<bool> in_progress(&are_desks_being_modified_, true); - src_desk->MoveWindowToDesk(existing_app_instance_window, active_desk_, - existing_app_instance_window->GetRootWindow(), - /*unminimize=*/false); - MaybeUpdateShelfItems( - /*windows_on_inactive_desk=*/{}, - /*windows_on_active_desk=*/{existing_app_instance_window}); - ReportNumberOfWindowsPerDeskHistogram(); + DCHECK(src_desk); + if (src_desk != target_desk) { + base::AutoReset<bool> in_progress(&are_desks_being_modified_, true); + src_desk->MoveWindowToDesk(existing_app_instance_window, target_desk, + existing_app_instance_window->GetRootWindow(), + /*unminimize=*/false); + MaybeUpdateShelfItems( + /*windows_on_inactive_desk=*/{}, + /*windows_on_active_desk=*/{existing_app_instance_window}); + ReportNumberOfWindowsPerDeskHistogram(); + } } - // We can now apply properties from the restore data. If we are in this - // function, then we are dealing with a single instance app and there should - // be at most one entry in the launch list. - DCHECK_LE(launch_list.size(), 1u); - if (launch_list.empty()) - return false; + // Now that the window is on the correct desk, we can apply window properties. + if (app_restore_data.current_bounds) { + existing_app_instance_window->SetBounds(*app_restore_data.current_bounds); + } - if (const auto& app_restore_data = launch_list.begin()->second) { - if (app_restore_data->current_bounds) { - existing_app_instance_window->SetBounds( - *app_restore_data->current_bounds); - } - // Handle window state and window bounds. - if (app_restore_data->window_state_type) { - chromeos::WindowStateType target_state = - *app_restore_data->window_state_type; + // Handle window state and window bounds. + if (app_restore_data.window_state_type) { + chromeos::WindowStateType target_state = + *app_restore_data.window_state_type; - // Not all window states are supported. - const bool restoreable_state = - chromeos::IsNormalWindowStateType(target_state) || - target_state == chromeos::WindowStateType::kMinimized || - target_state == chromeos::WindowStateType::kMaximized || - target_state == chromeos::WindowStateType::kPrimarySnapped || - target_state == chromeos::WindowStateType::kSecondarySnapped; + // Not all window states are supported. + const bool restoreable_state = + chromeos::IsNormalWindowStateType(target_state) || + target_state == chromeos::WindowStateType::kMinimized || + target_state == chromeos::WindowStateType::kMaximized || + target_state == chromeos::WindowStateType::kPrimarySnapped || + target_state == chromeos::WindowStateType::kSecondarySnapped; - if (restoreable_state) { - WindowState* window_state = - WindowState::Get(existing_app_instance_window); - DCHECK(window_state); + if (restoreable_state) { + WindowState* window_state = + WindowState::Get(existing_app_instance_window); + DCHECK(window_state); - if (target_state != window_state->GetStateType()) { - switch (target_state) { - case chromeos::WindowStateType::kDefault: - case chromeos::WindowStateType::kNormal: { - const WMEvent event(WM_EVENT_NORMAL); - window_state->OnWMEvent(&event); - break; - } - case chromeos::WindowStateType::kMinimized: - if (window_state->CanMinimize()) { - window_state->Minimize(); - window_state->set_unminimize_to_restore_bounds(true); - } - break; - case chromeos::WindowStateType::kMaximized: - if (window_state->CanMaximize()) - window_state->Maximize(); - break; - case chromeos::WindowStateType::kPrimarySnapped: - case chromeos::WindowStateType::kSecondarySnapped: - if (window_state->CanSnap()) { - window_state->set_snap_action_source( - WindowSnapActionSource::kOthers); - - const WMEvent event( - target_state == chromeos::WindowStateType::kPrimarySnapped - ? WM_EVENT_SNAP_PRIMARY - : WM_EVENT_SNAP_SECONDARY); - window_state->OnWMEvent(&event); - } - break; - case chromeos::WindowStateType::kInactive: - case chromeos::WindowStateType::kFullscreen: - case chromeos::WindowStateType::kAutoPositioned: - case chromeos::WindowStateType::kPinned: - case chromeos::WindowStateType::kTrustedPinned: - case chromeos::WindowStateType::kPip: - // TODO(crbug.com/1331825): Float state support for desk template. - case chromeos::WindowStateType::kFloated: - NOTREACHED(); - break; + if (target_state != window_state->GetStateType()) { + switch (target_state) { + case chromeos::WindowStateType::kDefault: + case chromeos::WindowStateType::kNormal: { + const WMEvent event(WM_EVENT_NORMAL); + window_state->OnWMEvent(&event); + break; } + case chromeos::WindowStateType::kMinimized: + if (window_state->CanMinimize()) { + window_state->Minimize(); + window_state->set_unminimize_to_restore_bounds(true); + } + break; + case chromeos::WindowStateType::kMaximized: + if (window_state->CanMaximize()) + window_state->Maximize(); + break; + case chromeos::WindowStateType::kPrimarySnapped: + case chromeos::WindowStateType::kSecondarySnapped: + if (window_state->CanSnap()) { + window_state->set_snap_action_source( + WindowSnapActionSource::kOthers); + + const WMEvent event( + target_state == chromeos::WindowStateType::kPrimarySnapped + ? WM_EVENT_SNAP_PRIMARY + : WM_EVENT_SNAP_SECONDARY); + window_state->OnWMEvent(&event); + } + break; + case chromeos::WindowStateType::kInactive: + case chromeos::WindowStateType::kFullscreen: + case chromeos::WindowStateType::kAutoPositioned: + case chromeos::WindowStateType::kPinned: + case chromeos::WindowStateType::kTrustedPinned: + case chromeos::WindowStateType::kPip: + // TODO(crbug.com/1331825): Float state support for desk template. + case chromeos::WindowStateType::kFloated: + NOTREACHED(); + break; } - - // For states with restore bounds (maximized, snapped, minimized), the - // restore bounds are stored in `current_bounds`. - const gfx::Rect restore_bounds = - app_restore_data->current_bounds.value_or(gfx::Rect()); - if (!restore_bounds.IsEmpty()) - window_state->SetRestoreBoundsInScreen(restore_bounds); } - } - if (app_restore_data->activation_index) { - existing_app_instance_window->SetProperty( - app_restore::kActivationIndexKey, - *app_restore_data->activation_index); + // For states with restore bounds (maximized, snapped, minimized), the + // restore bounds are stored in `current_bounds`. + const gfx::Rect restore_bounds = + app_restore_data.current_bounds.value_or(gfx::Rect()); + if (!restore_bounds.IsEmpty()) + window_state->SetRestoreBoundsInScreen(restore_bounds); } } + if (app_restore_data.activation_index) { + existing_app_instance_window->SetProperty( + app_restore::kActivationIndexKey, *app_restore_data.activation_index); + } + WindowRestoreController::Get()->StackWindow(existing_app_instance_window); // TODO(sammiequon): Read something for chromevox, either here or when the
diff --git a/ash/wm/splitview/split_view_controller.cc b/ash/wm/splitview/split_view_controller.cc index ac6dda3..3250e87 100644 --- a/ash/wm/splitview/split_view_controller.cc +++ b/ash/wm/splitview/split_view_controller.cc
@@ -88,11 +88,6 @@ // always be moved to these three positions. constexpr float kFixedPositionRatios[] = {0.f, 0.5f, 1.0f}; -// Two optional position ratios of the divider. Whether the divider can be moved -// to these two positions depends on the minimum size of the snapped windows. -constexpr float kOneThirdPositionRatio = 0.33f; -constexpr float kTwoThirdPositionRatio = 0.67f; - // The black scrim starts to fade in when the divider is moved past the two // optional positions (kOneThirdPositionRatio, kTwoThirdPositionRatio) and // reaches to its maximum opacity (kBlackScrimOpacity) after moving @@ -1038,16 +1033,25 @@ gfx::Rect SplitViewController::GetSnappedWindowBoundsInParent( SnapPosition snap_position, - aura::Window* window_for_minimum_size) { - gfx::Rect bounds = - GetSnappedWindowBoundsInScreen(snap_position, window_for_minimum_size); + aura::Window* window_for_minimum_size, + float snap_ratio) { + gfx::Rect bounds = GetSnappedWindowBoundsInScreen( + snap_position, window_for_minimum_size, snap_ratio); wm::ConvertRectFromScreen(root_window_, &bounds); return bounds; } -gfx::Rect SplitViewController::GetSnappedWindowBoundsInScreen( +gfx::Rect SplitViewController::GetSnappedWindowBoundsInParent( SnapPosition snap_position, aura::Window* window_for_minimum_size) { + return GetSnappedWindowBoundsInParent(snap_position, window_for_minimum_size, + kDefaultSnapRatio); +} + +gfx::Rect SplitViewController::GetSnappedWindowBoundsInScreen( + SnapPosition snap_position, + aura::Window* window_for_minimum_size, + float snap_ratio) { const gfx::Rect work_area_bounds_in_screen = screen_util::GetDisplayWorkAreaBoundsInScreenForActiveDeskContainer( root_window_); @@ -1069,8 +1073,8 @@ // mode to `GetSnappedWindowBounds()` in window_positioning_utils.cc. const bool in_tablet = Shell::Get()->tablet_mode_controller()->InTabletMode(); const int work_area_size = GetDividerEndPosition(); - int divider_position = - divider_position_ < 0 ? GetDefaultDividerPosition() : divider_position_; + int divider_position = divider_position_ < 0 ? GetDividerPosition(snap_ratio) + : divider_position_; // Edit `divider_position` if window restore is currently restoring a snapped // window; take into account the snap percentage saved by the window. Only do @@ -1153,15 +1157,26 @@ return snapped_window_bounds_in_screen; } +gfx::Rect SplitViewController::GetSnappedWindowBoundsInScreen( + SnapPosition snap_position, + aura::Window* window_for_minimum_size) { + return GetSnappedWindowBoundsInScreen(snap_position, window_for_minimum_size, + kDefaultSnapRatio); +} + bool SplitViewController::ShouldUseWindowBoundsDuringFastResize() { return is_resizing_ && tablet_resize_mode_ == TabletResizeMode::kFast; } int SplitViewController::GetDefaultDividerPosition() const { - int default_divider_position = GetDividerEndPosition() / 2; + return GetDividerPosition(kDefaultPositionRatio); +} + +int SplitViewController::GetDividerPosition(float snap_ratio) const { + int next_divider_position = GetDividerEndPosition() * snap_ratio; if (split_view_type_ == SplitViewType::kTabletType) - default_divider_position -= kSplitviewDividerShortSideLength / 2; - return default_divider_position; + next_divider_position -= kSplitviewDividerShortSideLength / 2; + return next_divider_position; } bool SplitViewController::IsDividerAnimating() const {
diff --git a/ash/wm/splitview/split_view_controller.h b/ash/wm/splitview/split_view_controller.h index 97bf914..1841adf 100644 --- a/ash/wm/splitview/split_view_controller.h +++ b/ash/wm/splitview/split_view_controller.h
@@ -216,12 +216,30 @@ // |left_window_|. All the other window will open on the right side. aura::Window* GetDefaultSnappedWindow(); - // Gets snapped bounds based on |snap_position| and |divider_position_|, - // adjusted to accommodate the minimum size of |window_for_minimum_size| if - // |window_for_minimum_size| is not null. + // Gets snapped bounds based on |snap_position|, the side of the screen to + // snap to, and |snap_ratio|, the ratio of the screen that the snapped window + // will occupy, adjusted to accommodate the minimum size of + // |window_for_minimum_size| if |window_for_minimum_size| is not null. + gfx::Rect GetSnappedWindowBoundsInParent( + SnapPosition snap_position, + aura::Window* window_for_minimum_size, + float snap_ratio); + + // Gets snapped bounds based on |snap_position|, |divider_position_|, and + // |kDefaultSnapRatio|, adjusted to accommodate the minimum size of + // |window_for_minimum_size| if |window_for_minimum_size| is not null. gfx::Rect GetSnappedWindowBoundsInParent( SnapPosition snap_position, aura::Window* window_for_minimum_size); + + // Gets snapped bounds in screen coordinates based on |snap_position| and + // |snap_ratio|. + gfx::Rect GetSnappedWindowBoundsInScreen( + SnapPosition snap_position, + aura::Window* window_for_minimum_size, + float snap_ratio); + + // Gets snapped bounds in screen coordinates for |kDefaultSnapRatio|. gfx::Rect GetSnappedWindowBoundsInScreen( SnapPosition snap_position, aura::Window* window_for_minimum_size); @@ -234,6 +252,11 @@ // Gets the default value of |divider_position_|. int GetDefaultDividerPosition() const; + // Calculates the new divider position to move |divider_position_| to, such + // that the primary window will occupy |snap_ratio| of the screen, and the + // secondary window will occupy the rest. + int GetDividerPosition(float snap_ratio) const; + // Returns true during the divider snap animation. bool IsDividerAnimating() const;
diff --git a/ash/wm/window_positioning_utils.cc b/ash/wm/window_positioning_utils.cc index 481d3c9..ccb8b38 100644 --- a/ash/wm/window_positioning_utils.cc +++ b/ash/wm/window_positioning_utils.cc
@@ -108,12 +108,18 @@ kMinimumOnScreenArea, bounds); } -gfx::Rect GetDefaultSnappedWindowBoundsInParent(aura::Window* window, - SnapViewType type) { +gfx::Rect GetSnappedWindowBoundsInParent(aura::Window* window, + SnapViewType type, + float snap_ratio) { return GetSnappedWindowBounds( screen_util::GetDisplayWorkAreaBoundsInParent(window), display::Screen::GetScreen()->GetDisplayNearestWindow(window), window, - type, kDefaultSnapRatio); + type, snap_ratio); +} + +gfx::Rect GetDefaultSnappedWindowBoundsInParent(aura::Window* window, + SnapViewType type) { + return GetSnappedWindowBoundsInParent(window, type, kDefaultPositionRatio); } gfx::Rect GetSnappedWindowBounds(const gfx::Rect& work_area,
diff --git a/ash/wm/window_positioning_utils.h b/ash/wm/window_positioning_utils.h index 171127b..5ddb491 100644 --- a/ash/wm/window_positioning_utils.h +++ b/ash/wm/window_positioning_utils.h
@@ -55,8 +55,14 @@ const gfx::Rect& visible_area, gfx::Rect* bounds); -// Returns the bounds of a snapped window for a given snap |type| in clamshell -// mode, with default snapped ratio |kDefaultSnapRatio|, in parent coordinates. +// Returns the bounds of a snapped window for a given snap |type| and +// |snap_ratio| in clamshell mode. +ASH_EXPORT gfx::Rect GetSnappedWindowBoundsInParent(aura::Window* window, + SnapViewType type, + float snap_ratio); + +// Returns the bounds of a snapped window with default snapped ratio +// |kDefaultSnapRatio|, in parent coordinates. ASH_EXPORT gfx::Rect GetDefaultSnappedWindowBoundsInParent(aura::Window* window, SnapViewType type);
diff --git a/ash/wm/window_state.h b/ash/wm/window_state.h index adf8efb..c194c62 100644 --- a/ash/wm/window_state.h +++ b/ash/wm/window_state.h
@@ -43,6 +43,11 @@ class WindowStateObserver; class WMEvent; +// TODO(crbug.com/1323394): Consider moving to a WindowState constants file. +constexpr float kOneThirdPositionRatio = 0.33f; +constexpr float kDefaultPositionRatio = 0.5f; +constexpr float kTwoThirdPositionRatio = 0.67f; + // WindowState manages and defines ash specific window state and // behavior. Ash specific per-window state (such as ones that controls // window manager behavior) and ash specific window behavior (such as
diff --git a/ash/wm/workspace/workspace_window_resizer.cc b/ash/wm/workspace/workspace_window_resizer.cc index d8bc1e81..f3870de1e 100644 --- a/ash/wm/workspace/workspace_window_resizer.cc +++ b/ash/wm/workspace/workspace_window_resizer.cc
@@ -886,7 +886,6 @@ // TODO(oshima): Add event source type to WMEvent and move // metrics recording inside WindowState::OnWMEvent. WMEventType type; - // bool is_snap_event = false; switch (snap_type_) { case SnapType::kPrimary: { window_state()->set_snap_action_source(
diff --git a/base/BUILD.gn b/base/BUILD.gn index 3688f635..e3517cb 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -508,7 +508,6 @@ "native_library.cc", "native_library.h", "no_destructor.h", - "notreached.cc", "notreached.h", "observer_list.h", "observer_list_internal.cc",
diff --git a/base/check.cc b/base/check.cc index f340ff6..fb19c25 100644 --- a/base/check.cc +++ b/base/check.cc
@@ -30,7 +30,9 @@ namespace { -#if defined(DCHECK_IS_CONFIGURABLE) +// DCHECK_IS_CONFIGURABLE and ENABLE_LOG_ERROR_NOT_REACHED are both interested +// in non-FATAL DCHECK()/NOTREACHED() reports. +#if defined(DCHECK_IS_CONFIGURABLE) || BUILDFLAG(ENABLE_LOG_ERROR_NOT_REACHED) void DCheckDumpOnceWithoutCrashing(LogMessage* log_message) { // Best-effort gate to prevent multiple DCHECKs from being dumped. This will // race if multiple threads DCHECK at the same time, but we'll eventually stop @@ -56,6 +58,21 @@ } } +class NotReachedLogMessage : public LogMessage { + public: + using LogMessage::LogMessage; + ~NotReachedLogMessage() override { + if (severity() != logging::LOGGING_FATAL) + DCheckDumpOnceWithoutCrashing(this); + } +}; +#else +using NotReachedLogMessage = LogMessage; +#endif // defined(DCHECK_IS_CONFIGURABLE) || + // BUILDFLAG(ENABLE_LOG_ERROR_NOT_REACHED) + +#if defined(DCHECK_IS_CONFIGURABLE) + class DCheckLogMessage : public LogMessage { public: using LogMessage::LogMessage; @@ -86,11 +103,11 @@ #endif // BUILDFLAG(IS_WIN) #else static_assert(logging::LOGGING_DCHECK == logging::LOGGING_FATAL); -typedef LogMessage DCheckLogMessage; +using DCheckLogMessage = LogMessage; #if BUILDFLAG(IS_WIN) -typedef Win32ErrorLogMessage DCheckWin32ErrorLogMessage; +using DCheckWin32ErrorLogMessage = Win32ErrorLogMessage; #elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) -typedef ErrnoLogMessage DCheckErrnoLogMessage; +using DCheckErrnoLogMessage = ErrnoLogMessage; #endif // BUILDFLAG(IS_WIN) #endif // defined(DCHECK_IS_CONFIGURABLE) @@ -174,6 +191,17 @@ return CheckError(log_message); } +CheckError CheckError::NotReached(const char* file, int line) { + // Outside DCHECK builds NOTREACHED() should not be FATAL. For now. + const LogSeverity severity = DCHECK_IS_ON() ? LOGGING_DCHECK : LOGGING_ERROR; + auto* const log_message = new NotReachedLogMessage(file, line, severity); + + // TODO(pbos): Consider a better message for NotReached(), this is here to + // match existing behavior + test expectations. + log_message->stream() << "Check failed: false. "; + return CheckError(log_message); +} + std::ostream& CheckError::stream() { return log_message_->stream(); }
diff --git a/base/check.h b/base/check.h index 7561cd3..b2db7d2f 100644 --- a/base/check.h +++ b/base/check.h
@@ -82,6 +82,8 @@ int line, const char* function); + static CheckError NotReached(const char* file, int line); + // Stream for adding optional details to the error message. std::ostream& stream();
diff --git a/base/check_unittest.cc b/base/check_unittest.cc index 9da7b702..e2223ad0 100644 --- a/base/check_unittest.cc +++ b/base/check_unittest.cc
@@ -407,7 +407,7 @@ CHECK_EQ(g, h)); } -#define EXPECT_LOG_ERROR(msg, expr, expected_line) \ +#define EXPECT_LOG_ERROR(expected_line, expr, msg) \ do { \ static bool got_log_message = false; \ ASSERT_EQ(logging::GetLogMessageHandler(), nullptr); \ @@ -441,9 +441,10 @@ } while (0) TEST_F(CheckTest, NotReached) { -#if BUILDFLAG(ENABLE_LOG_ERROR_NOT_REACHED) - // Expect LOG(ERROR) without the streamed params. - EXPECT_LOG_ERROR("NOTREACHED() hit.\n", NOTREACHED() << "foo", __LINE__); +#if BUILDFLAG(ENABLE_LOG_ERROR_NOT_REACHED) && !DCHECK_IS_ON() + // Expect LOG(ERROR) that looks like CHECK(false) with streamed params intact. + EXPECT_LOG_ERROR(__LINE__, NOTREACHED() << "foo", + "Check failed: false. foo\n"); #else // Expect a DCHECK with streamed params intact. EXPECT_DCHECK("Check failed: false. foo", NOTREACHED() << "foo"); @@ -456,7 +457,7 @@ #if DCHECK_IS_ON() // Expect LOG(ERROR) with streamed params intact. - EXPECT_LOG_ERROR(expected_msg + "foo\n", NOTIMPLEMENTED() << "foo", __LINE__); + EXPECT_LOG_ERROR(__LINE__, NOTIMPLEMENTED() << "foo", expected_msg + "foo\n"); #else // Expect nothing. EXPECT_NO_LOG(NOTIMPLEMENTED() << "foo"); @@ -473,7 +474,7 @@ "Not implemented reached in void (anonymous namespace)::NiLogOnce()\n"; #if DCHECK_IS_ON() - EXPECT_LOG_ERROR(expected_msg, NiLogOnce(), __LINE__ - 8); + EXPECT_LOG_ERROR(__LINE__ - 8, NiLogOnce(), expected_msg); EXPECT_NO_LOG(NiLogOnce()); #else EXPECT_NO_LOG(NiLogOnce());
diff --git a/base/metrics/dummy_histogram.cc b/base/metrics/dummy_histogram.cc index afbdc2d..e1cc5d0 100644 --- a/base/metrics/dummy_histogram.cc +++ b/base/metrics/dummy_histogram.cc
@@ -97,12 +97,12 @@ return std::make_unique<DummyHistogramSamples>(); } -Value DummyHistogram::ToGraphDict() const { - return Value(Value::Type::DICTIONARY); +Value::Dict DummyHistogram::ToGraphDict() const { + return Value::Dict(); } -Value DummyHistogram::GetParameters() const { - return Value(); +Value::Dict DummyHistogram::GetParameters() const { + return Value::Dict(); } } // namespace base
diff --git a/base/metrics/dummy_histogram.h b/base/metrics/dummy_histogram.h index 7696832..9d77e18 100644 --- a/base/metrics/dummy_histogram.h +++ b/base/metrics/dummy_histogram.h
@@ -41,12 +41,12 @@ std::unique_ptr<HistogramSamples> SnapshotDelta() override; std::unique_ptr<HistogramSamples> SnapshotFinalDelta() const override; void WriteAscii(std::string* output) const override {} - Value ToGraphDict() const override; + Value::Dict ToGraphDict() const override; protected: // HistogramBase: void SerializeInfoImpl(Pickle* pickle) const override {} - Value GetParameters() const override; + Value::Dict GetParameters() const override; private: friend class NoDestructor<DummyHistogram>;
diff --git a/base/metrics/histogram.cc b/base/metrics/histogram.cc index 4c2f244f..2f9c235e 100644 --- a/base/metrics/histogram.cc +++ b/base/metrics/histogram.cc
@@ -574,7 +574,7 @@ return unlogged_samples_->AddFromPickle(iter); } -base::Value Histogram::ToGraphDict() const { +base::Value::Dict Histogram::ToGraphDict() const { std::unique_ptr<SampleVector> snapshot = SnapshotAllSamples(); return snapshot->ToGraphDict(histogram_name(), flags()); } @@ -662,12 +662,12 @@ return samples; } -Value Histogram::GetParameters() const { - Value params(Value::Type::DICTIONARY); - params.SetStringKey("type", HistogramTypeToString(GetHistogramType())); - params.SetIntKey("min", declared_min()); - params.SetIntKey("max", declared_max()); - params.SetIntKey("bucket_count", static_cast<int>(bucket_count())); +Value::Dict Histogram::GetParameters() const { + Value::Dict params; + params.Set("type", HistogramTypeToString(GetHistogramType())); + params.Set("min", declared_min()); + params.Set("max", declared_max()); + params.Set("bucket_count", static_cast<int>(bucket_count())); return params; }
diff --git a/base/metrics/histogram.h b/base/metrics/histogram.h index a56f16b..51dd879 100644 --- a/base/metrics/histogram.h +++ b/base/metrics/histogram.h
@@ -220,7 +220,7 @@ std::unique_ptr<HistogramSamples> SnapshotFinalDelta() const override; void AddSamples(const HistogramSamples& samples) override; bool AddSamplesFromPickle(base::PickleIterator* iter) override; - base::Value ToGraphDict() const override; + base::Value::Dict ToGraphDict() const override; protected: // This class, defined entirely within the .cc file, contains all the @@ -279,7 +279,7 @@ // Writes the type, min, max, and bucket count information of the histogram in // |params|. - Value GetParameters() const override; + Value::Dict GetParameters() const override; // Samples that have not yet been logged with SnapshotDelta(). std::unique_ptr<SampleVectorBase> unlogged_samples_;
diff --git a/base/metrics/histogram_base.cc b/base/metrics/histogram_base.cc index ffba4e8..37dc545 100644 --- a/base/metrics/histogram_base.cc +++ b/base/metrics/histogram_base.cc
@@ -71,7 +71,7 @@ HistogramBase::CountAndBucketData::CountAndBucketData(Count count, int64_t sum, - Value buckets) + Value::List buckets) : count(count), sum(sum), buckets(std::move(buckets)) {} HistogramBase::CountAndBucketData::~CountAndBucketData() = default; @@ -158,19 +158,18 @@ void HistogramBase::WriteJSON(std::string* output, JSONVerbosityLevel verbosity_level) const { CountAndBucketData count_and_bucket_data = GetCountAndBucketData(); - Value parameters = GetParameters(); + Value::Dict parameters = GetParameters(); JSONStringValueSerializer serializer(output); - Value root(Value::Type::DICTIONARY); - root.SetStringKey("name", histogram_name()); - root.SetIntKey("count", count_and_bucket_data.count); - root.SetDoubleKey("sum", static_cast<double>(count_and_bucket_data.sum)); - root.SetIntKey("flags", flags()); - root.SetKey("params", std::move(parameters)); + Value::Dict root; + root.Set("name", histogram_name()); + root.Set("count", count_and_bucket_data.count); + root.Set("sum", static_cast<double>(count_and_bucket_data.sum)); + root.Set("flags", flags()); + root.Set("params", std::move(parameters)); if (verbosity_level != JSON_VERBOSITY_LEVEL_OMIT_BUCKETS) - root.SetKey("buckets", std::move(count_and_bucket_data.buckets)); - root.SetIntKey("pid", - static_cast<int>(GetUniqueIdForProcess().GetUnsafeValue())); + root.Set("buckets", std::move(count_and_bucket_data.buckets)); + root.Set("pid", static_cast<int>(GetUniqueIdForProcess().GetUnsafeValue())); serializer.Serialize(root); } @@ -195,24 +194,24 @@ int64_t sum = snapshot->sum(); std::unique_ptr<SampleCountIterator> it = snapshot->Iterator(); - Value::ListStorage buckets; + Value::List buckets; while (!it->Done()) { Sample bucket_min; int64_t bucket_max; Count bucket_count; it->Get(&bucket_min, &bucket_max, &bucket_count); - Value bucket_value(Value::Type::DICTIONARY); - bucket_value.SetIntKey("low", bucket_min); + Value::Dict bucket_value; + bucket_value.Set("low", bucket_min); // TODO(crbug.com/1334256): Make base::Value able to hold int64_t and remove // this cast. - bucket_value.SetIntKey("high", static_cast<int>(bucket_max)); - bucket_value.SetIntKey("count", bucket_count); - buckets.push_back(std::move(bucket_value)); + bucket_value.Set("high", static_cast<int>(bucket_max)); + bucket_value.Set("count", bucket_count); + buckets.Append(std::move(bucket_value)); it->Next(); } - return CountAndBucketData(count, sum, Value(std::move(buckets))); + return CountAndBucketData(count, sum, std::move(buckets)); } void HistogramBase::WriteAsciiBucketGraph(double x_count, @@ -235,14 +234,14 @@ void HistogramBase::WriteAsciiBucketValue(Count current, double scaled_sum, std::string* output) const { - StringAppendF(output, " (%d = %3.1f%%)", current, current/scaled_sum); + StringAppendF(output, " (%d = %3.1f%%)", current, current / scaled_sum); } void HistogramBase::WriteAscii(std::string* output) const { - base::Value graph_dict = ToGraphDict(); - output->append(*graph_dict.FindStringKey("header")); + base::Value::Dict graph_dict = ToGraphDict(); + output->append(*graph_dict.FindString("header")); output->append("\n"); - output->append(*graph_dict.FindStringKey("body")); + output->append(*graph_dict.FindString("body")); } // static
diff --git a/base/metrics/histogram_base.h b/base/metrics/histogram_base.h index 7e876b23..855634e 100644 --- a/base/metrics/histogram_base.h +++ b/base/metrics/histogram_base.h
@@ -255,7 +255,7 @@ // with the following format: // {"header": "Name of the histogram with samples, mean, and/or flags", // "body": "ASCII histogram representation"} - virtual base::Value ToGraphDict() const = 0; + virtual base::Value::Dict ToGraphDict() const = 0; // TODO(bcwhite): Remove this after https://crbug/836875. virtual void ValidateHistogramContents() const; @@ -272,9 +272,9 @@ struct BASE_EXPORT CountAndBucketData { Count count; int64_t sum; - Value buckets; + Value::List buckets; - CountAndBucketData(Count count, int64_t sum, Value buckets); + CountAndBucketData(Count count, int64_t sum, Value::List buckets); ~CountAndBucketData(); CountAndBucketData(CountAndBucketData&& other); @@ -285,7 +285,7 @@ virtual void SerializeInfoImpl(base::Pickle* pickle) const = 0; // Writes information about the construction parameters in |params|. - virtual Value GetParameters() const = 0; + virtual Value::Dict GetParameters() const = 0; // Returns information about the current (non-empty) buckets and their sample // counts to |buckets|, the total sample count to |count| and the total sum
diff --git a/base/metrics/histogram_samples.cc b/base/metrics/histogram_samples.cc index edfcaea..356d3506 100644 --- a/base/metrics/histogram_samples.cc +++ b/base/metrics/histogram_samples.cc
@@ -270,12 +270,12 @@ static_cast<int32_t>(id())); } -base::Value HistogramSamples::ToGraphDict(StringPiece histogram_name, - int32_t flags) const { - base::Value dict(base::Value::Type::DICTIONARY); - dict.SetStringKey("name", histogram_name); - dict.SetStringKey("header", GetAsciiHeader(histogram_name, flags)); - dict.SetStringKey("body", GetAsciiBody()); +base::Value::Dict HistogramSamples::ToGraphDict(StringPiece histogram_name, + int32_t flags) const { + base::Value::Dict dict; + dict.Set("name", histogram_name); + dict.Set("header", GetAsciiHeader(histogram_name, flags)); + dict.Set("body", GetAsciiBody()); return dict; }
diff --git a/base/metrics/histogram_samples.h b/base/metrics/histogram_samples.h index d54ac4e..34f6e28f 100644 --- a/base/metrics/histogram_samples.h +++ b/base/metrics/histogram_samples.h
@@ -152,7 +152,8 @@ // Returns ASCII representation of histograms data for histogram samples. // The dictionary returned will be of the form // {"name":<string>, "header":<string>, "body": <string>} - base::Value ToGraphDict(StringPiece histogram_name, int32_t flags) const; + base::Value::Dict ToGraphDict(StringPiece histogram_name, + int32_t flags) const; // Accessor functions. uint64_t id() const { return meta_->id; }
diff --git a/base/metrics/histogram_unittest.cc b/base/metrics/histogram_unittest.cc index 69d993d5..fd784bd 100644 --- a/base/metrics/histogram_unittest.cc +++ b/base/metrics/histogram_unittest.cc
@@ -89,13 +89,11 @@ statistics_recorder_ = StatisticsRecorder::CreateTemporaryForTesting(); } - void UninitializeStatisticsRecorder() { - statistics_recorder_.reset(); - } + void UninitializeStatisticsRecorder() { statistics_recorder_.reset(); } void CreatePersistentHistogramAllocator() { - GlobalHistogramAllocator::CreateWithLocalMemory( - kAllocatorMemorySize, 0, "HistogramAllocatorTest"); + GlobalHistogramAllocator::CreateWithLocalMemory(kAllocatorMemorySize, 0, + "HistogramAllocatorTest"); allocator_ = GlobalHistogramAllocator::Get()->memory_allocator(); } @@ -127,8 +125,8 @@ // Check for basic syntax and use. TEST_P(HistogramTest, BasicTest) { // Try basic construction - HistogramBase* histogram = Histogram::FactoryGet( - "TestHistogram", 1, 1000, 10, HistogramBase::kNoFlags); + HistogramBase* histogram = Histogram::FactoryGet("TestHistogram", 1, 1000, 10, + HistogramBase::kNoFlags); EXPECT_TRUE(histogram); HistogramBase* linear_histogram = LinearHistogram::FactoryGet( @@ -180,9 +178,8 @@ // Check that delta calculations work correctly. TEST_P(HistogramTest, DeltaTest) { - HistogramBase* histogram = - Histogram::FactoryGet("DeltaHistogram", 1, 64, 8, - HistogramBase::kNoFlags); + HistogramBase* histogram = Histogram::FactoryGet("DeltaHistogram", 1, 64, 8, + HistogramBase::kNoFlags); histogram->Add(1); histogram->Add(10); histogram->Add(50); @@ -209,9 +206,8 @@ // Check that final-delta calculations work correctly. TEST_P(HistogramTest, FinalDeltaTest) { - HistogramBase* histogram = - Histogram::FactoryGet("FinalDeltaHistogram", 1, 64, 8, - HistogramBase::kNoFlags); + HistogramBase* histogram = Histogram::FactoryGet("FinalDeltaHistogram", 1, 64, + 8, HistogramBase::kNoFlags); histogram->Add(1); histogram->Add(10); histogram->Add(50); @@ -344,9 +340,8 @@ custom_ranges.push_back(1); custom_ranges.push_back(2); - Histogram* histogram = static_cast<Histogram*>( - CustomHistogram::FactoryGet("TestCustomHistogram1", custom_ranges, - HistogramBase::kNoFlags)); + Histogram* histogram = static_cast<Histogram*>(CustomHistogram::FactoryGet( + "TestCustomHistogram1", custom_ranges, HistogramBase::kNoFlags)); const BucketRanges* ranges = histogram->bucket_ranges(); ASSERT_EQ(4u, ranges->size()); EXPECT_EQ(0, ranges->range(0)); // Auto added. @@ -358,9 +353,8 @@ custom_ranges.clear(); custom_ranges.push_back(2); custom_ranges.push_back(1); - histogram = static_cast<Histogram*>( - CustomHistogram::FactoryGet("TestCustomHistogram2", custom_ranges, - HistogramBase::kNoFlags)); + histogram = static_cast<Histogram*>(CustomHistogram::FactoryGet( + "TestCustomHistogram2", custom_ranges, HistogramBase::kNoFlags)); ranges = histogram->bucket_ranges(); ASSERT_EQ(4u, ranges->size()); EXPECT_EQ(0, ranges->range(0)); @@ -373,9 +367,8 @@ custom_ranges.push_back(4); custom_ranges.push_back(1); custom_ranges.push_back(4); - histogram = static_cast<Histogram*>( - CustomHistogram::FactoryGet("TestCustomHistogram3", custom_ranges, - HistogramBase::kNoFlags)); + histogram = static_cast<Histogram*>(CustomHistogram::FactoryGet( + "TestCustomHistogram3", custom_ranges, HistogramBase::kNoFlags)); ranges = histogram->bucket_ranges(); ASSERT_EQ(4u, ranges->size()); EXPECT_EQ(0, ranges->range(0)); @@ -393,9 +386,8 @@ std::vector<HistogramBase::Sample> custom_ranges; custom_ranges.push_back(4); - Histogram* histogram = static_cast<Histogram*>( - CustomHistogram::FactoryGet("2BucketsCustomHistogram", custom_ranges, - HistogramBase::kNoFlags)); + Histogram* histogram = static_cast<Histogram*>(CustomHistogram::FactoryGet( + "2BucketsCustomHistogram", custom_ranges, HistogramBase::kNoFlags)); const BucketRanges* ranges = histogram->bucket_ranges(); ASSERT_EQ(3u, ranges->size()); EXPECT_EQ(0, ranges->range(0)); @@ -405,9 +397,8 @@ TEST_P(HistogramTest, AddCountTest) { const size_t kBucketCount = 50; - Histogram* histogram = static_cast<Histogram*>( - Histogram::FactoryGet("AddCountHistogram", 10, 100, kBucketCount, - HistogramBase::kNoFlags)); + Histogram* histogram = static_cast<Histogram*>(Histogram::FactoryGet( + "AddCountHistogram", 10, 100, kBucketCount, HistogramBase::kNoFlags)); histogram->AddCount(20, 15); histogram->AddCount(30, 14); @@ -473,9 +464,8 @@ // Make sure histogram handles out-of-bounds data gracefully. TEST_P(HistogramTest, BoundsTest) { const size_t kBucketCount = 50; - Histogram* histogram = static_cast<Histogram*>( - Histogram::FactoryGet("Bounded", 10, 100, kBucketCount, - HistogramBase::kNoFlags)); + Histogram* histogram = static_cast<Histogram*>(Histogram::FactoryGet( + "Bounded", 10, 100, kBucketCount, HistogramBase::kNoFlags)); // Put two samples "out of bounds" above and below. histogram->Add(5); @@ -608,9 +598,8 @@ } TEST_P(HistogramTest, HistogramSerializeInfo) { - Histogram* histogram = static_cast<Histogram*>( - Histogram::FactoryGet("Histogram", 1, 64, 8, - HistogramBase::kIPCSerializationSourceFlag)); + Histogram* histogram = static_cast<Histogram*>(Histogram::FactoryGet( + "Histogram", 1, 64, 8, HistogramBase::kIPCSerializationSourceFlag)); Pickle pickle; histogram->SerializeInfo(&pickle); @@ -654,10 +643,9 @@ custom_ranges.push_back(10); custom_ranges.push_back(100); - HistogramBase* custom_histogram = CustomHistogram::FactoryGet( - "TestCustomRangeBoundedHistogram", - custom_ranges, - HistogramBase::kNoFlags); + HistogramBase* custom_histogram = + CustomHistogram::FactoryGet("TestCustomRangeBoundedHistogram", + custom_ranges, HistogramBase::kNoFlags); Pickle pickle; custom_histogram->SerializeInfo(&pickle); @@ -684,16 +672,16 @@ } TEST_P(HistogramTest, BadConstruction) { - HistogramBase* histogram = Histogram::FactoryGet( - "BadConstruction", 0, 100, 8, HistogramBase::kNoFlags); + HistogramBase* histogram = Histogram::FactoryGet("BadConstruction", 0, 100, 8, + HistogramBase::kNoFlags); EXPECT_TRUE(histogram->HasConstructionArguments(1, 100, 8)); // Try to get the same histogram name with different arguments. HistogramBase* bad_histogram = Histogram::FactoryGet( "BadConstruction", 0, 100, 7, HistogramBase::kNoFlags); EXPECT_EQ(DummyHistogram::GetInstance(), bad_histogram); - bad_histogram = Histogram::FactoryGet( - "BadConstruction", 0, 99, 8, HistogramBase::kNoFlags); + bad_histogram = Histogram::FactoryGet("BadConstruction", 0, 99, 8, + HistogramBase::kNoFlags); EXPECT_EQ(DummyHistogram::GetInstance(), bad_histogram); HistogramBase* linear_histogram = LinearHistogram::FactoryGet( @@ -701,11 +689,11 @@ EXPECT_TRUE(linear_histogram->HasConstructionArguments(1, 100, 8)); // Try to get the same histogram name with different arguments. - bad_histogram = LinearHistogram::FactoryGet( - "BadConstructionLinear", 0, 100, 7, HistogramBase::kNoFlags); + bad_histogram = LinearHistogram::FactoryGet("BadConstructionLinear", 0, 100, + 7, HistogramBase::kNoFlags); EXPECT_EQ(DummyHistogram::GetInstance(), bad_histogram); - bad_histogram = LinearHistogram::FactoryGet( - "BadConstructionLinear", 10, 100, 8, HistogramBase::kNoFlags); + bad_histogram = LinearHistogram::FactoryGet("BadConstructionLinear", 10, 100, + 8, HistogramBase::kNoFlags); EXPECT_EQ(DummyHistogram::GetInstance(), bad_histogram); } @@ -731,8 +719,7 @@ int64_t create_ms = create_ticks.InMilliseconds(); VLOG(1) << kTestCreateCount << " histogram creations took " << create_ms - << "ms or about " - << (create_ms * 1000000) / kTestCreateCount + << "ms or about " << (create_ms * 1000000) / kTestCreateCount << "ns each."; // Calculate cost of looking up existing histograms. @@ -751,13 +738,12 @@ int64_t lookup_ms = lookup_ticks.InMilliseconds(); VLOG(1) << kTestLookupCount << " histogram lookups took " << lookup_ms - << "ms or about " - << (lookup_ms * 1000000) / kTestLookupCount + << "ms or about " << (lookup_ms * 1000000) / kTestLookupCount << "ns each."; // Calculate cost of accessing histograms. - HistogramBase* histogram = Histogram::FactoryGet( - histogram_names[0], 1, 100, 10, HistogramBase::kNoFlags); + HistogramBase* histogram = Histogram::FactoryGet(histogram_names[0], 1, 100, + 10, HistogramBase::kNoFlags); ASSERT_TRUE(histogram); TimeTicks add_start = TimeTicks::Now(); for (int i = 0; i < kTestAddCount; ++i) @@ -766,9 +752,7 @@ int64_t add_ms = add_ticks.InMilliseconds(); VLOG(1) << kTestAddCount << " histogram adds took " << add_ms - << "ms or about " - << (add_ms * 1000000) / kTestAddCount - << "ns each."; + << "ms or about " << (add_ms * 1000000) / kTestAddCount << "ns each."; } TEST_P(HistogramTest, ScaledLinearHistogram) { @@ -811,25 +795,23 @@ // 1). But we accept ranges exceeding those limits, and silently clamped to // those limits. This is for backwards compatibility. TEST(HistogramDeathTest, BadRangesTest) { - HistogramBase* histogram = Histogram::FactoryGet( - "BadRanges", 0, HistogramBase::kSampleType_MAX, 8, - HistogramBase::kNoFlags); - EXPECT_TRUE( - histogram->HasConstructionArguments( - 1, HistogramBase::kSampleType_MAX - 1, 8)); + HistogramBase* histogram = + Histogram::FactoryGet("BadRanges", 0, HistogramBase::kSampleType_MAX, 8, + HistogramBase::kNoFlags); + EXPECT_TRUE(histogram->HasConstructionArguments( + 1, HistogramBase::kSampleType_MAX - 1, 8)); HistogramBase* linear_histogram = LinearHistogram::FactoryGet( "BadRangesLinear", 0, HistogramBase::kSampleType_MAX, 8, HistogramBase::kNoFlags); - EXPECT_TRUE( - linear_histogram->HasConstructionArguments( - 1, HistogramBase::kSampleType_MAX - 1, 8)); + EXPECT_TRUE(linear_histogram->HasConstructionArguments( + 1, HistogramBase::kSampleType_MAX - 1, 8)); std::vector<int> custom_ranges; custom_ranges.push_back(0); custom_ranges.push_back(5); - Histogram* custom_histogram = static_cast<Histogram*>( - CustomHistogram::FactoryGet( + Histogram* custom_histogram = + static_cast<Histogram*>(CustomHistogram::FactoryGet( "BadRangesCustom", custom_ranges, HistogramBase::kNoFlags)); const BucketRanges* ranges = custom_histogram->bucket_ranges(); ASSERT_EQ(3u, ranges->size()); @@ -842,7 +824,7 @@ EXPECT_DEATH_IF_SUPPORTED( CustomHistogram::FactoryGet("BadRangesCustom2", custom_ranges, HistogramBase::kNoFlags), - ""); + ""); // CustomHistogram needs at least 1 valid range. custom_ranges.clear(); @@ -850,7 +832,7 @@ EXPECT_DEATH_IF_SUPPORTED( CustomHistogram::FactoryGet("BadRangesCustom3", custom_ranges, HistogramBase::kNoFlags), - ""); + ""); } TEST_P(HistogramTest, ExpiredHistogramTest) { @@ -931,23 +913,22 @@ EXPECT_EQ(58, count_and_data_bucket.count); EXPECT_EQ(1440, count_and_data_bucket.sum); - const base::Value::ConstListView buckets_list = - count_and_data_bucket.buckets.GetListDeprecated(); + const base::Value::List& buckets_list = count_and_data_bucket.buckets; ASSERT_EQ(2u, buckets_list.size()); // Check the first bucket. - const base::Value& bucket1 = buckets_list[0]; - ASSERT_TRUE(bucket1.is_dict()); - EXPECT_EQ(bucket1.FindIntKey("low"), absl::optional<int>(20)); - EXPECT_EQ(bucket1.FindIntKey("high"), absl::optional<int>(21)); - EXPECT_EQ(bucket1.FindIntKey("count"), absl::optional<int>(30)); + const base::Value::Dict* bucket1 = buckets_list[0].GetIfDict(); + ASSERT_TRUE(bucket1 != nullptr); + EXPECT_EQ(bucket1->FindInt("low"), absl::optional<int>(20)); + EXPECT_EQ(bucket1->FindInt("high"), absl::optional<int>(21)); + EXPECT_EQ(bucket1->FindInt("count"), absl::optional<int>(30)); // Check the second bucket. - const base::Value& bucket2 = buckets_list[1]; - ASSERT_TRUE(bucket2.is_dict()); - EXPECT_EQ(bucket2.FindIntKey("low"), absl::optional<int>(30)); - EXPECT_EQ(bucket2.FindIntKey("high"), absl::optional<int>(31)); - EXPECT_EQ(bucket2.FindIntKey("count"), absl::optional<int>(28)); + const base::Value::Dict* bucket2 = buckets_list[1].GetIfDict(); + ASSERT_TRUE(bucket2 != nullptr); + EXPECT_EQ(bucket2->FindInt("low"), absl::optional<int>(30)); + EXPECT_EQ(bucket2->FindInt("high"), absl::optional<int>(31)); + EXPECT_EQ(bucket2->FindInt("count"), absl::optional<int>(28)); } TEST_P(HistogramTest, WriteAscii) { @@ -974,9 +955,9 @@ /*bucket_count=*/5, HistogramBase::kNoFlags); histogram->AddCount(/*sample=*/4, /*value=*/5); - base::Value output = histogram->ToGraphDict(); - const std::string* header = output.FindStringKey("header"); - const std::string* body = output.FindStringKey("body"); + base::Value::Dict output = histogram->ToGraphDict(); + const std::string* header = output.FindString("header"); + const std::string* body = output.FindString("body"); const char kOutputHeaderFormatRe[] = R"(Histogram: HTMLOut recorded 5 samples, mean = 4\.0.*)"; @@ -1002,9 +983,9 @@ histogram->AddCount(/*value=*/value_bucket_1, /*count=*/count_bucket_1); histogram->AddCount(/*value=*/value_bucket_2, /*count=*/count_bucket_2); - base::Value output = histogram->ToGraphDict(); - std::string* header = output.FindStringKey("header"); - std::string* body = output.FindStringKey("body"); + base::Value::Dict output = histogram->ToGraphDict(); + std::string* header = output.FindString("header"); + std::string* body = output.FindString("body"); const char kOutputHeaderFormatRe[] = R"(Histogram: AsciiOut recorded 120 samples, mean = 4\.3.*)";
diff --git a/base/metrics/sparse_histogram.cc b/base/metrics/sparse_histogram.cc index 9c90d893..1056c163 100644 --- a/base/metrics/sparse_histogram.cc +++ b/base/metrics/sparse_histogram.cc
@@ -84,8 +84,7 @@ const char* name, HistogramSamples::Metadata* meta, HistogramSamples::Metadata* logged_meta) { - return WrapUnique( - new SparseHistogram(allocator, name, meta, logged_meta)); + return WrapUnique(new SparseHistogram(allocator, name, meta, logged_meta)); } SparseHistogram::~SparseHistogram() = default; @@ -166,7 +165,7 @@ return unlogged_samples_->AddFromPickle(iter); } -base::Value SparseHistogram::ToGraphDict() const { +base::Value::Dict SparseHistogram::ToGraphDict() const { std::unique_ptr<HistogramSamples> snapshot = SnapshotSamples(); return snapshot->ToGraphDict(histogram_name(), flags()); } @@ -215,11 +214,11 @@ return SparseHistogram::FactoryGet(histogram_name, flags); } -Value SparseHistogram::GetParameters() const { +Value::Dict SparseHistogram::GetParameters() const { // Unlike Histogram::GetParameters, only set the type here, and no other // params. The other params do not make sense for sparse histograms. - Value params(Value::Type::DICTIONARY); - params.SetStringKey("type", HistogramTypeToString(GetHistogramType())); + Value::Dict params; + params.Set("type", HistogramTypeToString(GetHistogramType())); return params; }
diff --git a/base/metrics/sparse_histogram.h b/base/metrics/sparse_histogram.h index b77e2f2..cd52bed 100644 --- a/base/metrics/sparse_histogram.h +++ b/base/metrics/sparse_histogram.h
@@ -57,7 +57,7 @@ std::unique_ptr<HistogramSamples> SnapshotSamples() const override; std::unique_ptr<HistogramSamples> SnapshotDelta() override; std::unique_ptr<HistogramSamples> SnapshotFinalDelta() const override; - base::Value ToGraphDict() const override; + base::Value::Dict ToGraphDict() const override; protected: // HistogramBase implementation: @@ -77,7 +77,7 @@ static HistogramBase* DeserializeInfoImpl(base::PickleIterator* iter); // Writes the type of the sparse histogram in the |params|. - Value GetParameters() const override; + Value::Dict GetParameters() const override; // For constructor calling. friend class SparseHistogramTest;
diff --git a/base/metrics/sparse_histogram_unittest.cc b/base/metrics/sparse_histogram_unittest.cc index 6b6eda84..54e1d297a 100644 --- a/base/metrics/sparse_histogram_unittest.cc +++ b/base/metrics/sparse_histogram_unittest.cc
@@ -63,9 +63,7 @@ statistics_recorder_ = StatisticsRecorder::CreateTemporaryForTesting(); } - void UninitializeStatisticsRecorder() { - statistics_recorder_.reset(); - } + void UninitializeStatisticsRecorder() { statistics_recorder_.reset(); } void CreatePersistentMemoryAllocator() { GlobalHistogramAllocator::CreateWithLocalMemory( @@ -312,8 +310,7 @@ int64_t create_ms = create_ticks.InMilliseconds(); VLOG(1) << kTestCreateCount << " histogram creations took " << create_ms - << "ms or about " - << (create_ms * 1000000) / kTestCreateCount + << "ms or about " << (create_ms * 1000000) / kTestCreateCount << "ns each."; // Calculate cost of looking up existing histograms. @@ -332,8 +329,7 @@ int64_t lookup_ms = lookup_ticks.InMilliseconds(); VLOG(1) << kTestLookupCount << " histogram lookups took " << lookup_ms - << "ms or about " - << (lookup_ms * 1000000) / kTestLookupCount + << "ms or about " << (lookup_ms * 1000000) / kTestLookupCount << "ns each."; // Calculate cost of accessing histograms. @@ -347,9 +343,7 @@ int64_t add_ms = add_ticks.InMilliseconds(); VLOG(1) << kTestAddCount << " histogram adds took " << add_ms - << "ms or about " - << (add_ms * 1000000) / kTestAddCount - << "ns each."; + << "ms or about " << (add_ms * 1000000) / kTestAddCount << "ns each."; } TEST_P(SparseHistogramTest, ExtremeValues) { @@ -409,23 +403,22 @@ EXPECT_EQ(25, count_and_data_bucket.count); EXPECT_EQ(4000, count_and_data_bucket.sum); - const base::Value::ConstListView buckets_list = - count_and_data_bucket.buckets.GetListDeprecated(); + const base::Value::List& buckets_list = count_and_data_bucket.buckets; ASSERT_EQ(2u, buckets_list.size()); // Check the first bucket. - const base::Value& bucket1 = buckets_list[0]; - ASSERT_TRUE(bucket1.is_dict()); - EXPECT_EQ(bucket1.FindIntKey("low"), absl::optional<int>(100)); - EXPECT_EQ(bucket1.FindIntKey("high"), absl::optional<int>(101)); - EXPECT_EQ(bucket1.FindIntKey("count"), absl::optional<int>(10)); + const base::Value::Dict* bucket1 = buckets_list[0].GetIfDict(); + ASSERT_TRUE(bucket1 != nullptr); + EXPECT_EQ(bucket1->FindInt("low"), absl::optional<int>(100)); + EXPECT_EQ(bucket1->FindInt("high"), absl::optional<int>(101)); + EXPECT_EQ(bucket1->FindInt("count"), absl::optional<int>(10)); // Check the second bucket. - const base::Value& bucket2 = buckets_list[1]; - ASSERT_TRUE(bucket2.is_dict()); - EXPECT_EQ(bucket2.FindIntKey("low"), absl::optional<int>(200)); - EXPECT_EQ(bucket2.FindIntKey("high"), absl::optional<int>(201)); - EXPECT_EQ(bucket2.FindIntKey("count"), absl::optional<int>(15)); + const base::Value::Dict* bucket2 = buckets_list[1].GetIfDict(); + ASSERT_TRUE(bucket2 != nullptr); + EXPECT_EQ(bucket2->FindInt("low"), absl::optional<int>(200)); + EXPECT_EQ(bucket2->FindInt("high"), absl::optional<int>(201)); + EXPECT_EQ(bucket2->FindInt("count"), absl::optional<int>(15)); } TEST_P(SparseHistogramTest, WriteAscii) { @@ -451,9 +444,9 @@ histogram->AddCount(/*sample=*/4, /*count=*/5); histogram->AddCount(/*sample=*/10, /*count=*/15); - base::Value output = histogram->ToGraphDict(); - std::string* header = output.FindStringKey("header"); - std::string* body = output.FindStringKey("body"); + base::Value::Dict output = histogram->ToGraphDict(); + std::string* header = output.FindString("header"); + std::string* body = output.FindString("body"); const char kOutputHeaderFormatRe[] = R"(Histogram: HTMLOut recorded 20 samples.*)";
diff --git a/base/metrics/statistics_recorder_unittest.cc b/base/metrics/statistics_recorder_unittest.cc index d6fa89c..6fb8c50 100644 --- a/base/metrics/statistics_recorder_unittest.cc +++ b/base/metrics/statistics_recorder_unittest.cc
@@ -328,42 +328,44 @@ // Check for valid JSON. absl::optional<Value> root = JSONReader::Read(json); ASSERT_TRUE(root); - ASSERT_TRUE(root->is_dict()); + Value::Dict* root_dict = root->GetIfDict(); + ASSERT_TRUE(root_dict); // No query should be set. - ASSERT_FALSE(root->FindKey("query")); + ASSERT_FALSE(root_dict->Find("query")); - const Value* histogram_list = root->FindListKey("histograms"); + const Value::List* histogram_list = root_dict->FindList("histograms"); ASSERT_TRUE(histogram_list); - ASSERT_EQ(2u, histogram_list->GetListDeprecated().size()); + ASSERT_EQ(2u, histogram_list->size()); // Examine the first histogram. - const Value& histogram_dict = histogram_list->GetListDeprecated()[0]; - ASSERT_TRUE(histogram_dict.is_dict()); + const Value::Dict* histogram_dict = (*histogram_list)[0].GetIfDict(); + ASSERT_TRUE(histogram_dict); - auto sample_count = histogram_dict.FindIntKey("count"); + auto sample_count = histogram_dict->FindInt("count"); ASSERT_TRUE(sample_count); EXPECT_EQ(2, *sample_count); - const Value* buckets_list = histogram_dict.FindListKey("buckets"); + const Value::List* buckets_list = histogram_dict->FindList("buckets"); ASSERT_TRUE(buckets_list); - EXPECT_EQ(2u, buckets_list->GetListDeprecated().size()); + EXPECT_EQ(2u, buckets_list->size()); // Check the serialized JSON with a different verbosity level. json = StatisticsRecorder::ToJSON(JSON_VERBOSITY_LEVEL_OMIT_BUCKETS); root = JSONReader::Read(json); ASSERT_TRUE(root); - ASSERT_TRUE(root->is_dict()); - histogram_list = root->FindListKey("histograms"); + root_dict = root->GetIfDict(); + ASSERT_TRUE(root_dict); + histogram_list = root_dict->FindList("histograms"); ASSERT_TRUE(histogram_list); - ASSERT_EQ(2u, histogram_list->GetListDeprecated().size()); - const Value& histogram_dict2 = histogram_list->GetListDeprecated()[0]; - ASSERT_TRUE(histogram_dict2.is_dict()); - sample_count = histogram_dict2.FindIntKey("count"); + ASSERT_EQ(2u, histogram_list->size()); + const Value::Dict* histogram_dict2 = (*histogram_list)[0].GetIfDict(); + ASSERT_TRUE(histogram_dict2); + sample_count = histogram_dict2->FindInt("count"); ASSERT_TRUE(sample_count); EXPECT_EQ(2, *sample_count); - buckets_list = histogram_dict2.FindListKey("buckets"); + buckets_list = histogram_dict2->FindList("buckets"); // Bucket information should be omitted. ASSERT_FALSE(buckets_list); }
diff --git a/base/notreached.cc b/base/notreached.cc deleted file mode 100644 index 734da14..0000000 --- a/base/notreached.cc +++ /dev/null
@@ -1,23 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/notreached.h" -#include "base/base_export.h" - -// This is a widely included header and its size has significant impact on -// build time. Try not to raise this limit unless absolutely necessary. See -// https://chromium.googlesource.com/chromium/src/+/HEAD/docs/wmax_tokens.md -#ifndef NACL_TC_REV -#pragma clang max_tokens_here 17000 -#endif - -#include "base/logging.h" - -namespace logging { - -BASE_EXPORT void LogErrorNotReached(const char* file, int line) { - LogMessage(file, line, LOG_ERROR).stream() << "NOTREACHED() hit."; -} - -} // namespace logging
diff --git a/base/notreached.h b/base/notreached.h index 293451a2..044e7067 100644 --- a/base/notreached.h +++ b/base/notreached.h
@@ -12,14 +12,14 @@ namespace logging { -#if BUILDFLAG(ENABLE_LOG_ERROR_NOT_REACHED) -void BASE_EXPORT LogErrorNotReached(const char* file, int line); -#define NOTREACHED() \ - true ? ::logging::LogErrorNotReached(__FILE__, __LINE__) \ - : EAT_CHECK_STREAM_PARAMS() +// Under these conditions NOTREACHED() will effectively either log or DCHECK. +#if BUILDFLAG(ENABLE_LOG_ERROR_NOT_REACHED) || DCHECK_IS_ON() +#define NOTREACHED() \ + LAZY_CHECK_STREAM( \ + ::logging::CheckError::NotReached(__FILE__, __LINE__).stream(), true) #else -#define NOTREACHED() DCHECK(false) -#endif +#define NOTREACHED() EAT_CHECK_STREAM_PARAMS() +#endif // BUILDFLAG(ENABLE_LOG_ERROR_NOT_REACHED) || DCHECK_IS_ON() // The NOTIMPLEMENTED() macro annotates codepaths which have not been // implemented yet. If output spam is a serious concern,
diff --git a/build/config/fuchsia/BUILD.gn b/build/config/fuchsia/BUILD.gn index 15fd04b..61436df 100644 --- a/build/config/fuchsia/BUILD.gn +++ b/build/config/fuchsia/BUILD.gn
@@ -61,7 +61,13 @@ "//third_party/fuchsia-sdk/sdk/tools/${test_host_cpu}/qemu_internal-meta.json", ] } else if (test_host_cpu == "arm64") { - data += [ "//third_party/qemu-${host_os}-${test_host_cpu}/" ] + data += [ + "//third_party/qemu-${host_os}-${test_host_cpu}/", + + # TODO(https://crbug.com/1336776): remove when ffx has native support + # for starting emulator on arm64 host. + "//third_party/fuchsia-sdk/sdk/tools/x64/qemu_internal-meta.json", + ] } } foreach(fuchsia_additional_boot_image, fuchsia_additional_boot_images) {
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1 index 60b498d6..a6d302b 100644 --- a/build/fuchsia/linux_internal.sdk.sha1 +++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@ -8.20220715.2.1 +9.20220715.3.1
diff --git a/build/fuchsia/test/common.py b/build/fuchsia/test/common.py index 7aa074a..71350995 100644 --- a/build/fuchsia/test/common.py +++ b/build/fuchsia/test/common.py
@@ -170,7 +170,7 @@ run_ffx_command([ 'component', 'create', f'/core/ffx-laboratory:{package}', - f'fuchsia-pkg://{REPO_ALIAS}/{package}#meta/{package}.cmx' + f'fuchsia-pkg://{REPO_ALIAS}/{package}#meta/{package}.cm' ], target_id) run_ffx_command( ['component', 'resolve', f'/core/ffx-laboratory:{package}'],
diff --git a/build/fuchsia/test/ffx_integration.py b/build/fuchsia/test/ffx_integration.py index d838f48..9e10cc1 100644 --- a/build/fuchsia/test/ffx_integration.py +++ b/build/fuchsia/test/ffx_integration.py
@@ -3,6 +3,7 @@ # found in the LICENSE file. """Provide helpers for running Fuchsia's `ffx`.""" +import ast import logging import os import json @@ -17,6 +18,175 @@ SDK_ROOT +QEMU_ARM64_CONFIG = """{ + "args": [ + "-kernel", + "{{guest.kernel_image}}", + "-initrd", + "{{guest.zbi_image}}", + "-m", + "{{device.memory.quantity}}{{ua device.memory.units}}", + "-smp", + {{! These should probably be predicated on the host CPU. }} + "4,threads=2", + {{#if guest.fvm_image}} + "-drive", "file={{guest.fvm_image}},format=raw,if=none,id=vdisk", + "-object", "iothread,id=iothread0", + "-device", "virtio-blk-pci,drive=vdisk,iothread=iothread0", + {{/if}} + {{! The QMP is an interface for issuing commands to the emulator. The + commands are sent in JSON, as are the results. The syntax for this + interface is documented at + https://github.com/qemu/qemu/blob/master/qga/qapi-schema.json. }} + "-qmp-pretty", + "unix:{{runtime.instance_directory}}/qmp,server,nowait", + {{#if (eq runtime.console "monitor")}} + "-monitor", + "stdio", + {{else}} + "-monitor", + "unix:{{runtime.instance_directory}}/monitor,server,nowait", + {{/if}} + {{#if (eq runtime.console "console")}} + "-serial", + "stdio", + {{else}} + "-serial", + "unix:{{runtime.instance_directory}}/serial,server,nowait", + {{/if}} + "-machine", + "virt-2.12", + "-machine", + "gic-version=host", + "-cpu", + "host", + "-enable-kvm", + {{#if (eq device.pointing_device "mouse")}} + "-device", + "virtio-mouse-pci", + {{/if}} + {{#if (eq device.pointing_device "touch")}} + {{#if (eq runtime.engine_type "femu")}} + "-device", + "virtio_input_multi_touch_pci_1", + {{/if}} + {{/if}} + {{#if (eq device.audio.model "none")}} + "-no-audio", + {{else}} + "-device", + "intel-hda", + "-device", + "hda-duplex", + {{/if}} + {{! Networking goes here }} + {{#if (eq host.networking "none")}} + "-nic", + "none", + "-nodefaults", + {{else}} + {{#if (eq host.networking "tap")}} + "-netdev", + "type=tap,ifname=qemu,id=net0,script=no,downscript=no", + "-device", + "virtio-net-pci,vectors=8,netdev=net0,mac={{runtime.mac_address}}", + {{else}} + {{!-- host.networking must be "user"}} + "-netdev", + "type=user,id=net0,restrict=off + {{~#each host.port_map~}} + ,hostfwd=tcp::{{this.host}}-:{{this.guest}} + {{~/each~}}", + "-device", + "virtio-net-pci,vectors=8,netdev=net0,mac={{runtime.mac_address}}", + {{/if}} + {{/if}} + {{#if runtime.headless}} + "-nographic", + {{/if}} + "-parallel", + "none", + "-vga", + "none", + "-device", + "virtio-keyboard-pci", + "-device", + "edu" + ], + "features": [ + {{! We don't bother checking for "auto" here because the Rust code + will resolve "auto" to an actual value before it resolves the + template. }} + {{#if (eq host.acceleration "hyper")}} + {{#if (eq host.os "linux")}} + "KVM", + {{else}} + "HVF", + {{/if}} + {{/if}} + {{#if (eq device.pointing_device "mouse")}} + "VirtioMouse", + {{/if}} + "VirtioInput", + "GLDirectMem", + "HostComposition", + "Vulkan", + "RefCountPipe" + ], + "kernel_args": [ + {{#if (eq host.acceleration "hyper")}} + {{#if (eq host.os "macos")}} + "kernel.page-scanner.page-table-eviction-policy=never", + {{/if}} + {{/if}} + {{#if (eq runtime.log_level "verbose")}} + "verbose", + {{/if}} + "kernel.serial=legacy", + "TERM=xterm-256color", + "kernel.entropy-mixin=42ac2452e99c1c979ebfca03bce0cbb14126e4021a6199ccfeca217999c0aaa0", + "kernel.halt-on-panic=true", + "zircon.nodename={{runtime.name}}", + "kernel.lockup-detector.critical-section-fatal-threshold-ms=0", + "kernel.lockup-detector.critical-section-threshold-ms=5000", + "kernel.lockup-detector.heartbeat-age-fatal-threshold-ms=0" + {{#each runtime.addl_kernel_args}} + ,"{{this}}" + {{/each}} + ], + "options": [ + "-metrics-collection", + {{#if (eq device.cpu.architecture "arm64")}} + "-avd-arch", "arm64", + {{/if}} + {{#unless runtime.hidpi_scaling}} + "-no-hidpi-scaling", + {{/unless}} + "-gpu", + "{{host.gpu}}", + {{#if runtime.headless}} + "-no-window", + {{else}} + "-window-size", + "{{device.screen.width}}x{{device.screen.height}}", + {{/if}} + {{#if (eq runtime.log_level "verbose")}} + "-verbose", + {{/if}} + {{#if runtime.debugger}} + "-wait-for-debugger", + {{/if}} + "-no-location-ui" + ], + "envs": { + {{#unless runtime.headless}} + "DISPLAY": "{{env "DISPLAY"}}", + {{/unless}} + "QEMU_AUDIO_DRV": "none" + } +}""" + + def get_config(name: str) -> Optional[str]: """Run a ffx config get command to retrieve the config value.""" @@ -150,7 +320,55 @@ ('-l', os.path.join(self._logs_dir, 'emulator_log'))) if self._with_network: emu_command.extend(('--net', 'tap')) - run_ffx_command(emu_command) + + # TODO(https://crbug.com/1336776): remove when ffx has native support + # for starting emulator on arm64 host. + if get_host_arch() == 'arm64': + + arm64_qemu_dir = os.path.join(SDK_ROOT, 'tools', 'arm64', + 'qemu_internal') + + # The arm64 emulator binaries are downloaded separately, so add + # a symlink to the expected location inside the SDK. + if not os.path.isdir(arm64_qemu_dir): + os.symlink( + os.path.join(SDK_ROOT, '..', '..', 'qemu-linux-arm64'), + arm64_qemu_dir) + + # Add the arm64 emulator binaries to the SDK's manifest.json file. + sdk_manifest = os.path.join(SDK_ROOT, 'meta', 'manifest.json') + with open(sdk_manifest, 'r+') as f: + data = json.load(f) + for part in data['parts']: + if part['meta'] == 'tools/x64/qemu_internal-meta.json': + part['meta'] = 'tools/arm64/qemu_internal-meta.json' + break + f.seek(0) + json.dump(data, f) + f.truncate() + + # Generate a meta file for the arm64 emulator binaries using its + # x64 counterpart. + qemu_arm64_meta_file = os.path.join(SDK_ROOT, 'tools', 'arm64', + 'qemu_internal-meta.json') + qemu_x64_meta_file = os.path.join(SDK_ROOT, 'tools', 'x64', + 'qemu_internal-meta.json') + with open(qemu_x64_meta_file) as f: + data = str(json.load(f)) + qemu_arm64_meta = data.replace(r'tools/x64', 'tools/arm64') + with open(qemu_arm64_meta_file, "w+") as f: + json.dump(ast.literal_eval(qemu_arm64_meta), f) + emu_command.extend(['--engine', 'qemu']) + + # Use a customized config file. + with tempfile.NamedTemporaryFile(mode='w+t') as f: + f.writelines(QEMU_ARM64_CONFIG) + f.flush() + emu_command.extend(('--config', f.name)) + run_ffx_command(emu_command) + else: + run_ffx_command(emu_command) + return self._node_name def __exit__(self, exc_type, exc_value, traceback) -> bool:
diff --git a/cc/metrics/compositor_frame_reporter.cc b/cc/metrics/compositor_frame_reporter.cc index ac39ecc5..9e4cb19 100644 --- a/cc/metrics/compositor_frame_reporter.cc +++ b/cc/metrics/compositor_frame_reporter.cc
@@ -96,6 +96,9 @@ // Number of stages of the current PipelineReporter constexpr int kNumOfStages = static_cast<int>(StageType::kStageTypeCount); +// Number of dispatch stages of the current EventLatency +constexpr int kNumDispatchStages = + static_cast<int>(EventMetrics::DispatchStage::kMaxValue) + 1; // Stores the weight of the most recent data point used in percentage when // predicting substages' latency. (It is stored and calculated in percentage // since TimeDelta calculate based on microseconds instead of nanoseconds, @@ -1285,6 +1288,82 @@ } } +void CompositorFrameReporter::SetEventLatencyPredictions( + std::vector<base::TimeDelta>& predicted_latencies) { + if (events_metrics_.empty()) + return; + + // TODO(crbug.com/1334827): Explore calculating predictions for multiple + // events. + auto& event_metrics = events_metrics_.front(); + + base::TimeTicks dispatch_start_time = + event_metrics->GetDispatchStageTimestamp( + EventMetrics::DispatchStage::kGenerated); + + // Determine the last valid stage in case kRendererMainFinished or + // kRendererCompositorFinished stages do not exist, otherwise there is not + // enough information for the prediction. + EventMetrics::DispatchStage last_valid_stage = + EventMetrics::DispatchStage::kGenerated; + if (event_metrics->GetDispatchStageTimestamp( + EventMetrics::DispatchStage::kRendererMainFinished) > + dispatch_start_time) { + last_valid_stage = EventMetrics::DispatchStage::kRendererMainFinished; + } else if (event_metrics->GetDispatchStageTimestamp( + EventMetrics::DispatchStage::kRendererCompositorFinished) > + dispatch_start_time) { + last_valid_stage = EventMetrics::DispatchStage::kRendererCompositorFinished; + } + + base::TimeTicks dispatch_end_time = + event_metrics->GetDispatchStageTimestamp(last_valid_stage); + base::TimeDelta total_dispatch_latency = + dispatch_end_time - dispatch_start_time; + if (total_dispatch_latency.is_negative()) + return; + + std::vector<base::TimeDelta> current_latencies(kNumDispatchStages, + base::Microseconds(-1)); + base::TimeTicks previous_timetick = dispatch_start_time; + for (auto stage = EventMetrics::DispatchStage::kGenerated; + stage <= last_valid_stage; + stage = static_cast<EventMetrics::DispatchStage>( + static_cast<int>(stage) + 1)) { + if (stage != EventMetrics::DispatchStage::kGenerated) { + base::TimeTicks current_timetick = + event_metrics->GetDispatchStageTimestamp(stage); + // Only update stage if the current_timetick is later than the + // previous_timetick. + if (current_timetick > previous_timetick) { + base::TimeDelta stage_duration = current_timetick - previous_timetick; + current_latencies[static_cast<int>(stage) - 1] = stage_duration; + previous_timetick = current_timetick; + } + } + } + current_latencies[kNumDispatchStages - 1] = total_dispatch_latency; + + // Calculate new predictions. + base::TimeDelta total_predicted_duration = base::Microseconds(0); + for (int i = 0; i < kNumDispatchStages - 1; i++) { + if (current_latencies[i].is_positive()) { + if (predicted_latencies[i].is_negative()) { + predicted_latencies[i] = current_latencies[i]; + } else { + predicted_latencies[i] = + (kWeightOfCurStageInPercent * current_latencies[i] + + (100 - kWeightOfCurStageInPercent) * predicted_latencies[i]) / + 100; + } + } + if (predicted_latencies[i].is_positive()) { + total_predicted_duration += predicted_latencies[i]; + } + } + predicted_latencies[kNumDispatchStages - 1] = total_predicted_duration; +} + void CompositorFrameReporter::SetPartialUpdateDecider( CompositorFrameReporter* decider) { DCHECK(decider);
diff --git a/cc/metrics/compositor_frame_reporter.h b/cc/metrics/compositor_frame_reporter.h index ec805643..78658f6f 100644 --- a/cc/metrics/compositor_frame_reporter.h +++ b/cc/metrics/compositor_frame_reporter.h
@@ -362,6 +362,11 @@ void CalculateStageLatencyPrediction( std::vector<base::TimeDelta>& previous_predictions); + // Sets EventLatency stage duration predictions based on previous trace + // durations using exponentially weighted averages. + void SetEventLatencyPredictions( + std::vector<base::TimeDelta>& predicted_latencies); + ReporterType get_reporter_type() { return reporter_type_; } void set_reporter_type_to_impl() { reporter_type_ = ReporterType::kImpl; }
diff --git a/cc/metrics/compositor_frame_reporter_unittest.cc b/cc/metrics/compositor_frame_reporter_unittest.cc index ed56a293..5ccbeb3 100644 --- a/cc/metrics/compositor_frame_reporter_unittest.cc +++ b/cc/metrics/compositor_frame_reporter_unittest.cc
@@ -85,6 +85,27 @@ return metrics; } + // Sets up the dispatch durations of each EventMetrics according to + // stage_durations. Stages with a duration of -1 will be skipped. + std::unique_ptr<EventMetrics> SetupEventMetricsWithDispatchTimes( + std::unique_ptr<EventMetrics> metrics, + const std::vector<int>& stage_durations) { + if (metrics) { + int num_stages = stage_durations.size(); + // Start indexing from 1 because the 0th index held duration from + // kGenerated to kArrivedInRendererCompositor, which was already used in + // when the EventMetrics was created. + for (int i = 1; i < num_stages; i++) { + if (stage_durations[i] >= 0) { + AdvanceNowByUs(stage_durations[i]); + metrics->SetDispatchStageTimestamp( + EventMetrics::DispatchStage(i + 1)); + } + } + } + return metrics; + } + std::unique_ptr<EventMetrics> CreateEventMetrics(ui::EventType type) { const base::TimeTicks event_time = AdvanceNowByUs(3); AdvanceNowByUs(3); @@ -92,6 +113,27 @@ EventMetrics::CreateForTesting(type, event_time, &test_tick_clock_)); } + // Creates EventMetrics with elements in stage_durations representing each + // dispatch stage's desired duration respectively, with the 0th index + // representing the duration from kGenerated to kArrivedInRendererCompositor. + // stage_durations must have at least 1 element for the first required stage + // Use -1 for stages that want to be skipped. + std::unique_ptr<EventMetrics> CreateScrollUpdateEventMetricsWithDispatchTimes( + bool is_inertial, + ScrollUpdateEventMetrics::ScrollUpdateType scroll_update_type, + const std::vector<int>& stage_durations) { + DCHECK_GT((int)stage_durations.size(), 0); + const base::TimeTicks event_time = AdvanceNowByUs(3); + AdvanceNowByUs(stage_durations[0]); + // Creates a kGestureScrollUpdate event. + return SetupEventMetricsWithDispatchTimes( + ScrollUpdateEventMetrics::CreateForTesting( + ui::ET_GESTURE_SCROLL_UPDATE, ui::ScrollInputType::kWheel, + is_inertial, scroll_update_type, /*delta=*/10.0f, event_time, + &test_tick_clock_), + stage_durations); + } + std::unique_ptr<EventMetrics> CreateScrollBeginMetrics() { const base::TimeTicks event_time = AdvanceNowByUs(3); AdvanceNowByUs(3); @@ -144,6 +186,16 @@ return reporter; } + std::vector<base::TimeDelta> IntToTimeDeltaVector( + std::vector<int> int_vector) { + std::vector<base::TimeDelta> timedelta_vector; + size_t vector_size = int_vector.size(); + for (size_t i = 0; i < vector_size; i++) { + timedelta_vector.push_back(base::Microseconds(int_vector[i])); + } + return timedelta_vector; + } + // This should be defined before |pipeline_reporter_| so it is created before // and destroyed after that. base::SimpleTestTickClock test_tick_clock_; @@ -926,5 +978,108 @@ pipeline_reporter_ = nullptr; } +// Tests that when a frame is presented to the user, event latency predictions +// are reported properly. +TEST_F(CompositorFrameReporterTest, EventLatencyDispatchPredictions) { + std::vector<int> dispatch_times = {300, 300, 300, 300, 300}; + std::unique_ptr<EventMetrics> event_metrics_ptrs[] = { + CreateScrollUpdateEventMetricsWithDispatchTimes( + false, ScrollUpdateEventMetrics::ScrollUpdateType::kContinued, + dispatch_times)}; + EXPECT_THAT(event_metrics_ptrs, Each(NotNull())); + EventMetrics::List events_metrics = { + std::make_move_iterator(std::begin(event_metrics_ptrs)), + std::make_move_iterator(std::end(event_metrics_ptrs))}; + pipeline_reporter_->AddEventsMetrics(std::move(events_metrics)); + + int kNumDispatchStages = + static_cast<int>(EventMetrics::DispatchStage::kMaxValue) + 1; + + // Test with no previous stage predictions. + std::vector<base::TimeDelta> expected_dispatch_predictions1 = + IntToTimeDeltaVector(std::vector<int>{300, 300, 300, 300, 300, 1500}); + std::vector<base::TimeDelta> actual_dispatch_predictions1( + kNumDispatchStages, base::Microseconds(-1)); + pipeline_reporter_->SetEventLatencyPredictions(actual_dispatch_predictions1); + + // Test with all previous stage predictions. + std::vector<base::TimeDelta> expected_dispatch_predictions2 = + IntToTimeDeltaVector(std::vector<int>{262, 300, 412, 225, 450, 1649}); + std::vector<base::TimeDelta> actual_dispatch_predictions2 = + IntToTimeDeltaVector(std::vector<int>{250, 300, 450, 200, 500, 1600}); + pipeline_reporter_->SetEventLatencyPredictions(actual_dispatch_predictions2); + + // Test with some previous stage predictions. + std::vector<base::TimeDelta> expected_dispatch_predictions3 = + IntToTimeDeltaVector(std::vector<int>{375, 450, 300, 300, 300, 1725}); + std::vector<base::TimeDelta> actual_dispatch_predictions3 = + IntToTimeDeltaVector(std::vector<int>{400, 500, 300, -1, -1, 1200}); + pipeline_reporter_->SetEventLatencyPredictions(actual_dispatch_predictions3); + + for (int i = 0; i < kNumDispatchStages; i++) { + EXPECT_EQ(expected_dispatch_predictions1[i], + actual_dispatch_predictions1[i]); + EXPECT_EQ(expected_dispatch_predictions2[i], + actual_dispatch_predictions2[i]); + EXPECT_EQ(expected_dispatch_predictions3[i], + actual_dispatch_predictions3[i]); + } + + pipeline_reporter_ = nullptr; +} + +// Tests that when a new frame with missing dispatch stages is presented to the +// user, event latency predictions are reported properly. +TEST_F(CompositorFrameReporterTest, + EventLatencyDispatchPredictionsWithMissingStages) { + // Invalid EventLatency stage durations will cause program to crash, validity + // checked in event_latency_tracing_recorder.cc. + std::vector<int> dispatch_times = {400, 600, 700, -1, -1}; + std::unique_ptr<EventMetrics> event_metrics_ptrs[] = { + CreateScrollUpdateEventMetricsWithDispatchTimes( + false, ScrollUpdateEventMetrics::ScrollUpdateType::kContinued, + dispatch_times)}; + EXPECT_THAT(event_metrics_ptrs, Each(NotNull())); + EventMetrics::List events_metrics = { + std::make_move_iterator(std::begin(event_metrics_ptrs)), + std::make_move_iterator(std::end(event_metrics_ptrs))}; + pipeline_reporter_->AddEventsMetrics(std::move(events_metrics)); + + int kNumDispatchStages = + static_cast<int>(EventMetrics::DispatchStage::kMaxValue) + 1; + + // Test with no previous stage predictions. + std::vector<base::TimeDelta> expected_dispatch_predictions1 = + IntToTimeDeltaVector(std::vector<int>{400, 600, 700, -1, -1, 1700}); + std::vector<base::TimeDelta> actual_dispatch_predictions1( + kNumDispatchStages, base::Microseconds(-1)); + pipeline_reporter_->SetEventLatencyPredictions(actual_dispatch_predictions1); + + // Test with all previous stage predictions. + std::vector<base::TimeDelta> expected_dispatch_predictions2 = + IntToTimeDeltaVector(std::vector<int>{250, 375, 475, 200, 500, 1800}); + std::vector<base::TimeDelta> actual_dispatch_predictions2 = + IntToTimeDeltaVector(std::vector<int>{200, 300, 400, 200, 500, 1600}); + pipeline_reporter_->SetEventLatencyPredictions(actual_dispatch_predictions2); + + // Test with some previous stage predictions. + std::vector<base::TimeDelta> expected_dispatch_predictions3 = + IntToTimeDeltaVector(std::vector<int>{400, 525, 745, -1, -1, 1670}); + std::vector<base::TimeDelta> actual_dispatch_predictions3 = + IntToTimeDeltaVector(std::vector<int>{400, 500, 760, -1, -1, 1660}); + pipeline_reporter_->SetEventLatencyPredictions(actual_dispatch_predictions3); + + for (int i = 0; i < kNumDispatchStages; i++) { + EXPECT_EQ(expected_dispatch_predictions1[i], + actual_dispatch_predictions1[i]); + EXPECT_EQ(expected_dispatch_predictions2[i], + actual_dispatch_predictions2[i]); + EXPECT_EQ(expected_dispatch_predictions3[i], + actual_dispatch_predictions3[i]); + } + + pipeline_reporter_ = nullptr; +} + } // namespace } // namespace cc
diff --git a/cc/metrics/compositor_frame_reporting_controller.cc b/cc/metrics/compositor_frame_reporting_controller.cc index aa12ca9..0aef643 100644 --- a/cc/metrics/compositor_frame_reporting_controller.cc +++ b/cc/metrics/compositor_frame_reporting_controller.cc
@@ -24,6 +24,8 @@ constexpr char kTraceCategory[] = "cc,benchmark"; constexpr int kNumOfStages = static_cast<int>(StageType::kStageTypeCount); +constexpr int kNumDispatchStages = + static_cast<int>(EventMetrics::DispatchStage::kMaxValue) + 1; } // namespace CompositorFrameReportingController::CompositorFrameReportingController( @@ -34,7 +36,9 @@ layer_tree_host_id_(layer_tree_host_id), latency_ukm_reporter_(std::make_unique<LatencyUkmReporter>()), previous_latency_predictions_main_(kNumOfStages, base::Microseconds(-1)), - previous_latency_predictions_impl_(kNumOfStages, base::Microseconds(-1)) { + previous_latency_predictions_impl_(kNumOfStages, base::Microseconds(-1)), + dispatch_latency_predictions_(kNumDispatchStages, + base::Microseconds(-1)) { if (should_report_ukm) { // UKM metrics should be reported if and only if `latency_ukm_reporter` is // set on `global_trackers_`. @@ -503,6 +507,10 @@ reporter->AddEventsMetrics(std::move(it->second)); } + // TODO(crbug.com/1334827): Consider using a separate container to + // differentiate event predictions with and without a main dispatch stage. + reporter->SetEventLatencyPredictions(dispatch_latency_predictions_); + // For presented frames, if `reporter` was cloned from another reporter, // and the original reporter is still alive, then check whether the cloned // reporter has a 'partial update decider'. It is still possible for the
diff --git a/cc/metrics/compositor_frame_reporting_controller.h b/cc/metrics/compositor_frame_reporting_controller.h index 07cb748..e0c50ee 100644 --- a/cc/metrics/compositor_frame_reporting_controller.h +++ b/cc/metrics/compositor_frame_reporting_controller.h
@@ -241,6 +241,10 @@ // on impl and main reporter's previous frames. std::vector<base::TimeDelta> previous_latency_predictions_main_; std::vector<base::TimeDelta> previous_latency_predictions_impl_; + + // Container that stores the EventLatency dispatch stage latency predictions + // based on previous event traces. + std::vector<base::TimeDelta> dispatch_latency_predictions_; }; } // namespace cc
diff --git a/cc/trees/draw_property_utils.cc b/cc/trees/draw_property_utils.cc index 014ab90..21943ad 100644 --- a/cc/trees/draw_property_utils.cc +++ b/cc/trees/draw_property_utils.cc
@@ -1521,13 +1521,14 @@ void UpdatePageScaleFactor(PropertyTrees* property_trees, TransformNode* page_scale_node, float page_scale_factor) { + // TODO(wjmaclean): Once Issue #845097 is resolved, we can change the nullptr + // check below to a DCHECK. if (property_trees->transform_tree().page_scale_factor() == - page_scale_factor) { + page_scale_factor || + !page_scale_node) { return; } - DCHECK(page_scale_node); - property_trees->transform_tree_mutable().set_page_scale_factor( page_scale_factor);
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc index 6c695fa0..e40fd58 100644 --- a/cc/trees/layer_tree_host.cc +++ b/cc/trees/layer_tree_host.cc
@@ -1399,6 +1399,14 @@ return; DCHECK_GE(page_scale_factor, min_page_scale_factor); DCHECK_LE(page_scale_factor, max_page_scale_factor); + // We should never process non-unit page_scale_delta for an OOPIF subframe. + // TODO(wjmaclean): Remove this dcheck as a pre-condition to closing the bug. + // https://crbug.com/845097 + DCHECK(settings_.is_for_scalable_page || + page_scale_factor == pending_commit_state()->page_scale_factor) + << "Setting PSF in oopif subframe: old psf = " + << pending_commit_state()->page_scale_factor + << ", new psf = " << page_scale_factor; pending_commit_state()->page_scale_factor = page_scale_factor; pending_commit_state()->min_page_scale_factor = min_page_scale_factor; @@ -1606,6 +1614,14 @@ void LayerTreeHost::SetPageScaleFromImplSide(float page_scale) { DCHECK(syncing_deltas_for_test_ || CommitRequested()); + // We should never process non-unit page_scale_delta for an OOPIF subframe. + // TODO(wjmaclean): Remove this check as a pre-condition to closing the bug. + // https://crbug.com/845097 + DCHECK(settings_.is_for_scalable_page || + page_scale == pending_commit_state()->page_scale_factor) + << "Setting PSF in oopif subframe: old psf = " + << pending_commit_state()->page_scale_factor + << ", new psf = " << page_scale; pending_commit_state()->page_scale_factor = page_scale; SetPropertyTreesNeedRebuild(); }
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index 7a3d5f6..6a148c3 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc
@@ -4130,6 +4130,8 @@ commit_data->is_scroll_active = input_delegate_ && GetInputHandler().IsCurrentlyScrolling(); // We should never process non-unit page_scale_delta for an OOPIF subframe. + // TODO(wjmaclean): Remove this DCHECK as a pre-condition to closing the bug. + // https://crbug.com/845097 DCHECK(settings().is_for_scalable_page || commit_data->page_scale_delta == 1.f); commit_data->top_controls_delta =
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc index a9969f5..dfd7e261 100644 --- a/cc/trees/layer_tree_impl.cc +++ b/cc/trees/layer_tree_impl.cc
@@ -1210,6 +1210,17 @@ DCHECK(IsActiveTree()); DCHECK(lifecycle().AllowsPropertyTreeAccess()); float clamped_page_scale = ClampPageScaleFactorToLimits(active_page_scale); + // Temporary crash logging for https://crbug.com/845097. + static bool has_dumped_without_crashing = false; + if (!host_impl_->settings().is_for_scalable_page && + clamped_page_scale != 1.f && !has_dumped_without_crashing) { + has_dumped_without_crashing = true; + static auto* psf_oopif_error = base::debug::AllocateCrashKeyString( + "psf_oopif_error", base::debug::CrashKeySize::Size32); + base::debug::SetCrashKeyString( + psf_oopif_error, base::StringPrintf("%f", clamped_page_scale)); + base::debug::DumpWithoutCrashing(); + } if (page_scale_factor()->SetCurrent(clamped_page_scale)) DidUpdatePageScale(); }
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilitiesUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilitiesUnitTest.java index 8199bf4a..a596bbb 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilitiesUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilitiesUnitTest.java
@@ -24,6 +24,7 @@ import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.chrome.browser.device.DeviceClassManager; import org.chromium.chrome.browser.flags.CachedFeatureFlags; +import org.chromium.chrome.browser.flags.CachedFlag; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.util.ChromeAccessibilityUtil; import org.chromium.chrome.test.util.browser.Features; @@ -69,9 +70,9 @@ } private void cacheFeatureFlags() { - List<String> featuresToCache = Arrays.asList(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, - ChromeFeatureList.TAB_GROUPS_ANDROID, - ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID); + List<CachedFlag> featuresToCache = Arrays.asList(ChromeFeatureList.sTabGridLayoutAndroid, + ChromeFeatureList.sTabGroupsAndroid, + ChromeFeatureList.sTabGroupsContinuationAndroid); CachedFeatureFlags.cacheNativeFlags(featuresToCache); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java b/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java index b16ac6c..d873d15 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java
@@ -14,6 +14,7 @@ import org.chromium.chrome.browser.firstrun.FirstRunUtils; import org.chromium.chrome.browser.flags.CachedFeatureFlags; import org.chromium.chrome.browser.flags.CachedFieldTrialParameter; +import org.chromium.chrome.browser.flags.CachedFlag; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.notifications.chime.ChimeFeatures; import org.chromium.chrome.browser.optimization_guide.OptimizationGuidePushNotificationManager; @@ -67,57 +68,57 @@ FirstRunUtils.cacheFirstRunPrefs(); // Workaround for crbug.com/1223545: Do not use Arrays.asList(). - List<String> featuresToCache = new ArrayList<String>() { + List<CachedFlag> featuresToCache = new ArrayList<CachedFlag>() { { - add(ChromeFeatureList.ANONYMOUS_UPDATE_CHECKS); - add(ChromeFeatureList.APP_MENU_MOBILE_SITE_OPTION); - add(ChromeFeatureList.BACK_GESTURE_REFACTOR); - add(ChromeFeatureList.CCT_INCOGNITO); - add(ChromeFeatureList.CCT_INCOGNITO_AVAILABLE_TO_THIRD_PARTY); - add(ChromeFeatureList.CCT_REMOVE_REMOTE_VIEW_IDS); - add(ChromeFeatureList.CCT_RESIZABLE_90_MAXIMUM_HEIGHT); - add(ChromeFeatureList.CCT_RESIZABLE_ALLOW_RESIZE_BY_USER_GESTURE); - add(ChromeFeatureList.CCT_RESIZABLE_FOR_FIRST_PARTIES); - add(ChromeFeatureList.CCT_RESIZABLE_FOR_THIRD_PARTIES); - add(ChromeFeatureList.CCT_TOOLBAR_CUSTOMIZATIONS); - add(ChromeFeatureList.CLOSE_TAB_SUGGESTIONS); - add(ChromeFeatureList.CREATE_SAFEBROWSING_ON_STARTUP); - add(ChromeFeatureList.CRITICAL_PERSISTED_TAB_DATA); - add(ChromeFeatureList.COMMAND_LINE_ON_NON_ROOTED); - add(ChromeFeatureList.CONDITIONAL_TAB_STRIP_ANDROID); - add(ChromeFeatureList.DOWNLOADS_AUTO_RESUMPTION_NATIVE); - add(ChromeFeatureList.DYNAMIC_COLOR_ANDROID); - add(ChromeFeatureList.DYNAMIC_COLOR_BUTTONS_ANDROID); - add(ChromeFeatureList.EARLY_LIBRARY_LOAD); - add(ChromeFeatureList.ELASTIC_OVERSCROLL); - add(ChromeFeatureList.ELIDE_PRIORITIZATION_OF_PRE_NATIVE_BOOTSTRAP_TASKS); - add(ChromeFeatureList.FEED_LOADING_PLACEHOLDER); - add(ChromeFeatureList.GRID_TAB_SWITCHER_FOR_TABLETS); - add(ChromeFeatureList.IMMERSIVE_UI_MODE); - add(ChromeFeatureList.INCOGNITO_REAUTHENTICATION_FOR_ANDROID); - add(ChromeFeatureList.INSTANT_START); - add(ChromeFeatureList.INSTANCE_SWITCHER); - add(ChromeFeatureList.INTEREST_FEED_V2); - add(ChromeFeatureList.NEW_WINDOW_APP_MENU); - add(ChromeFeatureList.OMNIBOX_ANDROID_AUXILIARY_SEARCH); - add(ChromeFeatureList.OPTIMIZATION_GUIDE_PUSH_NOTIFICATIONS); - add(ChromeFeatureList.PAINT_PREVIEW_DEMO); - add(ChromeFeatureList.PAINT_PREVIEW_SHOW_ON_STARTUP); - add(ChromeFeatureList.READ_LATER); - add(ChromeFeatureList.START_SURFACE_ANDROID); - add(ChromeFeatureList.START_SURFACE_REFACTOR); - add(ChromeFeatureList.STORE_HOURS); - add(ChromeFeatureList.SWAP_PIXEL_FORMAT_TO_FIX_CONVERT_FROM_TRANSLUCENT); - add(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID); - add(ChromeFeatureList.TAB_GROUPS_ANDROID); - add(ChromeFeatureList.TAB_GROUPS_FOR_TABLETS); - add(ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID); - add(ChromeFeatureList.TAB_TO_GTS_ANIMATION); - add(ChromeFeatureList.TAB_STRIP_IMPROVEMENTS); - add(ChromeFeatureList.TOOLBAR_USE_HARDWARE_BITMAP_DRAW); - add(ChromeFeatureList.TRUSTED_WEB_ACTIVITY_NOTIFICATION_PERMISSION_DELEGATION); - add(ChromeFeatureList.USE_CHIME_ANDROID_SDK); - add(ChromeFeatureList.WEB_APK_TRAMPOLINE_ON_INITIAL_INTENT); + add(ChromeFeatureList.sAndroidAuxiliarySearch); + add(ChromeFeatureList.sAnonymousUpdateChecks); + add(ChromeFeatureList.sAppMenuMobileSiteOption); + add(ChromeFeatureList.sBackGestureRefactorAndroid); + add(ChromeFeatureList.sCctIncognito); + add(ChromeFeatureList.sCctIncognitoAvailableToThirdParty); + add(ChromeFeatureList.sCctRemoveRemoteViewIds); + add(ChromeFeatureList.sCctResizable90MaximumHeight); + add(ChromeFeatureList.sCctResizableAllowResizeByUserGesture); + add(ChromeFeatureList.sCctResizableForFirstParties); + add(ChromeFeatureList.sCctResizableForThirdParties); + add(ChromeFeatureList.sCctToolbarCustomizations); + add(ChromeFeatureList.sCloseTabSuggestions); + add(ChromeFeatureList.sCommandLineOnNonRooted); + add(ChromeFeatureList.sConditionalTabStripAndroid); + add(ChromeFeatureList.sCreateSafebrowsingOnStartup); + add(ChromeFeatureList.sCriticalPersistedTabData); + add(ChromeFeatureList.sDownloadsAutoResumptionNative); + add(ChromeFeatureList.sDynamicColorAndroid); + add(ChromeFeatureList.sDynamicColorButtonsAndroid); + add(ChromeFeatureList.sEarlyLibraryLoad); + add(ChromeFeatureList.sElasticOverscroll); + add(ChromeFeatureList.sElidePrioritizationOfPreNativeBootstrapTasks); + add(ChromeFeatureList.sFeedLoadingPlaceholder); + add(ChromeFeatureList.sGridTabSwitcherForTablets); + add(ChromeFeatureList.sImmersiveUiMode); + add(ChromeFeatureList.sIncognitoReauthenticationForAndroid); + add(ChromeFeatureList.sInstanceSwitcher); + add(ChromeFeatureList.sInstantStart); + add(ChromeFeatureList.sInterestFeedV2); + add(ChromeFeatureList.sNewWindowAppMenu); + add(ChromeFeatureList.sOptimizationGuidePushNotifications); + add(ChromeFeatureList.sPaintPreviewDemo); + add(ChromeFeatureList.sPaintPreviewShowOnStartup); + add(ChromeFeatureList.sReadLater); + add(ChromeFeatureList.sStartSurfaceAndroid); + add(ChromeFeatureList.sStartSurfaceRefactor); + add(ChromeFeatureList.sStoreHoursAndroid); + add(ChromeFeatureList.sSwapPixelFormatToFixConvertFromTranslucent); + add(ChromeFeatureList.sTabGridLayoutAndroid); + add(ChromeFeatureList.sTabGroupsAndroid); + add(ChromeFeatureList.sTabGroupsContinuationAndroid); + add(ChromeFeatureList.sTabGroupsForTablets); + add(ChromeFeatureList.sTabStripImprovements); + add(ChromeFeatureList.sTabToGTSAnimation); + add(ChromeFeatureList.sToolbarUseHardwareBitmapDraw); + add(ChromeFeatureList.sTrustedWebActivityNotificationPermissionDelegation); + add(ChromeFeatureList.sUseChimeAndroidSdk); + add(ChromeFeatureList.sWebApkTrampolineOnInitialIntent); } }; CachedFeatureFlags.cacheNativeFlags(featuresToCache); @@ -214,8 +215,8 @@ CachedFeatureFlags.cacheMinimalBrowserFlagsTimeFromNativeTime(); // TODO(crbug.com/995355): Move other related flags from cacheNativeFlags() to here. - List<String> featuresToCache = new ArrayList<String>() { - { add(ChromeFeatureList.EXPERIMENTS_FOR_AGSA); } + List<CachedFlag> featuresToCache = new ArrayList<CachedFlag>() { + { add(ChromeFeatureList.sExperimentsForAgsa); } }; CachedFeatureFlags.cacheNativeFlags(featuresToCache);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/ScrollingStripStacker.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/ScrollingStripStacker.java index 49a339e..9caa2b6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/ScrollingStripStacker.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/ScrollingStripStacker.java
@@ -26,7 +26,7 @@ if (tabStripImpEnabled) { // When a tab is closed, drawX and width update will be animated so skip this. if (!tabClosing) { - tab.setDrawX(tab.getIdealX()); + tab.setDrawX(tab.getIdealX() + tab.getOffsetX()); tab.setWidth(cachedTabWidth); } } else {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java index b1c8c51..eca9d90 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java
@@ -97,8 +97,6 @@ private static final float TAB_STACK_WIDTH_DP = 4.f; private static final float TAB_OVERLAP_WIDTH_DP = 24.f; private static final float MAX_TAB_WIDTH_DP = 265.f; - // TODO(crbug.com/1308815): Replace placeholder value when specs are finalized. - private static final float TAB_MARGIN_WIDTH_DP = 76.f; private static final float REORDER_MOVE_START_THRESHOLD_DP = 50.f; private static final float REORDER_EDGE_SCROLL_MAX_SPEED_DP = 1000.f; private static final float REORDER_EDGE_SCROLL_START_MIN_DP = 87.4f; @@ -144,7 +142,6 @@ // Layout Constants private final float mTabOverlapWidth; - private final float mTabMarginWidth; private final float mNewTabButtonWidth; private final float mMinTabWidth; private final float mMaxTabWidth; @@ -161,6 +158,7 @@ private int mReorderState = REORDER_SCROLL_NONE; private boolean mInReorderMode; private float mLastReorderX; + private float mTabMarginWidth; private long mLastReorderScrollTime; // Tab switch efficiency @@ -208,7 +206,6 @@ public StripLayoutHelper(Context context, LayoutUpdateHost updateHost, LayoutRenderHost renderHost, boolean incognito, CompositorButton modelSelectorButton) { mTabOverlapWidth = TAB_OVERLAP_WIDTH_DP; - mTabMarginWidth = TAB_MARGIN_WIDTH_DP; mNewTabButtonWidth = NEW_TAB_BUTTON_WIDTH_DP; mModelSelectorButton = modelSelectorButton; mTabStripImpEnabled = @@ -1669,7 +1666,7 @@ @VisibleForTesting public void startReorderModeAtIndexForTesting(int index) { StripLayoutTab tab = mStripTabs[index]; - computeTabInitialPositions(); + updateStrip(); startReorderMode(0L, 0f, tab.getDrawX() + (tab.getWidth() / 2)); } @@ -1695,6 +1692,7 @@ mLastReorderScrollTime = 0; mReorderState = REORDER_SCROLL_NONE; mLastReorderX = startX; + mTabMarginWidth = mCachedTabWidth / 2; mInReorderMode = true; // 4. Select this tab so that it is always in the foreground. @@ -1709,7 +1707,7 @@ mScroller.startScroll( mScrollOffset, 0, (int) fastExpandDelta, 0, time, getExpandDuration()); } else if (isTabManagementImprovementsEnabled()) { - computeAndUpdateTabGroupMargins(); + computeAndUpdateTabGroupMargins(true); } // 6. Request an update. @@ -1739,8 +1737,8 @@ mUpdateHost.requestUpdate(); } - private void computeAndUpdateTabGroupMargins() { - // 1. Calculate and set the trailing margins for each tab. + private void computeAndUpdateTabGroupMargins(boolean autoScroll) { + // 1.a. Calculate and set the trailing margins for each tab. // TODO(crbug.com/1308812): Replace with equivalent animation. for (int i = 0; i < mStripTabs.length - 1; i++) { StripLayoutTab stripTab = mStripTabs[i]; @@ -1755,12 +1753,16 @@ if (eitherTabInAGroup && !areRelatedTabs) { mStripTabs[i].setTrailingMargin(mTabMarginWidth); + } else { + mStripTabs[i].setTrailingMargin(0f); } } + // 1.b. TODO(crbug.com/1330737): Set starting and trailing margin for tab strip. + // 2. Compute the new tab positions and adjust the scroll offset accordingly to prevent the // interacting tab from shifting away from where the user long-pressed. - updateScrollOffsetForMargins(); + updateScrollOffsetForMargins(autoScroll); } private void resetTabGroupMargins() { @@ -1772,16 +1774,44 @@ // 2. Compute the new tab positions and attempt to adjust the scroll offset accordingly to // prevent the interacting tab from shifting away from where the user long-pressed. - updateScrollOffsetForMargins(); + updateScrollOffsetForMargins(true); } - private void updateScrollOffsetForMargins() { + private void updateScrollOffsetForMargins(boolean autoScroll) { // TODO(crbug.com/1308812): Replace with equivalent animation. float oldIdealX = mInteractingTab.getIdealX(); computeTabInitialPositions(); - int scrollDelta = (int) (mInteractingTab.getIdealX() - oldIdealX); - mScrollOffset -= MathUtils.flipSignIf(scrollDelta, LocalizationUtils.isLayoutRtl()); - updateScrollOffsetLimits(); + if (autoScroll) { + int scrollDelta = (int) (mInteractingTab.getIdealX() - oldIdealX); + mScrollOffset -= MathUtils.flipSignIf(scrollDelta, LocalizationUtils.isLayoutRtl()); + updateScrollOffsetLimits(); + } + } + + private int maybeMoveOutOfGroup(float offset, int curIndex) { + if (Math.abs(offset) > mTabMarginWidth * REORDER_OVERLAP_SWITCH_PERCENTAGE) { + mTabGroupModelFilter.moveTabOutOfGroupInDirection(mInteractingTab.getId(), offset > 0); + return curIndex; + } + + return TabModel.INVALID_TAB_INDEX; + } + + private int maybeMovePastGroup(float offset, int curIndex, boolean towardEnd) { + int direction = towardEnd ? 1 : -1; + int groupId = mTabGroupModelFilter.getRootId( + getTabById(mStripTabs[curIndex + direction].getId())); + int numTabsToSkip = mTabGroupModelFilter.getRelatedTabCountForRootId(groupId); + float effectiveTabWidth = mCachedTabWidth - mTabOverlapWidth; + float threshold = (numTabsToSkip * effectiveTabWidth) + mTabMarginWidth + + (REORDER_OVERLAP_SWITCH_PERCENTAGE * mTabMarginWidth); + + if (Math.abs(offset) > threshold) { + int destIndex = towardEnd ? curIndex + 1 + numTabsToSkip : curIndex - numTabsToSkip; + return destIndex; + } + + return TabModel.INVALID_TAB_INDEX; } private void updateReorderPosition(float deltaX) { @@ -1796,39 +1826,74 @@ // 2. Check if we should swap tabs and track the new destination index. int destIndex = TabModel.INVALID_TAB_INDEX; - boolean pastLeftThreshold = offset < -flipThreshold; - boolean pastRightThreshold = offset > flipThreshold; - boolean isNotRightMost = curIndex < mStripTabs.length - 1; - boolean isNotLeftMost = curIndex > 0; + boolean isFirstTab = curIndex == 0; + boolean towardEnd = (offset >= 0) ^ LocalizationUtils.isLayoutRtl(); + boolean tabManagementImprovementsEnabled = + TabUiFeatureUtilities.isTabletTabManagementImprovementsEnabled(mContext); + boolean isInGroup = tabManagementImprovementsEnabled + && mTabGroupModelFilter.hasOtherRelatedTabs(getTabById(mInteractingTab.getId())); + boolean approachingMargin = tabManagementImprovementsEnabled && towardEnd + ? mInteractingTab.getTrailingMargin() > 0f + : (!isFirstTab && mStripTabs[curIndex - 1].getTrailingMargin() > 0f); - if (LocalizationUtils.isLayoutRtl()) { - boolean oldLeft = pastLeftThreshold; - pastLeftThreshold = pastRightThreshold; - pastRightThreshold = oldLeft; - } + if (approachingMargin) { + if (isInGroup) { + // 2.a. Tab is in a group and approaching a margin. Maybe drag out of group. + destIndex = maybeMoveOutOfGroup(offset, curIndex); + } else { + // 2.b. Tab is not in a group and approaching a margin. Maybe target tab group. + // TODO(crbug.com/1330740): Update internal hovering state. - if (pastRightThreshold && isNotRightMost) { - destIndex = curIndex + 2; - } else if (pastLeftThreshold && isNotLeftMost) { - destIndex = curIndex - 1; + // 2.c. Tab is not in a group and approaching a margin. Maybe drag past group. + destIndex = maybeMovePastGroup(offset, curIndex, towardEnd); + } + } else { + // 2.d Tab is not interacting with tab groups. Reorder as normal. + boolean pastLeftThreshold = offset < -flipThreshold; + boolean pastRightThreshold = offset > flipThreshold; + boolean isNotRightMost = curIndex < mStripTabs.length - 1; + boolean isNotLeftMost = curIndex > 0; + + if (LocalizationUtils.isLayoutRtl()) { + boolean oldLeft = pastLeftThreshold; + pastLeftThreshold = pastRightThreshold; + pastRightThreshold = oldLeft; + } + + if (pastRightThreshold && isNotRightMost) { + destIndex = curIndex + 2; + } else if (pastLeftThreshold && isNotLeftMost) { + destIndex = curIndex - 1; + } } // 3. If we should swap tabs, make the swap. if (destIndex != TabModel.INVALID_TAB_INDEX) { - // 3.a. Since we're about to move the tab we're dragging, adjust it's offset so it - // stays in the same apparent position. - boolean shouldFlip = - LocalizationUtils.isLayoutRtl() ? destIndex < curIndex : destIndex > curIndex; - offset += MathUtils.flipSignIf(flipWidth, shouldFlip); - - // 3.b. Swap the tabs. + // 3.a. Swap the tabs. reorderTab(mInteractingTab.getId(), curIndex, destIndex, true); mModel.moveTab(mInteractingTab.getId(), destIndex); - // 3.c. Update our curIndex as we have just moved the tab. - curIndex += destIndex > curIndex ? 1 : -1; + // 3.b. Re-compute tab group margins if necessary. + float oldIdealX = mInteractingTab.getIdealX(); + if (tabManagementImprovementsEnabled) computeAndUpdateTabGroupMargins(false); - // 3.d. Update visual tab ordering. + // 3.c. Since we just moved the tab we're dragging, adjust its offset so it stays in + // the same apparent position. + if (approachingMargin) { + offset -= (mInteractingTab.getIdealX() - oldIdealX); + // When the strip is scrolling, deltaX is already accounted for by idealX. This is + // because idealX uses the scroll offset which has already been adjusted by deltaX. + if (mLastReorderScrollTime != 0) offset -= deltaX; + } else { + boolean shouldFlip = LocalizationUtils.isLayoutRtl() ? destIndex < curIndex + : destIndex > curIndex; + offset += MathUtils.flipSignIf(flipWidth, shouldFlip); + } + + // 3.d. Update our curIndex as we have just moved the tab. + curIndex = destIndex > curIndex ? destIndex - 1 : destIndex; + + // 3.e. Update visual tab ordering. updateVisualTabOrdering(); } @@ -1859,25 +1924,31 @@ // this case because we probably just already moved it. if (mInReorderMode && index != oldIndex && tab == mInteractingTab) return; - // 3. Swap the tabs. - moveElement(mStripTabs, index, newIndex); - - // 4. Update newIndex to point to the proper element. - if (index < newIndex) newIndex--; - - // 5. Animate if necessary. + // 3. Animate if necessary. if (animate && !mAnimationsDisabledForTesting) { + final boolean towardEnd = oldIndex <= newIndex; final float flipWidth = mCachedTabWidth - mTabOverlapWidth; - final int direction = oldIndex <= newIndex ? 1 : -1; + final int direction = towardEnd ? 1 : -1; final float animationLength = MathUtils.flipSignIf(direction * flipWidth, LocalizationUtils.isLayoutRtl()); - StripLayoutTab slideTab = mStripTabs[newIndex - direction]; finishAnimationsAndPushTabUpdates(); - mRunningAnimator = CompositorAnimator.ofFloatProperty(mUpdateHost.getAnimationHandler(), - slideTab, StripLayoutTab.X_OFFSET, animationLength, 0f, ANIM_TAB_MOVE_MS); + ArrayList<Animator> slideAnimationList = new ArrayList<>(); + for (int i = oldIndex + direction; towardEnd == i < newIndex; i += direction) { + StripLayoutTab slideTab = mStripTabs[i]; + CompositorAnimator animator = CompositorAnimator.ofFloatProperty( + mUpdateHost.getAnimationHandler(), slideTab, StripLayoutTab.X_OFFSET, + animationLength, 0f, ANIM_TAB_MOVE_MS); + slideAnimationList.add(animator); + } + AnimatorSet set = new AnimatorSet(); + set.playTogether(slideAnimationList); + mRunningAnimator = set; mRunningAnimator.start(); } + + // 4. Swap the tabs. + moveElement(mStripTabs, index, newIndex); } private void handleReorderAutoScrolling(long time) { @@ -2278,6 +2349,11 @@ return mInReorderMode; } + @VisibleForTesting + protected float getLastReorderX() { + return mLastReorderX; + } + private void setAccessibilityDescription(StripLayoutTab stripTab, Tab tab) { if (tab != null) setAccessibilityDescription(stripTab, tab.getTitle(), tab.isHidden()); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java index 457e436..8ce3b89 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java
@@ -303,7 +303,7 @@ QueryState queryState = TextUtils.isEmpty(historyClustersQuery) ? QueryState.forQueryless() : QueryState.forQuery(historyClustersQuery, getSearchEmptyString()); - mHistoryClustersCoordinator.setQueryState(queryState); + mHistoryClustersCoordinator.setInitialQuery(queryState); } else { mContentView = mSelectableListLayout; } @@ -485,8 +485,9 @@ return; } else if (mContentView == mSelectableListLayout && mHistoryClustersCoordinator != null) { mContentView = mHistoryClustersCoordinator.getActivityContentView(); - mHistoryClustersCoordinator.setQueryState(QueryState.forQueryless()); + mHistoryClustersCoordinator.onToggled(true); } else { + mHistoryClustersCoordinator.onToggled(false); mContentView = mSelectableListLayout; mContentManager.startLoadingItems(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/segmentation_platform/ContextualPageActionController.java b/chrome/android/java/src/org/chromium/chrome/browser/segmentation_platform/ContextualPageActionController.java index 29cb347..7c16922 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/segmentation_platform/ContextualPageActionController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/segmentation_platform/ContextualPageActionController.java
@@ -43,14 +43,20 @@ mAdaptiveToolbarButtonController = adaptiveToolbarButtonController; profileSupplier.addObserver(profile -> { if (profile.isOffTheRecord()) return; + + // The profile supplier observer will be invoked every time the profile is changed. + // Ignore the subsequent calls since we are only interested in initializing tab + // observers once. + if (mCurrentTabObserver != null) return; + if (!AdaptiveToolbarFeatures.isContextualPageActionsEnabled()) return; // TODO(shaktisahu): Observe the right method to handle tab switch, same-page // navigations. Also handle chrome:// URLs if not already handled. mCurrentTabObserver = new CurrentTabObserver(tabSupplier, new EmptyTabObserver() { @Override - public void didFirstVisuallyNonEmptyPaint(Tab tab) { - maybeShowContextualPageAction(); + public void onPageLoadFinished(Tab tab, GURL url) { + if (tab != null) maybeShowContextualPageAction(); } }, this::activeTabChanged); }); @@ -62,16 +68,22 @@ } private void activeTabChanged(Tab tab) { - maybeShowContextualPageAction(); + // If the tab is loading or if it's going to load later then we'll also get a call to + // onPageLoadFinished. + if (tab != null && !tab.isLoading() && !tab.isFrozen()) { + maybeShowContextualPageAction(); + } } private void maybeShowContextualPageAction() { Tab tab = mTabSupplier.get(); // TODO(shaktisahu): Maybe hide the action. - if (tab == null) return; + if (tab == null || tab.isIncognito() || tab.isDestroyed()) return; + ContextualPageActionControllerJni.get().computeContextualPageAction( mProfileSupplier.get(), tab.getUrl(), result -> { - if (tab.isDestroyed() || tab.isHidden()) return; + if (tab.isDestroyed()) return; + boolean isSameTab = mTabSupplier.get() != null && mTabSupplier.get().getId() == tab.getId(); if (!isSameTab) return;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileRenderer.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileRenderer.java index dc3a623..fd34d73 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileRenderer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileRenderer.java
@@ -27,6 +27,7 @@ import org.chromium.chrome.browser.explore_sites.ExploreSitesBridge; import org.chromium.chrome.browser.explore_sites.ExploreSitesIPH; import org.chromium.chrome.browser.feature_engagement.TrackerFactory; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; import org.chromium.chrome.browser.suggestions.ImageFetcher; @@ -238,6 +239,9 @@ /** @return True, if the tile represents a Search query. */ private boolean isSearchTile(Tile tile) { + if (!ChromeFeatureList.isEnabled(ChromeFeatureList.HISTORY_ORGANIC_REPEATABLE_QUERIES)) { + return false; + } TemplateUrlService searchService = TemplateUrlServiceFactory.get(); return searchService != null && searchService.isSearchResultsPageFromDefaultSearchProvider(tile.getUrl());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java index e158640d..6507324e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java
@@ -597,17 +597,11 @@ } @Override - // The string passed is safe since it is class and method name. - @SuppressWarnings("NoDynamicStringsInTraceEventCheck") public void stopLoading() { if (isLoading()) { RewindableIterator<TabObserver> observers = getTabObservers(); while (observers.hasNext()) { - TabObserver observer = observers.next(); - String s = "TabImpl::stopLoading observer:" + observer.getClass().getName(); - try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { - observer.onPageLoadFinished(this, getUrl()); - } + observers.next().onPageLoadFinished(this, getUrl()); } } if (getWebContents() != null) getWebContents().stop(); @@ -1025,33 +1019,19 @@ * @param toDifferentDocument Whether this navigation will transition between * documents (i.e., not a fragment navigation or JS History API call). */ - // The string passed is safe since it is class and method name. - @SuppressWarnings("NoDynamicStringsInTraceEventCheck") void onLoadStarted(boolean toDifferentDocument) { if (toDifferentDocument) mIsLoading = true; - for (TabObserver observer : mObservers) { - String s = "TabImpl::onLoadStarted observer:" + observer.getClass().getName(); - try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { - observer.onLoadStarted(this, toDifferentDocument); - } - } + for (TabObserver observer : mObservers) observer.onLoadStarted(this, toDifferentDocument); } /** * Called when a navigation completes and no other navigation is in progress. */ - // The string passed is safe since it is class and method name. - @SuppressWarnings("NoDynamicStringsInTraceEventCheck") void onLoadStopped() { // mIsLoading should only be false if this is a same-document navigation. boolean toDifferentDocument = mIsLoading; mIsLoading = false; - for (TabObserver observer : mObservers) { - String s = "TabImpl::onLoadStopped observer:" + observer.getClass().getName(); - try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { - observer.onLoadStopped(this, toDifferentDocument); - } - } + for (TabObserver observer : mObservers) observer.onLoadStopped(this, toDifferentDocument); } void handleRendererResponsiveStateChanged(boolean isResponsive) { @@ -1067,16 +1047,11 @@ * Called when a page has started loading. * @param validatedUrl URL being loaded. */ - // The string passed is safe since it is class and method name. - @SuppressWarnings("NoDynamicStringsInTraceEventCheck") void didStartPageLoad(GURL validatedUrl) { updateTitle(); if (mIsRendererUnresponsive) handleRendererResponsiveStateChanged(true); for (TabObserver observer : mObservers) { - String s = "TabImpl::didStartPageLoad observer:" + observer.getClass().getName(); - try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { - observer.onPageLoadStarted(this, validatedUrl); - } + observer.onPageLoadStarted(this, validatedUrl); } } @@ -1084,17 +1059,10 @@ * Called when a page has finished loading. * @param url URL that was loaded. */ - // The string passed is safe since it is class and method name. - @SuppressWarnings("NoDynamicStringsInTraceEventCheck") void didFinishPageLoad(GURL url) { updateTitle(); - for (TabObserver observer : mObservers) { - String s = "TabImpl::didFinishPageLoad observer:" + observer.getClass().getName(); - try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { - observer.onPageLoadFinished(this, url); - } - } + for (TabObserver observer : mObservers) observer.onPageLoadFinished(this, url); mIsBeingRestored = false; } @@ -1126,15 +1094,8 @@ * Notify the observers that the load progress has changed. * @param progress The current percentage of progress. */ - // The string passed is safe since it is class and method name. - @SuppressWarnings("NoDynamicStringsInTraceEventCheck") void notifyLoadProgress(float progress) { - for (TabObserver observer : mObservers) { - String s = "TabImpl::notifyLoadProgress observer:" + observer.getClass().getName(); - try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { - observer.onLoadProgressChanged(this, progress); - } - } + for (TabObserver observer : mObservers) observer.onLoadProgressChanged(this, progress); } /** @@ -1216,15 +1177,8 @@ /** * Calls onContentChanged on all TabObservers and updates accessibility visibility. */ - // The string passed is safe since it is class and method name. - @SuppressWarnings("NoDynamicStringsInTraceEventCheck") void notifyContentChanged() { - for (TabObserver observer : mObservers) { - String s = "TabImpl::notifyContentChanged observer:" + observer.getClass().getName(); - try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { - observer.onContentChanged(this); - } - } + for (TabObserver observer : mObservers) observer.onContentChanged(this); } void updateThemeColor(int themeColor) { @@ -1492,29 +1446,17 @@ } } - // The string passed is safe since it is class and method name. - @SuppressWarnings("NoDynamicStringsInTraceEventCheck") private void notifyPageTitleChanged() { RewindableIterator<TabObserver> observers = getTabObservers(); while (observers.hasNext()) { - TabObserver observer = observers.next(); - String s = "TabImpl::notifyPageTitleChanged observer:" + observer.getClass().getName(); - try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { - observer.onTitleUpdated(this); - } + observers.next().onTitleUpdated(this); } } - // The string passed is safe since it is class and method name. - @SuppressWarnings("NoDynamicStringsInTraceEventCheck") private void notifyFaviconChanged() { RewindableIterator<TabObserver> observers = getTabObservers(); while (observers.hasNext()) { - TabObserver observer = observers.next(); - String s = "TabImpl::notifyFaviconChanged observer:" + observer.getClass().getName(); - try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { - observer.onFaviconUpdated(this, null); - } + observers.next().onFaviconUpdated(this, null); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java index 3ae1de1..672884e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java
@@ -16,7 +16,6 @@ import org.chromium.base.Log; import org.chromium.base.ObserverList; import org.chromium.base.ObserverList.RewindableIterator; -import org.chromium.base.TraceEvent; import org.chromium.base.metrics.RecordHistogram; import org.chromium.chrome.R; import org.chromium.chrome.browser.AppHooks; @@ -235,8 +234,6 @@ mTab.updateTitle(title); } - // The string passed is safe since it is class and method name. - @SuppressWarnings("NoDynamicStringsInTraceEventCheck") @Override public void didStartNavigation(NavigationHandle navigation) { if (navigation.isInPrimaryMainFrame() && !navigation.isSameDocument()) { @@ -245,42 +242,23 @@ RewindableIterator<TabObserver> observers = mTab.getTabObservers(); while (observers.hasNext()) { - TabObserver observer = observers.next(); - String s = "TabWebContentsObserver::didStartNavigation observer:" - + observer.getClass().getName(); - try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { - observer.onDidStartNavigation(mTab, navigation); - } + observers.next().onDidStartNavigation(mTab, navigation); } } @Override - // The string passed is safe since it is class and method name. - @SuppressWarnings("NoDynamicStringsInTraceEventCheck") public void didRedirectNavigation(NavigationHandle navigation) { RewindableIterator<TabObserver> observers = mTab.getTabObservers(); while (observers.hasNext()) { - TabObserver observer = observers.next(); - String s = "TabWebContentsObserver::didRedirectNavigation observer:" - + observer.getClass().getName(); - try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { - observer.onDidRedirectNavigation(mTab, navigation); - } + observers.next().onDidRedirectNavigation(mTab, navigation); } } @Override - // The string passed is safe since it is class and method name. - @SuppressWarnings("NoDynamicStringsInTraceEventCheck") public void didFinishNavigation(NavigationHandle navigation) { RewindableIterator<TabObserver> observers = mTab.getTabObservers(); while (observers.hasNext()) { - TabObserver observer = observers.next(); - String s = "TabWebContentsObserver::didFinishNavigation.onDidFinishNavigation " - + "observer:" + observer.getClass().getName(); - try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { - observer.onDidFinishNavigation(mTab, navigation); - } + observers.next().onDidFinishNavigation(mTab, navigation); } if (navigation.errorCode() != NetError.OK) { @@ -303,13 +281,7 @@ observers.rewind(); while (observers.hasNext()) { - TabObserver observer = observers.next(); - String s = "TabWebContentsObserver::didFinishNavigation.onUrlUpdated " - + "observer:" + observer.getClass().getName(); - try (TraceEvent e = - TraceEvent.scoped(s, "scroll jank observer investigation")) { - observer.onUrlUpdated(mTab); - } + observers.next().onUrlUpdated(mTab); } } @@ -327,17 +299,10 @@ } @Override - // The string passed is safe since it is class and method name. - @SuppressWarnings("NoDynamicStringsInTraceEventCheck") public void didFirstVisuallyNonEmptyPaint() { RewindableIterator<TabObserver> observers = mTab.getTabObservers(); while (observers.hasNext()) { - TabObserver observer = observers.next(); - String s = "TabWebContentsObserver::didFirstVisuallyNonEmptyPaint observer:" - + observer.getClass().getName(); - try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { - observer.didFirstVisuallyNonEmptyPaint(mTab); - } + observers.next().didFirstVisuallyNonEmptyPaint(mTab); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcher.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcher.java index fbfcce3..95105be 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcher.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcher.java
@@ -74,7 +74,7 @@ mTab.addObserver(this); mNativePointer = WebApkUpdateDataFetcherJni.get().initialize(WebApkUpdateDataFetcher.this, - mOldInfo.scopeUrl(), mOldInfo.manifestUrl(), mOldInfo.manifestId()); + mOldInfo.url(), mOldInfo.scopeUrl(), mOldInfo.manifestUrl(), mOldInfo.manifestId()); WebApkUpdateDataFetcherJni.get().start( mNativePointer, WebApkUpdateDataFetcher.this, mTab.getWebContents()); return true; @@ -169,8 +169,8 @@ @NativeMethods interface Natives { - long initialize(WebApkUpdateDataFetcher caller, String scope, String webManifestUrl, - String webManifestId); + long initialize(WebApkUpdateDataFetcher caller, String startUrl, String scope, + String webManifestUrl, String webManifestId); void replaceWebContents(long nativeWebApkUpdateDataFetcher, WebApkUpdateDataFetcher caller, WebContents webContents); void destroy(long nativeWebApkUpdateDataFetcher, WebApkUpdateDataFetcher caller);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java index f8ec3598..47872c8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java
@@ -204,6 +204,12 @@ destroyFetcher(); } + if (ChromeFeatureList.isEnabled(ChromeFeatureList.WEB_APK_UNIQUE_ID) + && TextUtils.isEmpty(mInfo.manifestId())) { + RecordHistogram.recordBooleanHistogram( + "WebApk.Update.UpdateEmptyUniqueId.NeedsUpgrade", needsUpgrade); + } + if (!needsUpgrade) { if (!mStorage.didPreviousUpdateSucceed() || mStorage.shouldForceUpdate()) { onFinishedUpdate(mStorage, WebApkInstallResult.SUCCESS, false /* relaxUpdates */); @@ -336,6 +342,8 @@ private void buildUpdateRequestAndSchedule(WebappInfo info, String primaryIconUrl, String splashIconUrl, boolean isManifestStale, boolean appIdentityUpdateSupported, List<Integer> updateReasons) { + recordWebApkUpdateUniqueIdHistogram(mInfo, mFetchedInfo); + Callback<Boolean> callback = (success) -> { if (!success) { onFinishedUpdate(mStorage, WebApkInstallResult.FAILURE, false /* relaxUpdates*/); @@ -348,6 +356,18 @@ isManifestStale, appIdentityUpdateSupported, updateReasons, callback); } + private void recordWebApkUpdateUniqueIdHistogram(WebappInfo oldInfo, WebappInfo fetchedInfo) { + if (!ChromeFeatureList.isEnabled(ChromeFeatureList.WEB_APK_UNIQUE_ID)) return; + if (fetchedInfo == null) return; + + String baseName = "WebApk.Update.UniqueId" + + (TextUtils.isEmpty(oldInfo.manifestId()) ? "Empty" : "Same"); + RecordHistogram.recordBooleanHistogram(baseName + ".ManifestUrl", + TextUtils.equals(oldInfo.manifestUrl(), fetchedInfo.manifestUrl())); + RecordHistogram.recordBooleanHistogram( + baseName + ".StartUrl", TextUtils.equals(oldInfo.url(), fetchedInfo.url())); + } + /** Schedules update for when WebAPK is not running. */ private void scheduleUpdate() { WebApkUmaRecorder.recordUpdateRequestQueued(UpdateRequestQueued.TWICE);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java index e9addd9..d20ed43 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java
@@ -41,7 +41,6 @@ import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; import org.mockito.quality.Strictness; - import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.Callback; import org.chromium.base.ContextUtils; @@ -52,6 +51,7 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.Criteria; import org.chromium.base.test.util.CriteriaHelper; +import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.PackageManagerWrapper; import org.chromium.base.test.util.Restriction; @@ -96,6 +96,7 @@ import org.chromium.ui.base.PageTransition; import org.chromium.ui.modelutil.PropertyModel; import org.chromium.url.GURL; +import org.chromium.url.Origin; import java.util.Arrays; import java.util.List; @@ -235,7 +236,7 @@ && intent.getPackage().equals(ExternalNavigationHandler.PLAY_APP_PACKAGE)) { return true; } - if (intent.getScheme().equals("market")) return true; + if (intent.getScheme() != null && intent.getScheme().equals("market")) return true; return false; } @@ -316,6 +317,14 @@ } } + private Origin createExampleOrigin() { + org.chromium.url.internal.mojom.Origin origin = new org.chromium.url.internal.mojom.Origin(); + origin.scheme = "https"; + origin.host = "example.com"; + origin.port = 80; + return new Origin(origin); + } + private Intent getCustomTabFromChromeIntent(final String url, final boolean markFromChrome) { return TestThreadUtils.runOnUiThreadBlockingNoException(() -> { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); @@ -397,9 +406,15 @@ mActivityTestRule.getActivity().getTabModelSelector().addObserver(selectorObserver); }); - mActivityTestRule.getActivity().onUserInteraction(); - TestThreadUtils.runOnUiThreadBlocking( - () -> { tab.loadUrl(new LoadUrlParams(url, PageTransition.LINK)); }); + LoadUrlParams params = new LoadUrlParams(url, transition); + if (transition == PageTransition.LINK || transition == PageTransition.FORM_SUBMIT) { + params.setIsRendererInitiated(true); + params.setInitiatorOrigin(createExampleOrigin()); + } + if (!RedirectHandler.isRefactoringEnabled()) { + mActivityTestRule.getActivity().onUserInteraction(); + } + TestThreadUtils.runOnUiThreadBlocking(() -> { tab.loadUrl(params); }); if (finishCallback.getCallCount() == 0) { try { @@ -487,9 +502,9 @@ CriteriaHelper.pollUiThread(() -> { Criteria.checkThat( mActivityMonitor.getHits(), Matchers.is(shouldLaunchExternalIntent ? 1 : 0)); + boolean finishesTwice = hasFallbackUrl || (shouldLaunchExternalIntent && !needClick); + Criteria.checkThat(finishCallback.getCallCount(), Matchers.is(finishesTwice ? 2 : 1)); }); - Assert.assertEquals(1 + (hasFallbackUrl ? 1 : 0), finishCallback.getCallCount()); - Assert.assertEquals(shouldFailNavigation ? 1 : 0, failCallback.getCallCount()); return lastResultValue.get(); @@ -1156,13 +1171,12 @@ String url = mTestServer.getURL(NAVIGATION_FROM_TIMEOUT_PAGE); @OverrideUrlLoadingResultType - int result = loadUrlAndWaitForIntentUrl(url, false, null, PageTransition.AUTO_BOOKMARK); - Assert.assertEquals(OverrideUrlLoadingResultType.OVERRIDE_WITH_ASYNC_ACTION, result); - assertMessagePresent(); + int result = loadUrlAndWaitForIntentUrl(url, true, null, PageTransition.AUTO_BOOKMARK); } @Test @LargeTest + @DisabledTest(message = "Re-enable when crbug.com/1300539 is fixed.") public void testRedirectFromBookmarkWithFallback() throws Exception { mActivityTestRule.startMainActivityOnBlankPage();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderUnitTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderUnitTest.java index 4f81d38..a7cb89d0 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderUnitTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderUnitTest.java
@@ -16,6 +16,7 @@ import androidx.test.filters.SmallTest; import org.junit.After; +import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -28,6 +29,7 @@ import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.base.test.UiThreadTest; +import org.chromium.base.test.metrics.HistogramTestRule; import org.chromium.base.test.util.Batch; import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelSelectorSupplier; @@ -71,6 +73,9 @@ @Rule public ChromeBrowserTestRule mTestRule = new ChromeBrowserTestRule(); + @Rule + public HistogramTestRule mHistogramTestRule = new HistogramTestRule(); + @Mock private PaymentManifestWebDataService mPaymentManifestWebDataService; @Mock @@ -165,6 +170,28 @@ Mockito.verify(delegate).onDoneCreatingPaymentApps(/*factory=*/null); } + /* Verify no metrics were recorded for the number of supported payment methods. */ + private void verifyNoSupportedPaymentMethodCountMetric() { + verifySupportedPaymentMethodCountMetric(/*histograms=*/0, /*methods=*/-1); + } + + /* Verify the supported payment method count. */ + private void verifySupportedPaymentMethodCountMetric(int histograms, int methods) { + Assert.assertEquals( + String.format("Expected number of histogram recordings: %d.", histograms), + /*expected=*/histograms, + mHistogramTestRule.getHistogramTotalCount( + "PaymentRequest.NumberOfSupportedMethods.AndroidApp")); + + if (histograms > 0) { + Assert.assertEquals(String.format("Expected number of payment methods: %d.", methods), + /*expected=*/histograms, + mHistogramTestRule.getHistogramValueCount( + "PaymentRequest.NumberOfSupportedMethods.AndroidApp", + /*sample=*/methods)); + } + } + @SmallTest @Test @UiThreadTest @@ -172,6 +199,9 @@ verifyNoAppsFound(findApps(new String[] {"unknown-payment-method-name", "http://not.secure.payment.method.name.com", "https://"}, mPaymentManifestDownloader, mPaymentManifestParser, mPackageManagerDelegate)); + + // No apps: + verifyNoSupportedPaymentMethodCountMetric(); } @SmallTest @@ -188,6 +218,9 @@ Mockito.verify(mPackageManagerDelegate, Mockito.never()) .getStringArrayResourceForApplication( ArgumentMatchers.any(ApplicationInfo.class), ArgumentMatchers.anyInt()); + + // No apps: + verifyNoSupportedPaymentMethodCountMetric(); } @SmallTest @@ -213,6 +246,9 @@ Mockito.verify(mPackageManagerDelegate, Mockito.never()) .getStringArrayResourceForApplication( ArgumentMatchers.any(ApplicationInfo.class), ArgumentMatchers.anyInt()); + + // The installed app declared support for no payment methods: + verifySupportedPaymentMethodCountMetric(/*histograms=*/1, /*methods=*/0); } @SmallTest @@ -241,6 +277,9 @@ Mockito.verify(mPackageManagerDelegate, Mockito.never()) .getStringArrayResourceForApplication( ArgumentMatchers.any(ApplicationInfo.class), ArgumentMatchers.anyInt()); + + // The installed app supports only "basic-card" method: + verifySupportedPaymentMethodCountMetric(/*histograms=*/1, /*methods=*/1); } @SmallTest @@ -256,6 +295,9 @@ Mockito.verify(packageManagerDelegate, Mockito.never()) .getStringArrayResourceForApplication( ArgumentMatchers.any(ApplicationInfo.class), ArgumentMatchers.anyInt()); + + // The installed app supports only "unsupported-payment-method" method: + verifySupportedPaymentMethodCountMetric(/*histograms=*/1, /*methods=*/1); } private PackageManagerDelegate installPaymentApps(String[] packageNames, String[] methodNames) { @@ -295,6 +337,9 @@ Mockito.verify(packageManagerDelegate, Mockito.never()) .getStringArrayResourceForApplication( ArgumentMatchers.any(ApplicationInfo.class), ArgumentMatchers.anyInt()); + + // The installed app supports only "basic-card" method: + verifySupportedPaymentMethodCountMetric(/*histograms=*/1, /*methods=*/1); } @SmallTest @@ -310,6 +355,62 @@ Mockito.verify(packageManagerDelegate, Mockito.never()) .getStringArrayResourceForApplication( ArgumentMatchers.any(ApplicationInfo.class), ArgumentMatchers.anyInt()); + + // The installed app supports only "basic-card" method: + verifySupportedPaymentMethodCountMetric(/*histograms=*/1, /*methods=*/1); + } + + @SmallTest + @Test + @UiThreadTest + public void testHistogramForMutlipleApps() { + PackageManagerDelegate packageManagerDelegate = + installPaymentApps(new String[] {"com.alicepay.app", "com.bobpay.app"}, + new String[] {"https://alicepay.com", "https://bobpay.com"}); + + // Trigger app lookup. + findApps(new String[] {"https://charliepay.com"}, mPaymentManifestDownloader, + mPaymentManifestParser, packageManagerDelegate); + + // Two apps are installed, with one method each. + verifySupportedPaymentMethodCountMetric(/*histograms=*/2, /*methods=*/1); + } + + @SmallTest + @Test + @UiThreadTest + public void testHistogramForMutlipleMethods() { + List<ResolveInfo> activities = new ArrayList<>(); + ResolveInfo bobPay = new ResolveInfo(); + bobPay.activityInfo = new ActivityInfo(); + bobPay.activityInfo.packageName = "com.bobpay.app"; + bobPay.activityInfo.name = "com.bobpay.app.WebPaymentActivity"; + bobPay.activityInfo.applicationInfo = new ApplicationInfo(); + Bundle bobPayMetaData = new Bundle(); + bobPayMetaData.putString( + AndroidPaymentAppFinder.META_DATA_NAME_OF_DEFAULT_PAYMENT_METHOD_NAME, + "https://bobpay.com"); + bobPayMetaData.putInt(AndroidPaymentAppFinder.META_DATA_NAME_OF_PAYMENT_METHOD_NAMES, 1); + bobPay.activityInfo.metaData = bobPayMetaData; + activities.add(bobPay); + + Mockito.when(mPackageManagerDelegate.getAppLabel(Mockito.any(ResolveInfo.class))) + .thenReturn("A non-empty label"); + Mockito.when(mPackageManagerDelegate.getActivitiesThatCanRespondToIntentWithMetaData( + ArgumentMatchers.argThat(sPayIntentArgumentMatcher))) + .thenReturn(activities); + + Mockito.when(mPackageManagerDelegate.getStringArrayResourceForApplication( + ArgumentMatchers.eq(bobPay.activityInfo.applicationInfo), + ArgumentMatchers.eq(1))) + .thenReturn(new String[] {"https://bobpay.com", "https://alicepay.com"}); + + // Trigger app lookup. + findApps(new String[] {"https://charliepay.com"}, mPaymentManifestDownloader, + mPaymentManifestParser, mPackageManagerDelegate); + + // One app is installed. It has two payment methods. + verifySupportedPaymentMethodCountMetric(/*histograms=*/1, /*methods=*/2); } @SmallTest
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcherTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcherTest.java index a4e13d9..568d688 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcherTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcherTest.java
@@ -20,6 +20,7 @@ import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider; import org.chromium.chrome.browser.browserservices.intents.WebappExtras; import org.chromium.chrome.browser.browserservices.intents.WebappInfo; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; @@ -232,7 +233,7 @@ @Test @MediumTest @Feature({"Webapps"}) - @EnableFeatures({"WebApkUniqueId"}) + @EnableFeatures(ChromeFeatureList.WEB_APK_UNIQUE_ID) public void testLaunchWithDifferentManifestUrlSameId() throws Exception { WebappTestPage.navigateToServiceWorkerPageWithManifest( mTestServerRule.getServer(), mTab, WEB_MANIFEST_URL1); @@ -253,7 +254,7 @@ @Test @MediumTest @Feature({"Webapps"}) - @EnableFeatures({"WebApkUniqueId"}) + @EnableFeatures(ChromeFeatureList.WEB_APK_UNIQUE_ID) public void testLaunchWithDifferentManifestId() throws Exception { WebappTestPage.navigateToServiceWorkerPageWithManifest( mTestServerRule.getServer(), mTab, WEB_MANIFEST_URL3); @@ -275,7 +276,7 @@ @Test @MediumTest @Feature({"Webapps"}) - @EnableFeatures({"WebApkUniqueId"}) + @EnableFeatures(ChromeFeatureList.WEB_APK_UNIQUE_ID) public void testLaunchWithEmptyOldManifestId() throws Exception { WebappTestPage.navigateToServiceWorkerPageWithManifest( mTestServerRule.getServer(), mTab, WEB_MANIFEST_URL3);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java index 7f9b47c..3f555a3 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java
@@ -98,7 +98,7 @@ private static final float TAB_WIDTH_SMALL = 108.f; private static final float TAB_OVERLAP_WIDTH = 24.f; private static final float TAB_WIDTH_MEDIUM = 156.f; - private static final float TAB_MARGIN_WIDTH = 76.f; + private static final float TAB_MARGIN_WIDTH = 95.f; private static final long TIMESTAMP = 5000; private static final float NEW_TAB_BTN_X = 700.f; private static final float NEW_TAB_BTN_Y = 1400.f; @@ -1036,8 +1036,8 @@ mStripLayoutHelper.setScrollOffsetForTesting(0); // Start reorder on rightmost tab. 2 margins to left of tab, so should scroll. - // Verify the scroll offset is 2 * (-marginWidth) = 2 * -76 = -152 - int expectedOffset = -152; + // Verify the scroll offset is 2 * (-marginWidth) = 2 * -95 = -190 + int expectedOffset = -190; mStripLayoutHelper.startReorderModeAtIndexForTesting(4); assertEquals("There are margins left of the selected tab, so we should scroll", expectedOffset, mStripLayoutHelper.getScrollOffset()); @@ -1049,6 +1049,76 @@ } @Test + @Feature("Tab Groups on Tab Strip") + public void testReorder_NoGroups() { + // Mock 5 tabs. + initializeTest(false, false, 0, 5); + mStripLayoutHelper.onSizeChanged(SCREEN_WIDTH, SCREEN_HEIGHT, false, TIMESTAMP); + StripLayoutTab[] tabs = mStripLayoutHelper.getStripLayoutTabs(); + StripLayoutTab thirdTab = tabs[2]; + StripLayoutTab fourthTab = tabs[3]; + + // Start reorder on third tab. Drag right to trigger swap with fourth tab. + // 100 > tabWidth * flipThreshold = (190-24) * 0.53 = 88 + mStripLayoutHelper.startReorderModeAtIndexForTesting(2); + float dragDistance = 100f; + float startX = mStripLayoutHelper.getLastReorderX(); + mStripLayoutHelper.drag(TIMESTAMP, startX + dragDistance, 0f, dragDistance, 0f, 0f, 0f); + + // Assert the tabs swapped. + assertEquals("Third and fourth tabs should have swapped.", thirdTab, tabs[3]); + assertEquals("Third and fourth tabs should have swapped.", fourthTab, tabs[2]); + } + + @Test + @Feature("Tab Groups on Tab Strip") + public void testReorder_DragOutOfGroup() { + // Mock a tab group with 3 tabs with 1 tab to the left and 1 tab to the right. + initializeTest(false, false, 0, 5); + mStripLayoutHelper.onSizeChanged(SCREEN_WIDTH, SCREEN_HEIGHT, false, TIMESTAMP); + StripLayoutTab[] tabs = mStripLayoutHelper.getStripLayoutTabs(); + StripLayoutTab fourthTab = tabs[3]; + groupTabs(1, 4); + + // Start reorder on fourth tab. Drag right over the tab group. + // 60 > marginWidth * flipThreshold = 95 * 0.53 = 51 + mStripLayoutHelper.startReorderModeAtIndexForTesting(3); + float dragDistance = 60f; + float startX = mStripLayoutHelper.getLastReorderX(); + mStripLayoutHelper.drag(TIMESTAMP, startX + dragDistance, 0f, dragDistance, 0f, 0f, 0f); + + // Verify fourth tab was dragged out of group, but not reordered. + assertEquals("Fourth tab should not have moved.", fourthTab, tabs[3]); + verify(mTabGroupModelFilter).moveTabOutOfGroupInDirection(fourthTab.getId(), true); + } + + @Test + @Feature("Tab Groups on Tab Strip") + public void testReorder_DragPastGroup() { + // Mock a tab group with 3 tabs with 1 tab to the left and 1 tab to the right. + initializeTest(false, false, 0, 5); + mStripLayoutHelper.onSizeChanged(SCREEN_WIDTH, SCREEN_HEIGHT, false, TIMESTAMP); + StripLayoutTab[] tabs = mStripLayoutHelper.getStripLayoutTabs(); + StripLayoutTab firstTab = tabs[0]; + groupTabs(1, 4); + + // Start reorder on first tab. Drag right over the tab group. + // 650 > 3*tabWidth + margin + flipThreshold*margin = 3*(190-24) + 1.53*95 = 644 > 300 + mStripLayoutHelper.startReorderModeAtIndexForTesting(0); + float dragDistance = 300f; + float startX = mStripLayoutHelper.getLastReorderX(); + mStripLayoutHelper.drag(TIMESTAMP, startX + dragDistance, 0f, dragDistance, 0f, 0f, 0f); + // Verify no reordering, since we have not hovered over the tab group long enough. + assertEquals("First tab should not have moved.", firstTab, tabs[0]); + + // Drag past the tab group. + dragDistance = 650f; + mStripLayoutHelper.drag(TIMESTAMP, startX + dragDistance, 0f, dragDistance, 0f, 0f, 0f); + // Verify reordering, since we have dragged past the tab group. + assertEquals("First tab should now be the fourth tab.", firstTab.getId(), tabs[3].getId()); + } + + @Test @Feature("Tab Strip Improvements") public void testTabClosing_NoTabResize() { // Arrange @@ -1445,9 +1515,12 @@ */ private void groupTabs(int startIndex, int endIndex) { int groupRootId = mModel.getTabAt(startIndex).getId(); + int numTabs = endIndex - startIndex; + for (int i = startIndex; i < endIndex; i++) { when(mTabGroupModelFilter.hasOtherRelatedTabs(eq(mModel.getTabAt(i)))).thenReturn(true); when(mTabGroupModelFilter.getRootId(eq(mModel.getTabAt(i)))).thenReturn(groupRootId); } + when(mTabGroupModelFilter.getRelatedTabCountForRootId(eq(groupRootId))).thenReturn(numTabs); } }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinatorTest.java index a2ade697..084ab8f 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinatorTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinatorTest.java
@@ -355,7 +355,7 @@ @Test public void testSetQueryState() { mHistoryClustersCoordinator.inflateActivityView(); - mHistoryClustersCoordinator.setQueryState(QueryState.forQuery("dogs", "")); + mHistoryClustersCoordinator.setInitialQuery(QueryState.forQuery("dogs", "")); fulfillPromise(mPromise, mClusterResult); RecyclerView recyclerView = mHistoryClustersCoordinator.getRecyclerViewFortesting(); @@ -370,7 +370,7 @@ @Test public void testDestroy() { mHistoryClustersCoordinator.inflateActivityView(); - mHistoryClustersCoordinator.setQueryState(QueryState.forQuery("dogs", "")); + mHistoryClustersCoordinator.setInitialQuery(QueryState.forQuery("dogs", "")); mHistoryClustersCoordinator.destroy(); // Fulfilling the promise post-destroy shouldn't crash or do anything else for that matter.
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/tile/TileRendererTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/tile/TileRendererTest.java index 135bd93..ee2546e 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/tile/TileRendererTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/tile/TileRendererTest.java
@@ -22,7 +22,9 @@ import org.junit.Assert; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TestRule; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; @@ -36,10 +38,13 @@ import org.chromium.base.task.TaskTraits; import org.chromium.base.task.test.ShadowPostTask; import org.chromium.chrome.R; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; import org.chromium.chrome.browser.suggestions.ImageFetcher; import org.chromium.chrome.browser.suggestions.SiteSuggestion; import org.chromium.chrome.browser.suggestions.SuggestionsConfig.TileStyle; +import org.chromium.chrome.test.util.browser.Features; +import org.chromium.chrome.test.util.browser.Features.EnableFeatures; import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import org.chromium.components.favicon.IconType; import org.chromium.components.favicon.LargeIconBridge.LargeIconCallback; @@ -55,6 +60,7 @@ /** A simple test for {@link TileRenderer} using real {@link android.view.View} objects. */ @RunWith(LocalRobolectricTestRunner.class) @Config(manifest = Config.NONE, shadows = {ShadowPostTask.class}) +@EnableFeatures({ChromeFeatureList.HISTORY_ORGANIC_REPEATABLE_QUERIES}) public class TileRendererTest { /** * Backend that substitutes normal PostTask operations. Allow us to coordinate task execution @@ -79,6 +85,9 @@ private static final int TITLE_LINES = 1; private static final GURL TEST_URL = JUnitTestGURLs.getGURL(JUnitTestGURLs.EXAMPLE_URL); + @Rule + public TestRule mFeatures = new Features.JUnitProcessor(); + @Mock private ImageFetcher mMockImageFetcher;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerUnitTest.java index 7b074e7..17362dd 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerUnitTest.java
@@ -25,6 +25,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TestRule; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.robolectric.RuntimeEnvironment; @@ -53,8 +54,11 @@ import org.chromium.chrome.browser.browserservices.intents.WebappIcon; import org.chromium.chrome.browser.browserservices.intents.WebappInfo; import org.chromium.chrome.browser.browserservices.intents.WebappIntentUtils; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.test.util.browser.Features; +import org.chromium.chrome.test.util.browser.Features.EnableFeatures; import org.chromium.components.embedder_support.util.ShadowUrlUtilities; import org.chromium.components.webapk.lib.common.WebApkMetaDataKeys; import org.chromium.components.webapps.WebApkDistributor; @@ -75,13 +79,13 @@ import java.util.Map; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicBoolean; - /** * Unit tests for WebApkUpdateManager. */ @RunWith(BaseRobolectricTestRunner.class) @Config(manifest = Config.NONE, shadows = {ShadowUrlUtilities.class}) @LooperMode(LooperMode.Mode.LEGACY) +@EnableFeatures(ChromeFeatureList.WEB_APK_UNIQUE_ID) public class WebApkUpdateManagerUnitTest { @Rule public MockWebappDataStorageClockRule mClockRule = new MockWebappDataStorageClockRule(); @@ -89,6 +93,9 @@ @Rule public JniMocker mJniMocker = new JniMocker(); + @Rule + public final TestRule mProcessor = new Features.JUnitProcessor(); + private static final String WEBAPK_PACKAGE_NAME = "org.chromium.webapk.test_package"; private static final String UNBOUND_WEBAPK_PACKAGE_NAME = "com.webapk.test_package";
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index fde2e47..45aaf9bc 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -8410,6 +8410,12 @@ <message name="IDS_TAB_SEARCH_EXPAND_RECENTLY_CLOSED_ITEMS" desc="The label for the button that toggles showing the recently closed items list section."> Toggle Recently Closed Items </message> + <message name="IDS_TAB_SEARCH_EXPAND_RECENTLY_CLOSED" desc="The tooltip for the RECENTLY CLOSED button when it's collapsed"> + Expand recently closed + </message> + <message name="IDS_TAB_SEARCH_COLLAPSE_RECENTLY_CLOSED" desc="The tooltip for the RECENTLY CLOSED button when it's expanded"> + Collapse recently closed + </message> <!-- Strings for Window Titles in Menus --> <if expr="not use_titlecase">
diff --git a/chrome/app/generated_resources_grd/IDS_TAB_SEARCH_COLLAPSE_RECENTLY_CLOSED.png.sha1 b/chrome/app/generated_resources_grd/IDS_TAB_SEARCH_COLLAPSE_RECENTLY_CLOSED.png.sha1 new file mode 100644 index 0000000..bda5ddb --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_TAB_SEARCH_COLLAPSE_RECENTLY_CLOSED.png.sha1
@@ -0,0 +1 @@ +52fdc494be5ac6ce74c4ec79820229c8578ee26d \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_TAB_SEARCH_EXPAND_RECENTLY_CLOSED.png.sha1 b/chrome/app/generated_resources_grd/IDS_TAB_SEARCH_EXPAND_RECENTLY_CLOSED.png.sha1 new file mode 100644 index 0000000..efdfa89 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_TAB_SEARCH_EXPAND_RECENTLY_CLOSED.png.sha1
@@ -0,0 +1 @@ +2ff7369681847b08effbf995d8b9f26b229a2ce1 \ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_bs.xtb b/chrome/app/resources/chromium_strings_bs.xtb index 164095a..1db774d 100644 --- a/chrome/app/resources/chromium_strings_bs.xtb +++ b/chrome/app/resources/chromium_strings_bs.xtb
@@ -13,7 +13,7 @@ <translation id="1185134272377778587">O programu Chromium</translation> <translation id="1203500561924088507">Hvala što ste instalirali. Morate ponovo pokrenuti preglednik prije nego što možete koristiti <ph name="BUNDLE_NAME" />.</translation> <translation id="1315551408014407711">Postavite novi Chromium profil</translation> -<translation id="1385859895174722837">Google asistent u Chromiumu</translation> +<translation id="1385859895174722837">Google Asistent u Chromiumu</translation> <translation id="1396446129537741364">Chromium pokušava prikazati lozinke.</translation> <translation id="1414495520565016063">Prijavili ste se u Chromium!</translation> <translation id="1524282610922162960">Dijelite Chromium karticu</translation> @@ -104,7 +104,7 @@ <translation id="3474745554856756813">Time će se izbrisati sljedeći broj stavki s uređaja: <ph name="ITEMS_COUNT" />. TDa biste kasnije dohvatili svoje podatke, prijavite se na Chromium kao <ph name="USER_EMAIL" />.</translation> <translation id="3497319089134299931">Prečicom <ph name="SHORTCUT" /> možete prebacivati između Chromium profila</translation> <translation id="3509308970982693815">Zatvorite sve prozore Chromiuma i pokušajte ponovo.</translation> -<translation id="3518180795744733843">Google asistent u Chromiumu može izvršavati radnje na web-lokacijama za vas</translation> +<translation id="3518180795744733843">Google Asistent u Chromiumu može za vas dovršavati radnje na svim web lokacijama</translation> <translation id="3533435340678213462">Da zaštitimo vašu privatnost, automatski brišemo interesovanja koja su starija od 4 sedmice. Kada nastavite koristiti preglednik, interesovanje se može ponovo pojaviti na listi. Ili možete ukloniti interesovanja koja ne želite dati Chromiumu na razmatranje.</translation> <translation id="3567254597502212821">Vaša historija pregledanja, zapisi o web lokacijama koje ste posjetili koristeći Chromium na ovom uređaju.</translation> <translation id="3575459661164320785">Na vašem računaru se nalazi štetni softver. Chromium ga može ukloniti, vratiti vaše postavke i onemogućiti ekstenziju kako bi vaš preglednik ponovo radio normalno.</translation>
diff --git a/chrome/app/resources/chromium_strings_fa.xtb b/chrome/app/resources/chromium_strings_fa.xtb index aa5b6af..1744343 100644 --- a/chrome/app/resources/chromium_strings_fa.xtb +++ b/chrome/app/resources/chromium_strings_fa.xtb
@@ -11,6 +11,7 @@ <translation id="1185134272377778587">درباره Chromium</translation> <translation id="1203500561924088507">بابت نصب از شما سپاسگزاریم. قبلاز استفاده از <ph name="BUNDLE_NAME" />، باید مرورگر را بازراهاندازی کنید.</translation> <translation id="1315551408014407711">راهاندازی نمایه Chromium جدید</translation> +<translation id="1385859895174722837">«دستیار Google» در Chromium</translation> <translation id="1396446129537741364">Chromium میخواهد گذرواژهها را نشان دهد.</translation> <translation id="1414495520565016063">شما وارد سیستم Chromium شدید!</translation> <translation id="1524282610922162960">همرسانی برگه Chromium</translation> @@ -100,6 +101,7 @@ <translation id="3474745554856756813">این کار <ph name="ITEMS_COUNT" /> مورد را از این دستگاه حذف میکند. برای بازیابی دادههایتان در فرصتی دیگر، با <ph name="USER_EMAIL" /> به سیستم Chromium وارد شوید.</translation> <translation id="3497319089134299931">با <ph name="SHORTCUT" /> میتوانید بین نمایههای Chromium جابهجا شوید</translation> <translation id="3509308970982693815">لطفاً همه پنجرههای Chromium را ببندید و دوباره سعی کنید.</translation> +<translation id="3518180795744733843">«دستیار Google» در Chromium میتواند کنشهایی را در وبسایتها برایتان انجام دهد</translation> <translation id="3533435340678213462">برای محافظت از حریم خصوصی شما، علایقی را که قدیمیتر از ۴ هفته باشند بهطور خودکار حذف میکنیم. وقتی به مرور کردن ادامه میدهید، ممکن است علاقهای مجدداً به فهرست اضافه شود. یا میتوانید علایقی را که نمیخواهید Chromium مدنظر قرار دهد حذف کنید.</translation> <translation id="3567254597502212821">سابقه مرور شما، سابقه سایتهایی که بااستفاده از Chromium در این دستگاه از آنها بازدید کردهاید.</translation> <translation id="3575459661164320785">نرمافزار مضری در رایانهتان وجود دارد. Chromium میتواند آن را بردارد، تنظیمات را بازیابی کند و افزونهها را غیرفعال کند تا عملکرد مرورگرتان دوباره عادی شود.</translation>
diff --git a/chrome/app/resources/chromium_strings_fil.xtb b/chrome/app/resources/chromium_strings_fil.xtb index be53308..9553df0c 100644 --- a/chrome/app/resources/chromium_strings_fil.xtb +++ b/chrome/app/resources/chromium_strings_fil.xtb
@@ -13,6 +13,7 @@ <translation id="1185134272377778587">Tungkol sa Chromium</translation> <translation id="1203500561924088507">Salamat sa pag-install. Dapat mong i-restart ang iyong browser bago gamitin ang <ph name="BUNDLE_NAME" />.</translation> <translation id="1315551408014407711">I-set up ang iyong bagong profile sa Chromium</translation> +<translation id="1385859895174722837">Google Assistant sa Chromium</translation> <translation id="1396446129537741364">Sinusubukan ng Chromium na magpakita ng mga password.</translation> <translation id="1414495520565016063">Naka-sign in ka sa Chromium!</translation> <translation id="1524282610922162960">Magbahagi ng tab ng Chromium</translation> @@ -103,6 +104,7 @@ <translation id="3474745554856756813">Magde-delete ito ng <ph name="ITEMS_COUNT" /> (na) item sa device na ito. Upang makuha ang iyong data sa ibang pagkakataon, mag-sign in sa Chromium bilang <ph name="USER_EMAIL" />.</translation> <translation id="3497319089134299931">Puwedeng magpalipat-lipat sa mga profile sa Chromium sa pamamagitan ng <ph name="SHORTCUT" /></translation> <translation id="3509308970982693815">Pakisara ang lahat ng window sa Chromium at subukang muli.</translation> +<translation id="3518180795744733843">Makakakumpleto ang Google Assistant sa Chromium ng mga pagkilos sa lahat ng website para sa iyo</translation> <translation id="3533435340678213462">Para protektahan ang iyong privacy, awtomatiko naming dine-delete ang mga interes mo na mas matagal sa 4 na linggo. Habang patuloy kang nagba-browse, posibleng lumabas ulit sa listahan ang isang interes. O puwede kang mag-alis ng mga interes na ayaw mong isaalang-alang ng Chromium.</translation> <translation id="3567254597502212821">Iyong history ng pag-browse, record ng mga site na binisita mo gamit ang Chromium sa device na ito.</translation> <translation id="3575459661164320785">May mapaminsalang software sa iyong computer. Magagawa ng Chromium na alisin ito, i-restore ang iyong mga setting, at i-disable ang mga extension para muling mapagana nang normal ang browser mo.</translation>
diff --git a/chrome/app/resources/chromium_strings_hu.xtb b/chrome/app/resources/chromium_strings_hu.xtb index 8931b8b..e836b18e 100644 --- a/chrome/app/resources/chromium_strings_hu.xtb +++ b/chrome/app/resources/chromium_strings_hu.xtb
@@ -11,6 +11,7 @@ <translation id="1185134272377778587">A Chromium névjegye</translation> <translation id="1203500561924088507">Köszönjük, hogy elvégezte a telepítést. A(z) <ph name="BUNDLE_NAME" /> használata előtt újra kell indítania a böngészőt.</translation> <translation id="1315551408014407711">Új Chromium-profil beállítása</translation> +<translation id="1385859895174722837">Google Segéd a Chromiumban</translation> <translation id="1396446129537741364">A Chromium megpróbálja megjeleníteni a jelszavakat.</translation> <translation id="1414495520565016063">Bejelentkezett a Chromiumba.</translation> <translation id="1524282610922162960">Chromium-lap megosztása</translation> @@ -101,6 +102,7 @@ <translation id="3474745554856756813">Ezzel <ph name="ITEMS_COUNT" /> elemet töröl erről az eszközről. Az adatok későbbi lekéréséhez jelentkezzen be a Chromiumba a következő e-mail-címmel: <ph name="USER_EMAIL" />.</translation> <translation id="3497319089134299931">A(z) <ph name="SHORTCUT" /> billentyűkombinációval válthat a Chromium-profilok között</translation> <translation id="3509308970982693815">Zárjon be minden Chromium-ablakot, és próbálkozzon újra.</translation> +<translation id="3518180795744733843">A „Google Segéd a Chromiumban” elvégezhet bizonyos műveleteket Önnek különböző webhelyeken</translation> <translation id="3533435340678213462">Adatai védelme érdekében a négy hétnél régebbi érdeklődési köreit automatikusan töröljük. Böngészési tevékenysége alapján az érdeklődési körök újra megjelenhetnek a listákon. Arra is lehetősége van, hogy eltávolítsa azokat az érdeklődési köröket, amelyeket nem szeretne, hogy a Chromium figyelembe vegyen.</translation> <translation id="3567254597502212821">Böngészési előzményei és az Ön által az ezen az eszközön használt Chromiumban felkeresett webhelyek jegyzéke.</translation> <translation id="3575459661164320785">A számítógépen kártékony szoftver található. A Chromium képes a kártékony szoftver eltávolítására, a beállítások visszaállítására és a bővítmények letiltására, hogy a böngésző újra a szokásos módon működhessen.</translation>
diff --git a/chrome/app/resources/chromium_strings_km.xtb b/chrome/app/resources/chromium_strings_km.xtb index 9caf907..52edf412 100644 --- a/chrome/app/resources/chromium_strings_km.xtb +++ b/chrome/app/resources/chromium_strings_km.xtb
@@ -13,6 +13,7 @@ <translation id="1185134272377778587">អំពី Chromium</translation> <translation id="1203500561924088507">សូមអរគុណសម្រាប់ការដំឡើង។ អ្នកត្រូវតែចាប់ផ្ដើមកម្មវិធីរុករកតាមអ៊ីនធឺណិតរបស់អ្នកឡើងវិញ មុនពេលប្រើ <ph name="BUNDLE_NAME" />។</translation> <translation id="1315551408014407711">រៀបចំកម្រងព័ត៌មាន Chromium ថ្មីរបស់អ្នក</translation> +<translation id="1385859895174722837">Google Assistant នៅក្នុង Chromium</translation> <translation id="1396446129537741364">Chromium កំពុងព្យាយាមបង្ហាញពាក្យសម្ងាត់។</translation> <translation id="1414495520565016063">អ្នកបានចូលមកកាន់ Chromium!</translation> <translation id="1524282610922162960">ចែករំលែកផ្ទាំង Chromium</translation> @@ -104,6 +105,7 @@ <translation id="3474745554856756813">វានឹងលុបធាតុ <ph name="ITEMS_COUNT" /> ចេញពីឧបករណ៍នេះ។ ដើម្បីទាញយកទិន្នន័យរបស់អ្នកមកវិញនៅពេលក្រោយ សូមចូលទៅកាន់ Chromium ជា <ph name="USER_EMAIL" /> ។</translation> <translation id="3497319089134299931"><ph name="SHORTCUT" /> អាចប្ដូររវាងកម្រងព័ត៌មាន Chromium</translation> <translation id="3509308970982693815">សូមបិទផ្ទាំង Chromium ទាំងអស់ ហើយព្យាយាមម្តងទៀត។</translation> +<translation id="3518180795744733843">Google Assistant នៅក្នុង Chromium អាចបញ្ចប់សកម្មភាពនៅលើគេហទំព័រជូនអ្នកបាន</translation> <translation id="3533435340678213462">ដើម្បីការពារឯកជនភាពរបស់អ្នក យើងលុបចំណាប់អារម្មណ៍របស់អ្នកដែលចាស់ជាង 4 សប្ដាហ៍ដោយស្វ័យប្រវត្តិ។ នៅពេលដែលអ្នកបន្តរុករក ចំណាប់អារម្មណ៍ប្រហែលជាបង្ហាញនៅលើបញ្ជីម្ដងទៀត។ ឬអ្នកអាចដកចំណាប់អារម្មណ៍ដែលអ្នកមិនចង់ឱ្យ Chromium ពិចារណាចេញបាន។</translation> <translation id="3567254597502212821">ប្រវត្តិរុករកតាមអ៊ីនធឺណិតរបស់អ្នក កំណត់ត្រាអំពីគេហទំព័រដែលអ្នកបានចូលមើលដោយប្រើ Chromium នៅលើឧបករណ៍នេះ។</translation> <translation id="3575459661164320785">មានកម្មវិធីបង្កគ្រោះថ្នាក់នៅលើកុំព្យូទ័ររបស់អ្នក។ Chrome អាចលុបវា ហើយស្តារការកំណត់របស់អ្នក ដើម្បីធ្វើឱ្យកម្មវិធីរុករកតាមអ៊ីនធឺណិតរបស់អ្នកដំណើរការធម្មតាឡើងវិញ។ Chromium អាចលុបកម្មវិធីនេះ ស្ដារការកំណត់របស់អ្នក និងបិទកម្មវិធីបន្ថែម ដើម្បីធ្វើឱ្យកម្មវិធីរុករកតាមអ៊ីនធឺណិតរបស់អ្នកដំណើរការជាធម្មតាឡើងវិញ។</translation>
diff --git a/chrome/app/resources/chromium_strings_lt.xtb b/chrome/app/resources/chromium_strings_lt.xtb index dcfad07..6d813ff5 100644 --- a/chrome/app/resources/chromium_strings_lt.xtb +++ b/chrome/app/resources/chromium_strings_lt.xtb
@@ -13,6 +13,7 @@ <translation id="1185134272377778587">Apie „Chromium“</translation> <translation id="1203500561924088507">Dėkojame už diegimą. Turite iš naujo paleisti naršyklę, prieš naudodami „<ph name="BUNDLE_NAME" />“.</translation> <translation id="1315551408014407711">Nustatykite naują „Chromium“ profilį</translation> +<translation id="1385859895174722837">„Google“ padėjėjas naršyklėje „Chromium“</translation> <translation id="1396446129537741364">„Chromium“ bando parodyti slaptažodžius.</translation> <translation id="1414495520565016063">Esate prisijungę prie „Chromium“.</translation> <translation id="1524282610922162960">„Chromium“ skirtuko bendrinimas</translation> @@ -103,6 +104,7 @@ <translation id="3474745554856756813">Atlikus šį veiksmą iš šio įrenginio bus ištrinti elementai (<ph name="ITEMS_COUNT" />). Jei vėliau norėsite gauti duomenis, prisijunkite prie „Chromium“ kaip <ph name="USER_EMAIL" />.</translation> <translation id="3497319089134299931">Naudojant spartųjį klavišą <ph name="SHORTCUT" /> galima perjungti „Chromium“ profilius</translation> <translation id="3509308970982693815">Uždarykite visus „Chromium“ langus ir bandykite dar kartą.</translation> +<translation id="3518180795744733843">„Google“ padėjėjas naršyklėje „Chromium“ gali atlikti veiksmus svetainėse už jus</translation> <translation id="3533435340678213462">Siekdami apsaugoti jūsų privatumą, automatiškai ištriname senesnius nei keturių savaičių pomėgius. Jums naršant toliau, pomėgiai vėl gali atsirasti sąraše. Arba galite pašalinti pomėgius, kurių „Chromium“ įtraukti neturėtų.</translation> <translation id="3567254597502212821">Jūsų naršymo istorija, svetainių, kuriose lankėtės naudodami „Chromium“ šiame įrenginyje, įrašas.</translation> <translation id="3575459661164320785">Kompiuteryje yra kenkėjiškos programinės įrangos. „Chromium“ gali ją pašalinti, atkurti nustatymus ir išjungti plėtinius, kad naršyklė vėl veiktų įprastai.</translation>
diff --git a/chrome/app/resources/chromium_strings_mn.xtb b/chrome/app/resources/chromium_strings_mn.xtb index d6c868894..9c2917c 100644 --- a/chrome/app/resources/chromium_strings_mn.xtb +++ b/chrome/app/resources/chromium_strings_mn.xtb
@@ -13,6 +13,7 @@ <translation id="1185134272377778587">Chromium-ийн тухай</translation> <translation id="1203500561924088507">Суулгасанд баярлалаа. Та <ph name="BUNDLE_NAME" />-г ашиглахаасаа өмнө хөтчөө дахин эхлүүлэх ёстой.</translation> <translation id="1315551408014407711">Chromium-н шинэ профайлаа тохируулах</translation> +<translation id="1385859895174722837">Chromium-н Google Туслах</translation> <translation id="1396446129537741364">Chromium нь нууц үгийг үзүүлэхээр ачаалж байна.</translation> <translation id="1414495520565016063">Та Chromium руу нэвтэрсэн байна!</translation> <translation id="1524282610922162960">Chromium-н таб хуваалцах</translation> @@ -101,6 +102,7 @@ <translation id="3474745554856756813">Энэ нь төхөөрөмжөөс <ph name="ITEMS_COUNT" /> зүйл устгана. Өгөгдлөө дараа сэргээхийн тулд Chromium-д <ph name="USER_EMAIL" />-р нэвтэрнэ үү.</translation> <translation id="3497319089134299931"><ph name="SHORTCUT" /> Chromium-н профайлууд хооронд сэлгэх боломжтой</translation> <translation id="3509308970982693815">Chromium-н бүх цонхыг хаасны дараагаар дахин хандана уу.</translation> +<translation id="3518180795744733843">Chromium-н Google Туслах танд зориулан вебсайтууд дээр үйлдэл гүйцэтгэх боломжтой</translation> <translation id="3533435340678213462">Таны нууцлалыг хамгаалахын тулд бид таны 4 долоо хоногоос дээш хугацаатай сонирхлыг автоматаар устгадаг. Таныг үргэлжлүүлэн үзэх үед сонирхол нь жагсаалтад дахин харагдаж магадгүй. Эсвэл та Chromium-г харгалзан үзэхгүй байхыг хүсэж буй сонирхлоо хасах боломжтой.</translation> <translation id="3567254597502212821">Таны хөтчийн түүх буюу энэ төхөөрөмж дээр Chromium-г ашиглан зочилсон сайтуудын бүртгэл.</translation> <translation id="3575459661164320785">Таны компьютер дээр аюултай программ хангамж байна. Chromium таны хөтчийн ажиллагааг дахин хэвийн болгохын тулд үүнийг устгах, таны тохиргоог сэргээх болон өргөтгөлүүдийг идэвхгүй болгох боломжтой.</translation>
diff --git a/chrome/app/resources/chromium_strings_my.xtb b/chrome/app/resources/chromium_strings_my.xtb index afa77bf..5da630f 100644 --- a/chrome/app/resources/chromium_strings_my.xtb +++ b/chrome/app/resources/chromium_strings_my.xtb
@@ -13,6 +13,7 @@ <translation id="1185134272377778587">Chromium အကြောင်း</translation> <translation id="1203500561924088507">ထည့်သွင်းသည့်အတွက် ကျေးဇူးတင်ပါသည်။ <ph name="BUNDLE_NAME" /> အသုံးမပြုမီ သင့်ဘရောင်ဇာကို ပြန်စရမည်။</translation> <translation id="1315551408014407711">သင်၏ Chromium ပရိုဖိုင်အသစ်ကို စနစ်ထည့်သွင်းပါ</translation> +<translation id="1385859895174722837">Chromium ရှိ Google Assistant</translation> <translation id="1396446129537741364">Chromium က စကားဝှက်များကို ပြရန် ကြိုးစားနေသည်။</translation> <translation id="1414495520565016063">သင်သည် Chromium သို့ဝင်ရောက်ပြီးဖြစ်သည်!</translation> <translation id="1524282610922162960">Chromium တဘ် မျှဝေခြင်း</translation> @@ -104,6 +105,7 @@ <translation id="3474745554856756813">၎င်းသည် ဤစက်ပစ္စည်းမှ အကြောင်းအရာ <ph name="ITEMS_COUNT" /> ခုကို ဖျက်လိုက်ပါမည်။ သင့်ဒေတာကို နောက်မှ ပြန်ယူရန် Chromium သို့ <ph name="USER_EMAIL" /> အဖြစ် လက်မှတ်ထိုးဝင်ပါ။</translation> <translation id="3497319089134299931"><ph name="SHORTCUT" /> သည် Chromium ပရိုဖိုင်များအကြား ပြောင်းပေးနိုင်သည်</translation> <translation id="3509308970982693815">ကျေးဇူးပြု၍ Chromium ၐင်းဒိုးများကို ပိတ်ပြီး ထပ်စမ်းပါ။</translation> +<translation id="3518180795744733843">Chromium ရှိ Google Assistant က ဝဘ်ဆိုက်များတွင် သင့်အတွက် အလိုအလျောက် ဖြည့်ပေးနိုင်သည်</translation> <translation id="3533435340678213462">သင်၏ကိုယ်ရေးအချက်အလက်လုံခြုံမှုကို ကာကွယ်ရန် ၄ ပတ်ကျော်ပြီဖြစ်သော သင့်စိတ်ဝင်စားမှုများကို အလိုအလျောက်ဖျက်သည်။ သင်ကြည့်ရှုနေသည့်အတွက် စိတ်ဝင်စားမှုက စာရင်းတွင် ထပ်ပေါ်လာနိုင်သည်။ သို့မဟုတ် Chromium ထည့်မတွက်ရမည့် စိတ်ဝင်စားမှုများကို ဖယ်ရှားနိုင်သည်။</translation> <translation id="3567254597502212821">ဤစက်တွင် Chromium သုံးပြီး သင်ဝင်ကြည့်သည့်ဝဘ်ဆိုက်များ၏ မှတ်တမ်းဖြစ်သော သင့်ကြည့်ရှုခြင်းမှတ်တမ်း။</translation> <translation id="3575459661164320785">သင့်ကွန်ပျူတာတွင် အန္တရာယ်ရှိသောဆော့ဖ်ဝဲ ရှိနေသည်။ Chromium သည် ၎င်းကို ဖယ်ရှားခြင်း၊ သင်၏ ဆက်တင်များ ပြန်ယူခြင်းနှင့် ဘရောင်ဇာ ပုံမှန်အတိုင်း ပြန်လည်အသုံးပြုနိုင်ရန် နောက်ဆက်တွဲများ ပိတ်ခြင်းတို့ကို ပြုလုပ်နိုင်ပါသည်။</translation>
diff --git a/chrome/app/resources/chromium_strings_nl.xtb b/chrome/app/resources/chromium_strings_nl.xtb index fdfddf3..af20aba 100644 --- a/chrome/app/resources/chromium_strings_nl.xtb +++ b/chrome/app/resources/chromium_strings_nl.xtb
@@ -13,6 +13,7 @@ <translation id="1185134272377778587">Over Chromium</translation> <translation id="1203500561924088507">Bedankt voor het installeren. Je moet de browser opnieuw opstarten voordat je <ph name="BUNDLE_NAME" /> kunt gebruiken.</translation> <translation id="1315551408014407711">Je nieuwe Chromium-profiel instellen</translation> +<translation id="1385859895174722837">De Google Assistent in Chromium</translation> <translation id="1396446129537741364">Chromium probeert wachtwoorden te bekijken.</translation> <translation id="1414495520565016063">Je bent ingelogd bij Chromium.</translation> <translation id="1524282610922162960">Een Chromium-tabblad delen</translation> @@ -103,6 +104,7 @@ <translation id="3474745554856756813">Hiermee worden <ph name="ITEMS_COUNT" /> items verwijderd van dit apparaat. Als je je gegevens later wilt terughalen, log je in bij Chromium als <ph name="USER_EMAIL" />.</translation> <translation id="3497319089134299931"><ph name="SHORTCUT" /> kan schakelen tussen Chromium-profielen</translation> <translation id="3509308970982693815">Sluit alle Chromium-vensters en probeer het opnieuw.</translation> +<translation id="3518180795744733843">De Google Assistent in Chromium kan acties voor je voltooien op websites</translation> <translation id="3533435340678213462">Ter bescherming van je privacy verwijderen we automatisch interesses die ouder zijn dan 4 weken. Het kan gebeuren dat een interesse weer in de lijst komt te staan als je blijft browsen. Je kunt ook interesses verwijderen waarvan je niet wilt dat Chromium deze overweegt.</translation> <translation id="3567254597502212821">Je browsegeschiedenis, een lijst van de sites die je via Chromium op dit apparaat hebt bezocht.</translation> <translation id="3575459661164320785">Je hebt schadelijke software op je computer. Chromium kan deze verwijderen, je instellingen herstellen en extensies uitzetten, zodat je browser weer normaal werkt.</translation>
diff --git a/chrome/app/resources/chromium_strings_ru.xtb b/chrome/app/resources/chromium_strings_ru.xtb index bc4ee628..095a1d8e 100644 --- a/chrome/app/resources/chromium_strings_ru.xtb +++ b/chrome/app/resources/chromium_strings_ru.xtb
@@ -11,6 +11,7 @@ <translation id="1185134272377778587">О Chromium</translation> <translation id="1203500561924088507">Спасибо, что установили <ph name="BUNDLE_NAME" />. Чтобы изменения вступили в силу, перезапустите браузер.</translation> <translation id="1315551408014407711">Создайте профиль Chromium</translation> +<translation id="1385859895174722837">Google Ассистент в Chromium</translation> <translation id="1396446129537741364">Вводимые пароли будут отображаться в Chromium.</translation> <translation id="1414495520565016063">Добро пожаловать в Chromium!</translation> <translation id="1524282610922162960">Откройте доступ к вкладке Chromium</translation> @@ -99,6 +100,7 @@ <translation id="3474745554856756813">С устройства будут удалены объекты (<ph name="ITEMS_COUNT" />). Чтобы восстановить данные позже, войдите в Chromium как <ph name="USER_EMAIL" />.</translation> <translation id="3497319089134299931">Переключиться на другой профиль Chromium можно с помощью сочетания клавиш <ph name="SHORTCUT" /></translation> <translation id="3509308970982693815">Закройте все окна Chromium и повторите попытку снова.</translation> +<translation id="3518180795744733843">С помощью Google Ассистента в Chromium можно выполнять действия на сайтах</translation> <translation id="3533435340678213462">Для защиты вашей конфиденциальности интересы автоматически удаляются через 4 недели с момента создания. Если после этого вы продолжите использовать браузер, то удаленные интересы могут вновь появиться в списке. Чтобы Chromium не учитывал конкретные интересы, вы можете их удалить.</translation> <translation id="3567254597502212821">Ваша история браузера – список сайтов, которые вы открывали в Chromium на этом устройстве.</translation> <translation id="3575459661164320785">На компьютере обнаружено вредоносное ПО. Chromium может удалить его, восстановить настройки и отключить расширения. Это вернет браузер в обычное состояние.</translation>
diff --git a/chrome/app/resources/chromium_strings_sk.xtb b/chrome/app/resources/chromium_strings_sk.xtb index 2a9d03a3..e8456ed2 100644 --- a/chrome/app/resources/chromium_strings_sk.xtb +++ b/chrome/app/resources/chromium_strings_sk.xtb
@@ -13,6 +13,7 @@ <translation id="1185134272377778587">Informácie o prehliadači Chromium</translation> <translation id="1203500561924088507">Ďakujeme za inštaláciu. Než začnete aplikáciu <ph name="BUNDLE_NAME" /> používať, musíte reštartovať prehliadač.</translation> <translation id="1315551408014407711">Nastavte si nový profil prehliadača Chromium</translation> +<translation id="1385859895174722837">Asistent Google v prehliadači Chromium</translation> <translation id="1396446129537741364">Prehliadač Chromium sa snaží zobraziť heslá.</translation> <translation id="1414495520565016063">Ste prihlásený/-á do prehliadača Chromium.</translation> <translation id="1524282610922162960">Zdieľajte kartu prehliadača Chromium</translation> @@ -103,6 +104,7 @@ <translation id="3474745554856756813">Táto akcia odstráni zo zariadenia niekoľko položiek (počet: <ph name="ITEMS_COUNT" />). Ak budete chcieť svoje údaje neskôr opäť načítať, prihláste sa do prehliadača Chromium ako <ph name="USER_EMAIL" />.</translation> <translation id="3497319089134299931">Skratkou <ph name="SHORTCUT" /> môžete prepínať profily prehliadača Chromium</translation> <translation id="3509308970982693815">Zatvorte všetky okná prehliadača Chromium a skúste to znova.</translation> +<translation id="3518180795744733843">Asistent Google v prehliadači Chromium môže za vás dokončiť akcie na weboch</translation> <translation id="3533435340678213462">V rámci ochrany vášho súkromia automaticky odstraňujeme záujmy, ktoré sú staršie ako štyri týždne. Pri ďalšom prehliadaní sa v zozname môže znova zobraziť určitý záujem. Prípadne môžete odstrániť záujmy, ktoré nemá Chromium posudzovať.</translation> <translation id="3567254597502212821">Vaša história prehliadania, teda záznam webov, ktoré ste navštívili pomocou prehliadača Chromium v tomto zariadení.</translation> <translation id="3575459661164320785">V počítači máte škodlivý softvér. Chromium ho môže odstrániť, obnoviť nastavenia a deaktivovať rozšírenia, aby prehliadač znova normálne fungoval.</translation>
diff --git a/chrome/app/resources/chromium_strings_th.xtb b/chrome/app/resources/chromium_strings_th.xtb index b44e097..a01512e 100644 --- a/chrome/app/resources/chromium_strings_th.xtb +++ b/chrome/app/resources/chromium_strings_th.xtb
@@ -11,6 +11,7 @@ <translation id="1185134272377778587">เกี่ยวกับ Chromium</translation> <translation id="1203500561924088507">ขอขอบคุณที่ติดตั้ง คุณต้องรีสตาร์ทเบราว์เซอร์ก่อนใช้ <ph name="BUNDLE_NAME" /></translation> <translation id="1315551408014407711">ตั้งค่าโปรไฟล์ Chromium ใหม่</translation> +<translation id="1385859895174722837">Google Assistant ใน Chromium</translation> <translation id="1396446129537741364">Chromium กำลังพยายามแสดงรหัสผ่าน</translation> <translation id="1414495520565016063">คุณลงชื่อเข้าใช้ Chromium แล้ว!</translation> <translation id="1524282610922162960">แชร์แท็บ Chromium</translation> @@ -101,6 +102,7 @@ <translation id="3474745554856756813">การดำเนินการนี้จะลบ <ph name="ITEMS_COUNT" /> รายการออกจากอุปกรณ์นี้ หากต้องการดึงข้อมูลภายหลัง ให้ลงชื่อเข้าใช้ Chromium ด้วย <ph name="USER_EMAIL" /></translation> <translation id="3497319089134299931"><ph name="SHORTCUT" /> จะสลับไปมาระหว่างโปรไฟล์ Chromium ได้</translation> <translation id="3509308970982693815">โปรดปิดหน้าต่าง Chromium ทั้งหมดแล้วลองอีกครั้ง</translation> +<translation id="3518180795744733843">Google Assistant ใน Chromium ดำเนินการต่างๆ ในเว็บไซต์ให้คุณได้</translation> <translation id="3533435340678213462">เราลบความสนใจที่เก่ากว่า 4 สัปดาห์โดยอัตโนมัติเพื่อปกป้องความเป็นส่วนตัวของคุณ ความสนใจอาจกลับมาปรากฏในรายการอีกเมื่อคุณท่องเว็บต่อ หรือคุณจะนำความสนใจที่ไม่ต้องการให้ Chromium พิจารณาออกก็ได้</translation> <translation id="3567254597502212821">ประวัติการท่องเว็บ ซึ่งเป็นบันทึกรายการเว็บไซต์ที่คุณเข้าชมโดยใช้ Chromium ในอุปกรณ์นี้</translation> <translation id="3575459661164320785">มีซอฟต์แวร์อันตรายในคอมพิวเตอร์ของคุณ Chromium ช่วยนำซอฟต์แวร์ดังกล่าวออก คืนการตั้งค่า และปิดใช้ส่วนขยายให้คุณได้ เพื่อให้เบราว์เซอร์กลับมาทำงานเป็นปกติอีกครั้ง</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 71b1997..2382f40 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -1255,6 +1255,7 @@ <translation id="2159488579268505102">USB-C</translation> <translation id="216169395504480358">Wi-Fi ያክሉ...</translation> <translation id="2162155940152307086">አንዴ ከስምረት ቅንብሮች ከወጡ በኋላ ስምረት ይጀምራል</translation> +<translation id="2162705204091149050">ስለ የእርስዎ አሳሽ፣ ስርዓተ ክወና፣ መሣሪያ፣ የተጫነ ሶፍትዌር እና ፋይሎች መረጃ ያንብቡ</translation> <translation id="2162926944953615670">የሚገኙ የኢሲም መገለጫዎች የሉም</translation> <translation id="2163470535490402084">ወደ የእርስዎ <ph name="DEVICE_TYPE" /> ለመግባት እባክዎ ከበይነመረብ ጋር ይገናኙ።</translation> <translation id="2164131635608782358"><ph name="FIRST_SWITCH" />፣ <ph name="SECOND_SWITCH" />፣ <ph name="THIRD_SWITCH" /> እና 1 ተጨማሪ ማብሪያና ማጥፊያ</translation> @@ -1275,6 +1276,7 @@ <translation id="2180620921879609685">ይዘትን በማንኛውም ገጽ ላይ አግድ</translation> <translation id="2182058453334755893">ወደ የእርስዎ ቅንጥብ ሰሌዳ ላይ ተቀድቷል</translation> <translation id="2184515124301515068">Chrome ጣቢያዎች መቼ ድምጽን ማጫወት እንደሚችሉ እንዲመርጥ ይፍቀዱ (የሚመከር)</translation> +<translation id="2186206192313702726">Google ሌንስ</translation> <translation id="2186711480981247270">ከሌላ መሣሪያ የተጋራ ገጽ</translation> <translation id="2187675480456493911">በመለያዎ ላይ ካሉ ሌሎች መሣሪያዎች ጋር ሰምሯል። በሌሎች ተጠቃሚዎች የተቀየሩ ቅንብሮች አይሰምሩም። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation> <translation id="2187895286714876935">የአገልጋይ ዕውቅና ማረጋገጫ ስህተት</translation> @@ -2504,6 +2506,7 @@ <translation id="3359256513598016054">የሰርቲፊኬት መመሪያ እገዳዎች</translation> <translation id="3360297538363969800">ማተም አልተሳካም። እባክዎ አታሚዎን ይፈትሹትና እንደገና ይሞክሩ።</translation> <translation id="3361421571228286637">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> <ph name="ATTACHMENTS" />ን ለእርስዎ እያጋሩ ነው።}one{<ph name="DEVICE_NAME" /> <ph name="ATTACHMENTS" />ን ለእርስዎ እያጋሩ ነው።}other{<ph name="DEVICE_NAME" /> <ph name="ATTACHMENTS" />ን ለእርስዎ እያጋሩ ነው።}}</translation> +<translation id="3363202073972776113">ይህ አዲስ መገለጫ በድርጅትዎ የሚተዳደር ይሆናል። <ph name="BEGIN_LINK" />የበለጠ ለመረዳት<ph name="END_LINK" /></translation> <translation id="3364986687961713424">ከእርስዎ አስተዳዳሪ፦ <ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">Ctrl ወይም Alt ይጠቀሙ</translation> <translation id="3368922792935385530">ተያይዟል</translation> @@ -2538,6 +2541,7 @@ <translation id="339722927132407568">ይረጋል</translation> <translation id="3399432415385675819">ማሳወቂያዎች ይሰናከላሉ</translation> <translation id="3400390787768057815"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (<ph name="REFRESH_RATE" /> Hertz) - የተጠላለፈ</translation> +<translation id="3401484564516348917">ስለ የእርስዎ አሳሽ፣ ስርዓተ ክወና፣ መሣሪያ፣ የተጫነ ሶፍትዌር፣ የምዝገባ እሴቶች እና ፋይሎች መረጃ ያንብቡ</translation> <translation id="3402059702184703067">{COUNT,plural, =1{{COUNT} የይለፍ ቃል በዚህ መሣሪያ ላይ ተቀምጧል}one{{COUNT} የይለፍ ቃላት በዚህ መሣሪያ ላይ ተቀምጠዋል}other{{COUNT} የይለፍ ቃላት በዚህ መሣሪያ ላይ ተቀምጠዋል}}</translation> <translation id="3402255108239926910">አምሳያ ይምረጡ</translation> <translation id="3402585168444815892">በማሳያ ሁነታ ላይ ያስመዝግቡ</translation> @@ -2784,6 +2788,7 @@ <translation id="3627879631695760395"><ph name="APP" /> ይጫን...</translation> <translation id="3628275722731025472">ብሉቱዝ አጥፋ</translation> <translation id="3629631988386925734">Smart Lockን ለማንቃት የይለፍ ቃልዎን ያስገቡ። በሚቀጥለው ጊዜ ስልክዎ የእርስዎን <ph name="DEVICE_TYPE" /> ይከፍታል። በቅንብሮች ውስጥ Smart Lock ማጥፋት ይችላሉ።</translation> +<translation id="3629664892718440872">ይህን ምርጫ አስታውስ</translation> <translation id="3630132874740063857">የእርስዎ ስልክ</translation> <translation id="3630995161997703415">ይህን ጣቢያ በማንኛውም ጊዜ ለመጠቀም ወደ መደርደሪያዎ ያክሉት</translation> <translation id="3631680145967006828"><ph name="BEGIN_PARAGRAPH1" />የእርስዎ የChromeOS መሣሪያዎች ራስ-ሰር ሪፖርቶችን እንዲልኩ መፍቀድ እኛ በChromeOS ውስጥ ምን መስተካከል እና መሻሻል እንዳለበት ቅድሚያ እንድንሰጥ ያግዘናል። እነዚህ ሪፖርቶች እንደ ChromeOS ሲበላሽ፣ የትኛዎቹን ባህሪያት እንደሚጠቀሙ እና ምን ያህል ማህደረ ትውስታን በተለምዶ እንደሚጠቀሙ ያሉ ነገሮችን ሊያካትቱ ይችላሉ።<ph name="END_PARAGRAPH1" /> @@ -3271,6 +3276,7 @@ <translation id="4085298594534903246">በዚህ ገጽ ላይ ጃቫስክሪፕት ታግዷል።</translation> <translation id="4087089424473531098">ቅጥያውን ፈጥሯል፦ <ph name="EXTENSION_FILE" /></translation> <translation id="408721682677442104">የMIDI መሣሪያዎች ሙሉ ቁጥጥር ተከልክሏል</translation> +<translation id="4087328411748538168">በቀኝ በኩል አሳይ</translation> <translation id="4089235344645910861">ቅንብሮች ተቀምጠዋል። ስምረት ጀምሯል።</translation> <translation id="4090103403438682346">የተረጋገጠ መዳረሻ ያንቁ</translation> <translation id="4090947011087001172">ለ<ph name="SITE" /> የጣቢያ ፈቃዶች ዳግም ይቀናበሩ?</translation> @@ -3964,6 +3970,7 @@ <translation id="4779766576531456629">የኢሲም የተንቀሳቃሽ ስልክ አውታረ መረብን ዳግም ይሰይሙ</translation> <translation id="4780321648949301421">ገጽ አስቀምጥ እንደ…</translation> <translation id="4781443161433589743">በChrome በጣም ጠንካራው ደህንነት ላይ ነዎት</translation> +<translation id="4782861709165039462">በመሣሪያዎች ሃርድዌር መቀየሪያ አማካኝነት ሁሉም ማይክሮፎኖች ተሰናክለዋል</translation> <translation id="4785719467058219317">በዚህ ድር ጣቢያ ያልተመዘገበ የደህንነት ቁልፍ እየተጠቀሙ ነው</translation> <translation id="4785914069240823137">ከርክምን ሰርዝ</translation> <translation id="4788092183367008521">እባክዎ የአውታረ መረብ ግንኙነትዎን ይፈትሹትና እንደገና ይሞክሩ።</translation> @@ -4730,6 +4737,7 @@ <translation id="5548075230008247516">ሁሉም ንጥሎች አተመረጡም፣ ከምርጫ ሁነታ ተወጥቷል።</translation> <translation id="5548159762883465903">{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="5548606607480005320">የደህንነት ፍተሻ</translation> +<translation id="5548644592758170183">በግራ በኩል አሳይ</translation> <translation id="554903022911579950">Kerberos</translation> <translation id="5551573675707792127">የቁልፍ ሰሌዳ እና የጽሑፍ ግቤት</translation> <translation id="5553089923092577885">የሰርቲፊኬት መመሪያ ጉድኝቶች</translation> @@ -8221,6 +8229,7 @@ <translation id="8980345560318123814">የግብረመልስ ሪፖርቶች</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> - ተበላሽቷል</translation> <translation id="8981825781894055334">ወረቀት እያለቀ ነው</translation> +<translation id="8983018820925880511">ይህ አዲስ መገለጫ በ<ph name="DOMAIN" /> የሚተዳደር ይሆናል። <ph name="BEGIN_LINK" />የበለጠ ለመረዳት<ph name="END_LINK" /></translation> <translation id="8983632908660087688"><ph name="ORIGIN" /> <ph name="FILENAME" />ን ማርትዕ ይችላል</translation> <translation id="8984694057134206124">እርስዎ ለ<ph name="MINUTES" /> ደቂቃዎች የሚታዩ ይሆናሉ። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation> <translation id="8985191021574400965">እንኳን ወደ የChromebook Steam በደህና መጡ</translation> @@ -8318,6 +8327,7 @@ <translation id="9075413375877487220">ይህ ቅጥያ በተሻሻለ የደህንነት አሰሳ የታመነ አይደለም።</translation> <translation id="9076283476770535406">ለአዋቂ ብቻ የሚሆን ይዘት ሊኖረው ይችላል</translation> <translation id="9076523132036239772">ይቅርታ፣ ኢሜይልዎ ወይም የይለፍ ቃልዎ ሊረጋገጥ አልቻለም። መጀመሪያ ከአውታረ መረብ ጋር ለመገናኘት ይሞክሩ።</translation> +<translation id="9076821103818989526">የጎን ፓነል</translation> <translation id="9076977315710973122">የSMB ማጋራት</translation> <translation id="9078193189520575214">ለውጦችን በመተግበር ላይ...</translation> <translation id="9078316009970372699">ቅጽበታዊ እንደ ሞደም መሰካትን አሰናክል</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index 0d9ed9e81..fd7c0b2 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -356,6 +356,7 @@ <translation id="1340527397989195812">احتفظ بنسخة احتياطية للوسائط من الجهاز باستخدام تطبيق Files.</translation> <translation id="1343865611738742294">يمنح Linux أذونات التطبيق للوصول إلى أجهزة USB. لن يتذكر Linux جهاز USB بعد إزالته.</translation> <translation id="1343920184519992513">المتابعة من حيث توقفت وفتح مجموعة مُحدَّدة من الصفحات</translation> +<translation id="1344377983938103876">جارٍ فتح <ph name="URL" />...</translation> <translation id="134589511016534552">تظهر علامات تبويب الوسائط أيضًا في القسم "علامات التبويب المفتوحة".</translation> <translation id="1346630054604077329">التأكيد وإعادة التشغيل</translation> <translation id="1346748346194534595">يمين</translation> @@ -6959,6 +6960,7 @@ <translation id="7753735457098489144">تعذَّر التثبيت لعدم توفُّر مساحة تخزين. لتوفير مساحة، يمكنك حذف الملفات من مساحة تخزين الجهاز.</translation> <translation id="7754347746598978109">المواقع الإلكترونية التي لا يُسمح لها باستخدام JavaScript</translation> <translation id="7754704193130578113">السؤال عن مكان حفظ الملفّات قبل تنزيلها</translation> +<translation id="7755134875397410803">لمساعدتك على إنجاز المهام، ستتلقى Google عناوين URL والمحتوى للمواقع الإلكترونية التي استخدمت فيها "مساعد Google"، بالإضافة إلى المعلومات التي يتم إرسالها من خلال "مساعد Google". قد تكون هذه المعلومات مُخزَّنة في حسابك على Google. يمكنك إيقاف "مساعد Google" في إعدادات Chrome. <ph name="LEARN_MORE" /></translation> <translation id="7755287808199759310">قد يلغي والداك الحظر لك</translation> <translation id="7757592200364144203">تغيير اسم الجهاز</translation> <translation id="7757739382819740102">يمكن لجهات الاتصال القريبة المشاركة معك. وسيكون عليك الموافقة على المشاركة.</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb index 4dde765..4075206 100644 --- a/chrome/app/resources/generated_resources_as.xtb +++ b/chrome/app/resources/generated_resources_as.xtb
@@ -355,6 +355,7 @@ <translation id="1340527397989195812">এই ডিভাইচৰ বেক আপ মিডিয়াই Files এপ্টো ব্যৱহাৰ কৰি আছে।</translation> <translation id="1343865611738742294">Linux এপক ইউএছবি ডিভাইচ এক্সেছ কৰিবলৈ অনুমতি দিয়ক। কোনো ইউএছবি ডিভাইচ আঁতৰোৱাৰ পাছত Linuxএ সেইটো মনত নাৰাখিব।</translation> <translation id="1343920184519992513">আপুনি য’ত এৰিছিল তাৰ পৰা অব্যাহত ৰাখক আৰু পৃষ্ঠাৰ এটা নিৰ্দিষ্ট ছেট খোলক</translation> +<translation id="1344377983938103876"><ph name="URL" /> খুলি থকা হৈছে...</translation> <translation id="134589511016534552">খোলা টেবৰ শাখাতো মিডিয়াৰ টেবসমূহ দেখুওৱা</translation> <translation id="1346630054604077329">নিশ্চিত কৰি ৰিছেট কৰক</translation> <translation id="1346748346194534595">সোঁ</translation> @@ -6969,6 +6970,7 @@ <translation id="7753735457098489144">ষ্ট’ৰেজৰ ঠাই কম হোৱাৰ কাৰণে ইনষ্টল কৰিব পৰা নগ’ল। ঠাই খালী কৰিবলৈ ডিভাইচৰ ষ্ট’ৰেজৰ পৰা ফাইলসমূহ মচক।</translation> <translation id="7754347746598978109">JavaScript ব্যৱহাৰ কৰাৰ অনুমতি নাই</translation> <translation id="7754704193130578113">ডাউনল'ড কৰাৰ আগতে প্ৰতিটো ফাইল ক'ত ছেভ কৰা হ'ব সেয়া সোধক</translation> +<translation id="7755134875397410803">আপোনাক কামবোৰ সম্পূৰ্ণ কৰাত সহায় কৰিবলৈ, আপুনি Assistant ব্যৱহাৰ কৰা ছাইটসমূহৰ URL আৰু সমল তথা আপুনি Assistantৰ জৰিয়তে দাখিল কৰা তথ্য Googleএ লাভ কৰিব। এই তথ্যখিনি আপোনাৰ Google একাউণ্টত ষ্ট’ৰ কৰা হ’ব পাৰে। আপুনি Chromeৰ ছেটিঙত Assistant অফ কৰিব পাৰে। <ph name="LEARN_MORE" /></translation> <translation id="7755287808199759310">আপোনাৰ অভিভাৱকে এই ছাইটটো আপোনাৰ বাবে অৱৰোধৰ পৰা আঁতৰাব পাৰে</translation> <translation id="7757592200364144203">ডিভাইচৰ নাম সলনি কৰক</translation> <translation id="7757739382819740102">নিকটৱৰ্তী স্থানত থকা সম্পর্কসমূহে আপোনাৰ সৈতে শ্বেয়াৰ কৰিব পাৰে। অনুমোদনৰ আৱশ্যক হ'ব।</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index 453f8b39..25930dd6 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -350,6 +350,7 @@ <translation id="1340527397989195812">Fayllar tətbiqini istifadə etməklə medianı cihazdan yedəkləyin.</translation> <translation id="1343865611738742294">USB cihazlarına daxil olmaq üçün Linux tətbiqlərinə giriş icazəsi verin. Linux USB cihazı silindikdən sonra onu yadda saxlamayacaq.</translation> <translation id="1343920184519992513">Qaldığınız yerdən davam edin və xüsusi səhifələr dəstini açın</translation> +<translation id="1344377983938103876"><ph name="URL" /> açılır...</translation> <translation id="134589511016534552">Media tabları Açıq Tablar bölməsində də göstərilir</translation> <translation id="1346630054604077329">Təsdiqləyin və yenidən başladın</translation> <translation id="1346748346194534595">Sağ</translation> @@ -6951,6 +6952,7 @@ <translation id="7753735457098489144">Yaddaşda kifayət qədər yer olmadığına görə quraşdırılmadı. Yer boşaltmaq üçün cihazın yaddaşındakı faylları silin.</translation> <translation id="7754347746598978109">Javascript'dən istifadə etməyə icazə verilmir</translation> <translation id="7754704193130578113">Endirmədən öncə faylın saxlanacağı yeri soruşun</translation> +<translation id="7755134875397410803">Tapşırıqları tamamlamaqda sizə kömək etmək üçün Google Assistentdən istifadə etdiyiniz saytların URL və məzmunlarını, eləcə də Assistent vasitəsilə təqdim etdiyiniz məlumatları əldə edəcək. Bu məlumat Google Hesabınızda saxlanıla bilər. Assistenti Chrome ayarlarında deaktiv edə bilərsiniz. <ph name="LEARN_MORE" /></translation> <translation id="7755287808199759310">Valideyniniz kilidi aça bilər</translation> <translation id="7757592200364144203">Cihaz adını dəyişin</translation> <translation id="7757739382819740102">Yaxınlıqdakı kontaktlar sizinlə paylaşa bilər. Təsdiq tələb olunacaq.</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb index 17b87bf..cba36d4 100644 --- a/chrome/app/resources/generated_resources_be.xtb +++ b/chrome/app/resources/generated_resources_be.xtb
@@ -1271,6 +1271,7 @@ <translation id="2180620921879609685">Блакіраваць змесціва на любой старонцы</translation> <translation id="2182058453334755893">Скапіравана ў буфер абмену</translation> <translation id="2184515124301515068">Дазволіць браўзеру Chrome вызначаць, калі сайты могуць прайграваць гук (рэкамендуецца)</translation> +<translation id="2186206192313702726">Google Аб'ектыў</translation> <translation id="2186711480981247270">Старонка абагулена з іншай прылады</translation> <translation id="2187675480456493911">Сінхранізавана з іншымі прыладамі ў вашым уліковым запісе. Налады, змененыя іншымі карыстальнікамі, не будуць сінхранізавацца. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Памылка імпарту сертыфіката сервера</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index f5cab320..5e166fc2 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -354,6 +354,7 @@ <translation id="1340527397989195812">Създаване на резервно копие на носителя от устройството с помощта на приложението Файлове.</translation> <translation id="1343865611738742294">Разрешаване на приложенията за Linux да осъществяват достъп до USB устройства. Linux няма да запомни дадено USB устройство, след като бъде премахнато.</translation> <translation id="1343920184519992513">Продължаване оттам, откъдето сте прекъснали, и отваряне на определен набор от страници</translation> +<translation id="1344377983938103876"><ph name="URL" /> се отваря…</translation> <translation id="134589511016534552">Разделите с мултимедия също се показват в секцията с отворени раздели</translation> <translation id="1346630054604077329">Потвърждаване и рестартиране</translation> <translation id="1346748346194534595">Надясно</translation> @@ -6969,6 +6970,7 @@ <translation id="7753735457098489144">Инсталирането не бе успешно поради липса на място в хранилището. За да освободите място, изтрийте файлове от хранилището на устройството.</translation> <translation id="7754347746598978109">Сайтове без разрешение за използване на JavaScript</translation> <translation id="7754704193130578113">Извеждане на запитване къде да бъде запазен всеки файл преди изтеглянето му</translation> +<translation id="7755134875397410803">За да ви помага да изпълнявате задачи, Google ще получава URL адресите и съдържанието на сайтовете, в които използвате Асистент, както и данните, които изпращате чрез услугата. Тази информация може да се съхранява в профила ви в Google. Имате възможност да изключите Асистент от настройките на Chrome. <ph name="LEARN_MORE" /></translation> <translation id="7755287808199759310">Родителят ви може да го отблокира за вас</translation> <translation id="7757592200364144203">Промяна на името на устройството</translation> <translation id="7757739382819740102">Контактите в близост могат да споделят с вас. За целта ще се изисква одобрение.</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index 58bf51f3..9f95b49 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -3223,7 +3223,7 @@ <translation id="402211067068791756">Ovim će se obrisati <ph name="TOTAL_USAGE" /> podataka koje su pohranile prikazane web lokacije</translation> <translation id="4022426551683927403">&Dodaj u rječnik</translation> <translation id="4025039777635956441">Isključi zvuk odabrane web lokacije</translation> -<translation id="4027958407426528157">Otvaranje web-lokacija u aplikacijama instaliranima na vašem uređaju <ph name="DEVICE_TYPE" /></translation> +<translation id="4027958407426528157">Otvarajte web lokacije u aplikacijama instaliranim na vašem uređaju <ph name="DEVICE_TYPE" /></translation> <translation id="4028467762035011525">Dodajte načine unosa</translation> <translation id="4029556917477724407">Nazad sa stranice <ph name="PAGE_TITLE" /></translation> <translation id="4031179711345676612">Mikrofon je dozvoljen</translation> @@ -6578,7 +6578,7 @@ <translation id="7377481913241237033">Povežite se pomoću koda</translation> <translation id="7378611153938412599">Slabe lozinke je lako pogoditi. Vodite računa da kreirate jake lozinke. <ph name="BEGIN_LINK" />Pogledajte još sigurnosnih savjeta.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Otvorite Chrome Web trgovinu</translation> -<translation id="737938816678769289">Lako se povežite s uređajima za brzo uparivanje u blizini i postavite ih</translation> +<translation id="737938816678769289">Jednostavno se povežite sa uređajima za Brzo uparivanje u blizini i postavite ih</translation> <translation id="7380459290951585794">Provjerite nalazi li se telefon u blizini, je li otključan i jesu li Bluetooth i WiFi uključeni</translation> <translation id="7380622428988553498">Naziv uređaja sadrži nevažeće znakove</translation> <translation id="7380768571499464492">Ažurirano <ph name="PRINTER_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index bfa3af9..cff7fc23 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -352,6 +352,7 @@ <translation id="1340527397989195812">Feu una còpia de seguretat dels fitxers multimèdia del dispositiu mitjançant l'aplicació Fitxers.</translation> <translation id="1343865611738742294">Concedeix permís a les aplicacions de Linux per accedir als dispositius USB. Linux no recordarà els dispositius USB després d'extreure'ls.</translation> <translation id="1343920184519992513">Continua des d'on ho vas deixar i obre un conjunt de pàgines específic</translation> +<translation id="1344377983938103876">S'està obrint <ph name="URL" />...</translation> <translation id="134589511016534552">Les pestanyes multimèdia també es mostren a la secció Pestanyes obertes</translation> <translation id="1346630054604077329">Confirma i reinicia</translation> <translation id="1346748346194534595">Dreta</translation> @@ -6953,6 +6954,7 @@ <translation id="7753735457098489144">Ha fallat la instal·lació perquè falta espai d'emmagatzematge. Per alliberar espai, suprimeix fitxers de l'emmagatzematge del dispositiu.</translation> <translation id="7754347746598978109">Sense permís per utilitzar JavaScript</translation> <translation id="7754704193130578113">Pregunta on es desarà cada fitxer abans de baixar-lo</translation> +<translation id="7755134875397410803">Per ajudar-te a dur a terme tasques, Google rebrà els URL i el contingut dels llocs web en què facis servir l'Assistent, així com la informació que enviïs amb l'Assistent. Pot ser que aquesta informació s'emmagatzemi al teu Compte de Google. Pots desactivar l'Assistent a la configuració de Chrome. <ph name="LEARN_MORE" /></translation> <translation id="7755287808199759310">El teu pare o mare et poden desbloquejar el lloc</translation> <translation id="7757592200364144203">Canvia el nom del dispositiu</translation> <translation id="7757739382819740102">Els contactes que siguin a prop poden compartir contingut amb tu. Caldrà una aprovació.</translation>
diff --git a/chrome/app/resources/generated_resources_cy.xtb b/chrome/app/resources/generated_resources_cy.xtb index 9676b7ca..46b6b4a 100644 --- a/chrome/app/resources/generated_resources_cy.xtb +++ b/chrome/app/resources/generated_resources_cy.xtb
@@ -358,6 +358,7 @@ <translation id="1340527397989195812">Gwneud copïau wrth gefn o gyfryngau o'r ddyfais gan ddefnyddio'r ap Files.</translation> <translation id="1343865611738742294">Rhowch ganiatâd i apiau Linux gael mynediad at ddyfeisiau USB. Ni fydd Linux yn cofio dyfais USB ar ôl ei dynnu.</translation> <translation id="1343920184519992513">Parhau lle y gwnaethoch adael ac agor set penodol o dudalennau</translation> +<translation id="1344377983938103876">Wrthi'n agor <ph name="URL" />...</translation> <translation id="134589511016534552">Mae tabiau cyfryngau hefyd yn cael eu dangos yn yr adran Tabiau Agored</translation> <translation id="1346630054604077329">Cadarnhau ac ailgychwyn</translation> <translation id="1346748346194534595">De</translation> @@ -6982,6 +6983,7 @@ <translation id="7753735457098489144">Ni fu modd cwblhau'r broses osod oherwydd diffyg gofod storio. I wneud le stori, dilëwch ffeiliau o storfa'r ddyfais.</translation> <translation id="7754347746598978109">Heb ganiatâd i ddefnyddio JavaScript</translation> <translation id="7754704193130578113">Gofyn ble i gadw pob ffeil cyn ei lawrlwytho</translation> +<translation id="7755134875397410803">Er mwyn eich helpu i gwblhau tasgau, bydd Google yn cael URL a chynnwys gwefannau rydych yn defnyddio Assistant arnynt, yn ogystal â gwybodaeth rydych yn ei chyflwyno drwy Assistant. Gellir storio'r wybodaeth hon yn eich Cyfrif Google. Gallwch ddiffodd Assistant yn y gosodiadau Chrome. <ph name="LEARN_MORE" /></translation> <translation id="7755287808199759310">Gall dy riant ei ddadrwystro i ti</translation> <translation id="7757592200364144203">Newid enw'r ddyfais</translation> <translation id="7757739382819740102">Gall cysylltiadau gerllaw rannu gyda chi. Bydd angen cymeradwyaeth.</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index 4839215..485415b2 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -355,6 +355,7 @@ <translation id="1340527397989195812">Sikkerhedskopiér medier fra enheden ved hjælp af appen Filer.</translation> <translation id="1343865611738742294">Giv Linux-apps adgang til USB-enheder. Linux husker ikke en USB-enhed, når den er fjernet.</translation> <translation id="1343920184519992513">Fortsæt, hvor du slap, og åbn en bestemt række sider</translation> +<translation id="1344377983938103876">Åbner <ph name="URL" />...</translation> <translation id="134589511016534552">Mediefaner vises også i sektionen Åbne faner</translation> <translation id="1346630054604077329">Bekræft og genstart</translation> <translation id="1346748346194534595">Højre</translation> @@ -6974,6 +6975,7 @@ <translation id="7753735457098489144">Installationen mislykkedes på grund af manglende lagerplads. Slet filer fra lageret på din enhed for at frigøre plads.</translation> <translation id="7754347746598978109">Har ikke tilladelse til at bruge JavaScript</translation> <translation id="7754704193130578113">Spørg, hvor hver enkelt fil skal gemmes, inden download begynder</translation> +<translation id="7755134875397410803">For at hjælpe dig med at udføre opgaver modtager Google webadresser for og indhold på websites, hvor du bruger Assistent, samt oplysninger du indsender via Assistent. Disse oplysninger gemmes muligvis på din Google-konto. Du kan deaktivere Assistent i indstillingerne for Chrome. <ph name="LEARN_MORE" /></translation> <translation id="7755287808199759310">Din forælder kan fjerne blokeringen for dig</translation> <translation id="7757592200364144203">Skift navn på enheden</translation> <translation id="7757739382819740102">Kontakter i nærheden kan dele med dig. Godkendelse er påkrævet.</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index 1d47fd0f..adacdeb 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -1019,6 +1019,7 @@ <translation id="1935303383381416800">Allowed to see your location</translation> <translation id="1936931585862840749">Use a number to indicate how many copies to print (1 to <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Cannot import container architecture type <ph name="ARCHITECTURE_CONTAINER" /> with this device which is <ph name="ARCHITECTURE_DEVICE" />. You can try restoring this container into a different device, or you can access the files inside this container image by opening in Files app.</translation> +<translation id="1938240902511979591">High-contrast mode, magnifier and display settings</translation> <translation id="1938320257168860255">Something went wrong. Make sure that your phone is close by, unlocked and Bluetooth and Wi-Fi are turned on.</translation> <translation id="1938351510777341717">External command</translation> <translation id="1940546824932169984">Connected devices</translation> @@ -1441,6 +1442,7 @@ <ph name="FOOTER_MESSAGE" /></translation> <translation id="2308798336967462263">The following keys aren’t supported: Tab, Shift, Control, Escape, Caps lock, Volume</translation> <translation id="2309620859903500144">This site has been blocked from accessing your motion or light sensors.</translation> +<translation id="2310923358723722542">Display and magnification</translation> <translation id="2312219318583366810">Page URL</translation> <translation id="2314165183524574721">Current visibility setting is hidden</translation> <translation id="2314774579020744484">Language used when translating pages</translation> @@ -4177,6 +4179,7 @@ <translation id="496446150016900060">Sync Wi-Fi networks with your phone</translation> <translation id="4965808351167763748">Are you sure that you want to set up this device to run Hangouts Meet?</translation> <translation id="4966972803217407697">You're Incognito</translation> +<translation id="4967227914555989138">Add a note</translation> <translation id="496742804571665842">Disable eSIM profiles</translation> <translation id="4971412780836297815">Open when done</translation> <translation id="4971735654804503942">Faster, proactive protection against dangerous websites, downloads and extensions. Warns you about password breaches. Requires browsing data to be sent to Google.</translation> @@ -4424,6 +4427,7 @@ <translation id="5233231016133573565">Process ID</translation> <translation id="5233638681132016545">New tab</translation> <translation id="5233736638227740678">&Paste</translation> +<translation id="5233794855520048159">Mono audio, sounds on startup and captions</translation> <translation id="5234764350956374838">Dismiss</translation> <translation id="5235050375939235066">Uninstall app?</translation> <translation id="523505283826916779">Accessibility settings</translation> @@ -4528,6 +4532,7 @@ <translation id="5333896723098573627">To remove apps, go to Settings > Apps > Google Play Store > Manage Android preferences > Apps or Application manager. Then tap the app that you want to uninstall (you may need to swipe right or left to find the app). Then tap Uninstall or Disable.</translation> <translation id="5334142896108694079">Script Cache</translation> <translation id="5336688142483283574">This page will also be removed from your history and <ph name="SEARCH_ENGINE" /> activity.</translation> +<translation id="5336689872433667741">Cursor and touchpad</translation> <translation id="5337771866151525739">Installed by a third party.</translation> <translation id="5337926771328966926">Current device name is <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">You can browse privately using an Incognito window</translation> @@ -4538,6 +4543,7 @@ <translation id="5342091991439452114">PIN must be at least <ph name="MINIMUM" /> digits</translation> <translation id="5344036115151554031">Restoring Linux</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (right)</translation> +<translation id="534449933710420173">Unnamed folder</translation> <translation id="5345916423802287046">Start app when you sign in</translation> <translation id="5350293332385664455">Turn off Google Assistant</translation> <translation id="535123479159372765">Text copied from other device</translation> @@ -5161,6 +5167,7 @@ <translation id="5959471481388474538">Network not available</translation> <translation id="595959584676692139">Reload page to use this extension</translation> <translation id="5963453369025043595"><ph name="NUM_HANDLES" /> (<ph name="NUM_KILOBYTES_LIVE" /> peak)</translation> +<translation id="5963620791620013026">Sticky keys, on-screen keyboard, dictation, switch access and enhanced highlight</translation> <translation id="5964113968897211042">{COUNT,plural, =0{Open all in &new window}=1{Open in &new window}other{Open all ({COUNT}) in &new window}}</translation> <translation id="5965661248935608907">It also controls what page is shown when you click the Home button or search from the Omnibox.</translation> <translation id="5968022600320704045">No search results</translation> @@ -5971,6 +5978,7 @@ <translation id="6770602306803890733">Improves security for you and everyone on the web</translation> <translation id="6771503742377376720">Is a Certification Authority</translation> <translation id="6775163072363532304">Available devices will appear here.</translation> +<translation id="677646486571529447">Add a note</translation> <translation id="6776729248872343918">Enable Fast Pair</translation> <translation id="6777817260680419853">Redirect blocked</translation> <translation id="6778737459546443941">Your parent hasn't approved it yet</translation> @@ -6119,6 +6127,7 @@ <translation id="6900654715912436255">Are you sure that you want to delete this search engine?</translation> <translation id="6901024547292737736"><ph name="ACTUAL_CHAR_COUNT" />/<ph name="MAX_CHAR_COUNT" /></translation> <translation id="6902066522699286937">Voice to preview</translation> +<translation id="6902219595840841518">Automatic click, cursor size, cursor colour and highlight cursor</translation> <translation id="6902336033320348843">Section not supported: <ph name="ERROR_LINE" /></translation> <translation id="6902837902700739466">Join device to domain</translation> <translation id="6903022061658753260">Your data will be synced across all Chrome browsers where you have turned on sync for this account. For Chrome OS sync options, go to <ph name="LINK_BEGIN" />Chrome OS settings<ph name="LINK_END" />.</translation> @@ -6896,6 +6905,7 @@ <translation id="7681095912841365527">Site can use Bluetooth</translation> <translation id="7681597159868843240">Sites usually use your device's motion sensors for features like virtual reality or fitness tracking</translation> <translation id="7683373461016844951">To continue, click OK, then click Add Person to create a new profile for your <ph name="DOMAIN" /> email address.</translation> +<translation id="7683834360226457448">Low vision display tools</translation> <translation id="7684212569183643648">Installed by Your Administrator</translation> <translation id="7684559058815332124">Visit captive portal login page</translation> <translation id="7684718995427157417">To create and test your apps, enable the Android Debug Bridge (ADB). Note that this action allows installation of Android apps that haven't been verified by Google, and requires a factory reset to disable.</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index 5475fa4d..b034dc2 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -1265,6 +1265,7 @@ <translation id="2180620921879609685">Bloquear contenido en cualquier página</translation> <translation id="2182058453334755893">Se copió en tu portapapeles</translation> <translation id="2184515124301515068">Permitir que Chrome elija cuándo los sitios pueden reproducir sonido (recomendado)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Página compartida desde otro dispositivo</translation> <translation id="2187675480456493911">La red está sincronizada con otros dispositivos de tu cuenta. No se sincronizarán las opciones de configuración que modifiquen otros usuarios. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Error en el servidor de importación de certificado</translation> @@ -2128,7 +2129,7 @@ <translation id="2966937470348689686">Administrar las preferencias de Android</translation> <translation id="2967926928600500959">Se forzará la apertura de las URLs que coincidan con estas reglas en un navegador específico.</translation> <translation id="2972581237482394796">&Rehacer</translation> -<translation id="2973324205039581528">Silenciar el sitio</translation> +<translation id="2973324205039581528">Silenciar sitio</translation> <translation id="2973537811036309675">Panel lateral</translation> <translation id="2976557544729462544">En algunos dispositivos, debes inhabilitar la protección de acceso a los datos para que funcionen correctamente o con el máximo rendimiento.</translation> <translation id="2977480621796371840">Quitar del grupo</translation> @@ -3927,7 +3928,7 @@ <translation id="4742334355511750246">No puede mostrar imágenes</translation> <translation id="4742970037960872810">Dejar de destacar</translation> <translation id="4743260470722568160"><ph name="BEGIN_LINK" />Obtener información sobre cómo actualizar las aplicaciones<ph name="END_LINK" /></translation> -<translation id="4744981231093950366">{NUM_TABS,plural, =1{Activar el sonido del sitio}other{Activar el sonido de los sitios}}</translation> +<translation id="4744981231093950366">{NUM_TABS,plural, =1{Activar sonido del sitio}other{Activar sonido de los sitios}}</translation> <translation id="474609389162964566">Accede a tu Asistente con "Hey Google"</translation> <translation id="4746351372139058112">Mensajes</translation> <translation id="4748783296226936791">Por lo general, los sitios se conectan a dispositivos HID para usarlos en funciones que utilizan teclados poco habituales, controles de juegos y otros dispositivos.</translation> @@ -4162,7 +4163,7 @@ <translation id="4972129977812092092">Editar impresora</translation> <translation id="4972164225939028131">Contraseña incorrecta</translation> <translation id="4972737347717125191">Permitir que los sitios soliciten permiso para usar datos y dispositivos de realidad virtual</translation> -<translation id="4973325300212422370">{NUM_TABS,plural, =1{Silenciar el sitio}other{Silenciar los sitios}}</translation> +<translation id="4973325300212422370">{NUM_TABS,plural, =1{Silenciar sitio}other{Silenciar sitios}}</translation> <translation id="497403230787583386">Se completaron los controles de seguridad. Se imprimirá el documento.</translation> <translation id="4977882548591990850"><ph name="CHARACTER_COUNT" />/<ph name="CHARACTER_LIMIT" /></translation> <translation id="4977942889532008999">Confirmar acceso</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index 432ca15b..c9d7f552 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -352,6 +352,7 @@ <translation id="1340527397989195812">Realiza una copia de seguridad de los archivos multimedia desde el dispositivo con la aplicación Archivos.</translation> <translation id="1343865611738742294">Da permiso a las aplicaciones de Linux para acceder a los dispositivos USB. Linux no recordará el dispositivo USB después de retirarlo.</translation> <translation id="1343920184519992513">Seguir por donde lo dejaste y abrir un conjunto concreto de páginas</translation> +<translation id="1344377983938103876">Abriendo <ph name="URL" />...</translation> <translation id="134589511016534552">Las pestañas multimedia también se muestran en la sección Pestañas abiertas</translation> <translation id="1346630054604077329">Confirmar y reiniciar</translation> <translation id="1346748346194534595">Derecha</translation> @@ -6954,6 +6955,7 @@ <translation id="7753735457098489144">No se ha podido realizar la instalación porque falta espacio de almacenamiento. Para liberar espacio, elimina archivos del almacenamiento del dispositivo.</translation> <translation id="7754347746598978109">No puede usar JavaScript</translation> <translation id="7754704193130578113">Preguntar dónde se guardará cada archivo antes de descargarlo</translation> +<translation id="7755134875397410803">Para ayudarte a completar tareas, Google recibirá las URLs y los contenidos de los sitios en los que uses el Asistente, así como la información que envíes a través de este. Es posible que esta información se almacene en tu cuenta de Google. Puedes desactivar el Asistente en la configuración de Chrome. <ph name="LEARN_MORE" /></translation> <translation id="7755287808199759310">Uno de tus padres puede desbloquearlo</translation> <translation id="7757592200364144203">Cambiar nombre del dispositivo</translation> <translation id="7757739382819740102">Los contactos que estén cerca pueden compartir contenido contigo. Se necesita autorización.</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 6650f14..5f258d0 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -354,6 +354,7 @@ <translation id="1340527397989195812">Seadme meediumi varundamine rakendusega Failid.</translation> <translation id="1343865611738742294">Andke Linuxi rakendustele luba USB-seadmetele juurde pääseda. Linux ei mäleta USB-seadet pärast selle eemaldamist.</translation> <translation id="1343920184519992513">Jätka sealt, kus pooleli jäin, ja ava konkreetne lehtede kogum</translation> +<translation id="1344377983938103876">Avatakse saiti <ph name="URL" /> …</translation> <translation id="134589511016534552">Meedia vahelehed kuvatakse ka jaotises Avatud vahelehed</translation> <translation id="1346630054604077329">Kinnita ja taaskäivita</translation> <translation id="1346748346194534595">Paremale</translation> @@ -6961,6 +6962,7 @@ <translation id="7753735457098489144">Installimine ebaõnnestus, kuna salvestusruumi on liiga vähe. Ruumi vabastamiseks kustutage seadme salvestusruumist faile.</translation> <translation id="7754347746598978109">Pole lubatud kasutada JavaScripti</translation> <translation id="7754704193130578113">Küsi enne iga faili allalaadimist, kuhu see salvestada.</translation> +<translation id="7755134875397410803">Selleks et aidata teil toiminguid teha, saadetakse Google'ile nende saitide URL-id ja sisu, millel assistenti kasutate, ning teave, mille assistendi kaudu esitate. See teave võidakse salvestada teie Google'i kontole. Assistendi saab Chrome'i seadetes välja lülitada. <ph name="LEARN_MORE" /></translation> <translation id="7755287808199759310">Vanem saab blokeeringu teie eest tühistada</translation> <translation id="7757592200364144203">Muuda seadme nime</translation> <translation id="7757739382819740102">Läheduses olevad kontaktid saavad teiega jagada. Vajalik on heakskiit.</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index 8592e96..5717d96 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -355,6 +355,7 @@ <translation id="1340527397989195812">با استفاده از برنامه Files از رسانه دستگاه پشتیبان بگیرید.</translation> <translation id="1343865611738742294">ارائه مجوز به برنامههای Linux برای دسترسی به دستگاههای USB. Linux بعد از برداشتن دستگاه USB، آن را به خاطر نمیسپارد.</translation> <translation id="1343920184519992513">کار را از همانجایی که رها کردید ادامه دهید و مجموعه صفحات خاصی را باز کنید</translation> +<translation id="1344377983938103876">درحال باز کردن <ph name="URL" />…</translation> <translation id="134589511016534552">برگههای رسانه در بخش «برگههای باز» هم نشان داده میشود</translation> <translation id="1346630054604077329">تأیید و بازراهاندازی</translation> <translation id="1346748346194534595">راست</translation> @@ -1277,6 +1278,7 @@ <translation id="2180620921879609685">محتوای موجود در همه صفحهها را مسدود کند</translation> <translation id="2182058453334755893">در بریدهدان کپی شد</translation> <translation id="2184515124301515068">Chrome انتخاب کند سایتها چه موقع صدا پخش کنند (توصیه میشود)</translation> +<translation id="2186206192313702726">لنز Google</translation> <translation id="2186711480981247270">صفحه از دستگاه دیگری همرسانی شد</translation> <translation id="2187675480456493911">با دستگاههای دیگر در حسابتان همگامسازی شده است. تنظیماتی که دیگر کاربران تغییر دادهاند همگامسازی نخواهد شد. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation> <translation id="2187895286714876935">خطای وارد کردن مجوز سرور</translation> @@ -3220,6 +3222,7 @@ <translation id="402211067068791756">با این کار <ph name="TOTAL_USAGE" /> از دادههایی که سایتهای نشاندادهشده ذخیره کردهاند پاک میشود</translation> <translation id="4022426551683927403">&افزودن به واژهنامه</translation> <translation id="4025039777635956441">بیصدا کردن سایت انتخابشده</translation> +<translation id="4027958407426528157">وبسایتها در برنامههای نصبشده در <ph name="DEVICE_TYPE" /> شما باز میشوند</translation> <translation id="4028467762035011525">افزودن روشهای ورودی</translation> <translation id="4029556917477724407">برگشتن از صفحه <ph name="PAGE_TITLE" /></translation> <translation id="4031179711345676612">میکروفون مجاز است</translation> @@ -6572,6 +6575,7 @@ <translation id="7377481913241237033">اتصال با کد</translation> <translation id="7378611153938412599">گذرواژههای ضعیف را میتوان بهراحتی حدس زد. مطمئن شوید گذرواژههایی که ایجاد میکنید قوی باشند. <ph name="BEGIN_LINK" />نکتههای امنیتی بیشتری ببینید.<ph name="END_LINK" /></translation> <translation id="73786666777299047">باز کردن نتبازار Chrome</translation> +<translation id="737938816678769289">بهآسانی دستگاههای مجهز به «مرتبطسازی سریع» را در اطرافتان راهاندازی کنید و به آنها متصل شوید</translation> <translation id="7380459290951585794">مطمئن شوید تلفنتان همین اطراف باشد، قفل آن باز، و بلوتوث و Wi-Fi در آن روشن باشد</translation> <translation id="7380622428988553498">نام دستگاه حاوی نویسههای نامعتبر است</translation> <translation id="7380768571499464492"><ph name="PRINTER_NAME" /> بهروزرسانی شد</translation> @@ -6969,6 +6973,7 @@ <translation id="7753735457098489144">بهدلیل نبودن فضای ذخیرهسازی، نصب انجام نشد. برای آزاد کردن فضا، فایلها را در حافظه دستگاه حذف کنید.</translation> <translation id="7754347746598978109">اجازه ندارد از جاوا اسکریپت استفاده کند</translation> <translation id="7754704193130578113">قبل از بارگیری هر فایل، درباره مکان ذخیره سؤال شود</translation> +<translation id="7755134875397410803">برای کمک به انجام کارها، Google نشانیهای وب و محتوای سایتهایی را که در آنها از «دستیار» استفاده میکنید، و همچنین اطلاعاتی را که ازطریق «دستیار» ارسال میکنید دریافت خواهد کرد. ممکن است این اطلاعات در «حساب Google» شما ذخیره شود. میتوانید «دستیار» را در تنظیمات Chrome خاموش کنید. <ph name="LEARN_MORE" /></translation> <translation id="7755287808199759310">والدینتان میتوانند این سایت را برای شما بگشایند</translation> <translation id="7757592200364144203">تغییر نام دستگاه</translation> <translation id="7757739382819740102">مخاطبین اطرافتان میتوانند با شما همرسانی کنند. تأیید لازم است.</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index 4fa3e7e..57bbd9e 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -354,6 +354,7 @@ <translation id="1340527397989195812">Varmuuskopioi mediatiedostot laitteelta Tiedostot-sovelluksen avulla.</translation> <translation id="1343865611738742294">Anna Linux-sovelluksille USB-laitteiden käyttöoikeus. Linux ei muista USB-laitetta, kun se on poistettu.</translation> <translation id="1343920184519992513">Jatka siitä, mihin jäit, ja avaa tietyt sivut</translation> +<translation id="1344377983938103876">Avataan <ph name="URL" />…</translation> <translation id="134589511016534552">Mediavälilehdet näkyvät myös Avoimet välilehdet ‑kohdassa</translation> <translation id="1346630054604077329">Vahvista ja käynnistä uudelleen</translation> <translation id="1346748346194534595">Oikealla</translation> @@ -6967,6 +6968,7 @@ <translation id="7753735457098489144">Asennus epäonnistui, koska tallennustila ei riitä. Vapauta tilaa poistamalla laitteen tallennustilasta tiedostoja.</translation> <translation id="7754347746598978109">JavaScriptin käyttö kielletty</translation> <translation id="7754704193130578113">Kysy, minne kukin tiedosto tallennetaan ennen lataamista</translation> +<translation id="7755134875397410803">Jotta tehtävien hoitaminen sujuisi paremmin, Google saa tiedot niiden sivustojen URL-osoitteista ja sisällöstä, joilla käytät Assistantia, sekä Assistantin kautta lähettämäsi tiedot. Nämä tiedot voidaan tallentaa Google-tilillesi. Voit poistaa Assistantin käytöstä Chromen asetuksissa. <ph name="LEARN_MORE" /></translation> <translation id="7755287808199759310">Vanhempasi voi kumota eston puolestasi.</translation> <translation id="7757592200364144203">Vaihda laitteen nimi</translation> <translation id="7757739382819740102">Lähistöllä olevat kontaktit voivat jakaa sinulle sisältöä. Edellyttää hyväksyntää.</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index 7dd940c..991ebe9c 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -3226,6 +3226,7 @@ <translation id="402211067068791756">Iki-clear nito ang <ph name="TOTAL_USAGE" /> na data na na-store ng mga ipinapakitang site</translation> <translation id="4022426551683927403">&Idagdag sa Diksyunaryo</translation> <translation id="4025039777635956441">I-mute ang Napiling Site</translation> +<translation id="4027958407426528157">Buksan ang mga website sa mga app na naka-install sa iyong device <ph name="DEVICE_TYPE" /></translation> <translation id="4028467762035011525">Magdagdag ng mga pamamaraan ng pag-input</translation> <translation id="4029556917477724407">Bumalik mula sa page na <ph name="PAGE_TITLE" /></translation> <translation id="4031179711345676612">Pinapayagan ang mikropono</translation> @@ -6578,6 +6579,7 @@ <translation id="7377481913241237033">Kumonekta gamit ang code</translation> <translation id="7378611153938412599">Madaling hulaan ang mahihinang password. Tiyaking malalakas na password ang gagawin mo. <ph name="BEGIN_LINK" />Tumingin pa ng mga tip sa seguridad.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Buksan ang Chrome Web Store</translation> +<translation id="737938816678769289">Kumonekta at mag-set up ng malalapit na device na Mabilis na Pagpares nang walang kahirap-hirap</translation> <translation id="7380459290951585794">Tiyaking nasa malapit at naka-unlock ang iyong telepono at naka-on ang Bluetooth at Wi-Fi nito</translation> <translation id="7380622428988553498">Naglalaman ng mga invalid na character ang pangalan ng device</translation> <translation id="7380768571499464492">Na-update ang <ph name="PRINTER_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb index 146ce0c..07af024 100644 --- a/chrome/app/resources/generated_resources_fr-CA.xtb +++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -353,6 +353,7 @@ <translation id="1340527397989195812">Sauvegarder les fichiers médiatiques de l’appareil en utilisant l’application Fichiers.</translation> <translation id="1343865611738742294">Accordez aux applications Linux l'autorisation d'accéder à des appareils USB. Le système Linux ne se souviendra pas d'un appareil USB une fois celui-ci retiré.</translation> <translation id="1343920184519992513">Reprenez le cours de vos activités et ouvrez un ensemble défini de pages</translation> +<translation id="1344377983938103876">Ouverture de <ph name="URL" /> en cours...</translation> <translation id="134589511016534552">Les onglets multimédias sont également affichés dans la section Onglets ouverts</translation> <translation id="1346630054604077329">Confirmer et redémarrer</translation> <translation id="1346748346194534595">À droite</translation> @@ -1248,6 +1249,7 @@ <translation id="2159488579268505102">USB-C</translation> <translation id="216169395504480358">Ajouter un réseau Wi-Fi…</translation> <translation id="2162155940152307086">La synchronisation commencera dès que vous quitterez les paramètres de synchronisation</translation> +<translation id="2162705204091149050">Lire de l'information à propos de votre navigateur, de votre système d'exploitation, de votre appareil, des logiciels installés et des fichiers</translation> <translation id="2162926944953615670">Aucun profil eSIM disponible</translation> <translation id="2163470535490402084">Veuillez vous connecter à Internet pour accéder à votre <ph name="DEVICE_TYPE" />.</translation> <translation id="2164131635608782358"><ph name="FIRST_SWITCH" />, <ph name="SECOND_SWITCH" />, <ph name="THIRD_SWITCH" /> et 1 autre commutateur</translation> @@ -2498,6 +2500,7 @@ <translation id="3359256513598016054">Contraintes des politiques de certificat</translation> <translation id="3360297538363969800">L'impression a échoué. Veuillez vérifier votre imprimante, puis réessayer</translation> <translation id="3361421571228286637">{COUNT,plural, =1{L'appareil <ph name="DEVICE_NAME" /> partage <ph name="ATTACHMENTS" /> avec vous.}one{L'appareil <ph name="DEVICE_NAME" /> partage <ph name="ATTACHMENTS" /> avec vous.}other{L'appareil <ph name="DEVICE_NAME" /> partage <ph name="ATTACHMENTS" /> avec vous.}}</translation> +<translation id="3363202073972776113">Ce nouveau profil sera géré par votre organisation. <ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation> <translation id="3364986687961713424">De votre administrateur : <ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">Utilisez la touche Ctrl ou Alt</translation> <translation id="3368922792935385530">Connecté</translation> @@ -2532,6 +2535,7 @@ <translation id="339722927132407568">Fige</translation> <translation id="3399432415385675819">Les notifications seront désactivées</translation> <translation id="3400390787768057815"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (<ph name="REFRESH_RATE" /> Hertz), entrelacé</translation> +<translation id="3401484564516348917">Lire de l'information à propos de votre navigateur, de votre système d'exploitation, de votre appareil, des logiciels installés, des valeurs de registre et des fichiers</translation> <translation id="3402059702184703067">{COUNT,plural, =1{{COUNT} mot de passe est stocké sur cet appareil}one{{COUNT} mot de passe est stocké sur cet appareil}other{{COUNT} mots de passe sont stockés sur cet appareil}}</translation> <translation id="3402255108239926910">Choisissez un avatar</translation> <translation id="3402585168444815892">Inscription au mode Démo en cours…</translation> @@ -2778,6 +2782,7 @@ <translation id="3627879631695760395">Installer <ph name="APP" />…</translation> <translation id="3628275722731025472">Désactiver le Bluetooth</translation> <translation id="3629631988386925734">Entrez votre mot de passe pour activer Smart Lock. La prochaine fois, votre téléphone déverrouillera votre <ph name="DEVICE_TYPE" />. Vous pouvez désactiver Smart Lock dans le menu Paramètres.</translation> +<translation id="3629664892718440872">Mémoriser ce choix</translation> <translation id="3630132874740063857">Votre téléphone</translation> <translation id="3630995161997703415">Ajoutez ce site à votre étagère pour pouvoir l'utiliser à tout moment</translation> <translation id="3631680145967006828"><ph name="BEGIN_PARAGRAPH1" />Le fait d'autoriser vos appareils Chrome OS à envoyer des rapports automatiques nous permet de prioriser les éléments à corriger et à améliorer dans Chrome OS. Ces rapports peuvent comprendre des renseignements sur, entre autres, le moment où Chrome OS plante, les fonctionnalités que vous utilisez et la quantité de mémoire que vous utilisez normalement.<ph name="END_PARAGRAPH1" /> @@ -3267,6 +3272,7 @@ <ph name="EXTENSION_FILE" /></translation> <translation id="408721682677442104">Plein contrôle des appareils MIDI refusé</translation> +<translation id="4087328411748538168">Afficher à droite</translation> <translation id="4089235344645910861">Paramètres enregistrés. Synchronisation lancée.</translation> <translation id="4090103403438682346">Activer l'accès validé</translation> <translation id="4090947011087001172">Réinitialiser les autorisations du site <ph name="SITE" />?</translation> @@ -3960,6 +3966,7 @@ <translation id="4779766576531456629">Renommer le réseau cellulaire de la carte eSIM</translation> <translation id="4780321648949301421">Enregistrer la page sous…</translation> <translation id="4781443161433589743">Vous profitez de la sécurité la plus robuste de Chrome</translation> +<translation id="4782861709165039462">Tous les microphones sont désactivés par le commutateur physique des appareils</translation> <translation id="4785719467058219317">Vous utilisez une clé de sécurité qui n'est pas enregistrée auprès de ce site Web</translation> <translation id="4785914069240823137">Annuler le recadrage</translation> <translation id="4788092183367008521">Veuillez vérifier votre connexion réseau et réessayer.</translation> @@ -4726,6 +4733,7 @@ <translation id="5548075230008247516">Tous les éléments ont été désélectionnés. Vous n'êtes plus en mode de sélection.</translation> <translation id="5548159762883465903">{NUM_OTHER_TABS,plural, =0{« <ph name="TAB_TITLE" /> »}=1{« <ph name="TAB_TITLE" /> » et 1 autre onglet}one{« <ph name="TAB_TITLE" /> » et # autre onglet}other{« <ph name="TAB_TITLE" /> » et # autres onglets}}</translation> <translation id="5548606607480005320">Vérification de sécurité</translation> +<translation id="5548644592758170183">Afficher à gauche</translation> <translation id="554903022911579950">Kerberos</translation> <translation id="5551573675707792127">Clavier et entrée de texte</translation> <translation id="5553089923092577885">Mappages des règles de certificat</translation> @@ -6952,6 +6960,7 @@ <translation id="7753735457098489144">L'installation a échoué en raison d'un manque d'espace de stockage. Pour libérer de l'espace, supprimez des fichiers de l'espace de stockage de l'appareil.</translation> <translation id="7754347746598978109">Non autorisés à utiliser JavaScript</translation> <translation id="7754704193130578113">Toujours demander où enregistrer les fichiers</translation> +<translation id="7755134875397410803">Pour vous aider à effectuer des tâches, Google recevra les URL et le contenu des sites avec lesquels vous utilisez l'Assistant, ainsi que l'information que vous envoyez par l'intermédiaire de l'Assistant. Ces données peuvent être stockées dans votre compte Google. Vous pouvez désactiver l'Assistant dans les paramètres de Chrome. <ph name="LEARN_MORE" /></translation> <translation id="7755287808199759310">L'un de tes parents peut le débloquer pour toi</translation> <translation id="7757592200364144203">Modifier le nom de l'appareil</translation> <translation id="7757739382819740102">Les contacts à proximité peuvent partager du contenu avec vous. Une approbation sera requise.</translation> @@ -8211,6 +8220,7 @@ <translation id="8980345560318123814">Rapports de commentaire</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> - Plantage</translation> <translation id="8981825781894055334">Presque à court de papier</translation> +<translation id="8983018820925880511">Ce nouveau profil sera géré par <ph name="DOMAIN" />. <ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation> <translation id="8983632908660087688"><ph name="ORIGIN" /> peut modifier le fichier <ph name="FILENAME" /></translation> <translation id="8984694057134206124">Vous serez visible par tous les appareils à proximité pendant <ph name="MINUTES" /> minutes. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="8985191021574400965">Bienvenue sur Steam pour Chromebook</translation> @@ -8308,6 +8318,7 @@ <translation id="9075413375877487220">Cette extension n'est pas approuvée par la navigation sécurisée améliorée.</translation> <translation id="9076283476770535406">Le contenu est peut-être réservé aux adultes</translation> <translation id="9076523132036239772">La vérification de votre adresse de courriel ou de votre mot de passe a échoué. Essayez d'abord de vous connecter à un réseau.</translation> +<translation id="9076821103818989526">Panneau latéral</translation> <translation id="9076977315710973122">Partage SMB</translation> <translation id="9078193189520575214">Application des modifications en cours…</translation> <translation id="9078316009970372699">Désactiver le partage de connexion instantané</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb index 1369d44..c596b83 100644 --- a/chrome/app/resources/generated_resources_gl.xtb +++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -30,7 +30,7 @@ <translation id="1029317248976101138">Zoom</translation> <translation id="1031362278801463162">Cargando vista previa</translation> <translation id="1032605640136438169">Revísaas</translation> -<translation id="103279545524624934">Libera espazo en disco para iniciar as aplicacións de Android.</translation> +<translation id="103279545524624934">Libera espazo en disco para iniciar as aplicacións para Android.</translation> <translation id="1033780634303702874">Acceder aos teus dispositivos en serie</translation> <translation id="1034484273907870301">Franxa de pestanas con miniaturas para o modo de tableta</translation> <translation id="1036348656032585052">Desactivar</translation> @@ -352,6 +352,7 @@ <translation id="1340527397989195812">Realiza unha copia de seguranza dos medios desde o dispositivo a través da aplicación Ficheiros.</translation> <translation id="1343865611738742294">Concédelle permiso ás aplicacións de Linux para acceder a dispositivos USB. Linux non recordará un dispositivo USB unha vez que se quite.</translation> <translation id="1343920184519992513">Retomar a actividade onde a deixaches e abrir un conxunto de páxinas específico</translation> +<translation id="1344377983938103876">Abrindo <ph name="URL" />…</translation> <translation id="134589511016534552">As pestanas multimedia tamén se mostran na sección Pestanas abertas</translation> <translation id="1346630054604077329">Confirmar e reiniciar</translation> <translation id="1346748346194534595">Dereita</translation> @@ -432,7 +433,7 @@ <translation id="1418954524306642206">Busca un ficheiro para especificar o PPD da impresora</translation> <translation id="1420834118113404499">Licenzas multimedia</translation> <translation id="1420920093772172268"><ph name="TURN_ON_BLUETOOTH_LINK" /> para permitir a sincronización</translation> -<translation id="1421934779300263861">Se queres axudar a mellorar as funcións e o rendemento de Chrome e de ChromeOS, permite que se lle envíen a Google de forma automática os informes de fallos, así como os datos de uso e de diagnóstico. Algúns datos agregados tamén serán útiles para os socios de Google e as aplicacións Android. Se tes activada a opción Actividade web e das aplicacións na Conta de Google, pódense gardar nela os teus datos de Android.</translation> +<translation id="1421934779300263861">Se queres axudar a mellorar as funcións e o rendemento de Chrome e de ChromeOS, permite que se lle envíen a Google de forma automática os informes de fallos, así como os datos de uso e de diagnóstico. Algúns datos agregados tamén serán útiles para os socios de Google e as aplicacións para Android. Se tes activada a opción Actividade web e das aplicacións na Conta de Google, pódense gardar nela os teus datos de Android.</translation> <translation id="1422159345171879700">Cargar scripts non seguros</translation> <translation id="1423716227250567100">Ao realizar esta acción, ocorrerá o seguinte: <ph name="LINE_BREAKS" /> @@ -466,9 +467,9 @@ <translation id="1442851588227551435">Definir como activo un tícket de Kerberos</translation> <translation id="1444628761356461360">Esta configuración está xestionada polo propietario do dispositivo, <ph name="OWNER_EMAIL" />.</translation> <translation id="144518587530125858">Non se puido cargar "<ph name="IMAGE_PATH" />" para o tema.</translation> -<translation id="1448264954024227422">Podes usar esta conta con aplicacións Android. Se queres engadir unha conta para outra persoa, <ph name="LINK_BEGIN" />engade unha persoa nova<ph name="LINK_END" /> ao teu dispositivo (<ph name="DEVICE_TYPE" />). +<translation id="1448264954024227422">Podes usar esta conta con aplicacións para Android. Se queres engadir unha conta para outra persoa, <ph name="LINK_BEGIN" />engade unha persoa nova<ph name="LINK_END" /> ao teu dispositivo (<ph name="DEVICE_TYPE" />). -Pode que se lle apliquen a esta conta os permisos que xa lles concedeses ás aplicacións. Podes controlar os permisos correspondentes ás aplicacións Android en <ph name="APPS_LINK_BEGIN" />Configuración das aplicacións<ph name="APPS_LINK_END" />.</translation> +Pode que se lle apliquen a esta conta os permisos que xa lles concedeses ás aplicacións. Podes controlar os permisos correspondentes ás aplicacións para Android en <ph name="APPS_LINK_BEGIN" />Configuración das aplicacións<ph name="APPS_LINK_END" />.</translation> <translation id="1448779317883494811">Ferramenta de pincel</translation> <translation id="1449191289887455076">Preme de novo <ph name="CURRENTKEY" /> para confirmar a asignación e <ph name="RESPONSE" /></translation> <translation id="1451375123200651445">Páxina web (nun só ficheiro)</translation> @@ -813,11 +814,11 @@ <translation id="176587472219019965">&Nova ventá</translation> <translation id="1766575458646819543">Saíches do modo de pantalla completa</translation> <translation id="1766957085594317166">Garda contrasinais de forma segura na túa Conta de Google e non volvas escribilos nunca</translation> -<translation id="1767043563165955993">Usar con aplicacións Android</translation> +<translation id="1767043563165955993">Usar con aplicacións para Android</translation> <translation id="1768212860412467516">Envía comentarios sobre este experimento: <ph name="EXPERIMENT_NAME" />.</translation> <translation id="1768278914020124551">Produciuse un problema ao contactar co servidor de inicio de sesión. Comproba a conexión de rede, verifica o dominio e, despois, volve tentalo.</translation> <translation id="1769104665586091481">Abrir a ligazón nunha &ventá nova</translation> -<translation id="177053719077591686">Facer unha copia de seguranza das aplicacións Android en Google Drive.</translation> +<translation id="177053719077591686">Facer unha copia de seguranza das aplicacións para Android en Google Drive.</translation> <translation id="177336675152937177">Datos da aplicación aloxada</translation> <translation id="1775706469381199282">Non permitir que os sitios utilicen JavaScript</translation> <translation id="1776712937009046120">Engadir usuario</translation> @@ -1179,7 +1180,7 @@ <translation id="2100273922101894616">Inicio de sesión automático</translation> <translation id="2101225219012730419">Versión:</translation> <translation id="2102396546234652240">Non permitir que os sitios utilicen o teu micrófono</translation> -<translation id="2102495993840063010">Aplicacións de Android</translation> +<translation id="2102495993840063010">Aplicacións para Android</translation> <translation id="2105809836724866556">Ocultouse <ph name="MODULE_TITLE" /></translation> <translation id="2108349519800154983">{COUNT,plural, =1{Número de teléfono}other{# números de teléfono}}</translation> <translation id="211144231511833662">Borrar tipos</translation> @@ -1189,7 +1190,7 @@ <translation id="2113479184312716848">Abrir &ficheiro...</translation> <translation id="2113921862428609753">Acceso a información de autoridades</translation> <translation id="2114326799768592691">Volver cargar &marco</translation> -<translation id="2114413269775311385">Usar esta conta con aplicacións Android. Podes controlar os permisos correspondentes ás aplicacións Android en <ph name="LINK_BEGIN" />Configuración das aplicacións<ph name="LINK_END" />.</translation> +<translation id="2114413269775311385">Usar esta conta con aplicacións para Android. Podes controlar os permisos correspondentes ás aplicacións para Android en <ph name="LINK_BEGIN" />Configuración das aplicacións<ph name="LINK_END" />.</translation> <translation id="2114820389966440614">Mostrar aquí Destacadas recentes e outras lembranzas</translation> <translation id="2114896190328250491">Foto de <ph name="NAME" /></translation> <translation id="2114995631896158695">Non se inseriu ningunha tarxeta SIM</translation> @@ -1222,7 +1223,7 @@ <translation id="2143765403545170146">Mostrar sempre a barra de ferramentas no modo de pantalla completa</translation> <translation id="2143778271340628265">Configuración manual do proxy</translation> <translation id="2144536955299248197">Visualizador de certificados: <ph name="CERTIFICATE_NAME" /></translation> -<translation id="2144557304298909478">Programación de aplicacións de Android en Linux</translation> +<translation id="2144557304298909478">Programación de aplicacións para Android en Linux</translation> <translation id="2146263598007866206">Os sitios poderían descargar automaticamente conxuntos de ficheiros relacionados para aforrarche tempo</translation> <translation id="2147151613919729065">Para borrar o historial do modo Convidados, pecha todas as ventás da sesión de convidado.</translation> <translation id="2147218225094845757">Ocultar panel lateral</translation> @@ -1430,7 +1431,7 @@ <translation id="2316129865977710310">Non, grazas</translation> <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" /> % listo</translation> <translation id="2318143611928805047">Tamaño de papel</translation> -<translation id="2318817390901984578">Para usar as aplicacións de Android, carga e actualiza o dispositivo <ph name="DEVICE_TYPE" />.</translation> +<translation id="2318817390901984578">Para usar as aplicacións para Android, carga e actualiza o dispositivo <ph name="DEVICE_TYPE" />.</translation> <translation id="2319993584768066746">Fotos na pantalla de inicio de sesión</translation> <translation id="2322193970951063277">Cabeceiras e pés de páxina</translation> <translation id="2322318151094136999">Preguntar cando un sitio queira acceder aos portos de serie (opción recomendada)</translation> @@ -1754,7 +1755,7 @@ <translation id="2626799779920242286">Téntao de novo máis tarde.</translation> <translation id="2627424346328942291">Non se puido compartir o ficheiro</translation> <translation id="2628770867680720336">É necesario restablecer a configuración de fábrica deste Chromebook para poder activar a depuración de ADB. <ph name="BEGIN_LINK_LEARN_MORE" />Máis información<ph name="END_LINK_LEARN_MORE" /></translation> -<translation id="2629227353894235473">Programar aplicacións de Android</translation> +<translation id="2629227353894235473">Programar aplicacións para Android</translation> <translation id="2631498379019108537">Mostrar opcións de entrada no estante</translation> <translation id="2633212996805280240">Queres eliminar "<ph name="EXTENSION_NAME" />"?</translation> <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> non puido completar a instalación, pero continuará executándose desde a súa imaxe de disco.</translation> @@ -1929,7 +1930,7 @@ <translation id="2789486458103222910">Aceptar</translation> <translation id="2791529110887957050">Quitar Linux</translation> <translation id="2791952154587244007">Produciuse un erro. A aplicación de quiosco non poderá iniciarse automaticamente neste dispositivo.</translation> -<translation id="2792290659606763004">Queres eliminar as aplicacións de Android?</translation> +<translation id="2792290659606763004">Queres eliminar as aplicacións para Android?</translation> <translation id="2792465461386711506">Activar Sincronización de Chrome para acceder ás pestanas recentes de Chrome desde o teléfono</translation> <translation id="2792697226874849938">Imaxe de restrición</translation> <translation id="2794233252405721443">O sitio está bloqueado</translation> @@ -2962,7 +2963,7 @@ <translation id="380408572480438692">Activar a recompilación de datos de rendemento axudará a Google a mellorar o sistema co tempo. Non se enviarán datos ata que presentes un informe de comentarios (Alt-Maiús-I) e inclúas datos sobre o rendemento. Podes volver a esta pantalla para desactivar a recompilación cando queiras.</translation> <translation id="3807249107536149332">Non se permite o uso de <ph name="EXTENSION_NAME" /> (ID da extensión "<ph name="EXTENSION_ID" />") nunha pantalla de inicio de sesión.</translation> <translation id="3807747707162121253">&Cancelar</translation> -<translation id="3808443763115411087">Programación de aplicacións de Android en Crostini</translation> +<translation id="3808443763115411087">Programación de aplicacións para Android en Crostini</translation> <translation id="38089336910894858">Mostrar advertencia antes de saír da pantalla con ⌘Q</translation> <translation id="3809272675881623365">Coello</translation> <translation id="3809280248639369696">Alieníxena</translation> @@ -3007,7 +3008,7 @@ <translation id="3842552989725514455">Tipo de letra Serif</translation> <translation id="3843464315703645664">Lista de entidades permitidas internamente</translation> <translation id="3844888638014364087">Púxose o emoji</translation> -<translation id="3846116211488856547">Consigue ferramentas para programar sitios web, aplicacións Android etc. A instalación de Linux provocará a descarga de <ph name="DOWNLOAD_SIZE" /> de datos.</translation> +<translation id="3846116211488856547">Consigue ferramentas para programar sitios web, aplicacións para Android etc. A instalación de Linux provocará a descarga de <ph name="DOWNLOAD_SIZE" /> de datos.</translation> <translation id="3847319713229060696">Axudar a mellorar a seguranza na Web para todos</translation> <translation id="3848547754896969219">Abrir nunha ventá do modo de &incógnito</translation> <translation id="385051799172605136">Atrás</translation> @@ -3324,7 +3325,7 @@ <translation id="4133076602192971179">Abrir a aplicación para cambiar o contrasinal</translation> <translation id="4135746311382563554">Condicións de servizo adicionais de Google Chrome e Chrome OS</translation> <translation id="4136203100490971508">A opción Luz nocturna desactivarase automaticamente ao amencer</translation> -<translation id="41365691917097717">Ao continuar, activarase a depuración de ADB para crear e probar aplicacións de Android. Ten en conta que esta acción permite a instalación de aplicacións de Android non verificadas por Google e que require un restablecemento dos valores de fábrica para desactivarse.</translation> +<translation id="41365691917097717">Ao continuar, activarase a depuración de ADB para crear e probar aplicacións para Android. Ten en conta que esta acción permite a instalación de aplicacións para Android non verificadas por Google e que require un restablecemento dos valores de fábrica para desactivarse.</translation> <translation id="4138267921960073861">Mostrar nomes de usuario e fotos na pantalla de inicio de sesión</translation> <translation id="4138598238327913711">O corrector gramatical só está dispoñible en inglés actualmente</translation> <translation id="413915106327509564"><ph name="WINDOW_TITLE" />: conectouse o dispositivo HID</translation> @@ -3387,7 +3388,7 @@ <translation id="4210380525132844778">Razón: atopouse <ph name="RULE" /> na lista "<ph name="LIST_NAME" />".</translation> <translation id="421182450098841253">&Mostrar a barra de marcadores</translation> <translation id="4211851069413100178">Enviar datos de uso e de diagnóstico. Envía automaticamente datos de diagnóstico e de uso do dispositivo e das aplicacións a Google para axudar a mellorar a túa experiencia en Android. Esta información permitirá aumentar a estabilidade do sistema e das aplicacións, e realizar outras melloras. Algúns datos agregados tamén serán útiles para as aplicacións e os socios de Google, como os programadores de Android. Esta <ph name="BEGIN_LINK1" />opción de configuración<ph name="END_LINK1" /> contrólaa o propietario. O cal pode optar por enviar datos de diagnóstico e uso deste dispositivo a Google. Se está activada a opción Actividade web e das aplicacións adicional, estes datos pódense gardar na túa conta de Google. <ph name="BEGIN_LINK2" />Máis información<ph name="END_LINK2" /></translation> -<translation id="4211904048067111541">Deixar de usar con aplicacións Android</translation> +<translation id="4211904048067111541">Deixar de usar con aplicacións para Android</translation> <translation id="42126664696688958">Exportar</translation> <translation id="42137655013211669">O servidor non permitiu acceder a este recurso.</translation> <translation id="4217558091331485702">Analiza este ficheiro antes de abrilo</translation> @@ -3950,7 +3951,7 @@ <translation id="4770119228883592393">Permiso solicitado; preme ⌘ + Option (Opción) + Down arrow (Frecha abaixo) para responder</translation> <translation id="4773112038801431077">Actualizar Linux</translation> <translation id="4774337692467964393">Se activas Smart Lock, non terás que meter ningún PIN nin contrasinal</translation> -<translation id="4775142426314270551">Se queres axudar a mellorar as funcións e o rendemento de Chrome e de ChromeOS, permite que se lle envíen a Google de forma automática os informes de fallos, así como os datos de uso e de diagnóstico. Algúns datos agregados tamén serán útiles para os socios de Google e as aplicacións Android. Se está activada a opción Actividade web e das aplicacións na Conta de Google da túa filla ou fillo, pódense gardar nela os seus datos de Android.</translation> +<translation id="4775142426314270551">Se queres axudar a mellorar as funcións e o rendemento de Chrome e de ChromeOS, permite que se lle envíen a Google de forma automática os informes de fallos, así como os datos de uso e de diagnóstico. Algúns datos agregados tamén serán útiles para os socios de Google e as aplicacións para Android. Se está activada a opción Actividade web e das aplicacións na Conta de Google da túa filla ou fillo, pódense gardar nela os seus datos de Android.</translation> <translation id="477647109558161443">Crear acceso directo do escritorio</translation> <translation id="4776594120007763294">Se queres engadir unha páxina para ler máis adiante, fai clic no botón</translation> <translation id="4777458362738635055">Os demais usuarios deste dispositivo poden usar esta rede</translation> @@ -4114,7 +4115,7 @@ <translation id="4918086044614829423">Aceptar</translation> <translation id="4918134162946436591">Mostrar superposición de suxestións</translation> <translation id="4921348630401250116">Conversión de texto a voz</translation> -<translation id="492299503953721473">Eliminar aplicacións de Android</translation> +<translation id="492299503953721473">Eliminar aplicacións para Android</translation> <translation id="492363500327720082">Desinstalando <ph name="APP_NAME" />…</translation> <translation id="4924002401726507608">Enviar comentarios</translation> <translation id="4924352752174756392">12x</translation> @@ -4188,7 +4189,7 @@ <translation id="5000922062037820727">Bloqueado (recomendado)</translation> <translation id="5005498671520578047">Copiar contrasinal</translation> <translation id="5006118752738286774">Hai 2 anos</translation> -<translation id="5006218871145547804">ADB para aplicacións de Android en Crostini</translation> +<translation id="5006218871145547804">ADB para aplicacións para Android en Crostini</translation> <translation id="5007392906805964215">Revisar</translation> <translation id="50080882645628821">Quitar perfil</translation> <translation id="5008936837313706385">Nome da actividade</translation> @@ -4276,7 +4277,7 @@ <translation id="5101839224773798795">Facer clic automaticamente cando se deteña o cursor</translation> <translation id="510695978163689362">Family Link supervisa <ph name="USER_EMAIL" />. Podes engadir contas de centro educativo para acceder a recursos didácticos con supervisión parental.</translation> <translation id="5107443654503185812">Unha extensión desactivou a opción Navegación segura</translation> -<translation id="5108967062857032718">Configuración: eliminar aplicacións de Android</translation> +<translation id="5108967062857032718">Configuración: eliminar aplicacións para Android</translation> <translation id="5109044022078737958">Atleta</translation> <translation id="5109816792918100764">Quitar <ph name="LANGUAGE_NAME" /></translation> <translation id="5111646998522066203">Saír do modo de incógnito</translation> @@ -4452,7 +4453,7 @@ <translation id="5280335021886535443">Preme |<ph name="ACCELERATOR" />| para enfocar este globo.</translation> <translation id="5280426389926346830">Queres crear un atallo?</translation> <translation id="5281013262333731149">Ábrese en: <ph name="OPEN_BROWSER" /></translation> -<translation id="528208740344463258">Para descargar e utilizar aplicacións Android, primeiro debes instalar esta actualización obrigatoria. Non podes utilizar o dispositivo <ph name="DEVICE_TYPE" /> mentres se está actualizando. O <ph name="DEVICE_TYPE" /> reiniciarase tras finalizar a instalación.</translation> +<translation id="528208740344463258">Para descargar e utilizar aplicacións para Android, primeiro debes instalar esta actualización obrigatoria. Non podes utilizar o dispositivo <ph name="DEVICE_TYPE" /> mentres se está actualizando. O <ph name="DEVICE_TYPE" /> reiniciarase tras finalizar a instalación.</translation> <translation id="5282733140964383898">Ao activar a opción Non seguir, incluirase unha solicitude no teu tráfico de navegación. O efecto producido depende de se o sitio web responde á solicitude e da interpretación desta. Por exemplo, algúns sitios web poden responder a esta solicitude mostrándoche anuncios que non estean baseados noutros sitios web que visitases. Moitos sitios web seguirán recompilando e utilizando os teus datos de navegación para, por exemplo, mellorar a seguranza, fornecer contido, anuncios e recomendacións e para crear estatísticas de informes. <ph name="BEGIN_LINK" />Máis información<ph name="END_LINK" /></translation> <translation id="5283677936944177147">Vaites! Produciuse un erro no sistema e non puido determinar o modelo do dispositivo ou o número de serie.</translation> <translation id="5284445933715251131">Continuar coa descarga</translation> @@ -4870,7 +4871,7 @@ <translation id="5691581861107245578">Recibe suxestións de emojis baseadas no que escribas</translation> <translation id="5691772641933328258">Non se recoñeceu a impresión dixital</translation> <translation id="5692183275898619210">Finalizou a impresión</translation> -<translation id="5695184138696833495">ADB para aplicacións de Android en Linux</translation> +<translation id="5695184138696833495">ADB para aplicacións para Android en Linux</translation> <translation id="5696143504434933566">Informar dun uso inadecuado de <ph name="EXTENSION_NAME" /></translation> <translation id="5696679855467848181">Ficheiro PPD actual en uso: <ph name="PPD_NAME" /></translation> <translation id="5697832193891326782">Selector de emojis</translation> @@ -5218,7 +5219,7 @@ <translation id="6047632800149092791">A sincronización non funciona. Tenta pechar sesión e iniciala de novo.</translation> <translation id="6049797270917061226">Con este ficheiro, os atacantes poderían roubarche información persoal.</translation> <translation id="6051354611314852653">O sistema non puido autorizar o acceso á API para este dispositivo.</translation> -<translation id="6051638103735819069"><ph name="BEGIN_PARAGRAPH1" />Ao permitir que os dispositivos ChromeOS envíen informes de forma automática, axúdasnos a establecer prioridades en relación cos aspectos que necesitan corrixirse e mellorarse no sistema operativo. Nestes informes poden incluírse datos sobre cando falla ChromeOS, as funcións que se utilizaron e o espazo de memoria que adoita empregarse, así como datos de uso e de diagnóstico das aplicacións Android, entre outros. Algúns datos agregados tamén serán útiles para as aplicacións e os socios de Google, como os programadores de Android.<ph name="END_PARAGRAPH1" /> +<translation id="6051638103735819069"><ph name="BEGIN_PARAGRAPH1" />Ao permitir que os dispositivos ChromeOS envíen informes de forma automática, axúdasnos a establecer prioridades en relación cos aspectos que necesitan corrixirse e mellorarse no sistema operativo. Nestes informes poden incluírse datos sobre cando falla ChromeOS, as funcións que se utilizaron e o espazo de memoria que adoita empregarse, así como datos de uso e de diagnóstico das aplicacións para Android, entre outros. Algúns datos agregados tamén serán útiles para as aplicacións e os socios de Google, como os programadores de Android.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />Podes permitir ou deter o envío destes informes cando queiras desde a configuración do dispositivo ChromeOS do teu fillo ou filla. Se es un administrador de dominio, podes cambiar esta opción de configuración na consola de administración.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />A desactivación desta función non afecta á capacidade deste dispositivo de enviar a información necesaria para servizos esenciais, como as actualizacións do sistema e a seguranza.<ph name="END_PARAGRAPH3" /> <ph name="BEGIN_PARAGRAPH4" />Se está activada a opción Actividade web e das aplicacións na Conta de Google da túa filla ou fillo, pódense gardar nela os seus datos. Obtén máis información acerca destas opcións de configuración e sobre como axustalas en families.google.com.<ph name="END_PARAGRAPH4" /></translation> @@ -5476,7 +5477,7 @@ <translation id="6295158916970320988">Todos os sitios</translation> <translation id="6295855836753816081">Gardando...</translation> <translation id="629730747756840877">Conta</translation> -<translation id="6298962879096096191">Utiliza Google Play para instalar aplicacións Android</translation> +<translation id="6298962879096096191">Utiliza Google Play para instalar aplicacións para Android</translation> <translation id="6300177430812514606">Sitios que non poden rematar de enviar ou recibir datos</translation> <translation id="630065524203833229">Sa&ír</translation> <translation id="6300718114348072351"><ph name="PRINTER_NAME" /> non se puido configurar automaticamente. Indica os detalles avanzados da impresora. <ph name="LINK_BEGIN" />Máis información<ph name="LINK_END" /></translation> @@ -6296,7 +6297,7 @@ <translation id="7086672505018440886">Incluír ficheiros de rexistro de Chrome no arquivo.</translation> <translation id="7088434364990739311">Erro ao iniciar a comprobación da actualización (código de erro <ph name="ERROR" />).</translation> <translation id="7088674813905715446">O administrador cambiou o estado do dispositivo para que non se poida utilizar. Para que se poida rexistrar, o administrador debe colocar o dispositivo en estado pendente.</translation> -<translation id="7090160970140261931">Podes engadir contas adicionais ao teu dispositivo (<ph name="DEVICE_TYPE" />) para utilizalas en sitios web e aplicacións Android. Tamén podes controlar cales das contas se utilizan con aplicacións Android.</translation> +<translation id="7090160970140261931">Podes engadir contas adicionais ao teu dispositivo (<ph name="DEVICE_TYPE" />) para utilizalas en sitios web e aplicacións para Android. Tamén podes controlar cales das contas se utilizan con aplicacións para Android.</translation> <translation id="7093220653036489319">Respostas rápidas</translation> <translation id="7093416310351037609">Por motivos de seguranza de datos, a túa organización esixe que todas as descargas aptas se garden na conta de <ph name="WEB_DRIVE" /> da túa organización.</translation> <translation id="7093434536568905704">GTK+</translation> @@ -6427,7 +6428,7 @@ <translation id="7243632151880336635">Borrar e pechar sesión</translation> <translation id="7245628041916450754"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (a mellor)</translation> <translation id="7246230585855757313">Volve introducir a túa chave de seguranza e téntao de novo</translation> -<translation id="724835896049478274">Contas dispoñibles para aplicacións Android</translation> +<translation id="724835896049478274">Contas dispoñibles para aplicacións para Android</translation> <translation id="7249197363678284330">Cambia esta opción de configuración na barra de enderezos.</translation> <translation id="7249764475759804559">Incluír esta aplicación como opción ao abrir ficheiros</translation> <translation id="7250616558727237648">O dispositivo co que tentaches compartir o ficheiro non respondeu. Téntao de novo.</translation> @@ -6676,7 +6677,7 @@ <translation id="7491963308094506985">{NUM_COOKIES,plural, =1{1 cookie}other{{NUM_COOKIES} cookies}}</translation> <translation id="7493386493263658176">A extensión <ph name="EXTENSION_NAME" /> pode recompilar todo o texto que escribas, incluídos os datos persoais, como contrasinais e números de tarxetas de crédito. Queres utilizala?</translation> <translation id="7494694779888133066"><ph name="WIDTH" /> x <ph name="HEIGHT" /></translation> -<translation id="7495149565104413027">Aplicación Android</translation> +<translation id="7495149565104413027">Aplicación para Android</translation> <translation id="7495778526395737099">Esqueciches o teu contrasinal anterior?</translation> <translation id="7497981768003291373">Non se capturou ningún rexistro WebRTC recentemente.</translation> <translation id="7501957181231305652">ou</translation> @@ -6772,7 +6773,7 @@ <translation id="7589461650300748890">Ten coidado.</translation> <translation id="7593653750169415785">Bloqueouse automaticamente porque rexeitaches notificacións varias veces</translation> <translation id="7594725637786616550">Fai un Powerwash e restablece o teu dispositivo (<ph name="DEVICE_TYPE" />) para que quede como novo.</translation> -<translation id="7595453277607160340">Para utilizar aplicacións Android e facer que o dispositivo <ph name="DEVICE_TYPE" /> funcione correctamente, volve iniciar sesión e actualiza a encriptación do dispositivo.</translation> +<translation id="7595453277607160340">Para utilizar aplicacións para Android e facer que o dispositivo <ph name="DEVICE_TYPE" /> funcione correctamente, volve iniciar sesión e actualiza a encriptación do dispositivo.</translation> <translation id="7595547011743502844"><ph name="ERROR" /> (código de erro <ph name="ERROR_CODE" />).</translation> <translation id="7598466960084663009">Reiniciar ordenador</translation> <translation id="7599527631045201165">O nome do dispositivo é demasiado longo. Introduce un máis curto e téntao de novo.</translation> @@ -6876,7 +6877,7 @@ <translation id="7683373461016844951">Para continuar, fai clic en Aceptar e, despois, en Engadir persoa se queres crear un perfil para o teu enderezo de correo electrónico de <ph name="DOMAIN" />.</translation> <translation id="7684212569183643648">Extensión instalada polo administrador</translation> <translation id="7684559058815332124">Visitar a páxina de inicio de sesión do portal cautivo</translation> -<translation id="7684718995427157417">Activa Android Debug Bridge (ADB) para poder crear e probar as túas aplicacións. Ten en conta que esta acción permite a instalación de aplicacións de Android non verificadas por Google e que require un restablecemento dos valores de fábrica para desactivarse.</translation> +<translation id="7684718995427157417">Activa Android Debug Bridge (ADB) para poder crear e probar as túas aplicacións. Ten en conta que esta acción permite a instalación de aplicacións para Android non verificadas por Google e que require un restablecemento dos valores de fábrica para desactivarse.</translation> <translation id="7685049629764448582">Memoria JavaScript</translation> <translation id="7685087414635069102">PIN obrigatorio</translation> <translation id="7686938547853266130"><ph name="FRIENDLY_NAME" /> (<ph name="DEVICE_PATH" />)</translation> @@ -6950,6 +6951,7 @@ <translation id="7753735457098489144">Produciuse un erro ao realizar a instalación por falta de espazo de almacenamento. Para liberar espazo, elimina ficheiros do almacenamento do dispositivo.</translation> <translation id="7754347746598978109">Sitios que non poden usar JavaScript</translation> <translation id="7754704193130578113">Preguntar onde gardar cada ficheiro antes de descargalo</translation> +<translation id="7755134875397410803">Para axudarche a completar tarefas, Google recibirá os URL e os contidos dos sitios nos que uses o Asistente, ademais da información que envíes a través del. Esta información pode almacenarse na túa Conta de Google. Podes desactivar o Asistente de Google na configuración de Chrome. <ph name="LEARN_MORE" /></translation> <translation id="7755287808199759310">O teu pai ou nai non o pode desbloquear por ti</translation> <translation id="7757592200364144203">Cambiar nome do dispositivo</translation> <translation id="7757739382819740102">Os contactos que estean preto poden compartir contido contigo. Necesitarase aprobación.</translation> @@ -7052,7 +7054,7 @@ <translation id="7849264908733290972">Abrir &imaxe na pestana nova</translation> <translation id="784934925303690534">Intervalo de tempo</translation> <translation id="7850353716413205957">Buscar calquera parte da páxina con <ph name="VISUAL_SEARCH_PROVIDER" /></translation> -<translation id="7850717413915978159"><ph name="BEGIN_PARAGRAPH1" />Ao permitir que os dispositivos Chrome OS envíen informes de forma automática, axúdasnos a establecer prioridades en relación cos aspectos que necesitan corrixirse e mellorarse no sistema operativo. Nestes informes pode incluírse información como os momentos nos que falla Chrome OS, as funcións que utilizas, o espazo de memoria que adoitas empregar e os datos de uso e diagnóstico das aplicacións Android. Algúns datos agregados tamén serán útiles para as aplicacións e os socios de Google, como os programadores de Android.<ph name="END_PARAGRAPH1" /> +<translation id="7850717413915978159"><ph name="BEGIN_PARAGRAPH1" />Ao permitir que os dispositivos Chrome OS envíen informes de forma automática, axúdasnos a establecer prioridades en relación cos aspectos que necesitan corrixirse e mellorarse no sistema operativo. Nestes informes pode incluírse información como os momentos nos que falla Chrome OS, as funcións que utilizas, o espazo de memoria que adoitas empregar e os datos de uso e diagnóstico das aplicacións para Android. Algúns datos agregados tamén serán útiles para as aplicacións e os socios de Google, como os programadores de Android.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />Podes permitir ou deter o envío destes informes cando queiras desde a configuración do teu dispositivo Chrome OS. Se administras un dominio, podes cambiar esta opción de configuración na consola de administración.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Se tes activada a opción Actividade web e das aplicacións na Conta de Google, pódense gardar nela os teus datos de Android. Podes consultar os teus datos, eliminalos e cambiar a configuración da conta en account.google.com.<ph name="END_PARAGRAPH3" /></translation> <translation id="7851021205959621355"><ph name="BEGIN_BOLD" />Nota:<ph name="END_BOLD" /> Cunha gravación ou voz similar á túa poderíase acceder aos teus resultados persoais ou ao teu Asistente. Para aforrar batería, podes seleccionar na configuración do teu Asistente ter activado “Hey Google” tan só cando o dispositivo está conectado a unha fonte de alimentación.</translation> @@ -7406,7 +7408,7 @@ <translation id="8176332201990304395">Rosa e branco</translation> <translation id="8177196903785554304">Detalles da rede</translation> <translation id="8177318697334260664">{NUM_TABS,plural, =1{Mover pestana a unha ventá nova}other{Mover pestanas a unha ventá nova}}</translation> -<translation id="8179188928355984576">Non se utiliza con aplicacións Android</translation> +<translation id="8179188928355984576">Non se utiliza con aplicacións para Android</translation> <translation id="8179976553408161302">Intro</translation> <translation id="8180786512391440389">"<ph name="EXTENSION" />" pode ler e eliminar ficheiros de imaxes, vídeo e son nas localizacións seleccionadas.</translation> <translation id="8181215761849004992">O dispositivo non se puido vincular ao dominio. Comproba a túa conta para ver se tes privilexios suficientes para engadir dispositivos.</translation> @@ -7772,7 +7774,7 @@ <translation id="8551588720239073785">Configuración de data e hora</translation> <translation id="8553342806078037065">Xestionar outras persoas</translation> <translation id="8554899698005018844">Ningún idioma</translation> -<translation id="855604308879080518">Permite que as aplicacións Android accedan a dispositivos USB neste Chromebook. Pediráseche permiso cada vez que conectes un dispositivo USB. As distintas aplicacións Android solicitarán outros permisos adicionais.</translation> +<translation id="855604308879080518">Permite que as aplicacións para Android accedan a dispositivos USB neste Chromebook. Pediráseche permiso cada vez que conectes un dispositivo USB. As distintas aplicacións para Android solicitarán outros permisos adicionais.</translation> <translation id="8557022314818157177">Sigue tocando a chave de seguranza ata que se capture a túa impresión dixital</translation> <translation id="8557180006508471423">No Mac, vai a Location Services (Servizos de localización) e activa Google Chrome</translation> <translation id="8557856025359704738">A seguinte descarga terá lugar neste momento: <ph name="NEXT_DATE_DOWNLOAD" />.</translation> @@ -8467,7 +8469,7 @@ <translation id="93766956588638423">Reparar extensión</translation> <translation id="938568644810664664">Tenta dicir: “Hey Google, que canción é esta?” ou “Hey Google, que hai na miña pantalla?”</translation> <translation id="938623846785894166">O ficheiro non é habitual</translation> -<translation id="939401694733344652">Neste momento, estas contas non se están usando con aplicacións Android. Se seleccionas unha conta para usala con esta aplicación de Android, tamén se pode utilizar con outras aplicacións Android. Podes cambiar o acceso ás aplicacións Android en <ph name="LINK_BEGIN" />Configuración > Contas<ph name="LINK_END" />.</translation> +<translation id="939401694733344652">Neste momento, estas contas non se están usando con aplicacións para Android. Se seleccionas unha conta para usala con esta aplicación para Android, tamén se pode utilizar con outras aplicacións para Android. Podes cambiar o acceso ás aplicacións para Android en <ph name="LINK_BEGIN" />Configuración > Contas<ph name="LINK_END" />.</translation> <translation id="939598580284253335">Introducir frase de acceso</translation> <translation id="939736085109172342">Cartafol novo</translation> <translation id="942532530371314860"><ph name="APP_NAME" /> está compartindo audio e unha pestana de Chrome.</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index 12fa488..894cd0a1 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -1281,6 +1281,7 @@ <translation id="2180620921879609685">यह एक्सटेंशन, किसी भी पेज पर कॉन्टेंट ब्लॉक कर सकता है</translation> <translation id="2182058453334755893">आपके क्लिपबोर्ड पर कॉपी किया गया</translation> <translation id="2184515124301515068">Chrome को चुनने दें कि साइटें कब आवाज़ चला सकती हैं (सुझाव)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">पेज को किसी दूसरे डिवाइस से शेयर किया गया</translation> <translation id="2187675480456493911">आपके खाते पर अन्य डिवाइस से सिंक किया गया. अन्य उपयोगकर्ताओं के सेटिंग में किए गए बदलाव सिंक नहीं होंगे. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> <translation id="2187895286714876935">सर्वर प्रमाणपत्र आयात गड़बड़ी</translation> @@ -5376,7 +5377,7 @@ <translation id="6178664161104547336">किसी प्रमाणपत्र को चुनें</translation> <translation id="6178682841350631965">आपने साइन इन करने के लिए जो डेटा डाला है, वह अपडेट हो गया</translation> <translation id="6180510783007738939">लाइन खींचने का टूल</translation> -<translation id="6181431612547969857">डाउनलोड अवरोधित किया गया</translation> +<translation id="6181431612547969857">डाउनलोड करना ब्लॉक किया गया</translation> <translation id="6184099524311454384">टैब खोजें</translation> <translation id="6185132558746749656">डिवाइस स्थान</translation> <translation id="6190953336330058278">फ़ोन हब से जुड़े ऐप्लिकेशन</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index d826067..ef1ca31e 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -2136,7 +2136,7 @@ <translation id="2966937470348689686">Upravljanje postavkama Androida</translation> <translation id="2967926928600500959">URL-ovima koji se podudaraju s tim pravilima nametnut će se otvaranje u određenom pregledniku.</translation> <translation id="2972581237482394796">&Vrati poništeno</translation> -<translation id="2973324205039581528">Zanemari web-lokaciju</translation> +<translation id="2973324205039581528">Isključi zvuk na web-lokaciji</translation> <translation id="2973537811036309675">Bočna ploča</translation> <translation id="2976557544729462544">Neki uređaji zahtijevaju da onemogućite zaštitu pristupa podacima kako bi radili pravilno ili potpuno funkcionalno.</translation> <translation id="2977480621796371840">Ukloni iz grupe</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index 30ffa832..c1a9f2c 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -3222,6 +3222,7 @@ <translation id="402211067068791756">Ezzel törli a megjelenített webhelyek által tárolt, összesen <ph name="TOTAL_USAGE" />-nyi adatot</translation> <translation id="4022426551683927403">&Hozzáadás a szótárhoz</translation> <translation id="4025039777635956441">Kiválasztott webhely némítása</translation> +<translation id="4027958407426528157">Webhelyek megnyitása a(z) <ph name="DEVICE_TYPE" /> eszközre telepített alkalmazásokban</translation> <translation id="4028467762035011525">Beviteli módszerek hozzáadása</translation> <translation id="4029556917477724407">Vissza a következő oldalra: <ph name="PAGE_TITLE" /></translation> <translation id="4031179711345676612">Mikrofon engedélyezve</translation> @@ -6574,6 +6575,7 @@ <translation id="7377481913241237033">Összekapcsolás kód használatával</translation> <translation id="7378611153938412599">A gyenge jelszavakat könnyű kitalálni. Figyeljen arra, hogy erős jelszavakat hozzon létre. <ph name="BEGIN_LINK" />Itt további biztonsági tippeket talál.<ph name="END_LINK" /></translation> <translation id="73786666777299047">A Chrome Webáruház megnyitása</translation> +<translation id="737938816678769289">Könnyen csatlakozhat a közeli, gyors párosítású eszközökhöz, és beállíthatja őket</translation> <translation id="7380459290951585794">Gondoskodjon arról, hogy telefonja a közelben legyen feloldott állapotban, valamint arról, hogy Bluetooth- és Wi-Fi-kapcsolata be legyen kapcsolva.</translation> <translation id="7380622428988553498">Az eszköznév érvénytelen karaktereket tartalmaz</translation> <translation id="7380768571499464492">Frissítve: <ph name="PRINTER_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index 1bc0ba1b..efbd6294 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -354,6 +354,7 @@ <translation id="1340527397989195812">Պահուստավորել սարքի վրայի մեդիա ֆայլերը Ֆայլեր հավելվածի միջոցով:</translation> <translation id="1343865611738742294">Լինուքսի հավելվածներին հասանելի դարձրեք USB սարքերը: Երբ USB սարքը հեռացվի, Լինուքսը չի պահի այն:</translation> <translation id="1343920184519992513">Շարունակել այն պահից, որտեղ կանգ եմ առել, և բացել էջերի որոշակի խումբ</translation> +<translation id="1344377983938103876"><ph name="URL" /> կայքը բացվում է…</translation> <translation id="134589511016534552">Մեդիա բովանդակությամբ ներդիրները ցուցադրվում են նաև «Բաց ներդիրներ» բաժնում</translation> <translation id="1346630054604077329">Հաստատել և վերագործարկել</translation> <translation id="1346748346194534595">Աջ</translation> @@ -6956,6 +6957,7 @@ <translation id="7753735457098489144">Չհաջողվեց տեղադրել։ Հիշողությունը բավարար չէ։ Տարածք ազատելու համար սարքի հիշողությունից ֆայլեր ջնջեք։</translation> <translation id="7754347746598978109">Չի թույլատրվում օգտագործել JavaScript</translation> <translation id="7754704193130578113">Յուրաքանչյուր ֆայլ ներբեռնելուց առաջ հարցնել որտեղ պահել</translation> +<translation id="7755134875397410803">Որպեսզի կարողանաք կատարել առաջադրանքները, Google-ը կստանա կայքերի հասցեներն ու բովանդակությունը, որոնցում օգտվում եք Օգնականից, ինչպես նաև տվյալները, որոնք ուղարկում եք Օգնականի միջոցով։ Այս տեղեկությունները կարող են պահվել ձեր Google հաշվում։ Օգնականը կարող եք անջատել Chrome-ի կարգավորումներում։ <ph name="LEARN_MORE" /></translation> <translation id="7755287808199759310">Այն կարող է արգելահանել ձեր ծնողը</translation> <translation id="7757592200364144203">Փոխել սարքի անունը</translation> <translation id="7757739382819740102">Մոտակայքում գտնվող կոնտակտները կարող են կիսվել ձեզ հետ բովանդակությամբ։ Կպահանջվի հաստատում։</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb index b0d6214..f919047 100644 --- a/chrome/app/resources/generated_resources_is.xtb +++ b/chrome/app/resources/generated_resources_is.xtb
@@ -1281,6 +1281,7 @@ <translation id="2180620921879609685">Útiloka efni á öllum síðum</translation> <translation id="2182058453334755893">Afritað á klippiborðið</translation> <translation id="2184515124301515068">Leyfa Chrome að velja hvenær vefsvæði geta spilað hljóð (ráðlagt)</translation> +<translation id="2186206192313702726">Google linsa</translation> <translation id="2186711480981247270">Síðu deilt úr öðru tæki</translation> <translation id="2187675480456493911">Samstillt við önnur tæki á reikningnum. Breytingar annarra notenda á stillingum verða ekki samstilltar. <ph name="LINK_BEGIN" />Frekari upplýsingar<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Villa við innflutning á vottorði þjóns</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index 6955f39..97337b46 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -1268,6 +1268,7 @@ <translation id="2180620921879609685">Bloccare i contenuti in qualsiasi pagina</translation> <translation id="2182058453334755893">Copia negli appunti eseguita</translation> <translation id="2184515124301515068">Consenti a Chrome di scegliere quando i siti possono riprodurre audio (opzione consigliata)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Pagina condivisa da un altro dispositivo</translation> <translation id="2187675480456493911">Sincronizzata con altri dispositivi sul tuo account. Le impostazioni modificate da altri utenti non verranno sincronizzate. <ph name="LINK_BEGIN" />Ulteriori informazioni<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Errore di importazione del certificato del server</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index dbfd2de..2d9e382a 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -1279,6 +1279,7 @@ <translation id="2180620921879609685">לחסום תוכן בכל דף</translation> <translation id="2182058453334755893">הועתק אל הלוח</translation> <translation id="2184515124301515068">Chrome יקבע מתי אתרים יכולים להפעיל צלילים (מומלץ)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">הדף שותף ממכשיר אחר</translation> <translation id="2187675480456493911">בוצע סנכרון עם מכשירים אחרים בחשבון שלך. הגדרות ששונו על-ידי משתמשים אחרים לא יסונכרנו. <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation> <translation id="2187895286714876935">שגיאת ייבוא של אישור שרת</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb index 19f9a38..b260964 100644 --- a/chrome/app/resources/generated_resources_km.xtb +++ b/chrome/app/resources/generated_resources_km.xtb
@@ -3225,6 +3225,7 @@ <translation id="402211067068791756">សកម្មភាពនេះនឹងសម្អាតទិន្នន័យទំហំ <ph name="TOTAL_USAGE" /> ដែលបានរក្សាទុកដោយគេហទំព័រដែលបានបង្ហាញ</translation> <translation id="4022426551683927403">បន្ថែមទៅក្នុងថតឯកសារ</translation> <translation id="4025039777635956441">បិទគេហទំព័រដែលបានជ្រើសរើស</translation> +<translation id="4027958407426528157">បើកគេហទំព័រនៅក្នុងកម្មវិធីដែលបានដំឡើងនៅលើ <ph name="DEVICE_TYPE" /> របស់អ្នក</translation> <translation id="4028467762035011525">បញ្ចូលវិធីសាស្ត្របញ្ចូល</translation> <translation id="4029556917477724407">ត្រឡប់មកពីទំព័រ <ph name="PAGE_TITLE" /> វិញ</translation> <translation id="4031179711345676612">បានអនុញ្ញាតឱ្យប្រើមីក្រូហ្វូន</translation> @@ -6576,6 +6577,7 @@ <translation id="7377481913241237033">ភ្ជាប់ដោយប្រើកូដ</translation> <translation id="7378611153938412599">ពាក្យសម្ងាត់ខ្សោយមានភាពងាយស្រួលក្នុងការទាយដឹង។ សូមប្រាកដថាអ្នកកំពុងបង្កើតពាក្យសម្ងាត់ខ្លាំង។ <ph name="BEGIN_LINK" />មើលគន្លឹះសុវត្ថិភាពច្រើនទៀត។<ph name="END_LINK" /></translation> <translation id="73786666777299047">បើក Chrome Web Store</translation> +<translation id="737938816678769289">ងាយស្រួលភ្ជាប់ និងរៀបចំឧបករណ៍ផ្គូផ្គងរហ័សដែលនៅជិត</translation> <translation id="7380459290951585794">សូមប្រាកដថាទូរសព្ទរបស់អ្នកនៅជិត បានដោះសោ និងបានបើកប៊្លូធូស និង Wi-Fi</translation> <translation id="7380622428988553498">ឈ្មោះឧបករណ៍មានតួអក្សរមិនត្រឹមត្រូវ</translation> <translation id="7380768571499464492">បានធ្វើបច្ចុប្បន្នភាព <ph name="PRINTER_NAME" /> ហើយ</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 9349bbd..b8368f7d 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -355,6 +355,7 @@ <translation id="1340527397989195812">ಫೈಲ್ಗಳ ಅಪ್ಲಿಕೇಶನ್ ಬಳಸಿಕೊಂಡು ಸಾಧನದಿಂದ ಮಾಧ್ಯಮವನ್ನು ಬ್ಯಾಕಪ್ ಮಾಡಿ.</translation> <translation id="1343865611738742294">USB ಸಾಧನಗಳಿಗೆ ಪ್ರವೇಶ ಪಡೆಯಲು Linux ಗೆ ಆ್ಯಪ್ಗಳ ಅನುಮತಿ ನೀಡಿ. USB ಸಾಧನವನ್ನು ತೆಗೆದುಹಾಕಿದ ಬಳಿಕ, Linux ಗೆ ಅದರ ಮಾಹಿತಿ ನೆನಪಿನಲ್ಲಿ ಇರುವುದಿಲ್ಲ.</translation> <translation id="1343920184519992513">ನೀವು ಎಲ್ಲಿ ನಿಲ್ಲಿಸಿರುವಿರೊ, ಅಲ್ಲಿಂದ ಮುಂದುವರಿಸಿ ಮತ್ತು ನಿರ್ದಿಷ್ಟ ಪುಟಗಳನ್ನು ತೆರೆಯಿರಿ</translation> +<translation id="1344377983938103876"><ph name="URL" /> ತೆರೆಯಲಾಗುತ್ತಿದೆ...</translation> <translation id="134589511016534552">ಮೀಡಿಯಾ ಟ್ಯಾಬ್ಗಳನ್ನು ತೆರೆದಿರುವ ಟ್ಯಾಬ್ಗಳ ವಿಭಾಗದಲ್ಲಿ ಕೂಡ ತೋರಿಸಲಾಗುತ್ತದೆ</translation> <translation id="1346630054604077329">ಖಚಿತಪಡಿಸಿ ಅಥವಾ ಮರುಪ್ರಾರಂಭಿಸಿ</translation> <translation id="1346748346194534595">ಬಲಕ್ಕೆ</translation> @@ -6968,6 +6969,7 @@ <translation id="7753735457098489144">ಕಡಿಮೆ ಸಂಗ್ರಹಣೆ ಸ್ಥಳ ಇರುವ ಕಾರಣ ಇನ್ಸ್ಟಾಲ್ ವಿಫಲವಾಗಿದೆ. ಸ್ಥಳಾವಕಾಶವನ್ನು ಮುಕ್ತಗೊಳಿಸಲು, ಸಾಧನ ಸಂಗ್ರಹಣೆಯಲ್ಲಿರುವ ಫೈಲ್ಗಳನ್ನು ಅಳಿಸಿ.</translation> <translation id="7754347746598978109">JavaScript ಬಳಸಲು ಈ ಸೈಟ್ಗಳಿಗೆ ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ</translation> <translation id="7754704193130578113">ಡೌನ್ಲೋಡ್ ಮಾಡುವ ಮೊದಲು ಪ್ರತಿ ಫೈಲ್ ಅನ್ನು ಎಲ್ಲಿ ಉಳಿಸಬೇಕೆಂದು ಕೇಳು</translation> +<translation id="7755134875397410803">ಕಾರ್ಯಗಳನ್ನು ಪೂರ್ಣಗೊಳಿಸುವುದಕ್ಕೆ ನಿಮಗೆ ಸಹಾಯ ಮಾಡಲು, ನೀವು Assistant ಅನ್ನು ಬಳಸಿದ ಸೈಟ್ಗಳ URL ಗಳು ಮತ್ತು ವಿಷಯಗಳು ಹಾಗೂ Assistant ಮೂಲಕ ನೀವು ಸಲ್ಲಿಸಿದ ಮಾಹಿತಿಯನ್ನು Google ಸ್ವೀಕರಿಸುತ್ತದೆ. ಈ ಮಾಹಿತಿಯನ್ನು Google ಖಾತೆಯಲ್ಲಿ ಸಂಗ್ರಹಿಸಿರಬಹುದು. Assistant ಅನ್ನು Chrome ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಆಫ್ ಮಾಡಬಹುದು. <ph name="LEARN_MORE" /></translation> <translation id="7755287808199759310">ನಿಮ್ಮ ಪೋಷಕರು ನಿಮಗಾಗಿ ಅದನ್ನು ಅನಿರ್ಬಂಧಿಸಬಹುದಾಗಿದೆ</translation> <translation id="7757592200364144203">ಸಾಧನದ ಹೆಸರನ್ನು ಬದಲಾಯಿಸಿ</translation> <translation id="7757739382819740102">ಸಮೀಪದ ಸಂಪರ್ಕಗಳು ನಿಮ್ಮೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಬಹುದು. ಅನುಮೋದನೆ ಮಾಡುವ ಅಗತ್ಯವಿದೆ.</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index 30d1b46..a396472 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -354,6 +354,7 @@ <translation id="1340527397989195812">파일 앱을 사용하여 기기의 미디어를 백업합니다.</translation> <translation id="1343865611738742294">Linux 앱에 USB 기기 액세스 권한을 부여합니다. Linux는 삭제된 USB 기기를 기억하지 않습니다.</translation> <translation id="1343920184519992513">중단한 위치에서 계속하고 특정 페이지 모음 열기</translation> +<translation id="1344377983938103876"><ph name="URL" /> 여는 중…</translation> <translation id="134589511016534552">미디어 탭이 열린 탭 섹션에도 표시됩니다.</translation> <translation id="1346630054604077329">확인 후 다시 시작</translation> <translation id="1346748346194534595">오른쪽</translation> @@ -6970,6 +6971,7 @@ <translation id="7753735457098489144">저장공간이 부족하여 설치할 수 없습니다. 여유 공간을 확보하려면 기기에서 파일을 삭제하세요.</translation> <translation id="7754347746598978109">자바스크립트 사용이 허용되지 않음</translation> <translation id="7754704193130578113">다운로드 전에 각 파일의 저장 위치 확인</translation> +<translation id="7755134875397410803">작업 처리를 돕기 위해 내가 어시스턴트를 통해 제출한 정보뿐만 아니라 어시스턴트를 이용한 사이트의 URL과 콘텐츠도 Google에 전송됩니다. 이 정보는 Google 계정에 저장될 수 있습니다. Chrome 설정에서 어시스턴트를 사용 중지할 수 있습니다. <ph name="LEARN_MORE" /></translation> <translation id="7755287808199759310">부모님이 차단 해제할 수 있습니다.</translation> <translation id="7757592200364144203">기기 이름 변경</translation> <translation id="7757739382819740102">주변에 있는 연락처가 나와 공유할 수 있습니다. 수락해야 합니다.</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb index 55473ff..7cd84ad 100644 --- a/chrome/app/resources/generated_resources_lo.xtb +++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -1257,6 +1257,7 @@ <translation id="2159488579268505102">USB-C</translation> <translation id="216169395504480358">ເພີ່ມ Wi-Fi...</translation> <translation id="2162155940152307086">ການຊິ້ງຂໍ້ມູນຈະເລີ່ມເມື່ອທ່ານອອກຈາກການຕັ້ງຄ່າການຊິ້ງຂໍ້ມູນ</translation> +<translation id="2162705204091149050">ອ່ານຂໍ້ມູນກ່ຽວກັບໂປຣແກຣມທ່ອງເວັບ, OS, ອຸປະກອນ, ຊອບແວທີ່ໄດ້ຕິດຕັ້ງ ແລະ ໄຟລ໌ຂອງທ່ານ.</translation> <translation id="2162926944953615670">ບໍ່ມີໂປຣໄຟລ໌ eSIM ທີ່ສາມາດໃຊ້ໄດ້</translation> <translation id="2163470535490402084">ກະລຸນາເຊື່ອມຕໍ່ກັບອິນເຕີເນັດ ເພື່ອລົງຊື່ເຂົ້າໃຊ້ຫາ <ph name="DEVICE_TYPE" /> ຂອງທ່ານ.</translation> <translation id="2164131635608782358"><ph name="FIRST_SWITCH" />, <ph name="SECOND_SWITCH" />, <ph name="THIRD_SWITCH" /> ແລະ ອີກ 1 ປຸ່ມ</translation> @@ -2509,6 +2510,7 @@ <translation id="3359256513598016054">ຂໍ້ຈໍາກັດນະໂຍບາຍໃບຢັ້ງຢືນ</translation> <translation id="3360297538363969800">ການພິມບໍ່ສໍາເລັດ. ກະລຸນາກວດເບິ່ງເຄື່ອງພິມຂອງທ່ານ ແລະລອງໃໝ່ອີກ.</translation> <translation id="3361421571228286637">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> ກຳລັງແບ່ງປັນ <ph name="ATTACHMENTS" /> ກັບທ່ານ.}other{<ph name="DEVICE_NAME" /> ກຳລັງແບ່ງປັນ <ph name="ATTACHMENTS" /> ກັບທ່ານ.}}</translation> +<translation id="3363202073972776113">ໂປຣໄຟລ໌ໃໝ່ນີ້ຈະໄດ້ຮັບການຈັດການໂດຍອົງການຂອງທ່ານ. <ph name="BEGIN_LINK" />ສຶກສາເພີ່ມເຕີມ<ph name="END_LINK" /></translation> <translation id="3364986687961713424">ຈາກຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ: <ph name="ADMIN_MESSAGE" /></translation> <translation id="3365598184818502391">ໃຊ້ Ctrl ຫຼື Alt</translation> <translation id="3368922792935385530">ເຊື່ອມຕໍ່ແລ້ວ</translation> @@ -2543,6 +2545,7 @@ <translation id="339722927132407568">ຄ້າງ</translation> <translation id="3399432415385675819">ການແຈ້ງເຕືອນຈະຖືກປິດ</translation> <translation id="3400390787768057815"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (<ph name="REFRESH_RATE" /> ເຮີດຊ) - ອິນເຕີເລດ</translation> +<translation id="3401484564516348917">ອ່ານຂໍ້ມູນກ່ຽວກັບໂປຣແກຣມທ່ອງເວັບ, OS, ອຸປະກອນ, ຊອບແວທີ່ໄດ້ຕິດຕັ້ງ, ຄ່າໃນທະບຽນ ແລະ ໄຟລ໌ຂອງທ່ານ.</translation> <translation id="3402059702184703067">{COUNT,plural, =1{ຈັດເກັບລະຫັດຜ່ານ {COUNT} ອັນຢູ່ອຸປະກອນນີ້ແລ້ວ}other{ຈັດເກັບລະຫັດຜ່ານ {COUNT} ອັນຢູ່ອຸປະກອນນີ້ແລ້ວ}}</translation> <translation id="3402255108239926910">ເລືອກຮູບແທນຕົວ</translation> <translation id="3402585168444815892">ການລົງທະບຽນໃນໂໝດສາທິດ</translation> @@ -2789,6 +2792,7 @@ <translation id="3627879631695760395">ຕິດຕັ້ງ <ph name="APP" />...</translation> <translation id="3628275722731025472">ປິດ Bluetooth</translation> <translation id="3629631988386925734">ປ້ອນລະຫັດຜ່ານຂອງທ່ານເພື່ອເປີດນຳໃຊ້ Smart Lock. ຄັ້ງຕໍ່ໄປ, ໂທລະສັບຂອງທ່ານຈະປົດລັອກ <ph name="DEVICE_TYPE" /> ຂອງທ່ານ. ທ່ານສາມາດປິດ Smart Lock ໄດ້ໃນການຕັ້ງຄ່າ.</translation> +<translation id="3629664892718440872">ຈື່ການເລືອກນີ້ໄວ້</translation> <translation id="3630132874740063857">ໂທລະສັບຂອງທ່ານ</translation> <translation id="3630995161997703415">ເພີ່ມເວັບໄຊນີ້ໃສ່ຖ້ານຂອງທ່ານເພື່ອໃຊ້ມັນໄດ້ທຸກເວລາ</translation> <translation id="3631680145967006828"><ph name="BEGIN_PARAGRAPH1" />ການອະນຸຍາດໃຫ້ອຸປະກອນ ChromeOS ຂອງທ່ານສົ່ງລາຍງານອັດຕະໂນມັດຈະຊ່ວຍໃຫ້ພວກເຮົາຈັດລຳດັບຄວາມສຳຄັນໄດ້ວ່າຈະແກ້ໄຂ ແລະ ປັບປຸງຫຍັງໃນ ChromeOS. ລາຍງານເຫຼົ່ານີ້ສາມາດຮວມມີສິ່ງຕ່າງໆ ເຊັ່ນ: ChromeOS ຫຼົ້ມຕອນໃດ, ທ່ານໃຊ້ຄຸນສົມບັດໃດ ແລະ ປົກກະຕິທ່ານໃຊ້ໜ່ວຍຄວາມຈຳເທົ່າໃດ.<ph name="END_PARAGRAPH1" /> @@ -3278,6 +3282,7 @@ <ph name="EXTENSION_FILE" /></translation> <translation id="408721682677442104">ປະຕິເສດການຄວບຄຸມອຸປະກອນ MIDI ແບບເຕັມແລ້ວ</translation> +<translation id="4087328411748538168">ສະແດງຢູ່ເບື້ອງຂວາ</translation> <translation id="4089235344645910861">ບັນທຶກການຕັ້ງຄ່າໄວ້ແລ້ວ. ເລີ່ມການຊິ້ງຂໍ້ມູນແລ້ວ.</translation> <translation id="4090103403438682346">ເປີດໃຊ້ງານການເຂົ້າຫາທີ່ກວດສອບແລ້ວ</translation> <translation id="4090947011087001172">ຣີເຊັດການອະນຸຍາດເວັບໄຊສຳລັບ <ph name="SITE" /> ບໍ?</translation> @@ -3972,6 +3977,7 @@ <translation id="4779766576531456629">ປ່ຽນຊື່ເຄືອຂ່າຍມືຖືຂອງ eSIM</translation> <translation id="4780321648949301421">ບັນທຶກໜ້າເປັນ...</translation> <translation id="4781443161433589743">ທ່ານກຳລັງໃຊ້ຄວາມປອດໄພຂັ້ນສູງສຸດຂອງ Chrome ຢູ່</translation> +<translation id="4782861709165039462">ໄມໂຄຣໂຟນທັງໝົດຖືກປິດການນຳໃຊ້ໂດຍສະວິດຮາດແວຂອງອຸປະກອນ</translation> <translation id="4785719467058219317">ທ່ານກຳລັງໃຊ້ກະແຈຄວາມປອດໄພທີ່ບໍ່ໄດ້ລົງທະບຽນນຳເວັບໄຊນີ້</translation> <translation id="4785914069240823137">ຍົກເລີກການຕັດ</translation> <translation id="4788092183367008521">ກະລຸນາກວດເບິ່ງການເຊື່ອມຕໍ່ເຄືອຂ່າຍຂອງທ່ານ ແລ້ວລອງອີກຄັ້ງ.</translation> @@ -4737,6 +4743,7 @@ <translation id="5548075230008247516">ບໍ່ເລືອກລາຍການທັງໝົດ ແລະ ອອກຈາກໂໝດການເລືອກແລ້ວ.</translation> <translation id="5548159762883465903">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" ແລະ ອີກ 1 ແຖບອື່ນ}other{"<ph name="TAB_TITLE" />" ແລະ ອີກ # ແຖບອື່ນ}}</translation> <translation id="5548606607480005320">ການກວດສອບຄວາມປອດໄພ</translation> +<translation id="5548644592758170183">ສະແດງຢູ່ເບື້ອງຊ້າຍ</translation> <translation id="554903022911579950">Kerberos</translation> <translation id="5551573675707792127">ແປ້ນພິມ ແລະ ການປ້ອນຂໍ້ຄວາມ</translation> <translation id="5553089923092577885">ການສ້າງແຜນທີ່ນະໂຍບາຍໃບຢັ້ງຢືນ</translation> @@ -8218,6 +8225,7 @@ <translation id="8980345560318123814">ລາຍງານຄຳຕິຊົມ</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> - ຂັດຂ້ອງ</translation> <translation id="8981825781894055334">ເຈ້ຍເຫຼືອໜ້ອຍ</translation> +<translation id="8983018820925880511">ໂປຣໄຟລ໌ໃໝ່ນີ້ຈະໄດ້ຮັບການຈັດການໂດຍ <ph name="DOMAIN" />. <ph name="BEGIN_LINK" />ສຶກສາເພີ່ມເຕີມ<ph name="END_LINK" /></translation> <translation id="8983632908660087688"><ph name="ORIGIN" /> ສາມາດແກ້ໄຂ <ph name="FILENAME" /> ໄດ້</translation> <translation id="8984694057134206124">ທ່ານຈະເບິ່ງເຫັນຕໍ່ກັບທຸກຄົນເປັນເວລາ <ph name="MINUTES" /> ນາທີ. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="8985191021574400965">ຍິນດີຕ້ອນຮັບສູ່ Steam ສຳລັບ Chromebook</translation> @@ -8315,6 +8323,7 @@ <translation id="9075413375877487220">ສ່ວນຂະຫຍາຍນີ້ບໍ່ໄດ້ຮັບຄວາມເຊື່ອຖືຈາກ Safe Browsing ທີ່ປັບປຸງດີຂຶ້ນ.</translation> <translation id="9076283476770535406">ມັນອາດຈະມີເນື້ອຫາສຳລັບຜູ້ໃຫຍ່</translation> <translation id="9076523132036239772">ຂໍອະໄພ, ບໍ່ສາມາດກວດສອບອີເມວ ຫຼືລະຫັດຜ່ານຂອງທ່ານໄດ້. ລອງເຊື່ອມຕໍ່ກັບເຄືອຂ່າຍກ່ອນ.</translation> +<translation id="9076821103818989526">ແຖບດ້ານຂ້າງ</translation> <translation id="9076977315710973122">ການແບ່ງປັນ SMB</translation> <translation id="9078193189520575214">ກຳລັງນຳໃຊ້ການປ່ຽນແປງ...</translation> <translation id="9078316009970372699">ປິດການນຳໃຊ້ການປ່ອຍສັນຍານທັນທີ</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index 53ad43f..b72ccfd 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -3228,6 +3228,7 @@ <translation id="402211067068791756">Bus išvalyta <ph name="TOTAL_USAGE" /> pateiktų svetainių saugomų duomenų</translation> <translation id="4022426551683927403">&Pridėti į žodyną</translation> <translation id="4025039777635956441">Nutildyti pasirinktą svetainę</translation> +<translation id="4027958407426528157">Atidarykite svetaines naudodami „<ph name="DEVICE_TYPE" />“ įdiegtas programas</translation> <translation id="4028467762035011525">Pridėti įvesties metodų</translation> <translation id="4029556917477724407">Grįžti iš puslapio „<ph name="PAGE_TITLE" />“</translation> <translation id="4031179711345676612">Mikrofonas leidžiamas</translation> @@ -6585,6 +6586,7 @@ <translation id="7377481913241237033">Susieti naudojant kodą</translation> <translation id="7378611153938412599">Nesudėtingus slaptažodžius lengva atspėti. Įsitikinkite, kad kuriate sudėtingus slaptažodžius. <ph name="BEGIN_LINK" />Žr. daugiau saugos patarimų.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Atidarykite „Chrome“ internetinę parduotuvę</translation> +<translation id="737938816678769289">Lengvai prijunkite ir nustatykite sparčiojo susiejimo įrenginius netoliese</translation> <translation id="7380459290951585794">Įsitikinkite, kad telefonas netoliese, atrakintas ir jame įjungtas „Bluetooth“ bei „Wi-Fi“ ryšys</translation> <translation id="7380622428988553498">Įrenginio pavadinime yra netinkamų simbolių</translation> <translation id="7380768571499464492">Atnaujintas „<ph name="PRINTER_NAME" />“</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index a3061c00e..9d03463 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -354,6 +354,7 @@ <translation id="1340527397989195812">Dublējiet multividi no savas ierīces, izmantojot lietotni “Faili”.</translation> <translation id="1343865611738742294">Piešķiriet Linux lietotnēm atļauju piekļūt USB ierīcēm. Pēc USB ierīces noņemšanas operētājsistēmā Linux netiks saglabāti šīs ierīces dati.</translation> <translation id="1343920184519992513">Atsākt darbu no vietas, kur to beidzāt, un atvērt konkrētu lapu kopu</translation> +<translation id="1344377983938103876">Notiek vietnes <ph name="URL" /> atvēršana…</translation> <translation id="134589511016534552">Multivides cilnes tiek rādītas arī sadaļā Atvērtās cilnes</translation> <translation id="1346630054604077329">Apstiprināt un restartēt</translation> <translation id="1346748346194534595">Pa labi</translation> @@ -6960,6 +6961,7 @@ <translation id="7753735457098489144">Instalēšana neizdevās, jo trūkst krātuves vietas. Lai atbrīvotu vietu, izdzēsiet failus no šīs ierīces.</translation> <translation id="7754347746598978109">Nedrīkst izmantot JavaScript</translation> <translation id="7754704193130578113">Jautāt, kur saglabāt ikvienu failu pirms lejuplādēšanas</translation> +<translation id="7755134875397410803">Lai palīdzētu jums paveikt uzdevumus, Google saņems to vietņu vietrāžus URL un saturu, kurās izmantosiet Asistentu, kā arī informāciju, ko iesniegsiet, izmantojot Asistentu. Šī informācija var tikt glabāta jūsu Google kontā. Chrome iestatījumos varat izslēgt Asistentu. <ph name="LEARN_MORE" />.</translation> <translation id="7755287808199759310">Lai atbloķētu, vēsieties pie vecāka</translation> <translation id="7757592200364144203">Mainīt ierīces nosaukumu</translation> <translation id="7757739382819740102">Tuvumā esošās kontaktpersonas var kopīgot saturu ar jums. Būs nepieciešams apstiprinājums.</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb index 3414418..22e1144 100644 --- a/chrome/app/resources/generated_resources_mk.xtb +++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -1020,6 +1020,7 @@ <translation id="1935303383381416800">Дозволено им е да ја гледаат локацијата</translation> <translation id="1936931585862840749">Употребете број за да назначите колку примероци да се испечатат (од 1 до <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Не може да се увезе тип архитектура на контејнер <ph name="ARCHITECTURE_CONTAINER" /> со уред којшто е <ph name="ARCHITECTURE_DEVICE" />. Може да се обидете да го вратите овој контејнер во различен уред или може да пристапите до датотеките во оваа слика на контејнер, така што ќе ја отворите апликацијата Files.</translation> +<translation id="1938240902511979591">Режим на висок контраст, лупа и поставки за екран</translation> <translation id="1938320257168860255">Нешто тргна наопаку. Проверете дали телефонот е во близина и отклучен и дали се вклучени Bluetooth и Wi-Fi.</translation> <translation id="1938351510777341717">Надворешна наредба</translation> <translation id="1940546824932169984">Поврзани уреди</translation> @@ -1442,6 +1443,7 @@ <ph name="FOOTER_MESSAGE" /></translation> <translation id="2308798336967462263">Следните копчиња не се поддржани: Tab, Shift, Control, Escape, Caps lock, Volume</translation> <translation id="2309620859903500144">Пристапот на сајтов до сензорите за движење или светлина е блокиран.</translation> +<translation id="2310923358723722542">Екран и зголемување</translation> <translation id="2312219318583366810">URL на страницата</translation> <translation id="2314165183524574721">Тековната поставка за видливост е „Сокриен“</translation> <translation id="2314774579020744484">Јазик што се користи за превод на страниците</translation> @@ -4179,6 +4181,7 @@ <translation id="496446150016900060">да ги синхронизира Wi-Fi мрежите со телефонот</translation> <translation id="4965808351167763748">Дали сигурно сакате да поставите уредов да извршува Hangouts Meet?</translation> <translation id="4966972803217407697">Во „Инкогнито“ сте</translation> +<translation id="4967227914555989138">Додај белешка</translation> <translation id="496742804571665842">Оневозможете ги профилите на eSIM</translation> <translation id="4971412780836297815">Отвори кога ќе заврши</translation> <translation id="4971735654804503942">Побрза и проактивна заштита од опасни веб-сајтови, преземања и екстензии. Ве предупредува за упади во лозинките. Бара да се испраќаат податоци од прелистувањето до Google.</translation> @@ -4426,6 +4429,7 @@ <translation id="5233231016133573565">ИД на процес</translation> <translation id="5233638681132016545">Нова картичка</translation> <translation id="5233736638227740678">&Залепи</translation> +<translation id="5233794855520048159">Моно аудио, звуци при стартување и титлови</translation> <translation id="5234764350956374838">Отфрли</translation> <translation id="5235050375939235066">Дали да се деинсталира апликацијата?</translation> <translation id="523505283826916779">Поставки за пристапност</translation> @@ -4530,6 +4534,7 @@ <translation id="5333896723098573627">За да отстраните апликации, одете во Поставки > Апликации > Google Play Store > Управувајте со поставките за Android > Апликации или Управник со апликации. Потоа допрете ја апликацијата што сакате да ја деинсталирате (можеби ќе треба да повлечете надесно или налево за да ја најдете). Потоа допрете на „Деинсталирај“ или „Оневозможи“.</translation> <translation id="5334142896108694079">Кеш на скрипта</translation> <translation id="5336688142483283574">Страницава исто така ќе се отстрани од вашата историја и активноста на <ph name="SEARCH_ENGINE" />.</translation> +<translation id="5336689872433667741">Курсор и подлога за допир</translation> <translation id="5337771866151525739">Инсталирано од трето лице.</translation> <translation id="5337926771328966926">Името на тековниот уред е <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Може да прелистувате приватно во прозорец „Инкогнито“</translation> @@ -4540,6 +4545,7 @@ <translation id="5342091991439452114">PIN-кодот мора да содржи најмалку <ph name="MINIMUM" /> цифри</translation> <translation id="5344036115151554031">Се враќа Linux</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" /> % (десна)</translation> +<translation id="534449933710420173">Неименувана папка</translation> <translation id="5345916423802287046">Стартувај ја апликацијата кога ќе се најавам</translation> <translation id="5350293332385664455">Исклучување на „Помошникот на Google“</translation> <translation id="535123479159372765">Текст копиран од друг уред</translation> @@ -5163,6 +5169,7 @@ <translation id="5959471481388474538">Мрежата не е достапна</translation> <translation id="595959584676692139">Вчитајте ја страницата повторно за да ја користите екстензијава</translation> <translation id="5963453369025043595"><ph name="NUM_HANDLES" /> (<ph name="NUM_KILOBYTES_LIVE" /> максимум)</translation> +<translation id="5963620791620013026">Лепливи копчиња, тастатура на екран, диктирање, пристап со прекинувачи и подобрено нагласување</translation> <translation id="5964113968897211042">{COUNT,plural, =0{Отвори ги сите во &нов прозорец}=1{Отвори во &нов прозорец}one{Отвори ги сите ({COUNT}) во &нов прозорец}other{Отвори ги сите ({COUNT}) во &нов прозорец}}</translation> <translation id="5965661248935608907">Контролира и која страница се прикажува ако кликнете на копчето Дома или ако пребарувате од лентата за адреси.</translation> <translation id="5968022600320704045">Нема резултати од пребарувањето</translation> @@ -5975,6 +5982,7 @@ <translation id="6770602306803890733">Ја подобрува безбедноста за вас и сите останати на интернет</translation> <translation id="6771503742377376720">Е орган за сертифицирање</translation> <translation id="6775163072363532304">Достапните уреди ќе се појават тука.</translation> +<translation id="677646486571529447">Додај белешка</translation> <translation id="6776729248872343918">Овозможи „Брзо спарување“</translation> <translation id="6777817260680419853">Пренасочувањето е блокирано</translation> <translation id="6778737459546443941">Родителот уште не го одобрил</translation> @@ -6123,6 +6131,7 @@ <translation id="6900654715912436255">Дали сигурно сакате да го избришете овој пребарувач?</translation> <translation id="6901024547292737736"><ph name="ACTUAL_CHAR_COUNT" />/<ph name="MAX_CHAR_COUNT" /></translation> <translation id="6902066522699286937">Глас за преглед</translation> +<translation id="6902219595840841518">Автоматско кликнување, големина на курсор, боја на курсор и курсор за нагласување</translation> <translation id="6902336033320348843">Делот не е поддржан: <ph name="ERROR_LINE" /></translation> <translation id="6902837902700739466">Приклучете го уредот на домен</translation> <translation id="6903022061658753260">Вашите податоци ќе се синхронизираат на сите прелистувачи Chrome каде што сте вклучиле синхронизиција на сметката. За опциите за синхронизација на Chrome OS, одете на <ph name="LINK_BEGIN" />поставките за Chrome OS<ph name="LINK_END" />.</translation> @@ -6901,6 +6910,7 @@ <translation id="7681095912841365527">Сајтот може да користи Bluetooth</translation> <translation id="7681597159868843240">Сајтовите обично ги користат сензорите за движење на уредот за функции како виртуелна реалност или следење на фитнесот</translation> <translation id="7683373461016844951">За да продолжите, кликнете „Во ред“, а потоа кликнете „Додај лице“ за да создадете нов профил за адресата на е-пошта на <ph name="DOMAIN" />.</translation> +<translation id="7683834360226457448">Алатки за екран при слаб вид</translation> <translation id="7684212569183643648">Инсталирано од вашиот администратор</translation> <translation id="7684559058815332124">Посетете ја страницата за најавување на порталот за автентикација</translation> <translation id="7684718995427157417">За создавање и тестирање на вашите апликации, овозможете ја Android Debug Bridge (ADB). Имајте предвид дека дејствово овозможува инсталирање апликации за Android што не се потврдени од Google, а за оневозможувањето е потребно фабричко ресетирање.</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index 4f3788d..a913c37 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -354,6 +354,7 @@ <translation id="1340527397989195812">Files ആപ്പ് ഉപയോഗിച്ച് ഉപകരണത്തിൽ നിന്നും മീഡിയ ബാക്കപ്പ് ചെയ്യുക.</translation> <translation id="1343865611738742294">USB ഉപകരണങ്ങൾ ആക്സസ് ചെയ്യാൻ Linux ആപ്പുകൾക്ക് അനുമതി നൽകുക. USB ഉപകരണം നീക്കം ചെയ്തുകഴിഞ്ഞാൽ Linux അത് ഓർക്കില്ല.</translation> <translation id="1343920184519992513">നിങ്ങൾ നിർത്തിയ ഇടത്ത് നിന്ന് തുടരുക, പേജുകളുടെ നിർദ്ദിഷ്ട സെറ്റ് തുറക്കുക</translation> +<translation id="1344377983938103876"><ph name="URL" /> തുറക്കുന്നു...</translation> <translation id="134589511016534552">തുറന്നിരിക്കുന്ന ടാബുകൾ വിഭാഗത്തിലും മീഡിയ ടാബുകൾ കാണിക്കുന്നു</translation> <translation id="1346630054604077329">സ്ഥിരീകരിച്ച് റീസ്റ്റാർട്ട് ചെയ്യുക</translation> <translation id="1346748346194534595">ശരി</translation> @@ -1267,6 +1268,7 @@ <translation id="2180620921879609685">ഏത് പേജിലെയും ഉള്ളടക്കം ബ്ലോക്ക് ചെയ്യുക</translation> <translation id="2182058453334755893">നിങ്ങളുടെ ക്ലിപ്പ്ബോർഡിലേക്ക് പകർത്തി</translation> <translation id="2184515124301515068">സൈറ്റുകൾക്ക് എപ്പോൾ ശബ്ദം പ്ലേ ചെയ്യാനാവും എന്നത് (ശുപാർശ ചെയ്തത്) തിരഞ്ഞെടുക്കാൻ Chrome-നെ അനുവദിക്കുക</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">മറ്റൊരു ഉപകരണത്തിൽ നിന്ന് പങ്കിട്ട പേജ്</translation> <translation id="2187675480456493911">നിങ്ങളുടെ അക്കൗണ്ടിലെ മറ്റ് ഉപകരണങ്ങളുമായി സമന്വയിപ്പിച്ചു. മറ്റ് ഉപയോക്താക്കൾ പരിഷ്കരിച്ച ക്രമീകരണം സമന്വയിപ്പിക്കില്ല. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation> <translation id="2187895286714876935">സെര്വര് സാക്ഷ്യപത്ര ഇറക്കുമതി പിശക്</translation> @@ -6954,6 +6956,7 @@ <translation id="7753735457098489144">സ്റ്റോറേജ് സ്പെയ്സ് ഇല്ലാത്തതിനാൽ ഇൻസ്റ്റാൾ ചെയ്യാനായില്ല. ഇടം സൃഷ്ടിക്കാൻ, ഉപകരണ സ്റ്റോറേജിൽ നിന്ന് ഫയലുകൾ ഇല്ലാതാക്കുക.</translation> <translation id="7754347746598978109">JavaScript ഉപയോഗിക്കാൻ അനുവദിക്കുന്നില്ല</translation> <translation id="7754704193130578113">ഡൗൺലോഡ് ചെയ്യുന്നതിനു മുമ്പ് ഓരോ ഫയലും എവിടെ സംരക്ഷിക്കണമെന്ന് ചോദിക്കുക</translation> +<translation id="7755134875397410803">ടാസ്ക്കുകൾ പൂർത്തിയാക്കാൻ നിങ്ങളെ സഹായിക്കുന്നതിന്, നിങ്ങൾ Assistant ഉപയോഗിക്കുന്ന സൈറ്റുകളുടെ URL-കളും അവയിലെ ഉള്ളടക്കവും Assistant-ലൂടെ നിങ്ങൾ സമർപ്പിക്കുന്ന വിവരങ്ങളും Google-ന് ലഭിക്കും. ഈ വിവരങ്ങൾ നിങ്ങളുടെ Google അക്കൗണ്ടിൽ സംഭരിച്ചേക്കാം. നിങ്ങൾക്ക് Chrome ക്രമീകരണത്തിൽ Assistant ഓഫാക്കാം. <ph name="LEARN_MORE" /></translation> <translation id="7755287808199759310">നിങ്ങൾക്ക് വേണ്ടി ഇത് അൺബ്ലോക്ക് ചെയ്യാൻ രക്ഷിതാവിന് കഴിയും</translation> <translation id="7757592200364144203">ഉപകരണത്തിന്റെ പേര് മാറ്റുക</translation> <translation id="7757739382819740102">സമീപത്തുള്ള കോൺടാക്റ്റുകൾക്ക് നിങ്ങളുമായി പങ്കിടാം. അനുമതി ആവശ്യമാണ്.</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb index 1f51bf99..79e3488 100644 --- a/chrome/app/resources/generated_resources_mn.xtb +++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -1015,6 +1015,7 @@ <translation id="1935303383381416800">Таны байршлыг харахыг зөвшөөрсөн</translation> <translation id="1936931585862840749">Тоо ашиглан хэдэн хувь хэвлэхийг заана уу (1-ээс <ph name="MAX_COPIES" /> хүртэл).</translation> <translation id="1937774647013465102">Контейнерын архитектурын төрөл болох<ph name="ARCHITECTURE_CONTAINER" />-г энэ төхөөрөмж буюу <ph name="ARCHITECTURE_DEVICE" />-р импорт хийх боломжгүй байна. Та энэ контейнерыг өөр төхөөрөмжид сэргээхээр оролдох эсвэл Файлс аппыг нээж, энэ контейнерын зураг дахь файлд хандах боломжтой.</translation> +<translation id="1938240902511979591">Өндөр нягтралтай горим, томруулагч болон дэлгэцийн тохиргоо</translation> <translation id="1938320257168860255">Алдаа гарлаа. Таны утас ойрхон, түгжээг нь тайлсан, Bluetooth, Wi-Fi-г нь асаасан эсэхийг шалгана уу.</translation> <translation id="1938351510777341717">Гадаад тушаал</translation> <translation id="1940546824932169984">Холбогдсон төхөөрөмж</translation> @@ -1437,6 +1438,7 @@ <ph name="FOOTER_MESSAGE" /></translation> <translation id="2308798336967462263">Дараах товчуудыг дэмждэггүй: Tab, Shift, Control, Escape, Caps lock, Volume</translation> <translation id="2309620859903500144">Энэ сайтад таны хөдөлгөөн болон гэрлийн мэдрэгчид хандахыг блоклосон байна.</translation> +<translation id="2310923358723722542">Дэлгэц болон томруулалт</translation> <translation id="2312219318583366810">Хуудасны URL</translation> <translation id="2314165183524574721">Одоогийн харагдцын тохиргоог нуусан байна</translation> <translation id="2314774579020744484">Хуудсыг орчуулахад ашигладаг хэл</translation> @@ -3220,6 +3222,7 @@ <translation id="402211067068791756">Энэ нь үзүүлсэн сайтуудын хадгалсан <ph name="TOTAL_USAGE" />-н өгөгдлийг арилгана</translation> <translation id="4022426551683927403">&Толь бичигт нэмэх</translation> <translation id="4025039777635956441">Сонгосон сайтын дууг хаах</translation> +<translation id="4027958407426528157"><ph name="DEVICE_TYPE" /> дээрээ суулгасан аппуудад вебсайтуудыг нээнэ үү</translation> <translation id="4028467762035011525">Оруулах арга нэмэх</translation> <translation id="4029556917477724407"><ph name="PAGE_TITLE" /> хуудаснаас буцах</translation> <translation id="4031179711345676612">Микрофоныг зөвшөөрсөн</translation> @@ -4172,6 +4175,7 @@ <translation id="496446150016900060">Wi-Fi сүлжээнүүдийг утастайгаа синк хийх</translation> <translation id="4965808351167763748">Hangouts Meet-г ажиллуулахын тулд энэ төхөөрөмжийг тохируулах уу?</translation> <translation id="4966972803217407697">Та Нууцлалтай горимд байна</translation> +<translation id="4967227914555989138">Тэмдэглэл нэмэх</translation> <translation id="496742804571665842">eSIM профайлуудыг идэвхгүй болгох</translation> <translation id="4971412780836297815">Дууссаны дараа нээх</translation> <translation id="4971735654804503942">Аюултай вебсайт, таталт болон өргөтгөлийн эсрэг илүү хурдан, идэвхтэй хамгаалалт. Танд нууц үгний зөрчлийн тухай анхааруулга өгдөг. Хайлтын өгөгдлийг Google-д илгээхийг шаарддаг.</translation> @@ -4419,6 +4423,7 @@ <translation id="5233231016133573565">Явцын ID</translation> <translation id="5233638681132016545">Шинэ таб</translation> <translation id="5233736638227740678">& Наах</translation> +<translation id="5233794855520048159">Моно аудио, эхлүүлэхэд дуугарах ая, тайлбар</translation> <translation id="5234764350956374838">Хэрэгсэхгүй болго</translation> <translation id="5235050375939235066">Апп-г устгах уу?</translation> <translation id="523505283826916779">Нэвтрэх боломжит байдлын тохиргоо</translation> @@ -4523,6 +4528,7 @@ <translation id="5333896723098573627">Аппуудыг хасахын тулд Тохиргоо > Аппууд > Google Play Дэлгүүр > Android-н тохиргоог удирдах > Аппууд эсвэл Аппликэйшны менежер хэсэгт очно уу. Дараа нь устгахыг хүссэн апп дээрээ товшино уу (та аппыг олохын тулд баруун эсвэл зүүн тийш шудрах шаардлагатай байж магадгүй). Дараа нь Устгах эсвэл Идэвхгүй болгох дээр товшино уу.</translation> <translation id="5334142896108694079">Бичвэрийн кэш</translation> <translation id="5336688142483283574">Таны түүх болон <ph name="SEARCH_ENGINE" /> үйл ажиллагаанаас энэ хуудас мөн хасагдана.</translation> +<translation id="5336689872433667741">Курсор болон мэдрэгч самбар</translation> <translation id="5337771866151525739">Гуравдагч этгээдээс суулгасан.</translation> <translation id="5337926771328966926">Одоогийн төхөөрөмжийн нэр <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Та Нууцлалтай цонхыг ашиглан нууцлалтайгаар үзэх боломжтой</translation> @@ -4533,6 +4539,7 @@ <translation id="5342091991439452114">ПИН хамгийн багадаа <ph name="MINIMUM" /> оронтой байх ёстой</translation> <translation id="5344036115151554031">Linux-г сэргээж байна</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (Баруун)</translation> +<translation id="534449933710420173">Нэрлэгдээгүй фолдер</translation> <translation id="5345916423802287046">Нэвтрэх үедээ аппыг эхлүүлэх</translation> <translation id="5350293332385664455">Google Туслахыг унтраах</translation> <translation id="535123479159372765">Өөр төхөөрөмжөөс хуулсан текст</translation> @@ -5156,6 +5163,7 @@ <translation id="5959471481388474538">Сүлжээг ажиллахгүй байна.</translation> <translation id="595959584676692139">Энэ өргөтгөлийг ашиглахын тулд хуудсыг дахин ачаалах</translation> <translation id="5963453369025043595"><ph name="NUM_HANDLES" /> ( <ph name="NUM_KILOBYTES_LIVE" /> оргил)</translation> +<translation id="5963620791620013026">Бэхэлсэн түлхүүр, дэлгэц дээрх гар, дуу хоолойгоор бичих, сэлгүүр болон сайжруулсан тодруулга</translation> <translation id="5964113968897211042">{COUNT,plural, =0{Бүгдийг &шинэ цонхонд нээх}=1{&Шинэ цонхонд нээх}other{Бүгдийг ({COUNT}) &шинэ цонхонд нээх}}</translation> <translation id="5965661248935608907">Энэ нь таныг Home Товчийг дарах эсвэл өмнө нь хайж байсан линкүүд дотроос айлт хийж байх үед гарч ирэх хуудсыг мөн хянадаг.</translation> <translation id="5968022600320704045">Хайлтын илэрц байхгүй</translation> @@ -5966,6 +5974,7 @@ <translation id="6770602306803890733">Таны болон веб дэх хүн бүрийн аюулгүй байдлыг сайжруулдаг</translation> <translation id="6771503742377376720">Гэрчилгээжүүлэх Алба</translation> <translation id="6775163072363532304">Боломжтой байгаа төхөөрөмжүүд энд харагдана.</translation> +<translation id="677646486571529447">Тэмдэглэл нэмэх</translation> <translation id="6776729248872343918">Хурдан холбохыг идэвхжүүлэх</translation> <translation id="6777817260680419853">Дахин чиглүүлэлтийг блоклосон</translation> <translation id="6778737459546443941">Таны эцэг эх үүнийг зөвшөөрөөгүй байна</translation> @@ -6114,6 +6123,7 @@ <translation id="6900654715912436255">Та энэ хайлтын системийг устгахдаа итгэлтэй байна уу?</translation> <translation id="6901024547292737736"><ph name="ACTUAL_CHAR_COUNT" />/<ph name="MAX_CHAR_COUNT" /></translation> <translation id="6902066522699286937">Урьдчилан үзэх дуу хоолой</translation> +<translation id="6902219595840841518">Автомат товшилт, курсорын хэмжээ, курсорын өнгө болон тодруулах курсор</translation> <translation id="6902336033320348843">Хэсгийг дэмжээгүй байна: <ph name="ERROR_LINE" /></translation> <translation id="6902837902700739466">Домайнд төхөөрөмж нэгтгэх</translation> <translation id="6903022061658753260">Таны энэ бүртгэлд синк хийхийг асаасан Chrome-н бүх хөтөч дээр таны өгөгдлийг синк хийнэ. ChromeOS-н синк хийх сонголтыг харах бол <ph name="LINK_BEGIN" />ChromeOS-н тохиргоо<ph name="LINK_END" /> руу очно уу.</translation> @@ -6570,6 +6580,7 @@ <translation id="7377481913241237033">Кодоор холбогдох</translation> <translation id="7378611153938412599">Сул нууц үгийг таахад хялбар байдаг. Сайн нууц үг үүсгэж байгаа эсэхээ шалгаарай. <ph name="BEGIN_LINK" />Аюулгүй байдлын бусад зөвлөгөөг харна уу.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Chrome Веб Дэлгүүр нээх</translation> +<translation id="737938816678769289">Ойролцоох төхөөрөмжүүдэд хялбархан холбогдож, Хурдан холбох онцлогийг тохируулаарай</translation> <translation id="7380459290951585794">Таны утас ойрхон, түгжээг нь тайлсан, Bluetooth, Wi-Fi-г нь асаасан эсэхийг шалгана уу</translation> <translation id="7380622428988553498">Төхөөрөмжийн нэр буруу тэмдэгт агуулж байна</translation> <translation id="7380768571499464492"><ph name="PRINTER_NAME" />-г шинэчилсэн</translation> @@ -6891,6 +6902,7 @@ <translation id="7681095912841365527">Сайт bluetooth-г ашиглах боломжтой</translation> <translation id="7681597159868843240">Сайтууд ихэвчлэн виртуал бодит байдал эсвэл фитнесийг хянах зэрэг онцлогуудад зориулж таны төхөөрөмжийн хөдөлгөөн мэдрэгчийг ашигладаг</translation> <translation id="7683373461016844951">Үргэлжлүүлэхийн тулд OK сонголтыг товшоод <ph name="DOMAIN" /> имэйл хаягаараа шинэ профайл үүсгэхийн тулд Хүн нэмэх гэсэн сонголтыг дарна уу.</translation> +<translation id="7683834360226457448">Хараа муутай хүмүүст зориулсан дэлгэцийн хэрэгсэл</translation> <translation id="7684212569183643648">Таны админ суулгасан</translation> <translation id="7684559058815332124">Хязгаарлагдмал портал нэвтрэх хуудас руу орно уу</translation> <translation id="7684718995427157417">Апликейшн үүсгэж, шалгахын тулд Android Debug Bridge (ADB)-г идэвхжүүлнэ үү. Энэ үйлдэл нь Google-н баталгаажуулаагүй Андройд аппыг суулгахыг зөвшөөрөх бөгөөд идэвхгүй болгоход үйлдвэрийн тохиргоонд шинэчлэх шаардлагатай.</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 35ea0d0d..fbc0083 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -1279,6 +1279,7 @@ <translation id="2180620921879609685">कोणत्याही पेजवरील आशय ब्लॉक करू शकते</translation> <translation id="2182058453334755893">तुमच्या क्लिपबोर्डवर कॉपी केले</translation> <translation id="2184515124301515068">जेव्हा साइट आवाज प्ले करेल तेव्हा Chrome ला निवड करू दे (शिफारस केलेले)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">दुसऱ्या डिव्हाइसवरून शेअर केलेले पेज</translation> <translation id="2187675480456493911">तुमच्या खात्यावरील इतर डिव्हाइसशी सिंक केले आहे. इतर वापरकर्त्यांनी बदललेली सेटिंग्ज सिंक केली जाणार नाहीत. <ph name="LINK_BEGIN" />अधिक जाणून घ्या<ph name="LINK_END" /></translation> <translation id="2187895286714876935">सर्व्हर सर्टिफिकेट आयात एरर</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index e5b9869..30cc9c61 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -354,6 +354,7 @@ <translation id="1340527397989195812">Sandarkan media dari peranti menggunakan apl Fail.</translation> <translation id="1343865611738742294">Beri Linux kebenaran apl untuk mengakses peranti USB. Linux tidak akan mengingat peranti USB selepas peranti itu dialih keluar.</translation> <translation id="1343920184519992513">Teruskan dari tempat anda berhenti dan buka set halaman tertentu</translation> +<translation id="1344377983938103876">Membuka <ph name="URL" />...</translation> <translation id="134589511016534552">Tab media juga ditunjukkan dalam bahagian Tab Terbuka</translation> <translation id="1346630054604077329">Sahkan dan mulakan semula</translation> <translation id="1346748346194534595">Kanan</translation> @@ -6971,6 +6972,7 @@ <translation id="7753735457098489144">Pemasangan gagal kerana ruang storan tidak mencukupi. Untuk mengosongkan ruang, padamkan fail daripada storan peranti.</translation> <translation id="7754347746598978109">Tidak dibenarkan untuk menggunakan JavaScript</translation> <translation id="7754704193130578113">Tanyakan tempat untuk menyimpan setiap fail sebelum memuat turun</translation> +<translation id="7755134875397410803">Untuk membantu anda menyelesaikan tugas, Google akan menerima URL dan kandungan bagi laman tempat anda menggunakan Assistant, serta maklumat yang anda serahkan menerusi Assistant. Maklumat ini mungkin disimpan pada Google Account anda. Anda boleh mematikan Assistant dalam tetapan Chrome. <ph name="LEARN_MORE" /></translation> <translation id="7755287808199759310">Ibu bapa anda boleh menyahsekatnya untuk anda</translation> <translation id="7757592200364144203">Tukar nama peranti</translation> <translation id="7757739382819740102">Kenalan yang berdekatan boleh berkongsi dengan anda. Kelulusan diperlukan.</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index 6b3a1b3..6429168 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -3222,6 +3222,7 @@ <translation id="402211067068791756">ဤလုပ်ဆောင်ချက်က ပြထားသည့်ဝဘ်ဆိုက်များတွင် သိမ်းထားသည့် ဒေတာ <ph name="TOTAL_USAGE" /> ကို ရှင်းထုတ်လိုက်ပါမည်</translation> <translation id="4022426551683927403">&အဘိဓာန်သို့ ထည့်ရန်</translation> <translation id="4025039777635956441">ရွေးထားသောဝဘ်ဆိုက် ဖျောက်ထားရန်</translation> +<translation id="4027958407426528157">သင့်စက် <ph name="DEVICE_TYPE" /> ၌ထည့်သွင်းထားသော အက်ပ်များတွင် ဝဘ်ဆိုက်များကို ဖွင့်နိုင်သည်</translation> <translation id="4028467762035011525">လက်ကွက်များ ထည့်ရန်</translation> <translation id="4029556917477724407"><ph name="PAGE_TITLE" /> စာမျက်နှာမှ နောက်ပြန်သွားရန်</translation> <translation id="4031179711345676612">မိုက်ခရိုဖုန်းကို သုံးခွင့်ပြုထားသည်</translation> @@ -6570,6 +6571,7 @@ <translation id="7377481913241237033">ကုဒ်ဖြင့် ချိတ်ဆက်ရန်</translation> <translation id="7378611153938412599">လုံခြုံမှုလျော့နည်းသည့် စကားဝှက်များကို အလွယ်တကူ ခန့်မှန်းနိုင်သည်။ လုံခြုံမှုမြင့်သည့် စကားဝှက်များကို သတ်မှတ်ပါ။ <ph name="BEGIN_LINK" />နောက်ထပ် လုံခြုံရေးအကြံပြုချက်များ ကြည့်ရန်။<ph name="END_LINK" /></translation> <translation id="73786666777299047">Chrome Web စတိုးကို ဖွင့်ရန်</translation> +<translation id="737938816678769289">အနီးရှိ ‘အမြန်တွဲချိတ်ခြင်း’ စက်များကို အလွယ်ချိတ်ဆက်ပြီး စနစ်ထည့်သွင်းနိုင်သည်</translation> <translation id="7380459290951585794">သင့်ဖုန်းသည် အနီးတွင်ရှိပြီး လော့ခ်ဖွင့်ထားကာ ဘလူးတုသ်နှင့် Wi-Fi ဖွင့်ထားကြောင်း သေချာပါစေ</translation> <translation id="7380622428988553498">စက်အမည်တွင် မမှန်ကန်သော အက္ခရာများပါဝင်သည်</translation> <translation id="7380768571499464492"><ph name="PRINTER_NAME" /> က အပ်ဒိတ်လုပ်ထားသည်</translation> @@ -7634,13 +7636,13 @@ <translation id="8382913212082956454">အီးမေးလ် လိပ်စာ &ကူးယူရန်</translation> <translation id="8383266303049437646"><ph name="BEGIN_PARAGRAPH1" />ဤပြဿနာရှာဖွေဖြေရှင်းခြင်း အဆင့်များကို စမ်းကြည့်ပါ- <ph name="BEGIN_LIST" /> - <ph name="LIST_ITEM" />HDD၊ SSD (သို့) eMMC ကဲ့သို့ စက်အတွင်းသိမ်းဆည်းရန်နေရာများ ကောင်းမွန်ကြောင်း သေချာပါစေ - <ph name="LIST_ITEM" />သင့်စက်အတွင်း သိမ်းဆည်းရန်နေရာသည် 16GB ထက် ပို၊ မပို စစ်ဆေးပါ - <ph name="LIST_ITEM" />ကိုင်တွယ်ကြည့်နိုင်ပါက စက်အတွင်းသိမ်းဆည်းရန်နေရာသို့ ချိတ်ဆက်မှုကို စစ်ဆေးပါ - <ph name="LIST_ITEM" />အသိအမှတ်ပြုထားသောမော်ဒယ်ကို အသုံးပြုနေကြောင်း သေချာစေပြီး ထည့်သွင်းပုံမှတ်စုများကို စစ်ဆေးပါ + <ph name="LIST_ITEM" />HDD၊ SSD (သို့) eMMC ကဲ့သို့ စက်တွင်းသိုလှောင်ခန်း ကောင်းမွန်ကြောင်း သေချာပါစေ + <ph name="LIST_ITEM" />သင်၏ စက်တွင်းသိုလှောင်ခန်းသည် ၁၆ GB ထက်ပိုများခြင်း ရှိ၊ မရှိ စစ်ပါ + <ph name="LIST_ITEM" />ကိုင်တွယ်ကြည့်နိုင်ပါက စက်တွင်းသိုလှောင်ခန်းသို့ ချိတ်ဆက်မှုကို စစ်ပါ + <ph name="LIST_ITEM" />အသိအမှတ်ပြုထားသောမော်ဒယ်ကို အသုံးပြုနေကြောင်း သေချာစေပြီး ထည့်သွင်းပုံမှတ်စုများကို ကြည့်ပါ <ph name="END_LIST" /> <ph name="END_PARAGRAPH1" /> - <ph name="BEGIN_PARAGRAPH2" />နောက်ထပ်အကူအညီလိုလျှင် ဤသို့ ဝင်ကြည့်ပါ- g.co/flex/InstallErrors။<ph name="END_PARAGRAPH2" /></translation> + <ph name="BEGIN_PARAGRAPH2" />နောက်ထပ်အကူအညီလိုလျှင် g.co/flex/InstallErrors သို့သွားပါ။<ph name="END_PARAGRAPH2" /></translation> <translation id="8386091599636877289">မူဝါဒကို မတွေ့ပါ။</translation> <translation id="8387361103813440603">သင့်တည်နေရာကို ကြည့်ရန် ခွင့်ပြုမထားပါ</translation> <translation id="8388770971141403598">ဒုတိယ ပရိုဖိုင်များကို ပံ့ပိုးမထားပါ</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index 0f0e4822..fdb2944 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -1007,6 +1007,7 @@ <translation id="1935303383381416800">Toestemming om je locatie te bekijken</translation> <translation id="1936931585862840749">Gebruik een cijfer om aan te geven hoeveel exemplaren er moeten worden afgedrukt (1-<ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Kan type containerarchitectuur <ph name="ARCHITECTURE_CONTAINER" /> niet importeren met dit apparaat. Dit apparaat is <ph name="ARCHITECTURE_DEVICE" />. Je kunt proberen deze container te herstellen op een ander apparaat of je kunt toegang krijgen tot bestanden in deze containerimage door ze te openen in de app Bestanden.</translation> +<translation id="1938240902511979591">Modus voor hoog contrast, vergrootglas en weergave-instellingen</translation> <translation id="1938320257168860255">Er is iets misgegaan. Zorg dat je telefoon in de buurt en ontgrendeld is en dat bluetooth en wifi aanstaan.</translation> <translation id="1938351510777341717">Externe opdracht</translation> <translation id="1940546824932169984">Verbonden apparaten</translation> @@ -1426,6 +1427,7 @@ <ph name="FOOTER_MESSAGE" /></translation> <translation id="2308798336967462263">De volgende toetsen worden niet ondersteund: Tab, Shift, Ctrl, Escape, Caps Lock en Volume</translation> <translation id="2309620859903500144">Deze site heeft geen toegang tot je bewegings- of lichtsensoren.</translation> +<translation id="2310923358723722542">Scherm en vergroting</translation> <translation id="2312219318583366810">Pagina-URL</translation> <translation id="2314165183524574721">Huidige zichtbaarheidsinstelling is 'Verborgen'</translation> <translation id="2314774579020744484">Gebruikte taal tijdens het vertalen van pagina's</translation> @@ -3209,6 +3211,7 @@ <translation id="402211067068791756">Hiermee wis je <ph name="TOTAL_USAGE" /> aan gegevens die zijn opgeslagen door de getoonde sites</translation> <translation id="4022426551683927403">Toevoegen &aan woordenboek</translation> <translation id="4025039777635956441">Geluid van geselecteerde site uitzetten</translation> +<translation id="4027958407426528157">Open websites in apps die zijn geïnstalleerd op je <ph name="DEVICE_TYPE" /></translation> <translation id="4028467762035011525">Invoermethoden toevoegen</translation> <translation id="4029556917477724407">Terug vanaf de pagina <ph name="PAGE_TITLE" /></translation> <translation id="4031179711345676612">Microfoon toegestaan</translation> @@ -4158,6 +4161,7 @@ <translation id="496446150016900060">Wifi-netwerken synchroniseren met je telefoon</translation> <translation id="4965808351167763748">Weet je zeker dat je dit apparaat wilt instellen voor Hangouts Meet?</translation> <translation id="4966972803217407697">Je bent incognito</translation> +<translation id="4967227914555989138">Notitie toevoegen</translation> <translation id="496742804571665842">E-simkaartprofielen uitzetten</translation> <translation id="4971412780836297815">Openen wanneer klaar</translation> <translation id="4971735654804503942">Snellere, proactieve beveiliging tegen gevaarlijke websites, downloads en extensies. Stuurt een waarschuwing over wachtwoordlekken. Vereist dat browsegegevens naar Google worden verstuurd.</translation> @@ -4405,6 +4409,7 @@ <translation id="5233231016133573565">Proces-ID</translation> <translation id="5233638681132016545">Nieuw tabblad</translation> <translation id="5233736638227740678">&Plakken</translation> +<translation id="5233794855520048159">Monogeluid, geluiden bij opstarten en ondertiteling</translation> <translation id="5234764350956374838">Sluiten</translation> <translation id="5235050375939235066">App verwijderen?</translation> <translation id="523505283826916779">Toegankelijkheidsinstellingen</translation> @@ -4509,6 +4514,7 @@ <translation id="5333896723098573627">Als je apps wilt verwijderen, ga je naar Instellingen > Apps > Google Play Store > Android-voorkeuren beheren > Apps of App-beheer. Tik op de app die je wilt verwijderen (je moet misschien naar rechts of links swipen om de app te vinden). Tik dan op Verwijderen of Uitzetten.</translation> <translation id="5334142896108694079">Script in cache</translation> <translation id="5336688142483283574">Deze pagina wordt ook verwijderd uit je geschiedenis en <ph name="SEARCH_ENGINE" />-activiteit.</translation> +<translation id="5336689872433667741">Cursor en touchpad</translation> <translation id="5337771866151525739">Geïnstalleerd door derden.</translation> <translation id="5337926771328966926">De huidige apparaatnaam is <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Je kunt privé browsen in een incognitovenster</translation> @@ -4519,6 +4525,7 @@ <translation id="5342091991439452114">Pincode moet minimaal <ph name="MINIMUM" /> cijfers bevatten</translation> <translation id="5344036115151554031">Linux herstellen</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (rechts)</translation> +<translation id="534449933710420173">Naamloze map</translation> <translation id="5345916423802287046">App starten als je inlogt</translation> <translation id="5350293332385664455">De Google Assistent uitzetten</translation> <translation id="535123479159372765">Tekst gekopieerd vanaf ander apparaat</translation> @@ -5139,6 +5146,7 @@ <translation id="5959471481388474538">Netwerk niet beschikbaar</translation> <translation id="595959584676692139">Laad de pagina opnieuw om deze extensie te gebruiken</translation> <translation id="5963453369025043595"><ph name="NUM_HANDLES" /> (<ph name="NUM_KILOBYTES_LIVE" /> piek)</translation> +<translation id="5963620791620013026">Plaktoetsen, schermtoetsenbord, dicteren, toegang via schakelaar en verbeterde markering</translation> <translation id="5964113968897211042">{COUNT,plural, =0{Alles openen in &nieuw venster}=1{Openen in &nieuw venster}other{Alles ({COUNT}) openen in &nieuw venster}}</translation> <translation id="5965661248935608907">Hiermee wordt ook gecontroleerd welke pagina wordt getoond wanneer je op de Homepage-knop klikt of vanuit de omnibox zoekt.</translation> <translation id="5968022600320704045">Geen zoekresultaten</translation> @@ -5948,6 +5956,7 @@ <translation id="6770602306803890733">Verbetert de beveiliging voor jou en alle andere internetgebruikers</translation> <translation id="6771503742377376720">Is een certificeringsinstantie</translation> <translation id="6775163072363532304">Beschikbare apparaten zie je hier.</translation> +<translation id="677646486571529447">Notitie toevoegen</translation> <translation id="6776729248872343918">Snel koppelen aanzetten</translation> <translation id="6777817260680419853">Omleiding geblokkeerd</translation> <translation id="6778737459546443941">Je ouder of voogd heeft dit nog niet goedgekeurd</translation> @@ -6096,6 +6105,7 @@ <translation id="6900654715912436255">Weet je zeker dat je deze zoekmachine wilt verwijderen?</translation> <translation id="6901024547292737736"><ph name="ACTUAL_CHAR_COUNT" />/<ph name="MAX_CHAR_COUNT" /></translation> <translation id="6902066522699286937">Stem om als voorbeeld te beluisteren</translation> +<translation id="6902219595840841518">Automatisch klikken, cursorgrootte, cursorkleur en cursor markeren</translation> <translation id="6902336033320348843">Sectie niet ondersteund: <ph name="ERROR_LINE" /></translation> <translation id="6902837902700739466">Apparaat koppelen aan domein</translation> <translation id="6903022061658753260">Je gegevens worden gesynchroniseerd voor alle Chrome-browsers waarin je synchronisatie voor dit account hebt aangezet. Ga naar de <ph name="LINK_BEGIN" />Chrome OS-instellingen<ph name="LINK_END" /> voor de synchronisatieopties van Chrome OS.</translation> @@ -6552,6 +6562,7 @@ <translation id="7377481913241237033">Koppelen met een code</translation> <translation id="7378611153938412599">Zwakke wachtwoorden zijn makkelijk te raden. Stel sterke wachtwoorden in. <ph name="BEGIN_LINK" />Meer beveiligingstips bekijken<ph name="END_LINK" /></translation> <translation id="73786666777299047">Chrome Web Store openen</translation> +<translation id="737938816678769289">Makkelijk verbinding maken en apparaten met Snel koppelen in de buurt instellen</translation> <translation id="7380459290951585794">Zorg dat je telefoon in de buurt en ontgrendeld is en dat bluetooth en wifi aanstaan.</translation> <translation id="7380622428988553498">Apparaatnaam bevat ongeldige tekens</translation> <translation id="7380768571499464492">Geüpdatet: <ph name="PRINTER_NAME" /></translation> @@ -6873,6 +6884,7 @@ <translation id="7681095912841365527">Site kan Bluetooth gebruiken</translation> <translation id="7681597159868843240">Sites gebruiken de bewegingssensoren van je apparaat meestal voor functies zoals virtual reality of fitnesstracking</translation> <translation id="7683373461016844951">Als je verder wilt gaan, klik je op 'OK' en vervolgens op 'Persoon toevoegen' om een nieuw profiel te maken voor je <ph name="DOMAIN" />-mailadres.</translation> +<translation id="7683834360226457448">Weergavetools voor slechtzienden</translation> <translation id="7684212569183643648">Geïnstalleerd door je beheerder</translation> <translation id="7684559058815332124">Captive portal-loginpagina bezoeken</translation> <translation id="7684718995427157417">Zet Android Debug Bridge (ADB) aan om je apps te maken en te testen. Let op: Met deze actie sta je toe dat Android-apps worden geïnstalleerd die niet door Google zijn geverifieerd. Als je deze functie wilt uitzetten, moeten de fabrieksinstellingen van je apparaat worden hersteld.</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index 53b1f82..a0fda93 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -354,6 +354,7 @@ <translation id="1340527397989195812">Sikkerhetskopiér medier fra enheten ved hjelp av Filer-appen.</translation> <translation id="1343865611738742294">Gi Linux-apper tilgang til USB-enheter. Linux husker ikke USB-enheter etter at de er fjernet.</translation> <translation id="1343920184519992513">Fortsett der du slapp, og åpne et spesifikt sett med sider</translation> +<translation id="1344377983938103876">Åpner <ph name="URL" /> …</translation> <translation id="134589511016534552">Mediefaner vises også i Åpne faner-delen</translation> <translation id="1346630054604077329">Bekreft og start på nytt</translation> <translation id="1346748346194534595">Høyre</translation> @@ -6961,6 +6962,7 @@ <translation id="7753735457098489144">Installasjonen mislyktes på grunn av mangel på lagringsplass. For å frigjøre plass, slett filer fra enhetslagringen.</translation> <translation id="7754347746598978109">Nettsteder som ikke har lov til å bruke JavaScript</translation> <translation id="7754704193130578113">Spør før nedlasting hvor hver fil skal lagres</translation> +<translation id="7755134875397410803">For å hjelpe deg med å fullføre oppgaver mottar Google nettadressene til og innholdet på nettsteder der du bruker assistenten, i tillegg til informasjon som du sender inn gjennom assistenten. Denne informasjonen kan bli lagret i Google-kontoen din. Du kan slå av assistenten i Chrome-innstillingene. <ph name="LEARN_MORE" /></translation> <translation id="7755287808199759310">Forelderen din kan oppheve blokkeringen for deg</translation> <translation id="7757592200364144203">Endre navnet på enheten</translation> <translation id="7757739382819740102">Kontakter i nærheten kan dele med deg. Godkjenning kreves.</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index 2b262d8e8..eef591e 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -355,6 +355,7 @@ <translation id="1340527397989195812">Files ਐਪ ਵਰਤਦੇ ਹੋਏ ਡੀਵਾਈਸ ਤੋਂ ਮੀਡੀਆ ਦਾ ਬੈਕਅੱਪ ਲਓ।</translation> <translation id="1343865611738742294">USB ਡੀਵਾਈਸਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਲਈ Linux ਐਪਾਂ ਨੂੰ ਇਜਾਜ਼ਤ ਦਿਓ। Linux ਕਿਸੇ USB ਡੀਵਾਈਸ ਨੂੰ ਹਟਾਉਣ ਤੋਂ ਬਾਅਦ ਉਸਨੂੰ ਯਾਦ ਨਹੀਂ ਰੱਖੇਗਾ।</translation> <translation id="1343920184519992513">ਉੱਥੋਂ ਜਾਰੀ ਰੱਖੋ ਜਿੱਥੇ ਤੁਸੀਂ ਛੱਡਿਆ ਸੀ ਅਤੇ ਪੰਨਿਆਂ ਦਾ ਖਾਸ ਸੈੱਟ ਖੋਲ੍ਹੋ</translation> +<translation id="1344377983938103876"><ph name="URL" /> ਨੂੰ ਖੋਲ੍ਹਿਆ ਜਾ ਰਿਹਾ ਹੈ...</translation> <translation id="134589511016534552">ਮੀਡੀਆ ਟੈਬਾਂ 'ਖੁੱਲ੍ਹੀਆਂ ਟੈਬਾਂ' ਸੈਕਸ਼ਨ ਵਿੱਚ ਵੀ ਦਿਖਾਈਆਂ ਗਈਆਂ ਹਨ</translation> <translation id="1346630054604077329">ਤਸਦੀਕ ਕਰਕੇ ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ</translation> <translation id="1346748346194534595">ਸੱਜਾ</translation> @@ -6974,6 +6975,7 @@ <translation id="7753735457098489144">ਸਟੋਰੇਜ ਜਗ੍ਹਾ ਘੱਟ ਹੋਣ ਕਾਰਨ ਸਥਾਪਤ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ। ਜਗ੍ਹਾ ਖਾਲੀ ਕਰਨ ਲਈ, ਡੀਵਾਈਸ ਸਟੋਰੇਜ ਵਿੱਚੋਂ ਫ਼ਾਈਲਾਂ ਮਿਟਾਓ।</translation> <translation id="7754347746598978109">JavaScript ਵਰਤਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ</translation> <translation id="7754704193130578113">ਪੁੱਛੋ ਕਿ ਹਰੇਕ ਫ਼ਾਈਲ ਨੂੰ ਡਾਊਨਲੋਡ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਕਿੱਥੇ ਰੱਖਿਅਤ ਕਰਨਾ ਹੈ</translation> +<translation id="7755134875397410803">ਕਾਰਜ ਪੂਰੇ ਕਰਨ ਵਿੱਚ ਤੁਹਾਡੀ ਮਦਦ ਕਰਨ ਲਈ, Google ਨੂੰ ਉਨ੍ਹਾਂ ਸਾਈਟਾਂ ਦੇ URL ਅਤੇ ਸਮੱਗਰੀਆਂ ਮਿਲਣਗੀਆਂ ਜਿਨ੍ਹਾਂ 'ਤੇ ਤੁਸੀਂ Assistant ਨੂੰ ਵਰਤਦੇ ਹੋ, ਨਾਲ ਹੀ ਤੁਹਾਡੇ ਵੱਲੋਂ Assistant ਰਾਹੀਂ ਸਪੁਰਦ ਕੀਤੀ ਜਾਣਕਾਰੀ ਵੀ ਮਿਲੇਗੀ। ਇਹ ਜਾਣਕਾਰੀ ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਸਟੋਰ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ। ਤੁਸੀਂ Chrome ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਜਾ ਕੇ Assistant ਨੂੰ ਬੰਦ ਕਰ ਸਕਦੇ ਹੋ। <ph name="LEARN_MORE" /></translation> <translation id="7755287808199759310">ਤੁਹਾਡਾ ਮਾਤਾ-ਪਿਤਾ ਇਸ ਨੂੰ ਤੁਹਾਡੇ ਲਈ ਅਣਬਲੌਕ ਕਰ ਸਕਦਾ ਹੈ</translation> <translation id="7757592200364144203">ਡੀਵਾਈਸ ਦਾ ਨਾਮ ਬਦਲੋ</translation> <translation id="7757739382819740102">ਨਜ਼ਦੀਕੀ ਸੰਪਰਕ ਤੁਹਾਡੇ ਨਾਲ ਸਾਂਝਾ ਕਰ ਸਕਦੇ ਹਨ। ਮਨਜ਼ੂਰੀ ਦੀ ਲੋੜ ਪਵੇਗੀ।</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index a93699f..df5dbd7 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -1005,6 +1005,7 @@ <translation id="1935303383381416800">Zezwolono na sprawdzanie lokalizacji</translation> <translation id="1936931585862840749">Wpisz wartość numeryczną, by określić liczbę kopii do wydrukowania (od 1 do <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Kontenera o architekturze <ph name="ARCHITECTURE_CONTAINER" /> nie można zaimportować na tym urządzeniu, które ma architekturę <ph name="ARCHITECTURE_DEVICE" />. Możesz przywrócić ten kontener na innym urządzeniu albo uzyskać dostęp do plików znajdujących się wewnątrz obrazu kontenera, otwierając go w aplikacji Pliki.</translation> +<translation id="1938240902511979591">Ustawienia trybu wysokiego kontrastu, lupy i wyświetlania</translation> <translation id="1938320257168860255">Coś poszło nie tak. Sprawdź, czy telefon jest wystarczająco blisko, jest odblokowany i ma włączone Bluetooth oraz Wi-Fi.</translation> <translation id="1938351510777341717">Polecenie zewnętrzne</translation> <translation id="1940546824932169984">Połączone urządzenia</translation> @@ -1413,6 +1414,7 @@ <ph name="FOOTER_MESSAGE" /></translation> <translation id="2308798336967462263">Te klawisze nie są obsługiwane: Tab, Shift, Control, Escape, Caps Lock i Głośność</translation> <translation id="2309620859903500144">Ta witryna ma zablokowany dostęp do czujników ruchu i oświetlenia.</translation> +<translation id="2310923358723722542">Wyświetlanie i powiększenie</translation> <translation id="2312219318583366810">URL strony</translation> <translation id="2314165183524574721">Bieżące ustawienie widoczności: ukryte</translation> <translation id="2314774579020744484">Język używany podczas tłumaczenia stron</translation> @@ -4148,6 +4150,7 @@ <translation id="496446150016900060">Zsynchronizuj sieci Wi-Fi z telefonem</translation> <translation id="4965808351167763748">Czy na pewno chcesz skonfigurować to urządzenie na potrzeby Hangouts Meet?</translation> <translation id="4966972803217407697">Korzystasz z trybu incognito</translation> +<translation id="4967227914555989138">Dodaj notatkę</translation> <translation id="496742804571665842">Wyłącz profile eSIM</translation> <translation id="4971412780836297815">Otwórz po zakończeniu</translation> <translation id="4971735654804503942">Szybsza proaktywna ochrona przed niebezpiecznymi stronami, pobieranymi plikami i rozszerzeniami. Będziesz otrzymywać ostrzeżenia o kradzieżach haseł. Wymaga wysyłania danych przeglądania do Google.</translation> @@ -4395,6 +4398,7 @@ <translation id="5233231016133573565">ID procesu</translation> <translation id="5233638681132016545">Nowa karta</translation> <translation id="5233736638227740678">&Wklej</translation> +<translation id="5233794855520048159">Dźwięk mono, dźwięki przy uruchamianiu i napisy</translation> <translation id="5234764350956374838">Zamknij</translation> <translation id="5235050375939235066">Odinstalować aplikację?</translation> <translation id="523505283826916779">Ustawienia ułatwień dostępu</translation> @@ -4499,6 +4503,7 @@ <translation id="5333896723098573627">Aby usunąć aplikacje, kliknij Ustawienia > Sklep Google Play > Zarządzaj ustawieniami Androida > Aplikacje lub Menedżer aplikacji. Następnie kliknij aplikację, którą chcesz odinstalować (jeśli to konieczne, przesuń palcem w prawo lub w lewo, aby ją znaleźć), a potem kliknij Odinstaluj lub Wyłącz.</translation> <translation id="5334142896108694079">Pamięć podręczna skryptów</translation> <translation id="5336688142483283574">Ta strona zostanie też usunięta z Twojej historii i aktywności w <ph name="SEARCH_ENGINE" />.</translation> +<translation id="5336689872433667741">Kursor i touchpad</translation> <translation id="5337771866151525739">Zainstalowane przez inną firmę.</translation> <translation id="5337926771328966926">Obecna nazwa urządzenia to <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Możesz przeglądać prywatnie w oknie incognito</translation> @@ -4509,6 +4514,7 @@ <translation id="5342091991439452114">Kod PIN musi się składać co najmniej z <ph name="MINIMUM" /> cyfr</translation> <translation id="5344036115151554031">Przywracanie Linuksa</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (prawa)</translation> +<translation id="534449933710420173">Folder bez nazwy</translation> <translation id="5345916423802287046">Uruchom aplikację po zalogowaniu</translation> <translation id="5350293332385664455">Wyłącz Asystenta Google</translation> <translation id="535123479159372765">Tekst skopiowany z innego urządzenia</translation> @@ -5131,6 +5137,7 @@ <translation id="5959471481388474538">Sieć niedostępna</translation> <translation id="595959584676692139">Aby użyć tego rozszerzenia, załaduj ponownie stronę</translation> <translation id="5963453369025043595"><ph name="NUM_HANDLES" /> (<ph name="NUM_KILOBYTES_LIVE" /> w szczycie)</translation> +<translation id="5963620791620013026">Klawisze trwałe, klawiatura ekranowa, dyktowanie, Switch Access i ulepszone podświetlenie</translation> <translation id="5964113968897211042">{COUNT,plural, =0{Otwórz wszystkie w &nowym oknie}=1{Otwórz w &nowym oknie}few{Otwórz wszystkie ({COUNT}) w &nowym oknie}many{Otwórz wszystkie ({COUNT}) w &nowym oknie}other{Otwórz wszystkie ({COUNT}) w &nowym oknie}}</translation> <translation id="5965661248935608907">Kontroluje także to, jaka strona wyświetla się po kliknięciu przycisku strony głównej lub wyszukiwaniu w omniboksie.</translation> <translation id="5968022600320704045">Brak wyników wyszukiwania</translation> @@ -5945,6 +5952,7 @@ <translation id="6770602306803890733">Zwiększa bezpieczeństwo Twoje i pozostałych użytkowników internetu</translation> <translation id="6771503742377376720">Jest urzędem certyfikacji</translation> <translation id="6775163072363532304">Tu pojawią się dostępne urządzenia.</translation> +<translation id="677646486571529447">Dodaj notatkę</translation> <translation id="6776729248872343918">Włącz Szybkie parowanie</translation> <translation id="6777817260680419853">Przekierowanie zostało zablokowane</translation> <translation id="6778737459546443941">Twój rodzic jeszcze na to nie zezwolił</translation> @@ -6093,6 +6101,7 @@ <translation id="6900654715912436255">Czy na pewno chcesz usunąć tę wyszukiwarkę?</translation> <translation id="6901024547292737736"><ph name="ACTUAL_CHAR_COUNT" />/<ph name="MAX_CHAR_COUNT" /></translation> <translation id="6902066522699286937">Głos do sprawdzenia mowy</translation> +<translation id="6902219595840841518">Automatyczne kliknięcie oraz rozmiar, kolor i wyróżnienie kursora</translation> <translation id="6902336033320348843">Nieobsługiwana sekcja: <ph name="ERROR_LINE" /></translation> <translation id="6902837902700739466">Dołącz urządzenie do domeny</translation> <translation id="6903022061658753260">Twoje dane zostaną zsynchronizowane w przeglądarkach Chrome na wszystkich urządzeniach, na których masz włączoną synchronizację dla tego konta. Opcje synchronizacji Chrome OS znajdziesz w <ph name="LINK_BEGIN" />jego ustawieniach<ph name="LINK_END" />.</translation> @@ -6871,6 +6880,7 @@ <translation id="7681095912841365527">Strona może używać Bluetootha</translation> <translation id="7681597159868843240">Witryny zwykle używają czujników ruchu urządzenia, aby obsługiwać funkcje takie jak rzeczywistość wirtualna czy monitorowanie aktywności</translation> <translation id="7683373461016844951">Aby kontynuować, kliknij OK, a potem kliknij Dodaj osobę, by utworzyć nowy profil dla swojego adresu e-mail w domenie <ph name="DOMAIN" />.</translation> +<translation id="7683834360226457448">Narzędzia do wyświetlania dla niedowidzących</translation> <translation id="7684212569183643648">Zainstalowane przez administratora</translation> <translation id="7684559058815332124">Wejdź na stronę logowania na portalu przechwytującym</translation> <translation id="7684718995427157417">Aby utworzyć i przetestować swoje aplikacje, włącz Android Debug Bridge (ADB). Pamiętaj, że to działanie wiąże się z zezwoleniem na instalowanie aplikacji na Androida, które nie zostały zweryfikowane przez Google, a do wyłączenia tej funkcji konieczne jest przywrócenie ustawień fabrycznych.</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index bdecd00f3..0e2970b 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -3934,7 +3934,7 @@ <translation id="4742334355511750246">Sem autorização para mostrar imagens</translation> <translation id="4742970037960872810">Remover realce</translation> <translation id="4743260470722568160"><ph name="BEGIN_LINK" />Saiba como atualizar aplicações<ph name="END_LINK" /></translation> -<translation id="4744981231093950366">{NUM_TABS,plural, =1{Reativar o som do site}other{Reativar o som dos sites}}</translation> +<translation id="4744981231093950366">{NUM_TABS,plural, =1{Reativar som do site}other{Reativar som dos sites}}</translation> <translation id="474609389162964566">Aceda ao Assistente com "OK Google"</translation> <translation id="4746351372139058112">Mensagens</translation> <translation id="4748783296226936791">Normalmente, os sites estabelecem ligação a dispositivos HID para funcionalidades que utilizam teclados, comandos de jogos e outros dispositivos pouco comuns</translation> @@ -4169,7 +4169,7 @@ <translation id="4972129977812092092">Editar impressora</translation> <translation id="4972164225939028131">Palavra-passe incorreta.</translation> <translation id="4972737347717125191">Os sites podem solicitar a utilização de dados e dispositivos de realidade virtual</translation> -<translation id="4973325300212422370">{NUM_TABS,plural, =1{Desativar o som do site}other{Desativar o som dos sites}}</translation> +<translation id="4973325300212422370">{NUM_TABS,plural, =1{Desativar som do site}other{Desativar som dos sites}}</translation> <translation id="497403230787583386">As verificações de segurança estão concluídas. O documento vai ser impresso.</translation> <translation id="4977882548591990850"><ph name="CHARACTER_COUNT" />/<ph name="CHARACTER_LIMIT" /></translation> <translation id="4977942889532008999">Confirmar acesso</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 8e11cdc..44b12fa 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -3211,6 +3211,7 @@ <translation id="402211067068791756">Будут удалены сохраненные данные указанных сайтов (<ph name="TOTAL_USAGE" />).</translation> <translation id="4022426551683927403">Добавить в словарь</translation> <translation id="4025039777635956441">Отключить звук на выбранном сайте</translation> +<translation id="4027958407426528157">Открывать сайты в приложениях, установленных на устройстве <ph name="DEVICE_TYPE" /></translation> <translation id="4028467762035011525">Добавить способы ввода</translation> <translation id="4029556917477724407"><ph name="PAGE_TITLE" />: перейти на предыдущую страницу</translation> <translation id="4031179711345676612">Доступ к микрофону разрешен</translation> @@ -6566,6 +6567,7 @@ <translation id="7377481913241237033">Подключиться с помощью кода</translation> <translation id="7378611153938412599">Простые пароли легко подобрать. Устанавливайте надежные пароли. Больше советов по безопасности можно найти <ph name="BEGIN_LINK" />здесь<ph name="END_LINK" />.</translation> <translation id="73786666777299047">Открыть Интернет-магазин Chrome</translation> +<translation id="737938816678769289">С легкостью подключайтесь к устройствам поблизости и настраивайте Быстрое подключение</translation> <translation id="7380459290951585794">Убедитесь, что телефон находится рядом, он разблокирован и на нем включены Bluetooth и Wi-Fi.</translation> <translation id="7380622428988553498">Имя устройства содержит недопустимые символы.</translation> <translation id="7380768571499464492">Обновлено: <ph name="PRINTER_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb index 55c46142..ced1b0ce 100644 --- a/chrome/app/resources/generated_resources_si.xtb +++ b/chrome/app/resources/generated_resources_si.xtb
@@ -4171,7 +4171,7 @@ <translation id="4972129977812092092">මුද්රකය සංස්කරණය</translation> <translation id="4972164225939028131">වැරදි මුරපදයකි</translation> <translation id="4972737347717125191">අඩවි අතථ්ය යථාර්ථ උපාංග සහ දත්ත භාවිත කිරීමට ඉල්ලිය හැකිය</translation> -<translation id="4973325300212422370">{NUM_TABS,plural, =1{වෙබ් අඩවිය නිහඬ කරන්න}one{වෙබ් අඩවි නිහඬ කරන්න}other{වෙබ් අඩවි නිහඬ කරන්න}}</translation> +<translation id="4973325300212422370">{NUM_TABS,plural, =1{අඩවිය නිහඬ කරන්න}one{අඩවි නිහඬ කරන්න}other{අඩවිය නිහඬ කරන්න}}</translation> <translation id="497403230787583386">ආරක්ෂක පරීක්ෂා සිදු කර ඇත. ඔබගේ ලේඛනය මුද්රණය කරනු ඇත.</translation> <translation id="4977882548591990850"><ph name="CHARACTER_COUNT" />/<ph name="CHARACTER_LIMIT" /></translation> <translation id="4977942889532008999">පිවිසුම තහවුරු කරන්න</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index dd747c32..9daebd42 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -1270,6 +1270,7 @@ <translation id="2180620921879609685">Blokovať obsah na akejkoľvek stránke</translation> <translation id="2182058453334755893">Skopírované do schránky</translation> <translation id="2184515124301515068">Povoľte Chromu vyberať, kedy môžu weby prehrať zvuk (odporúčané)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Stránka je zdieľaná z iného zariadenia</translation> <translation id="2187675480456493911">Synchronizované s ostatnými zariadeniami vo vašom účte. Nastavenia upravené ostatnými používateľmi nebudú synchronizované. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Chyba importovania certifikátu servera</translation> @@ -3210,6 +3211,7 @@ <translation id="402211067068791756">Týmto vymažete <ph name="TOTAL_USAGE" /> dát uložených zobrazenými webmi</translation> <translation id="4022426551683927403">Prid&ať do slovníka</translation> <translation id="4025039777635956441">Ignorovať vybraný web</translation> +<translation id="4027958407426528157">Otvárajte weby v aplikáciách nainštalovaných v zariadení <ph name="DEVICE_TYPE" /></translation> <translation id="4028467762035011525">Pridať metódy vstupu</translation> <translation id="4029556917477724407">Späť zo stránky <ph name="PAGE_TITLE" /></translation> <translation id="4031179711345676612">Mikrofón je povolený</translation> @@ -6563,6 +6565,7 @@ <translation id="7377481913241237033">Pripojiť pomocou kódu</translation> <translation id="7378611153938412599">Slabé heslá sa dajú ľahko uhádnuť. Vždy sa snažte vytvárať silné heslá. <ph name="BEGIN_LINK" />Ďalšie tipy na zabezpečenie<ph name="END_LINK" /></translation> <translation id="73786666777299047">Otvoriť Internetový obchod Chrome</translation> +<translation id="737938816678769289">Ľahko sa pripojte a nastavte zariadenia s rýchlym párovaním v okolí</translation> <translation id="7380459290951585794">Telefón majte nablízku, odomknutý a so zapnutým rozhraním Bluetooth aj pripojením Wi‑Fi</translation> <translation id="7380622428988553498">Názov zariadenia obsahuje neplatné znaky</translation> <translation id="7380768571499464492">Tlačiareň <ph name="PRINTER_NAME" /> bola aktualizovaná</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb index 1390449..51eb9470 100644 --- a/chrome/app/resources/generated_resources_sq.xtb +++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -1265,6 +1265,7 @@ <translation id="2180620921879609685">Blloko përmbajtjen në çdo faqe</translation> <translation id="2182058453334755893">Kopjuar te kujtesa e fragmenteve</translation> <translation id="2184515124301515068">Lejo që Chrome të zgjedhë se cilat sajte mund të luajnë tinguj (rekomandohet)</translation> +<translation id="2186206192313702726">Lentja e Google</translation> <translation id="2186711480981247270">Faqja është ndarë nga një pajisje tjetër</translation> <translation id="2187675480456493911">Sinkronizuar me pajisjet e tjera në llogarinë tënde. Cilësimet e modifikuara nga përdoruesit e tjerë nuk do të sinkronizohen. <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Gabim në importimin e certifikatës së serverit</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index 03bf318..4553d78 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -1006,6 +1006,7 @@ <translation id="1935303383381416800">Dozvoljeno im je da vide vašu lokaciju</translation> <translation id="1936931585862840749">Navedite broj primeraka za štampanje (1–<ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Ne možete da uvezete tip arhitekture kontejnera <ph name="ARCHITECTURE_CONTAINER" /> pomoću ovog uređaja, koji je <ph name="ARCHITECTURE_DEVICE" />. Možete da probate da vratite ovaj kontejner na drugi uređaj ili da otvorite aplikaciju Datoteke da biste pristupili datotekama u slici ovog kontejnera.</translation> +<translation id="1938240902511979591">Podešavanja visokog kontrasta, lupe i prikaza</translation> <translation id="1938320257168860255">Došlo je do greške. Uverite se da je telefon u blizini, da je otključan i da su Bluetooth i WiFi uključeni.</translation> <translation id="1938351510777341717">Spoljna komanda</translation> <translation id="1940546824932169984">Povezani uređaji</translation> @@ -1425,6 +1426,7 @@ <ph name="FOOTER_MESSAGE" /></translation> <translation id="2308798336967462263">Sledeći tasteri nisu podržani: Tab, Shift, Control, Escape, Caps lock, tasteri za jačinu zvuka</translation> <translation id="2309620859903500144">Ovom sajtu je zabranjen pristup senzorima za pokret ili svetlo.</translation> +<translation id="2310923358723722542">Prikaz i uvećanje</translation> <translation id="2312219318583366810">URL stranice</translation> <translation id="2314165183524574721">Aktuelno podešavanje vidljivosti je: Skriveno</translation> <translation id="2314774579020744484">Jezik koji se koristi za prevođenje stranica</translation> @@ -4161,6 +4163,7 @@ <translation id="496446150016900060">Sinhronizujte WiFi mreže pomoću telefona</translation> <translation id="4965808351167763748">Želite li stvarno da podesite ovaj uređaj za korišćenje Hangouts Meet-a?</translation> <translation id="4966972803217407697">Koristite režim bez arhiviranja</translation> +<translation id="4967227914555989138">Dodaj belešku</translation> <translation id="496742804571665842">Onemogućite eSIM profile</translation> <translation id="4971412780836297815">Otvori kada bude dovršeno</translation> <translation id="4971735654804503942">Brža proaktivna zaštita od opasnih veb-sajtova, preuzimanja i dodataka. Upozorava vas o otkrivanju lozinki. Zahteva slanje podataka pregledanja Google-u.</translation> @@ -4408,6 +4411,7 @@ <translation id="5233231016133573565">ID procesa</translation> <translation id="5233638681132016545">Nova kartica</translation> <translation id="5233736638227740678">&Nalepi</translation> +<translation id="5233794855520048159">Mono zvuk, zvukovi pri pokretanju i titlovi</translation> <translation id="5234764350956374838">Odbaci</translation> <translation id="5235050375939235066">Želite li da deinstalirate aplikaciju?</translation> <translation id="523505283826916779">Podešavanja pristupačnosti</translation> @@ -4512,6 +4516,7 @@ <translation id="5333896723098573627">Da biste uklonili aplikacije, idite u odeljak Podešavanja > Aplikacije > Google Play prodavnica > Upravljajte Android podešavanjima > Aplikacije ili Menadžer aplikacija. Zatim dodirnite aplikaciju koju želite da deinstalirate (možda ćete morati da prevučete nadesno ili nalevo da biste pronašli aplikaciju). Onda dodirnite Deinstaliraj ili Onemogući.</translation> <translation id="5334142896108694079">Keš skripte</translation> <translation id="5336688142483283574">Ova stranica će takođe biti uklonjena iz istorije i iz <ph name="SEARCH_ENGINE" /> aktivnosti.</translation> +<translation id="5336689872433667741">Kursor i tačped</translation> <translation id="5337771866151525739">Instalirala treća strana.</translation> <translation id="5337926771328966926">Aktuelan naziv uređaja je <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Možete da pregledate privatno u prozoru bez arhiviranja</translation> @@ -4522,6 +4527,7 @@ <translation id="5342091991439452114">PIN mora da ima najmanje <ph name="MINIMUM" /> cifre(ara)</translation> <translation id="5344036115151554031">Vraća se Linux</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (desna)</translation> +<translation id="534449933710420173">Neimenovani folder</translation> <translation id="5345916423802287046">Pokreni aplikaciju kada se prijavim</translation> <translation id="5350293332385664455">Isključite Google pomoćnik</translation> <translation id="535123479159372765">Tekst je kopiran sa nekog drugog uređaja</translation> @@ -5145,6 +5151,7 @@ <translation id="5959471481388474538">Mreža nije dostupna</translation> <translation id="595959584676692139">Ponovo učitajte ovu stranicu da biste koristili ovaj dodatak</translation> <translation id="5963453369025043595"><ph name="NUM_HANDLES" /> (najviše <ph name="NUM_KILOBYTES_LIVE" />)</translation> +<translation id="5963620791620013026">Lepljivi tasteri, tastatura na ekranu, diktiranje, pristup pomoću prekidača i poboljšano isticanje</translation> <translation id="5964113968897211042">{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="5965661248935608907">Kontroliše i stranicu koja se prikazuje kada kliknete na dugme Početak ili pretražujete iz omniboksa.</translation> <translation id="5968022600320704045">Nema rezultata pretrage</translation> @@ -5959,6 +5966,7 @@ <translation id="6770602306803890733">Poboljšava bezbednost za vas i druge na vebu</translation> <translation id="6771503742377376720">Jeste autoritet za izdavanje sertifikata</translation> <translation id="6775163072363532304">Dostupni uređaji se prikazuju ovde.</translation> +<translation id="677646486571529447">Dodaj belešku</translation> <translation id="6776729248872343918">Omogući Brzo uparivanje</translation> <translation id="6777817260680419853">Preusmeravanje je blokirano</translation> <translation id="6778737459546443941">Roditelj ga još uvek nije odobrio</translation> @@ -6107,6 +6115,7 @@ <translation id="6900654715912436255">Želite li stvarno da izbrišete ovaj pretraživač?</translation> <translation id="6901024547292737736"><ph name="ACTUAL_CHAR_COUNT" />/<ph name="MAX_CHAR_COUNT" /></translation> <translation id="6902066522699286937">Glas za pregled</translation> +<translation id="6902219595840841518">Automatski klik, veličina kursora, boja kursora i isticanje kursora</translation> <translation id="6902336033320348843">Odeljak nije podržan: <ph name="ERROR_LINE" /></translation> <translation id="6902837902700739466">Pridružite uređaj domenu</translation> <translation id="6903022061658753260">Podaci će se sinhronizovati u svim Chrome pregledačima u kojima ste uključili sinhronizaciju za ovaj nalog. Opcije sinhronizovanja Chrome OS-a potražite u <ph name="LINK_BEGIN" />podešavanjima Chrome OS-a<ph name="LINK_END" />.</translation> @@ -6885,6 +6894,7 @@ <translation id="7681095912841365527">Sajt može da koristi Bluetooth</translation> <translation id="7681597159868843240">Sajtovi obično koriste senzore pokreta uređaja za potrebe funkcija poput virtuelne realnosti ili praćenja fitnesa</translation> <translation id="7683373461016844951">Da biste nastavili, kliknite na Potvrdi, pa na Dodaj osobu da biste otvorili novi profil za imejl adresu za <ph name="DOMAIN" />.</translation> +<translation id="7683834360226457448">Alatke za prikaz za slabovide</translation> <translation id="7684212569183643648">Instalirao je administrator</translation> <translation id="7684559058815332124">Poseti stranicu za prijavljivanje ulaznog portala</translation> <translation id="7684718995427157417">Da biste pravili i testirali aplikacije, omogućite Android Debug Bridge (ADB). Imajte na umu da ova radnja omogućava instaliranje Android aplikacija koje Google nije verifikovao i zahteva resetovanje na fabrička podešavanja da bi se onemogućila.</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index 7444814..295c0a24 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -1006,6 +1006,7 @@ <translation id="1935303383381416800">Дозвољено им је да виде вашу локацију</translation> <translation id="1936931585862840749">Наведите број примерака за штампање (1–<ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Не можете да увезете тип архитектуре контејнера <ph name="ARCHITECTURE_CONTAINER" /> помоћу овог уређаја, који је <ph name="ARCHITECTURE_DEVICE" />. Можете да пробате да вратите овај контејнер на други уређај или да отворите апликацију Датотеке да бисте приступили датотекама у слици овог контејнера.</translation> +<translation id="1938240902511979591">Подешавања високог контраста, лупе и приказа</translation> <translation id="1938320257168860255">Дошло је до грешке. Уверите се да је телефон у близини, да је откључан и да су Bluetooth и WiFi укључени.</translation> <translation id="1938351510777341717">Спољна команда</translation> <translation id="1940546824932169984">Повезани уређаји</translation> @@ -1425,6 +1426,7 @@ <ph name="FOOTER_MESSAGE" /></translation> <translation id="2308798336967462263">Следећи тастери нису подржани: Tab, Shift, Control, Escape, Caps lock, тастери за јачину звука</translation> <translation id="2309620859903500144">Овом сајту је забрањен приступ сензорима за покрет или светло.</translation> +<translation id="2310923358723722542">Приказ и увећање</translation> <translation id="2312219318583366810">URL странице</translation> <translation id="2314165183524574721">Актуелно подешавање видљивости је: Скривено</translation> <translation id="2314774579020744484">Језик који се користи за превођење страница</translation> @@ -4161,6 +4163,7 @@ <translation id="496446150016900060">Синхронизујте WiFi мреже помоћу телефона</translation> <translation id="4965808351167763748">Желите ли стварно да подесите овај уређај за коришћење Hangouts Meet-а?</translation> <translation id="4966972803217407697">Користите режим без архивирања</translation> +<translation id="4967227914555989138">Додај белешку</translation> <translation id="496742804571665842">Онемогућите eSIM профиле</translation> <translation id="4971412780836297815">Отвори када буде довршено</translation> <translation id="4971735654804503942">Бржа проактивна заштита од опасних веб-сајтова, преузимања и додатака. Упозорава вас о откривању лозинки. Захтева слање података прегледања Google-у.</translation> @@ -4408,6 +4411,7 @@ <translation id="5233231016133573565">ИД процеса</translation> <translation id="5233638681132016545">Нова картица</translation> <translation id="5233736638227740678">&Налепи</translation> +<translation id="5233794855520048159">Моно звук, звукови при покретању и титлови</translation> <translation id="5234764350956374838">Одбаци</translation> <translation id="5235050375939235066">Желите ли да деинсталирате апликацију?</translation> <translation id="523505283826916779">Подешавања приступачности</translation> @@ -4512,6 +4516,7 @@ <translation id="5333896723098573627">Да бисте уклонили апликације, идите у одељак Подешавања > Апликације > Google Play продавница > Управљајте Android подешавањима > Апликације или Менаџер апликација. Затим додирните апликацију коју желите да деинсталирате (можда ћете морати да превучете надесно или налево да бисте пронашли апликацију). Онда додирните Деинсталирај или Онемогући.</translation> <translation id="5334142896108694079">Кеш скрипте</translation> <translation id="5336688142483283574">Ова страница ће такође бити уклоњена из историје и из <ph name="SEARCH_ENGINE" /> активности.</translation> +<translation id="5336689872433667741">Курсор и тачпед</translation> <translation id="5337771866151525739">Инсталирала трећа страна.</translation> <translation id="5337926771328966926">Актуелан назив уређаја је <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Можете да прегледате приватно у прозору без архивирања</translation> @@ -4522,6 +4527,7 @@ <translation id="5342091991439452114">PIN мора да има најмање <ph name="MINIMUM" /> цифре(ара)</translation> <translation id="5344036115151554031">Враћа се Linux</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (десна)</translation> +<translation id="534449933710420173">Неименовани фолдер</translation> <translation id="5345916423802287046">Покрени апликацију када се пријавим</translation> <translation id="5350293332385664455">Искључите Google помоћник</translation> <translation id="535123479159372765">Текст је копиран са неког другог уређаја</translation> @@ -5145,6 +5151,7 @@ <translation id="5959471481388474538">Мрежа није доступна</translation> <translation id="595959584676692139">Поново учитајте ову страницу да бисте користили овај додатак</translation> <translation id="5963453369025043595"><ph name="NUM_HANDLES" /> (највише <ph name="NUM_KILOBYTES_LIVE" />)</translation> +<translation id="5963620791620013026">Лепљиви тастери, тастатура на екрану, диктирање, приступ помоћу прекидача и побољшано истицање</translation> <translation id="5964113968897211042">{COUNT,plural, =0{Отвори све у &новом прозору}=1{Отвори у &новом прозору}one{Отвори све ({COUNT}) у &новом прозору}few{Отвори све ({COUNT}) у &новом прозору}other{Отвори све ({COUNT}) у &новом прозору}}</translation> <translation id="5965661248935608907">Контролише и страницу која се приказује када кликнете на дугме Почетак или претражујете из омнибокса.</translation> <translation id="5968022600320704045">Нема резултата претраге</translation> @@ -5959,6 +5966,7 @@ <translation id="6770602306803890733">Побољшава безбедност за вас и друге на вебу</translation> <translation id="6771503742377376720">Јесте ауторитет за издавање сертификата</translation> <translation id="6775163072363532304">Доступни уређаји се приказују овде.</translation> +<translation id="677646486571529447">Додај белешку</translation> <translation id="6776729248872343918">Омогући Брзо упаривање</translation> <translation id="6777817260680419853">Преусмеравање је блокирано</translation> <translation id="6778737459546443941">Родитељ га још увек није одобрио</translation> @@ -6107,6 +6115,7 @@ <translation id="6900654715912436255">Желите ли стварно да избришете овај претраживач?</translation> <translation id="6901024547292737736"><ph name="ACTUAL_CHAR_COUNT" />/<ph name="MAX_CHAR_COUNT" /></translation> <translation id="6902066522699286937">Глас за преглед</translation> +<translation id="6902219595840841518">Аутоматски клик, величина курсора, боја курсора и истицање курсора</translation> <translation id="6902336033320348843">Одељак није подржан: <ph name="ERROR_LINE" /></translation> <translation id="6902837902700739466">Придружите уређај домену</translation> <translation id="6903022061658753260">Подаци ће се синхронизовати у свим Chrome прегледачима у којима сте укључили синхронизацију за овај налог. Опције синхронизовања Chrome ОС-а потражите у <ph name="LINK_BEGIN" />подешавањима Chrome OS-а<ph name="LINK_END" />.</translation> @@ -6885,6 +6894,7 @@ <translation id="7681095912841365527">Сајт може да користи Bluetooth</translation> <translation id="7681597159868843240">Сајтови обично користе сензоре покрета уређаја за потребе функција попут виртуелне реалности или праћења фитнеса</translation> <translation id="7683373461016844951">Да бисте наставили, кликните на Потврди, па на Додај особу да бисте отворили нови профил за имејл адресу за <ph name="DOMAIN" />.</translation> +<translation id="7683834360226457448">Алатке за приказ за слабовиде</translation> <translation id="7684212569183643648">Инсталирао је администратор</translation> <translation id="7684559058815332124">Посети страницу за пријављивање улазног портала</translation> <translation id="7684718995427157417">Да бисте правили и тестирали апликације, омогућите Android Debug Bridge (ADB). Имајте на уму да ова радња омогућава инсталирање Android апликација које Google није верификовао и захтева ресетовање на фабричка подешавања да би се онемогућила.</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index d1a2770..8af903471 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -354,6 +354,7 @@ <translation id="1340527397989195812">Säkerhetskopiera media från enheten med appen Filer.</translation> <translation id="1343865611738742294">Ge Linux-appar åtkomstbehörighet till USB-enheter. När en USB-enhet tas bort sparas ingen information om den i Linux.</translation> <translation id="1343920184519992513">Fortsätt där du slutade och öppna en viss uppsättning sidor</translation> +<translation id="1344377983938103876">Öppnar <ph name="URL" /> …</translation> <translation id="134589511016534552">Mediaflikar visas också i Öppna flikar</translation> <translation id="1346630054604077329">Bekräfta och starta om</translation> <translation id="1346748346194534595">Höger</translation> @@ -1280,6 +1281,7 @@ <translation id="2180620921879609685">Blockera innehåll på alla sidor</translation> <translation id="2182058453334755893">Kopierat till urklipp</translation> <translation id="2184515124301515068">Låt Chrome välja när webbplatser kan spela upp ljud (rekommenderas)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Sidan delas från en annan enhet</translation> <translation id="2187675480456493911">Synkroniseras med andra enheter i kontot. Inställningar som andra användare har ändrat synkroniseras inte. <ph name="LINK_BEGIN" />Läs mer<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Fel vid import av servercertifikat</translation> @@ -6970,6 +6972,7 @@ <translation id="7753735457098489144">Installationen misslyckades eftersom det inte finns tillräckligt med lagringsutrymme. Frigör utrymme genom att ta bort filer från lagringsutrymmet på enheten.</translation> <translation id="7754347746598978109">Får inte använda JavaScript</translation> <translation id="7754704193130578113">Fråga var filerna ska sparas före nedladdning</translation> +<translation id="7755134875397410803">Innehållet på en webbplats där du använder Google Assistent, dess webbadress samt information som du skickar via assistenten överförs till Google så att du kan få uppgifterna utförda. Informationen kan sparas i Google-kontot. Du kan inaktivera Google Assistent i Chrome-inställningarna. <ph name="LEARN_MORE" /></translation> <translation id="7755287808199759310">En förälder kan ta bort blockeringen</translation> <translation id="7757592200364144203">Byt namn på enheten</translation> <translation id="7757739382819740102">Kontakter i närheten kan dela filer med dig. Det krävs ett godkännande.</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 2a415b5..8098ecab 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -354,6 +354,7 @@ <translation id="1340527397989195812">Files ஆப்ஸைப் பயன்படுத்தி சாதனத்திலிருந்து மீடியாவைக் காப்புப்பிரதி எடுக்கவும்.</translation> <translation id="1343865611738742294">USB சாதனங்களை அணுகுவதற்கான அனுமதியை Linux ஆப்ஸிற்கு வழங்கும். அகற்றப்பட்ட USB சாதனத்தை Linux நினைவில் வைத்திருக்காது.</translation> <translation id="1343920184519992513">விட்ட இடத்தில் தொடங்கி, குறிப்பிட்ட பக்கங்களின் தொகுப்பைத் திற</translation> +<translation id="1344377983938103876"><ph name="URL" /> தளத்தைத் திறக்கிறது...</translation> <translation id="134589511016534552">‘திறந்துள்ள பக்கங்கள்’ பிரிவிலும் மீடியா பக்கங்கள் காட்டப்படும்</translation> <translation id="1346630054604077329">உறுதிசெய்து மீண்டும் தொடங்கு</translation> <translation id="1346748346194534595">வலது</translation> @@ -1280,6 +1281,7 @@ <translation id="2180620921879609685">பக்கத்தின் உள்ளடக்கம் தடுக்கப்படும்</translation> <translation id="2182058453334755893">உங்கள் கிளிப்போர்டுக்கு நகலெடுக்கப்பட்டது</translation> <translation id="2184515124301515068">தளங்கள் எப்போது ஒலியை இயக்கலாம் என்பதை Chrome தேர்வு செய்ய அனுமதிக்கவும் (பரிந்துரைக்கப்படுவது)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">மற்றொரு சாதனத்தில் இருந்து பகிரப்பட்ட பக்கம்</translation> <translation id="2187675480456493911">உங்கள் கணக்கில் உள்ள பிற சாதனங்களுடன் ஒத்திசைக்கப்பட்டது. பிற பயனர்கள் மாற்றியமைக்கும் அமைப்புகள் ஒத்திசைக்கப்படாது. <ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation> <translation id="2187895286714876935">சேவையக சான்றிதழ் இறக்குமதி பிழை</translation> @@ -6971,6 +6973,7 @@ <translation id="7753735457098489144">போதுமான சேமிப்பகம் இல்லாததால் நிறுவ முடியவில்லை. இடத்தைக் காலியாக்க சாதனச் சேமிப்பகத்தில் இருந்து கோப்புகளை நீக்கவும்.</translation> <translation id="7754347746598978109">Javascriptடைப் பயன்படுத்த அனுமதி இல்லாத தளங்கள்</translation> <translation id="7754704193130578113">பதிவிறக்கும் முன் ஒவ்வொரு ஃபைலையும் எங்கு சேமிக்க வேண்டும் எனக் கேட்கவும்</translation> +<translation id="7755134875397410803">பணிகளை நிறைவுசெய்ய உங்களுக்கு உதவும் வகையில் நீங்கள் Assistantடைப் பயன்படுத்தும் தளங்களின் URLகளையும் உள்ளடக்கங்களையும், Assistant மூலம் சமர்ப்பிக்கும் தகவல்களையும் Google பெறும். இந்தத் தகவல்கள் உங்கள் Google கணக்கில் சேமிக்கப்படலாம். Chrome அமைப்புகளுக்குச் சென்று Assistantடை முடக்கலாம். <ph name="LEARN_MORE" /></translation> <translation id="7755287808199759310">உங்களுக்காக, தளத்தின் தடுப்பை உங்கள் பெற்றோர் நீக்க முடியும்</translation> <translation id="7757592200364144203">சாதனப் பெயரை மாற்று</translation> <translation id="7757739382819740102">அருகிலுள்ள தொடர்புகள் உங்களுடன் பகிரலாம். அனுமதியளிக்க வேண்டியிருக்கும்.</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index 2392caf..090b96f 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -354,6 +354,7 @@ <translation id="1340527397989195812">'ఫైళ్లు' యాప్ను ఉపయోగించి పరికరం నుండి మీడియాను బ్యాకప్ చేయండి.</translation> <translation id="1343865611738742294">USB పరికరాలను యాక్సెస్ చేయడానికి Linux యాప్లకు అనుమతి ఇవ్వండి. USB పరికరాన్ని తీసివేసిన తర్వాత, దానిని Linux గుర్తుంచుకోదు.</translation> <translation id="1343920184519992513">మీరు ఆపివేసిన చోటు నుండి కొనసాగించండి, నిర్దిష్ట పేజీల సెట్ను తెరవండి</translation> +<translation id="1344377983938103876"><ph name="URL" />ను తెరుస్తోంది...</translation> <translation id="134589511016534552">మీడియా ట్యాబ్లు కూడా తెరిచి ఉన్న ట్యాబ్ల విభాగంలో చూపబడతాయి</translation> <translation id="1346630054604077329">నిర్ధారించి, రీస్టార్ట్ చేయి</translation> <translation id="1346748346194534595">కుడి</translation> @@ -3013,7 +3014,7 @@ <translation id="3834728400518755610">మైక్రోఫోన్ సెట్టింగ్లో మార్పు కోసం Linuxను షట్ డౌన్ చేయాల్సి ఉంటుంది. కొనసాగించడానికి Linuxను షట్ డౌన్ చేయండి.</translation> <translation id="3834775135533257713"><ph name="TO_INSTALL_APP_NAME" /> యాప్ "<ph name="INSTALLED_APP_NAME" />"కి వైరుధ్యంగా ఉన్నందున దాన్ని జోడించలేరు.</translation> <translation id="3835904559946595746">Linux బ్యాకప్ను రీస్టోర్ చేయడం సాధ్యపడలేదు</translation> -<translation id="383669374481694771">ఈ పరికరం, దీనిని ఉపయోగించే పద్ధతి (బ్యాటరీ స్థాయి, సిస్టమ్, యాప్ యాక్టివిటీ, ఎర్రర్లు లాంటివి) గురించి ఇది సాధారణ సమాచారం. ఈ డేటా Androidను మెరుగుపరచడం కోసం ఉపయోగించబడుతుంది. కొంత ఏకీకృత సమాచారం కూడా Google యాప్లు, Android డెవలపర్ల లాంటి భాగస్వాముల యాప్లు, ఉత్పత్తులను మెరుగుపరచడంలో సహాయపడుతుంది.</translation> +<translation id="383669374481694771">ఈ పరికరం, దీనిని ఉపయోగించే పద్ధతి (బ్యాటరీ స్థాయి, సిస్టమ్, యాప్ యాక్టివిటీ, ఎర్రర్లు లాంటివి) గురించి ఇది సాధారణ సమాచారం. ఈ డేటా Androidను మెరుగుపరచడం కోసం ఉపయోగించబడుతుంది. కొంత ఏకీకృత సమాచారం కూడా Google యాప్లు, Android డెవలపర్ల లాంటి భాగస్వాముల యాప్లు, ప్రోడక్టులను మెరుగుపరచడంలో సహాయపడుతుంది.</translation> <translation id="3838085852053358637">ఎక్స్టెన్షన్ను లోడ్ చేయడం విఫలమైంది</translation> <translation id="3838486795898716504">మరిన్ని <ph name="PAGE_TITLE" /></translation> <translation id="383891835335927981">సైట్లు ఏవీ దగ్గరకు లేదా దూరానికి జూమ్ చేయబడలేదు</translation> @@ -6970,6 +6971,7 @@ <translation id="7753735457098489144">స్టోరేజ్ స్పేస్ లేనందున, ఇన్స్టాల్ చేయడం విఫలమైంది. స్పేస్ను ఖాళీ చేయడానికి, పరికర స్టోరేజ్ నుండి ఫైళ్లను తొలగించండి.</translation> <translation id="7754347746598978109">JavaScriptను ఉపయోగించడానికి అనుమతించబడలేదు</translation> <translation id="7754704193130578113">ప్రతి ఫైల్ను డౌన్లోడ్ చేసే ముందు ఎక్కడ సేవ్ చేయాలో అడుగు</translation> +<translation id="7755134875397410803">టాస్క్లను పూర్తి చేయడంలో మీకు సహాయపడటానికి, మీరు Assistantను ఉపయోగించే సైట్ల URLలు, అలాగే వాటిలోని కంటెంట్లను, ఇంకా వీటితో పాటు మీరు Assistant ద్వారా సబ్మిట్ చేసే సమాచారాన్ని Google పొందుతుంది. ఈ సమాచారం మీ Google ఖాతాలో స్టోర్ చేయబడవచ్చు. మీరు Chrome సెట్టింగ్లలో Assistantను ఆఫ్ చేయవచ్చు. <ph name="LEARN_MORE" /></translation> <translation id="7755287808199759310">మీ తల్లి/తండ్రి దీన్ని మీ కోసం అన్బ్లాక్ చేయగలరు</translation> <translation id="7757592200364144203">పరికరం పేరు మార్చండి</translation> <translation id="7757739382819740102">సమీపంలోని కాంటాక్ట్లు మీతో షేర్ చేసుకోవచ్చు. ఆమోదం అవసరం.</translation> @@ -7981,7 +7983,7 @@ <translation id="8740247629089392745">మీరు ఈ Chromebookను <ph name="SUPERVISED_USER_NAME" />కు ఇవ్వవచ్చు. సెటప్ దాదాపు పూర్తయింది, మరిన్ని విషయాలను తెలుసుకునే సమయం ఆసన్నమైంది.</translation> <translation id="8740672167979365981">ChromeOS Flex అప్డేట్ అవసరం</translation> <translation id="8741944563400125534">స్విచ్ యాక్సెస్ సెటప్ గైడ్</translation> -<translation id="8742998548129056176">మీ పరికరం గురించి, మీరు దానిని ఉపయోగించే పద్ధతి గురించి (బ్యాటరీ స్థాయి, సిస్టమ్, యాప్ల యాక్టివిటీ, ఎర్రర్ల లాంటివి) తెలియజేసే సాధారణ సమాచారం. Androidను మెరుగుపరచడం కోసం ఈ డేటా ఉపయోగించబడుతుంది. కొంత ఏకీకృత సమాచారం- Google యాప్లు, Android డెవలపర్ల వంటి భాగస్వాముల యాప్లను, ఉత్పత్తులను మెరుగుపరచడంలో సహాయపడుతుంది.</translation> +<translation id="8742998548129056176">మీ పరికరం గురించి, మీరు దానిని ఉపయోగించే పద్ధతి గురించి (బ్యాటరీ స్థాయి, సిస్టమ్, యాప్ల యాక్టివిటీ, ఎర్రర్ల లాంటివి) తెలియజేసే సాధారణ సమాచారం. Androidను మెరుగుపరచడం కోసం ఈ డేటా ఉపయోగించబడుతుంది. కొంత ఏకీకృత సమాచారం- Google యాప్లు, Android డెవలపర్ల వంటి భాగస్వాముల యాప్లను, ప్రోడక్టులను మెరుగుపరచడంలో సహాయపడుతుంది.</translation> <translation id="8746654918629346731">మీరు "<ph name="EXTENSION_NAME" />"ను ఇప్పటికే రిక్వెస్ట్ చేశారు</translation> <translation id="874689135111202667">{0,plural, =1{ఈ సైట్కు ఒక ఫైల్ను అప్లోడ్ చేయాలా?}other{ఈ సైట్కు # ఫైళ్లను అప్లోడ్ చేయాలా?}}</translation> <translation id="8749805710397399240">మీ స్క్రీన్ను ప్రసారం చేయడం సాధ్యపడలేదు. సిస్టమ్ ప్రాధాన్యతలలో ఉన్న 'స్క్రీన్ రికార్డింగ్' అనుమతిని చెక్ చేయండి.</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 8421053..1b3c2b7 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -1007,6 +1007,7 @@ <translation id="1935303383381416800">ได้รับอนุญาตให้ดูตำแหน่งของคุณ</translation> <translation id="1936931585862840749">ใช้ตัวเลขเพื่อระบุจำนวนสำเนาที่ต้องการพิมพ์ (1 ถึง <ph name="MAX_COPIES" />)</translation> <translation id="1937774647013465102">นำเข้าสถาปัตยกรรมคอนเทนเนอร์ประเภท <ph name="ARCHITECTURE_CONTAINER" /> ด้วยอุปกรณ์นี้ ซึ่งเป็นประเภท <ph name="ARCHITECTURE_DEVICE" /> ไม่ได้ คุณลองคืนค่าคอนเทนเนอร์นี้ไปยังอุปกรณ์อื่นได้ หรือเข้าถึงไฟล์ภายในรูปภาพของคอนเทนเนอร์นี้โดยเปิดในแอป Files</translation> +<translation id="1938240902511979591">โหมดคอนทราสต์สูง แว่นขยาย และการตั้งค่าการแสดงผล</translation> <translation id="1938320257168860255">เกิดข้อผิดพลาด ตรวจสอบว่าโทรศัพท์อยู่ใกล้ๆ ปลดล็อกแล้ว และเปิดบลูทูธกับ Wi-Fi ไว้</translation> <translation id="1938351510777341717">แป้น Command ภายนอก</translation> <translation id="1940546824932169984">อุปกรณ์ที่เชื่อมต่อ</translation> @@ -1426,6 +1427,7 @@ <ph name="FOOTER_MESSAGE" /></translation> <translation id="2308798336967462263">ไม่รองรับแป้นต่อไปนี้: Tab, Shift, Control, Escape, Caps Lock, Volume</translation> <translation id="2309620859903500144">เว็บไซต์นี้ถูกบล็อกไม่ให้เข้าถึงเซ็นเซอร์ตรวจจับการเคลื่อนไหวหรือแสง</translation> +<translation id="2310923358723722542">การแสดงผลและการขยาย</translation> <translation id="2312219318583366810">URL ของหน้าเว็บ</translation> <translation id="2314165183524574721">การตั้งค่าระดับการเข้าถึงปัจจุบันซ่อนอยู่</translation> <translation id="2314774579020744484">ภาษาที่ใช้เมื่อแปลหน้า</translation> @@ -3210,6 +3212,7 @@ <translation id="402211067068791756">การดำเนินการนี้จะล้างข้อมูลซึ่งจัดเก็บโดยเว็บไซต์ที่แสดงรวมทั้งสิ้น <ph name="TOTAL_USAGE" /></translation> <translation id="4022426551683927403">&เพิ่มลงในพจนานุกรม</translation> <translation id="4025039777635956441">ปิดเสียงเว็บไซต์ที่เลือก</translation> +<translation id="4027958407426528157">เปิดเว็บไซต์ในแอปที่ติดตั้งใน <ph name="DEVICE_TYPE" /></translation> <translation id="4028467762035011525">เพิ่มวิธีการป้อนข้อมูล</translation> <translation id="4029556917477724407">กลับไปจากหน้า <ph name="PAGE_TITLE" /></translation> <translation id="4031179711345676612">อนุญาตให้ใช้ไมโครโฟน</translation> @@ -4161,6 +4164,7 @@ <translation id="496446150016900060">ซิงค์เครือข่าย Wi-Fi กับโทรศัพท์</translation> <translation id="4965808351167763748">คุณแน่ใจไหมว่าต้องการตั้งค่าอุปกรณ์นี้ให้เรียกใช้การประชุม Hangouts </translation> <translation id="4966972803217407697">คุณอยู่ในโหมดไม่ระบุตัวตน</translation> +<translation id="4967227914555989138">เพิ่มโน้ต</translation> <translation id="496742804571665842">ปิดใช้โปรไฟล์ eSIM</translation> <translation id="4971412780836297815">เปิดเมื่อเสร็จสิ้น</translation> <translation id="4971735654804503942">การปกป้องเชิงรุกอย่างรวดเร็วขึ้นจากเว็บไซต์ การดาวน์โหลด และส่วนขยายที่เป็นอันตราย เตือนคุณเรื่องการละเมิดรหัสผ่าน ต้องส่งข้อมูลการท่องเว็บให้ Google</translation> @@ -4408,6 +4412,7 @@ <translation id="5233231016133573565">รหัสดำเนินการ</translation> <translation id="5233638681132016545">แท็บใหม่</translation> <translation id="5233736638227740678">&วาง</translation> +<translation id="5233794855520048159">เสียงโมโน เสียงเมื่อเริ่มต้นระบบ และคำบรรยาย</translation> <translation id="5234764350956374838">ปิด</translation> <translation id="5235050375939235066">ถอนการติดตั้งแอปไหม</translation> <translation id="523505283826916779">การตั้งค่าสำหรับการเข้าถึง</translation> @@ -4512,6 +4517,7 @@ <translation id="5333896723098573627">หากต้องการนำแอปออก ให้ไปที่การตั้งค่า > แอป > Google Play Store > จัดการค่ากำหนด Android > ตัวจัดการแอปหรือแอปพลิเคชัน แล้วแตะแอปที่คุณต้องการถอนการติดตั้ง (อาจต้องปัดไปทางขวาหรือทางซ้ายเพื่อค้นหาแอป) จากนั้นแตะถอนการติดตั้งหรือปิดใช้</translation> <translation id="5334142896108694079">แคชของสคริปต์</translation> <translation id="5336688142483283574">ระบบจะนำหน้านี้ออกจากประวัติการเข้าชมและกิจกรรมใน <ph name="SEARCH_ENGINE" /> ด้วย</translation> +<translation id="5336689872433667741">เคอร์เซอร์และทัชแพด</translation> <translation id="5337771866151525739">ติดตั้งโดยบุคคลที่สาม</translation> <translation id="5337926771328966926">อุปกรณ์ปัจจุบันชื่อ <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">คุณจะท่องเว็บแบบส่วนตัวได้โดยใช้หน้าต่างที่ไม่ระบุตัวตน</translation> @@ -4522,6 +4528,7 @@ <translation id="5342091991439452114">PIN ต้องมีอย่างน้อย <ph name="MINIMUM" /> หลัก</translation> <translation id="5344036115151554031">กำลังคืนค่า Linux</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (ขวา)</translation> +<translation id="534449933710420173">โฟลเดอร์ที่ไม่มีชื่อ</translation> <translation id="5345916423802287046">เริ่มต้นแอปเมื่อคุณลงชื่อเข้าใช้</translation> <translation id="5350293332385664455">ปิด Google Assistant</translation> <translation id="535123479159372765">ข้อความคัดลอกมาจากอุปกรณ์อื่น</translation> @@ -5142,6 +5149,7 @@ <translation id="5959471481388474538">เครือข่ายไม่สามารถใช้งานได้</translation> <translation id="595959584676692139">โหลดหน้าซ้ำเพื่อใช้ส่วนขยายนี้</translation> <translation id="5963453369025043595"><ph name="NUM_HANDLES" /> (สูงสุด <ph name="NUM_KILOBYTES_LIVE" />)</translation> +<translation id="5963620791620013026">คีย์ติดหนึบ แป้นพิมพ์บนหน้าจอ การพิมพ์ตามคำบอก การเข้าถึงด้วยสวิตช์ และไฮไลต์ที่ได้รับการปรับปรุง</translation> <translation id="5964113968897211042">{COUNT,plural, =0{เปิดทั้งหมดใน&หน้าต่างใหม่}=1{เปิดใน&หน้าต่างใหม่}other{เปิดทั้งหมด ({COUNT}) ใน&หน้าต่างใหม่}}</translation> <translation id="5965661248935608907">อีกทั้งยังควบคุมหน้าที่จะแสดงเมื่อคุณคลิกปุ่ม "หน้าแรก" หรือทำการค้นหาจากแถบอเนกประสงค์</translation> <translation id="5968022600320704045">ไม่พบผลการค้นหา</translation> @@ -5952,6 +5960,7 @@ <translation id="6770602306803890733">ปรับปรุงความปลอดภัยให้คุณและทุกคนที่ใช้อินเทอร์เน็ต</translation> <translation id="6771503742377376720">เป็นผู้ออกใบรับรอง</translation> <translation id="6775163072363532304">อุปกรณ์ที่ใช้ได้จะแสดงที่นี่</translation> +<translation id="677646486571529447">เพิ่มโน้ต</translation> <translation id="6776729248872343918">เปิดใช้ฟีเจอร์จับคู่ด่วน</translation> <translation id="6777817260680419853">การเปลี่ยนเส้นทางถูกบล็อก</translation> <translation id="6778737459546443941">ผู้ปกครองยังไม่ได้อนุมัติเว็บไซต์นี้</translation> @@ -6100,6 +6109,7 @@ <translation id="6900654715912436255">คุณแน่ใจไหมว่าต้องการลบเครื่องมือค้นหานี้</translation> <translation id="6901024547292737736"><ph name="ACTUAL_CHAR_COUNT" />/<ph name="MAX_CHAR_COUNT" /></translation> <translation id="6902066522699286937">แสดงตัวอย่างเสียง</translation> +<translation id="6902219595840841518">การคลิกโดยอัตโนมัติ ขนาดของเคอร์เซอร์ สีของเคอร์เซอร์ และการไฮไลต์เคอร์เซอร์</translation> <translation id="6902336033320348843">ส่วนที่ไม่รองรับ: <ph name="ERROR_LINE" /></translation> <translation id="6902837902700739466">นำอุปกรณ์เข้าร่วมโดเมน</translation> <translation id="6903022061658753260">ระบบจะซิงค์ข้อมูลในทุกเบราว์เซอร์ Chrome ที่คุณเปิดการซิงค์ไว้สำหรับบัญชีนี้ สำหรับตัวเลือกการซิงค์ของ Chrome OS ให้ไปที่<ph name="LINK_BEGIN" />การตั้งค่า Chrome OS<ph name="LINK_END" /></translation> @@ -6556,6 +6566,7 @@ <translation id="7377481913241237033">เชื่อมต่อด้วยรหัส</translation> <translation id="7378611153938412599">รหัสผ่านที่ไม่รัดกุมนั้นคาดเดาได้ง่าย ตรวจสอบว่าคุณกำลังตั้งรหัสผ่านที่รัดกุม <ph name="BEGIN_LINK" />ดูเคล็ดลับความปลอดภัยเพิ่มเติม<ph name="END_LINK" /></translation> <translation id="73786666777299047">เปิด Chrome เว็บสโตร์</translation> +<translation id="737938816678769289">เชื่อมต่อและตั้งค่าอุปกรณ์จับคู่ด่วนที่อยู่ใกล้ๆ ได้โดยง่าย</translation> <translation id="7380459290951585794">ตรวจสอบว่าโทรศัพท์อยู่ใกล้ๆ ปลดล็อกแล้ว และเปิดบลูทูธกับ Wi-Fi ไว้</translation> <translation id="7380622428988553498">ชื่ออุปกรณ์มีอักขระที่ไม่ถูกต้อง</translation> <translation id="7380768571499464492">อัปเดต <ph name="PRINTER_NAME" /> แล้ว</translation> @@ -6877,6 +6888,7 @@ <translation id="7681095912841365527">เว็บไซต์ใช้บลูทูธได้</translation> <translation id="7681597159868843240">โดยปกติแล้วเว็บไซต์จะใช้เซ็นเซอร์ตรวจจับการเคลื่อนไหวของอุปกรณ์เพื่อดำเนินการตามฟีเจอร์อย่าง Virtual Reality หรือการติดตามการออกกำลังกาย</translation> <translation id="7683373461016844951">หากต้องการดำเนินการต่อ ให้คลิก "ตกลง" จากนั้นคลิก "เพิ่มบุคคล" เพื่อสร้างโปรไฟล์ใหม่สำหรับที่อยู่อีเมล <ph name="DOMAIN" /></translation> +<translation id="7683834360226457448">เครื่องมือแสดงผลสำหรับผู้ที่มีสายตาเลือนราง</translation> <translation id="7684212569183643648">ติดตั้งโดยผู้ดูแลระบบ</translation> <translation id="7684559058815332124">ดูหน้าการเข้าสู่ระบบแคปทีฟพอร์ทัล</translation> <translation id="7684718995427157417">หากต้องการสร้างและทดสอบแอป ให้เปิดใช้ Android Debug Bridge (ADB) โปรดทราบว่าการดำเนินการนี้จะอนุญาตให้ติดตั้งแอป Android ที่ยังไม่ได้รับการยืนยันจาก Google และต้องรีเซ็ตเป็นค่าเริ่มต้นเพื่อปิดใช้</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index bd89f115..18816fa 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -352,6 +352,7 @@ <translation id="1340527397989195812">Dosyalar uygulamasını kullanarak cihazdaki medyayı yedekleyin.</translation> <translation id="1343865611738742294">Linux uygulamalarına USB cihazlarına erişim izni verin. Linux, kaldırılan USB cihazları daha sonra hatırlamaz.</translation> <translation id="1343920184519992513">Kaldığım yerden devam et ve belirli bir sayfa grubunu aç</translation> +<translation id="1344377983938103876"><ph name="URL" /> açılıyor...</translation> <translation id="134589511016534552">Medya sekmeleri, Açık Sekmeler bölümünde de gösterilir</translation> <translation id="1346630054604077329">Onayla ve yeniden başlat</translation> <translation id="1346748346194534595">Sağa</translation> @@ -6953,6 +6954,7 @@ <translation id="7753735457098489144">Depolama alanı yetersiz olduğu için yüklenemedi. Yer açmak için cihaz depolama alanından dosya silin.</translation> <translation id="7754347746598978109">JavaScript kullanmasına izin verilmeyen siteler</translation> <translation id="7754704193130578113">İndirmeden önce her dosyanın nereye kaydedileceğini sor</translation> +<translation id="7755134875397410803">Google, görevleri tamamlamanıza yardımcı olmak için Asistan'ı kullandığınız sitelerin URL'lerinin ve içeriklerinin yanı sıra Asistan aracılığıyla gönderdiğiniz bilgileri alır. Bu bilgiler Google Hesabınızda depolanabilir. Asistan'ı Chrome ayarlarından kapatabilirsiniz. <ph name="LEARN_MORE" /></translation> <translation id="7755287808199759310">Ebeveyniniz engellemeyi sizin için kaldırabilir</translation> <translation id="7757592200364144203">Cihazın adını değiştir</translation> <translation id="7757739382819740102">Yakındaki kişiler sizinle içerik paylaşabilir. Bunun için onay gereklidir.</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 0ba367f7..7a076d8 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -357,6 +357,7 @@ <translation id="1340527397989195812">Створити резервну копію медіа-вмісту з пристрою за допомогою додатка Файли.</translation> <translation id="1343865611738742294">Надайте додаткам Linux доступ до пристроїв USB. Linux не зберігатиме дані про пристрій USB після його вилучення.</translation> <translation id="1343920184519992513">Продовжувати з місця зупинки та відкривати певний набір сторінок</translation> +<translation id="1344377983938103876">Відкриття додатка <ph name="URL" />…</translation> <translation id="134589511016534552">Вкладки з медіаконтентом також відображаються в розділі "Відкриті вкладки"</translation> <translation id="1346630054604077329">Підтвердити й перезапустити</translation> <translation id="1346748346194534595">Праворуч</translation> @@ -1283,6 +1284,7 @@ <translation id="2180620921879609685">Блокувати контент на всіх сторінках</translation> <translation id="2182058453334755893">Скопійовано в буфер обміну</translation> <translation id="2184515124301515068">Дозволити Chrome вибирати, коли відтворювати звук на сайтах (рекомендується)</translation> +<translation id="2186206192313702726">Google Об’єктив</translation> <translation id="2186711480981247270">Сторінка, надіслана з іншого пристрою</translation> <translation id="2187675480456493911">Мережу синхронізовано з іншими пристроями у вашому обліковому записі. Налаштування, які змінюють інші користувачі, не синхронізуватимуться. <ph name="LINK_BEGIN" />Докладніше<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Помилка імпортування сертифіката сервера</translation> @@ -6976,6 +6978,7 @@ <translation id="7753735457098489144">Не вдалося завершити встановлення. Замало місця. Щоб звільнити місце, видаліть файли з пристрою.</translation> <translation id="7754347746598978109">Заборонено використовувати JavaScript</translation> <translation id="7754704193130578113">Запитувати, де зберігати кожен файл перед завантаженням</translation> +<translation id="7755134875397410803">Щоб допомагати вам виконувати завдання, Google отримуватиме URL-адреси та контент веб-сайтів, на яких ви користуєтесь Асистентом, а також інформацію, яку ви надсилаєте через нього. Ці дані можуть зберігатись у вашому обліковому записі Google. Ви можете вимкнути Асистента в налаштуваннях Chrome. <ph name="LEARN_MORE" /></translation> <translation id="7755287808199759310">Хтось із батьків може розблокувати його</translation> <translation id="7757592200364144203">Змінити назву пристрою</translation> <translation id="7757739382819740102">Контакти поблизу можуть передавати вам дані. Вам потрібно буде схвалювати такі дії.</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb index 757c9c5..0069081 100644 --- a/chrome/app/resources/generated_resources_ur.xtb +++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -352,6 +352,7 @@ <translation id="1340527397989195812">فائلز ایپ کا استعمال کر کے آلے سے میڈیا کا بیک اپ لیں۔</translation> <translation id="1343865611738742294">Linux ایپس کو USB آلات تک رسائی کی اجازت دیں۔ USB آلہ کو ہٹا دیے جانے کے بعد Linux اسے یاد نہیں رکھے گا۔</translation> <translation id="1343920184519992513">وہیں سے جاری رکھیں جہاں آپ نے چھوڑا تھا اور صفحات کا ایک مخصوص سیٹ کھولیں</translation> +<translation id="1344377983938103876"><ph name="URL" /> کھل رہی ہے…</translation> <translation id="134589511016534552">'کھلے ٹیبز' کے سیکشن میں میڈیا ٹیبز بھی دکھائی دیں گے</translation> <translation id="1346630054604077329">تصدیق کر کے ری اسٹارٹ کریں</translation> <translation id="1346748346194534595">دائیں</translation> @@ -6955,6 +6956,7 @@ <translation id="7753735457098489144">اسٹوریج کی جگہ کم ہونے کی وجہ سے انسٹال کا عمل ناکام ہو گیا۔ جگہ خالی کرنے کیلئے، آلہ کے اسٹوریج سے فائلیں حذف کریں۔</translation> <translation id="7754347746598978109">JavaScript کو استعمال کرنے کی اجازت نہیں ہے</translation> <translation id="7754704193130578113">ہر فائل ڈاؤن لوڈ کرنے سے پہلے پوچھیں کہ کہاں پر محفوظ کرنا ہے</translation> +<translation id="7755134875397410803">ٹاسکس کو مکمل کرنے میں آپ کی مدد کرنے کے لیے، Google کو ان سائٹس کے URLs اور مواد موصول ہوں گے جن پر آپ اسسٹنٹ استعمال کرتے ہیں نیز اسسٹنٹ کے ذریعے آپ کی جمع کروائی ہوئی معلومات بھی موصول ہوں گی۔ اس معلومات کو آپ کے Google اکاؤنٹ میں اسٹور کیا جا سکتا ہے۔ آپ Chrome کی ترتیبات میں اسسٹنٹ کو آف کر سکتے ہیں۔ <ph name="LEARN_MORE" /></translation> <translation id="7755287808199759310">آپ کے والدین آپ کیلئے اسے غیر مسدود کر سکتے ہیں</translation> <translation id="7757592200364144203">آلے کا نام تبدیل کریں</translation> <translation id="7757739382819740102">قریبی رابطے آپ کے ساتھ اشتراک کر سکتے ہیں۔ منظوری درکار ہوگی۔</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index 2f766f6b..c45e856 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -1006,6 +1006,7 @@ <translation id="1935303383381416800">Joylashuvingizni koʻrishga ruxsat berilgan</translation> <translation id="1936931585862840749">Chop etish uchun nusxalar sonini kiriting (1-<ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102"><ph name="ARCHITECTURE_DEVICE" /> protsessorli qurilmangizga <ph name="ARCHITECTURE_CONTAINER" /> turidagi zaxiraviy nusxasi tiklanmaydi. Arxivni boshqa turdagi protsessorli qurilmada tiklash yoki Fayllar ilovasi orqali tarkibidagi zaxiralangan fayllarini ochish mumkin.</translation> +<translation id="1938240902511979591">Yuqori kontrastli rejim, lupa va ekran sozlamalari</translation> <translation id="1938320257168860255">Xatolik yuz berdi. Uning yaqin-atrofda, qulfdan chiqarilgan, Bluetooth va Wi-Fi yoqilganligiga ishonch hosil qiling.</translation> <translation id="1938351510777341717">Tashqi buyruq</translation> <translation id="1940546824932169984">Ulangan qurilmalar</translation> @@ -1428,6 +1429,7 @@ <ph name="FOOTER_MESSAGE" /></translation> <translation id="2308798336967462263">Quyidagi tugmalar dastaklanmaydi: Tab, Shift, Control, Escape, Caps lock, Tovush balandligi</translation> <translation id="2309620859903500144">Bu sahifa uchun harakat yoki yorug‘lik sensorlaridan foydalanish taqiqlandi</translation> +<translation id="2310923358723722542">Ekran va masshtab</translation> <translation id="2312219318583366810">Sahifa URL manzili</translation> <translation id="2314165183524574721">Ayni vaqtda hech kimga koʻrinmaslik sozlangan</translation> <translation id="2314774579020744484">Tarjima qilishda ishlatiladigan til</translation> @@ -4164,6 +4166,7 @@ <translation id="496446150016900060">Wi-Fi tarmoqlarni telefon orqali sinxronlang</translation> <translation id="4965808351167763748">Hangouts Meet ishlashi uchun bu qurilmani sozlashni xohlaysizmi?</translation> <translation id="4966972803217407697">Siz inkognito rejimidasiz</translation> +<translation id="4967227914555989138">Qayd kiritish</translation> <translation id="496742804571665842">eSIM profillarini faolsizlantirish</translation> <translation id="4971412780836297815">Tugaganidan keyin ochish</translation> <translation id="4971735654804503942">Zararli sayt, yuklanma va kengaytmalarga qarshi tez va mustahkam himoya. Oshkor etilgan parollar haqida ogohlantiradi. Brauzer maʼlumotlari Google serverlariga yuborilishini talab qiladi.</translation> @@ -4411,6 +4414,7 @@ <translation id="5233231016133573565">Jarayon ID raqami</translation> <translation id="5233638681132016545">Yangi varaq</translation> <translation id="5233736638227740678">&Joylash</translation> +<translation id="5233794855520048159">Mono audio, tizim ishga tushish tovushlari va taglavhalar</translation> <translation id="5234764350956374838">Yopish</translation> <translation id="5235050375939235066">Ilova o‘chirib tashlansinmi?</translation> <translation id="523505283826916779">Maxsus imkoniyatlar sozlamalari</translation> @@ -4515,6 +4519,7 @@ <translation id="5333896723098573627">Ilovalarni olib tashlash uchun Sozlamalar > Ilovalar > Google Play Market > Android sozlamalari boshqaruvi > Ilovalar yoki Ilovalar menejeri menyusiga kiring. Kerakli ilovani tanlab (ilovani topish uchun ekranni oʻng yoki chapga suring), “Olib tashlash” yoki “Faolsizlantirish” parametrini bosing.</translation> <translation id="5334142896108694079">Skript keshi</translation> <translation id="5336688142483283574">Bu sahifa ham hisobingizdagi qidiruv va <ph name="SEARCH_ENGINE" /> tarixidan olib tashlanadi.</translation> +<translation id="5336689872433667741">Kursor va sensorli panel</translation> <translation id="5337771866151525739">Mustaqil ta’minotchi tomonidan o‘rnatilgan.</translation> <translation id="5337926771328966926">Joriy qurilma nomi: <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Inkognito oynada internetni yashirin kezishingiz mumkin</translation> @@ -4525,6 +4530,7 @@ <translation id="5342091991439452114">PIN kod kamida <ph name="MINIMUM" /> ta raqamdan iborat bo‘lishi lozim</translation> <translation id="5344036115151554031">Linux tiklanmoqda</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (oʻng)</translation> +<translation id="534449933710420173">Nomsiz jild</translation> <translation id="5345916423802287046">Ilova tizim bilan birga ishga tushsin</translation> <translation id="5350293332385664455">Google Assistentni faolsizlantirish</translation> <translation id="535123479159372765">Matn boshqa qurilmadan nusxalangan</translation> @@ -5148,6 +5154,7 @@ <translation id="5959471481388474538">Tarmoq ish faoliyatida emas</translation> <translation id="595959584676692139">Bu kengaytmani ishlatish uchun sahifani qayta yuklang</translation> <translation id="5963453369025043595"><ph name="NUM_HANDLES" /> (maks. <ph name="NUM_KILOBYTES_LIVE" />)</translation> +<translation id="5963620791620013026">Yopishqoq tugmalar, ekran klaviaturasi, ovoz bilan yozish, switch access va yaxshilab belgilash</translation> <translation id="5964113968897211042">{COUNT,plural, =0{Barchasini &yangi oynada ochish}=1{&Yangi oynada ochish}other{Barchasini ({COUNT}) &yangi oynada ochish}}</translation> <translation id="5965661248935608907">Bundan tashqari kengaytma Bosh sahifa tugmasini bosganingizda yoki Omnibox orqali qidiruvda qaysi sahifa ko‘rsatilishini tayinlaydi.</translation> <translation id="5968022600320704045">Hech narsa topilmadi</translation> @@ -5958,6 +5965,7 @@ <translation id="6770602306803890733">Siz va yaqinlaringizni internetdan yaxshiroq himoyalaydi</translation> <translation id="6771503742377376720">Bu sertifikatlashtirish markazi</translation> <translation id="6775163072363532304">Ulangan qurilmalar shu yerda chiqadi.</translation> +<translation id="677646486571529447">Qayd kiritish</translation> <translation id="6776729248872343918">Tezkor ulanish funksiyasini yoqish</translation> <translation id="6777817260680419853">Yo‘naltirish bloklandi</translation> <translation id="6778737459546443941">Ota-onangiz tomonidan hali tasdiqlanmagan</translation> @@ -6106,6 +6114,7 @@ <translation id="6900654715912436255">Bu qidiruv tizimi aniq oʻchirilsinmi?</translation> <translation id="6901024547292737736"><ph name="ACTUAL_CHAR_COUNT" />/<ph name="MAX_CHAR_COUNT" /></translation> <translation id="6902066522699286937">Ovoz namunasi</translation> +<translation id="6902219595840841518">Avtomatik klik, kursor hajmi, kursor rangi va belgilov kursori</translation> <translation id="6902336033320348843">Boʻlim ishlamaydi: <ph name="ERROR_LINE" /></translation> <translation id="6902837902700739466">Qurilmani domenga ulang.</translation> <translation id="6903022061658753260">Maʼlumotlaringiz bu hisob sinxronizatsiyasi yoqilgan barcha Chrome brauzerlarida sinxronlanadi. ChromeOS sinxronizatsiya usullarini <ph name="LINK_BEGIN" />ChromeOS sozlamalari orqali<ph name="LINK_END" /> sozlash mumkin.</translation> @@ -6883,6 +6892,7 @@ <translation id="7681095912841365527">Sayt Bluetooth aloqasidan foydalanishi mumkin</translation> <translation id="7681597159868843240">Saytlar odatda virtual reallik yoki qadam sanash kabi funksiyalar uchun qurilmadagi harakat sensorlaridan foydalanadi</translation> <translation id="7683373461016844951">Davom etish uchun OK tugmasini bosing. Keyin esa “Foydalanuvchi qo‘shish” bandi orqali <ph name="DOMAIN" /> domenidagi yangi profil yarating.</translation> +<translation id="7683834360226457448">Koʻrish qobiliyati pastlar uchun ekran vositalari</translation> <translation id="7684212569183643648">Administratoringiz tomonidan o‘rnatilgan</translation> <translation id="7684559058815332124">Tegishli portalga kirish sahifasiga o‘tish</translation> <translation id="7684718995427157417">Ilovalar ishlab chiqish va ularni sinash uchun Android Debug Bridge (ADB) vositasini faollashtiring. Eslatma: bunda Google tomonidan tekshirilmagan Android ilovalar ham oʻrnatilishi mumkin va zavod sozlamalariga tiklash yoqilmasligi kerak.</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb index 32e606d..d3cea069 100644 --- a/chrome/app/resources/generated_resources_zu.xtb +++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -355,6 +355,7 @@ <translation id="1340527397989195812">Yenza imidiya isipele kusuka kudivayisi usebenzisa uhlelo lokusebenza lamafayela.</translation> <translation id="1343865611738742294">Nikeza izinhlelo zokusebenza ze-Linux imvume yokufinyelela kumadivayisi e-USB. I-Linux ngeke ize ikhumbule idivayisi ye-USB ngemuva kokuthi isuswe.</translation> <translation id="1343920184519992513">Qhubeka lapho ugcine khona futhi uvule isethi ethile yamakhasi</translation> +<translation id="1344377983938103876">Ivula i-<ph name="URL" />...</translation> <translation id="134589511016534552">Amathebhu emidiya nawo akhonjiswa esigabeni esithi Vula Amathebhu</translation> <translation id="1346630054604077329">Qinisekisa uphinde uqalise kabusha</translation> <translation id="1346748346194534595">Kwesokudla</translation> @@ -6976,6 +6977,7 @@ <translation id="7753735457098489144">Ukulandwa kuhlulekile ngenxa yokushoda kwesikhala sesitoreji. Ukuze ukhulule isikhala, susa amafayela kusitoreji sedivayisi.</translation> <translation id="7754347746598978109">Ayivumelekile ukusebenzisa i-Javascript</translation> <translation id="7754704193130578113">Buza ukuthi ulondoloze kuphi ifayela ngalinye ngaphambi kokulanda</translation> +<translation id="7755134875397410803">Ukukusiza uqedele imisebenzi, i-Google izothola ama-URL nokuqukethwe kwamasayithi osebenzisa kuwo umsizi, kanye nolwazi oluthumela ngomsizi. Lolu lwazi lungase lugcinwe ku-Google Account yakho. Ungavala i-Assistant kumasethingi we-Chrome. <ph name="LEARN_MORE" /></translation> <translation id="7755287808199759310">Umzali wakho angakuvulela yona</translation> <translation id="7757592200364144203">Shintsha igama ledivayisi</translation> <translation id="7757739382819740102">Oxhumana nabo abaseduze bangabelana nawe. Imvume izodingeka.</translation>
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index dd030224..59243e0a 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -32,6 +32,9 @@ <message name="IDS_SETTINGS_ABOUT_PAGE_REPORT_AN_ISSUE" desc="Text of the button which allows the user to report an issue with Chrome."> Report an issue </message> + <message name="IDS_SETTINGS_ABOUT_PAGE_SEND_FEEDBACK" desc="Text of the button which allows the user to send feedback with Chrome."> + Send feedback + </message> </if> <if expr="is_macosx"> <message name="IDS_ABOUT_CHROME_AUTOUPDATE_ALL" desc="The 'Automatically update Chrome for all users.' button in the About window. Mac-only.">
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_ABOUT_PAGE_SEND_FEEDBACK.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_ABOUT_PAGE_SEND_FEEDBACK.png.sha1 new file mode 100644 index 0000000..41cf46b --- /dev/null +++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_ABOUT_PAGE_SEND_FEEDBACK.png.sha1
@@ -0,0 +1 @@ +d35030b1ac2787e18ee5448ed4c856f5954247b9 \ No newline at end of file
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 28607bf..36158be 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -503,6 +503,16 @@ {"Voice", kAdaptiveButtonCustomization_Voice, std::size(kAdaptiveButtonCustomization_Voice), nullptr}, }; + +const FeatureEntry::FeatureParam + kOmniboxRemoveSuggestionHeaderChevron_AllowCollapse[] = { + {"allow_group_collapsed_state", "true"}}; +const FeatureEntry::FeatureVariation + kOmniboxRemoveSuggestionHeaderChevronVariations[] = { + {"AllowCollapse", kOmniboxRemoveSuggestionHeaderChevron_AllowCollapse, + std::size(kOmniboxRemoveSuggestionHeaderChevron_AllowCollapse), + nullptr}, +}; #endif // BUILDFLAG(IS_ANDROID) const FeatureEntry::FeatureParam @@ -5056,6 +5066,15 @@ flag_descriptions::kOmniboxMostVisitedTilesDescription, kOsAndroid, FEATURE_VALUE_TYPE(omnibox::kMostVisitedTiles)}, + {"omnibox-remove-suggestion-header-chevron", + flag_descriptions::kOmniboxRemoveSuggestionHeaderChevronName, + flag_descriptions::kOmniboxRemoveSuggestionHeaderChevronDescription, + kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE( + omnibox::kOmniboxRemoveSuggestionHeaderChevron, + kOmniboxRemoveSuggestionHeaderChevronVariations, + "OmniboxRemoveSuggestionHeaderChevron")}, + {"omnibox-most-visited-tiles-title-wrap-around", flag_descriptions::kOmniboxMostVisitedTilesTitleWrapAroundName, flag_descriptions::kOmniboxMostVisitedTilesTitleWrapAroundDescription,
diff --git a/chrome/browser/android/webapk/webapk_installer.cc b/chrome/browser/android/webapk/webapk_installer.cc index 974bd93..655000e 100644 --- a/chrome/browser/android/webapk/webapk_installer.cc +++ b/chrome/browser/android/webapk/webapk_installer.cc
@@ -220,7 +220,7 @@ void WebApkInstaller::StoreUpdateRequestToFile( const base::FilePath& update_request_path, const webapps::ShortcutInfo& shortcut_info, - const std::string& app_key, + const GURL& app_key, const std::string& primary_icon_data, bool is_primary_icon_maskable, const std::string& splash_icon_data,
diff --git a/chrome/browser/android/webapk/webapk_installer.h b/chrome/browser/android/webapk/webapk_installer.h index dbc2f4d9..8338fa73c 100644 --- a/chrome/browser/android/webapk/webapk_installer.h +++ b/chrome/browser/android/webapk/webapk_installer.h
@@ -150,7 +150,7 @@ static void StoreUpdateRequestToFile( const base::FilePath& update_request_path, const webapps::ShortcutInfo& shortcut_info, - const std::string& app_key, + const GURL& app_key, const std::string& primary_icon_data, bool is_primary_icon_maskable, const std::string& splash_icon_data,
diff --git a/chrome/browser/android/webapk/webapk_installer_unittest.cc b/chrome/browser/android/webapk/webapk_installer_unittest.cc index c5d901c..3f1f75af 100644 --- a/chrome/browser/android/webapk/webapk_installer_unittest.cc +++ b/chrome/browser/android/webapk/webapk_installer_unittest.cc
@@ -194,9 +194,9 @@ base::RunLoop run_loop; quit_closure_ = run_loop.QuitClosure(); WebApkInstaller::StoreUpdateRequestToFile( - update_request_path, webapps::ShortcutInfo((GURL())), "", "", false, "", - "", "", std::map<std::string, webapps::WebApkIconHasher::Icon>(), false, - false, {webapps::WebApkUpdateReason::PRIMARY_ICON_HASH_DIFFERS}, + update_request_path, webapps::ShortcutInfo((GURL())), GURL(), "", false, + "", "", "", std::map<std::string, webapps::WebApkIconHasher::Icon>(), + false, false, {webapps::WebApkUpdateReason::PRIMARY_ICON_HASH_DIFFERS}, base::BindOnce(&UpdateRequestStorer::OnComplete, base::Unretained(this))); run_loop.Run();
diff --git a/chrome/browser/android/webapk/webapk_update_data_fetcher.cc b/chrome/browser/android/webapk/webapk_update_data_fetcher.cc index dae2401..feb678a 100644 --- a/chrome/browser/android/webapk/webapk_update_data_fetcher.cc +++ b/chrome/browser/android/webapk/webapk_update_data_fetcher.cc
@@ -14,6 +14,7 @@ #include "base/android/jni_string.h" #include "base/bind.h" #include "base/feature_list.h" +#include "base/metrics/histogram_macros.h" #include "base/strings/utf_string_conversions.h" #include "chrome/android/chrome_jni_headers/WebApkUpdateDataFetcher_jni.h" #include "chrome/browser/profiles/profile.h" @@ -50,29 +51,32 @@ jlong JNI_WebApkUpdateDataFetcher_Initialize( JNIEnv* env, const JavaParamRef<jobject>& obj, + const JavaParamRef<jstring>& java_start_url, const JavaParamRef<jstring>& java_scope_url, const JavaParamRef<jstring>& java_web_manifest_url, const JavaParamRef<jstring>& java_web_manifest_id) { + GURL start_url(base::android::ConvertJavaStringToUTF8(env, java_start_url)); GURL scope(base::android::ConvertJavaStringToUTF8(env, java_scope_url)); GURL web_manifest_url( base::android::ConvertJavaStringToUTF8(env, java_web_manifest_url)); - std::string web_manifest_id; + GURL web_manifest_id; if (!java_web_manifest_id.is_null()) { web_manifest_id = - base::android::ConvertJavaStringToUTF8(env, java_web_manifest_id); + GURL(base::android::ConvertJavaStringToUTF8(env, java_web_manifest_id)); } WebApkUpdateDataFetcher* fetcher = new WebApkUpdateDataFetcher( - env, obj, scope, web_manifest_url, web_manifest_id); + env, obj, start_url, scope, web_manifest_url, web_manifest_id); return reinterpret_cast<intptr_t>(fetcher); } -WebApkUpdateDataFetcher::WebApkUpdateDataFetcher( - JNIEnv* env, - jobject obj, - const GURL& scope, - const GURL& web_manifest_url, - const std::string& web_manifest_id) +WebApkUpdateDataFetcher::WebApkUpdateDataFetcher(JNIEnv* env, + jobject obj, + const GURL& start_url, + const GURL& scope, + const GURL& web_manifest_url, + const GURL& web_manifest_id) : content::WebContentsObserver(nullptr), + start_url_(start_url), scope_(scope), web_manifest_url_(web_manifest_url), web_manifest_id_(web_manifest_id), @@ -166,12 +170,16 @@ return; } + GURL new_manifest_id(webapps::ShortcutInfo::GetManifestId(data.manifest)); // If the fetched manifest id is different from the current one, we also // continue observing as the id is the identity for the application. We // will treat the manifest with different id as the one of another WebAPK. if (base::FeatureList::IsEnabled(webapps::features::kWebApkUniqueId) && - !web_manifest_id_.empty() && - web_manifest_id_ != webapps::ShortcutInfo::GetManifestId(data.manifest)) { + !web_manifest_id_.is_empty() && web_manifest_id_ != new_manifest_id) { + UMA_HISTOGRAM_BOOLEAN("WebApk.UniqueId.FoundDifferentId.ManifestUrl", + web_manifest_url_ == data.manifest_url); + UMA_HISTOGRAM_BOOLEAN("WebApk.UniqueId.FoundDifferentId.StartUrl", + start_url_ == data.manifest.start_url); return; } @@ -226,7 +234,7 @@ ScopedJavaLocalRef<jstring> java_short_name = base::android::ConvertUTF16ToJavaString(env, info_.short_name); ScopedJavaLocalRef<jstring> java_manifest_id = - base::android::ConvertUTF8ToJavaString(env, info_.manifest_id); + base::android::ConvertUTF8ToJavaString(env, info_.manifest_id.spec()); ScopedJavaLocalRef<jstring> java_primary_icon_url = base::android::ConvertUTF8ToJavaString( env, info_.best_primary_icon_url.spec());
diff --git a/chrome/browser/android/webapk/webapk_update_data_fetcher.h b/chrome/browser/android/webapk/webapk_update_data_fetcher.h index 3c4b623..f45acba 100644 --- a/chrome/browser/android/webapk/webapk_update_data_fetcher.h +++ b/chrome/browser/android/webapk/webapk_update_data_fetcher.h
@@ -31,9 +31,10 @@ public: WebApkUpdateDataFetcher(JNIEnv* env, jobject obj, + const GURL& start_url, const GURL& scope, const GURL& web_manifest_url, - const std::string& web_manifest_id); + const GURL& web_manifest_id); WebApkUpdateDataFetcher(const WebApkUpdateDataFetcher&) = delete; WebApkUpdateDataFetcher& operator=(const WebApkUpdateDataFetcher&) = delete; @@ -77,6 +78,9 @@ // Points to the Java object. base::android::ScopedJavaGlobalRef<jobject> java_ref_; + // The WebAPK's current start url. Used for recording UMA. + const GURL start_url_; + // The detector will only fetch the URL within the scope of the WebAPK. const GURL scope_; @@ -84,7 +88,7 @@ const GURL web_manifest_url_; // The WebAPK's Web Manifest ID that the detector is looking for. - const std::string web_manifest_id_; + const GURL web_manifest_id_; // The URL for which the installable data is being fetched / was last fetched. GURL last_fetched_url_;
diff --git a/chrome/browser/android/webapk/webapk_update_manager.cc b/chrome/browser/android/webapk/webapk_update_manager.cc index 5225d2bf..37d0b7c 100644 --- a/chrome/browser/android/webapk/webapk_update_manager.cc +++ b/chrome/browser/android/webapk/webapk_update_manager.cc
@@ -116,8 +116,8 @@ GURL(ConvertJavaStringToUTF8(env, java_splash_icon_url)); info.is_splash_image_maskable = java_is_splash_icon_maskable; info.manifest_url = GURL(ConvertJavaStringToUTF8(env, java_web_manifest_url)); - info.manifest_id = ConvertJavaStringToUTF8(env, java_manifest_id); - std::string app_key = ConvertJavaStringToUTF8(env, java_app_key); + info.manifest_id = GURL(ConvertJavaStringToUTF8(env, java_manifest_id)); + GURL app_key(ConvertJavaStringToUTF8(env, java_app_key)); GURL share_target_action = GURL(ConvertJavaStringToUTF8(env, java_share_target_action));
diff --git a/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.cc b/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.cc index 6c9e4f9..6586d89a 100644 --- a/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.cc +++ b/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.cc
@@ -43,7 +43,7 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/arc/arc_web_contents_data.h" #include "chrome/browser/chromeos/extensions/gfx_utils.h" -#include "chrome/browser/extensions/extension_keeplist_ash.h" +#include "chrome/browser/extensions/extension_keeplist_chromeos.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_uninstall_dialog.h" #include "chrome/browser/extensions/extension_util.h" @@ -747,7 +747,7 @@ // Do not publish platform apps in Ash if it should run in Lacros instead. if (extension->is_platform_app() && crosapi::browser_util::IsLacrosChromeAppsEnabled()) { - return extensions::ExtensionAppRunsInAsh(extension->id()); + return extensions::ExtensionAppRunsInOS(extension->id()); } return true; @@ -799,7 +799,7 @@ // published to the app service at all. Thus this method should not be called. DCHECK(!(extension->is_platform_app() && crosapi::browser_util::IsLacrosChromeAppsEnabled() && - !extensions::ExtensionAppRunsInAsh(extension->id()))); + !extensions::ExtensionAppRunsInOS(extension->id()))); const bool is_app_disabled = base::Contains(disabled_apps_, extension->id()); auto app = CreateAppImpl( @@ -836,7 +836,7 @@ // published to the app service at all. Thus this method should not be called. DCHECK(!(extension->is_platform_app() && crosapi::browser_util::IsLacrosChromeAppsEnabled() && - !extensions::ExtensionAppRunsInAsh(extension->id()))); + !extensions::ExtensionAppRunsInOS(extension->id()))); const bool is_app_disabled = base::Contains(disabled_apps_, extension->id()); apps::mojom::AppPtr app = ConvertImpl(
diff --git a/chrome/browser/apps/platform_apps/api/enterprise_remote_apps/enterprise_remote_apps_api.cc b/chrome/browser/apps/platform_apps/api/enterprise_remote_apps/enterprise_remote_apps_api.cc index e6a4a5f1..90e8908b 100644 --- a/chrome/browser/apps/platform_apps/api/enterprise_remote_apps/enterprise_remote_apps_api.cc +++ b/chrome/browser/apps/platform_apps/api/enterprise_remote_apps/enterprise_remote_apps_api.cc
@@ -96,11 +96,14 @@ const auto& options = parameters->options; - // Validate that `icon_url` is a valid URL. - const std::string& icon_url_string = options.icon_url; - GURL icon_url(icon_url_string); - if (!icon_url.is_valid()) { - return RespondNow(Error("Invalid iconUrl provided")); + // Checks that `icon_url` is a valid URL. If it is not valid, or it was not + // provided at all, we send an empty URL and the icon is replaced with the + // placeholder icon. + GURL icon_url; + if (options.icon_url) { + icon_url = GURL(*options.icon_url); + if (!icon_url.is_valid()) + icon_url = GURL(); } bool add_to_front = options.add_to_front ? *options.add_to_front : false;
diff --git a/chrome/browser/apps/platform_apps/api/enterprise_remote_apps/enterprise_remote_apps_apitest.cc b/chrome/browser/apps/platform_apps/api/enterprise_remote_apps/enterprise_remote_apps_apitest.cc index 4471dcc..45d75b70 100644 --- a/chrome/browser/apps/platform_apps/api/enterprise_remote_apps/enterprise_remote_apps_apitest.cc +++ b/chrome/browser/apps/platform_apps/api/enterprise_remote_apps/enterprise_remote_apps_apitest.cc
@@ -203,6 +203,16 @@ ASSERT_TRUE(catcher.GetNextResult()); } +IN_PROC_BROWSER_TEST_P(RemoteAppsApitest, AddAppNoIconUrl) { + if (GetParam() != kApiExtensionRelativePath) + GTEST_SKIP() << "iconUrl validation not done for Mojo API"; + + extensions::ResultCatcher catcher; + LoadExtensionAndRunTest("AddAppNoIconUrl"); + + ASSERT_TRUE(catcher.GetNextResult()); +} + IN_PROC_BROWSER_TEST_P(RemoteAppsApitest, AddAppToFront) { extensions::ResultCatcher catcher; LoadExtensionAndRunTest("AddAppToFront");
diff --git a/chrome/browser/ash/crosapi/url_handler_ash.cc b/chrome/browser/ash/crosapi/url_handler_ash.cc index ef7b97b..9034ddb 100644 --- a/chrome/browser/ash/crosapi/url_handler_ash.cc +++ b/chrome/browser/ash/crosapi/url_handler_ash.cc
@@ -20,6 +20,7 @@ #include "chrome/browser/web_applications/web_app_utils.h" #include "chrome/common/webui_url_constants.h" #include "chromeos/crosapi/cpp/gurl_os_handler_utils.h" +#include "components/services/app_service/public/cpp/app_launch_util.h" #include "ui/display/display.h" #include "ui/display/screen.h" #include "url/url_constants.h" @@ -69,7 +70,7 @@ int64_t display_id = display::Screen::GetScreen()->GetDisplayForNewWindows().id(); ash::LaunchSystemWebAppAsync(profile, app_type, params, - apps::MakeWindowInfo(display_id)); + std::make_unique<apps::WindowInfo>(display_id)); } } // namespace
diff --git a/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc b/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc index 46f4376..a12924a 100644 --- a/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc +++ b/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc
@@ -110,6 +110,7 @@ #include "chromeos/dbus/cros_disks/fake_cros_disks_client.h" #include "components/drive/drive_pref_names.h" #include "components/prefs/pref_service.h" +#include "components/services/app_service/public/cpp/app_launch_util.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/render_view_host.h" @@ -2333,7 +2334,7 @@ GURL fileAppURL(base::StrCat({baseURL, search})); ash::SystemAppLaunchParams params; params.url = fileAppURL; - params.launch_source = apps::mojom::LaunchSource::kFromTest; + params.launch_source = apps::LaunchSource::kFromTest; WebContentCapturingObserver observer(fileAppURL); observer.StartWatchingNewWebContents();
diff --git a/chrome/browser/ash/net/network_portal_detector_impl.cc b/chrome/browser/ash/net/network_portal_detector_impl.cc index 64a38da..feea13e 100644 --- a/chrome/browser/ash/net/network_portal_detector_impl.cc +++ b/chrome/browser/ash/net/network_portal_detector_impl.cc
@@ -378,11 +378,12 @@ case captive_portal::RESULT_BEHIND_CAPTIVE_PORTAL: status = CAPTIVE_PORTAL_STATUS_PORTAL; break; - default: + case captive_portal::RESULT_COUNT: + NOTREACHED(); break; } - NET_LOG(EVENT) << "NetworkPortalDetector completed: id=" + NET_LOG(EVENT) << "NetworkPortalDetector: AttemptCompleted: id=" << NetworkGuidId(default_network_id_) << ", result=" << captive_portal::CaptivePortalResultToString(result) << ", status=" << status @@ -425,7 +426,7 @@ DetectionCompleted(network, status, response_code); } - // Observers (via DetectionCompleted) may already schedule new attempt. + // Observers (via DetectionCompleted) may already schedule a new attempt. if (is_idle()) ScheduleAttempt(results.retry_after_delta); } @@ -447,6 +448,11 @@ const NetworkState* network, const CaptivePortalStatus& status, int response_code) { + NET_LOG(EVENT) << "NetworkPortalDetector: DetectionCompleted: id=" + << (network ? NetworkGuidId(network->guid()) : "<none>") + << ", status=" << status + << ", response_code=" << response_code; + default_portal_status_ = status; response_code_for_testing_ = response_code; if (network) {
diff --git a/chrome/browser/ash/net/network_portal_detector_impl_unittest.cc b/chrome/browser/ash/net/network_portal_detector_impl_unittest.cc index 8dfd89e79..858c50cb 100644 --- a/chrome/browser/ash/net/network_portal_detector_impl_unittest.cc +++ b/chrome/browser/ash/net/network_portal_detector_impl_unittest.cc
@@ -56,20 +56,25 @@ const char kStubEthernet[] = "stub_ethernet"; const char kStubWireless1[] = "stub_wifi1"; const char kStubWireless2[] = "stub_wifi2"; -const char kStubCellular[] = "stub_cellular"; void ErrorCallbackFunction(const std::string& error_name, const std::string& error_message) { LOG(ERROR) << "Shill Error: " << error_name << " : " << error_message; } -class MockObserver : public NetworkPortalDetector::Observer { +class FakeObserver : public NetworkPortalDetector::Observer { public: - virtual ~MockObserver() {} + void OnPortalDetectionCompleted( + const NetworkState* network, + const NetworkPortalDetector::CaptivePortalStatus status) override { + status_ = status; + } - MOCK_METHOD2(OnPortalDetectionCompleted, - void(const NetworkState* network, - const NetworkPortalDetector::CaptivePortalStatus status)); + NetworkPortalDetector::CaptivePortalStatus status() { return status_; } + + private: + NetworkPortalDetector::CaptivePortalStatus status_ = + NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN; }; } // namespace @@ -109,6 +114,8 @@ std::make_unique<NetworkPortalDetectorImpl>(test_loader_factory()); network_portal_detector_->Enable(false); + network_portal_detector()->AddObserver(&observer_); + set_detector(network_portal_detector_->captive_portal_detector_.get()); // Prevents flakiness due to message loop delays. @@ -122,6 +129,7 @@ } void TearDown() override { + network_portal_detector()->RemoveObserver(&observer_); network_portal_detector_.reset(); profile_ = nullptr; network_handler_test_helper_.reset(); @@ -168,14 +176,6 @@ return network_portal_detector_.get(); } - void AddObserver(NetworkPortalDetector::Observer* observer) { - network_portal_detector()->AddObserver(observer); - } - - void RemoveObserver(NetworkPortalDetector::Observer* observer) { - network_portal_detector()->RemoveObserver(observer); - } - NetworkPortalDetectorImpl::State state() { return network_portal_detector()->state(); } @@ -265,6 +265,8 @@ base::RunLoop().RunUntilIdle(); } + FakeObserver& observer() { return observer_; } + private: void AddService(const std::string& network_id, const std::string& type) { network_handler_test_helper_->service_test()->AddService( @@ -279,7 +281,6 @@ AddService(kStubEthernet, shill::kTypeEthernet); AddService(kStubWireless1, shill::kTypeWifi); AddService(kStubWireless2, shill::kTypeWifi); - AddService(kStubCellular, shill::kTypeCellular); } void SetupNetworkHandler() { @@ -294,6 +295,7 @@ std::unique_ptr<base::HistogramSamples> original_samples_; std::unique_ptr<user_manager::ScopedUserManager> user_manager_enabler_; TestingProfileManager test_profile_manager_; + FakeObserver observer_; }; TEST_F(NetworkPortalDetectorImplTest, NoPortal) { @@ -352,50 +354,25 @@ TEST_F(NetworkPortalDetectorImplTest, Online2Offline) { ASSERT_EQ(State::STATE_IDLE, state()); - - MockObserver observer; - AddObserver(&observer); - - NetworkPortalDetector::CaptivePortalStatus offline_status = - NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE; + ASSERT_EQ(observer().status(), + NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN); // WiFi is in online state. - { - // When transitioning to a connected state, the network will transition to - // connecting states which will set the default network to nullptr. This may - // get triggered multiple times. - EXPECT_CALL(observer, OnPortalDetectionCompleted(_, offline_status)) - .Times(AnyNumber()); + SetConnected(kStubWireless1); + EXPECT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); - // Expect a single transition to an online state. - EXPECT_CALL(observer, - OnPortalDetectionCompleted( - _, NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE)) - .Times(1); + CompleteURLFetch(net::OK, 204, nullptr); + EXPECT_NE(State::STATE_IDLE, state()); - SetConnected(kStubWireless1); - ASSERT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); - - CompleteURLFetch(net::OK, 204, nullptr); - EXPECT_NE(State::STATE_IDLE, state()); - - // Check that observer was notified about online state. - Mock::VerifyAndClearExpectations(&observer); - } + EXPECT_EQ(observer().status(), + NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE); // WiFi is turned off. - { - EXPECT_CALL(observer, OnPortalDetectionCompleted(nullptr, offline_status)) - .Times(1); + SetDisconnected(kStubWireless1); + EXPECT_EQ(State::STATE_IDLE, state()); - SetDisconnected(kStubWireless1); - ASSERT_EQ(State::STATE_IDLE, state()); - - // Check that observer was notified about offline state. - Mock::VerifyAndClearExpectations(&observer); - } - - RemoveObserver(&observer); + EXPECT_EQ(observer().status(), + NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE); } TEST_F(NetworkPortalDetectorImplTest, NetworkChanged) { @@ -802,16 +779,15 @@ ASSERT_EQ(State::STATE_IDLE, state()); set_delay_till_next_attempt(base::TimeDelta()); - SetNetworkDeviceEnabled(shill::kTypeWifi, false); - SetConnected(kStubCellular); + SetConnected(kStubWireless1); - // First portal detection attempt for cellular1 uses 5sec timeout. + // First portal detection attempt uses 5sec timeout. CheckRequestTimeoutAndCompleteAttempt( 0 /* expected_same_detection_result_count */, 0 /* expected_no_response_result_count */, 5 /* expected_request_timeout_sec */, net::ERR_CONNECTION_CLOSED, 0); - // Second portal detection attempt for cellular1 uses 10sec timeout. + // Second portal detection attempt uses 10sec timeout. ASSERT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); base::RunLoop().RunUntilIdle(); CheckRequestTimeoutAndCompleteAttempt( @@ -819,7 +795,7 @@ 1 /* expected_no_response_result_count */, 10 /* expected_request_timeout_sec */, net::ERR_CONNECTION_CLOSED, 0); - // Third portal detection attempt for cellular1 uses 15sec timeout. + // Third portal detection attempt uses 15sec timeout. ASSERT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); base::RunLoop().RunUntilIdle(); CheckRequestTimeoutAndCompleteAttempt(
diff --git a/chrome/browser/ash/net/system_proxy_manager.cc b/chrome/browser/ash/net/system_proxy_manager.cc index 54a09f5..d6503dc8 100644 --- a/chrome/browser/ash/net/system_proxy_manager.cc +++ b/chrome/browser/ash/net/system_proxy_manager.cc
@@ -407,8 +407,9 @@ if (primary_profile_) { request.set_active_principal_name( primary_profile_->GetPrefs() - ->Get(prefs::kKerberosActivePrincipalName) - ->GetString()); + ->GetValue(prefs::kKerberosActivePrincipalName) + // TODO (https://crbug.com/1344857) Maybe call GetString directly. + .GetString()); } SystemProxyClient::Get()->SetAuthenticationDetails( request, base::BindOnce(&SystemProxyManager::OnSetAuthenticationDetails,
diff --git a/chrome/browser/ash/policy/enrollment/enrollment_config.cc b/chrome/browser/ash/policy/enrollment/enrollment_config.cc index a90ec64..c49e62f 100644 --- a/chrome/browser/ash/policy/enrollment/enrollment_config.cc +++ b/chrome/browser/ash/policy/enrollment/enrollment_config.cc
@@ -117,17 +117,15 @@ // Gather enrollment signals from various sources. const base::Value::Dict& device_state = local_state.GetValueDict(prefs::kServerBackedDeviceState); - std::string device_state_mode; - std::string device_state_management_domain; - bool is_license_packaged_with_device = false; - std::string license_type; - device_state_mode = GetString(device_state, kDeviceStateMode); - device_state_management_domain = + const std::string device_state_mode = + GetString(device_state, kDeviceStateMode); + const std::string device_state_management_domain = GetString(device_state, kDeviceStateManagementDomain); - is_license_packaged_with_device = + const bool is_license_packaged_with_device = device_state.FindBool(kDeviceStatePackagedLicense).value_or(false); - license_type = GetString(device_state, kDeviceStateLicenseType); + const std::string license_type = + GetString(device_state, kDeviceStateLicenseType); config.is_license_packaged_with_device = is_license_packaged_with_device;
diff --git a/chrome/browser/ash/remote_apps/remote_apps_manager_browsertest.cc b/chrome/browser/ash/remote_apps/remote_apps_manager_browsertest.cc index 8ac9e2b9..73d1716a 100644 --- a/chrome/browser/ash/remote_apps/remote_apps_manager_browsertest.cc +++ b/chrome/browser/ash/remote_apps/remote_apps_manager_browsertest.cc
@@ -311,23 +311,51 @@ // App has id kId1. AddAppAndWaitForIconChange(kExtensionId1, kId1, name, std::string(), icon_url, - icon, - /*add_to_front=*/false); - + icon, /*add_to_front=*/false); ash::AppListItem* item = GetAppListItem(kId1); EXPECT_FALSE(item->is_folder()); EXPECT_EQ(name, item->name()); EXPECT_TRUE(item->GetMetadata()->is_ephemeral); - // kShared uses size hint 64 dip. - apps::IconEffects icon_effects = apps::IconEffects::kCrOsStandardIcon; base::test::TestFuture<apps::IconValuePtr> future; - auto output_data = std::make_unique<apps::IconValue>(); auto iv = std::make_unique<apps::IconValue>(); iv->icon_type = apps::IconType::kStandard; iv->uncompressed = icon; + apps::ApplyIconEffects(apps::IconEffects::kCrOsStandardIcon, + /*size_hint_in_dip=*/64, std::move(iv), + future.GetCallback()); + + // App's icon is the downloaded icon. + CheckIconsEqual(future.Get()->uncompressed, item->GetDefaultIcon()); +} + +// Adds an app with an empty icon URL and checks if the app gets assigned the +// default placeholder icon. +IN_PROC_BROWSER_TEST_F(RemoteAppsManagerBrowsertest, AddAppPlaceholderIcon) { + // Show launcher UI so that app icons are loaded. + ShowLauncherAppsGrid(); + + const std::string name = "name"; + + // App has id kId1. The downloader returns an empty image that is replaced by + // a placeholder icon. + AddAppAndWaitForIconChange(kExtensionId1, kId1, name, std::string(), GURL(), + gfx::ImageSkia(), /*add_to_front=*/false); + ash::AppListItem* item = GetAppListItem(kId1); + EXPECT_FALSE(item->is_folder()); + EXPECT_EQ(name, item->name()); + + base::test::TestFuture<apps::IconValuePtr> future; + auto iv = std::make_unique<apps::IconValue>(); + iv->icon_type = apps::IconType::kStandard; + iv->uncompressed = + manager_->GetPlaceholderIcon(kId1, /*size_hint_in_dip=*/64); iv->is_placeholder_icon = true; - apps::ApplyIconEffects(icon_effects, 64, std::move(iv), future.GetCallback()); + apps::ApplyIconEffects(apps::IconEffects::kCrOsStandardIcon, + /*size_hint_in_dip=*/64, std::move(iv), + future.GetCallback()); + + // App's icon is placeholder. CheckIconsEqual(future.Get()->uncompressed, item->GetDefaultIcon()); }
diff --git a/chrome/browser/ash/scanning/chrome_scanning_app_delegate.cc b/chrome/browser/ash/scanning/chrome_scanning_app_delegate.cc index 4ea879e..b9584d6d 100644 --- a/chrome/browser/ash/scanning/chrome_scanning_app_delegate.cc +++ b/chrome/browser/ash/scanning/chrome_scanning_app_delegate.cc
@@ -30,7 +30,7 @@ #include "chrome/browser/web_applications/web_app_id_constants.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_service.h" -#include "components/services/app_service/public/mojom/types.mojom.h" +#include "components/services/app_service/public/cpp/app_launch_util.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui.h" #include "ui/base/window_open_disposition.h" @@ -102,7 +102,7 @@ ash::SystemAppLaunchParams params; params.launch_paths = file_paths; - params.launch_source = apps::mojom::LaunchSource::kFromOtherApp; + params.launch_source = apps::LaunchSource::kFromOtherApp; ash::LaunchSystemWebAppAsync(Profile::FromWebUI(web_ui_), ash::SystemWebAppType::MEDIA, params); }
diff --git a/chrome/browser/ash/system_web_apps/system_web_app_manager_browsertest.cc b/chrome/browser/ash/system_web_apps/system_web_app_manager_browsertest.cc index 558cbc9..154f3ba 100644 --- a/chrome/browser/ash/system_web_apps/system_web_app_manager_browsertest.cc +++ b/chrome/browser/ash/system_web_apps/system_web_app_manager_browsertest.cc
@@ -194,7 +194,7 @@ navigation_observer.StartWatchingNewWebContents(); ash::SystemAppLaunchParams params; - params.launch_source = apps::mojom::LaunchSource::kFromAppListGrid; + params.launch_source = apps::LaunchSource::kFromAppListGrid; LaunchSystemWebAppAsync(browser()->profile(), GetMockAppType(), params); navigation_observer.Wait(); @@ -402,7 +402,7 @@ ash::SystemAppLaunchParams params; params.launch_paths = {temp_file_path}; - params.launch_source = apps::mojom::LaunchSource::kFromOtherApp; + params.launch_source = apps::LaunchSource::kFromOtherApp; LaunchSystemWebAppAsync(browser()->profile(), GetMockAppType(), params); navigation_observer.Wait();
diff --git a/chrome/browser/ash/web_applications/camera_app/chrome_camera_app_ui_delegate.cc b/chrome/browser/ash/web_applications/camera_app/chrome_camera_app_ui_delegate.cc index 1274a3c..b164b38 100644 --- a/chrome/browser/ash/web_applications/camera_app/chrome_camera_app_ui_delegate.cc +++ b/chrome/browser/ash/web_applications/camera_app/chrome_camera_app_ui_delegate.cc
@@ -36,7 +36,7 @@ #include "chrome/browser/web_applications/web_app_tab_helper.h" #include "chromeos/constants/devicetype.h" #include "chromeos/ui/base/window_properties.h" -#include "components/services/app_service/public/mojom/types.mojom.h" +#include "components/services/app_service/public/cpp/app_launch_util.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui_data_source.h" @@ -239,7 +239,7 @@ ash::SystemAppLaunchParams params; params.launch_paths = {path}; - params.launch_source = apps::mojom::LaunchSource::kFromOtherApp; + params.launch_source = apps::LaunchSource::kFromOtherApp; ash::LaunchSystemWebAppAsync(Profile::FromWebUI(web_ui_), ash::SystemWebAppType::MEDIA, params); }
diff --git a/chrome/browser/ash/web_applications/help_app/help_app_discover_tab_notification.cc b/chrome/browser/ash/web_applications/help_app/help_app_discover_tab_notification.cc index 8e5ab14..4cf4e36 100644 --- a/chrome/browser/ash/web_applications/help_app/help_app_discover_tab_notification.cc +++ b/chrome/browser/ash/web_applications/help_app/help_app_discover_tab_notification.cc
@@ -13,6 +13,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/ash/system_web_apps/system_web_app_ui_utils.h" #include "chromeos/strings/grit/chromeos_strings.h" +#include "components/services/app_service/public/cpp/app_launch_util.h" #include "components/vector_icons/vector_icons.h" #include "ui/base/l10n/l10n_util.h" @@ -54,8 +55,7 @@ kShowHelpAppDiscoverTabNotificationId); ash::SystemAppLaunchParams params; params.url = GURL("chrome://help-app/discover"); - params.launch_source = - apps::mojom::LaunchSource::kFromDiscoverTabNotification; + params.launch_source = apps::LaunchSource::kFromDiscoverTabNotification; LaunchSystemWebAppAsync(profile_, ash::SystemWebAppType::HELP, params); base::RecordAction(
diff --git a/chrome/browser/back_press/android/BUILD.gn b/chrome/browser/back_press/android/BUILD.gn index 79be75dd..d6922fc 100644 --- a/chrome/browser/back_press/android/BUILD.gn +++ b/chrome/browser/back_press/android/BUILD.gn
@@ -59,6 +59,7 @@ "//third_party/android_support_test_runner:runner_java", "//third_party/androidx:androidx_activity_activity_java", "//third_party/androidx:androidx_test_runner_java", + "//third_party/hamcrest:hamcrest_java", "//third_party/junit", "//third_party/mockito:mockito_java", "//ui/android:ui_java_test_support",
diff --git a/chrome/browser/back_press/android/java/src/org/chromium/chrome/browser/back_press/MinimizeAppAndCloseTabBackPressHandler.java b/chrome/browser/back_press/android/java/src/org/chromium/chrome/browser/back_press/MinimizeAppAndCloseTabBackPressHandler.java index 4d403844..5e31c483 100644 --- a/chrome/browser/back_press/android/java/src/org/chromium/chrome/browser/back_press/MinimizeAppAndCloseTabBackPressHandler.java +++ b/chrome/browser/back_press/android/java/src/org/chromium/chrome/browser/back_press/MinimizeAppAndCloseTabBackPressHandler.java
@@ -75,26 +75,33 @@ @Override public void handleBackPress() { - if (mTabModelSelectorSupplier.get() == null) { - assert !shouldUseSystemBack(); - mSendToBackground.onResult(null); - return; - } - Tab currentTab = mTabModelSelectorSupplier.get().getCurrentTab(); - // At this point we know either the tab will close or the app will minimize. - NativePage nativePage = currentTab.getNativePage(); - if (nativePage != null) { - nativePage.notifyHidingWithBack(); + boolean minimizeApp; + boolean shouldCloseTab; + Tab currentTab = null; + + if (mTabModelSelectorSupplier.get() == null + || mTabModelSelectorSupplier.get().getCurrentTab() == null) { + assert !shouldUseSystemBack() + : "Should be disabled when there is no valid tab and back press will be consumed."; + minimizeApp = true; + shouldCloseTab = false; + } else { + currentTab = mTabModelSelectorSupplier.get().getCurrentTab(); + // At this point we know either the tab will close or the app will minimize. + NativePage nativePage = currentTab.getNativePage(); + if (nativePage != null) { + nativePage.notifyHidingWithBack(); + } + + shouldCloseTab = mBackShouldCloseTab.test(currentTab); + + // Minimize the app if either: + // - we decided not to close the tab + // - we decided to close the tab, but it was opened by an external app, so we will go + // exit Chrome on top of closing the tab + minimizeApp = !shouldCloseTab || TabAssociatedApp.isOpenedFromExternalApp(currentTab); } - final boolean shouldCloseTab = mBackShouldCloseTab.test(currentTab); - - // Minimize the app if either: - // - we decided not to close the tab - // - we decided to close the tab, but it was opened by an external app, so we will go - // exit Chrome on top of closing the tab - final boolean minimizeApp = - !shouldCloseTab || TabAssociatedApp.isOpenedFromExternalApp(currentTab); if (minimizeApp) { record(shouldCloseTab ? MinimizeAppAndCloseTabType.MINIMIZE_APP_AND_CLOSE_TAB : MinimizeAppAndCloseTabType.MINIMIZE_APP); @@ -122,7 +129,8 @@ private void onTabModelSelectorAvailable(TabModelSelector tabModelSelector) { mTabModelSelectorSupplier.removeObserver(mOnTabModelSelectorAvailableCallback); if (shouldUseSystemBack()) { - mBackPressSupplier.set(mBackShouldCloseTab.test(tabModelSelector.getCurrentTab())); + Tab tab = tabModelSelector.getCurrentTab(); + mBackPressSupplier.set(tab != null && mBackShouldCloseTab.test(tab)); mTabModelObserver = new TabModelSelectorTabModelObserver(tabModelSelector) { @Override public void didSelectTab(Tab tab, int type, int lastId) {
diff --git a/chrome/browser/back_press/android/java/src/org/chromium/chrome/browser/back_press/MinimizeAppAndCloseTabBackPressHandlerUnitTest.java b/chrome/browser/back_press/android/java/src/org/chromium/chrome/browser/back_press/MinimizeAppAndCloseTabBackPressHandlerUnitTest.java index b64b405b..f930d2dd 100644 --- a/chrome/browser/back_press/android/java/src/org/chromium/chrome/browser/back_press/MinimizeAppAndCloseTabBackPressHandlerUnitTest.java +++ b/chrome/browser/back_press/android/java/src/org/chromium/chrome/browser/back_press/MinimizeAppAndCloseTabBackPressHandlerUnitTest.java
@@ -8,6 +8,7 @@ import androidx.test.filters.SmallTest; +import org.hamcrest.Matchers; import org.junit.After; import org.junit.AfterClass; import org.junit.Assert; @@ -15,6 +16,7 @@ import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; +import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; @@ -47,6 +49,9 @@ @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule(); + @Rule + public ExpectedException thrown = ExpectedException.none(); + @Mock private TabModelSelector mTabModelSelector; @@ -173,6 +178,49 @@ Assert.assertFalse("Back press should be handled by OS.", mHandler.getHandleBackPressChangedSupplier().get()); + Assert.assertEquals(0, d1.getDelta()); + } + + @Test + @SmallTest + public void testMinimizeApp_NoValidTab() { + HistogramDelta d1 = new HistogramDelta(MinimizeAppAndCloseTabBackPressHandler.HISTOGRAM, + MinimizeAppAndCloseTabType.MINIMIZE_APP); + Mockito.when(mTabModelSelector.getCurrentTab()).thenReturn(null); + TestThreadUtils.runOnUiThreadBlocking( + () -> { mTabModelSelectorObservableSupplier.set(mTabModelSelector); }); + mHandler.handleBackPress(); + + Mockito.verify(mSendToBackground).onResult(null); + Mockito.verify(mSendToBackground, + Mockito.description("App should be minimized without closing any tab")) + .onResult(null); + Assert.assertEquals(1, d1.getDelta()); + } + + @Test + @SmallTest + public void testMinimizeApp_NoValidTab_SystemBack() { + createBackPressHandler(true); + + HistogramDelta d1 = new HistogramDelta(MinimizeAppAndCloseTabBackPressHandler.HISTOGRAM, + MinimizeAppAndCloseTabType.MINIMIZE_APP); + Mockito.when(mTabModelSelector.getCurrentTab()).thenReturn(null); + TestThreadUtils.runOnUiThreadBlocking( + () -> { mTabModelSelectorObservableSupplier.set(mTabModelSelector); }); + + Assert.assertFalse("Back press should be handled by OS.", + mHandler.getHandleBackPressChangedSupplier().get()); + + thrown.expect(Matchers.instanceOf(AssertionError.class)); + thrown.expectMessage( + "Should be disabled when there is no valid tab and back press will be consumed."); + + mHandler.handleBackPress(); + + Mockito.verify(mSendToBackground, Mockito.never()).onResult(Mockito.any()); + Mockito.verify(mShouldCloseTab, Mockito.never()).test(Mockito.any()); + Assert.assertEquals(0, d1.getDelta()); } private void createBackPressHandler() {
diff --git a/chrome/browser/commerce/price_tracking/android/java/src/org/chromium/chrome/browser/price_tracking/PriceTrackingButtonController.java b/chrome/browser/commerce/price_tracking/android/java/src/org/chromium/chrome/browser/price_tracking/PriceTrackingButtonController.java index 8c5b489f..2768a58 100644 --- a/chrome/browser/commerce/price_tracking/android/java/src/org/chromium/chrome/browser/price_tracking/PriceTrackingButtonController.java +++ b/chrome/browser/commerce/price_tracking/android/java/src/org/chromium/chrome/browser/price_tracking/PriceTrackingButtonController.java
@@ -21,6 +21,8 @@ import org.chromium.chrome.browser.toolbar.ButtonDataProvider; import org.chromium.chrome.browser.toolbar.adaptive.AdaptiveToolbarFeatures; import org.chromium.chrome.browser.toolbar.adaptive.AdaptiveToolbarFeatures.AdaptiveToolbarButtonVariant; +import org.chromium.chrome.browser.user_education.IPHCommandBuilder; +import org.chromium.components.feature_engagement.FeatureConstants; /** * Responsible for providing UI resources for showing price tracking action on optional toolbar @@ -79,6 +81,10 @@ return; } - // TODO(shaktisahu): Implement IPH and update button data. + IPHCommandBuilder iphCommandBuilder = new IPHCommandBuilder(tab.getContext().getResources(), + FeatureConstants.CONTEXTUAL_PAGE_ACTIONS_PRICE_TRACKING, + /* stringId = */ R.string.iph_price_tracking_menu_item, + /* accessibilityStringId = */ R.string.iph_price_tracking_menu_item); + mButtonData.updateIPHCommandBuilder(iphCommandBuilder); } }
diff --git a/chrome/browser/devtools/protocol/page_handler.cc b/chrome/browser/devtools/protocol/page_handler.cc index cfdc76a9..a286ee1 100644 --- a/chrome/browser/devtools/protocol/page_handler.cc +++ b/chrome/browser/devtools/protocol/page_handler.cc
@@ -7,6 +7,7 @@ #include "base/strings/utf_string_conversions.h" #include "chrome/browser/web_applications/web_app_helpers.h" #include "components/payments/content/payment_request_web_contents_manager.h" +#include "components/printing/browser/print_to_pdf/pdf_print_result.h" #include "components/subresource_filter/content/browser/devtools_interaction_tracker.h" #include "third_party/blink/public/common/features.h" #include "third_party/blink/public/common/manifest/manifest_util.h" @@ -274,14 +275,13 @@ } #if BUILDFLAG(ENABLE_PRINTING) -void PageHandler::OnPDFCreated( - bool return_as_stream, - std::unique_ptr<PrintToPDFCallback> callback, - print_to_pdf::PdfPrintManager::PrintResult print_result, - scoped_refptr<base::RefCountedMemory> data) { - if (print_result != print_to_pdf::PdfPrintManager::PRINT_SUCCESS) { +void PageHandler::OnPDFCreated(bool return_as_stream, + std::unique_ptr<PrintToPDFCallback> callback, + print_to_pdf::PdfPrintResult print_result, + scoped_refptr<base::RefCountedMemory> data) { + if (print_result != print_to_pdf::PdfPrintResult::PRINT_SUCCESS) { callback->sendFailure(protocol::Response::ServerError( - print_to_pdf::PdfPrintManager::PrintResultToString(print_result))); + print_to_pdf::PdfPrintResultToString(print_result))); return; }
diff --git a/chrome/browser/devtools/protocol/page_handler.h b/chrome/browser/devtools/protocol/page_handler.h index b589cb5e..4d7f1d90 100644 --- a/chrome/browser/devtools/protocol/page_handler.h +++ b/chrome/browser/devtools/protocol/page_handler.h
@@ -85,7 +85,7 @@ #if BUILDFLAG(ENABLE_PRINTING) void OnPDFCreated(bool return_as_stream, std::unique_ptr<PrintToPDFCallback> callback, - print_to_pdf::PdfPrintManager::PrintResult print_result, + print_to_pdf::PdfPrintResult print_result, scoped_refptr<base::RefCountedMemory> data); #endif
diff --git a/chrome/browser/download/download_prefs.cc b/chrome/browser/download/download_prefs.cc index 3813246..ade4a6d7 100644 --- a/chrome/browser/download/download_prefs.cc +++ b/chrome/browser/download/download_prefs.cc
@@ -684,8 +684,7 @@ PrefService* prefs = profile_->GetPrefs(); for (const auto& extension : - prefs->GetList(prefs::kDownloadExtensionsToOpenByPolicy) - ->GetListDeprecated()) { + prefs->GetValueList(prefs::kDownloadExtensionsToOpenByPolicy)) { base::FilePath::StringType extension_string = StringToFilePathString(extension.GetString()); auto_open_by_policy_.insert(extension_string); @@ -697,18 +696,19 @@ std::make_unique<policy::URLBlocklist>(); PrefService* prefs = profile_->GetPrefs(); - const auto* list = prefs->GetList(prefs::kDownloadAllowedURLsForOpenByPolicy); + const auto& list = + prefs->GetValueList(prefs::kDownloadAllowedURLsForOpenByPolicy); // We only need to configure |allowed_urls| if something is set by policy, // otherwise the default object does what we want. - if (list->GetListDeprecated().size() != 0) { - allowed_urls->Allow(&base::Value::AsListValue(*list)); + if (list.size() != 0) { + allowed_urls->Allow(list); // Since we only want to auto-open for the specified urls, block everything // else. - auto blocked = std::make_unique<base::ListValue>(); - blocked->Append("*"); - allowed_urls->Block(blocked.get()); + auto blocked = base::Value::List(); + blocked.Append("*"); + allowed_urls->Block(blocked); } auto_open_allowed_by_urls_.swap(allowed_urls);
diff --git a/chrome/browser/enterprise/connectors/analysis/analysis_service_settings.cc b/chrome/browser/enterprise/connectors/analysis/analysis_service_settings.cc index 240109dc..d2f7258a 100644 --- a/chrome/browser/enterprise/connectors/analysis/analysis_service_settings.cc +++ b/chrome/browser/enterprise/connectors/analysis/analysis_service_settings.cc
@@ -241,7 +241,7 @@ return; url_matcher::util::AddFilters(matcher_.get(), enabled, id, - &base::Value::AsListValue(*url_list)); + url_list->GetList()); if (enabled) enabled_patterns_settings_[*id] = std::move(setting);
diff --git a/chrome/browser/enterprise/connectors/connectors_prefs.cc b/chrome/browser/enterprise/connectors/connectors_prefs.cc index ba7b68a..7f3b0db 100644 --- a/chrome/browser/enterprise/connectors/connectors_prefs.cc +++ b/chrome/browser/enterprise/connectors/connectors_prefs.cc
@@ -34,10 +34,10 @@ const char kContextAwareAccessSignalsAllowlistPref[] = "enterprise_connectors.device_trust.origins"; -const char kDeviceTrustPrivateKeyPref[] = - "enterprise_connectors.device_trust.private_key"; -const char kDeviceTrustPublicKeyPref[] = - "enterprise_connectors.device_trust.public_key"; +#if BUILDFLAG(IS_MAC) +const char kDeviceTrustDisableKeyCreationPref[] = + "enterprise_connectors.device_trust.disable_key_creation"; +#endif const char kOnFileAttachedScopePref[] = "enterprise_connectors.scope.on_file_attached"; @@ -90,9 +90,10 @@ RegisterFileSystemPrefs(registry); } +#if BUILDFLAG(IS_MAC) void RegisterLocalPrefs(PrefRegistrySimple* registry) { - registry->RegisterStringPref(kDeviceTrustPrivateKeyPref, std::string()); - registry->RegisterStringPref(kDeviceTrustPublicKeyPref, std::string()); + registry->RegisterBooleanPref(kDeviceTrustDisableKeyCreationPref, false); } +#endif } // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/connectors_prefs.h b/chrome/browser/enterprise/connectors/connectors_prefs.h index e9346f9..bd915ed4 100644 --- a/chrome/browser/enterprise/connectors/connectors_prefs.h +++ b/chrome/browser/enterprise/connectors/connectors_prefs.h
@@ -5,6 +5,7 @@ #ifndef CHROME_BROWSER_ENTERPRISE_CONNECTORS_CONNECTORS_PREFS_H_ #define CHROME_BROWSER_ENTERPRISE_CONNECTORS_CONNECTORS_PREFS_H_ +#include "build/build_config.h" #include "build/chromeos_buildflags.h" class PrefRegistrySimple; @@ -48,18 +49,20 @@ #endif extern const char kOnSecurityEventScopePref[]; -// The pref name where this class stores the encrypted private key. -// If the machine supports storage in TPM, the private key will be -// stored there; otherwise, it will be stored in the local state. -extern const char kDeviceTrustPrivateKeyPref[]; -// The pref name where this class stores the public key; -// If the machine supports storage in TPM, the public key will be -// stored there; owtherwise, it will be stored in the local state. -extern const char kDeviceTrustPublicKeyPref[]; +#if BUILDFLAG(IS_MAC) +// The pref on whether the device trust key creation is disabled for the +// current user. The device trust key creation is disabled when a key for +// the device is already present on the Server but a key upload is +// requested with a another key not signed by the previous one. The key +// creation is enabled by default. +extern const char kDeviceTrustDisableKeyCreationPref[]; +#endif void RegisterProfilePrefs(PrefRegistrySimple* registry); +#if BUILDFLAG(IS_MAC) void RegisterLocalPrefs(PrefRegistrySimple* registry); +#endif } // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/device_trust/device_trust_connector_service.cc b/chrome/browser/enterprise/connectors/device_trust/device_trust_connector_service.cc index 7c82a03..fbc3f5b 100644 --- a/chrome/browser/enterprise/connectors/device_trust/device_trust_connector_service.cc +++ b/chrome/browser/enterprise/connectors/device_trust/device_trust_connector_service.cc
@@ -16,13 +16,13 @@ namespace { -const base::Value* GetPolicyUrlPatterns(PrefService* prefs) { - return prefs->GetList(kContextAwareAccessSignalsAllowlistPref); +const base::Value::List& GetPolicyUrlPatterns(PrefService* prefs) { + return prefs->GetValueList(kContextAwareAccessSignalsAllowlistPref); } bool ConnectorPolicyHasValues(PrefService* profile_prefs) { - const auto* list = GetPolicyUrlPatterns(profile_prefs); - return list && !list->GetListDeprecated().empty(); + const auto& list = GetPolicyUrlPatterns(profile_prefs); + return !list.empty(); } } // namespace @@ -79,17 +79,16 @@ void DeviceTrustConnectorService::OnPolicyUpdated() { DCHECK(IsDeviceTrustConnectorFeatureEnabled()); - const base::Value* url_patterns = GetPolicyUrlPatterns(profile_prefs_); + const base::Value::List& url_patterns = GetPolicyUrlPatterns(profile_prefs_); if (!matcher_ || !matcher_->IsEmpty()) { // Reset the matcher. matcher_ = std::make_unique<url_matcher::URLMatcher>(); } - if (url_patterns && !url_patterns->GetListDeprecated().empty()) { + if (!url_patterns.empty()) { // Add the new endpoints to the conditions. - url_matcher::util::AddAllowFilters( - matcher_.get(), &base::Value::AsListValue(*url_patterns)); + url_matcher::util::AddAllowFilters(matcher_.get(), url_patterns); // Call the hook which signals that the connector has been enabled. OnConnectorEnabled();
diff --git a/chrome/browser/enterprise/connectors/file_system/service_settings.cc b/chrome/browser/enterprise/connectors/file_system/service_settings.cc index eb9195a..893c706 100644 --- a/chrome/browser/enterprise/connectors/file_system/service_settings.cc +++ b/chrome/browser/enterprise/connectors/file_system/service_settings.cc
@@ -200,19 +200,21 @@ } // Add the URL patterns to the matcher and store the condition set IDs. - const base::Value* url_list = url_settings_value.FindListKey(kKeyUrlList); - if (!url_list) { + const base::Value* url_list_value = + url_settings_value.FindListKey(kKeyUrlList); + if (!url_list_value) { DLOG(ERROR) << "Can't find " << kKeyUrlList << url_settings_value; return false; } - for (const base::Value& url : url_list->GetListDeprecated()) + const base::Value::List& url_list = url_list_value->GetList(); + + for (const base::Value& url : url_list) CHECK(url.is_string()); // This pre-increments the id by size of url_list_value. URLMatchingID pre_id = *id; - url_matcher::util::AddFilters(url_matcher_.get(), enabled, id, - &base::Value::AsListValue(*url_list)); + url_matcher::util::AddFilters(url_matcher_.get(), enabled, id, url_list); const base::Value* mime_types = url_settings_value.FindListKey(kKeyMimeTypes); if (!mime_types)
diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUILD.gn index 5c1ddbf..d6d2080 100644 --- a/chrome/browser/extensions/BUILD.gn +++ b/chrome/browser/extensions/BUILD.gn
@@ -1001,6 +1001,8 @@ "chromeos_browser_context_keyed_service_factories.h", "clipboard_extension_helper_chromeos.cc", "clipboard_extension_helper_chromeos.h", + "extension_keeplist_chromeos.cc", + "extension_keeplist_chromeos.h", "system_display/system_display_serialization.cc", "system_display/system_display_serialization.h", ] @@ -1116,8 +1118,6 @@ "extension_assets_manager_chromeos.h", "extension_garbage_collector_chromeos.cc", "extension_garbage_collector_chromeos.h", - "extension_keeplist_ash.cc", - "extension_keeplist_ash.h", "system_display/display_info_provider_chromeos.cc", "system_display/display_info_provider_chromeos.h", "updater/chromeos_extension_cache_delegate.cc",
diff --git a/chrome/browser/extensions/ash_extension_keeplist_manager.cc b/chrome/browser/extensions/ash_extension_keeplist_manager.cc index 57e4212..0dfc3050 100644 --- a/chrome/browser/extensions/ash_extension_keeplist_manager.cc +++ b/chrome/browser/extensions/ash_extension_keeplist_manager.cc
@@ -9,7 +9,7 @@ #include "base/feature_list.h" #include "chrome/browser/ash/crosapi/browser_util.h" #include "chrome/browser/ash/crosapi/hosted_app_util.h" -#include "chrome/browser/extensions/extension_keeplist_ash.h" +#include "chrome/browser/extensions/extension_keeplist_chromeos.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/profiles/profile.h" #include "components/app_constants/constants.h" @@ -55,12 +55,12 @@ bool AshExtensionKeeplistManager::ShouldDisable( const Extension* extension) const { - if (extension->is_extension() && !ExtensionRunsInAsh(extension->id())) + if (extension->is_extension() && !ExtensionRunsInOS(extension->id())) return true; if (extension->is_platform_app() && crosapi::browser_util::IsLacrosChromeAppsEnabled() && - !ExtensionAppRunsInAsh(extension->id())) { + !ExtensionAppRunsInOS(extension->id())) { return true; }
diff --git a/chrome/browser/extensions/extension_bindings_apitest.cc b/chrome/browser/extensions/extension_bindings_apitest.cc index 1f5c1fe..135cc3e 100644 --- a/chrome/browser/extensions/extension_bindings_apitest.cc +++ b/chrome/browser/extensions/extension_bindings_apitest.cc
@@ -270,7 +270,7 @@ }; // This tests that web pages with iframes or child windows pointing at -// chrome-extenison:// urls, both web_accessible and nonexistent pages, don't +// chrome-extension:// urls, both web_accessible and nonexistent pages, don't // get improper extensions bindings injected while they briefly still point at // about:blank and are still scriptable by their parent. //
diff --git a/chrome/browser/extensions/extension_keeplist_ash.cc b/chrome/browser/extensions/extension_keeplist_ash.cc deleted file mode 100644 index 3594c6a..0000000 --- a/chrome/browser/extensions/extension_keeplist_ash.cc +++ /dev/null
@@ -1,52 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/extensions/extension_keeplist_ash.h" - -#include <stddef.h> - -#include "base/containers/contains.h" -#include "base/no_destructor.h" -#include "base/strings/string_piece.h" -#include "chrome/browser/ash/file_manager/app_id.h" -#include "chrome/browser/ash/input_method/component_extension_ime_manager_delegate_impl.h" -#include "chrome/browser/ui/app_list/arc/arc_app_utils.h" -#include "chrome/common/buildflags.h" -#include "chrome/common/extensions/extension_constants.h" -#include "extensions/common/constants.h" - -namespace extensions { - -bool ExtensionRunsInAsh(const std::string& extension_id) { - static base::NoDestructor<std::set<base::StringPiece>> keep_list( - {extension_misc::kEspeakSpeechSynthesisExtensionId, - extension_misc::kGoogleSpeechSynthesisExtensionId, - extension_misc::kEnhancedNetworkTtsExtensionId, - extension_misc::kSelectToSpeakExtensionId, - extension_misc::kAccessibilityCommonExtensionId, - extension_misc::kChromeVoxExtensionId, - extension_misc::kSwitchAccessExtensionId, - extension_misc::kSigninProfileTestExtensionId, - extension_misc::kGuestModeTestExtensionId, - extension_misc::kKeyboardExtensionId, - extension_misc::kHelpAppExtensionId, extension_misc::kGCSEExtensionId, - extension_misc::kGnubbyV3ExtensionId, - extension_misc::kBruSecurityKeyForwarderExtensionId, - file_manager::kImageLoaderExtensionId}); - return base::Contains(*keep_list, extension_id) || - ash::input_method::ComponentExtensionIMEManagerDelegateImpl:: - IsIMEExtensionID(extension_id); -} - -bool ExtensionAppRunsInAsh(const std::string& app_id) { - static base::NoDestructor<std::set<base::StringPiece>> keep_list( - {file_manager::kAudioPlayerAppId, extension_misc::kFilesManagerAppId, - extension_misc::kGoogleKeepAppId, extension_misc::kCalculatorAppId, - extension_misc::kTextEditorAppId, - extension_misc::kInAppPaymentsSupportAppId, arc::kPlayStoreAppId, - extension_misc::kIdentityApiUiAppId, extension_misc::kGnubbyAppId}); - return base::Contains(*keep_list, app_id); -} - -} // namespace extensions
diff --git a/chrome/browser/extensions/extension_keeplist_ash.h b/chrome/browser/extensions/extension_keeplist_ash.h deleted file mode 100644 index 9705bab..0000000 --- a/chrome/browser/extensions/extension_keeplist_ash.h +++ /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. - -#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_KEEPLIST_ASH_H_ -#define CHROME_BROWSER_EXTENSIONS_EXTENSION_KEEPLIST_ASH_H_ - -#include <string> - -namespace extensions { - -// Returns true if the extension is kept to run in Ash. A small list of -// 1st party extensions will continue to run in Ash either since they are -// used to support Chrome OS features such as text to speech or vox, -// or they are not compatible with Lacros yet. -bool ExtensionRunsInAsh(const std::string& extension_id); - -// Some extension apps will continue to run in Ash until they are either -// deprecated or migrated. This function returns whether a given app_id is on -// that keep list. This function must only be called from the UI thread. -bool ExtensionAppRunsInAsh(const std::string& app_id); - -} // namespace extensions - -#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_KEEPLIST_ASH_H_
diff --git a/chrome/browser/extensions/extension_keeplist_chromeos.cc b/chrome/browser/extensions/extension_keeplist_chromeos.cc new file mode 100644 index 0000000..0e701241 --- /dev/null +++ b/chrome/browser/extensions/extension_keeplist_chromeos.cc
@@ -0,0 +1,76 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/extensions/extension_keeplist_chromeos.h" + +#include <stddef.h> +#include <set> + +#include "base/containers/contains.h" +#include "base/no_destructor.h" +#include "base/strings/string_piece.h" +#include "build/chromeos_buildflags.h" +#include "chrome/common/buildflags.h" +#include "chrome/common/extensions/extension_constants.h" +#include "extensions/common/constants.h" + +#if BUILDFLAG(IS_CHROMEOS_ASH) +#include "chrome/browser/ash/file_manager/app_id.h" +#include "chrome/browser/ash/input_method/component_extension_ime_manager_delegate_impl.h" +#include "chrome/browser/ui/app_list/arc/arc_app_utils.h" +#endif + +namespace extensions { + +bool ExtensionRunsInBothOSAndStandaloneBrowser( + const std::string& extension_id) { + static base::NoDestructor<std::set<base::StringPiece>> keep_list( + {extension_misc::kGCSEExtensionId, extension_misc::kGnubbyV3ExtensionId}); + return base::Contains(*keep_list, extension_id); +} + +bool ExtensionRunsInOS(const std::string& extension_id) { + static base::NoDestructor<std::set<base::StringPiece>> keep_list({ +#if BUILDFLAG(IS_CHROMEOS_ASH) + extension_misc::kEspeakSpeechSynthesisExtensionId, + extension_misc::kGoogleSpeechSynthesisExtensionId, + extension_misc::kEnhancedNetworkTtsExtensionId, + extension_misc::kSelectToSpeakExtensionId, + extension_misc::kAccessibilityCommonExtensionId, + extension_misc::kSwitchAccessExtensionId, + extension_misc::kSigninProfileTestExtensionId, + extension_misc::kGuestModeTestExtensionId, + extension_misc::kHelpAppExtensionId, + file_manager::kImageLoaderExtensionId, +#endif + extension_misc::kKeyboardExtensionId, + extension_misc::kChromeVoxExtensionId, + extension_misc::kBruSecurityKeyForwarderExtensionId, + }); + bool is_ime = false; +#if BUILDFLAG(IS_CHROMEOS_ASH) + is_ime = ash::input_method::ComponentExtensionIMEManagerDelegateImpl:: + IsIMEExtensionID(extension_id); +#endif + + return ExtensionRunsInBothOSAndStandaloneBrowser(extension_id) || + base::Contains(*keep_list, extension_id) || is_ime; +} + +bool ExtensionAppRunsInOS(const std::string& app_id) { + static base::NoDestructor<std::set<base::StringPiece>> keep_list({ +#if BUILDFLAG(IS_CHROMEOS_ASH) + arc::kPlayStoreAppId, extension_misc::kFilesManagerAppId, + file_manager::kAudioPlayerAppId, +#endif + + extension_misc::kGoogleKeepAppId, extension_misc::kCalculatorAppId, + extension_misc::kTextEditorAppId, + extension_misc::kInAppPaymentsSupportAppId, + extension_misc::kIdentityApiUiAppId, extension_misc::kGnubbyAppId + }); + return base::Contains(*keep_list, app_id); +} + +} // namespace extensions
diff --git a/chrome/browser/extensions/extension_keeplist_chromeos.h b/chrome/browser/extensions/extension_keeplist_chromeos.h new file mode 100644 index 0000000..75fbea2 --- /dev/null +++ b/chrome/browser/extensions/extension_keeplist_chromeos.h
@@ -0,0 +1,32 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_KEEPLIST_CHROMEOS_H_ +#define CHROME_BROWSER_EXTENSIONS_EXTENSION_KEEPLIST_CHROMEOS_H_ + +#include <string> + +namespace extensions { + +// By default most extensions will not work properly if they run in both ash and +// lacros. This is the list of exceptions. +bool ExtensionRunsInBothOSAndStandaloneBrowser(const std::string& extension_id); + +// Returns true if the extension is kept to run in Ash. A small list of 1st +// party extensions will continue to run in Ash either since they are used to +// support Chrome OS features such as text to speech or vox, or they are not +// compatible with Lacros yet. When this method is invoked in Lacros, it may not +// know about OS-specific extensions that are compiled into ash. +bool ExtensionRunsInOS(const std::string& extension_id); + +// Some extension apps will continue to run in Ash until they are either +// deprecated or migrated. This function returns whether a given app_id is on +// that keep list. This function must only be called from the UI thread. When +// this method is invoked in Lacros, it may not know about OS-specific +// extensions that are compiled into ash. +bool ExtensionAppRunsInOS(const std::string& app_id); + +} // namespace extensions + +#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_KEEPLIST_CHROMEOS_H_
diff --git a/chrome/browser/external_protocol/external_protocol_handler.cc b/chrome/browser/external_protocol/external_protocol_handler.cc index a2d3381d..1ba0226 100644 --- a/chrome/browser/external_protocol/external_protocol_handler.cc +++ b/chrome/browser/external_protocol/external_protocol_handler.cc
@@ -263,15 +263,14 @@ const base::Value::List& exempted_protocols = prefs->GetValueList(prefs::kAutoLaunchProtocolsFromOrigins); - const base::Value* origin_patterns = nullptr; + const base::Value::List* origin_patterns = nullptr; for (const base::Value& entry : exempted_protocols) { - const base::DictionaryValue& protocol_origins_map = - base::Value::AsDictionaryValue(entry); - const std::string* protocol = protocol_origins_map.FindStringKey( + const base::Value::Dict& protocol_origins_map = entry.GetDict(); + const std::string* protocol = protocol_origins_map.FindString( policy::external_protocol::kProtocolNameKey); DCHECK(protocol); if (*protocol == scheme) { - origin_patterns = protocol_origins_map.FindListKey( + origin_patterns = protocol_origins_map.FindList( policy::external_protocol::kOriginListKey); break; } @@ -282,7 +281,7 @@ url_matcher::URLMatcher matcher; base::MatcherStringPattern::ID id(0); url_matcher::util::AddFilters(&matcher, true /* allowed */, &id, - &base::Value::AsListValue(*origin_patterns)); + *origin_patterns); auto matching_set = matcher.MatchURL(initiating_origin->GetURL()); return !matching_set.empty();
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index cd78a27..2c0f39e 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -4771,6 +4771,11 @@ "expiry_milestone": 108 }, { + "name": "omnibox-remove-suggestion-header-chevron", + "owners": [ "rongtan", "ender", "chrome-omnibox-team@google.com" ], + "expiry_milestone": 110 + }, + { "name": "omnibox-retain-suggestions-with-headers", "owners": [ "ender@google.com", "mahmadi@google.com", "chrome-omnibox-team@google.com" ], "expiry_milestone": 112
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 648134d..570945f 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -1905,6 +1905,11 @@ "Permits longer MV Tiles titles to wrap around to the second line " "to reduce ellipsizing longer titles."; +const char kOmniboxRemoveSuggestionHeaderChevronName[] = + "Omnibox Remove Suggestion Header Chevron"; +const char kOmniboxRemoveSuggestionHeaderChevronDescription[] = + "Remove the chevron on the right side of omnibox suggestion search header."; + const char kOmniboxTrendingZeroPrefixSuggestionsOnNTPName[] = "Omnibox Trending Zero Prefix Suggestions"; const char kOmniboxTrendingZeroPrefixSuggestionsOnNTPDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index b70fd15d..64229eb9 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -1083,6 +1083,9 @@ extern const char kOmniboxOnDeviceHeadSuggestionsIncognitoName[]; extern const char kOmniboxOnDeviceHeadSuggestionsIncognitoDescription[]; +extern const char kOmniboxRemoveSuggestionHeaderChevronName[]; +extern const char kOmniboxRemoveSuggestionHeaderChevronDescription[]; + extern const char kOmniboxRichAutocompletionPromisingName[]; extern const char kOmniboxRichAutocompletionPromisingDescription[];
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc index 860ebbef..3b75b85 100644 --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -39,6 +39,7 @@ #include "components/embedder_support/android/util/cdn_utils.h" #include "components/feature_engagement/public/feature_list.h" #include "components/feed/feed_feature_list.h" +#include "components/history/core/browser/features.h" #include "components/history_clusters/core/features.h" #include "components/invalidation/impl/invalidation_switches.h" #include "components/language/core/common/language_experiments.h" @@ -155,6 +156,7 @@ &feed::kWebFeedOnboarding, &feed::kWebFeedSort, &feed::kXsurfaceMetricsReporting, + &history::kOrganicRepeatableQueries, &history_clusters::internal::kJourneys, &kAdaptiveButtonInTopToolbar, &kAdaptiveButtonInTopToolbarCustomizationV2, @@ -349,6 +351,7 @@ &omnibox::kMostVisitedTilesTitleWrapAround, &omnibox::kOmniboxAssistantVoiceSearch, &omnibox::kOmniboxSpareRenderer, + &omnibox::kOmniboxRemoveSuggestionHeaderChevron, &omnibox::kSuggestionAnswersColorReverse, &omnibox::kUpdatedConnectionSecurityIndicators, &optimization_guide::features::kPushNotifications, @@ -396,6 +399,7 @@ &video_tutorials::features::kVideoTutorials, &webapps::features::kInstallableAmbientBadgeInfoBar, &webapps::features::kInstallableAmbientBadgeMessage, + &webapps::features::kWebApkUniqueId, }; const base::Feature* FindFeatureExposedToJava(const std::string& feature_name) {
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java index a6f52d5..44d2d24 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java
@@ -240,13 +240,9 @@ /** * Caches flags that must take effect on startup but are set via native code. */ - public static void cacheNativeFlags(List<String> featuresToCache) { - for (String featureName : featuresToCache) { - if (!sDefaults.containsKey(featureName)) { - throw new IllegalArgumentException( - "Feature " + featureName + " has no default in CachedFeatureFlags."); - } - cacheFeature(featureName); + public static void cacheNativeFlags(List<CachedFlag> featuresToCache) { + for (CachedFlag feature : featuresToCache) { + feature.cacheFeature(); } }
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlagsSafeModeUnitTest.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlagsSafeModeUnitTest.java index cf0999f..437140e9 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlagsSafeModeUnitTest.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlagsSafeModeUnitTest.java
@@ -22,7 +22,6 @@ import java.util.Arrays; import java.util.HashMap; -import java.util.Map; /** * Unit Tests for the Safe Mode mechanism for {@link CachedFeatureFlags}. @@ -36,23 +35,19 @@ public class CachedFeatureFlagsSafeModeUnitTest { private static final String CRASHY_FEATURE = "CrashyFeature"; private static final String OK_FEATURE = "OkFeature"; - - Map<String, Boolean> mDefaultsSwapped; + private static final CachedFlag sCrashyFeature = new CachedFlag(CRASHY_FEATURE, false); + private static final CachedFlag sOkFeature = new CachedFlag(OK_FEATURE, false); @Before public void setUp() { CachedFeatureFlags.setSafeModeExperimentEnabledForTesting(true); CachedFeatureFlags.resetFlagsForTesting(); - Map<String, Boolean> defaults = makeFeatureMap(false, false); - mDefaultsSwapped = CachedFeatureFlags.swapDefaultsForTesting(defaults); } @After public void tearDown() { CachedFeatureFlags.setSafeModeExperimentEnabledForTesting(null); CachedFeatureFlags.resetFlagsForTesting(); - CachedFeatureFlags.swapDefaultsForTesting(mDefaultsSwapped); - FeatureList.setTestFeatures(null); CachedFlagsSafeMode.clearDiskForTesting(); } @@ -65,8 +60,8 @@ // There are no cached flag values, so the defaults false/false are used. assertEquals(Behavior.NOT_ENGAGED_BELOW_THRESHOLD, CachedFeatureFlags.getSafeModeBehaviorForTesting()); - assertFalse(CachedFeatureFlags.isEnabled(CRASHY_FEATURE)); - assertFalse(CachedFeatureFlags.isEnabled(OK_FEATURE)); + assertFalse(sCrashyFeature.isEnabled()); + assertFalse(sOkFeature.isEnabled()); endCleanRun(false, true); // Safe values became false/false. // Cached values became false/true. @@ -77,8 +72,8 @@ // Cached flag values are false/true, from previous run. assertEquals(Behavior.NOT_ENGAGED_BELOW_THRESHOLD, CachedFeatureFlags.getSafeModeBehaviorForTesting()); - assertFalse(CachedFeatureFlags.isEnabled(CRASHY_FEATURE)); - assertTrue(CachedFeatureFlags.isEnabled(OK_FEATURE)); + assertFalse(sCrashyFeature.isEnabled()); + assertTrue(sOkFeature.isEnabled()); endCleanRun(true, true); // Safe values became false/true. // Cached values became true(crashy)/true. @@ -89,8 +84,8 @@ // Cached values remain true(crashy)/true and are used. assertEquals(Behavior.NOT_ENGAGED_BELOW_THRESHOLD, CachedFeatureFlags.getSafeModeBehaviorForTesting()); - assertTrue(CachedFeatureFlags.isEnabled(CRASHY_FEATURE)); - assertTrue(CachedFeatureFlags.isEnabled(OK_FEATURE)); + assertTrue(sCrashyFeature.isEnabled()); + assertTrue(sOkFeature.isEnabled()); endCrashyRun(); // Cached values remain true(crashy)/true. @@ -100,8 +95,8 @@ // Cached values remain true(crashy)/true and are used. assertEquals(Behavior.NOT_ENGAGED_BELOW_THRESHOLD, CachedFeatureFlags.getSafeModeBehaviorForTesting()); - assertTrue(CachedFeatureFlags.isEnabled(CRASHY_FEATURE)); - assertTrue(CachedFeatureFlags.isEnabled(OK_FEATURE)); + assertTrue(sCrashyFeature.isEnabled()); + assertTrue(sOkFeature.isEnabled()); endCrashyRun(); // Cached values remain true(crashy)/true. @@ -245,8 +240,8 @@ // There are no cached flag values, so the defaults false/false are used. assertEquals(Behavior.NOT_ENGAGED_BELOW_THRESHOLD, CachedFeatureFlags.getSafeModeBehaviorForTesting()); - assertFalse(CachedFeatureFlags.isEnabled(CRASHY_FEATURE)); - assertFalse(CachedFeatureFlags.isEnabled(OK_FEATURE)); + assertFalse(sCrashyFeature.isEnabled()); + assertFalse(sOkFeature.isEnabled()); endCleanRun(true, true); // Safe values became false/false. // Cached values became true(flaky)/true. @@ -257,8 +252,8 @@ // Cached flag values are true(flaky)/true. assertEquals(Behavior.NOT_ENGAGED_BELOW_THRESHOLD, CachedFeatureFlags.getSafeModeBehaviorForTesting()); - assertTrue(CachedFeatureFlags.isEnabled(CRASHY_FEATURE)); - assertTrue(CachedFeatureFlags.isEnabled(OK_FEATURE)); + assertTrue(sCrashyFeature.isEnabled()); + assertTrue(sOkFeature.isEnabled()); endCrashyRun(); // Cached values remain true(crashy)/true. @@ -269,8 +264,8 @@ assertEquals(Behavior.NOT_ENGAGED_BELOW_THRESHOLD, CachedFeatureFlags.getSafeModeBehaviorForTesting()); // Cached flag values are the flaky ones cached from native. - assertTrue(CachedFeatureFlags.isEnabled(CRASHY_FEATURE)); - assertTrue(CachedFeatureFlags.isEnabled(OK_FEATURE)); + assertTrue(sCrashyFeature.isEnabled()); + assertTrue(sOkFeature.isEnabled()); endCleanRun(true, true); // Safe values became true(flaky)/true. // Cached values remain true(flaky)/true. @@ -281,8 +276,8 @@ // Cached flag values are true(flaky)/true. assertEquals(Behavior.NOT_ENGAGED_BELOW_THRESHOLD, CachedFeatureFlags.getSafeModeBehaviorForTesting()); - assertTrue(CachedFeatureFlags.isEnabled(CRASHY_FEATURE)); - assertTrue(CachedFeatureFlags.isEnabled(OK_FEATURE)); + assertTrue(sCrashyFeature.isEnabled()); + assertTrue(sOkFeature.isEnabled()); } /** @@ -297,8 +292,8 @@ // There are no cached flag values, so the defaults false/false are used. assertEquals(Behavior.NOT_ENGAGED_BELOW_THRESHOLD, CachedFeatureFlags.getSafeModeBehaviorForTesting()); - assertFalse(CachedFeatureFlags.isEnabled(CRASHY_FEATURE)); - assertFalse(CachedFeatureFlags.isEnabled(OK_FEATURE)); + assertFalse(sCrashyFeature.isEnabled()); + assertFalse(sOkFeature.isEnabled()); endFirstRunWithKill(); startRun(); @@ -307,8 +302,8 @@ // There are no cached flag values, so the defaults false/false are used. assertEquals(Behavior.NOT_ENGAGED_BELOW_THRESHOLD, CachedFeatureFlags.getSafeModeBehaviorForTesting()); - assertFalse(CachedFeatureFlags.isEnabled(CRASHY_FEATURE)); - assertFalse(CachedFeatureFlags.isEnabled(OK_FEATURE)); + assertFalse(sCrashyFeature.isEnabled()); + assertFalse(sOkFeature.isEnabled()); endFirstRunWithKill(); startRun(); @@ -317,8 +312,8 @@ // There are no cached flag values, so the defaults false/false are used. assertEquals(Behavior.NOT_ENGAGED_BELOW_THRESHOLD, CachedFeatureFlags.getSafeModeBehaviorForTesting()); - assertFalse(CachedFeatureFlags.isEnabled(CRASHY_FEATURE)); - assertFalse(CachedFeatureFlags.isEnabled(OK_FEATURE)); + assertFalse(sCrashyFeature.isEnabled()); + assertFalse(sOkFeature.isEnabled()); } @Test @@ -327,7 +322,7 @@ // implemented and will become rare as clients start writing safe values. // Cache a crashy value. FeatureList.setTestFeatures(makeFeatureMap(true, true)); - CachedFeatureFlags.cacheNativeFlags(Arrays.asList(CRASHY_FEATURE, OK_FEATURE)); + CachedFeatureFlags.cacheNativeFlags(Arrays.asList(sCrashyFeature, sOkFeature)); CachedFeatureFlags.resetFlagsForTesting(); // Cached values became true(crashy)/true. @@ -337,8 +332,8 @@ // Cached values are true(crashy)/true. assertEquals(Behavior.NOT_ENGAGED_BELOW_THRESHOLD, CachedFeatureFlags.getSafeModeBehaviorForTesting()); - assertTrue(CachedFeatureFlags.isEnabled(CRASHY_FEATURE)); - assertTrue(CachedFeatureFlags.isEnabled(OK_FEATURE)); + assertTrue(sCrashyFeature.isEnabled()); + assertTrue(sOkFeature.isEnabled()); endCrashyRun(); // Cached values remain true(crashy)/true. @@ -348,8 +343,8 @@ // Cached values are true(crashy)/true. assertEquals(Behavior.NOT_ENGAGED_BELOW_THRESHOLD, CachedFeatureFlags.getSafeModeBehaviorForTesting()); - assertTrue(CachedFeatureFlags.isEnabled(CRASHY_FEATURE)); - assertTrue(CachedFeatureFlags.isEnabled(OK_FEATURE)); + assertTrue(sCrashyFeature.isEnabled()); + assertTrue(sOkFeature.isEnabled()); endCrashyRun(); // Cached values remain true(crashy)/true. @@ -371,8 +366,8 @@ // There are no cached flag values, so the defaults false/false are used. assertEquals(Behavior.NOT_ENGAGED_BELOW_THRESHOLD, CachedFeatureFlags.getSafeModeBehaviorForTesting()); - assertFalse(CachedFeatureFlags.isEnabled(CRASHY_FEATURE)); - assertFalse(CachedFeatureFlags.isEnabled(OK_FEATURE)); + assertFalse(sCrashyFeature.isEnabled()); + assertFalse(sOkFeature.isEnabled()); endCleanRun(false, true); // Safe values became false/false. // Cached values became false/true. @@ -383,8 +378,8 @@ // Cached flag values are false/true, from previous run. assertEquals(Behavior.NOT_ENGAGED_BELOW_THRESHOLD, CachedFeatureFlags.getSafeModeBehaviorForTesting()); - assertFalse(CachedFeatureFlags.isEnabled(CRASHY_FEATURE)); - assertTrue(CachedFeatureFlags.isEnabled(OK_FEATURE)); + assertFalse(sCrashyFeature.isEnabled()); + assertTrue(sOkFeature.isEnabled()); endCleanRun(true, true); // Safe values became false/true. // Cached values became true(crashy)/true. @@ -401,8 +396,8 @@ // Cached values are true(crashy)/true. assertEquals(Behavior.NOT_ENGAGED_BELOW_THRESHOLD, CachedFeatureFlags.getSafeModeBehaviorForTesting()); - assertTrue(CachedFeatureFlags.isEnabled(CRASHY_FEATURE)); - assertTrue(CachedFeatureFlags.isEnabled(OK_FEATURE)); + assertTrue(sCrashyFeature.isEnabled()); + assertTrue(sOkFeature.isEnabled()); endCrashyRun(); // Cached values remain true(crashy)/true. @@ -412,8 +407,8 @@ // Cached values are true(crashy)/true. assertEquals(Behavior.NOT_ENGAGED_BELOW_THRESHOLD, CachedFeatureFlags.getSafeModeBehaviorForTesting()); - assertTrue(CachedFeatureFlags.isEnabled(CRASHY_FEATURE)); - assertTrue(CachedFeatureFlags.isEnabled(OK_FEATURE)); + assertTrue(sCrashyFeature.isEnabled()); + assertTrue(sOkFeature.isEnabled()); endCrashyRun(); // Cached values remain true(crashy)/true. @@ -435,8 +430,8 @@ // There are no cached flag values, so the defaults false/false are used. assertEquals(Behavior.NOT_ENGAGED_BELOW_THRESHOLD, CachedFeatureFlags.getSafeModeBehaviorForTesting()); - assertFalse(CachedFeatureFlags.isEnabled(CRASHY_FEATURE)); - assertFalse(CachedFeatureFlags.isEnabled(OK_FEATURE)); + assertFalse(sCrashyFeature.isEnabled()); + assertFalse(sOkFeature.isEnabled()); endCleanRun(true, true); // Safe values became false/false. // Cached values became true(flaky)/true. @@ -450,8 +445,8 @@ // Cached flag values are true(flaky)/true. assertEquals(Behavior.NOT_ENGAGED_BELOW_THRESHOLD, CachedFeatureFlags.getSafeModeBehaviorForTesting()); - assertTrue(CachedFeatureFlags.isEnabled(CRASHY_FEATURE)); - assertTrue(CachedFeatureFlags.isEnabled(OK_FEATURE)); + assertTrue(sCrashyFeature.isEnabled()); + assertTrue(sOkFeature.isEnabled()); endCrashyRun(); // Cached values remain true(crashy)/true. @@ -462,7 +457,7 @@ } private void startRun() { - CachedFeatureFlags.isEnabled(CRASHY_FEATURE); + sCrashyFeature.isEnabled(); CachedFeatureFlags.onStartOrResumeCheckpoint(); } @@ -477,7 +472,7 @@ private void endCleanRun(boolean crashyFeatureValue, boolean okFeatureValue) { FeatureList.setTestFeatures(makeFeatureMap(crashyFeatureValue, okFeatureValue)); - CachedFeatureFlags.cacheNativeFlags(Arrays.asList(CRASHY_FEATURE, OK_FEATURE)); + CachedFeatureFlags.cacheNativeFlags(Arrays.asList(sCrashyFeature, sOkFeature)); CachedFeatureFlags.onEndCheckpoint(); // Async task writing values should have run synchronously because of ShadowPostTask.
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java index d1f1244..86812e0 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -387,6 +387,7 @@ public static final String INTEREST_FEED_V2_AUTOPLAY = "InterestFeedV2Autoplay"; public static final String IS_VOICE_SEARCH_ENABLED_CACHE = "IsVoiceSearchEnabledCache"; public static final String HISTORY_JOURNEYS = "Journeys"; + public static final String HISTORY_ORGANIC_REPEATABLE_QUERIES = "OrganicRepeatableQueries"; public static final String KITKAT_SUPPORTED = "KitKatSupported"; public static final String LEAK_DETECTION_UNAUTHENTICATED = "LeakDetectionUnauthenticated"; public static final String LENS_ON_QUICK_ACTION_SEARCH_WIDGET = "LensOnQuickActionSearchWidget"; @@ -430,6 +431,8 @@ public static final String OMNIBOX_MODERNIZE_VISUAL_UPDATE = "OmniboxModernizeVisualUpdate"; public static final String OMNIBOX_MOST_VISITED_TILES_TITLE_WRAP_AROUND = "OmniboxMostVisitedTilesTitleWrapAround"; + public static final String OMNIBOX_REMOVE_SUGGESTION_HEADER_CHEVRON = + "OmniboxRemoveSuggestionHeaderChevron"; public static final String OMNIBOX_UPDATED_CONNECTION_SECURITY_INDICATORS = "OmniboxUpdatedConnectionSecurityIndicators"; public static final String OPTIMIZATION_GUIDE_PUSH_NOTIFICATIONS = @@ -580,13 +583,110 @@ public static final String WEBNOTES_STYLIZE = "WebNotesStylize"; public static final String WEB_APK_INSTALL_COMPLETE_NOTIFICATION = "WebApkInstallCompleteNotification"; + public static final String WEB_APK_INSTALL_SERVICE = "WebApkInstallService"; public static final String WEB_APK_TRAMPOLINE_ON_INITIAL_INTENT = "WebApkTrampolineOnInitialIntent"; - public static final String WEB_APK_INSTALL_SERVICE = "WebApkInstallService"; + public static final String WEB_APK_UNIQUE_ID = "WebApkUniqueId"; public static final String XSURFACE_METRICS_REPORTING = "XsurfaceMetricsReporting"; public static final String WEB_OTP_CROSS_DEVICE_SIMPLE_STRING = "WebOtpCrossDeviceSimpleString"; public static final String FEED_ABLATION = "FeedAblation"; + /* Alphabetical: */ + public static final CachedFlag sAndroidAuxiliarySearch = + new CachedFlag(OMNIBOX_ANDROID_AUXILIARY_SEARCH, false); + public static final CachedFlag sAnonymousUpdateChecks = + new CachedFlag(ANONYMOUS_UPDATE_CHECKS, true); + public static final CachedFlag sAppMenuMobileSiteOption = + new CachedFlag(APP_MENU_MOBILE_SITE_OPTION, false); + public static final CachedFlag sBackGestureRefactorAndroid = + new CachedFlag(BACK_GESTURE_REFACTOR, false); + public static final CachedFlag sCctIncognito = new CachedFlag(CCT_INCOGNITO, true); + public static final CachedFlag sCctIncognitoAvailableToThirdParty = + new CachedFlag(CCT_INCOGNITO_AVAILABLE_TO_THIRD_PARTY, false); + public static final CachedFlag sCctRemoveRemoteViewIds = + new CachedFlag(CCT_REMOVE_REMOTE_VIEW_IDS, true); + public static final CachedFlag sCctResizable90MaximumHeight = + new CachedFlag(CCT_RESIZABLE_90_MAXIMUM_HEIGHT, false); + public static final CachedFlag sCctResizableAllowResizeByUserGesture = + new CachedFlag(CCT_RESIZABLE_ALLOW_RESIZE_BY_USER_GESTURE, false); + public static final CachedFlag sCctResizableForFirstParties = + new CachedFlag(CCT_RESIZABLE_FOR_FIRST_PARTIES, true); + public static final CachedFlag sCctResizableForThirdParties = + new CachedFlag(CCT_RESIZABLE_FOR_THIRD_PARTIES, false); + public static final CachedFlag sCctToolbarCustomizations = + new CachedFlag(CCT_TOOLBAR_CUSTOMIZATIONS, true); + public static final CachedFlag sCloseTabSuggestions = + new CachedFlag(CLOSE_TAB_SUGGESTIONS, false); + public static final CachedFlag sCommandLineOnNonRooted = + new CachedFlag(COMMAND_LINE_ON_NON_ROOTED, false); + public static final CachedFlag sCommerceCoupons = new CachedFlag(COMMERCE_COUPONS, false); + public static final CachedFlag sConditionalTabStripAndroid = + new CachedFlag(CONDITIONAL_TAB_STRIP_ANDROID, false); + public static final CachedFlag sCreateSafebrowsingOnStartup = + new CachedFlag(CREATE_SAFEBROWSING_ON_STARTUP, false); + public static final CachedFlag sCriticalPersistedTabData = + new CachedFlag(CRITICAL_PERSISTED_TAB_DATA, false); + public static final CachedFlag sDownloadsAutoResumptionNative = + new CachedFlag(DOWNLOADS_AUTO_RESUMPTION_NATIVE, true); + public static final CachedFlag sDynamicColorAndroid = + new CachedFlag(DYNAMIC_COLOR_ANDROID, true); + public static final CachedFlag sDynamicColorButtonsAndroid = + new CachedFlag(DYNAMIC_COLOR_BUTTONS_ANDROID, true); + public static final CachedFlag sEarlyLibraryLoad = new CachedFlag(EARLY_LIBRARY_LOAD, true); + public static final CachedFlag sElasticOverscroll = new CachedFlag(ELASTIC_OVERSCROLL, true); + public static final CachedFlag sElidePrioritizationOfPreNativeBootstrapTasks = + new CachedFlag(ELIDE_PRIORITIZATION_OF_PRE_NATIVE_BOOTSTRAP_TASKS, true); + public static final CachedFlag sExperimentsForAgsa = new CachedFlag(EXPERIMENTS_FOR_AGSA, true); + public static final CachedFlag sFeedLoadingPlaceholder = + new CachedFlag(FEED_LOADING_PLACEHOLDER, false); + public static final CachedFlag sGridTabSwitcherForTablets = + new CachedFlag(GRID_TAB_SWITCHER_FOR_TABLETS, false); + public static final CachedFlag sImmersiveUiMode = new CachedFlag(IMMERSIVE_UI_MODE, false); + public static final CachedFlag sIncognitoReauthenticationForAndroid = + new CachedFlag(INCOGNITO_REAUTHENTICATION_FOR_ANDROID, false); + public static final CachedFlag sInstanceSwitcher = new CachedFlag(INSTANCE_SWITCHER, true); + public static final CachedFlag sInstantStart = new CachedFlag(INSTANT_START, false); + public static final CachedFlag sInterestFeedV2 = new CachedFlag(INTEREST_FEED_V2, true); + public static final CachedFlag sLensCameraAssistedSearch = + new CachedFlag(LENS_CAMERA_ASSISTED_SEARCH, false); + public static final CachedFlag sNewWindowAppMenu = new CachedFlag(NEW_WINDOW_APP_MENU, true); + public static final CachedFlag sOptimizationGuidePushNotifications = + new CachedFlag(OPTIMIZATION_GUIDE_PUSH_NOTIFICATIONS, false); + public static final CachedFlag sPaintPreviewDemo = new CachedFlag(PAINT_PREVIEW_DEMO, false); + public static final CachedFlag sPaintPreviewShowOnStartup = + new CachedFlag(PAINT_PREVIEW_SHOW_ON_STARTUP, false); + public static final CachedFlag sPrefetchNotificationSchedulingIntegration = + new CachedFlag(PREFETCH_NOTIFICATION_SCHEDULING_INTEGRATION, false); + public static final CachedFlag sReadLater = new CachedFlag(READ_LATER, false); + public static final CachedFlag sStartSurfaceAndroid = + new CachedFlag(START_SURFACE_ANDROID, false); + public static final CachedFlag sStartSurfaceRefactor = + new CachedFlag(START_SURFACE_REFACTOR, false); + public static final CachedFlag sStoreHoursAndroid = new CachedFlag(STORE_HOURS, false); + public static final CachedFlag sSwapPixelFormatToFixConvertFromTranslucent = + new CachedFlag(SWAP_PIXEL_FORMAT_TO_FIX_CONVERT_FROM_TRANSLUCENT, true); + public static final CachedFlag sTabGridLayoutAndroid = + new CachedFlag(TAB_GRID_LAYOUT_ANDROID, true); + public static final CachedFlag sTabGroupsAndroid = new CachedFlag(TAB_GROUPS_ANDROID, true); + public static final CachedFlag sTabGroupsContinuationAndroid = + new CachedFlag(TAB_GROUPS_CONTINUATION_ANDROID, false); + public static final CachedFlag sTabGroupsForTablets = + new CachedFlag(TAB_GROUPS_FOR_TABLETS, false); + public static final CachedFlag sTabStripImprovements = + new CachedFlag(TAB_STRIP_IMPROVEMENTS, false); + public static final CachedFlag sTabToGTSAnimation = new CachedFlag(TAB_TO_GTS_ANIMATION, true); + public static final CachedFlag sTestDefaultDisabled = + new CachedFlag(TEST_DEFAULT_DISABLED, false); + public static final CachedFlag sTestDefaultEnabled = new CachedFlag(TEST_DEFAULT_ENABLED, true); + public static final CachedFlag sToolbarUseHardwareBitmapDraw = + new CachedFlag(TOOLBAR_USE_HARDWARE_BITMAP_DRAW, false); + public static final CachedFlag sTrustedWebActivityNotificationPermissionDelegation = + new CachedFlag(TRUSTED_WEB_ACTIVITY_NOTIFICATION_PERMISSION_DELEGATION, true); + public static final CachedFlag sUseChimeAndroidSdk = + new CachedFlag(USE_CHIME_ANDROID_SDK, false); + public static final CachedFlag sWebApkTrampolineOnInitialIntent = + new CachedFlag(WEB_APK_TRAMPOLINE_ON_INITIAL_INTENT, true); + @NativeMethods interface Natives { boolean isEnabled(String featureName);
diff --git a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinator.java b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinator.java index 65e57de..7c0d6b1 100644 --- a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinator.java +++ b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinator.java
@@ -111,7 +111,19 @@ } } - public void setQueryState(QueryState queryState) { + /** Called when the user toggles to or from the Journeys UI in the containing history page. */ + public void onToggled(boolean toggledTo) { + if (toggledTo) { + mMetricsLogger.setInitialState(HistoryClustersMetricsLogger.InitialState.SAME_DOCUMENT); + mMediator.setQueryState(QueryState.forQueryless()); + } else { + mMetricsLogger.incrementToggleCount(); + } + } + + public void setInitialQuery(QueryState queryState) { + mMetricsLogger.setInitialState( + HistoryClustersMetricsLogger.InitialState.INDIRECT_NAVIGATION); mMediator.setQueryState(queryState); }
diff --git a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersMetricsLogger.java b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersMetricsLogger.java index 3c4ced6..2f84f3f 100644 --- a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersMetricsLogger.java +++ b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersMetricsLogger.java
@@ -28,18 +28,52 @@ int NON_SRP = 1; } - // TODO(https://crbug.com/1303171): Add UKM metrics. + @IntDef({InitialState.UNINITIALIZED, InitialState.DIRECT_NAVIGATION, + InitialState.INDIRECT_NAVIGATION, InitialState.SAME_DOCUMENT, InitialState.NUM_ENTRIES}) + @Retention(RetentionPolicy.SOURCE) + @interface InitialState { + int UNINITIALIZED = -1; + // The HistoryClusters UI was opened via direct URL, i.e., not opened via any + // other surface/path such as an omnibox action or other UI surface. + // Currently unused on Android because it's rare and hard to discern, but retained for + // completeness and parity with desktop. + int DIRECT_NAVIGATION = 1; + // The HistoryClusters UI was opened indirectly; e.g., using an omnibox + // action. + int INDIRECT_NAVIGATION = 2; + // The HistoryClusters UI was opened via a same-document navigation, which + // means the user likely clicked the tab over from History to Journeys. + int SAME_DOCUMENT = 3; + int NUM_ENTRIES = 4; + } + private int mVisitDeleteCount; private int mLinkOpenCount; private int mRelatedSearchesClickCount; private int mToggledVisibilityCount; private int mQueryCount; + private int mTogglesToBasicHistoryCount; + private int mInitialState = InitialState.UNINITIALIZED; private final TemplateUrlService mTemplateUrlService; HistoryClustersMetricsLogger(TemplateUrlService templateUrlService) { mTemplateUrlService = templateUrlService; } + void setInitialState(@InitialState int initialState) { + if (mInitialState == InitialState.UNINITIALIZED) { + mInitialState = initialState; + } + } + + void incrementToggleCount() { + if (mInitialState == InitialState.UNINITIALIZED) { + mInitialState = InitialState.SAME_DOCUMENT; + } + + mTogglesToBasicHistoryCount++; + } + void incrementQueryCount() { mQueryCount++; } @@ -85,6 +119,12 @@ } void destroy() { + if (mInitialState == InitialState.UNINITIALIZED) { + return; + } + + RecordHistogram.recordEnumeratedHistogram( + "History.Clusters.Actions.InitialState", mInitialState, InitialState.NUM_ENTRIES); RecordHistogram.recordCount100Histogram( "History.Clusters.Actions.FinalState.NumberLinksOpened", mLinkOpenCount); RecordHistogram.recordCount100Histogram( @@ -96,6 +136,9 @@ RecordHistogram.recordCount100Histogram( "History.Clusters.Actions.FinalState.NumberIndividualVisitsDeleted", mVisitDeleteCount); + RecordHistogram.recordCount100Histogram( + "History.Clusters.Actions.FinalState.TogglesToBasicHistory", + mTogglesToBasicHistoryCount); RecordHistogram.recordBooleanHistogram("History.Clusters.Actions.FinalState.WasSuccessful", isCurrentlySuccessfulHistoryClustersOutcome()); RecordHistogram.recordBooleanHistogram(
diff --git a/chrome/browser/lacros/for_which_extension_type.cc b/chrome/browser/lacros/for_which_extension_type.cc index 939f39c..ee58efdf 100644 --- a/chrome/browser/lacros/for_which_extension_type.cc +++ b/chrome/browser/lacros/for_which_extension_type.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/lacros/for_which_extension_type.h" #include "base/logging.h" +#include "chrome/browser/extensions/extension_keeplist_chromeos.h" #include "chrome/browser/lacros/lacros_extensions_util.h" #include "chrome/common/extensions/api/file_browser_handlers/file_browser_handler.h" #include "extensions/common/constants.h" @@ -22,8 +23,10 @@ bool ForWhichExtensionType::Matches( const extensions::Extension* extension) const { - if (for_chrome_apps_) - return lacros_extensions_util::IsExtensionApp(extension); + if (for_chrome_apps_) { + return lacros_extensions_util::IsExtensionApp(extension) && + !extensions::ExtensionAppRunsInOS(extension->id()); + } if (extension->is_extension()) { // QuickOffice extensions do not use file browser handler manifest key @@ -34,6 +37,11 @@ if (extension_misc::IsQuickOfficeExtension(extension->id())) return true; + // If an extension runs in ash, regardless of whether it may also run in + // Lacros, do not publish it. + if (extensions::ExtensionRunsInOS(extension->id())) + return false; + // For the regular extensions, we should only publish them if they have file // handlers registered using file browser handlers. FileBrowserHandler::List* handler_list =
diff --git a/chrome/browser/password_entry_edit/android/internal/java/src/org/chromium/chrome/browser/password_entry_edit/CredentialEditControllerTest.java b/chrome/browser/password_entry_edit/android/internal/java/src/org/chromium/chrome/browser/password_entry_edit/CredentialEditControllerTest.java index d919ad5..6215075 100644 --- a/chrome/browser/password_entry_edit/android/internal/java/src/org/chromium/chrome/browser/password_entry_edit/CredentialEditControllerTest.java +++ b/chrome/browser/password_entry_edit/android/internal/java/src/org/chromium/chrome/browser/password_entry_edit/CredentialEditControllerTest.java
@@ -7,6 +7,7 @@ import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; @@ -55,12 +56,12 @@ import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.UmaRecorderHolder; import org.chromium.base.test.BaseRobolectricTestRunner; -import org.chromium.base.test.util.DisabledTest; import org.chromium.chrome.browser.password_entry_edit.CredentialEditCoordinator.CredentialActionDelegate; import org.chromium.chrome.browser.password_entry_edit.CredentialEditMediator.CredentialEntryAction; import org.chromium.chrome.browser.password_manager.ConfirmationDialogHelper; import org.chromium.chrome.browser.password_manager.settings.PasswordAccessReauthenticationHelper; import org.chromium.chrome.browser.password_manager.settings.PasswordAccessReauthenticationHelper.ReauthReason; +import org.chromium.ui.base.Clipboard; import org.chromium.ui.modelutil.PropertyModel; /** @@ -101,6 +102,7 @@ public void setUp() { MockitoAnnotations.initMocks(this); UmaRecorderHolder.resetForTesting(); + Clipboard.resetForTesting(); mMediator = new CredentialEditMediator(mReauthenticationHelper, mDeleteDialogHelper, mCredentialActionDelegate, mHelpLauncher, false); mModel = new PropertyModel.Builder(ALL_KEYS) @@ -199,7 +201,6 @@ } @Test - @DisabledTest(message = "https://crbug.com/1344781") public void testCanCopyPasswordIfReauthSucceeds() { mModel.set(PASSWORD, TEST_PASSWORD); when(mReauthenticationHelper.canReauthenticate()).thenReturn(true); @@ -215,6 +216,7 @@ ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); + assertNotNull(clipboard.getPrimaryClip()); assertEquals(TEST_PASSWORD, clipboard.getPrimaryClip().getItemAt(0).getText()); verifyTheClipdataContainSensitiveExtra(clipboard.getPrimaryClip()); }
diff --git a/chrome/browser/policy/cloud/device_management_service_browsertest.cc b/chrome/browser/policy/cloud/device_management_service_browsertest.cc index 3536589..34fad63 100644 --- a/chrome/browser/policy/cloud/device_management_service_browsertest.cc +++ b/chrome/browser/policy/cloud/device_management_service_browsertest.cc
@@ -209,14 +209,7 @@ scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_; }; -#if BUILDFLAG(IS_CHROMEOS) -// Very flaky on ChromeOS: https://crbug.com/1262952 -#define MAYBE_Registration DISABLED_Registration -#else -#define MAYBE_Registration Registration -#endif -IN_PROC_BROWSER_TEST_P(DeviceManagementServiceIntegrationTest, - MAYBE_Registration) { +IN_PROC_BROWSER_TEST_P(DeviceManagementServiceIntegrationTest, Registration) { PerformRegistration(); EXPECT_FALSE(token_.empty()); } @@ -279,6 +272,7 @@ run_loop.Run(); } +#if BUILDFLAG(IS_CHROMEOS) IN_PROC_BROWSER_TEST_P(DeviceManagementServiceIntegrationTest, AutoEnrollment) { base::RunLoop run_loop; EXPECT_CALL(*this, OnJobDone(_, DM_STATUS_SUCCESS, _, _)) @@ -293,6 +287,7 @@ run_loop.Run(); } +#endif // BUILDFLAG(IS_CHROMEOS) INSTANTIATE_TEST_SUITE_P( DeviceManagementServiceIntegrationTestInstance,
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index 8d813f6..022b7526 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc
@@ -1212,6 +1212,7 @@ #if BUILDFLAG(IS_MAC) confirm_quit::RegisterLocalState(registry); QuitWithAppsController::RegisterPrefs(registry); + enterprise_connectors::RegisterLocalPrefs(registry); system_media_permissions::RegisterSystemMediaPermissionStatesPrefs(registry); AppShimRegistry::Get()->RegisterLocalPrefs(registry); #endif
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn b/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn index 531e228..400ed18 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
@@ -29,7 +29,6 @@ "background/braille/liblouis.js", "background/braille/pan_strategy.js", "background/chromevox.js", - "background/focus_bounds.js", "background/logging/log_store.js", "common/abstract_earcons.js", "common/background_bridge.js", @@ -94,6 +93,7 @@ "background/event_source.js", "background/find_handler.js", "background/focus_automation_handler.js", + "background/focus_bounds.js", "background/gesture_command_handler.js", "background/gesture_interface.js", "background/injected_script_loader.js",
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js index da1f6cf..f15e9d2 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js
@@ -21,6 +21,7 @@ import {Earcons} from './earcons.js'; import {FindHandler} from './find_handler.js'; import {FocusAutomationHandler} from './focus_automation_handler.js'; +import {FocusBounds} from './focus_bounds.js'; import {GestureCommandHandler} from './gesture_command_handler.js'; import {BackgroundKeyboardHandler} from './keyboard_handler.js'; import {LiveRegions} from './live_regions.js'; @@ -33,7 +34,6 @@ import {ChromeVoxPrefs} from './prefs.js'; import {RangeAutomationHandler} from './range_automation_handler.js'; - /** * @fileoverview The entry point for all ChromeVox related code for the * background page.
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 2ea8e8e..14eee0d 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js
@@ -15,12 +15,6 @@ async setUpDeferred() { await super.setUpDeferred(); - window.doGesture = this.doGesture; - window.simulateHitTestResult = this.simulateHitTestResult; - window.press = this.press; - window.Mod = constants.ModifierFlag; - window.ActionType = chrome.automation.ActionType; - await importModule( 'BackgroundKeyboardHandler', '/chromevox/background/keyboard_handler.js'); @@ -45,6 +39,7 @@ 'DesktopAutomationInterface', '/chromevox/background/desktop_automation_interface.js'); await importModule('EventGenerator', '/common/event_generator.js'); + await importModule('FocusBounds', '/chromevox/background/focus_bounds.js'); await importModule( 'GestureCommandHandler', '/chromevox/background/gesture_command_handler.js'); @@ -58,6 +53,12 @@ await importModule( 'OutputAction', '/chromevox/background/output/output_types.js'); + window.doGesture = this.doGesture; + window.simulateHitTestResult = this.simulateHitTestResult; + window.press = this.press; + window.Mod = constants.ModifierFlag; + window.ActionType = chrome.automation.ActionType; + this.forceContextualLastOutput(); }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/focus_bounds.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/focus_bounds.js index 84fb28bf..9e5f44b 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/focus_bounds.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/focus_bounds.js
@@ -7,9 +7,7 @@ * ring location. */ -goog.provide('FocusBounds'); - -FocusBounds = { +export const FocusBounds = { /** @return {!Array<!chrome.accessibilityPrivate.ScreenRect>} */ get() { return FocusBounds.current_;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/keyboard_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/keyboard_handler.js index f5ae18f..dd1c20f 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/keyboard_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/keyboard_handler.js
@@ -12,6 +12,7 @@ import {EventSourceState} from './event_source.js'; import {MathHandler} from './math_handler.js'; import {Output} from './output/output.js'; +import {UserActionMonitor} from './user_action_monitor.js'; /** * @enum {string} @@ -43,8 +44,9 @@ /** @private {Set} */ this.passedThroughKeyDowns_ = new Set(); - document.addEventListener('keydown', this.onKeyDown.bind(this), false); - document.addEventListener('keyup', this.onKeyUp.bind(this), false); + document.addEventListener( + 'keydown', (event) => this.onKeyDown(event), false); + document.addEventListener('keyup', (event) => this.onKeyUp(event), false); chrome.accessibilityPrivate.setKeyboardListener( true, ChromeVox.isStickyPrefOn); @@ -85,16 +87,8 @@ // Try to restore to the last valid range. ChromeVoxState.instance.restoreLastValidRangeIfNeeded(); - // Defer first to the math handler, if it exists, then ordinary keyboard - // commands. - if (!MathHandler.onKeyDown(evt) || - !ChromeVoxKbHandler.basicKeyDownActionsListener(evt) || - // We natively always capture Search, so we have to be very careful to - // either eat it here or re-inject it; otherwise, some components, like - // ARC++ with TalkBack never get it. We only want to re-inject when - // ChromeVox has no range. - (ChromeVoxState.instance.currentRange && - (evt.metaKey || evt.keyCode === KeyCode.SEARCH))) { + if (!this.callOnKeyDownHandlers_(evt) || + this.shouldConsumeSearchKey_(evt)) { if (ChromeVox.passThroughMode) { this.passThroughState_ = KeyboardPassThroughState_.PENDING_PASS_THROUGH_SHORTCUT_KEYUPS; @@ -107,6 +101,43 @@ } /** + * @param {Event} evt The key down event to process. + * @return {boolean} Whether the event should continue propagating. + * @private + */ + callOnKeyDownHandlers_(evt) { + // Defer first to the math handler, if it exists, then ordinary keyboard + // commands. + if (!MathHandler.onKeyDown(evt)) { + return false; + } + + const userActionMonitor = UserActionMonitor.instance; + if (userActionMonitor && !userActionMonitor.onKeyDown(evt)) { + return false; + } + + return ChromeVoxKbHandler.basicKeyDownActionsListener(evt); + } + + /** + * @param {Event} evt The key down event to evaluate. + * @return {boolean} Whether the event should be consumed. + * @private + */ + shouldConsumeSearchKey_(evt) { + // We natively always capture Search, so we have to be very careful to + // either eat it here or re-inject it; otherwise, some components, like + // ARC++ with TalkBack never get it. We only want to re-inject when + // ChromeVox has no range. + if (!ChromeVoxState.instance.currentRange) { + return false; + } + + return Boolean(evt.metaKey) || evt.keyCode === KeyCode.SEARCH; + } + + /** * Handles key up events. * @param {Event} evt The key up event to process. * @return {boolean} This value has no effect since we ignore it in
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js index 8b8b312..bc055d84 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js
@@ -22,7 +22,6 @@ goog.require('BrailleKeyEvent'); goog.require('BridgeHelper'); goog.require('ChromeVox'); -goog.require('FocusBounds'); goog.require('JaPhoneticData'); goog.require('KeyCode'); goog.require('LibLouis');
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/logging/event_stream_logger.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/logging/event_stream_logger.js index b3a6ea22..bc2bbcac 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/logging/event_stream_logger.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/logging/event_stream_logger.js
@@ -9,6 +9,7 @@ const AutomationEvent = chrome.automation.AutomationEvent; const AutomationNode = chrome.automation.AutomationNode; const EventType = chrome.automation.EventType; +const Constants = BridgeConstants.EventStreamLogger; export class EventStreamLogger { constructor(node) { @@ -99,8 +100,7 @@ EventStreamLogger.init_(); BridgeHelper.registerHandler( - BridgeTarget.EVENT_STREAM_LOGGER, - BridgeAction.NOTIFY_EVENT_STREAM_FILTER_CHANGED, + Constants.TARGET, Constants.Action.NOTIFY_EVENT_STREAM_FILTER_CHANGED, ({name, enabled}) => EventStreamLogger.instance.notifyEventStreamFilterChanged( name, enabled));
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 e9e5fb8..2d9e6cb15 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 {LocaleOutputHelper} from '../../common/locale_output_helper.js'; import {ValueSelectionSpan, ValueSpan} from '../braille/spans.js'; import {EventSourceState} from '../event_source.js'; +import {FocusBounds} from '../focus_bounds.js'; import {PhoneticData} from '../phonetic_data.js'; import {OutputAncestryInfo} from './output_ancestry_info.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_test.js index 5ee3aa9..00e62b5 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_test.js
@@ -100,6 +100,7 @@ /** @override */ async setUpDeferred() { await super.setUpDeferred(); + await importModule('FocusBounds', '/chromevox/background/focus_bounds.js'); await importModule('Output', '/chromevox/background/output/output.js'); await importModule( 'OutputRoleInfo', '/chromevox/background/output/output_role_info.js');
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_background.js index 812871a9..bd6296f 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_background.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_background.js
@@ -17,6 +17,7 @@ import {PanelTabMenuBackground} from './panel_tab_menu_background.js'; const AutomationNode = chrome.automation.AutomationNode; +const Constants = BridgeConstants.PanelBackground; /** @implements {ISearchHandler} */ export class PanelBackground { @@ -42,59 +43,56 @@ ChromeVoxState.addObserver(PanelBackground.stateObserver_); BridgeHelper.registerHandler( - BridgeTargets.PANEL_BACKGROUND, BridgeActions.CLEAR_SAVED_NODE, + Constants.TARGET, Constants.Action.CLEAR_SAVED_NODE, () => PanelBackground.instance.clearSavedNode_()); BridgeHelper.registerHandler( - BridgeTargets.PANEL_BACKGROUND, - BridgeActions.CREATE_ALL_NODE_MENU_BACKGROUNDS, + Constants.TARGET, Constants.Action.CREATE_ALL_NODE_MENU_BACKGROUNDS, opt_activateMenuTitle => PanelBackground.instance.createAllNodeMenuBackgrounds_( opt_activateMenuTitle)); BridgeHelper.registerHandler( - BridgeTargets.PANEL_BACKGROUND, BridgeActions.CREATE_NEW_I_SEARCH, + Constants.TARGET, Constants.Action.CREATE_NEW_I_SEARCH, () => PanelBackground.instance.createNewISearch_()); BridgeHelper.registerHandler( - BridgeTargets.PANEL_BACKGROUND, BridgeActions.DESTROY_I_SEARCH, + Constants.TARGET, Constants.Action.DESTROY_I_SEARCH, () => PanelBackground.instance.destroyISearch_()); BridgeHelper.registerHandler( - BridgeTargets.PANEL_BACKGROUND, BridgeActions.FOCUS_TAB, + Constants.TARGET, Constants.Action.FOCUS_TAB, ({windowId, tabId}) => PanelTabMenuBackground.focusTab(windowId, tabId)); BridgeHelper.registerHandler( - BridgeTargets.PANEL_BACKGROUND, - BridgeActions.GET_ACTIONS_FOR_CURRENT_NODE, + Constants.TARGET, Constants.Action.GET_ACTIONS_FOR_CURRENT_NODE, () => PanelBackground.instance.getActionsForCurrentNode_()); BridgeHelper.registerHandler( - BridgeTargets.PANEL_BACKGROUND, BridgeActions.GET_TAB_MENU_DATA, + Constants.TARGET, Constants.Action.GET_TAB_MENU_DATA, () => PanelTabMenuBackground.getTabMenuData()); BridgeHelper.registerHandler( - BridgeTargets.PANEL_BACKGROUND, BridgeActions.INCREMENTAL_SEARCH, + Constants.TARGET, Constants.Action.INCREMENTAL_SEARCH, ({searchStr, dir, opt_nextObject}) => PanelBackground.instance.incrementalSearch_( searchStr, dir, opt_nextObject)); BridgeHelper.registerHandler( - BridgeTargets.PANEL_BACKGROUND, BridgeActions.NODE_MENU_CALLBACK, + Constants.TARGET, Constants.Action.NODE_MENU_CALLBACK, callbackNodeIndex => PanelNodeMenuBackground.focusNodeCallback(callbackNodeIndex)); BridgeHelper.registerHandler( - BridgeTargets.PANEL_BACKGROUND, - BridgeActions.PERFORM_CUSTOM_ACTION_ON_CURRENT_NODE, + Constants.TARGET, + Constants.Action.PERFORM_CUSTOM_ACTION_ON_CURRENT_NODE, actionId => PanelBackground.instance.performCustomActionOnCurrentNode_( actionId)); BridgeHelper.registerHandler( - BridgeTargets.PANEL_BACKGROUND, - BridgeActions.PERFORM_STANDARD_ACTION_ON_CURRENT_NODE, + Constants.TARGET, + Constants.Action.PERFORM_STANDARD_ACTION_ON_CURRENT_NODE, action => PanelBackground.instance.performStandardActionOnCurrentNode_( action)); BridgeHelper.registerHandler( - BridgeTargets.PANEL_BACKGROUND, BridgeActions.SAVE_CURRENT_NODE, + Constants.TARGET, Constants.Action.SAVE_CURRENT_NODE, () => PanelBackground.instance.saveCurrentNode_()); BridgeHelper.registerHandler( - BridgeTargets.PANEL_BACKGROUND, - BridgeActions.SET_RANGE_TO_I_SEARCH_NODE, + Constants.TARGET, Constants.Action.SET_RANGE_TO_I_SEARCH_NODE, () => PanelBackground.instance.setRangeToISearchNode_()); BridgeHelper.registerHandler( - BridgeTargets.PANEL_BACKGROUND, BridgeActions.WAIT_FOR_PANEL_COLLAPSE, + Constants.TARGET, Constants.Action.WAIT_FOR_PANEL_COLLAPSE, () => PanelBackground.instance.waitForPanelCollapse_()); }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/range_automation_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/range_automation_handler.js index 069c40b..bbe81bb 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/range_automation_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/range_automation_handler.js
@@ -11,6 +11,7 @@ import {BaseAutomationHandler} from './base_automation_handler.js'; import {ChromeVoxState, ChromeVoxStateObserver} from './chromevox_state.js'; import {DesktopAutomationHandler} from './desktop_automation_handler.js'; +import {FocusBounds} from './focus_bounds.js'; import {Output} from './output/output.js'; import {OutputEventType} from './output/output_types.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/user_action_monitor.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/user_action_monitor.js index 2ca1796c..eeae677d 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/user_action_monitor.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/user_action_monitor.js
@@ -6,6 +6,7 @@ * @fileoverview Monitors user actions. */ import {KeySequence} from '../common/key_sequence.js'; +import {KeyUtil} from '../common/key_util.js'; import {PanelCommand, PanelCommandType} from '../common/panel_command.js'; import {CommandHandlerInterface} from './command_handler_interface.js'; @@ -107,6 +108,16 @@ return expectedAction.shouldPropagate; } + /** + * @param {Event} evt The key down event to process. + * @return {boolean} Whether the event should continue propagating. + */ + onKeyDown(evt) { + const keySequence = KeyUtil.keyEventToKeySequence(evt); + return this.onKeySequence(keySequence); + } + + // Private methods. /** @private */ @@ -353,9 +364,20 @@ UserActionMonitor.instance; BridgeHelper.registerHandler( - BridgeTargets.USER_ACTION_MONITOR, BridgeActions.CREATE, + BridgeConstants.UserActionMonitor.TARGET, + BridgeConstants.UserActionMonitor.Action.CREATE, actions => new Promise(resolve => UserActionMonitor.create(actions, resolve))); BridgeHelper.registerHandler( - BridgeTargets.USER_ACTION_MONITOR, BridgeActions.DESTROY, + BridgeConstants.UserActionMonitor.TARGET, + BridgeConstants.UserActionMonitor.Action.DESTROY, () => UserActionMonitor.destroy()); +BridgeHelper.registerHandler( + BridgeConstants.UserActionMonitor.TARGET, + BridgeConstants.UserActionMonitor.Action.ON_KEY_DOWN, (evt) => { + if (!UserActionMonitor.instance) { + // Continue propagating. + return true; + } + return UserActionMonitor.instance.onKeyDown(evt); + });
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/background_bridge.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/background_bridge.js index ad1df75..05fa406 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/background_bridge.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/background_bridge.js
@@ -9,7 +9,6 @@ goog.provide('BackgroundBridge'); -goog.require('BridgeActions'); goog.require('BridgeConstants'); goog.require('BridgeHelper'); goog.require('BridgeTargets'); @@ -167,8 +166,10 @@ */ async notifyEventStreamFilterChanged(name, enabled) { return BridgeHelper.sendMessage( - BridgeTargets.EVENT_STREAM_LOGGER, - BridgeActions.NOTIFY_EVENT_STREAM_FILTER_CHANGED, {name, enabled}); + BridgeConstants.EventStreamLogger.TARGET, + BridgeConstants.EventStreamLogger.Action + .NOTIFY_EVENT_STREAM_FILTER_CHANGED, + {name, enabled}); }, }; @@ -190,7 +191,8 @@ */ async getLogs() { return BridgeHelper.sendMessage( - BridgeTargets.LOG_STORE, BridgeActions.GET_LOGS); + BridgeTargets.LOG_STORE, + BridgeConstants.PanelBackground.Action.GET_LOGS); }, }; @@ -198,14 +200,16 @@ /** @return {!Promise} */ async clearSavedNode() { return BridgeHelper.sendMessage( - BridgeTargets.PANEL_BACKGROUND, BridgeActions.CLEAR_SAVED_NODE); + BridgeConstants.PanelBackground.TARGET, + BridgeConstants.PanelBackground.Action.CLEAR_SAVED_NODE); }, /** @param {string=} opt_activatedMenuTitle */ async createAllNodeMenuBackgrounds(opt_activatedMenuTitle) { return BridgeHelper.sendMessage( - BridgeTargets.PANEL_BACKGROUND, - BridgeActions.CREATE_ALL_NODE_MENU_BACKGROUNDS, opt_activatedMenuTitle); + BridgeConstants.PanelBackground.TARGET, + BridgeConstants.PanelBackground.Action.CREATE_ALL_NODE_MENU_BACKGROUNDS, + opt_activatedMenuTitle); }, /** @@ -215,7 +219,8 @@ */ async createNewISearch() { return BridgeHelper.sendMessage( - BridgeTargets.PANEL_BACKGROUND, BridgeActions.CREATE_NEW_I_SEARCH); + BridgeConstants.PanelBackground.TARGET, + BridgeConstants.PanelBackground.Action.CREATE_NEW_I_SEARCH); }, /** @@ -224,7 +229,8 @@ */ async destroyISearch() { return BridgeHelper.sendMessage( - BridgeTargets.PANEL_BACKGROUND, BridgeActions.DESTROY_I_SEARCH); + BridgeConstants.PanelBackground.TARGET, + BridgeConstants.PanelBackground.Action.DESTROY_I_SEARCH); }, /** @@ -234,8 +240,8 @@ */ async focusTab(windowId, tabId) { return BridgeHelper.sendMessage( - BridgeTargets.PANEL_BACKGROUND, BridgeActions.FOCUS_TAB, - {windowId, tabId}); + BridgeConstants.PanelBackground.TARGET, + BridgeConstants.PanelBackground.Action.FOCUS_TAB, {windowId, tabId}); }, /** @@ -246,14 +252,15 @@ */ async getActionsForCurrentNode() { return BridgeHelper.sendMessage( - BridgeTargets.PANEL_BACKGROUND, - BridgeActions.GET_ACTIONS_FOR_CURRENT_NODE); + BridgeConstants.PanelBackground.TARGET, + BridgeConstants.PanelBackground.Action.GET_ACTIONS_FOR_CURRENT_NODE); }, /** @return {!Promise<!Array<!PanelTabMenuItemData>>} */ async getTabMenuData() { return BridgeHelper.sendMessage( - BridgeTargets.PANEL_BACKGROUND, BridgeActions.GET_TAB_MENU_DATA); + BridgeConstants.PanelBackground.TARGET, + BridgeConstants.PanelBackground.Action.GET_TAB_MENU_DATA); }, /** @@ -264,7 +271,8 @@ */ async incrementalSearch(searchStr, dir, opt_nextObject) { return BridgeHelper.sendMessage( - BridgeTargets.PANEL_BACKGROUND, BridgeActions.INCREMENTAL_SEARCH, + BridgeConstants.PanelBackground.TARGET, + BridgeConstants.PanelBackground.Action.INCREMENTAL_SEARCH, {searchStr, dir, opt_nextObject}); }, @@ -274,7 +282,8 @@ */ async nodeMenuCallback(callbackNodeIndex) { return BridgeHelper.sendMessage( - BridgeTargets.PANEL_BACKGROUND, BridgeActions.NODE_MENU_CALLBACK, + BridgeConstants.PanelBackground.TARGET, + BridgeConstants.PanelBackground.Action.NODE_MENU_CALLBACK, callbackNodeIndex); }, @@ -284,8 +293,10 @@ */ async performCustomActionOnCurrentNode(actionId) { return BridgeHelper.sendMessage( - BridgeTargets.PANEL_BACKGROUND, - BridgeActions.PERFORM_CUSTOM_ACTION_ON_CURRENT_NODE, actionId); + BridgeConstants.PanelBackground.TARGET, + BridgeConstants.PanelBackground.Action + .PERFORM_CUSTOM_ACTION_ON_CURRENT_NODE, + actionId); }, /** @@ -294,14 +305,17 @@ */ async performStandardActionOnCurrentNode(action) { return BridgeHelper.sendMessage( - BridgeTargets.PANEL_BACKGROUND, - BridgeActions.PERFORM_STANDARD_ACTION_ON_CURRENT_NODE, action); + BridgeConstants.PanelBackground.TARGET, + BridgeConstants.PanelBackground.Action + .PERFORM_STANDARD_ACTION_ON_CURRENT_NODE, + action); }, /** @return {!Promise} */ async saveCurrentNode() { return BridgeHelper.sendMessage( - BridgeTargets.PANEL_BACKGROUND, BridgeActions.SAVE_CURRENT_NODE); + BridgeConstants.PanelBackground.TARGET, + BridgeConstants.PanelBackground.Action.SAVE_CURRENT_NODE); }, /** @@ -310,8 +324,8 @@ */ async setRangeToISearchNode() { return BridgeHelper.sendMessage( - BridgeTargets.PANEL_BACKGROUND, - BridgeActions.SET_RANGE_TO_I_SEARCH_NODE); + BridgeConstants.PanelBackground.TARGET, + BridgeConstants.PanelBackground.Action.SET_RANGE_TO_I_SEARCH_NODE); }, /** @@ -319,7 +333,8 @@ */ async waitForPanelCollapse() { return BridgeHelper.sendMessage( - BridgeTargets.PANEL_BACKGROUND, BridgeActions.WAIT_FOR_PANEL_COLLAPSE); + BridgeConstants.PanelBackground.TARGET, + BridgeConstants.PanelBackground.Action.WAIT_FOR_PANEL_COLLAPSE); }, }; @@ -336,7 +351,8 @@ */ async create(actions) { return BridgeHelper.sendMessage( - BridgeTargets.USER_ACTION_MONITOR, BridgeActions.CREATE, actions); + BridgeConstants.UserActionMonitor.TARGET, + BridgeConstants.UserActionMonitor.Action.CREATE, actions); }, /** @@ -345,6 +361,14 @@ */ async destroy() { return BridgeHelper.sendMessage( - BridgeTargets.USER_ACTION_MONITOR, BridgeActions.DESTROY); + BridgeConstants.UserActionMonitor.TARGET, + BridgeConstants.UserActionMonitor.Action.DESTROY); + }, + + /** @return {!Promise<boolean>} */ + async onKeyDown(event) { + return BridgeHelper.sendMessage( + BridgeConstants.UserActionMonitor.TARGET, + BridgeConstants.UserActionMonitor.Action.ON_KEY_DOWN, event); }, };
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/bridge_constants.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/bridge_constants.js index 3e3dde2..e7bbcde 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/bridge_constants.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/bridge_constants.js
@@ -11,15 +11,9 @@ goog.provide('BridgeTarget'); goog.provide('BridgeTargets'); -/** @enum {string} */ -BridgeTargets = { - EVENT_STREAM_LOGGER: 'EventStreamLogger', - PANEL_BACKGROUND: 'PanelBackground', - USER_ACTION_MONITOR: 'UserActionMonitor', -}; /** * The class that a message is being sent to. - * @typedef {BridgeTargets|string} + * @typedef {string} */ BridgeTarget; @@ -91,6 +85,15 @@ }, }, + EventStreamLogger: { + /** @public {BridgeTarget} */ + TARGET: 'EventStreamLogger', + /** @enum {string} */ + Action: { + NOTIFY_EVENT_STREAM_FILTER_CHANGED: 'notifyEventStreamFilterChanged', + }, + }, + GestureCommandHandler: { /** @public {BridgeTarget} */ TARGET: 'GestureCommandHandler', @@ -119,43 +122,55 @@ ON_CURRENT_RANGE_CHANGED: 'onCurrentRangeChanged', }, }, -}; -/** - * @enum {string} - */ -BridgeActions = { - CLEAR_SAVED_NODE: 'clearSavedNode', - CREATE: 'create', - CREATE_ALL_NODE_MENU_BACKGROUNDS: 'createAllNodeMenuBackgrounds', - CREATE_NEW_I_SEARCH: 'createNewISearch', - DESTROY: 'destroy', - DESTROY_I_SEARCH: 'destroyISearch', - FOCUS_TAB: 'focusTab', - GET_ACTIONS_FOR_CURRENT_NODE: 'getActionsForCurrentNode', - GET_TAB_MENU_DATA: 'getTabMenuData', - INCREMENTAL_SEARCH: 'incrementalSearch', - NODE_MENU_CALLBACK: 'nodeMenuCallback', - NOTIFY_EVENT_STREAM_FILTER_CHANGED: 'notifyEventStreamFilterChanged', - PERFORM_CUSTOM_ACTION_ON_CURRENT_NODE: 'performCustomActionOnCurrentNode', - PERFORM_STANDARD_ACTION_ON_CURRENT_NODE: 'performStandardActionOnCurrentNode', - SAVE_CURRENT_NODE: 'saveCurrentNode', - SET_RANGE_TO_I_SEARCH_NODE: 'setRangeToISearchNode', - WAIT_FOR_PANEL_COLLAPSE: 'waitForPanelCollapse', + PanelBackground: { + /** @public {BridgeTarget} */ + TARGET: 'PanelBackground', + /** @enum {string} */ + Action: { + CLEAR_SAVED_NODE: 'clearSavedNode', + CREATE_ALL_NODE_MENU_BACKGROUNDS: 'createAllNodeMenuBackgrounds', + CREATE_NEW_I_SEARCH: 'createNewISearch', + DESTROY_I_SEARCH: 'destroyISearch', + FOCUS_TAB: 'focusTab', + GET_ACTIONS_FOR_CURRENT_NODE: 'getActionsForCurrentNode', + GET_TAB_MENU_DATA: 'getTabMenuData', + INCREMENTAL_SEARCH: 'incrementalSearch', + NODE_MENU_CALLBACK: 'nodeMenuCallback', + PERFORM_CUSTOM_ACTION_ON_CURRENT_NODE: 'performCustomActionOnCurrentNode', + PERFORM_STANDARD_ACTION_ON_CURRENT_NODE: + 'performStandardActionOnCurrentNode', + SAVE_CURRENT_NODE: 'saveCurrentNode', + SET_RANGE_TO_I_SEARCH_NODE: 'setRangeToISearchNode', + WAIT_FOR_PANEL_COLLAPSE: 'waitForPanelCollapse', + }, + }, + + UserActionMonitor: { + /** @public {BridgeTarget} */ + TARGET: 'UserActionMonitor', + Action: { + CREATE: 'create', + DESTROY: 'destroy', + ON_KEY_DOWN: 'onKeyDown', + }, + }, }; /** * The action that the message is requesting be performed. - * @typedef {BridgeActions | - * BridgeConstants.BrailleBackground.Action | + * @typedef {BridgeConstants.BrailleBackground.Action | * BridgeConstants.BrailleCommandHandler.Action | * BridgeConstants.ChromeVoxBackground.Action | * BridgeConstants.ChromeVoxPrefs.Action | * BridgeConstants.ChromeVoxState.Action | * BridgeConstants.CommandHandler.Action | * BridgeConstants.EventSourceState.Action | + * BridgeConstants.EventStreamLogger.Action | * BridgeConstants.GestureCommandHandler.Action | * BridgeConstants.LogStore.Action | - * BridgeConstants.Panel.Action} + * BridgeConstants.Panel.Action | + * BridgeConstants.PanelBackground.Action | + * BridgeConstants.UserActionMonitor.Action} */ BridgeAction;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/keyboard_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/keyboard_handler.js index 6544dc13..e1cb534 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/keyboard_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/keyboard_handler.js
@@ -69,13 +69,6 @@ */ ChromeVoxKbHandler.basicKeyDownActionsListener = function(evt) { const keySequence = KeyUtil.keyEventToKeySequence(evt); - const monitor = UserActionMonitor.instance; - if (monitor && !monitor.onKeySequence(keySequence)) { - // UserActionMonitor returns true if this key sequence should propagate. - // Prevent the default action if it returns false. - return false; - } - let functionName; if (ChromeVoxKbHandler.handlerKeyMap !== undefined) { functionName = ChromeVoxKbHandler.handlerKeyMap.commandForKey(keySequence);
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 6d1c8a5..bd45d18 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
@@ -81,8 +81,13 @@ return true; } - ChromeVoxKbHandler.basicKeyDownActionsListener(evt); - LearnMode.clearRange(); + BackgroundBridge.UserActionMonitor.onKeyDown(evt).then( + (shouldPropagate) => { + if (shouldPropagate) { + ChromeVoxKbHandler.basicKeyDownActionsListener(evt); + } + LearnMode.clearRange(); + }); } evt.preventDefault();
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 eadb35f..bdeb889 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_loader.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_loader.js
@@ -13,7 +13,6 @@ goog.require('BackgroundBridge'); goog.require('BridgeHelper'); goog.require('EarconDescription'); -goog.require('FocusBounds'); goog.require('KeyCode'); goog.require('LogStore'); goog.require('Msgs');
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_gl.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_gl.xtb index 0a364de..ac17b98 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_gl.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_gl.xtb
@@ -759,7 +759,7 @@ <translation id="6082768461603900813">Navegación básica</translation> <translation id="609281021724813947">Non hai ningún control desprazable anterior</translation> <translation id="6100239002225743044">Subir unha liña</translation> -<translation id="6118126368611144850">Aplicacións Android para Chrome. Se tes Play Store no dispositivo, bota unha ollada a ChromeVox coas aplicacións Android. Descarga Google Chrome Canary desde Play Store e proba a compatibilidade experimental.</translation> +<translation id="6118126368611144850">Aplicacións para Android para Chrome. Se tes Play Store no dispositivo, bota unha ollada a ChromeVox coas aplicacións para Android. Descarga Google Chrome Canary desde Play Store e proba a compatibilidade experimental.</translation> <translation id="611827076493383239">vtd</translation> <translation id="6122013438240733403">btn</translation> <translation id="6132506484792346370">Unha caixa de lista ou unha caixa de combinación</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_hi.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_hi.xtb index 883e8987..6c09a3c4b 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_hi.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_hi.xtb
@@ -540,7 +540,7 @@ <translation id="4601367666219428522">ता <ph name="TABLENAME" /> <ph name="TABLEROWS" />x<ph name="TABLECOLS" /></translation> <translation id="4615592953348396470">ध्यान न देते हुए अगला बटन दबाएं</translation> <translation id="4623097797855662355">कॉलफ़न</translation> -<translation id="4624970070706497034">अब Chromebook पर टॉकबैक की सुविधा को पसंद के मुताबिक सेट नहीं किया जा सकेगा. आपके पास अब भी इसे इस्तेमाल करने का विकल्प है. इसके लिए टॉकबैक के डिफ़ॉल्ट कीबोर्ड शॉर्टकट का इस्तेमाल करें. उपलब्ध शॉर्टकट देखने के लिए, Search+A और फिर K बटन दबाएं. अगर आपको अब भी टॉकबैक का इस्तेमाल करना है, तो दोबारा कमांड बटन दबाएं.</translation> +<translation id="4624970070706497034">अब Chromebook पर TalkBack की सुविधा को पसंद के मुताबिक सेट नहीं किया जा सकेगा. आपके पास अब भी इसे इस्तेमाल करने का विकल्प है. इसके लिए TalkBack के डिफ़ॉल्ट कीबोर्ड शॉर्टकट का इस्तेमाल करें. उपलब्ध शॉर्टकट देखने के लिए, Search+A और फिर K बटन दबाएं. अगर आपको अब भी TalkBack का इस्तेमाल करना है, तो दोबारा कमांड बटन दबाएं.</translation> <translation id="463135993322337640">नया क्या है, यह जानने के लिए ChromeVox o, n दबाएं</translation> <translation id="4649220074413114917">ChromeVox को बोलने से रोकने के लिए, स्क्रीन पर दो उंगलियों से टैप करें. अगर आप ChromeVox को कुछ पढ़ने देना नहीं चाहते, तो यह उपयोगी है. जारी रखने के लिए, स्क्रीन पर दो उंगलियों से टैप करें.</translation> <translation id="4660783501463101648">क्लासिक को हटाया गया. ChromeVox क्लासिक में वापस ले जाने वाला कीबोर्ड टॉगल हटा दिया गया है.</translation> @@ -1180,7 +1180,7 @@ <translation id="9223032053830369045">गहरा लाल</translation> <translation id="923331726185079994">ChromeVox अपडेट किया गया</translation> <translation id="93384979447910801">गहरा समुद्री हरा</translation> -<translation id="937605981140327129">फ़िलहाल, टॉकबैक की सुविधा इंस्टॉल नहीं की गई है. कृपया Play Store से Android Accessibility Suite इंस्टॉल करें और फिर से कोशिश करें.</translation> +<translation id="937605981140327129">फ़िलहाल, TalkBack की सुविधा इंस्टॉल नहीं की गई है. कृपया Play Store से Android Accessibility Suite इंस्टॉल करें और फिर से कोशिश करें.</translation> <translation id="948171205378458592">बोली की दर घटाएं</translation> <translation id="957570623732056069">इस लेसन पर जाने के लिए, उंगली से बाईं या दाईं ओर स्वाइप करें</translation> <translation id="958854023026327378">एक उंगली से नीचे स्वाइप करें</translation>
diff --git a/chrome/browser/resources/chromeos/network_ui/network_state_ui.html b/chrome/browser/resources/chromeos/network_ui/network_state_ui.html index f89958c..db11180 100644 --- a/chrome/browser/resources/chromeos/network_ui/network_state_ui.html +++ b/chrome/browser/resources/chromeos/network_ui/network_state_ui.html
@@ -23,7 +23,7 @@ } .state-table-expand-button { - background-color: #fff; + background-color: transparent; border: none; height: 20px; margin: 0;
diff --git a/chrome/browser/resources/chromeos/notification_tester/form_constants.js b/chrome/browser/resources/chromeos/notification_tester/form_constants.js index 63fb2a5..13ad29c 100644 --- a/chrome/browser/resources/chromeos/notification_tester/form_constants.js +++ b/chrome/browser/resources/chromeos/notification_tester/form_constants.js
@@ -206,4 +206,188 @@ {displayText: 'Group B', value: 'group_b'}, {displayText: 'Group C', value: 'group_c'}, ], -}; \ No newline at end of file +}; + +// Constant notification objects based on the notification spec: +// go/cros-notification-spec + +/* + * Text Notification (go/cros-notification-spec) + */ +const TEXT_NOTIFICATION = { + id: 'random', + title: 'Text', + message: 'This is a text notification.', + icon: 'kProductIcon', + displaySource: 'Sample Display Source', + originURL: '', + notificationType: NotificationType.NOTIFICATION_TYPE_SIMPLE, + notifierType: NotifierType.SYSTEM_COMPONENT, + richDataImage: 'none', + richDataSmallImage: 'none', + richDataNeverTimeout: false, + richDataPriority: NotificationPriority.DEFAULT_PRIORITY, + richDataPinned: false, + richDataShowSnooze: false, + richDataShowSettings: false, + richDataProgress: -1, + richDataProgressStatus: '', + richDataNumButtons: 0, + richDataNumNotifItems: 0, +}; + + +/* + * Text + Big Picture Notification (go/cros-notification-spec) + */ +const TEXT_AND_BIG_PICTURE_NOTIFICATION = { + id: 'random', + title: 'Text + Big Picture', + message: 'This is a text + big picture notification.', + icon: 'kProductIcon', + displaySource: 'Sample Display Source', + originURL: '', + notificationType: NotificationType.NOTIFICATION_TYPE_SIMPLE, + notifierType: NotifierType.SYSTEM_COMPONENT, + richDataImage: 'chromium_logo_large_png', + richDataSmallImage: 'none', + richDataNeverTimeout: false, + richDataPriority: NotificationPriority.DEFAULT_PRIORITY, + richDataPinned: false, + richDataShowSnooze: false, + richDataShowSettings: false, + richDataProgress: -1, + richDataProgressStatus: '', + richDataNumButtons: 0, + richDataNumNotifItems: 0, +}; + +/* + * Text + Progress Notification (go/cros-notification-spec) + */ +const TEXT_AND_PROGRESS_NOTIFICATION = { + id: 'random', + title: 'Text + Progress', + message: 'This is a text + progress notification.', + icon: 'kProductIcon', + displaySource: '', + originURL: '', + notificationType: NotificationType.NOTIFICATION_TYPE_PROGRESS, + notifierType: NotifierType.SYSTEM_COMPONENT, + richDataImage: 'none', + richDataSmallImage: 'none', + richDataNeverTimeout: false, + richDataPriority: NotificationPriority.DEFAULT_PRIORITY, + richDataPinned: false, + richDataShowSnooze: false, + richDataShowSettings: false, + richDataProgress: 50, + richDataProgressStatus: 'Sample Progress Status', + richDataNumButtons: 0, + richDataNumNotifItems: 0, +}; + +/* + * Text + Avatar (go/cros-notification-spec) + */ +const TEXT_AND_AVATAR_NOTIFICATION = { + id: 'random', + title: 'Text + Avatar', + message: 'This is a text + avatar notification.', + icon: 'chromium_logo', + displaySource: 'Display Source', + originURL: '', + notificationType: NotificationType.NOTIFICATION_TYPE_SIMPLE, + notifierType: NotifierType.SYSTEM_COMPONENT, + richDataImage: 'none', + richDataSmallImage: 'kProductIcon', + richDataNeverTimeout: false, + richDataPriority: NotificationPriority.DEFAULT_PRIORITY, + richDataPinned: false, + richDataShowSnooze: false, + richDataShowSettings: false, + richDataProgress: -1, + richDataProgressStatus: '', + richDataNumButtons: 0, + richDataNumNotifItems: 0, +}; + +/* + * Text Group Notifications (go/cros-notification-spec) + */ +const TEXT_GROUP_NOTIFICATION_A = { + id: 'random', + title: 'Group - 1', + message: 'This is the first notification.', + icon: 'chromium_logo', + displaySource: '', + originURL: 'https://testurl.xyz', + notificationType: NotificationType.NOTIFICATION_TYPE_SIMPLE, + notifierType: NotifierType.WEB_PAGE, + richDataImage: 'none', + richDataSmallImage: 'kProductIcon', + richDataNeverTimeout: false, + richDataPriority: NotificationPriority.DEFAULT_PRIORITY, + richDataPinned: false, + richDataShowSnooze: false, + richDataShowSettings: false, + richDataProgress: -1, + richDataProgressStatus: '', + richDataNumButtons: 0, + richDataNumNotifItems: 0, +}; +const TEXT_GROUP_NOTIFICATION_B = { + id: 'random', + title: 'Group - 2', + message: 'This is the second notification.', + icon: 'google_logo', + displaySource: '', + originURL: 'https://testurl.xyz', + notificationType: NotificationType.NOTIFICATION_TYPE_SIMPLE, + notifierType: NotifierType.WEB_PAGE, + richDataImage: 'none', + richDataSmallImage: 'kProductIcon', + richDataNeverTimeout: false, + richDataPriority: NotificationPriority.DEFAULT_PRIORITY, + richDataPinned: false, + richDataShowSnooze: false, + richDataShowSettings: false, + richDataProgress: -1, + richDataProgressStatus: '', + richDataNumButtons: 0, + richDataNumNotifItems: 0, +}; +const TEXT_GROUP_NOTIFICATION_C = { + id: 'random', + title: 'Group - 3', + message: 'This is the third notification.', + icon: 'warning', + displaySource: '', + originURL: 'https://testurl.xyz', + notificationType: NotificationType.NOTIFICATION_TYPE_SIMPLE, + notifierType: NotifierType.WEB_PAGE, + richDataImage: 'none', + richDataSmallImage: 'kProductIcon', + richDataNeverTimeout: false, + richDataPriority: NotificationPriority.DEFAULT_PRIORITY, + richDataPinned: false, + richDataShowSnooze: false, + richDataShowSettings: false, + richDataProgress: -1, + richDataProgressStatus: '', + richDataNumButtons: 0, + richDataNumNotifItems: 0, +}; + +/* + * Array of notifications types from the spec. (go/cros-notification-spec). + */ +export const NOTIFICATION_VIEW_TYPES = [ + TEXT_NOTIFICATION, + TEXT_AND_BIG_PICTURE_NOTIFICATION, + TEXT_AND_PROGRESS_NOTIFICATION, + TEXT_AND_AVATAR_NOTIFICATION, + TEXT_GROUP_NOTIFICATION_C, + TEXT_GROUP_NOTIFICATION_B, + TEXT_GROUP_NOTIFICATION_A, +];
diff --git a/chrome/browser/resources/chromeos/notification_tester/notification_tester.html b/chrome/browser/resources/chromeos/notification_tester/notification_tester.html index 0ac3f0c9935..66065fc 100644 --- a/chrome/browser/resources/chromeos/notification_tester/notification_tester.html +++ b/chrome/browser/resources/chromeos/notification_tester/notification_tester.html
@@ -293,5 +293,8 @@ Generate </button> <button type="button" id="resetFormBtn" on-click="onClickReset"> Reset </button> + <button type="button" id="generateAllNotifBtn" + on-click="onClickGenerateAllTypes"> + View All Types </button> </div> </div> \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/notification_tester/notification_tester.js b/chrome/browser/resources/chromeos/notification_tester/notification_tester.js index 83e3631..c4b02e6 100644 --- a/chrome/browser/resources/chromeos/notification_tester/notification_tester.js +++ b/chrome/browser/resources/chromeos/notification_tester/notification_tester.js
@@ -11,7 +11,7 @@ import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {FormSelectOptions, NotificationPriority, NotificationType, NotifierType} from './form_constants.js'; +import {FormSelectOptions, NOTIFICATION_VIEW_TYPES, NotificationPriority, NotificationType, NotifierType} from './form_constants.js'; import {Notification} from './types.js'; // Web component housing the form for chrome://notification-tester. @@ -272,6 +272,19 @@ } }, ONE_SECOND); } + + // Generate notifications of all types from + // go/cros-notification-spec. + onClickGenerateAllTypes() { + // chrome.send doesn't seem to properly register more than two consecutive + // synchronously calls, so they are sent with a small delay. + const DELAY_MS = 250; + for (let i = 0; i < NOTIFICATION_VIEW_TYPES.length; i++) { + setTimeout( + chrome.send, DELAY_MS * i, 'generateNotificationForm', + [NOTIFICATION_VIEW_TYPES[i]]); + } + } } customElements.define(NotificationTester.is, NotificationTester); \ No newline at end of file
diff --git a/chrome/browser/resources/new_tab_page/iframe.html b/chrome/browser/resources/new_tab_page/iframe.html index 4a53322..775f3193 100644 --- a/chrome/browser/resources/new_tab_page/iframe.html +++ b/chrome/browser/resources/new_tab_page/iframe.html
@@ -13,4 +13,4 @@ width: inherit; } </style> -<iframe id="iframe" src="[[src_]]"></iframe> +<iframe id="iframe" src="[[src_]]" allow="[[allow]]"></iframe>
diff --git a/chrome/browser/resources/new_tab_page/iframe.ts b/chrome/browser/resources/new_tab_page/iframe.ts index 0a5615de..1fc56ae 100644 --- a/chrome/browser/resources/new_tab_page/iframe.ts +++ b/chrome/browser/resources/new_tab_page/iframe.ts
@@ -25,6 +25,11 @@ static get properties() { return { + allow: { + reflectToAttribute: true, + type: String, + }, + src: { reflectToAttribute: true, type: String, @@ -37,6 +42,7 @@ }; } + allow: string; src: string; private src_: string;
diff --git a/chrome/browser/resources/new_tab_page/logo.html b/chrome/browser/resources/new_tab_page/logo.html index db7d51f0..50d8b40 100644 --- a/chrome/browser/resources/new_tab_page/logo.html +++ b/chrome/browser/resources/new_tab_page/logo.html
@@ -133,7 +133,8 @@ </div> </div> <template is="dom-if" if="[[iframeUrl_]]" restamp> - <ntp-iframe id="iframe" src="[[iframeUrl_]]" expanded$="[[expanded_]]"> + <ntp-iframe id="iframe" src="[[iframeUrl_]]" expanded$="[[expanded_]]" + allow="autoplay"> </ntp-iframe> </template> </div>
diff --git a/chrome/browser/resources/settings/chromeos/BUILD.gn b/chrome/browser/resources/settings/chromeos/BUILD.gn index 83aa9af..ede5a8db 100644 --- a/chrome/browser/resources/settings/chromeos/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/BUILD.gn
@@ -96,31 +96,17 @@ } } -copy("ash_search_mojo_bindings") { - sources = [ - "$root_gen_dir/chrome/browser/ui/webui/settings/ash/search/search.mojom-lite.js", - "$root_gen_dir/chrome/browser/ui/webui/settings/ash/search/search_result_icon.mojom-lite.js", - ] - outputs = [ "$root_gen_dir/chrome/browser/ui/webui/settings/chromeos/search/{{source_file_part}}" ] - deps = [ "//chrome/browser/ui/webui/settings/ash/search:mojo_bindings_js" ] -} - # OS Settings specific mojo files, bundled in optimized builds. # TODO(crbug.com/1179821) remove this build rule once these lite bindings # have been converted to WebUI bindings preprocess_if_expr("preprocess_mojo") { - deps = [ - ":ash_search_mojo_bindings", - "//chrome/browser/ui/webui/settings/chromeos/constants:mojom_js", - ] + deps = [ "//chrome/browser/ui/webui/settings/chromeos/constants:mojom_js" ] in_folder = get_path_info("../../../ui/webui/settings/chromeos/", "gen_dir") out_folder = "$target_gen_dir/$preprocessed_folder" out_manifest = "$target_gen_dir/$mojo_manifest" in_files = [ "constants/routes.mojom-lite.js", "constants/setting.mojom-lite.js", - "search/search.mojom-lite.js", - "search/search_result_icon.mojom-lite.js", ] } @@ -128,6 +114,7 @@ preprocess_if_expr("preprocess_mojo_webui") { deps = [ ":generate_ash_search_mojo_webui", + ":generate_cros_audio_config_mojo_webui", ":generate_personalization_search_mojo_webui", ":generate_settings_mojo_webui", ] @@ -137,11 +124,20 @@ in_files = [ "mojom-webui/routes.mojom-webui.js", "mojom-webui/setting.mojom-webui.js", + "mojom-webui/search/search.mojom-webui.js", + "mojom-webui/search/search_result_icon.mojom-webui.js", "mojom-webui/search/user_action_recorder.mojom-webui.js", "mojom-webui/personalization/search.mojom-webui.js", + "mojom-webui/audio/cros_audio_config.mojom-webui.js", ] } +copy("generate_cros_audio_config_mojo_webui") { + deps = [ "//ash/components/audio/public/mojom:mojom_webui_js" ] + sources = [ "$root_gen_dir/mojom-webui/ash/components/audio/public/mojom/cros_audio_config.mojom-webui.js" ] + outputs = [ "$target_gen_dir/mojom-webui/audio/{{source_file_part}}" ] +} + copy("generate_settings_mojo_webui") { deps = [ "//chrome/browser/ui/webui/settings/chromeos/constants:mojom_webui_js" ]
diff --git a/chrome/browser/resources/settings/chromeos/combined_search_handler.js b/chrome/browser/resources/settings/chromeos/combined_search_handler.js index 4eaa6f6..cbcfbcd 100644 --- a/chrome/browser/resources/settings/chromeos/combined_search_handler.js +++ b/chrome/browser/resources/settings/chromeos/combined_search_handler.js
@@ -6,12 +6,13 @@ import {String16} from 'chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-webui.js'; import {SearchResult as PersonalizationSearchResult} from '../mojom-webui/personalization/search.mojom-webui.js'; +import {ParentResultBehavior, SearchResult as SettingsSearchResult} from '../mojom-webui/search/search.mojom-webui.js'; import {getPersonalizationSearchHandler} from './personalization_search_handler.js'; import {getSettingsSearchHandler} from './settings_search_handler.js'; /** - * @typedef {chromeos.settings.mojom.SearchResult|PersonalizationSearchResult} + * @typedef {SettingsSearchResult|PersonalizationSearchResult} */ export let SearchResult; @@ -33,7 +34,7 @@ * Search both settings and personalization and merge the results. * @param {!String16} query * @param {!number} maxNumResults - * @param {!chromeos.settings.mojom.ParentResultBehavior} parentResultBehavior + * @param {!ParentResultBehavior} parentResultBehavior * @return {!Promise<{results: !Array<!SearchResult>}>} */ export async function combinedSearch(
diff --git a/chrome/browser/resources/settings/chromeos/device_page/audio.js b/chrome/browser/resources/settings/chromeos/device_page/audio.js index 5575bba..230db8d 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/audio.js +++ b/chrome/browser/resources/settings/chromeos/device_page/audio.js
@@ -4,7 +4,6 @@ import 'chrome://resources/cr_elements/cr_slider/cr_slider.js'; import '../../icons.html.js'; -import '../../controls/settings_slider.js'; import '../../settings_shared_css.js'; import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/js/i18n_behavior.m.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 f377bfc..d929683 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
@@ -165,7 +165,7 @@ <cr-link-row class="hr" id="reportIssue" on-click="onReportIssueClick_" hidden="[[!prefs.feedback_allowed.value]]" - label="$i18n{aboutReportAnIssue}" external + label="[[getReportIssueLabel_()]]" external deep-link-focus-id$="[[Setting.kReportAnIssue]]"> </cr-link-row> </if>
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 03e442fd..975fc620 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
@@ -778,6 +778,16 @@ onReportIssueClick_() { this.aboutBrowserProxy_.openFeedbackDialog(); } + + /** + * @return {string} + * @private + */ + getReportIssueLabel_() { + return loadTimeData.getBoolean('isOsFeedbackEnabled') ? + this.i18nAdvanced('aboutSendFeedback') : + this.i18nAdvanced('aboutReportAnIssue'); + } // </if> /**
diff --git a/chrome/browser/resources/settings/chromeos/os_settings.gni b/chrome/browser/resources/settings/chromeos/os_settings.gni index 19b3e0e..3534eff 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings.gni +++ b/chrome/browser/resources/settings/chromeos/os_settings.gni
@@ -31,6 +31,11 @@ root_build_dir), "browser_resolver_prefix_replacements=\"../../mojom-webui/personalization/=../../\"", "browser_resolver_prefix_replacements=\"../mojom-webui/personalization/=../\"", + "js_module_root=" + + rebase_path("$root_gen_dir/mojom-webui/ash/components/audio/public/mojom", + root_build_dir), + "browser_resolver_prefix_replacements=\"../../mojom-webui/audio/=../../\"", + "browser_resolver_prefix_replacements=\"../mojom-webui/audio/=../\"", ] # TODO(crbug.com/1315757) Remove once ChromeOS Settings is fully migrated to
diff --git a/chrome/browser/resources/settings/chromeos/os_settings.js b/chrome/browser/resources/settings/chromeos/os_settings.js index 0fc40d38..974814b 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings.js +++ b/chrome/browser/resources/settings/chromeos/os_settings.js
@@ -98,6 +98,9 @@ import './settings_scheduler_slider/settings_scheduler_slider.js'; import * as PersonalizationSearchMojom from '../mojom-webui/personalization/search.mojom-webui.js'; +import * as SearchMojom from '../mojom-webui/search/search.mojom-webui.js'; +import * as SearchResultIconMojom from '../mojom-webui/search/search_result_icon.mojom-webui.js'; +import * as UserActionRecorderMojom from '../mojom-webui/search/user_action_recorder.mojom-webui.js'; export {PermissionType, TriState} from 'chrome://resources/cr_components/app_management/app_management.mojom-webui.js'; export {BrowserProxy as AppManagementComponentBrowserProxy} from 'chrome://resources/cr_components/app_management/browser_proxy.js'; @@ -164,4 +167,9 @@ export {WallpaperBrowserProxyImpl} from './personalization_page/wallpaper_browser_proxy.js'; export {getPersonalizationSearchHandler, setPersonalizationSearchHandlerForTesting} from './personalization_search_handler.js'; export {getSettingsSearchHandler, setSettingsSearchHandlerForTesting} from './settings_search_handler.js'; -export {PersonalizationSearchMojom}; +export { + PersonalizationSearchMojom, + SearchMojom, + SearchResultIconMojom, + UserActionRecorderMojom, +};
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_search_box/os_search_result_row.js b/chrome/browser/resources/settings/chromeos/os_settings_search_box/os_search_result_row.js index 3b2621a2..86256b1 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings_search_box/os_search_result_row.js +++ b/chrome/browser/resources/settings/chromeos/os_settings_search_box/os_search_result_row.js
@@ -17,6 +17,8 @@ import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {SearchResult as PersonalizationSearchResult} from '../../mojom-webui/personalization/search.mojom-webui.js'; +import {SearchResultType} from '../../mojom-webui/search/search.mojom-webui.js'; +import {SearchResultIcon} from '../../mojom-webui/search/search_result_icon.mojom-webui.js'; import {OpenWindowProxyImpl} from '../../open_window_proxy.js'; import {Router} from '../../router.js'; import {SearchResult} from '../combined_search_handler.js'; @@ -584,7 +586,6 @@ loadTimeData.getInteger('entryPointEnumSize')); return; } - const SearchResultType = chromeos.settings.mojom.SearchResultType; chrome.metricsPrivate.recordEnumerationValue( 'ChromeOS.Settings.SearchResultTypeSelected', this.searchResult.type, @@ -662,89 +663,88 @@ if (isPersonalizationSearchResult(this.searchResult)) { return 'os-settings:paint-brush'; } - const Icon = chromeos.settings.mojom.SearchResultIcon; switch (this.searchResult.icon) { - case Icon.kA11y: + case SearchResultIcon.kA11y: return 'os-settings:accessibility'; - case Icon.kAndroid: + case SearchResultIcon.kAndroid: return 'os-settings:android'; - case Icon.kAppsGrid: + case SearchResultIcon.kAppsGrid: return 'os-settings:apps'; - case Icon.kAssistant: + case SearchResultIcon.kAssistant: return 'os-settings:assistant'; - case Icon.kAudio: + case SearchResultIcon.kAudio: return 'os-settings:audio'; - case Icon.kAuthKey: + case SearchResultIcon.kAuthKey: return 'os-settings:auth-key'; - case Icon.kAvatar: + case SearchResultIcon.kAvatar: return 'cr:person'; - case Icon.kBluetooth: + case SearchResultIcon.kBluetooth: return 'cr:bluetooth'; - case Icon.kCellular: + case SearchResultIcon.kCellular: return 'os-settings:cellular'; - case Icon.kChrome: + case SearchResultIcon.kChrome: return 'os-settings:chrome'; - case Icon.kClock: + case SearchResultIcon.kClock: return 'os-settings:access-time'; - case Icon.kDeveloperTags: + case SearchResultIcon.kDeveloperTags: return 'os-settings:developer-tags'; - case Icon.kDisplay: + case SearchResultIcon.kDisplay: return 'os-settings:display'; - case Icon.kDrive: + case SearchResultIcon.kDrive: return 'os-settings:google-drive'; - case Icon.kEthernet: + case SearchResultIcon.kEthernet: return 'os-settings:settings-ethernet'; - case Icon.kFingerprint: + case SearchResultIcon.kFingerprint: return 'os-settings:fingerprint'; - case Icon.kFolder: + case SearchResultIcon.kFolder: return 'os-settings:folder-outline'; - case Icon.kGlobe: + case SearchResultIcon.kGlobe: return 'os-settings:language'; - case Icon.kGooglePlay: + case SearchResultIcon.kGooglePlay: return 'os-settings:google-play'; - case Icon.kHardDrive: + case SearchResultIcon.kHardDrive: return 'os-settings:hard-drive'; - case Icon.kInstantTethering: + case SearchResultIcon.kInstantTethering: return 'os-settings:magic-tethering'; - case Icon.kKeyboard: + case SearchResultIcon.kKeyboard: return 'os-settings:keyboard'; - case Icon.kLaptop: + case SearchResultIcon.kLaptop: return 'os-settings:laptop-chromebook'; - case Icon.kLock: + case SearchResultIcon.kLock: return 'os-settings:lock'; - case Icon.kMagnifyingGlass: + case SearchResultIcon.kMagnifyingGlass: return 'cr:search'; - case Icon.kMessages: + case SearchResultIcon.kMessages: return 'os-settings:multidevice-messages'; - case Icon.kMouse: + case SearchResultIcon.kMouse: return 'os-settings:mouse'; - case Icon.kNearbyShare: + case SearchResultIcon.kNearbyShare: return 'os-settings:nearby-share'; - case Icon.kPaintbrush: + case SearchResultIcon.kPaintbrush: return 'os-settings:paint-brush'; - case Icon.kPenguin: + case SearchResultIcon.kPenguin: return 'os-settings:crostini-mascot'; - case Icon.kPhone: + case SearchResultIcon.kPhone: return 'os-settings:multidevice-better-together-suite'; - case Icon.kPluginVm: + case SearchResultIcon.kPluginVm: return 'os-settings:plugin-vm'; - case Icon.kPower: + case SearchResultIcon.kPower: return 'os-settings:power'; - case Icon.kPrinter: + case SearchResultIcon.kPrinter: return 'os-settings:print'; - case Icon.kReset: + case SearchResultIcon.kReset: return 'os-settings:restore'; - case Icon.kShield: + case SearchResultIcon.kShield: return 'cr:security'; - case Icon.kStartup: + case SearchResultIcon.kStartup: return 'os-settings:startup'; - case Icon.kStylus: + case SearchResultIcon.kStylus: return 'os-settings:stylus'; - case Icon.kSync: + case SearchResultIcon.kSync: return 'os-settings:sync'; - case Icon.kWallpaper: + case SearchResultIcon.kWallpaper: return 'os-settings:wallpaper'; - case Icon.kWifi: + case SearchResultIcon.kWifi: return 'os-settings:network-wifi'; default: return 'os-settings:settings-general';
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_search_box/os_settings_search_box.js b/chrome/browser/resources/settings/chromeos/os_settings_search_box/os_settings_search_box.js index 238335f..20fc1d4 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings_search_box/os_settings_search_box.js +++ b/chrome/browser/resources/settings/chromeos/os_settings_search_box/os_settings_search_box.js
@@ -19,6 +19,7 @@ import {afterNextRender, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {SearchResultsObserverInterface as PersonalizationSearchResultsObserverInterface, SearchResultsObserverReceiver as PersonalizationSearchResultsObserverReceiver} from '../../mojom-webui/personalization/search.mojom-webui.js'; +import {ParentResultBehavior, SearchResultsObserverInterface, SearchResultsObserverReceiver} from '../../mojom-webui/search/search.mojom-webui.js'; import {Router} from '../../router.js'; import {combinedSearch, SearchResult} from '../combined_search_handler.js'; import {recordSearch} from '../metrics_recorder.js'; @@ -175,7 +176,7 @@ constructor() { super(); - /** @private {?chromeos.settings.mojom.SearchResultsObserverReceiver} */ + /** @private {?SearchResultsObserverReceiver} */ this.settingsSearchResultObserverReceiver_ = null; /** @@ -242,11 +243,8 @@ // Observe for availability changes of settings results. this.settingsSearchResultObserverReceiver_ = - new chromeos.settings.mojom.SearchResultsObserverReceiver( - /** - * @type {!chromeos.settings.mojom.SearchResultsObserverInterface} - */ - (this)); + new SearchResultsObserverReceiver( + /** @type {!SearchResultsObserverInterface} */ (this)); getSettingsSearchHandler().observe( this.settingsSearchResultObserverReceiver_.$ .bindNewPipeAndPassRemote()); @@ -266,7 +264,7 @@ } /** - * Overrides chromeos.settings.mojom.SearchResultsObserverInterface + * Overrides SearchResultsObserverInterface * Overrides PersonalizationSearchResultsObserverInterface */ onSearchResultsChanged() { @@ -325,7 +323,7 @@ const timeOfSearchRequest = Date.now(); combinedSearch( queryMojoString16, MAX_NUM_SEARCH_RESULTS, - chromeos.settings.mojom.ParentResultBehavior.kAllowParentResults) + ParentResultBehavior.kAllowParentResults) .then(response => { const latencyMs = Date.now() - timeOfSearchRequest; chrome.metricsPrivate.recordTime(
diff --git a/chrome/browser/resources/settings/chromeos/settings_search_handler.js b/chrome/browser/resources/settings/chromeos/settings_search_handler.js index e166bbe2..2949dd0 100644 --- a/chrome/browser/resources/settings/chromeos/settings_search_handler.js +++ b/chrome/browser/resources/settings/chromeos/settings_search_handler.js
@@ -2,12 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js'; -import 'chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-lite.js'; import '../constants/routes.mojom-lite.js'; import '../constants/setting.mojom-lite.js'; -import '../search/search_result_icon.mojom-lite.js'; -import '../search/search.mojom-lite.js'; + +import {SearchHandler, SearchHandlerInterface} from '../mojom-webui/search/search.mojom-webui.js'; + /** * @fileoverview @@ -15,11 +14,11 @@ * Also provides a way to inject a test implementation for verifying * OS settings search. */ -/** @type {?chromeos.settings.mojom.SearchHandlerInterface} */ +/** @type {?SearchHandlerInterface} */ let settingsSearchHandler = null; /** - * @param {!chromeos.settings.mojom.SearchHandlerInterface} + * @param {!SearchHandlerInterface} * testSearchHandler A test search handler. */ export function setSettingsSearchHandlerForTesting(testSearchHandler) { @@ -27,13 +26,13 @@ } /** - * @return {!chromeos.settings.mojom.SearchHandlerInterface} Search handler. + * @return {!SearchHandlerInterface} Search handler. */ export function getSettingsSearchHandler() { if (settingsSearchHandler) { return settingsSearchHandler; } - settingsSearchHandler = chromeos.settings.mojom.SearchHandler.getRemote(); + settingsSearchHandler = SearchHandler.getRemote(); return settingsSearchHandler; }
diff --git a/chrome/browser/resources/webui_gallery/BUILD.gn b/chrome/browser/resources/webui_gallery/BUILD.gn index a5e5b3e4..a76d484f 100644 --- a/chrome/browser/resources/webui_gallery/BUILD.gn +++ b/chrome/browser/resources/webui_gallery/BUILD.gn
@@ -59,6 +59,7 @@ "demos/cr_button_demo.html", "demos/cr_checkbox_demo.html", "demos/cr_dialog_demo.html", + "demos/cr_input/cr_input_demo.html", "demos/cr_radio_demo.html", "demos/cr_toggle_demo.html", "webui_gallery.html",
diff --git a/chrome/browser/resources/webui_gallery/app.ts b/chrome/browser/resources/webui_gallery/app.ts index 4972883c..8e41f76 100644 --- a/chrome/browser/resources/webui_gallery/app.ts +++ b/chrome/browser/resources/webui_gallery/app.ts
@@ -60,6 +60,11 @@ src: 'cr_dialog_demo.html', }, { + name: 'Inputs', + path: 'inputs', + src: 'cr_input/cr_input_demo.html', + }, + { name: 'Radio buttons and groups', path: 'radios', src: 'cr_radio_demo.html',
diff --git a/chrome/browser/resources/webui_gallery/demos/cr_input/cr_input_demo.html b/chrome/browser/resources/webui_gallery/demos/cr_input/cr_input_demo.html new file mode 100644 index 0000000..12f83f00 --- /dev/null +++ b/chrome/browser/resources/webui_gallery/demos/cr_input/cr_input_demo.html
@@ -0,0 +1,12 @@ +<!doctype html> +<html> + <head> + <meta charset="utf-8"> + <title>cr-input demo</title> + <link rel="stylesheet" href="../demo.css"> + </head> + <body> + <cr-input-demo></cr-input-demo> + <script src="cr_input_demo_component.js" type="module"></script> + </body> +</html>
diff --git a/chrome/browser/resources/webui_gallery/demos/cr_input/cr_input_demo_component.html b/chrome/browser/resources/webui_gallery/demos/cr_input/cr_input_demo_component.html new file mode 100644 index 0000000..0bdc173 --- /dev/null +++ b/chrome/browser/resources/webui_gallery/demos/cr_input/cr_input_demo_component.html
@@ -0,0 +1,105 @@ +<link rel="stylesheet" href="../demo.css"> +<style include="cr-hidden-style cr-icons"> + cr-input { + max-width: 400px; + width: 100%; + } + + .cr-icon { + --cr-icon-button-margin-start: 0; + } + + .no-error { + --cr-input-error-display: none; + } + + .icon-cancel { + --cr-icon-button-icon-size: 16px; + --cr-icon-button-margin-end: 6px; + --cr-icon-button-size: 24px; + } + + .domain-name { + padding-inline-end: 8px; + } +</style> + +<h1>cr-input</h1> + +<div class="demos"> + <cr-input + class="no-error" + type="text" + label="Standard input" + placeholder="Placeholder text" + value="{{textValue_}}"> + </cr-input> + + <cr-input + class="no-error" + type="search" + placeholder="Search a query" + value="{{searchValue_}}"> + <div slot="inline-prefix" class="cr-icon icon-search" alt=""></div> + <cr-icon-button class="icon-cancel" + hidden$="[[!searchValue_]]" slot="inline-suffix" + on-click="onClearSearchClick_" + title="Clear search"> + </cr-icon-button> + </cr-input> + + <cr-input + class="no-error" + label="Email address" + type="text" + placeholder="username" + value="{{emailValue_}}"> + <div slot="inline-suffix" class="domain-name">@chromium.org</div> + </cr-input> + + <cr-input + id="numberInput" + label="Number input" + type="number" + min="5" + max="200" + placeholder="A number between 5 and 200" + error-message="Number needs to be between 5 and 200" + value="{{numberValue_}}"> + <cr-button slot="suffix" on-click="onValidateClick_">Validate</cr-button> + </cr-input> + + <cr-input + label="Auto-validating pin" + type="password" + placeholder="Enter a pin of 4 digits" + pattern="[0-9]{4}" + error-message="Pin must be 4 digits" + value="{{pinValue_}}" + auto-validate> + </cr-input> + + <cr-input + class="no-error" + type="text" + label="Disabled input" + disabled + value="The value cannot be changed"> + </cr-input> + + <cr-input + class="no-error" + type="text" + label="Readonly input" + readonly + value="The value cannot be changed"> + </cr-input> + + <div> + <div>Text input value: [[textValue_]]</div> + <div>Search input value: [[searchValue_]]</div> + <div>Email input value: [[emailValue_]]</div> + <div>Number input value: [[numberValue_]]</div> + <div>Pin input value: [[pinValue_]]</div> + </div> +</div>
diff --git a/chrome/browser/resources/webui_gallery/demos/cr_input/cr_input_demo_component.ts b/chrome/browser/resources/webui_gallery/demos/cr_input/cr_input_demo_component.ts new file mode 100644 index 0000000..7299b74 --- /dev/null +++ b/chrome/browser/resources/webui_gallery/demos/cr_input/cr_input_demo_component.ts
@@ -0,0 +1,56 @@ +// 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://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/cr_input/cr_input.m.js'; +import 'chrome://resources/cr_elements/cr_icons_css.m.js'; +import 'chrome://resources/cr_elements/hidden_style_css.m.js'; + +import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {CrInputElement} from 'chrome://resources/cr_elements/cr_input/cr_input.m.js'; + +import {getTemplate} from './cr_input_demo_component.html.js'; + +interface CrInputDemoComponent { + $: { + numberInput: CrInputElement, + }; +} + +class CrInputDemoComponent extends PolymerElement { + static get is() { + return 'cr-input-demo'; + } + + static get template() { + return getTemplate(); + } + + static get properties() { + return { + emailValue_: String, + numberValue_: String, + pinValue_: String, + searchValue_: String, + textValue_: String, + }; + } + + private emailValue_: string; + private numberValue_: string; + private pinValue_: string; + private searchValue_: string; + private textValue_: string; + + private onClearSearchClick_() { + this.searchValue_ = ''; + } + + private onValidateClick_() { + this.$.numberInput.validate(); + } +} + +customElements.define(CrInputDemoComponent.is, CrInputDemoComponent);
diff --git a/chrome/browser/resources/webui_gallery/webui_gallery.gni b/chrome/browser/resources/webui_gallery/webui_gallery.gni index 7fd1caa..a55a60e 100644 --- a/chrome/browser/resources/webui_gallery/webui_gallery.gni +++ b/chrome/browser/resources/webui_gallery/webui_gallery.gni
@@ -8,6 +8,7 @@ "demos/cr_a11y_announcer_demo_component.ts", "demos/cr_action_menu_demo_component.ts", "demos/cr_dialog_demo_component.ts", + "demos/cr_input/cr_input_demo_component.ts", ] # Files that are passed as input to html_to_wrapper().
diff --git a/chrome/browser/serial/serial_policy_allowed_ports.cc b/chrome/browser/serial/serial_policy_allowed_ports.cc index 4c9f556..5732fa8 100644 --- a/chrome/browser/serial/serial_policy_allowed_ports.cc +++ b/chrome/browser/serial/serial_policy_allowed_ports.cc
@@ -80,16 +80,14 @@ void SerialPolicyAllowedPorts::LoadAllowAllPortsForUrlsPolicy() { all_ports_policy_.clear(); - const base::Value* pref_value = pref_change_registrar_.prefs()->Get( - prefs::kManagedSerialAllowAllPortsForUrls); - if (!pref_value) { - return; - } + const base::Value::List& pref_list = + pref_change_registrar_.prefs()->GetValueList( + prefs::kManagedSerialAllowAllPortsForUrls); // The pref value has already been validated by the policy handler, so it is // safe to assume that |pref_value| follows the policy template. std::vector<url::Origin> urls; - for (const auto& url_value : pref_value->GetListDeprecated()) { + for (const auto& url_value : pref_list) { GURL url(url_value.GetString()); if (!url.is_valid()) { continue; @@ -105,15 +103,13 @@ usb_device_policy_.clear(); usb_vendor_policy_.clear(); - const base::Value* pref_value = pref_change_registrar_.prefs()->Get( - prefs::kManagedSerialAllowUsbDevicesForUrls); - if (!pref_value) { - return; - } + const base::Value::List& pref_list = + pref_change_registrar_.prefs()->GetValueList( + prefs::kManagedSerialAllowUsbDevicesForUrls); // The pref value has already been validated by the policy handler, so it is // safe to assume that |pref_value| follows the policy template. - for (const auto& item : pref_value->GetListDeprecated()) { + for (const auto& item : pref_list) { const base::Value* urls_value = item.FindKey(kPrefUrlsKey); DCHECK(urls_value);
diff --git a/chrome/browser/tab_group/java/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter.java b/chrome/browser/tab_group/java/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter.java index 7c3743a..4b6efd0 100644 --- a/chrome/browser/tab_group/java/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter.java +++ b/chrome/browser/tab_group/java/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter.java
@@ -362,18 +362,28 @@ } /** - * This method moves Tab with id as {@code sourceTabId} out of the group it belongs to. + * This method moves Tab with id as {@code sourceTabId} out of the group it belongs to in the + * specified direction. * * @param sourceTabId The id of the {@link Tab} to get the source group. + * @param trailing True if the tab should be placed after the tab group when removed. False + * if it should be placed before. */ - public void moveTabOutOfGroup(int sourceTabId) { + public void moveTabOutOfGroupInDirection(int sourceTabId, boolean trailing) { TabModel tabModel = getTabModel(); Tab sourceTab = TabModelUtils.getTabById(tabModel, sourceTabId); int sourceIndex = tabModel.indexOf(sourceTab); TabGroup sourceTabGroup = mGroupIdToGroupMap.get(getRootId(sourceTab)); - Tab lastTabInSourceGroup = TabModelUtils.getTabById(tabModel, - sourceTabGroup.getTabIdForIndex(sourceTabGroup.getTabIdList().size() - 1)); - int targetIndex = tabModel.indexOf(lastTabInSourceGroup); + int targetIndex; + if (trailing) { + Tab lastTabInSourceGroup = TabModelUtils.getTabById(tabModel, + sourceTabGroup.getTabIdForIndex(sourceTabGroup.getTabIdList().size() - 1)); + targetIndex = tabModel.indexOf(lastTabInSourceGroup); + } else { + Tab firstTabInSourceGroup = + TabModelUtils.getTabById(tabModel, sourceTabGroup.getTabIdForIndex(0)); + targetIndex = tabModel.indexOf(firstTabInSourceGroup); + } assert targetIndex != TabModel.INVALID_TAB_INDEX; int prevFilterIndex = mGroupIdToGroupIndexMap.get(getRootId(sourceTab)); @@ -415,7 +425,16 @@ return; } // Plus one as offset because we are moving backwards in tab model. - tabModel.moveTab(sourceTab.getId(), targetIndex + 1); + tabModel.moveTab(sourceTab.getId(), trailing ? targetIndex + 1 : targetIndex); + } + + /** + * This method moves Tab with id as {@code sourceTabId} out of the group it belongs to. + * + * @param sourceTabId The id of the {@link Tab} to get the source group. + */ + public void moveTabOutOfGroup(int sourceTabId) { + moveTabOutOfGroupInDirection(sourceTabId, true); } private int getTabModelDestinationIndex(Tab destinationTab) { @@ -506,6 +525,20 @@ return getRelatedTabList(group.getTabIdList()); } + /** + * This method returns the number of tabs in a tab group with reference to {@code tabRootId} as + * group id. + * + * @param tabRootId The tab root id that is used to find the related group. + * @return The number of related tabs. + */ + public int getRelatedTabCountForRootId(int tabRootId) { + if (tabRootId == Tab.INVALID_TAB_ID) return 1; + TabGroup group = mGroupIdToGroupMap.get(tabRootId); + if (group == null) return 1; + return group.size(); + } + @Override public boolean hasOtherRelatedTabs(Tab tab) { int groupId = getRootId(tab);
diff --git a/chrome/browser/tab_group/junit/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilterUnitTest.java b/chrome/browser/tab_group/junit/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilterUnitTest.java index 8c1c6cf0..c41630d6 100644 --- a/chrome/browser/tab_group/junit/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilterUnitTest.java +++ b/chrome/browser/tab_group/junit/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilterUnitTest.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.tasks.tab_groups; +import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertTrue; import static org.hamcrest.CoreMatchers.equalTo; @@ -587,6 +588,23 @@ } @Test + public void moveTabOutOfGroupInDirection_NotTrailing() { + List<Tab> expectedTabModelBeforeUngroup = + new ArrayList<>(Arrays.asList(mTab1, mTab2, mTab3, mTab4, mTab5, mTab6)); + List<Tab> expectedTabModelAfterUngroup = + new ArrayList<>(Arrays.asList(mTab1, mTab3, mTab2, mTab4, mTab5, mTab6)); + assertArrayEquals(mTabs.toArray(), expectedTabModelBeforeUngroup.toArray()); + + mTabGroupModelFilter.moveTabOutOfGroupInDirection(TAB3_ID, false); + + verify(mTabModel).moveTab(mTab3.getId(), POSITION2); + verify(mTabGroupModelFilterObserver).didMoveTabOutOfGroup(mTab3, POSITION3); + assertThat(CriticalPersistedTabData.from(mTab3).getRootId(), equalTo(TAB3_ID)); + assertThat(CriticalPersistedTabData.from(mTab2).getRootId(), equalTo(TAB2_ID)); + assertArrayEquals(mTabs.toArray(), expectedTabModelAfterUngroup.toArray()); + } + + @Test public void mergeTabToGroup_NoUpdateTabModel() { List<Tab> expectedGroup = new ArrayList<>(Arrays.asList(mTab2, mTab3, mTab4)); @@ -993,6 +1011,22 @@ } @Test + public void testGetRelatedTabCountForRootId() { + assertEquals("Should have 1 related tab.", 1, + mTabGroupModelFilter.getRelatedTabCountForRootId(TAB1_ROOT_ID)); + assertEquals("Should have 2 related tabs.", 2, + mTabGroupModelFilter.getRelatedTabCountForRootId(TAB2_ROOT_ID)); + assertEquals("Should have 2 related tabs.", 2, + mTabGroupModelFilter.getRelatedTabCountForRootId(TAB3_ROOT_ID)); + assertEquals("Should have 1 related tab.", 1, + mTabGroupModelFilter.getRelatedTabCountForRootId(TAB4_ROOT_ID)); + assertEquals("Should have 2 related tabs.", 2, + mTabGroupModelFilter.getRelatedTabCountForRootId(TAB5_ROOT_ID)); + assertEquals("Should have 2 related tabs.", 2, + mTabGroupModelFilter.getRelatedTabCountForRootId(TAB6_ROOT_ID)); + } + + @Test public void testIndexOfAnUndoableClosedTabNotCrashing() { mTabGroupModelFilter.closeTab(mTab1); mTabGroupModelFilter.indexOf(mTab1);
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderProcessor.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderProcessor.java index d83cff7f..991747a 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderProcessor.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderProcessor.java
@@ -7,6 +7,7 @@ import android.content.Context; import org.chromium.base.metrics.RecordHistogram; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.omnibox.R; import org.chromium.chrome.browser.omnibox.suggestions.DropdownItemProcessor; import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestionUiType; @@ -19,6 +20,8 @@ private final SuggestionHost mSuggestionHost; private final UrlBarDelegate mUrlBarDelegate; private final int mMinimumHeight; + private boolean mShouldRemoveSuggestionHeaderChevron; + private boolean mAllowGroupCollapsedState; /** * @param context An Android context. @@ -55,29 +58,44 @@ final PropertyModel model, final int groupId, final String headerText) { model.set(HeaderViewProperties.TITLE, headerText); model.set(HeaderViewProperties.IS_COLLAPSED, false); - model.set(HeaderViewProperties.DELEGATE, new HeaderViewProperties.Delegate() { - @Override - public void onHeaderSelected() { - mUrlBarDelegate.setOmniboxEditingText(null); - } + model.set(HeaderViewProperties.SHOULD_REMOVE_CHEVRON, mShouldRemoveSuggestionHeaderChevron); + if (mAllowGroupCollapsedState) { + model.set(HeaderViewProperties.DELEGATE, new HeaderViewProperties.Delegate() { + @Override + public void onHeaderSelected() { + mUrlBarDelegate.setOmniboxEditingText(null); + } - @Override - public void onHeaderClicked() { - final boolean newState = !model.get(HeaderViewProperties.IS_COLLAPSED); - RecordHistogram.recordSparseHistogram(newState - ? "Omnibox.ToggleSuggestionGroupId.Off" - : "Omnibox.ToggleSuggestionGroupId.On", - groupId); + @Override + public void onHeaderClicked() { + final boolean newState = !model.get(HeaderViewProperties.IS_COLLAPSED); + RecordHistogram.recordSparseHistogram(newState + ? "Omnibox.ToggleSuggestionGroupId.Off" + : "Omnibox.ToggleSuggestionGroupId.On", + groupId); - model.set(HeaderViewProperties.IS_COLLAPSED, newState); - mSuggestionHost.setGroupCollapsedState(groupId, newState); - } - }); + model.set(HeaderViewProperties.IS_COLLAPSED, newState); + mSuggestionHost.setGroupCollapsedState(groupId, newState); + } + }); + } } @Override public void onUrlFocusChange(boolean hasFocus) {} + /** + * Signals that native initialization has completed. + * And cache the mShouldRemoveSuggestionHeaderChevron value from the flag. + */ @Override - public void onNativeInitialized() {} + public void onNativeInitialized() { + mShouldRemoveSuggestionHeaderChevron = ChromeFeatureList.isEnabled( + ChromeFeatureList.OMNIBOX_REMOVE_SUGGESTION_HEADER_CHEVRON); + + mAllowGroupCollapsedState = ChromeFeatureList.getFieldTrialParamByFeatureAsBoolean( + ChromeFeatureList.OMNIBOX_REMOVE_SUGGESTION_HEADER_CHEVRON, + "allow_group_collapsed_state", + /* default= */ true); + } }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderView.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderView.java index bb024cc..c76b015 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderView.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderView.java
@@ -73,7 +73,6 @@ getResources().getDimensionPixelSize(R.dimen.omnibox_suggestion_action_icon_width), LayoutParams.MATCH_PARENT)); addView(mHeaderIcon); - ViewCompat.setAccessibilityDelegate(this, new AccessibilityDelegateCompat() { @Override public void onInitializeAccessibilityNodeInfo( @@ -133,6 +132,16 @@ } } + /** + * Specifies whether the chevron on the right side of header should be removed. + * + * @param shouldRemoveSuggestionHeaderChevron true, if the chevron on the right side of header + * should be removed. + */ + void setShouldRemoveSuggestionHeaderChevron(boolean shouldRemoveSuggestionHeaderChevron) { + mHeaderIcon.setVisibility(shouldRemoveSuggestionHeaderChevron ? GONE : VISIBLE); + } + @Override public boolean onKeyDown(int keyCode, KeyEvent event) { boolean isRtl = getLayoutDirection() == LAYOUT_DIRECTION_RTL;
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewBinder.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewBinder.java index 881777e..3cb7a31a 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewBinder.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewBinder.java
@@ -45,6 +45,9 @@ view.setOnClickListener(null); view.setOnSelectListener(null); } + } else if (propertyKey == HeaderViewProperties.SHOULD_REMOVE_CHEVRON) { + view.setShouldRemoveSuggestionHeaderChevron( + model.get(HeaderViewProperties.SHOULD_REMOVE_CHEVRON)); } } }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewBinderUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewBinderUnitTest.java index 69c75c7..1aa33da9 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewBinderUnitTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewBinderUnitTest.java
@@ -142,4 +142,15 @@ verify(info, never()).addAction(AccessibilityAction.ACTION_COLLAPSE); verify(info, times(1)).addAction(AccessibilityAction.ACTION_EXPAND); } + + @Test + public void headerView_removeSuggestionHeaderChevron() { + // Remove Chevron. + mModel.set(HeaderViewProperties.SHOULD_REMOVE_CHEVRON, true); + verify(mHeaderView, times(1)).setShouldRemoveSuggestionHeaderChevron(true); + + // Restore Chevron. + mModel.set(HeaderViewProperties.SHOULD_REMOVE_CHEVRON, false); + verify(mHeaderView, times(1)).setShouldRemoveSuggestionHeaderChevron(false); + } }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewProperties.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewProperties.java index 07c2f73b..f6d089f 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewProperties.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewProperties.java
@@ -28,9 +28,12 @@ public static final WritableBooleanPropertyKey IS_COLLAPSED = new WritableBooleanPropertyKey(); /** The text content to be displayed as a header text. */ public static final WritableObjectPropertyKey<String> TITLE = new WritableObjectPropertyKey<>(); + /** The flag to state whether to remove the header chevron. */ + public static final WritableBooleanPropertyKey SHOULD_REMOVE_CHEVRON = + new WritableBooleanPropertyKey(); public static final PropertyKey[] ALL_UNIQUE_KEYS = - new PropertyKey[] {DELEGATE, IS_COLLAPSED, TITLE}; + new PropertyKey[] {DELEGATE, IS_COLLAPSED, TITLE, SHOULD_REMOVE_CHEVRON}; public static final PropertyKey[] ALL_KEYS = PropertyModel.concatKeys(ALL_UNIQUE_KEYS, SuggestionCommonProperties.ALL_KEYS);
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/mostvisited/MostVisitedTilesProcessor.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/mostvisited/MostVisitedTilesProcessor.java index 025a03d..0cad2ca 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/mostvisited/MostVisitedTilesProcessor.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/mostvisited/MostVisitedTilesProcessor.java
@@ -42,6 +42,7 @@ private final @NonNull FaviconFetcher mFaviconFetcher; private final int mMinCarouselItemViewHeight; private boolean mShouldWrapTitleText; + private boolean mEnableOrganicRepeatableQueries; /** * Constructor. @@ -84,6 +85,8 @@ public void onNativeInitialized() { mShouldWrapTitleText = ChromeFeatureList.isEnabled( ChromeFeatureList.OMNIBOX_MOST_VISITED_TILES_TITLE_WRAP_AROUND); + mEnableOrganicRepeatableQueries = + ChromeFeatureList.isEnabled(ChromeFeatureList.HISTORY_ORGANIC_REPEATABLE_QUERIES); } @Override @@ -97,7 +100,7 @@ final SuggestTile tile = tiles.get(elementIndex); final String title = tile.title; final GURL url = tile.url; - final boolean isSearch = tile.isSearch; + final boolean isSearch = tile.isSearch && mEnableOrganicRepeatableQueries; final int itemIndex = elementIndex; tileModel.set(TileViewProperties.TITLE, title);
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/mostvisited/MostVisitedTilesProcessorUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/mostvisited/MostVisitedTilesProcessorUnitTest.java index 79b0f33..44fbaddd 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/mostvisited/MostVisitedTilesProcessorUnitTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/mostvisited/MostVisitedTilesProcessorUnitTest.java
@@ -66,6 +66,8 @@ */ @RunWith(BaseRobolectricTestRunner.class) @Config(manifest = Config.NONE) +@EnableFeatures({ChromeFeatureList.OMNIBOX_MOST_VISITED_TILES_TITLE_WRAP_AROUND, + ChromeFeatureList.HISTORY_ORGANIC_REPEATABLE_QUERIES}) public final class MostVisitedTilesProcessorUnitTest { private static final GURL NAV_URL = JUnitTestGURLs.getGURL(JUnitTestGURLs.URL_1); private static final GURL NAV_URL_2 = JUnitTestGURLs.getGURL(JUnitTestGURLs.URL_2); @@ -110,6 +112,7 @@ */ private List<ListItem> populateTilePropertiesForTiles( int placement, AutocompleteMatch.SuggestTile... tiles) { + mProcessor.onNativeInitialized(); mMatch = new AutocompleteMatchBuilder().setSuggestTiles(Arrays.asList(tiles)).build(); mProcessor.populateModel(mMatch, mPropertyModel, placement); @@ -295,7 +298,6 @@ assertEquals(1, tileModel.get(TileViewProperties.TITLE_LINES)); } - @EnableFeatures(ChromeFeatureList.OMNIBOX_MOST_VISITED_TILES_TITLE_WRAP_AROUND) @Test public void testDescriptionWrapping_wrappingLine() { mProcessor.onNativeInitialized(); @@ -307,4 +309,29 @@ PropertyModel tileModel = tileItem.model; assertEquals(2, tileModel.get(TileViewProperties.TITLE_LINES)); } + + // The test below confirm that Repeatable Query appears like URL navigation if the feature is + // disabled. This is needed because in some cases a single Search query may be reported as a + // most visited site. This is WAI, but may be confusing. + // Note that the opposite is already tested by a different test in the suite - see: + // testDecorations_searchTile, which tests that decoration used for search tile is a magnifying + // glass when the feature is enabled. + @Test + @DisableFeatures({ChromeFeatureList.HISTORY_ORGANIC_REPEATABLE_QUERIES}) + public void testRepeatableQuery_featureDisabled() { + List<ListItem> tileList = + populateTilePropertiesForTiles(0, new SuggestTile("title", SEARCH_URL, true)); + verify(mFaviconFetcher, times(1)) + .fetchFaviconWithBackoff(eq(SEARCH_URL), anyBoolean(), any()); + mIconCallbackCaptor.getValue().onFaviconFetchComplete(mFaviconBitmap, 0); + assertEquals(1, tileList.size()); + ListItem tileItem = tileList.get(0); + PropertyModel tileModel = tileItem.model; + // Feature is disabled: this should not be shown as a search tile. + Drawable drawable = tileModel.get(TileViewProperties.ICON); + assertEquals(BaseCarouselSuggestionItemViewBuilder.ViewType.TILE_VIEW, tileItem.type); + assertThat(drawable, instanceOf(BitmapDrawable.class)); + Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap(); + assertEquals(mFaviconBitmap, bitmap); + } }
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb index 9a54b028..fc88334e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 aflaai is geskeduleer}other{# aflaaie is geskeduleer}}</translation> <translation id="3474624961160222204">Gaan voort as <ph name="NAME" /></translation> <translation id="3478363558367712427">Jy kan jou soekenjin kies</translation> +<translation id="3479552764303398839">Nie nou nie</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Kom meer te wete<ph name="END_LINK" /> oor voorgestelde inhoud</translation> <translation id="3495219333887281978">Aanmelding se onderste blad is teen halwe hoogte oopgemaak.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Sien jou topwerwe</translation> <translation id="4732120983431207637">Stapellosdraaier</translation> <translation id="4736934858538408121">Virtuele kaart</translation> +<translation id="473775607612524610">Dateer op</translation> <translation id="4738836084190194332">Laas gesinkroniseer: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Jy sal verbeterde voorstelle in die adresbalk kry</translation> <translation id="4742970037960872810">Verwyder kleurmerk</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb index 7028d84..665c36f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
@@ -97,6 +97,7 @@ <translation id="1428770807407000502">ስምረት ይጥፋ?</translation> <translation id="1430915738399379752">አትም</translation> <translation id="1436784010935106834">ተወግዷል</translation> +<translation id="1437543266176261764">በ<ph name="APP_NAME" /> በመሄድ ላይ</translation> <translation id="1448440926884431741">ክትትል የሚደረግባቸውን ምርቶች በዕልባቶች ውስጥ ያደራጁ</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> ን ማጋራት አይቻልም</translation> <translation id="1466383950273130737">የChromeን ቋንቋ ይምረጡ</translation> @@ -459,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 ውርድ መርሐግብት ተይዞለታል}one{# ውርዶች መርሐግብር ተይዞላቸዋል}other{# ውርዶች መርሐግብር ተይዞላቸዋል}}</translation> <translation id="3474624961160222204">እንደ <ph name="NAME" /> ይቀጥሉ</translation> <translation id="3478363558367712427">የፍለጋ ፕሮግራምዎን መምረጥ ይችላሉ</translation> +<translation id="3479552764303398839">አሁን አይደለም</translation> <translation id="3493531032208478708">ስለሚጠቆም ይዘት <ph name="BEGIN_LINK" />የበለጠ ለመረዳት<ph name="END_LINK" /></translation> <translation id="3495219333887281978">የመግቢያ የግርጌ ሉህ በግማሽ ቁመት ተከፍቷል።</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -666,6 +668,7 @@ <translation id="47217992755561375">ከፍተኛዎቹ ጣቢያዎችዎን ይመልከቱ</translation> <translation id="4732120983431207637">ድርድር ወደ ኋላ ማጠንጠኛ</translation> <translation id="4736934858538408121">ምናባዊ ካርድ</translation> +<translation id="473775607612524610">አዘምን</translation> <translation id="4738836084190194332">የተመሳሰለበት የመጨረሻው ጊዜ፦ <ph name="WHEN" /></translation> <translation id="4741753828624614066">በአድራሻ አሞሌው ውስጥ የተሻሻሉ የአስተያየትጥቆማዎችን ያገኛሉ</translation> <translation id="4742970037960872810">ማድመቂያውን አስወግድ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb index e325e65..1731ae81 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{تمّت جدوَلة عملية تنزيل واحدة.}zero{تمّت جدوَلة # عملية تنزيل.}two{تمّت جدوَلة عمليتَي تنزيل.}few{تمّت جدوَلة # عمليات تنزيل.}many{تمّت جدوَلة # عملية تنزيل.}other{تمّت جدوَلة # عملية تنزيل.}}</translation> <translation id="3474624961160222204">المتابعة باسم <ph name="NAME" /></translation> <translation id="3478363558367712427">يمكنك استخدام محرّك بحث آخر.</translation> +<translation id="3479552764303398839">ليس الآن</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /> حول المحتوى المقترح</translation> <translation id="3495219333887281978">تم فتح البطاقة السفلية لتسجيل الدخول في نصف الشاشة.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">الاطّلاع على أهم المواقع الإلكترونية</translation> <translation id="4732120983431207637">Stack Unwinder</translation> <translation id="4736934858538408121">البطاقة الافتراضية</translation> +<translation id="473775607612524610">تحديث</translation> <translation id="4738836084190194332">آخر مزامنة: <ph name="WHEN" /></translation> <translation id="4741753828624614066">ستحصل على اقتراحات محسّنة في شريط العناوين</translation> <translation id="4742970037960872810">إزالة التمييز</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb index 2a99d98..210becc 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{১ টা ডাউনল’ডৰ সময়সূচী নিৰ্ধাৰণ কৰা হৈছে}one{# টা ডাউনল’ডৰ সময়সূচী নিৰ্ধাৰণ কৰা হৈছে}other{# টা ডাউনল’ডৰ সময়সূচী নিৰ্ধাৰণ কৰা হৈছে}}</translation> <translation id="3474624961160222204"><ph name="NAME" /> হিচাপে অব্যাহত ৰাখক</translation> <translation id="3478363558367712427">আপুনি নিজৰ সন্ধান ইঞ্জিন বাছনি কৰিব পাৰে</translation> +<translation id="3479552764303398839">এতিয়া নহয়</translation> <translation id="3493531032208478708">পৰামৰ্শ দিয়া সমলৰ বিষয়ে <ph name="BEGIN_LINK" />অধিক জানক<ph name="END_LINK" /></translation> <translation id="3495219333887281978">ছাইন ইন কৰাৰ সুবিধা থকা তলৰ শ্বীটখন অৰ্ধ উচ্চতাত খোলা হৈছে।</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">আপোনাৰ শীৰ্ষ ছাইটসমূহ চাওক</translation> <translation id="4732120983431207637">ষ্টেক আনৱিণ্ডাৰ</translation> <translation id="4736934858538408121">ভাৰ্চুৱেল কাৰ্ড</translation> +<translation id="473775607612524610">আপডে'ট কৰক</translation> <translation id="4738836084190194332">অন্তিমবাৰ ছিংক কৰা সময়: <ph name="WHEN" /></translation> <translation id="4741753828624614066">আপুনি ঠিকনাৰ বাৰত উন্নত পৰামৰ্শসমূহ পাব</translation> <translation id="4742970037960872810">হাইলাইট আঁতৰাওক</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb index ac5c70b..9f4431c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 endirmə planlanıb}other{# endirmə planlanıb}}</translation> <translation id="3474624961160222204"><ph name="NAME" /> olaraq davam edin</translation> <translation id="3478363558367712427">Axtarış maşınını seçə bilərsiniz</translation> +<translation id="3479552764303398839">İndi yox</translation> <translation id="3493531032208478708">Təklif məzmunu haqqında <ph name="BEGIN_LINK" />daha ətraflı<ph name="END_LINK" /></translation> <translation id="3495219333887281978">Giriş alt vərəqi yarı hündürlükdə açılıb.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -668,6 +669,7 @@ <translation id="47217992755561375">Populyar saytlara baxın</translation> <translation id="4732120983431207637">Stellaj Açıcı</translation> <translation id="4736934858538408121">Virtual kart</translation> +<translation id="473775607612524610">Güncəlləşdirin</translation> <translation id="4738836084190194332">Sonuncu dəfə sinxronizasiya olunub: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Ünvan panelində təkmilləşdirilmiş təkliflər alacaqsınız</translation> <translation id="4742970037960872810">Vurğulamanı silin</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb index 9e94bc9..9548655c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{Запланавана 1 спампоўка}one{Запланавана # спампоўка}few{Запланавана # спампоўкі}many{Запланавана # спамповак}other{Запланавана # спампоўкі}}</translation> <translation id="3474624961160222204">Працягнуць як <ph name="NAME" /></translation> <translation id="3478363558367712427">Вы можаце выбраць пошукавую сістэму</translation> +<translation id="3479552764303398839">Не зараз</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Даведацца больш<ph name="END_LINK" /> пра прапанаванае змесціва</translation> <translation id="3495219333887281978">Ніжні аркуш са спісам даступных для выбару ўліковых запісаў разгорнуты на палову экрана.</translation> <translation id="3499246418971111862">chrome_qr-код_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Прагледзьце папулярныя сайты</translation> <translation id="4732120983431207637">Размотчык стэка</translation> <translation id="4736934858538408121">Віртуальная картка</translation> +<translation id="473775607612524610">Абнавіць</translation> <translation id="4738836084190194332">Апошняя сінхранізацыя: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Вы будзеце атрымліваць лепшыя прапановы ў адрасным радку.</translation> <translation id="4742970037960872810">Выдаліць вылучэнне</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb index 7899c06..bb5f479f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{Насрочено е 1 изтегляне}other{Насрочени са # изтегляния}}</translation> <translation id="3474624961160222204">Продължаване като <ph name="NAME" /></translation> <translation id="3478363558367712427">Можете да изберете търсещата си машина</translation> +<translation id="3479552764303398839">Не сега</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Научете повече<ph name="END_LINK" /> за предложеното съдържание</translation> <translation id="3495219333887281978">Долният лист за вход в профила е отворен на половината височина.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Преглед на водещите сайтове за вас</translation> <translation id="4732120983431207637">Stack Unwinder</translation> <translation id="4736934858538408121">Виртуална карта</translation> +<translation id="473775607612524610">Актуализиране</translation> <translation id="4738836084190194332">Последно синхронизиране: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Ще получавате подобрени предложения в адресната лента</translation> <translation id="4742970037960872810">Премахване на открояването</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb index ec753da..fb9a380 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{১টি ডাউনলোড শিডিউল করা হয়েছে}one{#টি ডাউনলোড শিডিউল করা হয়েছে}other{#টি ডাউনলোড শিডিউল করা হয়েছে}}</translation> <translation id="3474624961160222204"><ph name="NAME" /> হিসাবে চালিয়ে যান</translation> <translation id="3478363558367712427">আপনার সার্চ ইঞ্জিন বেছে নিতে পারেন</translation> +<translation id="3479552764303398839">এখনই নয়</translation> <translation id="3493531032208478708">প্রস্তাবিত কন্টেন্ট সম্পর্কে <ph name="BEGIN_LINK" />আরও জানুন<ph name="END_LINK" /></translation> <translation id="3495219333887281978">স্ক্রিনের নিচে অ্যাটাচ করা শিটে সাইন-ইন করার সুবিধা অর্ধেক স্ক্রিন জুড়ে খুলেছে।</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -669,6 +670,7 @@ <translation id="47217992755561375">আপনার জন্য বেছে নেওয়া সেরা সাইট দেখুন</translation> <translation id="4732120983431207637">স্ট্যাক আনউইন্ডার</translation> <translation id="4736934858538408121">ভার্চুয়াল কার্ড</translation> +<translation id="473775607612524610">আপডেট করুন</translation> <translation id="4738836084190194332">সর্বশেষ সিঙ্ক হয়েছে: <ph name="WHEN" /></translation> <translation id="4741753828624614066">অ্যাড্রেস বারে উন্নত সাজেশন পাবেন</translation> <translation id="4742970037960872810">হাইলাইট সরিয়ে দিন</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb index 0e926c1..eda52a4 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
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{Zakazano je 1 preuzimanje}one{Zakazano je # preuzimanje}few{Zakazana su # preuzimanja}other{Zakazano je # preuzimanja}}</translation> <translation id="3474624961160222204">Nastavi kao <ph name="NAME" /></translation> <translation id="3478363558367712427">Možete odabrati svoj pretraživač</translation> +<translation id="3479552764303398839">Ne sada</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /> o predloženom sadržaju</translation> <translation id="3495219333887281978">Donja tabela za prijavu je otvorena na pola visine.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -489,7 +490,7 @@ <translation id="3622349720008044802">Upravljajte prozorima</translation> <translation id="3631987586758005671">Dijeljenje s uređajem <ph name="DEVICE_NAME" /></translation> <translation id="363596933471559332">Automatski se prijavite na web lokacije korištenjem pohranjenih akreditiva. Kada je ova funkcija isključena, od vas će se tražiti potvrda prilikom svake prijave na web lokaciju.</translation> -<translation id="3636940436873918441">Preferirani jezici</translation> +<translation id="3636940436873918441">Željeni jezici</translation> <translation id="3677911431265050325">Zatraži web lokaciju za mobilni uređaj</translation> <translation id="3687645719033307815">Prikazan vam je pregled ove stranice</translation> <translation id="3690369331356918524">Upozorava vas ako su lozinke izložene prilikom narušavanja podataka</translation> @@ -668,6 +669,7 @@ <translation id="47217992755561375">Pogledajte najpopularnije web lokacije</translation> <translation id="4732120983431207637">Rastvarač grupe</translation> <translation id="4736934858538408121">Virtuelna kartica</translation> +<translation id="473775607612524610">Ažuriraj</translation> <translation id="4738836084190194332">Posljednji put sinhronizirano: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Dobijat ćete poboljšane prijedloge u traci za adresu</translation> <translation id="4742970037960872810">Ukloni istaknuti tekst</translation> @@ -1279,7 +1281,7 @@ <translation id="7942131818088350342">Proizvod <ph name="PRODUCT_NAME" /> je zastario.</translation> <translation id="7944772052836377867">Sinhronizacija mora potvrditi da ste to vi</translation> <translation id="7947953824732555851">Prihvati i prijavi me</translation> -<translation id="7957413488482743710">Virtualna kartica skriva vašu stvarnu karticu kako bi vas bolje zaštitila od potencijalne prijevare. <ph name="BEGIN_LINK1" />Saznajte više o virtualnim karticama<ph name="END_LINK1" /></translation> +<translation id="7957413488482743710">Virtuelna kartica sakriva stvarnu karticu radi zaštite od potencijalne prevare. <ph name="BEGIN_LINK1" />Saznajte više o virtuelnim karticama<ph name="END_LINK1" /></translation> <translation id="7961015016161918242">Nikada</translation> <translation id="7961926449547174351">Onemogućili ste pristup pohrani. Idite u Postavke da ga omogućite.</translation> <translation id="7963646190083259054">Dobavljač:</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb index 71624c91..5ae47c5a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{S'ha programat 1 baixada}other{S'han programat # baixades}}</translation> <translation id="3474624961160222204">Continua com a <ph name="NAME" /></translation> <translation id="3478363558367712427">Pots triar el motor de cerca que prefereixis</translation> +<translation id="3479552764303398839">Ara no</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Més informació<ph name="END_LINK" /> sobre el contingut suggerit</translation> <translation id="3495219333887281978">El full inferior d'inici de sessió s'ha obert a mitja alçada.</translation> <translation id="3499246418971111862">chrome_codiqr_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Consulta els llocs web que més visites</translation> <translation id="4732120983431207637">Anul·lador de piles</translation> <translation id="4736934858538408121">Targeta virtual</translation> +<translation id="473775607612524610">Actualitza</translation> <translation id="4738836084190194332">Última sincronització: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Obtindrás suggeriments millorats a la barra d'adreces</translation> <translation id="4742970037960872810">Suprimeix les marques</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb index 6952a98..d48714ed 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{Je naplánováno stažení 1 souboru}few{Je naplánováno stažení # souborů}many{Je naplánováno stažení # souboru}other{Je naplánováno stažení # souborů}}</translation> <translation id="3474624961160222204">Pokrač. jako <ph name="NAME" /></translation> <translation id="3478363558367712427">Můžete si vybrat vyhledávač</translation> +<translation id="3479552764303398839">Teď ne</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Další informace<ph name="END_LINK" /> o navrhovaném obsahu</translation> <translation id="3495219333887281978">Spodní tabulka s přihlášením je otevřená na polovinu výšky</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -668,6 +669,7 @@ <translation id="47217992755561375">Zobrazit vaše top weby</translation> <translation id="4732120983431207637">Rozbalovač zásobníku</translation> <translation id="4736934858538408121">Virtuální karta</translation> +<translation id="473775607612524610">Aktualizovat</translation> <translation id="4738836084190194332">Poslední synchronizace: <ph name="WHEN" /></translation> <translation id="4741753828624614066">V adresním řádku se vám budou zobrazovat lepší návrhy</translation> <translation id="4742970037960872810">Odstranit zvýraznění</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb index a02db1d..3240b18 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{Mae 1 lawrlwythiad wedi'i drefnu}zero{Mae # lawrlwythiad wedi'u trefnu}two{Mae # lawrlwythiad wedi'u trefnu}few{Mae # lawrlwythiad wedi'u trefnu}many{Mae # lawrlwythiad wedi'u trefnu}other{Mae # lawrlwythiad wedi'u trefnu}}</translation> <translation id="3474624961160222204">Parhau fel <ph name="NAME" /></translation> <translation id="3478363558367712427">Gallwch ddewis eich peiriant chwilio</translation> +<translation id="3479552764303398839">Nid nawr</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Dysgu rhagor<ph name="END_LINK" /> am gynnwys a awgrymir</translation> <translation id="3495219333887281978">Mae'r ddalen waelod mewngofnodi wedi'i hagor ar hanner uchder.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Gweld eich hoff wefannau</translation> <translation id="4732120983431207637">Dadweindiwr pentyrrau</translation> <translation id="4736934858538408121">Cerdyn rhithwir</translation> +<translation id="473775607612524610">Diweddaru</translation> <translation id="4738836084190194332">Cysonwyd ddiwethaf: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Byddwch yn cael awgrymiadau gwell yn y bar cyfeiriadau</translation> <translation id="4742970037960872810">Tynnu'r amlygu</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 3ca9b89..696965d6 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
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 planlagt download.}one{# planlagt download.}other{# planlagte downloads.}}</translation> <translation id="3474624961160222204">Fortsæt som <ph name="NAME" /></translation> <translation id="3478363558367712427">Du kan vælge din søgemaskine</translation> +<translation id="3479552764303398839">Ikke nu</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Få flere oplysninger<ph name="END_LINK" /> om anbefalet indhold</translation> <translation id="3495219333887281978">Loginfeltet i bunden er åbnet i halv højde.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Se dine mest anvendte websites</translation> <translation id="4732120983431207637">Stack Unwinder</translation> <translation id="4736934858538408121">Virtuelt kort</translation> +<translation id="473775607612524610">Opdater</translation> <translation id="4738836084190194332">Seneste synkronisering: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Du får vist forbedrede forslag i adresselinjen</translation> <translation id="4742970037960872810">Fjern fremhævning</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb index f92ad766..bc16dd45 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 Download geplant}other{# Downloads geplant}}</translation> <translation id="3474624961160222204">Als "<ph name="NAME" />" fortfahren</translation> <translation id="3478363558367712427">Du kannst deine Suchmaschine auswählen</translation> +<translation id="3479552764303398839">Jetzt nicht</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /> zu vorgeschlagenen Inhalten</translation> <translation id="3495219333887281978">Ansicht zum Anmelden am unteren Rand ist halb geöffnet.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Deine Top-Websites aufrufen</translation> <translation id="4732120983431207637">Stack Unwinder</translation> <translation id="4736934858538408121">Virtuelle Karte</translation> +<translation id="473775607612524610">Aktualisieren</translation> <translation id="4738836084190194332">Letzte Synchronisierung: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Du erhältst bessere Vorschläge in der Adressleiste</translation> <translation id="4742970037960872810">Markierung entfernen</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb index 5485d4a..666449a8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{Προγραμματίστηκε 1 λήψη.}other{Προγραμματίστηκαν # λήψεις.}}</translation> <translation id="3474624961160222204">Συνέχεια <ph name="NAME" /></translation> <translation id="3478363558367712427">Μπορείτε να επιλέξετε τη μηχανή αναζήτησής σας</translation> +<translation id="3479552764303398839">Όχι τώρα</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Μάθετε περισσότερα<ph name="END_LINK" /> σχετικά με το προτεινόμενο περιεχόμενο</translation> <translation id="3495219333887281978">Το φύλλο κάτω μέρους για σύνδεση είναι ανοιχτό στο μισό ύψος.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Δείτε τους κορυφαίους ιστοτόπους σας.</translation> <translation id="4732120983431207637">Stack Unwinder</translation> <translation id="4736934858538408121">Εικονική κάρτα</translation> +<translation id="473775607612524610">Ενημέρωση</translation> <translation id="4738836084190194332">Τελευταίος συγχρονισμός: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Θα λαμβάνετε βελτιωμένες προτάσεις στη γραμμή διευθύνσεων</translation> <translation id="4742970037960872810">Κατάργηση επισήμανσης</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb index 4ccdc67..1b14722 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 download scheduled}other{# downloads scheduled}}</translation> <translation id="3474624961160222204">Continue as <ph name="NAME" /></translation> <translation id="3478363558367712427">You can choose your search engine</translation> +<translation id="3479552764303398839">Not now</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Find out more<ph name="END_LINK" /> about suggested content</translation> <translation id="3495219333887281978">Sign-in bottom sheet opened at half height.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">See your top sites</translation> <translation id="4732120983431207637">Stack unwinder</translation> <translation id="4736934858538408121">Virtual card</translation> +<translation id="473775607612524610">Update</translation> <translation id="4738836084190194332">Last synced: <ph name="WHEN" /></translation> <translation id="4741753828624614066">You’ll get improved suggestions in the address bar</translation> <translation id="4742970037960872810">Remove highlight</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb index 26db970..09e6711f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{Se programó 1 descarga.}other{Se programaron # descargas.}}</translation> <translation id="3474624961160222204">Continuar como <ph name="NAME" /></translation> <translation id="3478363558367712427">Puedes elegir tu motor de búsqueda</translation> +<translation id="3479552764303398839">Ahora no</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /> sobre el contenido sugerido</translation> <translation id="3495219333887281978">La hoja inferior de acceso está abierta a media altura.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Visualiza los sitios que más visitas</translation> <translation id="4732120983431207637">Desenredo de pila</translation> <translation id="4736934858538408121">Tarjeta virtual</translation> +<translation id="473775607612524610">Actualizar</translation> <translation id="4738836084190194332">Última sincronización: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Recibirás mejores sugerencias en la barra de direcciones.</translation> <translation id="4742970037960872810">Dejar de destacar</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb index 14fc6d6a..683fd04b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 descarga programada}other{# descargas programadas}}</translation> <translation id="3474624961160222204">Continuar como <ph name="NAME" /></translation> <translation id="3478363558367712427">Puedes elegir tu buscador</translation> +<translation id="3479552764303398839">Ahora no</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /> sobre el contenido sugerido</translation> <translation id="3495219333887281978">Hoja inferior de inicio de sesión abierta a media altura.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Ver tus sitios favoritos</translation> <translation id="4732120983431207637">Desenrollado de pila</translation> <translation id="4736934858538408121">Tarjeta virtual</translation> +<translation id="473775607612524610">Actualizar</translation> <translation id="4738836084190194332">Última sincronización: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Recibirás sugerencias mejoradas en la barra de direcciones.</translation> <translation id="4742970037960872810">Eliminar resaltado</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb index acf2ad21..a8c7eaa 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 allalaadimine on ajastatud}other{# allalaadimist on ajastatud}}</translation> <translation id="3474624961160222204">Jätka kasutajana <ph name="NAME" /></translation> <translation id="3478363558367712427">Võite valida oma otsingumootori</translation> +<translation id="3479552764303398839">Mitte praegu</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Lisateave<ph name="END_LINK" /> soovitatud sisu kohta</translation> <translation id="3495219333887281978">Sisselogimise alumine leht on avatud poolel kõrgusel.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Vaadake oma sageli külastatud saite</translation> <translation id="4732120983431207637">Virnaharutaja</translation> <translation id="4736934858538408121">Virtuaalkaart</translation> +<translation id="473775607612524610">Värskenda</translation> <translation id="4738836084190194332">Viimati sünkroonitud: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Saate aadressiribal täiustatud soovitusi</translation> <translation id="4742970037960872810">Eemalda esiletõstmine</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb index 80220a50..42b2ec2 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 deskarga programatu}other{# deskarga programatu}}</translation> <translation id="3474624961160222204">Erabili <ph name="NAME" /></translation> <translation id="3478363558367712427">Bilatzailea aukera dezakezu</translation> +<translation id="3479552764303398839">Orain ez</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Lortu informazio gehiago<ph name="END_LINK" /> iradokitako edukiari buruz</translation> <translation id="3495219333887281978">Pantailaren behealdean ainguratutako orria, saioa hasteko balio duena, altuera erdian irekita dago.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Ikusi zure webgune nagusiak</translation> <translation id="4732120983431207637">Pila-ezabatzailea</translation> <translation id="4736934858538408121">Txartel birtuala</translation> +<translation id="473775607612524610">Eguneratu</translation> <translation id="4738836084190194332">Azken sinkronizazioa: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Iradokizun hobeak jasoko dituzu helbide-barran.</translation> <translation id="4742970037960872810">Kendu nabarmentzea</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb index da11010..dd9e294 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{یک بارگیری زمانبندی شد}one{# بارگیری زمانبندی شد}other{# بارگیری زمانبندی شد}}</translation> <translation id="3474624961160222204">ادامه دادن بهعنوان <ph name="NAME" /></translation> <translation id="3478363558367712427">میتوانید موتور جستجویتان را انتخاب کنید</translation> +<translation id="3479552764303398839">حالا نه</translation> <translation id="3493531032208478708">درباره محتوای پیشنهادی <ph name="BEGIN_LINK" />بیشتر بدانید<ph name="END_LINK" /></translation> <translation id="3495219333887281978">برگ زیرین ورود به سیستم نیمهباز شده است.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -489,6 +490,7 @@ <translation id="3622349720008044802">مدیریت پنجرهها</translation> <translation id="3631987586758005671">درحال همرسانی با <ph name="DEVICE_NAME" /></translation> <translation id="363596933471559332">با استفاده از اعتبارنامههای ذخیره شده، بهطور خودکار به سیستم وبسایتها وارد شوید. وقتی این قابلیت خاموش است، هر بار قبل از وارد شدن به سیستم وبسایت از شما خواسته میشود اطلاعات را تأیید کنید.</translation> +<translation id="3636940436873918441">زبانهای ترجیحی</translation> <translation id="3677911431265050325">درخواست سایت ویژه دستگاه همراه</translation> <translation id="3687645719033307815">درحال مشاهده پیشنمای این صفحه هستید</translation> <translation id="3690369331356918524">اگر گذرواژهها بهدلیل نقض داده درمعرض خطر باشد، به شما هشدار میدهد</translation> @@ -667,6 +669,7 @@ <translation id="47217992755561375">دیدن سایتهای برتر شما</translation> <translation id="4732120983431207637">گرهگشای پشته</translation> <translation id="4736934858538408121">کارت مجازی</translation> +<translation id="473775607612524610">بهروزرسانی</translation> <translation id="4738836084190194332">آخرین همگامسازی: <ph name="WHEN" /></translation> <translation id="4741753828624614066">پیشنهادهای بهبودیافتهای در نوار نشانی دریافت خواهید کرد</translation> <translation id="4742970037960872810">برداشتن برجستهسازی</translation> @@ -1278,6 +1281,7 @@ <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> قدیمی است.</translation> <translation id="7944772052836377867">همگامسازی باید هویتتان را تأیید کند</translation> <translation id="7947953824732555851">پذیرش و ورود به سیستم</translation> +<translation id="7957413488482743710">کارت مجازی با پنهان کردن کارت واقعیتان از شما دربرابر کلاهبرداریهای احتمالی محافظت میکند. <ph name="BEGIN_LINK1" />درباره کارتهای مجازی بیشتر بدانید<ph name="END_LINK1" /></translation> <translation id="7961015016161918242">هرگز</translation> <translation id="7961926449547174351">دسترسی به «فضای ذخیرهسازی» را غیرفعال کردهاید، لطفاً برای فعال کردن آن به «تنظیمات» بروید.</translation> <translation id="7963646190083259054">ارائهدهنده:</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb index 4ee717a..28e7185 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 lataus ajoitettu}other{# latausta ajoitettu}}</translation> <translation id="3474624961160222204">Jatka käyttäjänä <ph name="NAME" /></translation> <translation id="3478363558367712427">Voit valita hakukoneen</translation> +<translation id="3479552764303398839">Ei nyt</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Lue lisätietoja<ph name="END_LINK" /> suositellusta sisällöstä.</translation> <translation id="3495219333887281978">Kirjautumispaneeli avattu puolelle näytölle.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Katso suositut sivustosi</translation> <translation id="4732120983431207637">Pinon tyhjentäjä</translation> <translation id="4736934858538408121">Virtuaalinen kortti</translation> +<translation id="473775607612524610">Päivitä</translation> <translation id="4738836084190194332">Viimeisin synkronointi: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Näet parempia ehdotuksia osoitepalkissa</translation> <translation id="4742970037960872810">Poista korostus</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb index 4087ec3..1a292db 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 download ang nakaiskedyul}one{# download ang nakaiskedyul}other{# na download ang nakaiskedyul}}</translation> <translation id="3474624961160222204">Magpatuloy bilang si <ph name="NAME" /></translation> <translation id="3478363558367712427">Puwede mong piliin ang iyong search engine</translation> +<translation id="3479552764303398839">Hindi ngayon</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Matuto pa<ph name="END_LINK" /> tungkol sa iminumungkahing content</translation> <translation id="3495219333887281978">Nakabukas ang bottom sheet sa pag-sign in nang kalahati ang taas.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -489,6 +490,7 @@ <translation id="3622349720008044802">Pamahalaan ang mga window</translation> <translation id="3631987586758005671">Ibinabahagi sa <ph name="DEVICE_NAME" /></translation> <translation id="363596933471559332">Awtomatikong mag-sign in sa mga website gamit ang mga naka-store na kredensyal. Kapag naka-off ang feature, hihilingin sa iyong mag-verify sa tuwing magsa-sign in ka sa isang website.</translation> +<translation id="3636940436873918441">Mga gustong wika</translation> <translation id="3677911431265050325">Hilingin ang pang-mobile na site</translation> <translation id="3687645719033307815">Tinitingnan mo ang preview ng page na ito</translation> <translation id="3690369331356918524">Babalaan ka kung mae-expose ang mga password sa isang paglabag sa data</translation> @@ -667,6 +669,7 @@ <translation id="47217992755561375">Tingnan ang iyong mga nangungunang site</translation> <translation id="4732120983431207637">Stack Unwinder</translation> <translation id="4736934858538408121">Virtual na card</translation> +<translation id="473775607612524610">I-update</translation> <translation id="4738836084190194332">Huling na-sync: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Makakakuha ka ng mas magagandang suhestiyon sa address bar</translation> <translation id="4742970037960872810">Alisin ang highlight</translation> @@ -1278,6 +1281,7 @@ <translation id="7942131818088350342">Luma na ang <ph name="PRODUCT_NAME" />.</translation> <translation id="7944772052836377867">Kailangang ma-verify ng pag-sync na ikaw ito</translation> <translation id="7947953824732555851">I-accept, mag-sign in</translation> +<translation id="7957413488482743710">Itinatago ng virtual card ang iyong aktwal na card para makatulong na protektahan ka laban sa potensyal na panloloko. <ph name="BEGIN_LINK1" />Matuto pa tungkol sa mga virtual na card<ph name="END_LINK1" /></translation> <translation id="7961015016161918242">Hindi Kailanman</translation> <translation id="7961926449547174351">Na-disable mo ang access sa Storage, pumunta sa Mga Setting para i-enable ito.</translation> <translation id="7963646190083259054">Vendor:</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 43c9188..ede6636 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
@@ -97,6 +97,7 @@ <translation id="1428770807407000502">Désactiver la synchronisation?</translation> <translation id="1430915738399379752">Imprimer</translation> <translation id="1436784010935106834">Supprimés</translation> +<translation id="1437543266176261764">En cours d'exécution dans <ph name="APP_NAME" /></translation> <translation id="1448440926884431741">Organisez vos produits suivis dans vos favoris</translation> <translation id="1450753235335490080">Impossible de partager l'élément suivant : <ph name="CONTENT_TYPE" /></translation> <translation id="1466383950273130737">Choisir la langue de Chrome</translation> @@ -459,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 téléchargement programmé}one{# téléchargement programmé}other{# téléchargements programmés}}</translation> <translation id="3474624961160222204">Contin. comme <ph name="NAME" /></translation> <translation id="3478363558367712427">Vous pouvez choisir votre moteur de recherche</translation> +<translation id="3479552764303398839">Pas maintenant</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /> sur le contenu suggéré</translation> <translation id="3495219333887281978">La zone de contenu dans le bas de l'écran de connexion est ouverte à mi-hauteur.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -666,6 +668,7 @@ <translation id="47217992755561375">Afficher vos sites les plus fréquentés</translation> <translation id="4732120983431207637">Dérouleur de pile</translation> <translation id="4736934858538408121">Carte virtuelle</translation> +<translation id="473775607612524610">Mise à jour</translation> <translation id="4738836084190194332">Dernière synchronisation : <ph name="WHEN" /></translation> <translation id="4741753828624614066">Vous recevrez des suggestions améliorées dans la barre d'adresse</translation> <translation id="4742970037960872810">Retirer la surbrillance</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb index f5f4145..800fb59 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 téléchargement planifié}one{# téléchargement planifié}other{# téléchargements planifiés}}</translation> <translation id="3474624961160222204">Continuer en tant que <ph name="NAME" /></translation> <translation id="3478363558367712427">Vous pouvez choisir votre moteur de recherche</translation> +<translation id="3479552764303398839">Pas maintenant</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /> sur le contenu suggéré</translation> <translation id="3495219333887281978">Bottom sheet de connexion ouverte à mi-hauteur.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Retrouvez les meilleurs sites pour vous</translation> <translation id="4732120983431207637">Dérouleur de pile</translation> <translation id="4736934858538408121">Carte virtuelle</translation> +<translation id="473775607612524610">Mettre à jour</translation> <translation id="4738836084190194332">Dernière synchronisation : <ph name="WHEN" /></translation> <translation id="4741753828624614066">Vous obtiendrez des suggestions améliorées dans la barre d'adresse</translation> <translation id="4742970037960872810">Supprimer la surbrillance</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb index 1f81420b..87e2096 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{Hai 1 descarga programada}other{Hai # descargas programadas}}</translation> <translation id="3474624961160222204">Continuar como <ph name="NAME" /></translation> <translation id="3478363558367712427">Podes escoller o motor de busca</translation> +<translation id="3479552764303398839">Agora non</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Máis información<ph name="END_LINK" /> acerca do contido suxerido</translation> <translation id="3495219333887281978">Panel inferior de inicio de sesión aberto ata media altura.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Ver os teus sitios favoritos</translation> <translation id="4732120983431207637">Recuperador de pillas</translation> <translation id="4736934858538408121">Tarxeta virtual</translation> +<translation id="473775607612524610">Actualizar</translation> <translation id="4738836084190194332">Última sincronización: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Recibirás suxestións melloradas na barra de enderezos</translation> <translation id="4742970037960872810">Deixar de salientar texto</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb index 78bb2c6..9f3db8f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 ડાઉનલોડ શેડ્યૂલ કર્યુ છે}one{# ડાઉનલોડ શેડ્યૂલ કર્યુ છે}other{# ડાઉનલોડ શેડ્યૂલ કર્યા છે}}</translation> <translation id="3474624961160222204"><ph name="NAME" /> તરીકે ચાલુ રાખો</translation> <translation id="3478363558367712427">તમે તમારું શોધ એન્જિન પસંદ કરી શકો છો</translation> +<translation id="3479552764303398839">હમણાં નહીં</translation> <translation id="3493531032208478708">સૂચવેલ કન્ટેન્ટ વિશે <ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" /></translation> <translation id="3495219333887281978">સાઇન ઇન કરવાની બોટમ શીટ અડધી ઊંચાઈ સુધી ખોલી.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">તમારા માટે શ્રેષ્ઠ હોય તેવી સાઇટ જુઓ</translation> <translation id="4732120983431207637">સ્ટૅક અનવાઇન્ડર</translation> <translation id="4736934858538408121">વર્ચ્યુઅલ કાર્ડ</translation> +<translation id="473775607612524610">અપડેટ કરો</translation> <translation id="4738836084190194332">છેલ્લે સમન્વયિત: <ph name="WHEN" /></translation> <translation id="4741753828624614066">તમને ઍડ્રેસ બારમાં બહેતર સૂચનો મળશે</translation> <translation id="4742970037960872810">હાઇલાઇટ કાઢી નાખો</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb index 1505b52..a303fc18 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 डाउनलोड शेड्यूल किया गया}one{# डाउनलोड शेड्यूल किया गया}other{# डाउनलोड शेड्यूल किए गए}}</translation> <translation id="3474624961160222204"><ph name="NAME" /> के रूप में जारी रखें</translation> <translation id="3478363558367712427">आप अपना सर्च इंजन चुन सकते हैं</translation> +<translation id="3479552764303398839">अभी नहीं</translation> <translation id="3493531032208478708">सुझाई गई सामग्री के बारे में <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation> <translation id="3495219333887281978">साइन इन करने के लिए, खातों की सूची आधी स्क्रीन पर खुली है.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">अपने हिसाब से खास साइटें देखें</translation> <translation id="4732120983431207637">स्टैक अनवाइंडर</translation> <translation id="4736934858538408121">वर्चुअल कार्ड</translation> +<translation id="473775607612524610">अपडेट करें</translation> <translation id="4738836084190194332">अंतिम बार सिंक किया गया: <ph name="WHEN" /></translation> <translation id="4741753828624614066">आपको पता बार में बेहतर सुझाव मिलेंगे</translation> <translation id="4742970037960872810">हाइलाइट हटाएं</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 2a7fcb9..bdc2d3e 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
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{Zakazano je jedno preuzimanje}one{Zakazano je # preuzimanje}few{Zakazana su # preuzimanja}other{Zakazano je # preuzimanja}}</translation> <translation id="3474624961160222204">Nastavi kao <ph name="NAME" /></translation> <translation id="3478363558367712427">Možete odabrati tražilicu</translation> +<translation id="3479552764303398839">Ne sada</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /> o predloženom sadržaju</translation> <translation id="3495219333887281978">Donja tablica za prijavu otvorena na pola visine.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -668,6 +669,7 @@ <translation id="47217992755561375">Prikaz web-lokacija koje najčešće posjećujete</translation> <translation id="4732120983431207637">Stack Unwinder</translation> <translation id="4736934858538408121">Virtualna kartica</translation> +<translation id="473775607612524610">Ažuriraj</translation> <translation id="4738836084190194332">Posljednja sinkronizacija: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Primat ćete poboljšane prijedloge na adresnoj traci</translation> <translation id="4742970037960872810">Ukloni isticanje</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 6103af2f..d8af693 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
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 ütemezett letöltés}other{# ütemezett letöltés}}</translation> <translation id="3474624961160222204">Folytatás mint <ph name="NAME" /></translation> <translation id="3478363558367712427">Kiválaszthatja keresőmotorját</translation> +<translation id="3479552764303398839">Ne most</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />További információ<ph name="END_LINK" /> a javasolt tartalomról</translation> <translation id="3495219333887281978">Az alsó bejelentkezési lap félmagasságban megnyitva.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -489,6 +490,7 @@ <translation id="3622349720008044802">Ablakok kezelése</translation> <translation id="3631987586758005671">Megosztás a következővel: <ph name="DEVICE_NAME" /></translation> <translation id="363596933471559332">Automatikus bejelentkezés webhelyekre a tárolt hitelesítő adatokkal. Ha ez a funkció ki van kapcsolva, mindig meg kell adnia hitelesítő adatait, amikor egy webhelyre szeretne bejelentkezni.</translation> +<translation id="3636940436873918441">Előnyben részesített nyelvek</translation> <translation id="3677911431265050325">Mobilwebhely kérése</translation> <translation id="3687645719033307815">Ön az oldal előnézetét nézi</translation> <translation id="3690369331356918524">Figyelmeztetést küld, ha jelszavai adatvédelmi incidens során nyilvánosságra kerülnek.</translation> @@ -667,6 +669,7 @@ <translation id="47217992755561375">A leginkább kedvelt webhelyei megtekintése</translation> <translation id="4732120983431207637">Stack Unwinder</translation> <translation id="4736934858538408121">Virtuális kártya</translation> +<translation id="473775607612524610">Frissítés</translation> <translation id="4738836084190194332">Utolsó szinkronizálás: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Jobb javaslatokat kaphat a címsávban.</translation> <translation id="4742970037960872810">Kiemelés eltávolítása</translation> @@ -1278,6 +1281,7 @@ <translation id="7942131818088350342">A(z) <ph name="PRODUCT_NAME" /> elavult.</translation> <translation id="7944772052836377867">A szinkronizálás ellenőrizni szeretné az Ön személyazonosságát</translation> <translation id="7947953824732555851">Elfogadás és bejelentkezés</translation> +<translation id="7957413488482743710">A virtuális kártya elrejti tényleges kártyáját, így segíthet az esetleges csalások elleni védekezésben. <ph name="BEGIN_LINK1" />További információ a virtuális kártyákról<ph name="END_LINK1" />.</translation> <translation id="7961015016161918242">Soha</translation> <translation id="7961926449547174351">Letiltotta a tárhelyhez való hozzáférést. A Beállítások menüpontban ismét engedélyezheti.</translation> <translation id="7963646190083259054">Szolgáltató:</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb index e1d2195..a1f3396 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{Պլանավորված է 1 ներբեռնում}one{Պլանավորված է # ներբեռնում}other{Պլանավորված է # ներբեռնում}}</translation> <translation id="3474624961160222204">Շարունակել <ph name="NAME" /> հաշվով</translation> <translation id="3478363558367712427">Ընտրեք այլ որոնման համակարգ</translation> +<translation id="3479552764303398839">Հիմա չէ</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Իմացեք ավելին<ph name="END_LINK" /> առաջարկվող բովանդակության վերաբերյալ</translation> <translation id="3495219333887281978">Հաշիվ մտնելու ներքևի էկրանը բացված է կիսով չափ։</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Դիտեք ձեր թոփ կայքերը</translation> <translation id="4732120983431207637">Stack Unwinder</translation> <translation id="4736934858538408121">Վիրտուալ քարտ</translation> +<translation id="473775607612524610">Թարմացնել</translation> <translation id="4738836084190194332">Վերջին համաժամացումը՝ <ph name="WHEN" /></translation> <translation id="4741753828624614066">Հասցեագոտում կհայտնվեն բարելավված հուշումներ</translation> <translation id="4742970037960872810">Հեռացնել ընդգծումը</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb index 89f6b1e..0988f1f4 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 download dijadwalkan}other{# download dijadwalkan}}</translation> <translation id="3474624961160222204">Lanjutkan sebagai <ph name="NAME" /></translation> <translation id="3478363558367712427">Anda dapat memilih mesin telusur Anda</translation> +<translation id="3479552764303398839">Jangan sekarang</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Pelajari lebih lanjut<ph name="END_LINK" /> konten yang disarankan</translation> <translation id="3495219333887281978">Sheet bawah untuk tombol login terbuka setengah.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Lihat situs teratas Anda</translation> <translation id="4732120983431207637">Stack Unwinder</translation> <translation id="4736934858538408121">Kartu virtual</translation> +<translation id="473775607612524610">Perbarui</translation> <translation id="4738836084190194332">Terakhir disinkronkan: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Anda akan mendapatkan saran yang lebih baik di kolom URL</translation> <translation id="4742970037960872810">Hapus sorotan</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb index 00babb4b..01fe603e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 niðurhal á áætlun}one{# niðurhal á áætlun}other{# niðurhöl á áætlun}}</translation> <translation id="3474624961160222204">Halda áfram sem <ph name="NAME" /></translation> <translation id="3478363558367712427">Þú getur valið leitarvélina þína</translation> +<translation id="3479552764303398839">Ekki núna</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Frekari upplýsingar<ph name="END_LINK" /> um uppástungur að efni</translation> <translation id="3495219333887281978">Innskráningarblað neðst opið í hálfri hæð.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Sjá mest sóttu vefsvæðin</translation> <translation id="4732120983431207637">Afstöflun</translation> <translation id="4736934858538408121">Sýndarkort</translation> +<translation id="473775607612524610">Uppfæra</translation> <translation id="4738836084190194332">Síðast samstillt: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Þú færð betri tillögur í veffangastikunni</translation> <translation id="4742970037960872810">Fjarlægja áherslumerkingu</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 9b9a8be..9cbf6252 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
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 download programmato}other{# download programmati}}</translation> <translation id="3474624961160222204">Continua come <ph name="NAME" /></translation> <translation id="3478363558367712427">Puoi scegliere il motore di ricerca</translation> +<translation id="3479552764303398839">Non adesso</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Ulteriori informazioni<ph name="END_LINK" /> sui contenuti suggeriti</translation> <translation id="3495219333887281978">Riquadro inferiore di accesso aperto nella parte inferiore dello schermo.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Vedi i tuoi siti principali</translation> <translation id="4732120983431207637">Rimozione dello stack</translation> <translation id="4736934858538408121">Carta virtuale</translation> +<translation id="473775607612524610">Aggiorna</translation> <translation id="4738836084190194332">Ultima sincronizzazione: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Riceverai suggerimenti migliori nella barra degli indirizzi</translation> <translation id="4742970037960872810">Rimuovi evidenziazione</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb index 89d64803..2de6f59 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{תוזמנה הורדה אחת}two{תוזמנו # הורדות}many{תוזמנו # הורדות}other{תוזמנו # הורדות}}</translation> <translation id="3474624961160222204">המשך כ-<ph name="NAME" /></translation> <translation id="3478363558367712427">אפשר לבחור את מנוע החיפוש</translation> +<translation id="3479552764303398839">לא עכשיו</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />מידע נוסף<ph name="END_LINK" /> על הצעות לתוכן</translation> <translation id="3495219333887281978">הגיליון התחתון של הכניסה נפתח בחצי הגובה.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">להצגת האתרים המובילים שלך</translation> <translation id="4732120983431207637">מודול התרת מחסניות</translation> <translation id="4736934858538408121">כרטיס וירטואלי</translation> +<translation id="473775607612524610">עדכון</translation> <translation id="4738836084190194332">סונכרן לאחרונה: <ph name="WHEN" /></translation> <translation id="4741753828624614066">בסרגל הכתובות יוצגו הצעות משופרות</translation> <translation id="4742970037960872810">הסרת ההדגשה</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb index f20be31..8f597f7 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 件のダウンロードがスケジュール設定されました}other{# 件のダウンロードがスケジュール設定されました}}</translation> <translation id="3474624961160222204"><ph name="NAME" /> として続行</translation> <translation id="3478363558367712427">検索エンジンを選択できます</translation> +<translation id="3479552764303398839">後で</translation> <translation id="3493531032208478708">詳しくは、<ph name="BEGIN_LINK" />おすすめのコンテンツ<ph name="END_LINK" />についての説明をご覧ください</translation> <translation id="3495219333887281978">ログインのボトムシートが画面の下半分に表示されています。</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">よく使用するサイトを表示します</translation> <translation id="4732120983431207637">スタック アンワインダー</translation> <translation id="4736934858538408121">仮想カード</translation> +<translation id="473775607612524610">更新</translation> <translation id="4738836084190194332">最終同期: <ph name="WHEN" /></translation> <translation id="4741753828624614066">アドレスバーにより関連性の高い候補が表示されます</translation> <translation id="4742970037960872810">テキストの選択を解除</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 ff926c6..ff4b15e 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
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{დაგეგმილია 1 ჩამოტვირთვა}other{დაგეგმილია # ჩამოტვირთვა}}</translation> <translation id="3474624961160222204">გაგრძელება, როგორც <ph name="NAME" /></translation> <translation id="3478363558367712427">შეგიძლიათ აირჩიოთ საძიებო სისტემა</translation> +<translation id="3479552764303398839">ახლა არა</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />შეიტყვეთ მეტი<ph name="END_LINK" /> შემოთავაზებული კონტენტის შესახებ</translation> <translation id="3495219333887281978">სისტემაში შესვლის ქვედა ფურცელი გახსნილია ნახევარ სიმაღლეზე.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">იხილეთ თქვენთვის შერჩეული საუკეთესო საიტები</translation> <translation id="4732120983431207637">სტეკის დამშლელი</translation> <translation id="4736934858538408121">ვირტუალური ბარათი</translation> +<translation id="473775607612524610">განახლება</translation> <translation id="4738836084190194332">ბოლო სინქრონიზაცია: <ph name="WHEN" /></translation> <translation id="4741753828624614066">თქვენ მოგეწოდებათ გაუმჯობესებული შემოთავაზებები მისამართთა ზოლში</translation> <translation id="4742970037960872810">გამოყოფის ამოშლა</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb index 240b07a..887be5cf 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 жүктеп алу жоспарланды.}other{# жүктеп алу жоспарланды.}}</translation> <translation id="3474624961160222204"><ph name="NAME" /> болып жалғастыру</translation> <translation id="3478363558367712427">Іздеу жүйесін таңдай аласыз.</translation> +<translation id="3479552764303398839">Қазір емес</translation> <translation id="3493531032208478708">Ұсынылған мазмұн туралы <ph name="BEGIN_LINK" />толығырақ<ph name="END_LINK" /></translation> <translation id="3495219333887281978">Акканунтқа кіру төменгі парақшасы жартылай ашылды.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Жиі пайдаланатын сайттарды көру</translation> <translation id="4732120983431207637">Stack Unwinder</translation> <translation id="4736934858538408121">Виртуалдық карта</translation> +<translation id="473775607612524610">Жаңарту</translation> <translation id="4738836084190194332">Соңғы синхрондалған уақыты: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Мекенжай жолағында жақсартылған ұсыныстар аласыз.</translation> <translation id="4742970037960872810">Ерекшелемеу</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb index c3c8f37..4fb3464 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{បានកំណត់កាលវិភាគនៃការទាញយក 1}other{បានកំណត់កាលវិភាគនៃការទាញយក #}}</translation> <translation id="3474624961160222204">បន្តជា <ph name="NAME" /></translation> <translation id="3478363558367712427">អ្នកអាចជ្រើសរើសម៉ាស៊ីនស្វែងរករបស់អ្នកបាន</translation> +<translation id="3479552764303398839">មិនមែនឥឡូវនេះទេ</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />ស្វែងយល់បន្ថែម<ph name="END_LINK" />អំពីមាតិកាដែលបានណែនាំ</translation> <translation id="3495219333887281978">បានបើកសន្លឹកខាងក្រោមសម្រាប់ចូលគណនីពាក់កណ្ដាលអេក្រង់។</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -489,6 +490,7 @@ <translation id="3622349720008044802">គ្រប់គ្រងវិនដូ</translation> <translation id="3631987586758005671">កំពុងចែករំលែកទៅ <ph name="DEVICE_NAME" /></translation> <translation id="363596933471559332">ចូលគេហទំព័រដោយស្វ័យប្រវត្តិដោយប្រើព័ត៌មានអត្តសញ្ញាណដែលបានផ្ទុក។ នៅពេលដែលលក្ខណៈពិសេសនេះត្រូវបានបិទ អ្នកនឹងត្រូវបានស្នើឲ្យធ្វើការផ្ទៀងផ្ទាត់ រាល់ពេលដែលអ្នកចូលទៅកាន់គេហទំព័រណាមួយ។</translation> +<translation id="3636940436873918441">ភាសាដែលចង់ប្រើ</translation> <translation id="3677911431265050325">ស្នើគេហទំព័រសម្រាប់ឧបករណ៍ចល័ត</translation> <translation id="3687645719033307815">អ្នកកំពុងមើលទំព័រនេះសាកល្បង</translation> <translation id="3690369331356918524">ព្រមានអ្នក ប្រសិនបើពាក្យសម្ងាត់បានលេចចេញនៅក្នុងការបែកធ្លាយទិន្នន័យ</translation> @@ -667,6 +669,7 @@ <translation id="47217992755561375">មើលគេហទំព័រពេញនិយមរបស់អ្នក</translation> <translation id="4732120983431207637">ឧបករណ៍ត្រឡប់លំដាប់ធ្វើប្រតិបត្តិការវិញ</translation> <translation id="4736934858538408121">កាតនិម្មិត</translation> +<translation id="473775607612524610">ធ្វើបច្ចុប្បន្នភាព</translation> <translation id="4738836084190194332">ធ្វើសមកាលកម្មចុងក្រោយ៖ <ph name="WHEN" /></translation> <translation id="4741753828624614066">អ្នកនឹងទទួលបានការណែនាំដែលត្រូវបានកែលម្អនៅក្នុងរបារអាសយដ្ឋាន</translation> <translation id="4742970037960872810">ដកការរំលេចចេញ</translation> @@ -1278,6 +1281,7 @@ <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> ហួសសម័យហើយ</translation> <translation id="7944772052836377867">សមកាលកម្មត្រូវការផ្ទៀងផ្ទាត់ថាជាអ្នក</translation> <translation id="7947953824732555851">ទទួល និងចូល</translation> +<translation id="7957413488482743710">កាតនិម្មិតលាក់កាតពិតប្រាកដរបស់អ្នក ដើម្បីជួយការពារអ្នកពីការគៃបន្លំដែលអាចកើតមាន។ <ph name="BEGIN_LINK1" />ស្វែងយល់បន្ថែមអំពីកាតនិម្មិត<ph name="END_LINK1" /></translation> <translation id="7961015016161918242">មិនដែល</translation> <translation id="7961926449547174351">អ្នកបានបិទការចូលប្រើទំហំផ្ទុក សូមចូលទៅកាន់ការកំណត់ ដើម្បីបើកវា។</translation> <translation id="7963646190083259054">អ្នកលក់៖</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb index c715f114..e42cc13 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 ಡೌನ್ಲೋಡ್ ಅನ್ನು ನಿಗದಿಪಡಿಸಲಾಗಿದೆ}one{# ಡೌನ್ಲೋಡ್ಗಳನ್ನು ನಿಗದಿಪಡಿಸಲಾಗಿದೆ}other{# ಡೌನ್ಲೋಡ್ಗಳನ್ನು ನಿಗದಿಪಡಿಸಲಾಗಿದೆ}}</translation> <translation id="3474624961160222204"><ph name="NAME" /> ನಂತೆ ಮುಂದುವರಿಸಿ</translation> <translation id="3478363558367712427">ನಿಮ್ಮ ಹುಡುಕಾಟ ಎಂಜಿನ್ ಅನ್ನು ನೀವು ಆಯ್ಕೆಮಾಡಬಹುದು</translation> +<translation id="3479552764303398839">ಈಗ ಬೇಡ</translation> <translation id="3493531032208478708">ಸೂಚಿಸಲಾದ ವಿಷಯದ ಕುರಿತು <ph name="BEGIN_LINK" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK" /></translation> <translation id="3495219333887281978">ಸೈನ್ ಇನ್ ಮಾಡುವ ಕೆಳಭಾಗದ ಶೀಟ್ ಅರ್ಧ ಎತ್ತರದಲ್ಲಿ ತೆರೆದಿದೆ.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -666,6 +667,7 @@ <translation id="47217992755561375">ನಿಮ್ಮ ಪ್ರಮುಖ ಸೈಟ್ಗಳನ್ನು ನೋಡಿ</translation> <translation id="4732120983431207637">ಸ್ಟ್ಯಾಕ್ ಅನ್ವೈಂಡರ್</translation> <translation id="4736934858538408121">ವರ್ಚುವಲ್ ಕಾರ್ಡ್</translation> +<translation id="473775607612524610">ಅಪ್ಡೇಟ್</translation> <translation id="4738836084190194332">ಕೊನೆಯದಾಗಿ ಸಿಂಕ್ ಮಾಡಿರುವ ಸಮಯ: <ph name="WHEN" /></translation> <translation id="4741753828624614066">ನೀವು ವಿಳಾಸ ಪಟ್ಟಿಯಲ್ಲಿ ಸುಧಾರಿತ ಸಲಹೆಗಳನ್ನು ಪಡೆಯುತ್ತೀರಿ</translation> <translation id="4742970037960872810">ಹೈಲೈಟ್ ತೆಗೆದುಹಾಕಿ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb index 76f9f1e..9806e02 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{다운로드 1개 예약됨}other{다운로드 #개 예약됨}}</translation> <translation id="3474624961160222204"><ph name="NAME" />(으)로 계속</translation> <translation id="3478363558367712427">검색엔진을 선택할 수 있습니다.</translation> +<translation id="3479552764303398839">나중에</translation> <translation id="3493531032208478708">추천 콘텐츠 <ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation> <translation id="3495219333887281978">로그인 하단 시트가 절반 높이로 열렸습니다.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">맞춤 인기 사이트 보기</translation> <translation id="4732120983431207637">스택 언와인더</translation> <translation id="4736934858538408121">가상 카드</translation> +<translation id="473775607612524610">업데이트</translation> <translation id="4738836084190194332">마지막 동기화 시간: <ph name="WHEN" /></translation> <translation id="4741753828624614066">주소 표시줄에 더 개선된 추천 항목이 표시됩니다.</translation> <translation id="4742970037960872810">강조표시 삭제</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb index 7d6bb65..9aefc00 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 файлды жүктөп алуу графикке киргизилди}other{# файлды жүктөп алуу графикке киргизилди}}</translation> <translation id="3474624961160222204"><ph name="NAME" /> катары улантуу</translation> <translation id="3478363558367712427">Өзүңүз каалаган издөө каражатын тандай аласыз</translation> +<translation id="3479552764303398839">Азыр эмес</translation> <translation id="3493531032208478708">Сунушталган мазмун жөнүндө <ph name="BEGIN_LINK" />көбүрөөк билүү<ph name="END_LINK" /></translation> <translation id="3495219333887281978">Жарымына чейин ачылган кирүү процессинин ылдыйкы экраны жарымына чейин ачылды.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Мыкты сайттарды караңыз</translation> <translation id="4732120983431207637">Ороосун ачуу</translation> <translation id="4736934858538408121">Виртуалдык карта</translation> +<translation id="473775607612524610">Жаңыртуу</translation> <translation id="4738836084190194332">Акыркы жолу качан шайкештирилген: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Дарек тилкесинде жакшыртылган сунуштарды аласыз</translation> <translation id="4742970037960872810">Бөлүп көрсөтүүнү өчүрүү</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 94b4582..13a1e86 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
@@ -97,6 +97,7 @@ <translation id="1428770807407000502">ປິດການຊິ້ງຂໍ້ມູນບໍ?</translation> <translation id="1430915738399379752">ພິມ</translation> <translation id="1436784010935106834">ເອົາອອກໄປແລ້ວ</translation> +<translation id="1437543266176261764">ກຳລັງເຮັດວຽກຢູ່ໃນ <ph name="APP_NAME" /></translation> <translation id="1448440926884431741">ຈັດລະບຽບສິນຄ້າທີ່ຕິດຕາມແລ້ວຂອງທ່ານໃນບຸກມາກ</translation> <translation id="1450753235335490080">ບໍ່ສາມາດແບ່ງປັນ <ph name="CONTENT_TYPE" /> ໄດ້</translation> <translation id="1466383950273130737">ເລືອກພາສາຂອງ Chrome</translation> @@ -459,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{ກຳນົດເວລາດາວໂຫຼດ 1 ລາຍການແລ້ວ}other{ກຳນົດເວລາດາວໂຫຼດ # ລາຍການແລ້ວ}}</translation> <translation id="3474624961160222204">ສືບຕໍ່ໃຊ້ໃນຊື່ <ph name="NAME" /></translation> <translation id="3478363558367712427">ທ່ານສາມາດເລືອກລະບົບການຊອກຫາຂອງທ່ານໄດ້</translation> +<translation id="3479552764303398839">ບໍ່ແມ່ນດຽວນີ້</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />ສຶກສາເພີ່ມເຕີມ<ph name="END_LINK" /> ກ່ຽວກັບເນື້ອຫາທີ່ແນະນຳ</translation> <translation id="3495219333887281978">ເປີດຊີດລຸ່ມສຸດສຳລັບການເຂົ້າສູ່ລະບົບໃນຄວາມສູງເຄິ່ງໜຶ່ງແລ້ວ.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -666,6 +668,7 @@ <translation id="47217992755561375">ເບິ່ງເວັບໄຊຍອດນິຍົມຂອງທ່ານ</translation> <translation id="4732120983431207637">ຕົວມາຍສະແຕັກ</translation> <translation id="4736934858538408121">ບັດສະເໝືອນ</translation> +<translation id="473775607612524610">ອັບເດດ</translation> <translation id="4738836084190194332">ຊິ້ງຂໍ້ມູນຫຼ້າສຸດ: <ph name="WHEN" /></translation> <translation id="4741753828624614066">ທ່ານຈະໄດ້ຮັບການແນະນຳທີ່ມີການປັບປຸງໃນແຖບທີ່ຢູ່</translation> <translation id="4742970037960872810">ລຶບໄຮໄລ້ອອກ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb index 7895eef..d823729 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{Suplanuotas 1 atsisiuntimas}one{Suplanuotas # atsisiuntimas}few{Suplanuoti # atsisiuntimai}many{Suplanuota # atsisiuntimo}other{Suplanuota # atsisiuntimų}}</translation> <translation id="3474624961160222204">Tęsti kaip <ph name="NAME" /></translation> <translation id="3478363558367712427">Galite pasirinkti paieškos variklį</translation> +<translation id="3479552764303398839">Ne dabar</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Sužinokite daugiau<ph name="END_LINK" /> apie siūlomą turinį</translation> <translation id="3495219333887281978">Prisijungimo apatinis lapas atidarytas per pusę ekrano aukščio.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -489,6 +490,7 @@ <translation id="3622349720008044802">Langų tvarkymas</translation> <translation id="3631987586758005671">Bendrinama su „<ph name="DEVICE_NAME" />“</translation> <translation id="363596933471559332">Automatiškai prisijungti prie svetainių naudojant išsaugotus prisijungimo duomenis. Kai funkcija išjungta, kaskart prisijungiant prie svetainės prašoma patvirtinti.</translation> +<translation id="3636940436873918441">Pageidaujamos kalbos</translation> <translation id="3677911431265050325">Pateikti užklausą dėl svetainės mobiliesiems</translation> <translation id="3687645719033307815">Žiūrite šio puslapio peržiūrą</translation> <translation id="3690369331356918524">Įspėjama, jei slaptažodžiai buvo atskleisti įvykus duomenų saugos pažeidimui</translation> @@ -667,6 +669,7 @@ <translation id="47217992755561375">Peržiūrėkite populiariausias svetaines</translation> <translation id="4732120983431207637">Stack Unwinder</translation> <translation id="4736934858538408121">Virtuali kortelė</translation> +<translation id="473775607612524610">Atnaujinti</translation> <translation id="4738836084190194332">Paskutinį kartą sinchronizuota: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Gausite patobulintų pasiūlymų adreso juostoje</translation> <translation id="4742970037960872810">Pašalinti paryškinimą</translation> @@ -1278,6 +1281,7 @@ <translation id="7942131818088350342">„<ph name="PRODUCT_NAME" />“ pasenęs.</translation> <translation id="7944772052836377867">Sinchronizuojant reikia patvirtinti jūsų tapatybę</translation> <translation id="7947953824732555851">Sutikti ir prisij.</translation> +<translation id="7957413488482743710">Virtualioji kortelė slepia tikrąją kortelę, kad padėtų apsaugoti jus nuo galimų apgaulių. <ph name="BEGIN_LINK1" />Sužinokite daugiau apie virtualiąsias korteles<ph name="END_LINK1" /></translation> <translation id="7961015016161918242">Niekada</translation> <translation id="7961926449547174351">Išjungėte prieigą prie saugyklos. Eikite į „Nustatymų“ skiltį ir ją įgalinkite.</translation> <translation id="7963646190083259054">Paslaugos teikėjas:</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb index c5c58d5b..61b5974 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{Ir ieplānota 1 lejupielāde.}zero{Ir ieplānotas # lejupielādes.}one{Ir ieplānota # lejupielāde.}other{Ir ieplānotas # lejupielādes.}}</translation> <translation id="3474624961160222204">Turpināt kā: <ph name="NAME" /></translation> <translation id="3478363558367712427">Varat izvēlēties savu meklētājprogrammu.</translation> +<translation id="3479552764303398839">Vēlāk</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Uzziniet vairāk<ph name="END_LINK" /> par ieteikto saturu.</translation> <translation id="3495219333887281978">Pierakstīšanās ekrāna apakšdaļas lapa ir atvērta pusekrāna augstumā.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -668,6 +669,7 @@ <translation id="47217992755561375">Skatīt vietnes, ko apmeklējat visbiežāk</translation> <translation id="4732120983431207637">Steka atbrīvotājs</translation> <translation id="4736934858538408121">Virtuāla karte</translation> +<translation id="473775607612524610">Atjaunināt</translation> <translation id="4738836084190194332">Pēdējoreiz sinhronizēts: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Jūs saņemsiet uzlabotus ieteikumus adreses joslā.</translation> <translation id="4742970037960872810">Atcelt teksta atzīmēšanu</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 da71016..3089a31f 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
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{Закажано е 1 преземање}one{Закажани се # преземање}other{Закажани се # преземања}}</translation> <translation id="3474624961160222204">Продолжете како <ph name="NAME" /></translation> <translation id="3478363558367712427">Може да го изберете вашиот пребарувач</translation> +<translation id="3479552764303398839">Не сега</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Дознајте повеќе<ph name="END_LINK" /> за предложените содржини</translation> <translation id="3495219333887281978">Долниот лист за најавување е отворен на половина екран.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -668,6 +669,7 @@ <translation id="47217992755561375">Видете ги вашите најдобри сајтови</translation> <translation id="4732120983431207637">Модул за продолжување претходни задачи</translation> <translation id="4736934858538408121">Виртуелна картичка</translation> +<translation id="473775607612524610">Ажурирај</translation> <translation id="4738836084190194332">Последна синхронизација: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Ќе добивате подобрени предлози во лентата за адреси</translation> <translation id="4742970037960872810">Отстрани нагласување</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb index 4625434..faaa71c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 ഡൗൺലോഡ് ഷെഡ്യൂൾ ചെയ്തു}other{# ഡൗൺലോഡുകൾ ഷെഡ്യൂൾ ചെയ്തു}}</translation> <translation id="3474624961160222204"><ph name="NAME" /> ആയി തുടരുക</translation> <translation id="3478363558367712427">നിങ്ങളുടെ തിരയല് യന്ത്രം നിങ്ങൾക്ക് തിരഞ്ഞെടുക്കാം</translation> +<translation id="3479552764303398839">ഇപ്പോഴല്ല</translation> <translation id="3493531032208478708">നിർദ്ദേശിച്ച ഉള്ളടക്കത്തെക്കുറിച്ച് <ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation> <translation id="3495219333887281978">സൈൻ ഇൻ ചെയ്യാനുള്ള ബോട്ടം ഷീറ്റ് പകുതി ഉയരത്തിൽ തുറന്നു.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">നിങ്ങളുടെ പ്രധാന സൈറ്റുകൾ കാണുക</translation> <translation id="4732120983431207637">സ്റ്റാക്ക് അൺവൈൻഡർ</translation> <translation id="4736934858538408121">വെർച്വൽ കാർഡ്</translation> +<translation id="473775607612524610">അപ്ഡേറ്റ് ചെയ്യുക</translation> <translation id="4738836084190194332">അവസാനം സമന്വയിപ്പിച്ചത്: <ph name="WHEN" /></translation> <translation id="4741753828624614066">വിലാസ ബാറിൽ നിങ്ങൾക്ക് മെച്ചപ്പെടുത്തിയ നിർദ്ദേശങ്ങൾ ലഭിക്കും</translation> <translation id="4742970037960872810">ഹൈലൈറ്റ് നീക്കം ചെയ്യുക</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb index 44f4752..c0c3fe1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 таталт товлосон}other{# таталт товлосон}}</translation> <translation id="3474624961160222204"><ph name="NAME" />-р үргэлжлүүлэх</translation> <translation id="3478363558367712427">Та хайлтын системээ сонгох боломжтой</translation> +<translation id="3479552764303398839">Одоо биш</translation> <translation id="3493531032208478708">Санал болгосон агуулгын талаар <ph name="BEGIN_LINK" />дэлгэрэнгүй үзэх<ph name="END_LINK" /></translation> <translation id="3495219333887281978">Нэвтрэх доод хүснэгтийг тал хэмжээгээр нээсэн.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -489,6 +490,7 @@ <translation id="3622349720008044802">Цонхнуудыг удирдах</translation> <translation id="3631987586758005671"><ph name="DEVICE_NAME" />-тай хуваалцаж байна</translation> <translation id="363596933471559332">Хадгалсан итгэмжлэлийг ашиглан вебсайтад автоматаар нэвтрэх. Энэ үйлдлийг идэвхжүүлээгүй тохиолдолд аливаа вебсайтад хандах бүрд таниас баталгаажуулалт шаардана.</translation> +<translation id="3636940436873918441">Сонгосон хэл</translation> <translation id="3677911431265050325">Мобайл сайтын хүсэлт тавих</translation> <translation id="3687645719033307815">Та энэ хуудасны урьдчилан үзэлтийг үзэж байна</translation> <translation id="3690369331356918524">Өгөгдлийн зөрчлийн улмаас нууц үгийг задруулсан бол танд анхааруулга өгдөг</translation> @@ -667,6 +669,7 @@ <translation id="47217992755561375">Шилдэг сайтуудаа харах</translation> <translation id="4732120983431207637">Stack Unwinder</translation> <translation id="4736934858538408121">Виртуал карт</translation> +<translation id="473775607612524610">Шинэчлэх</translation> <translation id="4738836084190194332">Хамгийн сүүлд синк хийсэн: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Та хаяг оруулах хэсэгт сайжруулсан зөвлөмжүүд авна</translation> <translation id="4742970037960872810">Тодруулгыг хасах</translation> @@ -1277,6 +1280,7 @@ <translation id="7942131818088350342"><ph name="PRODUCT_NAME" />-н хугацаа дууссан.</translation> <translation id="7944772052836377867">Синк таныг мөн болохыг баталгаажуулах шаардлагатай байна</translation> <translation id="7947953824732555851">Хүлээн зөвшөөрсний дараагаар нэвтрэх</translation> +<translation id="7957413488482743710">Виртуал карт нь таныг болзошгүй залилангаас хамгаалахад туслахын тулд таны жинхэнэ картыг нуудаг. <ph name="BEGIN_LINK1" />Виртуал картын талаар нэмэлт мэдээлэл авах<ph name="END_LINK1" /></translation> <translation id="7961015016161918242">Хэзээ ч</translation> <translation id="7961926449547174351">Та хадгалах сангийн хандалтыг идэвхгүй болгосон байна, идэвхжүүлэхийн тулд Тохиргоо руу очно уу</translation> <translation id="7963646190083259054">Бэлтгэн нийлүүлэгч:</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb index 94674c1..f15610e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{एक डाउनलोड शेड्युल केला}other{# डाउनलोड शेड्युल केले}}</translation> <translation id="3474624961160222204"><ph name="NAME" /> म्हणून सुरू ठेवा</translation> <translation id="3478363558367712427">तुम्ही तुमचे शोध इंजीन निवडू शकता</translation> +<translation id="3479552764303398839">सध्या नाही</translation> <translation id="3493531032208478708">सूचित केलेल्या आशयविषयी <ph name="BEGIN_LINK" />अधिक जाणून घ्या<ph name="END_LINK" /></translation> <translation id="3495219333887281978">अर्ध्या उंचीवर उघडलेल्या तळाशी असलेल्या शीटमध्ये साइन इन करा.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">तुमच्या टॉप साइट पहा</translation> <translation id="4732120983431207637">स्टॅक अनवाइंडर</translation> <translation id="4736934858538408121">व्हर्च्युअल कार्ड</translation> +<translation id="473775607612524610">अपडेट करा</translation> <translation id="4738836084190194332">अखेरचे संकालित: <ph name="WHEN" /></translation> <translation id="4741753828624614066">तुम्हाला अॅड्रेस बारमध्ये सुधारित सूचना मिळतील</translation> <translation id="4742970037960872810">हायलाइट काढून टाका</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 d442538..2312bc7 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
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 muat turun dijadualkan}other{# muat turun dijadualkan}}</translation> <translation id="3474624961160222204">Teruskan sebagai <ph name="NAME" /></translation> <translation id="3478363558367712427">Anda boleh memilih enjin carian anda</translation> +<translation id="3479552764303398839">Bukan sekarang</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Ketahui lebih lanjut<ph name="END_LINK" /> tentang kandungan yang disyorkan</translation> <translation id="3495219333887281978">Helaian bawah log masuk dibuka pada ketinggian separuh.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Lihat laman web yang paling kerap anda lawati</translation> <translation id="4732120983431207637">Pengurai Tindanan</translation> <translation id="4736934858538408121">Kad maya</translation> +<translation id="473775607612524610">Kemas kini</translation> <translation id="4738836084190194332">Kali terakhir disegerakkan: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Anda akan mendapat cadangan yang dipertingkatkan dalam bar alamat</translation> <translation id="4742970037960872810">Alih keluar serlahan</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 959e3be8..fc742c7 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
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{ဒေါင်းလုဒ် 1 ခု စီစဉ်ထားသည်}other{ဒေါင်းလုဒ် # ခု စီစဉ်ထားသည်}}</translation> <translation id="3474624961160222204"><ph name="NAME" /> အဖြစ် ရှေ့ဆက်ရန်</translation> <translation id="3478363558367712427">သင်၏ ရှာဖွေရေးအင်ဂျင်ကို ရွေးနိုင်သည်</translation> +<translation id="3479552764303398839">ယခု မလို</translation> <translation id="3493531032208478708">အကြံပြုထားသည့် အကြောင်းအရာအကြောင်း <ph name="BEGIN_LINK" />ပိုမိုလေ့လာရန်<ph name="END_LINK" /></translation> <translation id="3495219333887281978">လက်မှတ်ထိုးဝင်ခြင်းဆိုင်ရာ အောက်ခြေအပိုဆောင်း စာမျက်နှာကို မြင်ကွင်းတစ်ဝက် ဖွင့်ထားသည်။</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -489,6 +490,7 @@ <translation id="3622349720008044802">ဝင်းဒိုးများ စီမံပါ</translation> <translation id="3631987586758005671"><ph name="DEVICE_NAME" /> သို့ မျှဝေနေသည်</translation> <translation id="363596933471559332">သိမ်းဆည်းထားသည့် အထောက်အထားများကို သုံးကာ ဝဘ်ဆိုက်များသို့ အလိုအလျောက် လက်မှတ်ထိုး ဝင်ပါသည်။ ၎င်းအင်္ဂါရပ်ကို ပိတ်ထားလျှင်၊ ထိုသို့ လုပ်ဆောင်နိုင်ချက်အား ပိတ်ထားပါက၊ သင်က ဝဘ်ဆိုက် တစ်ခုခုသို့ လက်မှတ်ထိုး ဝင်လိုတိုင်းမှာ အတည်ပြုရန် တောင်းဆိုပါလိမ့်မည်။</translation> +<translation id="3636940436873918441">ဦးစားပေး ဘာသာစကားများ</translation> <translation id="3677911431265050325">မိုဘိုင်းဝဘ်ဆိုက်ကို တောင်းဆိုရန်</translation> <translation id="3687645719033307815">သင်သည် ဤစာမျက်နှာ၏ အစမ်းပြသမှုကို ကြည့်ရှုနေခြင်း ဖြစ်သည်</translation> <translation id="3690369331356918524">ဒေတာပေါက်ကြားမှုတွင် စကားဝှက်များ ဖော်ထုတ်ခံရသည့်အခါ သင့်ကို သတိပေးခြင်း</translation> @@ -667,6 +669,7 @@ <translation id="47217992755561375">သင်၏ ထိပ်တန်းဝဘ်ဆိုက်များကို ကြည့်ရန်</translation> <translation id="4732120983431207637">တည်းဖြတ်မှုကို နောက်ပြန်ဆုတ်သည့်စနစ်</translation> <translation id="4736934858538408121">ပကတိအသွင်ကတ်</translation> +<translation id="473775607612524610">အပ်ဒိတ်လုပ်ရန်</translation> <translation id="4738836084190194332">နောက်ဆုံး စင့်က် လုပ်ခဲ့မှု- <ph name="WHEN" /></translation> <translation id="4741753828624614066">ပိုကောင်းမွန်လာသော အကြံပြုချက်များကို လိပ်စာဘားတွင် ရရှိပါမည်</translation> <translation id="4742970037960872810">မြင်သာအောင်လုပ်ထားသည်ကို ဖယ်ရှားရန်</translation> @@ -1277,6 +1280,7 @@ <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> သည် ဟောင်းနေပါပြီ။</translation> <translation id="7944772052836377867">‘စင့်ခ်လုပ်ခြင်း’ က သင်ဖြစ်ကြောင်း စိစစ်ရန်လိုအပ်သည်</translation> <translation id="7947953824732555851">လက်ခံကာ ဝင်ရောက်မည်</translation> +<translation id="7957413488482743710">လိမ်လည်ခံရခြင်းမှ ကာကွယ်ပေးနိုင်ရန်အတွက် ပကတိအသွင်ကတ်သည် သင့်ကတ်အစစ်ကို ဖျောက်ပေးသည်။ <ph name="BEGIN_LINK1" />ပကတိအသွင်ကတ်များအကြောင်း ပိုမိုလေ့လာရန်<ph name="END_LINK1" /></translation> <translation id="7961015016161918242">ဘယ်သောအခါမှ</translation> <translation id="7961926449547174351">'သိုလှောင်ခန်း' အသုံးပြုခွင့်ကို သင် ပိတ်ထားသည်။ ၎င်းကိုဖွင့်ရန် 'ဆက်တင်များ' သို့သွားပါ။</translation> <translation id="7963646190083259054">လုပ်ကိုင်ပေးသူ:</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb index 3233a47..dee62960 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{एउटा फाइल डाउनलोड गर्नका निम्ति समयतालिका तोकियो}other{# वटा फाइल डाउनलोड गर्नका निम्ति समयतालिका तोकियो}}</translation> <translation id="3474624961160222204"><ph name="NAME" /> का रूपमा जारी राख्नुहोस्</translation> <translation id="3478363558367712427">तपाईं आफ्नो सर्च इन्जिन रोज्न सक्नुहुन्छ</translation> +<translation id="3479552764303398839">अहिले होइन</translation> <translation id="3493531032208478708">सुझाव दिइएको सामग्रीको बारेमा <ph name="BEGIN_LINK" />थप जान्नुहोस्<ph name="END_LINK" /></translation> <translation id="3495219333887281978">साइन इन गर्ने सुविधा पुछारको पानाको आधा स्क्रिनमा खोलिएको छ।</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -666,6 +667,7 @@ <translation id="47217992755561375">तपाईंका लागि सिफारिस गरिएका शीर्ष साइटहरू हेर्नुहोस्</translation> <translation id="4732120983431207637">स्ट्याक Unwinder</translation> <translation id="4736934858538408121">भर्चुअल कार्ड</translation> +<translation id="473775607612524610">अपडेट गर्नुहोस्</translation> <translation id="4738836084190194332">अन्तिम पटक सिंक गरिएको: <ph name="WHEN" /></translation> <translation id="4741753828624614066">तपाईं एड्रेस बारमा अझ राम्रा सुझावहरू प्राप्त गर्नु हुने छ</translation> <translation id="4742970037960872810">हाइलाइट हटाउनुहोस्</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb index 6ce6047..d6ae96b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 download gepland}other{# downloads gepland}}</translation> <translation id="3474624961160222204">Doorgaan als <ph name="NAME" /></translation> <translation id="3478363558367712427">Je kunt je zoekmachine kiezen</translation> +<translation id="3479552764303398839">Niet nu</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /> over voorgestelde content</translation> <translation id="3495219333887281978">Inlogblad onderaan is op halve hoogte geopend.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -489,6 +490,7 @@ <translation id="3622349720008044802">Vensters beheren</translation> <translation id="3631987586758005671">Delen met <ph name="DEVICE_NAME" /></translation> <translation id="363596933471559332">Log automatisch in bij websites met de opgeslagen inloggegevens. Als de functie uitstaat, moet je je identiteit verifiëren voordat je kunt inloggen bij een website.</translation> +<translation id="3636940436873918441">Voorkeurstalen</translation> <translation id="3677911431265050325">Mobiele site opvragen</translation> <translation id="3687645719033307815">Je bekijkt een voorbeeld van deze pagina</translation> <translation id="3690369331356918524">Waarschuwt als je wachtwoorden zijn gelekt bij een gegevenslek</translation> @@ -667,6 +669,7 @@ <translation id="47217992755561375">Bekijk je populaire sites</translation> <translation id="4732120983431207637">Stack Unwinder</translation> <translation id="4736934858538408121">Virtuele kaart</translation> +<translation id="473775607612524610">Updaten</translation> <translation id="4738836084190194332">Laatst gesynchroniseerd: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Je krijgt verbeterde suggesties in de adresbalk</translation> <translation id="4742970037960872810">Markering verwijderen</translation> @@ -1278,6 +1281,7 @@ <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> is verouderd.</translation> <translation id="7944772052836377867">Synchronisatie moet bevestigen dat jij het bent</translation> <translation id="7947953824732555851">Accepteren en inloggen</translation> +<translation id="7957413488482743710">Een virtuele kaart verbergt je werkelijke kaart om je te beschermen tegen potentiële fraude. <ph name="BEGIN_LINK1" />Meer informatie over virtuele kaarten<ph name="END_LINK1" /></translation> <translation id="7961015016161918242">Nooit</translation> <translation id="7961926449547174351">Je hebt Opslagtoegang uitgezet. Ga naar Instellingen om deze aan te zetten.</translation> <translation id="7963646190083259054">Leverancier:</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb index 3bb93cd..5e28527 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 nedlasting er planlagt}other{# nedlastinger er planlagt}}</translation> <translation id="3474624961160222204">Fortsett som <ph name="NAME" /></translation> <translation id="3478363558367712427">Du kan velge søkemotor</translation> +<translation id="3479552764303398839">Ikke nå</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Finn ut mer<ph name="END_LINK" /> om foreslått innhold</translation> <translation id="3495219333887281978">Påloggingsfeltet nederst er åpnet i halv høyde.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Se toppnettstedene dine</translation> <translation id="4732120983431207637">Stack Unwinder</translation> <translation id="4736934858538408121">Virtuelt kort</translation> +<translation id="473775607612524610">Oppdater</translation> <translation id="4738836084190194332">Sist synkronisert: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Du får bedre forslag i adressefeltet</translation> <translation id="4742970037960872810">Fjern markering</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb index 1329351..5854d56 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1ଟି ଡାଉନଲୋଡ୍ ସିଡୁଲ୍ କରାଯାଇଛି}other{#ଟି ଡାଉନଲୋଡ୍ ସିଡୁଲ୍ କରାଯାଇଛି}}</translation> <translation id="3474624961160222204"><ph name="NAME" /> ଭାବେ ଜାରି ରଖନ୍ତୁ</translation> <translation id="3478363558367712427">ଆପଣ ଆପଣଙ୍କର ସର୍ଚ୍ଚ ଇଞ୍ଜିନ୍ ବାଛିପାରିବେ</translation> +<translation id="3479552764303398839">ଏବେ ନୁହେଁ</translation> <translation id="3493531032208478708">ପ୍ରସ୍ତାବିତ ବିଷୟବସ୍ତୁ ବିଷୟରେ <ph name="BEGIN_LINK" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="END_LINK" /></translation> <translation id="3495219333887281978">ସାଇନ ଇନ ବଟମ ସିଟ ଅଧା ସ୍କ୍ରିନରେ ଖୋଲିଛି।</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">ଆପଣଙ୍କ ଶ୍ରେଷ୍ଠ ସାଇଟଗୁଡ଼ିକୁ ଦେଖନ୍ତୁ</translation> <translation id="4732120983431207637">ଷ୍ଟାକ୍ ଅନ୍ୱାଇଣ୍ଡର୍</translation> <translation id="4736934858538408121">ଭର୍ଚୁଆଲ୍ କାର୍ଡ</translation> +<translation id="473775607612524610">ଅପ୍ଡେଟ୍</translation> <translation id="4738836084190194332">ଶେଷଥର ସିଙ୍କ ହୋଇଥିଲା: <ph name="WHEN" /></translation> <translation id="4741753828624614066">ଆପଣ ଠିକଣା ବାରରେ ଉନ୍ନତ ପରାମର୍ଶଗୁଡ଼ିକ ପାଇବେ</translation> <translation id="4742970037960872810">ହାଇଲାଇଟ୍ କାଢ଼ି ଦିଅନ୍ତୁ</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 dee6db63..3cd7f581 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
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 ਡਾਊਨਲੋਡ ਨੂੰ ਨਿਯਤ ਕੀਤਾ ਗਿਆ}one{# ਡਾਊਨਲੋਡ ਨੂੰ ਨਿਯਤ ਕੀਤਾ ਗਿਆ}other{# ਡਾਊਨਲੋਡਾਂ ਨੂੰ ਨਿਯਤ ਕੀਤਾ ਗਿਆ}}</translation> <translation id="3474624961160222204"><ph name="NAME" /> ਵਜੋਂ ਜਾਰੀ ਰੱਖੋ</translation> <translation id="3478363558367712427">ਤੁਸੀਂ ਆਪਣਾ ਖੋਜ ਇੰਜਣ ਚੁਣ ਸਕਦੇ ਹੋ</translation> +<translation id="3479552764303398839">ਹੁਣ ਨਹੀਂ</translation> <translation id="3493531032208478708">ਸੁਝਾਈ ਗਈ ਸਮੱਗਰੀ ਬਾਰੇ <ph name="BEGIN_LINK" />ਹੋਰ ਜਾਣੋ<ph name="END_LINK" /></translation> <translation id="3495219333887281978">ਸਾਈਨ-ਇਨ ਕਰਨ ਲਈ ਹੇਠਲੀ ਸ਼ੀਟ ਨੂੰ ਅੱਧੀ ਉਚਾਈ ਤੱਕ ਖੋਲ੍ਹਿਆ ਗਿਆ।</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">ਆਪਣੀਆਂ ਪ੍ਰਮੁੱਖ ਸਾਈਟਾਂ ਦੇਖੋ</translation> <translation id="4732120983431207637">ਸਟੈਕ ਅਨਵਾਈਂਡਰ</translation> <translation id="4736934858538408121">ਆਭਾਸੀ ਕਾਰਡ</translation> +<translation id="473775607612524610">ਅੱਪਡੇਟ ਕਰੋ</translation> <translation id="4738836084190194332">ਆਖਰੀ ਵਾਰ ਸਮਕਾਲੀ ਕੀਤੀ: <ph name="WHEN" /></translation> <translation id="4741753828624614066">ਤੁਹਾਨੂੰ ਪਤਾ ਬਾਰ ਵਿੱਚ ਬਿਹਤਰ ਸੁਝਾਅ ਪ੍ਰਾਪਤ ਹੋਣਗੇ</translation> <translation id="4742970037960872810">ਹਾਈਲਾਈਟ ਹਟਾਓ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb index 9a328e8..a3124477 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{Zaplanowano pobranie 1 pliku}few{Zaplanowano pobranie # plików}many{Zaplanowano pobranie # plików}other{Zaplanowano pobranie # pliku}}</translation> <translation id="3474624961160222204">Nadal używaj konta użytkownika <ph name="NAME" /></translation> <translation id="3478363558367712427">Możesz wybrać wyszukiwarkę</translation> +<translation id="3479552764303398839">Nie teraz</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Dowiedz się więcej<ph name="END_LINK" /> o proponowanej treści</translation> <translation id="3495219333887281978">Plansza dolna logowania jest otwarta do połowy wysokości.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -668,6 +669,7 @@ <translation id="47217992755561375">Zobacz strony, które odwiedzasz najczęściej</translation> <translation id="4732120983431207637">Moduł rozwijania stosu</translation> <translation id="4736934858538408121">Karta wirtualna</translation> +<translation id="473775607612524610">Aktualizuj</translation> <translation id="4738836084190194332">Ostatnia synchronizacja: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Będziesz otrzymywać ulepszone sugestie na pasku adresu.</translation> <translation id="4742970037960872810">Usuń podświetlenie</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb index d252496..ec8c954 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 download programado}one{# download programado}other{# downloads programados}}</translation> <translation id="3474624961160222204">Continuar como <ph name="NAME" /></translation> <translation id="3478363558367712427">Você pode escolher seu mecanismo de pesquisa</translation> +<translation id="3479552764303398839">Não agora</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /> sobre o conteúdo sugerido</translation> <translation id="3495219333887281978">Página inferior de login aberta na metade da altura.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -668,6 +669,7 @@ <translation id="47217992755561375">Veja seus principais sites</translation> <translation id="4732120983431207637">Recuperador de pilha</translation> <translation id="4736934858538408121">Cartão virtual</translation> +<translation id="473775607612524610">Atualizar</translation> <translation id="4738836084190194332">Última sincronização: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Você vai receber sugestões melhores na barra de endereço</translation> <translation id="4742970037960872810">Remover destaque</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 c1019b8..f5db41a7 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
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 transferência programada}other{# transferências programadas}}</translation> <translation id="3474624961160222204">Continuar como <ph name="NAME" /></translation> <translation id="3478363558367712427">Pode escolher o seu motor de pesquisa.</translation> +<translation id="3479552764303398839">Agora não</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /> acerca do conteúdo sugerido</translation> <translation id="3495219333887281978">Secção inferior de início de sessão aberta a meia altura.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -668,6 +669,7 @@ <translation id="47217992755561375">Veja os seus sites principais.</translation> <translation id="4732120983431207637">Desempilhador de pilhas</translation> <translation id="4736934858538408121">Cartão virtual</translation> +<translation id="473775607612524610">Atualizar</translation> <translation id="4738836084190194332">Última sincronização: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Receberá sugestões melhoradas na barra de endereço</translation> <translation id="4742970037960872810">Remover realce</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb index 3ee1c80..8804258 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{O descărcare programată}few{# descărcări programate}other{# de descărcări programate}}</translation> <translation id="3474624961160222204">Continuă ca <ph name="NAME" /></translation> <translation id="3478363558367712427">Poți alege motorul de căutare</translation> +<translation id="3479552764303398839">Nu acum</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /> despre conținutul sugerat</translation> <translation id="3495219333887281978">Foaia de conectare din partea de jos deschisă la jumătate din înălțime.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Vezi principalele site-uri</translation> <translation id="4732120983431207637">Instrument de derulare a stivei</translation> <translation id="4736934858538408121">Card virtual</translation> +<translation id="473775607612524610">Actualizează</translation> <translation id="4738836084190194332">Ultima sincronizare: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Vei primi sugestii îmbunătățite în bara de adrese</translation> <translation id="4742970037960872810">Elimină evidențierea</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb index a5bf3b1..16dd2e9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{Запланировано 1 скачивание.}one{Запланировано # скачивание.}few{Запланировано # скачивания.}many{Запланировано # скачиваний.}other{Запланировано # скачивания.}}</translation> <translation id="3474624961160222204">Продолжить как <ph name="NAME" /></translation> <translation id="3478363558367712427">Вы можете выбрать другую поисковую систему.</translation> +<translation id="3479552764303398839">Не сейчас</translation> <translation id="3493531032208478708">Подробнее <ph name="BEGIN_LINK" />о рекомендованном контенте<ph name="END_LINK" />…</translation> <translation id="3495219333887281978">Нижний экран входа в аккаунт открыт наполовину.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -489,6 +490,7 @@ <translation id="3622349720008044802">Управление окнами</translation> <translation id="3631987586758005671">Отправка на устройство "<ph name="DEVICE_NAME" />"…</translation> <translation id="363596933471559332">Входить на веб-сайты с помощью сохраненного имени пользователя и пароля. Когда функция отключена, эти данные нужно указывать при каждом входе.</translation> +<translation id="3636940436873918441">Предпочитаемые языки</translation> <translation id="3677911431265050325">Мобильная версия</translation> <translation id="3687645719033307815">Эта страница показывается в режиме предварительного просмотра.</translation> <translation id="3690369331356918524">Сообщает, если пароли были раскрыты в результате утечки данных.</translation> @@ -667,6 +669,7 @@ <translation id="47217992755561375">Интересные вам сайты</translation> <translation id="4732120983431207637">Stack Unwinder</translation> <translation id="4736934858538408121">Виртуальная карта</translation> +<translation id="473775607612524610">Обновить</translation> <translation id="4738836084190194332">Последняя синхронизация: <ph name="WHEN" /></translation> <translation id="4741753828624614066">В адресной строке будут показываться улучшенные подсказки.</translation> <translation id="4742970037960872810">Снять выделение</translation> @@ -1278,6 +1281,7 @@ <translation id="7942131818088350342">Версия <ph name="PRODUCT_NAME" /> устарела.</translation> <translation id="7944772052836377867">Подтвердите личность для синхронизации</translation> <translation id="7947953824732555851">Принять и войти</translation> +<translation id="7957413488482743710">Виртуальная карта помогает скрыть ваши данные от мошенников. <ph name="BEGIN_LINK1" />Подробнее…<ph name="END_LINK1" /></translation> <translation id="7961015016161918242">Нет</translation> <translation id="7961926449547174351">Откройте доступ к хранилищу в настройках устройства.</translation> <translation id="7963646190083259054">Поставщик:</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb index c2c201f..3d1877c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{බාගැනීම් 1ක් කාලසටහන්ගත කරන ලදි}one{බාගැනීම් #ක් කාලසටහන්ගත කරන ලදි}other{බාගැනීම් #ක් කාලසටහන්ගත කරන ලදි}}</translation> <translation id="3474624961160222204"><ph name="NAME" /> ලෙස කරගෙන යන්න</translation> <translation id="3478363558367712427">ඔබට ඔබේ සෙවීම් එන්ජිම තෝරා ගත හැකිය</translation> +<translation id="3479552764303398839">දැන් නොවේ</translation> <translation id="3493531032208478708">යෝජිත අන්තර්ගතය ගැන <ph name="BEGIN_LINK" />තවත් දැනගන්න<ph name="END_LINK" /></translation> <translation id="3495219333887281978">පිරීමේ පහළ පත්රය අර්ධ උසින් විවෘත විය.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">ඔබගේ ඉහළම අඩවි බලන්න</translation> <translation id="4732120983431207637">එතීම ලිහන්නා</translation> <translation id="4736934858538408121">අතථ්ය කාඩ්පත</translation> +<translation id="473775607612524610">යාවත්කාලීනය</translation> <translation id="4738836084190194332">අවසන් වරට සමමුහුර්ත කළේ: <ph name="WHEN" /></translation> <translation id="4741753828624614066">ලිපින තීරුව තුළ ඔබට වැඩිදියුණු කළ යෝජනා ලැබෙනු ඇත</translation> <translation id="4742970037960872810">උද්දීපනය ඉවත් කරන්න</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb index 6dc886ee..ebf6321 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{Bolo naplánované 1 sťahovanie}few{Boli naplánované # sťahovania}many{# downloads scheduled}other{Bolo naplánovaných # sťahovaní}}</translation> <translation id="3474624961160222204">Pokračovať ako <ph name="NAME" /></translation> <translation id="3478363558367712427">Môžete si vybrať vyhľadávač</translation> +<translation id="3479552764303398839">Teraz nie</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Ďalšie informácie<ph name="END_LINK" /> o návrhoch obsahu</translation> <translation id="3495219333887281978">Dolný hárok prihlásenia otvorený na polovičnú výšku.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -489,6 +490,7 @@ <translation id="3622349720008044802">Správa okien</translation> <translation id="3631987586758005671">Zdieľa sa so zariadením <ph name="DEVICE_NAME" /></translation> <translation id="363596933471559332">Povolí automatické prihlasovanie na webové stránky pomocou uložených poverení. Keď je funkcia vypnutá, zobrazí sa výzva na overenie vždy pred prihlásením na web.</translation> +<translation id="3636940436873918441">Preferované jazyky</translation> <translation id="3677911431265050325">Vyžiadať mobilný web</translation> <translation id="3687645719033307815">Zobrazujete si ukážku tejto stránky</translation> <translation id="3690369331356918524">Upozorňuje pri prezradení hesiel v rámci porušenia ochrany údajov</translation> @@ -667,6 +669,7 @@ <translation id="47217992755561375">Zobraziť najobľúbenejšie weby</translation> <translation id="4732120983431207637">Modul na rozvinutie zásobníka</translation> <translation id="4736934858538408121">Virtuálna karta</translation> +<translation id="473775607612524610">Aktualizovať</translation> <translation id="4738836084190194332">Synchronizované <ph name="WHEN" /></translation> <translation id="4741753828624614066">Budete dostávať zlepšené návrhy v paneli s adresou</translation> <translation id="4742970037960872810">Odstrániť zvýraznenie</translation> @@ -1278,6 +1281,7 @@ <translation id="7942131818088350342">Aplikácia <ph name="PRODUCT_NAME" /> je zastaraná.</translation> <translation id="7944772052836377867">Synchronizácia potrebuje overiť vašu totožnosť</translation> <translation id="7947953824732555851">Prijať a prihl. sa</translation> +<translation id="7957413488482743710">Virtuálnou kartou sa skryje vaša skutočná karta, čo vás ochráni pred potenciálnymi podvodmi. <ph name="BEGIN_LINK1" />Ďalšie informácie o virtuálnych kartách<ph name="END_LINK1" /></translation> <translation id="7961015016161918242">Nikdy</translation> <translation id="7961926449547174351">Deaktivovali ste prístup k úložisku. Aktivujete ho v sekcii Nastavenia.</translation> <translation id="7963646190083259054">Dodávateľ:</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb index a91372c..25388cd 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{Načrtovan je 1 prenos.}one{Načrtovan je # prenos.}two{Načrtovana sta # prenosa.}few{Načrtovani so # prenosi.}other{Načrtovanih je # prenosov.}}</translation> <translation id="3474624961160222204">Nadaljuj kot <ph name="NAME" /></translation> <translation id="3478363558367712427">Izberete lahko iskalnik</translation> +<translation id="3479552764303398839">Ne zdaj</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Preberite več<ph name="END_LINK" /> o predlagani vsebini</translation> <translation id="3495219333887281978">Razdelek na dnu zaslona za prijavo je odprt pri polovični višini.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Ogled najbolj priljubljenih spletnih mest</translation> <translation id="4732120983431207637">Modul za odstranitev sklada</translation> <translation id="4736934858538408121">Navidezna kartica</translation> +<translation id="473775607612524610">Posodobi</translation> <translation id="4738836084190194332">Zadnja sinhronizacija: <ph name="WHEN" /></translation> <translation id="4741753828624614066">V naslovni vrstici boste prejemali izboljšane predloge.</translation> <translation id="4742970037960872810">Odstrani označitev</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb index 3b5b322..86c51b18 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 shkarkim i planifikuar}other{# shkarkime të planifikuara}}</translation> <translation id="3474624961160222204">Vazhdo si <ph name="NAME" /></translation> <translation id="3478363558367712427">Mund të zgjedhësh motorin tënd të kërkimit</translation> +<translation id="3479552764303398839">Jo tani</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Mëso më shumë<ph name="END_LINK" /> mbi përmbajtjen e sugjeruar</translation> <translation id="3495219333887281978">Fleta e poshtme e identifikimit u hap në gjysmë lartësi.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Shiko sajtet e tua kryesore</translation> <translation id="4732120983431207637">Moduli i zbërthimit të stivës</translation> <translation id="4736934858538408121">Karta virtuale</translation> +<translation id="473775607612524610">Përditësoje</translation> <translation id="4738836084190194332">Sinkronizimi i fundit: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Do të marrësh sugjerime të përmirësuara në shiritin e kërkimit</translation> <translation id="4742970037960872810">Hiq theksimin</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb index 6650c38a..05ce91f0 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{Zakazano je 1 preuzimanje}one{Zakazano je # preuzimanje}few{Zakazana su # preuzimanja}other{Zakazano je # preuzimanja}}</translation> <translation id="3474624961160222204">Nastavi kao <ph name="NAME" /></translation> <translation id="3478363558367712427">Možete da odaberete pretraživač</translation> +<translation id="3479552764303398839">Ne sada</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /> o predloženom sadržaju</translation> <translation id="3495219333887281978">Donja tabela za prijavljivanje je otvorena do polovine ekrana.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -668,6 +669,7 @@ <translation id="47217992755561375">Pogledajte sajtove koje najčešće posećujete</translation> <translation id="4732120983431207637">Stack Unwinder</translation> <translation id="4736934858538408121">Virtuelna kartica</translation> +<translation id="473775607612524610">Ažuriraj</translation> <translation id="4738836084190194332">Poslednja sinhronizacija: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Dobijaćete poboljšane predloge na traci za adresu</translation> <translation id="4742970037960872810">Ukloni isticanje</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb index beb5dac8..5249a38 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{Заказано је 1 преузимање}one{Заказано је # преузимање}few{Заказана су # преузимања}other{Заказано је # преузимања}}</translation> <translation id="3474624961160222204">Настави као <ph name="NAME" /></translation> <translation id="3478363558367712427">Можете да одаберете претраживач</translation> +<translation id="3479552764303398839">Не сада</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Сазнајте више<ph name="END_LINK" /> о предложеном садржају</translation> <translation id="3495219333887281978">Доња табела за пријављивање је отворена до половине екрана.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -668,6 +669,7 @@ <translation id="47217992755561375">Погледајте сајтове које најчешће посећујете</translation> <translation id="4732120983431207637">Stack Unwinder</translation> <translation id="4736934858538408121">Виртуелна картица</translation> +<translation id="473775607612524610">Ажурирај</translation> <translation id="4738836084190194332">Последња синхронизација: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Добијаћете побољшане предлоге на траци за адресу</translation> <translation id="4742970037960872810">Уклони истицање</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb index afaae52..0024360 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 nedladdning har schemalagts}other{# nedladdningar har schemalagts}}</translation> <translation id="3474624961160222204">Fortsätt som <ph name="NAME" /></translation> <translation id="3478363558367712427">Du kan välja din sökmotor</translation> +<translation id="3479552764303398839">Inte nu</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Läs mer<ph name="END_LINK" /> om förslag på innehåll</translation> <translation id="3495219333887281978">Arket för inloggning på nedre delen av skärmen har öppnats över halva skärmen.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -668,6 +669,7 @@ <translation id="47217992755561375">Se dina mest besökta webbplatser</translation> <translation id="4732120983431207637">Stack Unwinder</translation> <translation id="4736934858538408121">Virtuellt kort</translation> +<translation id="473775607612524610">Uppdatera</translation> <translation id="4738836084190194332">Synkroniserades senast: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Du får bättre förslag i adressfältet</translation> <translation id="4742970037960872810">Ta bort markering</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb index 243462f..8657f02 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{Upakuaji wa faili moja umeratibiwa}other{Upakuaji wa faili # umeratibiwa.}}</translation> <translation id="3474624961160222204">Endelea ukitumia <ph name="NAME" /></translation> <translation id="3478363558367712427">Unaweza kuchagua mtambo wako wa kutafuta</translation> +<translation id="3479552764303398839">Si sasa</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Pata maelezo zaidi<ph name="END_LINK" /> kuhusu maudhui yaliyopendekezwa</translation> <translation id="3495219333887281978">Safu ya chini ya kuingia katika akaunti imefunguliwa katika hali ya nusu skrini.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Angalia tovuti zako maarufu</translation> <translation id="4732120983431207637">Kiondoaji cha Rafu</translation> <translation id="4736934858538408121">Kadi pepe</translation> +<translation id="473775607612524610">Sasisha</translation> <translation id="4738836084190194332">Kilisawazishwa mara ya mwisho: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Utapata mapendekezo yaliyoboreshwa katika sehemu ya anwani</translation> <translation id="4742970037960872810">Acha kuangazia</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb index 069138e..1c783b2 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 பதிவிறக்கம் திட்டமிடப்பட்டுள்ளது}other{# பதிவிறக்கங்கள் திட்டமிடப்பட்டுள்ளன}}</translation> <translation id="3474624961160222204"><ph name="NAME" /> கணக்கில் தொடர்க</translation> <translation id="3478363558367712427">உங்கள் தேடல் இன்ஜினை தேர்வுசெய்யலாம்</translation> +<translation id="3479552764303398839">இப்பொழுது இல்லை</translation> <translation id="3493531032208478708">பரிந்துரைக்கப்படும் உள்ளடக்கம் பற்றி <ph name="BEGIN_LINK" />மேலும் அறிக<ph name="END_LINK" /></translation> <translation id="3495219333887281978">உள்நுழைவதற்கான கீழ்ப்புறச் சீட்டு பாதித் திரையில் திறக்கப்பட்டுள்ளது.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">நீங்கள் அடிக்கடி பயன்படுத்தும் தளங்களைப் பார்க்கலாம்</translation> <translation id="4732120983431207637">ஸ்டேக் அன்வைண்டர்</translation> <translation id="4736934858538408121">விர்ச்சுவல் கார்டு</translation> +<translation id="473775607612524610">புதுப்பி</translation> <translation id="4738836084190194332">கடைசியாக ஒத்திசைத்தது: <ph name="WHEN" /></translation> <translation id="4741753828624614066">இன்னும் துல்லியமான பரிந்துரைகளை முகவரிப் பட்டியில் பெறுவீர்கள்</translation> <translation id="4742970037960872810">ஹைலைட்டை அகற்று</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 d535a45..ce1722a 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
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 డౌన్లోడ్ షెడ్యూల్ చేయబడింది}other{# డౌన్లోడ్లు షెడ్యూల్ చేయబడ్డాయి}}</translation> <translation id="3474624961160222204"><ph name="NAME" /> లాగా కొనసాగించు</translation> <translation id="3478363558367712427">మీరు మీ సెర్చ్ ఇంజిన్ను ఎంచుకోవచ్చు</translation> +<translation id="3479552764303398839">ఇప్పుడు కాదు</translation> <translation id="3493531032208478708">సూచించిన కంటెంట్ గురించి <ph name="BEGIN_LINK" />మరింత తెలుసుకోండి<ph name="END_LINK" /></translation> <translation id="3495219333887281978">సైన్ ఇన్ చేయదగిన దిగువున ఉన్న షీట్ సగం మేరకు తెరవబడింది.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">మీ టాప్ సైట్లను చూడండి</translation> <translation id="4732120983431207637">స్టాక్ అన్వైండర్</translation> <translation id="4736934858538408121">వర్చువల్ కార్డ్</translation> +<translation id="473775607612524610">అప్డేట్</translation> <translation id="4738836084190194332">చివరిగా సమకాలీకరించినది: <ph name="WHEN" /></translation> <translation id="4741753828624614066">మీరు అడ్రస్ బార్లో మెరుగైన సూచనలను పొందుతారు</translation> <translation id="4742970037960872810">హైలైట్ను తీసివేయండి</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb index 31e60c7..b7a091e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{กำหนดเวลาการดาวน์โหลด 1 รายการแล้ว}other{กำหนดเวลาการดาวน์โหลด # รายการแล้ว}}</translation> <translation id="3474624961160222204">ดำเนินการต่อในชื่อ <ph name="NAME" /></translation> <translation id="3478363558367712427">คุณเลือกเครื่องมือค้นหาได้</translation> +<translation id="3479552764303398839">ไม่ใช่ตอนนี้</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK" />เกี่ยวกับเนื้อหาที่แนะนำ</translation> <translation id="3495219333887281978">Bottom Sheet การลงชื่อเข้าใช้เปิดอยู่ครึ่งหน้าจอ</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -489,6 +490,7 @@ <translation id="3622349720008044802">จัดการหน้าต่าง</translation> <translation id="3631987586758005671">กำลังแชร์กับ <ph name="DEVICE_NAME" /></translation> <translation id="363596933471559332">ลงชื่อเข้าใช้เว็บไซต์โดยอัตโนมัติโดยใช้ข้อมูลเข้าสู่ระบบที่เก็บไว้ เมื่อฟีเจอร์นี้ปิดอยู่ ระบบจะขอให้คุณยืนยันทุกครั้งก่อนลงชื่อเข้าใช้เว็บไซต์</translation> +<translation id="3636940436873918441">ภาษาที่ต้องการ</translation> <translation id="3677911431265050325">ขอเว็บไซต์ในอุปกรณ์เคลื่อนที่</translation> <translation id="3687645719033307815">คุณกำลังดูตัวอย่างของหน้านี้</translation> <translation id="3690369331356918524">เตือนคุณในกรณีที่รหัสผ่านรั่วไหลจากการละเมิดข้อมูล</translation> @@ -667,6 +669,7 @@ <translation id="47217992755561375">ดูเว็บไซต์ยอดนิยม</translation> <translation id="4732120983431207637">ตัวคลายสแต็ก</translation> <translation id="4736934858538408121">บัตรเสมือน</translation> +<translation id="473775607612524610">อัปเดต</translation> <translation id="4738836084190194332">ซิงค์ครั้งล่าสุด: <ph name="WHEN" /></translation> <translation id="4741753828624614066">คุณจะได้รับคำแนะนำที่ดีขึ้นในแถบที่อยู่</translation> <translation id="4742970037960872810">นำไฮไลต์ออก</translation> @@ -1278,6 +1281,7 @@ <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> ล้าสมัย</translation> <translation id="7944772052836377867">การซิงค์จะต้องยืนยันว่าเป็นคุณ</translation> <translation id="7947953824732555851">ยอมรับและลงชื่อเข้าใช้</translation> +<translation id="7957413488482743710">บัตรเสมือนจะซ่อนบัตรจริงไว้เพื่อช่วยปกป้องคุณจากการฉ้อโกงที่อาจเกิดขึ้น <ph name="BEGIN_LINK1" />ดูข้อมูลเพิ่มเติมเกี่ยวกับบัตรเสมือน<ph name="END_LINK1" /></translation> <translation id="7961015016161918242">ไม่ต้องเลย</translation> <translation id="7961926449547174351">คุณปิดการเข้าถึงพื้นที่เก็บข้อมูลไว้ โปรดไปที่การตั้งค่าเพื่อเปิดการเข้าถึง</translation> <translation id="7963646190083259054">ผู้ขาย:</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb index 88ff41b..32b0b424 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 indirme işlemi programlandı}other{# indirme işlemi programlandı}}</translation> <translation id="3474624961160222204"><ph name="NAME" /> olarak devam et</translation> <translation id="3478363558367712427">Arama motorunuzu seçebilirsiniz</translation> +<translation id="3479552764303398839">Şimdi değil</translation> <translation id="3493531032208478708">Önerilen içerik hakkında <ph name="BEGIN_LINK" />daha fazla bilgi edinin<ph name="END_LINK" /></translation> <translation id="3495219333887281978">Oturum açma alt sayfası ekranın yarısına kadar açıldı.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Popüler sitelerinize bakın</translation> <translation id="4732120983431207637">Yığın Açma Aracı</translation> <translation id="4736934858538408121">Sanal kart</translation> +<translation id="473775607612524610">Güncelle</translation> <translation id="4738836084190194332">Son senkronizasyon: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Adres çubuğunda daha iyi öneriler görürsünüz</translation> <translation id="4742970037960872810">Vurgulamayı kaldır</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb index 71634ea..7090c0a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{Заплановано 1 завантаження}one{Заплановано # завантаження}few{Заплановано # завантаження}many{Заплановано # завантажень}other{Заплановано # завантаження}}</translation> <translation id="3474624961160222204">Продовжити як <ph name="NAME" /></translation> <translation id="3478363558367712427">Ви можете вибрати пошукову систему</translation> +<translation id="3479552764303398839">Не зараз</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Докладніше<ph name="END_LINK" /> про рекомендований контент</translation> <translation id="3495219333887281978">Нижній екран для входу відкрито на половину висоти.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Переглянути улюблені сайти</translation> <translation id="4732120983431207637">Stack Unwinder</translation> <translation id="4736934858538408121">Віртуальна картка</translation> +<translation id="473775607612524610">Оновити</translation> <translation id="4738836084190194332">Остання синхронізація: <ph name="WHEN" /></translation> <translation id="4741753828624614066">В адресному рядку з’являтимуться покращені підказки</translation> <translation id="4742970037960872810">Зняти виділення</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb index 1c8bc12..080c7a43 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 ڈاؤن لوڈ شیڈول کیا گیا}other{# ڈاؤن لوڈز شیڈول کیے گئے}}</translation> <translation id="3474624961160222204">بطور <ph name="NAME" /> جاری رکھیں</translation> <translation id="3478363558367712427">آپ اپنا سرچ انجن منتخب کر سکتے ہیں</translation> +<translation id="3479552764303398839">ابھی نہیں</translation> <translation id="3493531032208478708">تجویز کردہ مواد کے بارے میں <ph name="BEGIN_LINK" />مزید جانیں<ph name="END_LINK" /></translation> <translation id="3495219333887281978">سائن ان کرنے کے لیے نیچے کی شیٹ آدھی اونچائی پر کھلی ہوئی ہے۔</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">اپنی سرفہرست سائٹس دیکھیں</translation> <translation id="4732120983431207637">انبار Unwinder</translation> <translation id="4736934858538408121">ورچوئل کارڈ</translation> +<translation id="473775607612524610">اپ ڈيٹ کریں</translation> <translation id="4738836084190194332">آخری مطابقت پذیری: <ph name="WHEN" /></translation> <translation id="4741753828624614066">آپ کو ایڈریس بار میں بہتر کردہ تجاویز حاصل ہوں گی</translation> <translation id="4742970037960872810">ہائی لائٹ کو ہٹائیں</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 937fd78..fc61fa6 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
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 ta yuklanma rejalashtirildi}other{# ta yuklanma rejalashtirildi}}</translation> <translation id="3474624961160222204"><ph name="NAME" /> sifatida davom etish</translation> <translation id="3478363558367712427">Qidiruv tizimini tanlashingiz mumkin</translation> +<translation id="3479552764303398839">Hozir emas</translation> <translation id="3493531032208478708">Bildirgi takliflar haqida <ph name="BEGIN_LINK" />batafsil ma’lumot<ph name="END_LINK" /></translation> <translation id="3495219333887281978">Kirish oynasi quyi ekranda yarim hajmda ochildi.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Eng sara saytlaringiz</translation> <translation id="4732120983431207637">Stack Unwinder</translation> <translation id="4736934858538408121">Virtual karta</translation> +<translation id="473775607612524610">Yangilash</translation> <translation id="4738836084190194332">Oxirgi sinxronizatsiya: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Manzillar qatorida yanada yaxshi takliflar olasiz</translation> <translation id="4742970037960872810">Belgilovni olib tashlash</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 acd3345..9eca0eb2 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
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{Đã lên lịch 1 quá trình tải xuống}other{Đã lên lịch # quá trình tải xuống}}</translation> <translation id="3474624961160222204">Tiếp tục với tên <ph name="NAME" /></translation> <translation id="3478363558367712427">Bạn có thể chọn công cụ tìm kiếm theo ý mình</translation> +<translation id="3479552764303398839">Để sau</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Tìm hiểu thêm<ph name="END_LINK" /> về nội dung đề xuất</translation> <translation id="3495219333887281978">Bảng đăng nhập ở dưới cùng mở ra trong nửa dưới màn hình.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Xem các trang web hàng đầu của bạn</translation> <translation id="4732120983431207637">Trình gỡ ngăn xếp</translation> <translation id="4736934858538408121">Thẻ ảo</translation> +<translation id="473775607612524610">Cập nhật</translation> <translation id="4738836084190194332">Đồng bộ hóa lần gần đây nhất: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Bạn sẽ nhận được nội dung đề xuất cải tiến trên thanh địa chỉ</translation> <translation id="4742970037960872810">Xóa nội dung được làm nổi bật</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb index c2e00a6..bd21ac6 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{已排定 1 项下载}other{已排定 # 项下载}}</translation> <translation id="3474624961160222204">继续以<ph name="NAME" />的身份使用</translation> <translation id="3478363558367712427">您可自行选择要使用的搜索引擎</translation> +<translation id="3479552764303398839">以后再说</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />详细了解<ph name="END_LINK" />推荐内容</translation> <translation id="3495219333887281978">用于进行登录的底部工作表已半屏打开。</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">查看为您推荐的热门网站</translation> <translation id="4732120983431207637">堆栈展开程序</translation> <translation id="4736934858538408121">虚拟卡</translation> +<translation id="473775607612524610">更新</translation> <translation id="4738836084190194332">上次同步时间:<ph name="WHEN" /></translation> <translation id="4741753828624614066">您会在地址栏中获得经过改进的建议</translation> <translation id="4742970037960872810">撤消突出显示</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb index 0bcbff1..7ced4c5 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{已預定 1 項下載}other{已預定 # 項下載}}</translation> <translation id="3474624961160222204">以「<ph name="NAME" />」的身分繼續</translation> <translation id="3478363558367712427">您可以選擇搜尋引擎</translation> +<translation id="3479552764303398839">略過</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />進一步瞭解<ph name="END_LINK" />建議的內容</translation> <translation id="3495219333887281978">登入頁底面板宜家顯示喺畫面下半部。</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">查看熱門網站</translation> <translation id="4732120983431207637">Stack Unwinder</translation> <translation id="4736934858538408121">虛擬卡</translation> +<translation id="473775607612524610">更新</translation> <translation id="4738836084190194332">最後同步處理時間:<ph name="WHEN" /></translation> <translation id="4741753828624614066">您會在網址列取得更貼近需求的建議</translation> <translation id="4742970037960872810">移除焦點內容</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb index ea406ab..da84e7a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -459,6 +459,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{已排定 1 項下載作業}other{已排定 # 項下載作業}}</translation> <translation id="3474624961160222204">以「<ph name="NAME" />」的身分繼續</translation> <translation id="3478363558367712427">你可以選擇搜尋引擎</translation> +<translation id="3479552764303398839">現在不要</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />進一步瞭解<ph name="END_LINK" />建議的內容</translation> <translation id="3495219333887281978">登入底部功能表已開啟,顯示在畫面下半部。</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -666,6 +667,7 @@ <translation id="47217992755561375">查看你常用的網站</translation> <translation id="4732120983431207637">堆疊回溯器</translation> <translation id="4736934858538408121">虛擬卡片</translation> +<translation id="473775607612524610">更新</translation> <translation id="4738836084190194332">上次同步處理時間:<ph name="WHEN" /></translation> <translation id="4741753828624614066">你會在網址列取得更貼近需求的建議</translation> <translation id="4742970037960872810">移除醒目顯示</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb index 57c4664..e2246be 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb
@@ -460,6 +460,7 @@ <translation id="3469665409713263828">{FILE_COUNT,plural, =1{Ukudawuniloda oku-1 kushejuliwe}one{Okudawunilodiwe okungu-# kushejuliwe}other{Okudawunilodiwe okungu-# kushejuliwe}}</translation> <translation id="3474624961160222204">Qhubeka njengo-<ph name="NAME" /></translation> <translation id="3478363558367712427">Ungakhetha injini yakho yosesho</translation> +<translation id="3479552764303398839">Hhayi manje</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Funda kabanzi<ph name="END_LINK" /> mayelana nokuqukethwe okuphakamisiwe</translation> <translation id="3495219333887281978">Ishidi lokungena ngemvume eliphansi livulwe ngobude obuyisigamu.</translation> <translation id="3499246418971111862">i-chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> @@ -667,6 +668,7 @@ <translation id="47217992755561375">Bona amasayithi akho aphezulu</translation> <translation id="4732120983431207637">I-Stack Unwinder</translation> <translation id="4736934858538408121">Ikhadi elibonakalayo</translation> +<translation id="473775607612524610">Buyekeza</translation> <translation id="4738836084190194332">Ukuvumelanisa kokugcina: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Uzothola iziphakamiso ezithuthukisiwe kwibha yekheli</translation> <translation id="4742970037960872810">Susa ukugqama</translation>
diff --git a/chrome/browser/ui/android/toolbar/BUILD.gn b/chrome/browser/ui/android/toolbar/BUILD.gn index 9ef99603..b08941cc 100644 --- a/chrome/browser/ui/android/toolbar/BUILD.gn +++ b/chrome/browser/ui/android/toolbar/BUILD.gn
@@ -292,8 +292,13 @@ "java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonTest.java", "java/src/org/chromium/chrome/browser/toolbar/optional_button/OptionalButtonCoordinatorTest.java", "java/src/org/chromium/chrome/browser/toolbar/optional_button/OptionalButtonViewTest.java", + "java/src/org/chromium/chrome/browser/toolbar/top/HomeButtonCoordinatorTest.java", "java/src/org/chromium/chrome/browser/toolbar/top/OptionalBrowsingModeButtonControllerTest.java", "java/src/org/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinatorTest.java", + "java/src/org/chromium/chrome/browser/toolbar/top/ToolbarControlContainerTest.java", + "java/src/org/chromium/chrome/browser/toolbar/top/ToolbarSnapshotStateTest.java", + "java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTabletUnitTest.java", + "java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarInteractabilityManagerTest.java", "java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediatorTest.java", ]
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController.java index 5745f1bf..4fbf290 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController.java
@@ -70,6 +70,9 @@ private final Callback<Integer> mMenuClickListener; private final AdaptiveButtonActionMenuCoordinator mMenuCoordinator; + @AdaptiveToolbarButtonVariant + private int mSessionButtonVariant = AdaptiveToolbarButtonVariant.UNKNOWN; + /** * Constructs the {@link AdaptiveToolbarButtonController}. * @@ -126,7 +129,7 @@ @Override public void destroy() { - setSingleProvider(null); + setSingleProvider(AdaptiveToolbarButtonVariant.UNKNOWN); mObservers.clear(); mSharedPreferencesManager.removeObserver(this); mLifecycleDispatcher.unregister(this); @@ -140,7 +143,9 @@ } } - private void setSingleProvider(@Nullable ButtonDataProvider buttonProvider) { + private void setSingleProvider(@AdaptiveToolbarButtonVariant int buttonVariant) { + @Nullable + ButtonDataProvider buttonProvider = mButtonDataProviderMap.get(buttonVariant); if (mSingleProvider != null) { mSingleProvider.removeObserver(this); } @@ -222,9 +227,9 @@ public void onFinishNativeInitialization() { if (AdaptiveToolbarFeatures.isCustomizationEnabled()) { mAdaptiveToolbarStatePredictor.recomputeUiState(uiState -> { - setSingleProvider(uiState.canShowUi - ? mButtonDataProviderMap.get(uiState.toolbarButtonState) - : null); + mSessionButtonVariant = uiState.canShowUi ? uiState.toolbarButtonState + : AdaptiveToolbarButtonVariant.UNKNOWN; + setSingleProvider(mSessionButtonVariant); notifyObservers(uiState.canShowUi); }); AdaptiveToolbarStats.recordSelectedSegmentFromSegmentationPlatformAsync( @@ -261,9 +266,9 @@ || ADAPTIVE_TOOLBAR_CUSTOMIZATION_ENABLED.equals(key)) { assert AdaptiveToolbarFeatures.isCustomizationEnabled(); mAdaptiveToolbarStatePredictor.recomputeUiState(uiState -> { - setSingleProvider(uiState.canShowUi - ? mButtonDataProviderMap.get(uiState.toolbarButtonState) - : null); + mSessionButtonVariant = uiState.canShowUi ? uiState.toolbarButtonState + : AdaptiveToolbarButtonVariant.UNKNOWN; + setSingleProvider(mSessionButtonVariant); notifyObservers(uiState.canShowUi); }); } @@ -271,8 +276,12 @@ /** Called to notify the controller that a dynamic action is available and should be shown. */ public void showDynamicAction(@AdaptiveToolbarButtonVariant int action) { - // TODO(shaktisahu): Fix logic to show the next preferred button. - setSingleProvider(mButtonDataProviderMap.get(action)); - notifyObservers(action != AdaptiveToolbarButtonVariant.UNKNOWN); + int actionToShow = + action != AdaptiveToolbarButtonVariant.UNKNOWN ? action : mSessionButtonVariant; + if (mOriginalButtonSpec != null && mOriginalButtonSpec.getButtonVariant() == actionToShow) { + return; + } + setSingleProvider(actionToShow); + notifyObservers(true); } }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarFeatures.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarFeatures.java index 2d652b5..a44a073 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarFeatures.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarFeatures.java
@@ -116,7 +116,7 @@ /** @return Whether the contextual page actions should show the action chip version. */ public static boolean shouldShowActionChip() { return ChromeFeatureList.getFieldTrialParamByFeatureAsBoolean( - ChromeFeatureList.CONTEXTUAL_PAGE_ACTIONS, "action_chip", true); + ChromeFeatureList.CONTEXTUAL_PAGE_ACTIONS, "action_chip", false); } /**
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarControlContainerTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarControlContainerTest.java index 73f2238e..eb4b7b42 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarControlContainerTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarControlContainerTest.java
@@ -20,6 +20,7 @@ import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.UmaRecorderHolder; import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.base.test.util.DisabledTest; import org.chromium.chrome.browser.toolbar.top.CaptureReadinessResult.TopToolbarAllowCaptureReason; import org.chromium.chrome.browser.toolbar.top.CaptureReadinessResult.TopToolbarBlockCaptureReason; import org.chromium.chrome.browser.toolbar.top.ToolbarControlContainer.ToolbarViewResourceAdapter; @@ -45,6 +46,7 @@ } @Test + @DisabledTest(message = "Temporarily disabled due to https://crbug.com/1344612") public void testIsDirty() { ToolbarViewResourceAdapter adapter = new ToolbarViewResourceAdapter(mToolbarContainer, false);
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java index a7bdba7e..55e6610c 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java
@@ -70,6 +70,10 @@ @SuppressLint("Instantiatable") public class ToolbarTablet extends ToolbarLayout implements OnClickListener, View.OnLongClickListener { + @VisibleForTesting + static final BooleanCachedFieldTrialParameter GTS_ENABLE_LAUNCH_POLISH = + new BooleanCachedFieldTrialParameter( + ChromeFeatureList.GRID_TAB_SWITCHER_FOR_TABLETS, "enable_launch_polish", false); private ObjectAnimator mTabSwitcherModeAnimation; /** @@ -840,9 +844,7 @@ } private boolean isTabletGridTabSwitcherPolishEnabled() { - return new BooleanCachedFieldTrialParameter( - ChromeFeatureList.GRID_TAB_SWITCHER_FOR_TABLETS, "enable_launch_polish", false) - .getValue(); + return GTS_ENABLE_LAUNCH_POLISH.getValue(); } @VisibleForTesting
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTabletUnitTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTabletUnitTest.java index 4785147..f304b99 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTabletUnitTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTabletUnitTest.java
@@ -17,7 +17,6 @@ import android.view.View; import android.widget.ImageButton; -import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -30,7 +29,6 @@ import org.robolectric.annotation.LooperMode; import org.robolectric.shadows.ShadowToast; -import org.chromium.base.FeatureList; import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.chrome.R; import org.chromium.chrome.browser.flags.ChromeFeatureList; @@ -80,11 +78,7 @@ LocationBarLayout locationBarLayout = mToolbarTablet.findViewById(R.id.location_bar); locationBarLayout.setStatusCoordinatorForTesting(mStatusCoordinator); mToolbarTablet.setMenuButtonCoordinatorForTesting(mMenuButtonCoordinator); - } - - @After - public void tearDown() { - disableGridTabSwitcher(); + ToolbarTablet.GTS_ENABLE_LAUNCH_POLISH.setForTesting(false); } @Test @@ -180,7 +174,7 @@ @EnableFeatures(ChromeFeatureList.GRID_TAB_SWITCHER_FOR_TABLETS) @Test public void testSetTabSwitcherPolishModeOff_toolbarStillVisible() { - enableGridTabSwitcher(true); + ToolbarTablet.GTS_ENABLE_LAUNCH_POLISH.setForTesting(true); assertEquals("Initial Toolbar visibility is not as expected", View.VISIBLE, mToolbarTablet.getVisibility()); // Call @@ -193,7 +187,7 @@ @EnableFeatures(ChromeFeatureList.GRID_TAB_SWITCHER_FOR_TABLETS) @Test public void testSetTabSwitcherPolishModeOn_toolbarStillVisible() { - enableGridTabSwitcher(true); + ToolbarTablet.GTS_ENABLE_LAUNCH_POLISH.setForTesting(true); assertEquals("Initial Toolbar visibility is not as expected", View.VISIBLE, mToolbarTablet.getVisibility()); // Call @@ -287,18 +281,4 @@ ShadowToast.showedCustomToast( mActivity.getResources().getString(stringId), R.id.toast_text)); } - - private void enableGridTabSwitcher(boolean enablePolish) { - FeatureList.TestValues testValues = new FeatureList.TestValues(); - testValues.addFeatureFlagOverride(ChromeFeatureList.GRID_TAB_SWITCHER_FOR_TABLETS, true); - testValues.addFieldTrialParamOverride(ChromeFeatureList.GRID_TAB_SWITCHER_FOR_TABLETS, - "enable_launch_polish", String.valueOf(enablePolish)); - FeatureList.setTestValues(testValues); - } - - private void disableGridTabSwitcher() { - FeatureList.TestValues testValues = new FeatureList.TestValues(); - testValues.addFeatureFlagOverride(ChromeFeatureList.GRID_TAB_SWITCHER_FOR_TABLETS, false); - FeatureList.setTestValues(testValues); - } }
diff --git a/chrome/browser/ui/app_list/search/help_app_provider.cc b/chrome/browser/ui/app_list/search/help_app_provider.cc index 95e9d989..56361e2 100644 --- a/chrome/browser/ui/app_list/search/help_app_provider.cc +++ b/chrome/browser/ui/app_list/search/help_app_provider.cc
@@ -29,7 +29,7 @@ #include "chrome/browser/web_applications/web_app_id_constants.h" #include "chrome/grit/generated_resources.h" #include "chromeos/strings/grit/chromeos_strings.h" -#include "components/services/app_service/public/cpp/app_registry_cache.h" +#include "components/services/app_service/public/cpp/app_launch_util.h" #include "components/services/app_service/public/cpp/app_types.h" #include "ui/base/l10n/l10n_util.h" #include "ui/gfx/image/image_skia.h" @@ -93,10 +93,10 @@ // Launch list result. ash::SystemAppLaunchParams params; params.url = GURL(ash::kChromeUIHelpAppURL + url_path_); - params.launch_source = apps::mojom::LaunchSource::kFromAppListQuery; + params.launch_source = apps::LaunchSource::kFromAppListQuery; ash::LaunchSystemWebAppAsync( profile_, ash::SystemWebAppType::HELP, params, - apps::MakeWindowInfo(display::kDefaultDisplayId)); + std::make_unique<apps::WindowInfo>(display::kDefaultDisplayId)); // This is a google-internal histogram. If changing this, also change the // corresponding histograms file. base::UmaHistogramSparse("Discover.LauncherSearch.ContentLaunched",
diff --git a/chrome/browser/ui/app_list/search/help_app_provider.h b/chrome/browser/ui/app_list/search/help_app_provider.h index 3da7a7d..c398fbf 100644 --- a/chrome/browser/ui/app_list/search/help_app_provider.h +++ b/chrome/browser/ui/app_list/search/help_app_provider.h
@@ -16,7 +16,6 @@ #include "chrome/browser/ui/app_list/search/search_provider.h" #include "components/services/app_service/public/cpp/app_registry_cache.h" #include "components/services/app_service/public/cpp/icon_types.h" -#include "components/services/app_service/public/mojom/types.mojom.h" #include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/remote.h"
diff --git a/chrome/browser/ui/app_list/search/help_app_zero_state_provider.cc b/chrome/browser/ui/app_list/search/help_app_zero_state_provider.cc index 2d574ae..827e6bf 100644 --- a/chrome/browser/ui/app_list/search/help_app_zero_state_provider.cc +++ b/chrome/browser/ui/app_list/search/help_app_zero_state_provider.cc
@@ -28,6 +28,7 @@ #include "chrome/grit/generated_resources.h" #include "chromeos/strings/grit/chromeos_strings.h" #include "components/prefs/pref_service.h" +#include "components/services/app_service/public/cpp/app_launch_util.h" #include "components/services/app_service/public/cpp/app_registry_cache.h" #include "components/services/app_service/public/cpp/app_types.h" #include "ui/base/l10n/l10n_util.h" @@ -111,11 +112,10 @@ // Launch discover tab suggestion chip. ash::SystemAppLaunchParams params; params.url = GURL("chrome://help-app/discover"); - params.launch_source = - apps::mojom::LaunchSource::kFromAppListRecommendation; + params.launch_source = apps::LaunchSource::kFromAppListRecommendation; ash::LaunchSystemWebAppAsync( profile_, ash::SystemWebAppType::HELP, params, - apps::MakeWindowInfo(display::kDefaultDisplayId)); + std::make_unique<apps::WindowInfo>(display::kDefaultDisplayId)); StopShowingDiscoverTabSuggestionChip(profile_); } else if (id() == kHelpAppUpdatesResult) { @@ -125,11 +125,10 @@ ash::SystemAppLaunchParams params; params.url = GURL("chrome://help-app/updates"); - params.launch_source = - apps::mojom::LaunchSource::kFromAppListRecommendation; + params.launch_source = apps::LaunchSource::kFromAppListRecommendation; ash::LaunchSystemWebAppAsync( profile_, ash::SystemWebAppType::HELP, params, - apps::MakeWindowInfo(display::kDefaultDisplayId)); + std::make_unique<apps::WindowInfo>(display::kDefaultDisplayId)); ash::ReleaseNotesStorage(profile_).StopShowingSuggestionChip(); }
diff --git a/chrome/browser/ui/ash/capture_mode/chrome_capture_mode_delegate.cc b/chrome/browser/ui/ash/capture_mode/chrome_capture_mode_delegate.cc index fbd108f..1693cf7 100644 --- a/chrome/browser/ui/ash/capture_mode/chrome_capture_mode_delegate.cc +++ b/chrome/browser/ui/ash/capture_mode/chrome_capture_mode_delegate.cc
@@ -31,6 +31,7 @@ #include "chromeos/login/login_state/login_state.h" #include "components/drive/file_errors.h" #include "components/prefs/pref_service.h" +#include "components/services/app_service/public/cpp/app_launch_util.h" #include "content/public/browser/audio_service.h" #include "content/public/browser/download_manager.h" #include "content/public/browser/service_process_host.h" @@ -124,7 +125,7 @@ ash::SystemAppLaunchParams params; params.launch_paths = {file_path}; - params.launch_source = apps::mojom::LaunchSource::kFromFileManager; + params.launch_source = apps::LaunchSource::kFromFileManager; ash::LaunchSystemWebAppAsync(profile, ash::SystemWebAppType::MEDIA, params); }
diff --git a/chrome/browser/ui/ash/shelf/chrome_shelf_prefs.cc b/chrome/browser/ui/ash/shelf/chrome_shelf_prefs.cc index c1456df..0d458ae 100644 --- a/chrome/browser/ui/ash/shelf/chrome_shelf_prefs.cc +++ b/chrome/browser/ui/ash/shelf/chrome_shelf_prefs.cc
@@ -35,7 +35,7 @@ #include "chrome/browser/ash/file_manager/prefs_migration_uma.h" #include "chrome/browser/ash/login/demo_mode/demo_session.h" #include "chrome/browser/ash/profiles/profile_helper.h" -#include "chrome/browser/extensions/extension_keeplist_ash.h" +#include "chrome/browser/extensions/extension_keeplist_chromeos.h" #include "chrome/browser/prefs/pref_service_syncable_util.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sync/sync_service_factory.h" @@ -730,7 +730,7 @@ } bool ChromeShelfPrefs::IsAshKeepListApp(const std::string& app_id) { - return extensions::ExtensionAppRunsInAsh(app_id); + return extensions::ExtensionAppRunsInOS(app_id); } std::string ChromeShelfPrefs::GetShelfId(const std::string& sync_id) { @@ -756,7 +756,7 @@ // If this app is on the ash keep list, immediately return it. Even if there's // a lacros chrome app that matches this id, we still want to use the ash // version. - if (extensions::ExtensionAppRunsInAsh(sync_id)) + if (extensions::ExtensionAppRunsInOS(sync_id)) return sync_id; // All the muxing code can be removed once Ash is past M104.
diff --git a/chrome/browser/ui/ash/system_tray_client_impl.cc b/chrome/browser/ui/ash/system_tray_client_impl.cc index f3e04ea..f4d97299 100644 --- a/chrome/browser/ui/ash/system_tray_client_impl.cc +++ b/chrome/browser/ui/ash/system_tray_client_impl.cc
@@ -67,6 +67,7 @@ #include "chromeos/ash/components/network/onc/network_onc_utils.h" #include "chromeos/ash/components/network/tether_constants.h" #include "chromeos/network/network_util.h" +#include "components/services/app_service/public/cpp/app_launch_util.h" #include "components/session_manager/core/session_manager.h" #include "components/session_manager/core/session_manager_observer.h" #include "components/user_manager/user_manager.h" @@ -507,7 +508,7 @@ ash::SystemAppLaunchParams params; params.url = GURL(chrome::kChromeOSGestureEducationHelpURL); - params.launch_source = apps::mojom::LaunchSource::kFromOtherApp; + params.launch_source = apps::LaunchSource::kFromOtherApp; ash::LaunchSystemWebAppAsync(profile, ash::SystemWebAppType::HELP, params); }
diff --git a/chrome/browser/ui/ash/system_web_apps/system_web_app_ui_utils.cc b/chrome/browser/ui/ash/system_web_apps/system_web_app_ui_utils.cc index 394f31d..417b765 100644 --- a/chrome/browser/ui/ash/system_web_apps/system_web_app_ui_utils.cc +++ b/chrome/browser/ui/ash/system_web_apps/system_web_app_ui_utils.cc
@@ -126,7 +126,7 @@ void LaunchSystemWebAppAsync(Profile* profile, const SystemWebAppType type, const SystemAppLaunchParams& params, - apps::mojom::WindowInfoPtr window_info) { + apps::WindowInfoPtr window_info) { DCHECK(profile); // Terminal should be launched with crostini::LaunchTerminal*. DCHECK(type != SystemWebAppType::TERMINAL); @@ -167,20 +167,25 @@ DCHECK(!params.url.has_value()) << "Launch URL can't be used with launch_paths."; app_service->LaunchAppWithFiles( - *app_id, event_flags, params.launch_source, + *app_id, event_flags, + apps::ConvertLaunchSourceToMojomLaunchSource(params.launch_source), apps::mojom::FilePaths::New(params.launch_paths)); return; } if (params.url) { DCHECK(params.url->is_valid()); - app_service->LaunchAppWithUrl(*app_id, event_flags, *params.url, - params.launch_source, std::move(window_info)); + app_service->LaunchAppWithUrl( + *app_id, event_flags, *params.url, + apps::ConvertLaunchSourceToMojomLaunchSource(params.launch_source), + apps::ConvertWindowInfoToMojomWindowInfo(window_info)); return; } - app_service->Launch(*app_id, event_flags, params.launch_source, - std::move(window_info)); + app_service->Launch( + *app_id, event_flags, + apps::ConvertLaunchSourceToMojomLaunchSource(params.launch_source), + apps::ConvertWindowInfoToMojomWindowInfo(window_info)); } Browser* LaunchSystemWebAppImpl(Profile* profile,
diff --git a/chrome/browser/ui/ash/system_web_apps/system_web_app_ui_utils.h b/chrome/browser/ui/ash/system_web_apps/system_web_app_ui_utils.h index 418f508..895ae57 100644 --- a/chrome/browser/ui/ash/system_web_apps/system_web_app_ui_utils.h +++ b/chrome/browser/ui/ash/system_web_apps/system_web_app_ui_utils.h
@@ -12,8 +12,7 @@ #include "chrome/browser/ash/system_web_apps/types/system_web_app_type.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/web_applications/web_app_id.h" -#include "components/services/app_service/public/mojom/types.mojom-shared.h" -#include "components/services/app_service/public/mojom/types.mojom.h" +#include "components/services/app_service/public/cpp/app_launch_util.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "url/gurl.h" @@ -49,8 +48,7 @@ absl::optional<GURL> url; // Where the app is launched from. - apps::mojom::LaunchSource launch_source = - apps::mojom::LaunchSource::kFromChromeInternal; + apps::LaunchSource launch_source = apps::LaunchSource::kFromChromeInternal; // If non-empty, specifies files passed to Web File Handling. Apps need to // have "FileHandling" origin trial in its SystemAppInfo, and file handlers @@ -78,7 +76,7 @@ Profile* profile, SystemWebAppType type, const SystemAppLaunchParams& params = SystemAppLaunchParams(), - apps::mojom::WindowInfoPtr window_info = nullptr); + apps::WindowInfoPtr window_info = nullptr); // When this method returns, it makes sure all previous LaunchSystemWebAppAsync // calls on |profile| are processed (i.e. LaunchSystemWebAppImpl finishes
diff --git a/chrome/browser/ui/ash/wallpaper_controller_client_impl.cc b/chrome/browser/ui/ash/wallpaper_controller_client_impl.cc index d7c806c..8c0aff9 100644 --- a/chrome/browser/ui/ash/wallpaper_controller_client_impl.cc +++ b/chrome/browser/ui/ash/wallpaper_controller_client_impl.cc
@@ -57,6 +57,7 @@ #include "chrome/common/pref_names.h" #include "components/account_id/account_id.h" #include "components/prefs/pref_service.h" +#include "components/services/app_service/public/cpp/app_launch_util.h" #include "components/services/app_service/public/cpp/app_types.h" #include "components/session_manager/core/session_manager.h" #include "components/signin/public/identity_manager/access_token_info.h" @@ -634,7 +635,7 @@ params.url = GURL( std::string(ash::personalization_app::kChromeUIPersonalizationAppURL) + ash::personalization_app::kWallpaperSubpageRelativeUrl); - params.launch_source = apps::mojom::LaunchSource::kFromShelf; + params.launch_source = apps::LaunchSource::kFromShelf; ash::LaunchSystemWebAppAsync(profile, ash::SystemWebAppType::PERSONALIZATION, params); }
diff --git a/chrome/browser/ui/chrome_pages.cc b/chrome/browser/ui/chrome_pages.cc index d7b2a6c..c72b125 100644 --- a/chrome/browser/ui/chrome_pages.cc +++ b/chrome/browser/ui/chrome_pages.cc
@@ -41,6 +41,7 @@ #include "chromeos/login/login_state/login_state.h" #include "components/bookmarks/browser/bookmark_model.h" #include "components/bookmarks/browser/bookmark_node.h" +#include "components/services/app_service/public/cpp/app_launch_util.h" #include "components/signin/public/base/consent_level.h" #include "content/public/browser/web_contents.h" #include "extensions/browser/extension_prefs.h" @@ -231,7 +232,7 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) void ShowSystemAppInternal(Profile* profile, const ash::SystemWebAppType type) { ash::SystemAppLaunchParams params; - params.launch_source = apps::mojom::LaunchSource::kUnknown; + params.launch_source = apps::LaunchSource::kUnknown; ash::LaunchSystemWebAppAsync(profile, type, params); } #elif BUILDFLAG(IS_CHROMEOS_LACROS)
diff --git a/chrome/browser/ui/settings_window_manager_chromeos.cc b/chrome/browser/ui/settings_window_manager_chromeos.cc index 55092a38..bdea178 100644 --- a/chrome/browser/ui/settings_window_manager_chromeos.cc +++ b/chrome/browser/ui/settings_window_manager_chromeos.cc
@@ -23,6 +23,7 @@ #include "chrome/browser/ui/web_applications/app_browser_controller.h" #include "chrome/browser/web_applications/web_app_utils.h" #include "chrome/common/webui_url_constants.h" +#include "components/services/app_service/public/cpp/app_launch_util.h" #include "content/public/browser/web_contents.h" #include "ui/aura/client/aura_constants.h" #include "url/gurl.h" @@ -94,8 +95,9 @@ if (!UseDeprecatedSettingsWindow(profile)) { ash::SystemAppLaunchParams params; params.url = gurl; - ash::LaunchSystemWebAppAsync(profile, ash::SystemWebAppType::SETTINGS, - params, apps::MakeWindowInfo(display_id)); + ash::LaunchSystemWebAppAsync( + profile, ash::SystemWebAppType::SETTINGS, params, + std::make_unique<apps::WindowInfo>(display_id)); // SWA OS Settings don't use SettingsWindowManager to manage windows, don't // notify SettingsWindowObservers. return;
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.cc index 1496927..a7580bc 100644 --- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.cc +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.cc
@@ -20,9 +20,7 @@ } ReadAnythingController::~ReadAnythingController() { - DCHECK(browser_); - if (browser_->tab_strip_model()) - browser_->tab_strip_model()->RemoveObserver(this); + TabStripModelObserver::StopObservingAll(this); WebContentsObserver::Observe(nullptr); } @@ -67,6 +65,15 @@ DistillAXTree(); } +void ReadAnythingController::OnTabStripModelDestroyed( + TabStripModel* tab_strip_model) { + // If the TabStripModel is destroyed before |this|, remove |this| as an + // observer and set |browser_| to nullptr. + DCHECK(browser_); + tab_strip_model->RemoveObserver(this); + browser_ = nullptr; +} + void ReadAnythingController::DidStopLoading() { DistillAXTree(); }
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.h b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.h index f047f83..76096d6 100644 --- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.h +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.h
@@ -50,6 +50,8 @@ bool IsActiveForTesting() { return active_; } private: + friend class ReadAnythingControllerTest; + // ReadAnythingToolbarView::Delegate: void OnFontSizeChanged(bool increase) override; @@ -65,6 +67,7 @@ TabStripModel* tab_strip_model, const TabStripModelChange& change, const TabStripSelectionChange& selection) override; + void OnTabStripModelDestroyed(TabStripModel* tab_strip_model) override; // content::WebContentsObserver: void DidStopLoading() override;
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller_unittest.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller_unittest.cc new file mode 100644 index 0000000..06bfc48d --- /dev/null +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller_unittest.cc
@@ -0,0 +1,103 @@ +// 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/ui/views/side_panel/read_anything/read_anything_controller.h" + +#include "base/test/gtest_util.h" +#include "chrome/browser/ui/views/frame/test_with_browser_view.h" +#include "chrome/browser/ui/views/side_panel/read_anything/read_anything_constants.h" +#include "chrome/browser/ui/views/side_panel/read_anything/read_anything_model.h" +#include "chrome/browser/ui/webui/side_panel/read_anything/read_anything_prefs.h" +#include "testing/gmock/include/gmock/gmock.h" + +class ReadAnythingControllerTest : public TestWithBrowserView { + public: + void SetUp() override { + TestWithBrowserView::SetUp(); + + model_ = std::make_unique<ReadAnythingModel>(); + controller_ = + std::make_unique<ReadAnythingController>(model_.get(), browser()); + + // Reset prefs to default values for test. + browser()->profile()->GetPrefs()->SetString( + prefs::kAccessibilityReadAnythingFontName, + kReadAnythingDefaultFontName); + browser()->profile()->GetPrefs()->SetDouble( + prefs::kAccessibilityReadAnythingFontScale, + kReadAnythingDefaultFontScale); + } + + void MockOnFontChoiceChanged(int index) { + controller_->OnFontChoiceChanged(index); + } + + void MockOnFontSizeChanged(bool increase) { + controller_->OnFontSizeChanged(increase); + } + + void MockModelInit(std::string font_name, double font_scale) { + model_->Init(font_name, font_scale); + } + + std::string GetPrefFontName() { + return browser()->profile()->GetPrefs()->GetString( + prefs::kAccessibilityReadAnythingFontName); + } + + double GetPrefFontScale() { + return browser()->profile()->GetPrefs()->GetDouble( + prefs::kAccessibilityReadAnythingFontScale); + } + + protected: + std::unique_ptr<ReadAnythingModel> model_; + std::unique_ptr<ReadAnythingController> controller_; +}; + +TEST_F(ReadAnythingControllerTest, ValidIndexUpdatesFontNamePref) { + std::string expected_font_name = "Arial"; + + MockOnFontChoiceChanged(3); + + EXPECT_EQ(expected_font_name, GetPrefFontName()); +} + +TEST_F(ReadAnythingControllerTest, OnFontSizeChangedIncreaseUpdatesPref) { + EXPECT_NEAR(GetPrefFontScale(), 1.0, 0.01); + + MockOnFontSizeChanged(true); + + EXPECT_NEAR(GetPrefFontScale(), 1.2, 0.01); +} + +TEST_F(ReadAnythingControllerTest, OnFontSizeChangedDecreasePref) { + EXPECT_NEAR(GetPrefFontScale(), 1.0, 0.01); + + MockOnFontSizeChanged(false); + + EXPECT_NEAR(GetPrefFontScale(), 0.8, 0.01); +} + +TEST_F(ReadAnythingControllerTest, OnFontSizeChangedHonorsMax) { + EXPECT_NEAR(GetPrefFontScale(), 1.0, 0.01); + + std::string font_name; + MockModelInit(font_name, 4.9); + + MockOnFontSizeChanged(true); + + EXPECT_NEAR(GetPrefFontScale(), 5.0, 0.01); +} + +TEST_F(ReadAnythingControllerTest, OnFontSizeChangedHonorsMin) { + EXPECT_NEAR(GetPrefFontScale(), 1.0, 0.01); + + std::string font_name; + MockModelInit(font_name, 0.3); + + MockOnFontSizeChanged(false); + + EXPECT_NEAR(GetPrefFontScale(), 0.2, 0.01); +}
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model_unittest.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model_unittest.cc index c65d2ff4..b65d1dc1 100644 --- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model_unittest.cc +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model_unittest.cc
@@ -7,6 +7,7 @@ #include <vector> #include "base/feature_list.h" +#include "build/build_config.h" #include "chrome/browser/ui/ui_features.h" #include "chrome/browser/ui/views/frame/test_with_browser_view.h" #include "testing/gmock/include/gmock/gmock.h" @@ -54,6 +55,10 @@ MockReadAnythingModelObserver model_observer_3_; }; +// TODO(crbug.com/1344891): Fix the memory leak on destruction observed on these +// tests on asan mac. +#if !BUILDFLAG(IS_MAC) || !defined(ADDRESS_SANITIZER) + TEST_F(ReadAnythingModelTest, AddingModelObserverNotifiesAllObservers) { model_->AddObserver(&model_observer_1_); @@ -166,3 +171,5 @@ EXPECT_EQ("Webdings", GetFontModel()->GetFontNameAt(7)); EXPECT_EQ("Impact", GetFontModel()->GetFontNameAt(8)); } + +#endif // !defined(ADDRESS_SANITIZER)
diff --git a/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc b/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc index c38eef3..7aa7365 100644 --- a/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc +++ b/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc
@@ -292,8 +292,10 @@ base::Value::Dict capabilities; base::Value::Dict cdd = ValidateCddForPrintPreview(std::move(capability)); // Leave |capabilities| empty if |cdd| is empty. - if (!cdd.empty()) - capabilities.Set(kSettingCapabilities, std::move(cdd)); + if (!cdd.empty()) { + capabilities.Set(kSettingCapabilities, + UpdateCddWithDpiIfMissing(std::move(cdd))); + } std::move(callback).Run(std::move(capabilities)); }
diff --git a/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc b/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc index e9c4bd09..e19dcd57 100644 --- a/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc +++ b/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc
@@ -644,11 +644,26 @@ base::test::ParseJson(kPWGRasterOnlyPrinterSimpleDescription); ASSERT_TRUE(original_capability.is_dict()); + // TODO(thestig): Consolidate constants used in this section. + base::Value::Dict original_capability_with_dpi_dict = + original_capability.GetDict().Clone(); + base::Value::Dict* printer = + original_capability_with_dpi_dict.FindDict("printer"); + ASSERT_TRUE(printer); + base::Value::Dict default_dpi_option; + default_dpi_option.Set("horizontal_dpi", kDefaultPdfDpi); + default_dpi_option.Set("vertical_dpi", kDefaultPdfDpi); + base::Value::List dpi_list; + dpi_list.Append(std::move(default_dpi_option)); + base::Value::Dict dpi_dict; + dpi_dict.Set("option", std::move(dpi_list)); + printer->Set("dpi", std::move(dpi_dict)); + fake_api->TriggerNextGetCapabilityCallback( - original_capability.GetDict().Clone()); + std::move(original_capability.GetDict())); EXPECT_EQ(1u, call_count); - EXPECT_EQ(capability, original_capability.GetDict()); + EXPECT_EQ(capability, original_capability_with_dpi_dict); } TEST_F(ExtensionPrinterHandlerTest, GetCapability_Reset) {
diff --git a/chrome/browser/ui/webui/print_preview/fake_print_render_frame.cc b/chrome/browser/ui/webui/print_preview/fake_print_render_frame.cc index b2bd74f..f3c3f85 100644 --- a/chrome/browser/ui/webui/print_preview/fake_print_render_frame.cc +++ b/chrome/browser/ui/webui/print_preview/fake_print_render_frame.cc
@@ -23,7 +23,8 @@ void FakePrintRenderFrame::PrintRequestedPages() {} -void FakePrintRenderFrame::PrintWithParams(mojom::PrintPagesParamsPtr params) { +void FakePrintRenderFrame::PrintWithParams(mojom::PrintPagesParamsPtr params, + PrintWithParamsCallback callback) { NOTREACHED(); }
diff --git a/chrome/browser/ui/webui/print_preview/fake_print_render_frame.h b/chrome/browser/ui/webui/print_preview/fake_print_render_frame.h index 42f9f296..0e788384 100644 --- a/chrome/browser/ui/webui/print_preview/fake_print_render_frame.h +++ b/chrome/browser/ui/webui/print_preview/fake_print_render_frame.h
@@ -26,7 +26,8 @@ private: // printing::mojom::PrintRenderFrame: void PrintRequestedPages() override; - void PrintWithParams(mojom::PrintPagesParamsPtr params) override; + void PrintWithParams(mojom::PrintPagesParamsPtr params, + PrintWithParamsCallback callback) override; void PrintForSystemDialog() override; void SetPrintPreviewUI( mojo::PendingAssociatedRemote<mojom::PrintPreviewUI> preview) override;
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_utils.cc b/chrome/browser/ui/webui/print_preview/print_preview_utils.cc index 5dcfca3..1dab6c7 100644 --- a/chrome/browser/ui/webui/print_preview/print_preview_utils.cc +++ b/chrome/browser/ui/webui/print_preview/print_preview_utils.cc
@@ -28,6 +28,7 @@ #include "printing/backend/print_backend_consts.h" #include "printing/page_range.h" #include "printing/print_job_constants.h" +#include "printing/units.h" namespace printing { @@ -199,6 +200,24 @@ return cdd; } +base::Value::Dict UpdateCddWithDpiIfMissing(base::Value::Dict cdd) { + base::Value::Dict* printer = cdd.FindDict(kPrinter); + if (!printer) + return cdd; + + if (!printer->FindDict(kDpiCapabilityKey)) { + base::Value::Dict default_dpi; + default_dpi.Set(kHorizontalDpi, kDefaultPdfDpi); + default_dpi.Set(kVerticalDpi, kDefaultPdfDpi); + base::Value::List dpi_options; + dpi_options.Append(std::move(default_dpi)); + base::Value::Dict dpi_capability; + dpi_capability.Set(kOptionKey, std::move(dpi_options)); + printer->Set(kDpiCapabilityKey, std::move(dpi_capability)); + } + return cdd; +} + void ConvertPrinterListForCallback( PrinterHandler::AddedPrintersCallback callback, PrinterHandler::GetPrintersDoneCallback done_callback,
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_utils.h b/chrome/browser/ui/webui/print_preview/print_preview_utils.h index 3c0f08a..6200664d 100644 --- a/chrome/browser/ui/webui/print_preview/print_preview_utils.h +++ b/chrome/browser/ui/webui/print_preview/print_preview_utils.h
@@ -26,14 +26,14 @@ extern const char kTypeKey[]; extern const char kVendorCapabilityKey[]; -// Converts |printer_list| to a base::Value::List form, runs |callback| with the -// converted list as the argument if it is not empty, and runs |done_callback|. +// Converts `printer_list` to a base::Value::List form, runs `callback` with the +// converted list as the argument if it is not empty, and runs `done_callback`. void ConvertPrinterListForCallback( PrinterHandler::AddedPrintersCallback callback, PrinterHandler::GetPrintersDoneCallback done_callback, const PrinterList& printer_list); -// Returns a sanitized version of |cdd| to prevent possible JS +// Returns a sanitized version of `cdd` to prevent possible JS // errors in Print Preview. Will remove null items from lists or options lists // and remove any lists/options that are empty or only contain null values. // Will also check some CDD entries to make sure the input conforms to the @@ -41,14 +41,22 @@ // On failure, returns an empty dict. base::Value::Dict ValidateCddForPrintPreview(base::Value::Dict cdd); -// Starts a local print of |print_data| with print settings dictionary -// |job_settings|. Runs |callback| on failure or success. +// Returns an updated version of `cdd` and ensures it has a valid value for the +// DPI capability. Uses the existing validated value if it exists, or fills in a +// reasonable default if the capability is missing. Having a DPI is not required +// in the CDD, but it is crucial for performing page setup. +// +// Assumes `cdd` is the output from ValidateCddForPrintPreview(). +base::Value::Dict UpdateCddWithDpiIfMissing(base::Value::Dict cdd); + +// Starts a local print of `print_data` with print settings dictionary +// `job_settings`. Runs `callback` on failure or success. void StartLocalPrint(base::Value::Dict job_settings, scoped_refptr<base::RefCountedMemory> print_data, content::WebContents* preview_web_contents, PrinterHandler::PrintCallback callback); -// Parses print job settings. Returns |true| on success. +// Parses print job settings. Returns `true` on success. // This is used by extension printers. bool ParseSettings(const base::Value::Dict& settings, std::string* out_destination_id,
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_utils_unittest.cc b/chrome/browser/ui/webui/print_preview/print_preview_utils_unittest.cc index 56b7a6f..2b26fa0e 100644 --- a/chrome/browser/ui/webui/print_preview/print_preview_utils_unittest.cc +++ b/chrome/browser/ui/webui/print_preview/print_preview_utils_unittest.cc
@@ -439,4 +439,60 @@ EXPECT_FALSE(GetDpiResetToDefault(std::move(cdd_out))); } +TEST_F(PrintPreviewUtilsTest, AddMissingDpi) { + // Set up the test expectation to have only the 300 DPI setting, which is the + // default DPI setting. + base::Value::Dict printer = GetCapabilitiesFull(); + base::Value::Dict* dpi_dict = printer.FindDict(kDpi); + ASSERT_TRUE(dpi_dict); + base::Value::List* dpi_list = dpi_dict->FindList(kOptionKey); + ASSERT_TRUE(dpi_list); + ASSERT_EQ(2u, dpi_list->size()); + dpi_list->erase(dpi_list->begin() + 1); + ASSERT_EQ(1u, dpi_list->size()); + ASSERT_EQ( + base::test::ParseJson("{\"horizontal_dpi\": 300, \"vertical_dpi\": 300}"), + (*dpi_list)[0]); + + // Initialize `cdd` but clear the DPI list. + base::Value::Dict cdd; + base::Value::Dict& cdd_printer = + cdd.Set(kPrinter, printer.Clone())->GetDict(); + base::Value::Dict* cdd_printer_dpi_dict = cdd_printer.FindDict(kDpi); + ASSERT_TRUE(cdd_printer_dpi_dict); + base::Value::List* cdd_printer_dpi_list = + cdd_printer_dpi_dict->FindList(kOptionKey); + ASSERT_TRUE(cdd_printer_dpi_list); + cdd_printer_dpi_list->clear(); + + // ValidateCddForPrintPreview() should delete the `kDpi` key altogether, since + // the associated value was an empty list. + auto cdd_out = ValidateCddForPrintPreview(std::move(cdd)); + const base::Value::Dict* cdd_out_printer = cdd_out.FindDict(kPrinter); + ASSERT_TRUE(cdd_out_printer); + EXPECT_FALSE(cdd_out_printer->FindDict(kDpi)); + + // Update `cdd_out` with the default value for this required capability. Then + // `cdd_out` will pass validation. + ValidatePrinter(UpdateCddWithDpiIfMissing(std::move(cdd_out)), printer); +} + +TEST_F(PrintPreviewUtilsTest, ExistingValidDpiCapabilityDoesNotChange) { + // Ensure the test expectation has multiple DPIs. + const base::Value::Dict printer = GetCapabilitiesFull(); + const base::Value::Dict* dpi_dict = printer.FindDict(kDpi); + ASSERT_TRUE(dpi_dict); + const base::Value::List* dpi_list = dpi_dict->FindList(kOptionKey); + ASSERT_TRUE(dpi_list); + ASSERT_EQ(2u, dpi_list->size()); + + // Initialize `cdd`, which is perfectly valid. It should pass through + // ValidateCddForPrintPreview() and UpdateCddWithDpiIfMissing() without any + // changes. + base::Value::Dict cdd; + cdd.Set(kPrinter, printer.Clone()); + auto cdd_out = ValidateCddForPrintPreview(std::move(cdd)); + ValidatePrinter(UpdateCddWithDpiIfMissing(std::move(cdd_out)), printer); +} + } // namespace printing
diff --git a/chrome/browser/ui/webui/settings/chromeos/about_section.cc b/chrome/browser/ui/webui/settings/chromeos/about_section.cc index caaf1d2..79cd42e 100644 --- a/chrome/browser/ui/webui/settings/chromeos/about_section.cc +++ b/chrome/browser/ui/webui/settings/chromeos/about_section.cc
@@ -245,6 +245,7 @@ {"aboutProductLogoAlt", IDS_SHORT_PRODUCT_LOGO_ALT_TEXT}, #if BUILDFLAG(GOOGLE_CHROME_BRANDING) {"aboutReportAnIssue", IDS_SETTINGS_ABOUT_PAGE_REPORT_AN_ISSUE}, + {"aboutSendFeedback", IDS_SETTINGS_ABOUT_PAGE_SEND_FEEDBACK}, #endif {"aboutDiagnostics", IDS_SETTINGS_ABOUT_PAGE_DIAGNOSTICS}, {"aboutFirmwareUpdates", IDS_SETTINGS_ABOUT_PAGE_FIRMWARE_UPDATES}, @@ -463,6 +464,10 @@ "isFirmwareUpdaterAppEnabled", base::FeatureList::IsEnabled(chromeos::features::kFirmwareUpdaterApp)); + html_source->AddBoolean( + "isOsFeedbackEnabled", + base::FeatureList::IsEnabled(chromeos::features::kOsFeedback)); + #if BUILDFLAG(GOOGLE_CHROME_BRANDING) html_source->AddString("aboutTermsURL", chrome::kChromeUITermsURL); html_source->AddLocalizedString("aboutProductTos",
diff --git a/chrome/browser/ui/webui/tab_search/tab_search_ui.cc b/chrome/browser/ui/webui/tab_search/tab_search_ui.cc index 2931585..97f1637 100644 --- a/chrome/browser/ui/webui/tab_search/tab_search_ui.cc +++ b/chrome/browser/ui/webui/tab_search/tab_search_ui.cc
@@ -57,6 +57,8 @@ {"mediaRecording", IDS_TAB_AX_LABEL_MEDIA_RECORDING_FORMAT}, {"audioMuting", IDS_TAB_AX_LABEL_AUDIO_MUTING_FORMAT}, {"audioPlaying", IDS_TAB_AX_LABEL_AUDIO_PLAYING_FORMAT}, + {"expandRecentlyClosed", IDS_TAB_SEARCH_EXPAND_RECENTLY_CLOSED}, + {"collapseRecentlyClosed", IDS_TAB_SEARCH_COLLAPSE_RECENTLY_CLOSED}, }; source->AddLocalizedStrings(kStrings);
diff --git a/chrome/browser/usb/usb_policy_allowed_devices.cc b/chrome/browser/usb/usb_policy_allowed_devices.cc index be9dec6..7580e67 100644 --- a/chrome/browser/usb/usb_policy_allowed_devices.cc +++ b/chrome/browser/usb/usb_policy_allowed_devices.cc
@@ -72,18 +72,14 @@ } void UsbPolicyAllowedDevices::CreateOrUpdateMap() { - const base::Value* pref_value = pref_change_registrar_.prefs()->Get( - prefs::kManagedWebUsbAllowDevicesForUrls); + const base::Value::List& pref_list = + pref_change_registrar_.prefs()->GetValueList( + prefs::kManagedWebUsbAllowDevicesForUrls); usb_device_ids_to_urls_.clear(); - // A policy has not been assigned. - if (!pref_value) { - return; - } - // The pref value has already been validated by the policy handler, so it is - // safe to assume that |pref_value| follows the policy template. - for (const auto& item : pref_value->GetListDeprecated()) { + // safe to assume that |pref_list| follows the policy template. + for (const auto& item : pref_list) { const base::Value* urls_list = item.FindKey(kPrefUrlsKey); std::set<url::Origin> parsed_set;
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 4c5b578..13acbf1 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1657885898-4f2e89a4834dc0caf2932f3c6e9b29d84010a1b3.profdata +chrome-linux-main-1657907986-4342140f9b23fb78811cd2ccd5391e3a47168ed0.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index cde1e30..bcdb54c 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1657885898-dd0f692736af009e01c4b18dfab05f637307f8a2.profdata +chrome-mac-arm-main-1657907986-24124ba0fb70d8c93312645efb09d2565c48bf94.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index fd35686..5b6658ad 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1657885898-2645d310bcf3b025a09ffe11d036bc2c3365e4e7.profdata +chrome-mac-main-1657907986-a98d8ec516aeb1ff3554ac6b23a19b3eee06e63c.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index ee25e23..5965133 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1657896989-2d35d43189235fcda704ef0b7baed4bbb0751a5f.profdata +chrome-win32-main-1657918742-d60516c7839a380945338952146ba0392dbd9334.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 000a3759c..b5e9991 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1657896989-29b2c7b2ee6bfe54594c656fb98587a4b9081588.profdata +chrome-win64-main-1657918742-10a27ab06fc55ea25860ca312d19857c4d7361a4.profdata
diff --git a/chrome/common/apps/platform_apps/api/enterprise_remote_apps.idl b/chrome/common/apps/platform_apps/api/enterprise_remote_apps.idl index cb4f816..9f06b3b 100644 --- a/chrome/common/apps/platform_apps/api/enterprise_remote_apps.idl +++ b/chrome/common/apps/platform_apps/api/enterprise_remote_apps.idl
@@ -23,14 +23,15 @@ // |folderId|: The ID of the app's parent folder. Has to be an ID of a folder // added by $(ref:addFolder). If undefined or empty, the app // will be added to the top-level. - // |iconUrl|: A URL pointing to an image which represents the app's icon. + // |iconUrl|: A URL pointing to an image which represents the app's icon. If + // undefined, the app's icon will be the default placeholder. // |addToFront|: When true, the app is added to the front of the launcher. // Defaults to false. dictionary AddAppOptions { DOMString name; boolean? addToFront; DOMString? folderId; - DOMString iconUrl; + DOMString? iconUrl; }; interface Functions {
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 389b5f5c..8c1a1b9c 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -8511,6 +8511,7 @@ "../browser/ui/views/send_tab_to_self/send_tab_to_self_device_picker_bubble_view_unittest.cc", "../browser/ui/views/send_tab_to_self/send_tab_to_self_toolbar_bubble_view_unittest.cc", "../browser/ui/views/sharing_hub/screenshot/screenshot_captured_bubble_unittest.cc", + "../browser/ui/views/side_panel/read_anything/read_anything_controller_unittest.cc", "../browser/ui/views/side_panel/read_anything/read_anything_coordinator_unittest.cc", "../browser/ui/views/side_panel/read_anything/read_anything_model_unittest.cc", "../browser/ui/views/side_panel/side_panel_coordinator_unittest.cc",
diff --git a/chrome/test/data/extensions/remote_apps/extension_api/test.js b/chrome/test/data/extensions/remote_apps/extension_api/test.js index 688d531..ca9daaa 100644 --- a/chrome/test/data/extensions/remote_apps/extension_api/test.js +++ b/chrome/test/data/extensions/remote_apps/extension_api/test.js
@@ -21,7 +21,14 @@ }, async function AddAppBadIconUrl() { chrome.enterprise.remoteApps.addApp({name: 'App 1', iconUrl: ''}, () => { - chrome.test.assertLastError('Invalid iconUrl provided'); + chrome.test.assertNoLastError(); + + chrome.test.succeed(); + }); + }, + async function AddAppNoIconUrl() { + chrome.enterprise.remoteApps.addApp({name: 'App 1'}, () => { + chrome.test.assertNoLastError(); chrome.test.succeed(); });
diff --git a/chrome/test/data/webui/settings/chromeos/internet_config_test.js b/chrome/test/data/webui/settings/chromeos/internet_config_test.js index 8e8edbb..e15dbcc 100644 --- a/chrome/test/data/webui/settings/chromeos/internet_config_test.js +++ b/chrome/test/data/webui/settings/chromeos/internet_config_test.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {setUserActionRecorderForTesting} from 'chrome://os-settings/chromeos/os_settings.js'; +import {setUserActionRecorderForTesting, UserActionRecorderMojom} from 'chrome://os-settings/chromeos/os_settings.js'; import {MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.m.js'; import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.m.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; @@ -17,7 +17,7 @@ /** @type {!chromeos.networkConfig.mojom.CrosNetworkConfigRemote|undefined} */ let mojoApi_; - /** @type {?chromeos.settings.mojom.UserActionRecorderInterface} */ + /** @type {?UserActionRecorderMojom.UserActionRecorderInterface} */ let userActionRecorder; suiteSetup(function() {
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_search_box_test.js b/chrome/test/data/webui/settings/chromeos/os_settings_search_box_test.js index 96ce13ef..b269665 100644 --- a/chrome/test/data/webui/settings/chromeos/os_settings_search_box_test.js +++ b/chrome/test/data/webui/settings/chromeos/os_settings_search_box_test.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {OpenWindowProxyImpl, PersonalizationSearchMojom, Router, routes, setPersonalizationSearchHandlerForTesting, setSettingsSearchHandlerForTesting, setUserActionRecorderForTesting} from 'chrome://os-settings/chromeos/os_settings.js'; +import {OpenWindowProxyImpl, PersonalizationSearchMojom, Router, routes, SearchMojom, SearchResultIconMojom, setPersonalizationSearchHandlerForTesting, setSettingsSearchHandlerForTesting, setUserActionRecorderForTesting, UserActionRecorderMojom} from 'chrome://os-settings/chromeos/os_settings.js'; 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 {eventToPromise} from 'chrome://test/test_util.js'; @@ -72,7 +72,7 @@ /** @type {*} */ let settingsSearchHandler; - /** @type {?chromeos.settings.mojom.UserActionRecorderInterface} */ + /** @type {?UserActionRecorderMojom.UserActionRecorderInterface} */ let userActionRecorder; /** @type {?HTMLElement} */ @@ -114,12 +114,12 @@ /** * @param {string} text Exact string of the result to be displayed. * @param {string} path Url path with optional params. - * @param {?chromeos.settings.mojom.SearchResultIcon} icon Result icon enum. + * @param {?SearchResultIconMojom.SearchResultIcon} icon Result icon enum. * @param {?Boolean} wasGeneratedFromTextMatch If result was generated by * text match, defaults to true. * @param {?number} relevanceScore the score of this search result, defaults * to |DEFAULT_RELEVANCE_SCORE| - * @return {!chromeos.settings.mojom.SearchResult} A search result. + * @return {!SearchMojom.SearchResult} A search result. */ function fakeSettingsResult( text, urlPathWithParameters, icon, wasGeneratedFromTextMatch, @@ -132,7 +132,7 @@ data: Array.from(text, c => c.charCodeAt()), }, urlPathWithParameters: urlPathWithParameters, - icon: icon ? icon : chromeos.settings.mojom.SearchResultIcon.MIN_VALUE, + icon: icon ? icon : SearchResultIconMojom.SearchResultIcon.MIN_VALUE, wasGeneratedFromTextMatch: wasGeneratedFromTextMatch === undefined ? true : wasGeneratedFromTextMatch, @@ -141,7 +141,7 @@ subpage: chromeos.settings.mojom.Subpage.MIN_VALUE, setting: chromeos.settings.mojom.Setting.MIN_VALUE, }, - type: chromeos.settings.mojom.SearchResultType.MIN_VALUE, + type: SearchMojom.SearchResultType.MIN_VALUE, relevanceScore: typeof relevanceScore === 'number' ? relevanceScore : DEFAULT_RELEVANCE_SCORE, @@ -778,15 +778,15 @@ settingsSearchHandler.setFakeResults([ fakeSettingsResult( 'two', /*urlPathWithParameters=*/ '', - /*icon=*/ chromeos.settings.mojom.SearchResultIcon.MIN_VALUE, + /*icon=*/ SearchResultIconMojom.SearchResultIcon.MIN_VALUE, /*wasGeneratedFromTextMatch=*/ true, /*relevanceScore=*/ 0.85), fakeSettingsResult( 'four', /*urlPathWithParameters=*/ '', - /*icon=*/ chromeos.settings.mojom.SearchResultIcon.MIN_VALUE, + /*icon=*/ SearchResultIconMojom.SearchResultIcon.MIN_VALUE, /*wasGeneratedFromTextMatch=*/ true, /*relevanceScore=*/ 0.55), fakeSettingsResult( 'five', /*urlPathWithParameters=*/ '', - /*icon=*/ chromeos.settings.mojom.SearchResultIcon.MIN_VALUE, + /*icon=*/ SearchResultIconMojom.SearchResultIcon.MIN_VALUE, /*wasGeneratedFromTextMatch=*/ true, /*relevanceScore=*/ 0.35), ]);
diff --git a/chrome/updater/win/win_util.cc b/chrome/updater/win/win_util.cc index 743457e..4d05de5 100644 --- a/chrome/updater/win/win_util.cc +++ b/chrome/updater/win/win_util.cc
@@ -28,6 +28,7 @@ #include "base/logging.h" #include "base/memory/free_deleter.h" #include "base/path_service.h" +#include "base/process/process.h" #include "base/process/process_iterator.h" #include "base/scoped_native_library.h" #include "base/strings/strcat.h" @@ -663,8 +664,8 @@ DCHECK(!file_path.empty()); DCHECK(exit_code); - HWND hwnd = CreateForegroundParentWindowForUAC(); - base::ScopedClosureRunner destroy_window(base::BindOnce( + const HWND hwnd = CreateForegroundParentWindowForUAC(); + const base::ScopedClosureRunner destroy_window(base::BindOnce( [](HWND hwnd) { if (hwnd) ::DestroyWindow(hwnd); @@ -685,18 +686,28 @@ shell_execute_info.hInstApp = NULL; if (!::ShellExecuteEx(&shell_execute_info)) { - HRESULT hr = HRESULTFromLastError(); - VLOG(1) << "::ShellExecuteEx failed: " << std::hex << hr; + const HRESULT hr = HRESULTFromLastError(); + VLOG(1) << __func__ << ": ::ShellExecuteEx failed: " << std::hex << hr; return hr; } - base::win::ScopedHandle process(shell_execute_info.hProcess); + if (!shell_execute_info.hProcess) { + VLOG(1) << __func__ << ": Started process, PID unknown"; + return S_OK; + } - if (::WaitForSingleObject(process.Get(), INFINITE) == WAIT_FAILED) - return HRESULTFromLastError(); + const base::Process process(shell_execute_info.hProcess); + const DWORD pid = process.Pid(); + VLOG(1) << __func__ << ": Started process, PID: " << pid; - DWORD ret_val = 0; - if (!::GetExitCodeProcess(process.Get(), &ret_val)) + // Allow the spawned process to show windows in the foreground. + if (!::AllowSetForegroundWindow(pid)) { + LOG(WARNING) << __func__ + << ": ::AllowSetForegroundWindow failed: " << ::GetLastError(); + } + + int ret_val = 0; + if (!process.WaitForExit(&ret_val)) return HRESULTFromLastError(); *exit_code = ret_val;
diff --git a/chromeos/profiles/atom.afdo.newest.txt b/chromeos/profiles/atom.afdo.newest.txt index 774e320..e2c8cae 100644 --- a/chromeos/profiles/atom.afdo.newest.txt +++ b/chromeos/profiles/atom.afdo.newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-atom-105-5140.0-1657535009-benchmark-105.0.5176.0-r2-redacted.afdo.xz +chromeos-chrome-amd64-atom-105-5140.0-1657535009-benchmark-105.0.5180.0-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/bigcore.afdo.newest.txt b/chromeos/profiles/bigcore.afdo.newest.txt index f8b1ae3..29d72cc0 100644 --- a/chromeos/profiles/bigcore.afdo.newest.txt +++ b/chromeos/profiles/bigcore.afdo.newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-bigcore-105-5140.0-1657533171-benchmark-105.0.5176.0-r2-redacted.afdo.xz +chromeos-chrome-amd64-bigcore-105-5140.0-1657533171-benchmark-105.0.5180.0-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/orderfile.newest.txt b/chromeos/profiles/orderfile.newest.txt index 80ab1b6..d9ba54b4 100644 --- a/chromeos/profiles/orderfile.newest.txt +++ b/chromeos/profiles/orderfile.newest.txt
@@ -1 +1 @@ -chromeos-chrome-orderfile-field-105-5140.0-1657535009-benchmark-105.0.5173.0-r2.orderfile.xz +chromeos-chrome-orderfile-field-105-5140.0-1657535009-benchmark-105.0.5176.0-r2.orderfile.xz
diff --git a/chromeos/strings/chromeos_strings_am.xtb b/chromeos/strings/chromeos_strings_am.xtb index 431656e..c69be9e 100644 --- a/chromeos/strings/chromeos_strings_am.xtb +++ b/chromeos/strings/chromeos_strings_am.xtb
@@ -865,6 +865,7 @@ <translation id="8576249514688522074">ያልተጀመረ</translation> <translation id="8620617069779373398">የውሂብ ዝውውር ሁኔታ</translation> <translation id="8655295600908251630">ሰርጥ</translation> +<translation id="8655828773034788261">ዩአርኤል ያጋሩ፦</translation> <translation id="8660881923941176839">ፓውንድ</translation> <translation id="8662671328352114214">የ<ph name="TYPE" /> አውታረ መረብን ይቀላቀሉ</translation> <translation id="8671972493856476349">ወደ <ph name="VERSION_NUMBER" /> ያዘምኑ እና እንደገና ያስጀምሩ</translation>
diff --git a/chromeos/strings/chromeos_strings_fr-CA.xtb b/chromeos/strings/chromeos_strings_fr-CA.xtb index 42aee8c..40bac2c3 100644 --- a/chromeos/strings/chromeos_strings_fr-CA.xtb +++ b/chromeos/strings/chromeos_strings_fr-CA.xtb
@@ -865,6 +865,7 @@ <translation id="8576249514688522074">Non initialisé</translation> <translation id="8620617069779373398">État d'itinérance</translation> <translation id="8655295600908251630">Version</translation> +<translation id="8655828773034788261">Partager l'URL :</translation> <translation id="8660881923941176839">livres</translation> <translation id="8662671328352114214">Se joindre au réseau <ph name="TYPE" /></translation> <translation id="8671972493856476349">Mettre à jour à la version <ph name="VERSION_NUMBER" /> et redémarrer</translation>
diff --git a/chromeos/strings/chromeos_strings_gl.xtb b/chromeos/strings/chromeos_strings_gl.xtb index fc62622..a7bc59a6 100644 --- a/chromeos/strings/chromeos_strings_gl.xtb +++ b/chromeos/strings/chromeos_strings_gl.xtb
@@ -804,7 +804,7 @@ <translation id="8045012663542226664">Desactivar micrófono</translation> <translation id="8063022551652308521">A protección contra a escritura aínda está desactivada. Actívaa para continuar.</translation> <translation id="8075838845814659848">Carga restante</translation> -<translation id="8082366717211101304">Non se puido resolver o DNS desde aplicacións Android</translation> +<translation id="8082366717211101304">Non se puido resolver o DNS desde aplicacións para Android</translation> <translation id="8083281199617904460">Este proceso de reparación debe efectualo un técnico cualificado, e só se debe iniciar despois de substituír os compoñentes que non funcionen correctamente.</translation> <translation id="808894953321890993">Cambiar contrasinal</translation> <translation id="8104083085214006426">Estás usando unha rede aberta e non segura</translation> @@ -855,7 +855,7 @@ <translation id="8475690821716466388">A rede wifi está protexida co protocolo WEP PSK, que non é moi seguro</translation> <translation id="8477551185774834963">A latencia do DNS supera lixeiramente o límite permitido</translation> <translation id="8483248364096924578">Enderezo IP</translation> -<translation id="8491311378305535241">Non se puido establecer conexión con sitios web HTTP desde aplicacións Android a través do firewall</translation> +<translation id="8491311378305535241">Non se puido establecer conexión con sitios web HTTP desde aplicacións para Android a través do firewall</translation> <translation id="8498220429738806196">Contadores de tráfico</translation> <translation id="8503813439785031346">Nome de usuario</translation> <translation id="8503836310948963452">Só faltan uns minutos…</translation> @@ -945,7 +945,7 @@ <translation id="9173638680043580060">Queda menos dun minuto</translation> <translation id="917720651393141712">Probar</translation> <translation id="9188992814426075118">O teclado pode combinar automaticamente co teu fondo de pantalla</translation> -<translation id="9204237731135241582">Non se puido establecer contacto coa pasarela desde aplicacións Android</translation> +<translation id="9204237731135241582">Non se puido establecer contacto coa pasarela desde aplicacións para Android</translation> <translation id="9211490828691860325">Todos os ordenadores</translation> <translation id="922179502584117429">A versión actual (<ph name="VERSION_NUMBER" />) está desactualizada</translation> <translation id="932327136139879170">Inicio</translation>
diff --git a/chromeos/strings/chromeos_strings_lo.xtb b/chromeos/strings/chromeos_strings_lo.xtb index 659470b..5492c92 100644 --- a/chromeos/strings/chromeos_strings_lo.xtb +++ b/chromeos/strings/chromeos_strings_lo.xtb
@@ -867,6 +867,7 @@ <translation id="8576249514688522074">ບໍ່ໄດ້ລິເລີ່ມ</translation> <translation id="8620617069779373398">ສະຖານະການໂຣມມິງ</translation> <translation id="8655295600908251630">ຊ່ອງ</translation> +<translation id="8655828773034788261">ແບ່ງປັນ URL:</translation> <translation id="8660881923941176839">ພາວ</translation> <translation id="8662671328352114214">ເຂົ້າຮ່ວມເຄືອຂ່າຍ <ph name="TYPE" /></translation> <translation id="8671972493856476349">ອັບເດດເປັນ <ph name="VERSION_NUMBER" /> ແລ້ວຣີສະຕາດ</translation>
diff --git a/chromeos/ui/frame/BUILD.gn b/chromeos/ui/frame/BUILD.gn index 2fbb753..b8363e0 100644 --- a/chromeos/ui/frame/BUILD.gn +++ b/chromeos/ui/frame/BUILD.gn
@@ -47,8 +47,13 @@ "interior_resize_handler_targeter.h", "multitask_menu/float_controller_base.cc", "multitask_menu/float_controller_base.h", + "multitask_menu/multitask_button.cc", + "multitask_menu/multitask_button.h", "multitask_menu/multitask_menu.cc", "multitask_menu/multitask_menu.h", + "multitask_menu/multitask_menu_constants.h", + "multitask_menu/split_button.cc", + "multitask_menu/split_button.h", ] deps = [
diff --git a/chromeos/ui/frame/caption_buttons/frame_size_button.cc b/chromeos/ui/frame/caption_buttons/frame_size_button.cc index 96a774f1..bba0fbd 100644 --- a/chromeos/ui/frame/caption_buttons/frame_size_button.cc +++ b/chromeos/ui/frame/caption_buttons/frame_size_button.cc
@@ -212,6 +212,12 @@ views::FrameCaptionButton::OnGestureEvent(event); } +const raw_ptr<MultitaskMenu> FrameSizeButton::GetMultitaskMenuForTesting() { + // Force creating Multitask Menu. + ShowMultitaskMenu(); + return multitask_menu_; +} + void FrameSizeButton::StartSetButtonsToSnapModeTimer( const ui::LocatedEvent& event) { set_buttons_to_snap_mode_timer_event_location_ = event.location(); @@ -232,6 +238,18 @@ GetWidget()->GetNativeWindow(), this); } +void FrameSizeButton::ShowMultitaskMenu() { + // Show Multitask Menu if float is enabled. Note here float flag is also used + // to represent other relatable UI/UX changes. + // TODO(shidi) Move this when long hover trigger (crbug.com/1330016) is + // implemented. + if (chromeos::wm::features::IsFloatWindowEnabled()) { + multitask_menu_ = new MultitaskMenu( + /*anchor=*/this, GetWidget()->GetNativeWindow()); + multitask_menu_->ShowBubble(); + } +} + void FrameSizeButton::SetButtonsToSnapMode( FrameSizeButtonDelegate::Animate animate) { in_snap_mode_ = true; @@ -247,15 +265,7 @@ views::CAPTION_BUTTON_ICON_RIGHT_BOTTOM_SNAPPED, animate); } - // Show Multitask Menu if float is enabled. Note here float flag is also used - // to represent other relatable UI/UX changes. - // TODO(shidi) Move this when long hover trigger (crbug.com/1330016) is - // implemented. - if (chromeos::wm::features::IsFloatWindowEnabled()) { - multitask_menu_ = std::make_unique<MultitaskMenu>( - /*anchor=*/this, GetWidget()->GetNativeWindow()); - multitask_menu_->ShowBubble(); - } + ShowMultitaskMenu(); } void FrameSizeButton::UpdateSnapPreview(const ui::LocatedEvent& event) {
diff --git a/chromeos/ui/frame/caption_buttons/frame_size_button.h b/chromeos/ui/frame/caption_buttons/frame_size_button.h index e465b75..0548f34 100644 --- a/chromeos/ui/frame/caption_buttons/frame_size_button.h +++ b/chromeos/ui/frame/caption_buttons/frame_size_button.h
@@ -49,6 +49,8 @@ // preview will be deleted and the button will be set back to its normal mode. void CancelSnap(); + const raw_ptr<MultitaskMenu> GetMultitaskMenuForTesting(); + void set_delay_to_set_buttons_to_snap_mode(int delay_ms) { set_buttons_to_snap_mode_delay_ms_ = delay_ms; } @@ -63,6 +65,7 @@ // Animates the buttons adjacent to the size button to snap left and right. void AnimateButtonsToSnapMode(); + void ShowMultitaskMenu(); // Sets the buttons adjacent to the size button to snap left and right. // Passing in ANIMATE_NO progresses the animation (if any) to the end. void SetButtonsToSnapMode(FrameSizeButtonDelegate::Animate animate); @@ -102,7 +105,7 @@ base::OneShotTimer set_buttons_to_snap_mode_timer_; - std::unique_ptr<MultitaskMenu> multitask_menu_; + raw_ptr<MultitaskMenu> multitask_menu_; // Whether the buttons adjacent to the size button snap the window left and // right.
diff --git a/chromeos/ui/frame/multitask_menu/multitask_button.cc b/chromeos/ui/frame/multitask_menu/multitask_button.cc new file mode 100644 index 0000000..231eba1 --- /dev/null +++ b/chromeos/ui/frame/multitask_menu/multitask_button.cc
@@ -0,0 +1,85 @@ +// 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 "chromeos/ui/frame/multitask_menu/multitask_button.h" + +#include "chromeos/ui/frame/multitask_menu/multitask_menu_constants.h" +#include "ui/gfx/canvas.h" +#include "ui/views/animation/ink_drop.h" +#include "ui/views/controls/focus_ring.h" +#include "ui/views/controls/highlight_path_generator.h" + +namespace chromeos { + +namespace { + +// Round rect pattern indicate the Full/Float window bounds. +// TODO(shidi): Update when implement portrait mode. +constexpr gfx::Rect kFloatPatternBounds(72, 24, 32, 44); +constexpr gfx::Rect kFullPatternBounds(4, 4, 100, 64); + +} // namespace + +MultitaskBaseButton::MultitaskBaseButton(PressedCallback callback, + Type type, + const std::u16string& name) + : views::Button(std::move(callback)), type_(type) { + SetPreferredSize(kMultitaskButtonSize); + views::InkDrop::Get(this)->SetMode(views::InkDropHost::InkDropMode::ON); + views::InkDrop::Get(this)->SetBaseColor(kMultitaskButtonDefaultColor); + SetInstallFocusRingOnFocus(true); + views::FocusRing::Get(this)->SetColorId(kMultitaskButtonDefaultColor); + views::InstallRoundRectHighlightPathGenerator( + this, gfx::Insets(), kMultitaskBaseButtonBorderRadius); + SetAccessibleName(name); +} + +void MultitaskBaseButton::PaintButtonContents(gfx::Canvas* canvas) { + cc::PaintFlags border_flags; + SkColor fill_color; + + border_flags.setAntiAlias(true); + border_flags.setStyle(cc::PaintFlags::kStroke_Style); + + cc::PaintFlags pattern_flags; + pattern_flags.setAntiAlias(true); + pattern_flags.setStyle(cc::PaintFlags::kFill_Style); + + cc::PaintFlags fill_flags; + fill_flags.setStyle(cc::PaintFlags::kFill_Style); + + if (GetState() == Button::STATE_HOVERED) { + border_flags.setColor(kMultitaskButtonPrimaryHoverColor); + pattern_flags.setColor(gfx::kGoogleBlue600); + fill_color = kMultitaskButtonViewHoverColor; + } else if (GetState() == Button::STATE_DISABLED) { + border_flags.setColor(kMultitaskButtonDisabledColor); + pattern_flags.setColor(kMultitaskButtonDisabledColor); + fill_color = kMultitaskButtonViewHoverColor; + } else { + border_flags.setColor(kMultitaskButtonDefaultColor); + pattern_flags.setColor(kMultitaskButtonDefaultColor); + fill_color = SK_ColorTRANSPARENT; + } + + // Draw a border on the background circle. + border_flags.setStrokeWidth(kButtonBorderSize); + canvas->DrawRoundRect(GetLocalBounds(), kMultitaskBaseButtonBorderRadius, + border_flags); + + fill_flags.setColor(fill_color); + canvas->DrawRoundRect(GetLocalBounds(), kMultitaskBaseButtonBorderRadius, + fill_flags); + + gfx::Rect bounds = + type_ == Type::kFloat ? kFloatPatternBounds : kFullPatternBounds; + canvas->DrawRoundRect(bounds, kButtonCornerRadius, pattern_flags); +} + +void MultitaskBaseButton::OnThemeChanged() { + // TODO(shidi): Implement the theme change after dark/light mode integration. + views::Button::OnThemeChanged(); +} + +} // namespace chromeos
diff --git a/chromeos/ui/frame/multitask_menu/multitask_button.h b/chromeos/ui/frame/multitask_menu/multitask_button.h new file mode 100644 index 0000000..148326c --- /dev/null +++ b/chromeos/ui/frame/multitask_menu/multitask_button.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 CHROMEOS_UI_FRAME_MULTITASK_MENU_MULTITASK_BUTTON_H_ +#define CHROMEOS_UI_FRAME_MULTITASK_MENU_MULTITASK_BUTTON_H_ + +#include "ui/views/controls/button/button.h" + +namespace chromeos { + +// The base button for multitask menu to create Full Screen and Float buttons. +class MultitaskBaseButton : public views::Button { + public: + // The types of single operated multitask button. + enum class Type { + kFull, // The button that turn the window to full screen mode. + kFloat, // The button that float the window. + }; + + MultitaskBaseButton(PressedCallback callback, + Type type, + const std::u16string& name); + + MultitaskBaseButton(const MultitaskBaseButton&) = delete; + MultitaskBaseButton& operator=(const MultitaskBaseButton&) = delete; + ~MultitaskBaseButton() override = default; + + // views::Button: + void PaintButtonContents(gfx::Canvas* canvas) override; + void OnThemeChanged() override; + + private: + const Type type_; +}; + +} // namespace chromeos + +#endif // CHROMEOS_UI_FRAME_MULTITASK_MENU_MULTITASK_BUTTON_H_
diff --git a/chromeos/ui/frame/multitask_menu/multitask_menu.cc b/chromeos/ui/frame/multitask_menu/multitask_menu.cc index 383af1de..d2d17ef 100644 --- a/chromeos/ui/frame/multitask_menu/multitask_menu.cc +++ b/chromeos/ui/frame/multitask_menu/multitask_menu.cc
@@ -4,6 +4,16 @@ #include "chromeos/ui/frame/multitask_menu/multitask_menu.h" +#include <memory> + +#include "base/check.h" +#include "chromeos/ui/frame/frame_header.h" +#include "chromeos/ui/frame/multitask_menu/float_controller_base.h" +#include "ui/base/default_style.h" +#include "ui/base/l10n/l10n_util.h" +#include "ui/strings/grit/ui_strings.h" +#include "ui/views/layout/table_layout.h" + namespace chromeos { namespace { @@ -11,7 +21,28 @@ SkColorSetARGB(255, 255, 255, 255); constexpr int kMultitaskMenuBubbleCornerRadius = 8; constexpr int KMultitaskMenuWidth = 270; -constexpr int kMultitaskMenuHeight = 247; +constexpr int kMultitaskMenuHeight = 248; +constexpr int kRowPadding = 16; +constexpr int kCenterPadding = 4; +constexpr int kLabelFontSize = 13; + +// Create Multitask button with label. +std::unique_ptr<views::View> CreateButtonContainer( + std::unique_ptr<views::View> button_view, + int label_message_id) { + auto container = std::make_unique<views::BoxLayoutView>(); + container->SetOrientation(views::BoxLayout::Orientation::kVertical); + container->SetBetweenChildSpacing(kCenterPadding); + container->AddChildView(std::move(button_view)); + views::Label* label = container->AddChildView(std::make_unique<views::Label>( + l10n_util::GetStringUTF16(label_message_id))); + label->SetFontList(gfx::FontList({"Roboto"}, gfx::Font::NORMAL, + kLabelFontSize, gfx::Font::Weight::NORMAL)); + label->SetEnabledColor(gfx::kGoogleGrey900); + label->SetHorizontalAlignment(gfx::ALIGN_CENTER); + return container; +} + } // namespace MultitaskMenu::MultitaskMenu(views::View* anchor, aura::Window* parent_window) { @@ -27,11 +58,93 @@ SetButtons(ui::DIALOG_BUTTON_NONE); set_parent_window(parent_window); set_close_on_deactivate(true); + + // TODO(shidi/sophiewen): Needs rework when reuse this class for ARC view or + // tablet. + SetLayoutManager(std::make_unique<views::TableLayout>()) + ->AddPaddingColumn(views::TableLayout::kFixedSize, kRowPadding) + .AddColumn(views::LayoutAlignment::kCenter, + views::LayoutAlignment::kCenter, + views::TableLayout::kFixedSize, + views::TableLayout::ColumnSize::kUsePreferred, 0, 0) + .AddPaddingColumn(views::TableLayout::kFixedSize, kRowPadding) + .AddColumn(views::LayoutAlignment::kCenter, + views::LayoutAlignment::kCenter, + views::TableLayout::kFixedSize, + views::TableLayout::ColumnSize::kUsePreferred, 0, 0) + .AddPaddingRow(views::TableLayout::kFixedSize, kRowPadding) + .AddRows(1, views::TableLayout::kFixedSize, 0) + .AddPaddingRow(views::TableLayout::kFixedSize, kRowPadding) + .AddRows(1, views::TableLayout::kFixedSize, 0); + + // Half button. + auto half_button = std::make_unique<SplitButtonView>( + SplitButton::SplitButtonType::kHalfButtons, + base::BindRepeating(&MultitaskMenu::SplitButtonPressed, + base::Unretained(this), SnapDirection::kPrimary), + base::BindRepeating(&MultitaskMenu::SplitButtonPressed, + base::Unretained(this), SnapDirection::kSecondary)); + half_button_ = half_button.get(); + AddChildView( + CreateButtonContainer(std::move(half_button), IDS_APP_ACCNAME_HALF)); + + // Partial button. + auto partial_button = std::make_unique<SplitButtonView>( + SplitButton::SplitButtonType::kPartialButtons, + base::BindRepeating(&MultitaskMenu::PartialButtonPressed, + base::Unretained(this), SnapDirection::kPrimary), + base::BindRepeating(&MultitaskMenu::PartialButtonPressed, + base::Unretained(this), SnapDirection::kSecondary)); + partial_button_ = partial_button.get(); + AddChildView(CreateButtonContainer(std::move(partial_button), + IDS_APP_ACCNAME_PARTIAL)); + + // Full screen button. + auto full_button = std::make_unique<MultitaskBaseButton>( + base::BindRepeating(&MultitaskMenu::FullScreenButtonPressed, + base::Unretained(this)), + MultitaskBaseButton::Type::kFull, + l10n_util::GetStringUTF16(IDS_APP_ACCNAME_FULL)); + full_button_ = full_button.get(); + AddChildView( + CreateButtonContainer(std::move(full_button), IDS_APP_ACCNAME_FULL)); + + // Float on top button. + auto float_button = std::make_unique<MultitaskBaseButton>( + base::BindRepeating(&MultitaskMenu::FloatButtonPressed, + base::Unretained(this)), + MultitaskBaseButton::Type::kFloat, + l10n_util::GetStringUTF16(IDS_APP_ACCNAME_FLOAT_ON_TOP)); + float_button_ = float_button.get(); + AddChildView(CreateButtonContainer(std::move(float_button), + IDS_APP_ACCNAME_FLOAT_ON_TOP)); } MultitaskMenu::~MultitaskMenu() { if (bubble_widget_) HideBubble(); + bubble_widget_ = nullptr; +} + +void MultitaskMenu::SplitButtonPressed(SnapDirection snap) { + SnapController::Get()->CommitSnap(parent_window(), snap); + HideBubble(); +} + +void MultitaskMenu::PartialButtonPressed(SnapDirection snap) { + // TODO(shidi/sophiewen): Link Partial Split function here. + HideBubble(); +} + +void MultitaskMenu::FullScreenButtonPressed() { + auto* widget = views::Widget::GetWidgetForNativeWindow(parent_window()); + widget->SetFullscreen(!widget->IsFullscreen()); + HideBubble(); +} + +void MultitaskMenu::FloatButtonPressed() { + FloatControllerBase::Get()->ToggleFloat(parent_window()); + HideBubble(); } void MultitaskMenu::OnWidgetDestroying(views::Widget* widget) { @@ -41,7 +154,7 @@ } void MultitaskMenu::ShowBubble() { - DCHECK(this->parent_window()); + DCHECK(parent_window()); bubble_widget_ = views::BubbleDialogDelegateView::CreateBubble(this); bubble_widget_->Show(); bubble_widget_observer_.Observe(bubble_widget_.get()); @@ -50,8 +163,9 @@ void MultitaskMenu::HideBubble() { DCHECK(bubble_widget_); - bubble_widget_->Close(); - bubble_widget_observer_.Reset(); - bubble_widget_ = nullptr; + // This calls into OnWidgetDestroying() so `bubble_widget_` should have been + // reset to nullptr. + if (bubble_widget_ && !bubble_widget_->IsClosed()) + bubble_widget_->CloseNow(); } } // namespace chromeos
diff --git a/chromeos/ui/frame/multitask_menu/multitask_menu.h b/chromeos/ui/frame/multitask_menu/multitask_menu.h index a2c3b22..aeedc4b1 100644 --- a/chromeos/ui/frame/multitask_menu/multitask_menu.h +++ b/chromeos/ui/frame/multitask_menu/multitask_menu.h
@@ -5,7 +5,12 @@ #ifndef CHROMEOS_UI_FRAME_MULTITASK_MENU_MULTITASK_MENU_H_ #define CHROMEOS_UI_FRAME_MULTITASK_MENU_MULTITASK_MENU_H_ +#include <cstddef> + #include "base/memory/raw_ptr.h" +#include "chromeos/ui/frame/caption_buttons/snap_controller.h" +#include "chromeos/ui/frame/multitask_menu/multitask_button.h" +#include "chromeos/ui/frame/multitask_menu/split_button.h" #include "ui/views/bubble/bubble_dialog_delegate_view.h" namespace views { @@ -17,8 +22,9 @@ // MultitaskMenu is the window operation menu attached to frame // size button. -class MultitaskMenu : public views::BubbleDialogDelegateView, - public views::WidgetObserver { +class COMPONENT_EXPORT(CHROMEOS_UI_FRAME) MultitaskMenu + : public views::BubbleDialogDelegateView, + public views::WidgetObserver { public: MultitaskMenu(views::View* anchor, aura::Window* parent_window); @@ -27,6 +33,20 @@ ~MultitaskMenu() override; + // For testing. + SplitButtonView* half_button_for_testing() const { + return half_button_.get(); + } + SplitButtonView* partial_button_for_testing() const { + return partial_button_.get(); + } + MultitaskBaseButton* full_button_for_testing() const { + return full_button_.get(); + } + MultitaskBaseButton* float_button_for_testing() const { + return float_button_.get(); + } + // views::WidgetObserver: void OnWidgetDestroying(views::Widget* widget) override; @@ -36,9 +56,22 @@ void HideBubble(); private: - raw_ptr<views::Widget> bubble_widget_; + // Callbacks for the buttons in the multitask menu view. + void SplitButtonPressed(SnapDirection snap); + void PartialButtonPressed(SnapDirection snap); + + void FullScreenButtonPressed(); + void FloatButtonPressed(); + + raw_ptr<views::Widget> bubble_widget_ = nullptr; base::ScopedObservation<views::Widget, views::WidgetObserver> bubble_widget_observer_{this}; + + // Saved for testing purpose. + raw_ptr<SplitButtonView> half_button_; + raw_ptr<SplitButtonView> partial_button_; + raw_ptr<MultitaskBaseButton> full_button_; + raw_ptr<MultitaskBaseButton> float_button_; }; } // namespace chromeos
diff --git a/chromeos/ui/frame/multitask_menu/multitask_menu_constants.h b/chromeos/ui/frame/multitask_menu/multitask_menu_constants.h new file mode 100644 index 0000000..872e432 --- /dev/null +++ b/chromeos/ui/frame/multitask_menu/multitask_menu_constants.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 CHROMEOS_UI_FRAME_MULTITASK_MENU_MULTITASK_MENU_CONSTANTS_H_ +#define CHROMEOS_UI_FRAME_MULTITASK_MENU_MULTITASK_MENU_CONSTANTS_H_ + +#include "ui/gfx/color_palette.h" +#include "ui/gfx/geometry/insets.h" +#include "ui/gfx/geometry/size.h" + +namespace chromeos { + +constexpr gfx::Size kMultitaskButtonSize(108, 72); +constexpr gfx::Insets kMultitaskBaseButtonMargin(4); +constexpr int kMultitaskBaseButtonBorderRadius = 7; +constexpr int kButtonBorderSize = 1; +constexpr int kButtonCornerRadius = 4; + +// Default color for button pattern and border in default state. +// TODO(shidi): Will replace these once color provider is integrated. +constexpr SkColor kMultitaskButtonDefaultColor = + SkColorSetA(gfx::kGoogleGrey600, SK_AlphaOPAQUE * 0.58); + +// When a button is hovered, the color changed to +// `kMultitaskButtonPrimaryHoverColor`, and the other button on the same +// MultitaskButtonView changed to `kMultitaskButtonViewHoverColor`. +constexpr SkColor kMultitaskButtonPrimaryHoverColor = + SkColorSetA(gfx::kGoogleBlue600, SK_AlphaOPAQUE); +constexpr SkColor kMultitaskButtonViewHoverColor = + SkColorSetA(gfx::kGoogleBlue600, SK_AlphaOPAQUE * 0.12); + +// The pattern color of both primary and secondary buttons when it's disabled. +constexpr SkColor kMultitaskButtonDisabledColor = + SkColorSetA(gfx::kGoogleGrey600, SK_AlphaOPAQUE * 0.28); + +} // namespace chromeos + +#endif // CHROMEOS_UI_FRAME_MULTITASK_MENU_MULTITASK_MENU_CONSTANTS_H_
diff --git a/chromeos/ui/frame/multitask_menu/split_button.cc b/chromeos/ui/frame/multitask_menu/split_button.cc new file mode 100644 index 0000000..f66fab9e --- /dev/null +++ b/chromeos/ui/frame/multitask_menu/split_button.cc
@@ -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. + +#include "chromeos/ui/frame/multitask_menu/split_button.h" + +#include <memory> + +#include "ui/gfx/canvas.h" +#include "ui/gfx/color_palette.h" +#include "ui/gfx/geometry/point_f.h" + +namespace chromeos { + +namespace { + +constexpr int kMultitaskHalfButtonWidth = 54; +constexpr int kMultitaskHalfButtonHeight = 72; +constexpr int kMultitaskOneThirdButtonWidth = 38; +constexpr int kMultitaskTwoThirdButtonWidth = 70; + +constexpr gfx::Insets kPrimaryInsets = gfx::Insets::TLBR(4, 4, 4, 2); +constexpr gfx::Insets kSecondaryInsets = gfx::Insets::TLBR(4, 2, 4, 4); + +// TODO(shidi): Button name needs to be internationalized. +const std::u16string kPrimaryButtonName = u"Split Primary"; +const std::u16string kSecondaryButtonName = u"Split Secondary"; + +// Change to secondary hover color when the other button on the same +// `SplitButtonView` is hovered. +constexpr SkColor kSplitButtonSecondaryHoverColor = + SkColorSetA(gfx::kGoogleBlue600, SK_AlphaOPAQUE * 0.4); + +} // namespace + +SplitButton::SplitButton(views::Button::PressedCallback pressed_callback, + base::RepeatingClosure hovered_callback, + const std::u16string& name, + const gfx::Insets& insets) + : views::Button(std::move(pressed_callback)), + button_color_(kMultitaskButtonDefaultColor), + insets_(insets), + hovered_callback_(std::move(hovered_callback)) { + SetAccessibleName(name); +} + +SplitButton::~SplitButton() = default; + +void SplitButton::StateChanged(ButtonState old_state) { + if (old_state == STATE_HOVERED || GetState() == STATE_HOVERED) + hovered_callback_.Run(); +} + +void SplitButton::OnPaintBackground(gfx::Canvas* canvas) { + cc::PaintFlags pattern_flags; + pattern_flags.setAntiAlias(true); + pattern_flags.setColor(button_color_); + pattern_flags.setStyle(cc::PaintFlags::kFill_Style); + gfx::Rect pattern_bounds = GetLocalBounds(); + pattern_bounds.Inset(insets_); + canvas->DrawRoundRect(pattern_bounds, kButtonCornerRadius, pattern_flags); +} + +SplitButtonView::SplitButtonView( + SplitButton::SplitButtonType type, + views::Button::PressedCallback primary_callback, + views::Button::PressedCallback secondary_callback) + : type_(type) { + SetPreferredSize(kMultitaskButtonSize); + + auto primary_hover_callback = base::BindRepeating( + &SplitButtonView::OnButtonHovered, base::Unretained(this)); + auto secondary_hover_callback = base::BindRepeating( + &SplitButtonView::OnButtonHovered, base::Unretained(this)); + primary_button_ = AddChildView( + std::make_unique<SplitButton>(primary_callback, primary_hover_callback, + kPrimaryButtonName, kPrimaryInsets)); + secondary_button_ = AddChildView(std::make_unique<SplitButton>( + secondary_callback, secondary_hover_callback, kSecondaryButtonName, + kSecondaryInsets)); + + const int primary_width = type_ == SplitButton::SplitButtonType::kHalfButtons + ? kMultitaskHalfButtonWidth + : kMultitaskTwoThirdButtonWidth; + const int secondary_width = + type_ == SplitButton::SplitButtonType::kHalfButtons + ? kMultitaskHalfButtonWidth + : kMultitaskOneThirdButtonWidth; + + primary_button_->SetPreferredSize( + gfx::Size(primary_width, kMultitaskHalfButtonHeight)); + secondary_button_->SetPreferredSize( + gfx::Size(secondary_width, kMultitaskHalfButtonHeight)); +} + +void SplitButtonView::OnButtonHovered() { + border_color_ = kMultitaskButtonPrimaryHoverColor; + fill_color_ = kMultitaskButtonViewHoverColor; + if (secondary_button_->GetState() == views::Button::STATE_HOVERED) { + secondary_button_->set_button_color(kMultitaskButtonPrimaryHoverColor); + primary_button_->set_button_color(kSplitButtonSecondaryHoverColor); + } else if (primary_button_->GetState() == views::Button::STATE_HOVERED) { + primary_button_->set_button_color(kMultitaskButtonPrimaryHoverColor); + secondary_button_->set_button_color(kSplitButtonSecondaryHoverColor); + } else { + // Reset color. + border_color_ = kMultitaskButtonDefaultColor; + fill_color_ = SK_ColorTRANSPARENT; + secondary_button_->set_button_color(kMultitaskButtonDefaultColor); + primary_button_->set_button_color(kMultitaskButtonDefaultColor); + } + primary_button_->SchedulePaint(); + secondary_button_->SchedulePaint(); + SchedulePaint(); +} + +void SplitButtonView::OnPaint(gfx::Canvas* canvas) { + gfx::Rect bounds = GetContentsBounds(); + + cc::PaintFlags border_flags; + border_flags.setAntiAlias(true); + border_flags.setStyle(cc::PaintFlags::kStroke_Style); + border_flags.setColor(border_color_); + border_flags.setStrokeWidth(kButtonBorderSize); + canvas->DrawRoundRect(bounds, kMultitaskBaseButtonBorderRadius, border_flags); + + cc::PaintFlags fill_flags; + fill_flags.setStyle(cc::PaintFlags::kFill_Style); + fill_flags.setColor(fill_color_); + canvas->DrawRoundRect(bounds, kMultitaskBaseButtonBorderRadius, fill_flags); +} + +void SplitButtonView::OnThemeChanged() { + // TODO(shidi): Implement the theme change after dark/light mode integration. + views::View::OnThemeChanged(); +} + +} // namespace chromeos
diff --git a/chromeos/ui/frame/multitask_menu/split_button.h b/chromeos/ui/frame/multitask_menu/split_button.h new file mode 100644 index 0000000..6518295 --- /dev/null +++ b/chromeos/ui/frame/multitask_menu/split_button.h
@@ -0,0 +1,78 @@ +// 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 CHROMEOS_UI_FRAME_MULTITASK_MENU_SPLIT_BUTTON_H_ +#define CHROMEOS_UI_FRAME_MULTITASK_MENU_SPLIT_BUTTON_H_ + +#include "chromeos/ui/frame/multitask_menu/multitask_menu_constants.h" + +#include "ui/views/controls/button/button.h" +#include "ui/views/layout/box_layout_view.h" +#include "ui/views/view.h" + +namespace chromeos { + +// A button used for SplitButtonView to trigger primary/secondary split. +class SplitButton : public views::Button { + public: + enum class SplitButtonType { + kHalfButtons, + kPartialButtons, + }; + + SplitButton(views::Button::PressedCallback pressed_callback, + base::RepeatingClosure hovered_callback, + const std::u16string& name, + const gfx::Insets& insets); + + SplitButton(const SplitButton&) = delete; + SplitButton& operator=(const SplitButton&) = delete; + ~SplitButton() override; + + void set_button_color(SkColor color) { button_color_ = color; }; + + // views::Button: + void OnPaintBackground(gfx::Canvas* canvas) override; + void StateChanged(ButtonState old_state) override; + + private: + SkColor button_color_; + // The insert between the button window pattern and the border. + gfx::Insets insets_; + // Callback to `SplitButtonView` to change button color. + // When one split button is hovered, both split buttons on SplitButtonView + // changed color. + base::RepeatingClosure hovered_callback_; +}; + +// A button view with 2 divided buttons, primary and secondary. +class SplitButtonView : public views::BoxLayoutView { + public: + SplitButtonView(SplitButton::SplitButtonType type, + views::Button::PressedCallback primary_callback, + views::Button::PressedCallback secondary_callback); + SplitButtonView(const SplitButtonView&) = delete; + SplitButtonView& operator=(const SplitButtonView&) = delete; + + ~SplitButtonView() override = default; + + private: + // views::View: + void OnPaint(gfx::Canvas* canvas) override; + void OnThemeChanged() override; + + // Called when either primary/secondary button is hovered, + // Update button colors. + void OnButtonHovered(); + + SplitButton* primary_button_; + SplitButton* secondary_button_; + SplitButton::SplitButtonType type_; + SkColor border_color_ = kMultitaskButtonDefaultColor; + SkColor fill_color_ = SK_ColorTRANSPARENT; +}; + +} // namespace chromeos + +#endif // CHROMEOS_UI_FRAME_MULTITASK_MENU_SPLIT_BUTTON_H_
diff --git a/components/autofill/core/common/autofill_payments_features.cc b/components/autofill/core/common/autofill_payments_features.cc index 92ee536..f0e2427 100644 --- a/components/autofill/core/common/autofill_payments_features.cc +++ b/components/autofill/core/common/autofill_payments_features.cc
@@ -93,7 +93,7 @@ // preflight call. const base::Feature kAutofillEnableSendingBcnInGetUploadDetails{ "AutofillEnableSendingBcnInGetUploadDetails", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; // When enabled, if the user interacts with the manual fallback bottom sheet // on Android, it'll remain sticky until the user dismisses it.
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb index 923e745..8f8bf9df 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb
@@ -260,7 +260,7 @@ <translation id="6992289844737586249">साइटों को अपने माइक्रोफ़ोन का इस्तेमाल करने देने से पहले अनुमति लेना ज़रूरी बनाएं (सुझाया गया)</translation> <translation id="7000754031042624318">Android सेटिंग में बंद कर दिया गया है</translation> <translation id="7016516562562142042">मौजूदा सर्च इंजन के लिए अनुमति दी गई है</translation> -<translation id="702463548815491781">उस समय के लिए सुझाया गया जब 'टॉकबैक' या 'ऐक्सेस करने का तरीका बदलें' चालू हों</translation> +<translation id="702463548815491781">उस समय के लिए सुझाया गया जब 'TalkBack' या 'ऐक्सेस करने का तरीका बदलें' चालू हों</translation> <translation id="7053983685419859001">ब्लॉक करें</translation> <translation id="7066151586745993502">{NUM_SELECTED,plural, =1{1 चुना गया}one{# चुने गए}other{# चुने गए}}</translation> <translation id="7087918508125750058"><ph name="ITEM_COUNT" /> चुने गए. विकल्प, स्क्रीन के ऊपरी भाग के पास उपलब्ध हैं</translation>
diff --git a/components/enterprise/content/clipboard_restriction_service.cc b/components/enterprise/content/clipboard_restriction_service.cc index cd87f4e..ad34c6b 100644 --- a/components/enterprise/content/clipboard_restriction_service.cc +++ b/components/enterprise/content/clipboard_restriction_service.cc
@@ -83,11 +83,6 @@ enable_url_matcher_ = std::make_unique<url_matcher::URLMatcher>(); disable_url_matcher_ = std::make_unique<url_matcher::URLMatcher>(); - // Convert the `base::Value`s to `base::ListValue`s because that's what - // AddFilters expects. - const base::ListValue* enable_list = &base::Value::AsListValue(*enable); - const base::ListValue* disable_list = &base::Value::AsListValue(*disable); - // For the following 2 calls, the second param is a bool called `allow`. In // this context, we're not concerned about a URL being "allowed" or not, but // rather with this prevention feature being enabled on a given URL. Because @@ -98,9 +93,9 @@ // same policy format as the content analysis connector, which also has // "enable" and "disable" lists used in this way. url_matcher::util::AddFilters(enable_url_matcher_.get(), true, &next_id_, - enable_list); + enable->GetList()); url_matcher::util::AddFilters(disable_url_matcher_.get(), false, &next_id_, - disable_list); + disable->GetList()); absl::optional<int> min_data_size = settings->FindIntKey( enterprise::content::kCopyPreventionSettingsMinDataSizeFieldName); @@ -140,4 +135,4 @@ KeyedService* ClipboardRestrictionServiceFactory::BuildServiceInstanceFor( content::BrowserContext* context) const { return new ClipboardRestrictionService(user_prefs::UserPrefs::Get(context)); -} \ No newline at end of file +}
diff --git a/components/exo/pointer.cc b/components/exo/pointer.cc index 008a4ef7..2ce7607 100644 --- a/components/exo/pointer.cc +++ b/components/exo/pointer.cc
@@ -486,13 +486,8 @@ if (event->type() == ui::ET_MOUSE_CAPTURE_CHANGED) return; - Surface* target = GetEffectiveTargetForEvent(event); - gfx::PointF location_in_target = event->location_f(); - if (target) { - aura::Window::ConvertPointToTarget( - static_cast<aura::Window*>(event->target()), target->window(), - &location_in_target); - } + gfx::PointF location_in_target; + Surface* target = GetEffectiveTargetForEvent(event, &location_in_target); // Update focus if target is different than the current pointer focus. if (target != focus_surface_) @@ -733,6 +728,8 @@ // DragDropController::PerformDrop() can result in the DropTargetEvent::target // being destroyed. Verify whether this is the case, and adapt the event. + // This must be tested before `GetEffectiveTargetForEvent` which may pick the + // capture window. // // TODO(https://crbug.com/1160925): Avoid nested RunLoop in exo // DataDevice::GetDropCallback() - remove the block below when it is fixed. @@ -742,10 +739,10 @@ return; } - auto* target_window = ash::window_util::GetEventHandlerForEvent(event); - auto* surface = Surface::AsSurface(target_window); - if (surface) - SetFocus(surface, event.location_f(), /*button_flags=*/0); + gfx::PointF location_in_target; + auto* target = GetEffectiveTargetForEvent(&event, &location_in_target); + if (target) + SetFocus(target, location_in_target, /*button_flags=*/0); #endif } @@ -800,21 +797,32 @@ // Pointer, private: Surface* Pointer::GetEffectiveTargetForEvent( - const ui::LocatedEvent* event) const { - if (capture_window_) - return Surface::AsSurface(capture_window_); + const ui::LocatedEvent* event, + gfx::PointF* location_in_target) const { + DCHECK(location_in_target); + Surface* target = nullptr; + if (capture_window_) { + target = Surface::AsSurface(capture_window_); + } else { + target = GetTargetSurfaceForLocatedEvent(event); - Surface* target = GetTargetSurfaceForLocatedEvent(event); + if (!target || !delegate_->CanAcceptPointerEventsForSurface(target)) + return nullptr; + } - if (!target) - return nullptr; - - return delegate_->CanAcceptPointerEventsForSurface(target) ? target : nullptr; + if (target) { + *location_in_target = event->location_f(); + aura::Window::ConvertPointToTarget( + static_cast<aura::Window*>(event->target()), target->window(), + location_in_target); + } + return target; } void Pointer::SetFocus(Surface* surface, const gfx::PointF& location, int button_flags) { + DCHECK(!surface || delegate_->CanAcceptPointerEventsForSurface(surface)); // First generate a leave event if we currently have a target in focus. if (focus_surface_) { delegate_->OnPointerLeave(focus_surface_);
diff --git a/components/exo/pointer.h b/components/exo/pointer.h index 55ea1c136..187d5f9 100644 --- a/components/exo/pointer.h +++ b/components/exo/pointer.h
@@ -150,8 +150,10 @@ // Remove the currently active pointer capture (if there is one). void DisablePointerCapture(); - // Returns the effective target for |event|. - Surface* GetEffectiveTargetForEvent(const ui::LocatedEvent* event) const; + // Returns the effective target for |event| and the event's location converted + // to the target's coordinates. + Surface* GetEffectiveTargetForEvent(const ui::LocatedEvent* event, + gfx::PointF* location_in_target) const; // Change pointer focus to |surface|. void SetFocus(Surface* surface,
diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/RedirectHandler.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/RedirectHandler.java index 1440998..ab073fc 100644 --- a/components/external_intents/android/java/src/org/chromium/components/external_intents/RedirectHandler.java +++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/RedirectHandler.java
@@ -67,8 +67,31 @@ } } - private class NavigationState { - final int mInitialNavigationType; + /** + * Captures the state of the initial navigation in a Navigation Chain. + */ + public class InitialNavigationState { + public final boolean isRendererInitiated; + public final boolean hasUserGesture; + public final boolean isFromReload; + public final boolean isFromTyping; + public final boolean isFromFormSubmit; + public final boolean isFromIntent; + + public InitialNavigationState(boolean isRendererInitiated, boolean hasUserGesture, + boolean isFromReload, boolean isFromTyping, boolean isFromFormSubmit, + boolean isFromIntent) { + this.isRendererInitiated = isRendererInitiated; + this.hasUserGesture = hasUserGesture; + this.isFromReload = isFromReload; + this.isFromTyping = isFromTyping; + this.isFromFormSubmit = isFromFormSubmit; + this.isFromIntent = isFromIntent; + } + } + + private class NavigationChainState { + private final int mInitialNavigationType; final boolean mHasUserStartedNonInitialNavigation; boolean mIsOnFirstLoadInChain = true; boolean mShouldNotOverrideUrlLoadingOnCurrentNavigationChain; @@ -76,19 +99,41 @@ // TODO(https://crbug.com/1286053): Plumb through the user activation time from blink. final long mNavigationChainStartTime = currentRealtime(); boolean mUsedBackOrForward; + private final InitialNavigationState mInitialNavigationState; - NavigationState(int initialNavigationType, boolean hasUserStartedNonInitialNavigation) { + NavigationChainState( + int initialNavigationType, boolean hasUserStartedNonInitialNavigation) { + assert !isRefactoringEnabled(); mInitialNavigationType = initialNavigationType; mHasUserStartedNonInitialNavigation = hasUserStartedNonInitialNavigation; + mInitialNavigationState = null; + } + + NavigationChainState(boolean hasUserStartedNonInitialNavigation, + InitialNavigationState initialNavigationChainState) { + assert isRefactoringEnabled(); + mHasUserStartedNonInitialNavigation = hasUserStartedNonInitialNavigation; + mInitialNavigationState = initialNavigationChainState; + mInitialNavigationType = 0; + } + + int getInitialNavigationType() { + assert !isRefactoringEnabled(); + return mInitialNavigationType; + } + + InitialNavigationState getInitialNavigationState() { + assert isRefactoringEnabled(); + return mInitialNavigationState; } } private long mLastNewUrlLoadingTime = INVALID_TIME; private IntentState mIntentState; - private NavigationState mNavigationState; + private NavigationChainState mNavigationChainState; - // Not part of NavigationState as this should persist through resetting of the NavigationChain - // so that the history state can be correctly set even after the tab is hidden. + // Not part of NavigationChainState as this should persist through resetting of the + // NavigationChain so that the history state can be correctly set even after the tab is hidden. private int mLastCommittedEntryIndexBeforeStartingNavigation = INVALID_ENTRY_INDEX; private long mLastUserInteractionTimeMillis; @@ -143,7 +188,7 @@ */ public void clear() { mIntentState = null; - mNavigationState = null; + mNavigationChainState = null; } /** @@ -151,7 +196,7 @@ * occurs. */ public void setShouldNotOverrideUrlLoadingOnCurrentRedirectChain() { - mNavigationState.mShouldNotOverrideUrlLoadingOnCurrentNavigationChain = true; + mNavigationChainState.mShouldNotOverrideUrlLoadingOnCurrentNavigationChain = true; } /** @@ -159,7 +204,7 @@ * a new user-initiated navigation occurs. */ public void setShouldNotBlockUrlLoadingOverrideOnCurrentRedirectionChain() { - mNavigationState.mShouldNotBlockOverrideUrlLoadingOnCurrentNavigationChain = true; + mNavigationChainState.mShouldNotBlockOverrideUrlLoadingOnCurrentNavigationChain = true; } /** @@ -201,12 +246,14 @@ // chain. Server redirects are also part of the same navigation chain. boolean isSameNavigationChain = isRedirect || (isRendererInitiated && !hasUserGesture); - if (mNavigationState != null && isSameNavigationChain) { - updateNavigationState(pageTransType); + if (mNavigationChainState != null && isSameNavigationChain) { + updateNavigationChainState(pageTransType); } else { - resetNavigationState(pageTransType, hasUserGesture, lastCommittedEntryIndex, - isInitialNavigation); + resetNavigationChainState(pageTransType, hasUserGesture, lastCommittedEntryIndex, + isInitialNavigation, isRendererInitiated); } + boolean isBackOrForward = (pageTransType & PageTransition.FORWARD_BACK) != 0; + if (isBackOrForward) mNavigationChainState.mUsedBackOrForward = true; } else { updateNewUrlLoadingOldVersion(pageTransType, isRedirect, hasUserGesture, lastUserInteractionTime, lastCommittedEntryIndex, isInitialNavigation, @@ -222,7 +269,7 @@ int pageTransitionCore = pageTransType & PageTransition.CORE_MASK; - boolean isNewLoadingStartedByUser = mNavigationState == null; + boolean isNewLoadingStartedByUser = mNavigationChainState == null; boolean isFromIntent = (pageTransType & PageTransition.FROM_API) != 0; if (!isRedirect) { if ((pageTransType & PageTransition.FORWARD_BACK) != 0) { @@ -236,11 +283,11 @@ } } if (!isNewLoadingStartedByUser) { - mNavigationState.mIsOnFirstLoadInChain = false; + mNavigationChainState.mIsOnFirstLoadInChain = false; return; } - // Create the NavigationState for a new Navigation chain. + // Create the NavigationChainState for a new Navigation chain. int initialNavigationType; if (isFromIntent && mIntentState != null) { initialNavigationType = NAVIGATION_TYPE_FROM_INTENT; @@ -257,39 +304,32 @@ initialNavigationType = NAVIGATION_TYPE_OTHER; } } - mNavigationState = new NavigationState(initialNavigationType, !isInitialNavigation); + mNavigationChainState = + new NavigationChainState(initialNavigationType, !isInitialNavigation); mLastCommittedEntryIndexBeforeStartingNavigation = lastCommittedEntryIndex; } - private void updateNavigationState(int pageTransType) { - mNavigationState.mIsOnFirstLoadInChain = false; - - boolean isBackOrForward = (pageTransType & PageTransition.FORWARD_BACK) != 0; - if (isBackOrForward) mNavigationState.mUsedBackOrForward = true; + private void updateNavigationChainState(int pageTransType) { + mNavigationChainState.mIsOnFirstLoadInChain = false; } - private void resetNavigationState(int pageTransType, boolean hasUserGesture, - int lastCommittedEntryIndex, boolean isInitialNavigation) { - // Create the NavigationState for a new Navigation chain. + private void resetNavigationChainState(int pageTransType, boolean hasUserGesture, + int lastCommittedEntryIndex, boolean isInitialNavigation, boolean isRendererInitiated) { + // Create the NavigationChainState for a new Navigation chain. int pageTransitionCore = pageTransType & PageTransition.CORE_MASK; - boolean isFromIntent = (pageTransType & PageTransition.FROM_API) != 0; - boolean isBackOrForward = (pageTransType & PageTransition.FORWARD_BACK) != 0; - int initialNavigationType; - if (isFromIntent && mIntentState != null) { - initialNavigationType = NAVIGATION_TYPE_FROM_INTENT; - } else { - mIntentState = null; - if (pageTransitionCore == PageTransition.TYPED) { - initialNavigationType = NAVIGATION_TYPE_FROM_USER_TYPING; - } else if (pageTransitionCore == PageTransition.RELOAD || isBackOrForward) { - initialNavigationType = NAVIGATION_TYPE_FROM_RELOAD; - } else if (pageTransitionCore == PageTransition.LINK && !hasUserGesture) { - initialNavigationType = NAVIGATION_TYPE_FROM_LINK_WITHOUT_USER_GESTURE; - } else { - initialNavigationType = NAVIGATION_TYPE_OTHER; - } - } - mNavigationState = new NavigationState(initialNavigationType, !isInitialNavigation); + boolean isFromApi = (pageTransType & PageTransition.FROM_API) != 0; + boolean isFromIntent = isFromApi && mIntentState != null; + boolean isFromReload = pageTransitionCore == PageTransition.RELOAD; + boolean isFromTyping = pageTransitionCore == PageTransition.TYPED; + boolean isFromFormSubmit = pageTransitionCore == PageTransition.FORM_SUBMIT; + + if (!isFromIntent) mIntentState = null; + InitialNavigationState initialNavigationChainState = + new InitialNavigationState(isRendererInitiated, hasUserGesture, isFromReload, + isFromTyping, isFromFormSubmit, isFromIntent); + + mNavigationChainState = + new NavigationChainState(!isInitialNavigation, initialNavigationChainState); mLastCommittedEntryIndexBeforeStartingNavigation = lastCommittedEntryIndex; } @@ -298,8 +338,14 @@ * navigation (eg. has followed a client or server redirect). */ public boolean isOnNoninitialLoadForIntentNavigationChain() { - return mNavigationState.mInitialNavigationType == NAVIGATION_TYPE_FROM_INTENT - && !mNavigationState.mIsOnFirstLoadInChain; + if (isRefactoringEnabled()) { + return mNavigationChainState.getInitialNavigationState().isFromIntent + && !mNavigationChainState.mIsOnFirstLoadInChain; + + } else { + return mNavigationChainState.getInitialNavigationType() == NAVIGATION_TYPE_FROM_INTENT + && !mNavigationChainState.mIsOnFirstLoadInChain; + } } /** @@ -331,15 +377,31 @@ } private boolean shouldNavigationTypeStayInApp(boolean isForTrustedCallingApp) { + if (isRefactoringEnabled()) { + InitialNavigationState state = mNavigationChainState.getInitialNavigationState(); + // http://crbug.com/162106: Never leave Chrome from a refresh. + if (state.isFromReload) return true; + + // If the app we would navigate to is trusted and what launched Chrome, allow the + // navigation. + if (isForTrustedCallingApp) return false; + + // Otherwise allow navigation out of the app only with a user gesture. + // TODO(https://crbug.com/839751): Remove gesture exception for form submits. + return state.isRendererInitiated && !state.hasUserGesture && !state.isFromFormSubmit; + } + // http://crbug.com/162106: Never leave Chrome from a refresh. - if (mNavigationState.mInitialNavigationType == NAVIGATION_TYPE_FROM_RELOAD) return true; + if (mNavigationChainState.getInitialNavigationType() == NAVIGATION_TYPE_FROM_RELOAD) { + return true; + } // If the app we would navigate to is trusted and what launched Chrome, allow the // navigation. if (isForTrustedCallingApp) return false; // Otherwise allow navigation out of the app only with a user gesture. - return mNavigationState.mInitialNavigationType + return mNavigationChainState.getInitialNavigationType() == NAVIGATION_TYPE_FROM_LINK_WITHOUT_USER_GESTURE; } @@ -354,14 +416,20 @@ * @return whether navigation is from a user's typing or not. */ public boolean isNavigationFromUserTyping() { - return mNavigationState.mInitialNavigationType == NAVIGATION_TYPE_FROM_USER_TYPING; + if (isRefactoringEnabled()) { + return mNavigationChainState.getInitialNavigationState().isFromTyping; + + } else { + return mNavigationChainState.getInitialNavigationType() + == NAVIGATION_TYPE_FROM_USER_TYPING; + } } /** * @return whether we should stay in Chrome or not. */ public boolean shouldNotOverrideUrlLoading() { - return mNavigationState.mShouldNotOverrideUrlLoadingOnCurrentNavigationChain; + return mNavigationChainState.mShouldNotOverrideUrlLoadingOnCurrentNavigationChain; } /** @@ -369,8 +437,9 @@ * chain. */ public boolean getAndClearShouldNotBlockOverrideUrlLoadingOnCurrentRedirectionChain() { - boolean value = mNavigationState.mShouldNotBlockOverrideUrlLoadingOnCurrentNavigationChain; - mNavigationState.mShouldNotBlockOverrideUrlLoadingOnCurrentNavigationChain = false; + boolean value = + mNavigationChainState.mShouldNotBlockOverrideUrlLoadingOnCurrentNavigationChain; + mNavigationChainState.mShouldNotBlockOverrideUrlLoadingOnCurrentNavigationChain = false; return value; } @@ -378,7 +447,7 @@ * @return whether on navigation or not. */ public boolean isOnNavigation() { - return mNavigationState != null; + return mNavigationChainState != null; } /** @@ -393,7 +462,8 @@ * @return whether the user has started a non-initial navigation. */ public boolean hasUserStartedNonInitialNavigation() { - return mNavigationState != null && mNavigationState.mHasUserStartedNonInitialNavigation; + return mNavigationChainState != null + && mNavigationChainState.mHasUserStartedNonInitialNavigation; } /** @@ -432,25 +502,36 @@ * the user was started. */ public boolean isNavigationChainExpired() { - return currentRealtime() - mNavigationState.mNavigationChainStartTime + return currentRealtime() - mNavigationChainState.mNavigationChainStartTime > NAVIGATION_CHAIN_TIMEOUT_MILLIS; } public boolean navigationChainUsedBackOrForward() { - return mNavigationState.mUsedBackOrForward; + return mNavigationChainState.mUsedBackOrForward; + } + + public InitialNavigationState getInitialNavigationState() { + return mNavigationChainState.getInitialNavigationState(); } public void maybeLogExternalRedirectBlockedWithMissingGesture() { - if (mNavigationState.mInitialNavigationType - == NAVIGATION_TYPE_FROM_LINK_WITHOUT_USER_GESTURE) { - long millisSinceLastGesture = - SystemClock.elapsedRealtime() - mLastUserInteractionTimeMillis; - Log.w(TAG, - "External navigation blocked due to missing gesture. Last input was " - + millisSinceLastGesture + "ms ago."); - RecordHistogram.recordTimesHistogram( - "Android.Intent.BlockedExternalNavLastGestureTime", millisSinceLastGesture); + boolean shouldLog = false; + if (isRefactoringEnabled()) { + shouldLog = mNavigationChainState.getInitialNavigationState().isRendererInitiated + && !mNavigationChainState.getInitialNavigationState().hasUserGesture; + + } else { + shouldLog = mNavigationChainState.getInitialNavigationType() + == NAVIGATION_TYPE_FROM_LINK_WITHOUT_USER_GESTURE; } + if (!shouldLog) return; + long millisSinceLastGesture = + SystemClock.elapsedRealtime() - mLastUserInteractionTimeMillis; + Log.w(TAG, + "External navigation blocked due to missing gesture. Last input was " + + millisSinceLastGesture + "ms ago."); + RecordHistogram.recordTimesHistogram( + "Android.Intent.BlockedExternalNavLastGestureTime", millisSinceLastGesture); } // Facilitates simulated waiting in tests.
diff --git a/components/external_intents/android/javatests/src/org/chromium/components/external_intents/RedirectHandlerTest.java b/components/external_intents/android/javatests/src/org/chromium/components/external_intents/RedirectHandlerTest.java index b0c05b6c..be4529d7 100644 --- a/components/external_intents/android/javatests/src/org/chromium/components/external_intents/RedirectHandlerTest.java +++ b/components/external_intents/android/javatests/src/org/chromium/components/external_intents/RedirectHandlerTest.java
@@ -249,9 +249,8 @@ Assert.assertTrue(handler.isOnNavigation()); Assert.assertEquals(0, handler.getLastCommittedEntryIndexBeforeStartingNavigation()); - SystemClock.sleep(1); - handler.updateNewUrlLoading( - PageTransition.LINK, false, true, SystemClock.elapsedRealtime(), 1, false, true); + handler.updateNewUrlLoading(PageTransition.LINK, false, true, + SystemClock.elapsedRealtime() + 1, 1, false, true); Assert.assertFalse(handler.isOnNoninitialLoadForIntentNavigationChain()); Assert.assertTrue(handler.hasNewResolver( queryIntentActivities(sMoblieYtIntent), mQueryIntentFunction)); @@ -341,9 +340,8 @@ Assert.assertTrue(handler.isOnNavigation()); Assert.assertEquals(0, handler.getLastCommittedEntryIndexBeforeStartingNavigation()); - SystemClock.sleep(1); - handler.updateNewUrlLoading( - PageTransition.LINK, false, true, SystemClock.elapsedRealtime(), 2, false, true); + handler.updateNewUrlLoading(PageTransition.LINK, false, true, + SystemClock.elapsedRealtime() + 1, 2, false, true); Assert.assertFalse(handler.shouldStayInApp(false)); Assert.assertFalse(handler.shouldStayInApp(true)); @@ -467,22 +465,32 @@ long lastUserInteractionTime = SystemClock.elapsedRealtime(); handler.updateNewUrlLoading(PageTransition.FORM_SUBMIT | PageTransition.FORWARD_BACK, false, true, lastUserInteractionTime, 0, false, false); - Assert.assertTrue(handler.shouldStayInApp(false)); - Assert.assertTrue(handler.shouldStayInApp(true)); + if (RedirectHandler.isRefactoringEnabled()) { + Assert.assertTrue(handler.navigationChainUsedBackOrForward()); + } else { + Assert.assertTrue(handler.shouldStayInApp(false)); + Assert.assertTrue(handler.shouldStayInApp(true)); + } Assert.assertTrue(handler.hasUserStartedNonInitialNavigation()); handler.updateNewUrlLoading(PageTransition.LINK, false, false, lastUserInteractionTime, 1, false /* isInitialNavigation */, true); - Assert.assertTrue(handler.shouldStayInApp(false)); - Assert.assertTrue(handler.shouldStayInApp(true)); + if (RedirectHandler.isRefactoringEnabled()) { + Assert.assertTrue(handler.navigationChainUsedBackOrForward()); + } else { + Assert.assertTrue(handler.shouldStayInApp(false)); + Assert.assertTrue(handler.shouldStayInApp(true)); + } Assert.assertTrue(handler.isOnNavigation()); Assert.assertEquals(0, handler.getLastCommittedEntryIndexBeforeStartingNavigation()); Assert.assertTrue(handler.hasUserStartedNonInitialNavigation()); - SystemClock.sleep(1); - handler.updateNewUrlLoading(PageTransition.LINK, false, true, SystemClock.elapsedRealtime(), - 2, false /* isInitialNavigation */, true); + handler.updateNewUrlLoading(PageTransition.LINK, false, true, + SystemClock.elapsedRealtime() + 1, 2, false /* isInitialNavigation */, true); + if (RedirectHandler.isRefactoringEnabled()) { + Assert.assertFalse(handler.navigationChainUsedBackOrForward()); + } Assert.assertFalse(handler.shouldStayInApp(false)); Assert.assertFalse(handler.shouldStayInApp(true));
diff --git a/components/feed/core/v2/api_test/feed_api_stream_unittest.cc b/components/feed/core/v2/api_test/feed_api_stream_unittest.cc index df9fad7..2e19507 100644 --- a/components/feed/core/v2/api_test/feed_api_stream_unittest.cc +++ b/components/feed/core/v2/api_test/feed_api_stream_unittest.cc
@@ -3408,13 +3408,39 @@ refresh_scheduler_ .scheduled_run_times[RefreshTaskId::kRefreshForYouFeed]); - // Only the first view should cause the schedule to be set. + // Only a surface's first view should cause the schedule to be set. refresh_scheduler_.Clear(); stream_->ReportFeedViewed(kForYouStream, surface.GetSurfaceId()); // Zero means the scheudle wasn't updated. EXPECT_EQ(base::Seconds(0), refresh_scheduler_ .scheduled_run_times[RefreshTaskId::kRefreshForYouFeed]); + + task_environment_.AdvanceClock(base::Minutes(6)); + + // Opening another surface should cause a refresh to be scheduled. + refresh_scheduler_.Clear(); + TestForYouSurface surface2(stream_.get()); + WaitForIdleTaskQueue(); + stream_->ReportFeedViewed(kForYouStream, surface2.GetSurfaceId()); + // The schedule should have been updated. + EXPECT_EQ(base::Minutes(30), + refresh_scheduler_ + .scheduled_run_times[RefreshTaskId::kRefreshForYouFeed]); + + task_environment_.AdvanceClock(base::Minutes(6)); + + // Leaving the surface and returning should schedule a refresh. + refresh_scheduler_.Clear(); + surface.Detach(); + WaitForIdleTaskQueue(); + surface.Attach(stream_.get()); + WaitForIdleTaskQueue(); + stream_->ReportFeedViewed(kForYouStream, surface.GetSurfaceId()); + // The schedule should have been updated. + EXPECT_EQ(base::Minutes(30), + refresh_scheduler_ + .scheduled_run_times[RefreshTaskId::kRefreshForYouFeed]); } TEST_F(FeedApiTest, FeedCloseRefresh_ExistingScheduleGetsReplaced) {
diff --git a/components/feed/core/v2/feed_stream.cc b/components/feed/core/v2/feed_stream.cc index 8f050dcdb..633ec74 100644 --- a/components/feed/core/v2/feed_stream.cc +++ b/components/feed/core/v2/feed_stream.cc
@@ -1337,8 +1337,13 @@ metrics_reporter_->FeedViewed(surface_id); Stream& stream = GetStream(stream_type); - if (!stream.surfaces.HasSurfaceShowingContent()) + + // Skip feed-close refresh scheduling if this surface was already viewed. + // entry should never be null, but if it is, we will skip rescheduling. + StreamSurfaceSet::Entry* entry = stream.surfaces.FindSurface(surface_id); + if (entry && !entry->feed_viewed) ScheduleFeedCloseRefreshOnFirstView(stream_type); + stream.surfaces.FeedViewed(surface_id); MaybeNotifyHasUnreadContent(stream_type); }
diff --git a/components/feed/core/v2/prefs.cc b/components/feed/core/v2/prefs.cc index 27195f95..d1cdf158 100644 --- a/components/feed/core/v2/prefs.cc +++ b/components/feed/core/v2/prefs.cc
@@ -31,8 +31,7 @@ std::vector<int> GetThrottlerRequestCounts(PrefService& pref_service) { std::vector<int> result; const auto& value_list = - pref_service.GetList(kThrottlerRequestCountListPrefName) - ->GetListDeprecated(); + pref_service.GetValueList(kThrottlerRequestCountListPrefName); for (const base::Value& value : value_list) { result.push_back(value.is_int() ? value.GetInt() : 0); } @@ -41,13 +40,13 @@ void SetThrottlerRequestCounts(std::vector<int> request_counts, PrefService& pref_service) { - std::vector<base::Value> value_list; + base::Value::List value_list; for (int count : request_counts) { - value_list.push_back(base::Value(count)); + value_list.Append(count); } - pref_service.Set(kThrottlerRequestCountListPrefName, - base::Value(std::move(value_list))); + pref_service.SetList(kThrottlerRequestCountListPrefName, + std::move(value_list)); } base::Time GetLastRequestTime(PrefService& pref_service) { @@ -71,23 +70,23 @@ void SetRequestSchedule(RefreshTaskId task_id, const RequestSchedule& schedule, PrefService& pref_service) { - pref_service.Set(RequestSchedulePrefName(task_id), - RequestScheduleToValue(schedule)); + pref_service.SetDict(RequestSchedulePrefName(task_id), + RequestScheduleToDict(schedule)); } RequestSchedule GetRequestSchedule(RefreshTaskId task_id, PrefService& pref_service) { - return RequestScheduleFromValue( - *pref_service.Get(RequestSchedulePrefName(task_id))); + return RequestScheduleFromDict( + pref_service.GetValueDict(RequestSchedulePrefName(task_id))); } void SetPersistentMetricsData(const PersistentMetricsData& data, PrefService& pref_service) { - pref_service.Set(kMetricsData, PersistentMetricsDataToValue(data)); + pref_service.SetDict(kMetricsData, PersistentMetricsDataToDict(data)); } PersistentMetricsData GetPersistentMetricsData(PrefService& pref_service) { - return PersistentMetricsDataFromValue(*pref_service.Get(kMetricsData)); + return PersistentMetricsDataFromDict(pref_service.GetValueDict(kMetricsData)); } std::string GetClientInstanceId(PrefService& pref_service) { @@ -104,19 +103,17 @@ } void SetExperiments(const Experiments& experiments, PrefService& pref_service) { - base::Value value(base::Value::Type::DICTIONARY); + base::Value::Dict dict; for (const auto& exp : experiments) { - value.SetStringKey(exp.first, exp.second); + dict.Set(exp.first, exp.second); } - pref_service.Set(kExperiments, value); + pref_service.SetDict(kExperiments, std::move(dict)); } Experiments GetExperiments(PrefService& pref_service) { - auto* value = pref_service.Get(kExperiments); + const auto& value = pref_service.GetValueDict(kExperiments); Experiments experiments; - if (!value->is_dict()) - return experiments; - for (auto kv : value->DictItems()) { + for (auto kv : value) { experiments[kv.first] = kv.second.GetString(); } return experiments; @@ -124,8 +121,8 @@ void SetWebFeedContentOrder(PrefService& pref_service, ContentOrder content_order) { - pref_service.Set(feed::prefs::kWebFeedContentOrder, - base::Value(static_cast<int>(content_order))); + pref_service.SetInteger(feed::prefs::kWebFeedContentOrder, + static_cast<int>(content_order)); } ContentOrder GetWebFeedContentOrder(const PrefService& pref_service) {
diff --git a/components/feed/core/v2/scheduling.cc b/components/feed/core/v2/scheduling.cc index a6781655..1526df61 100644 --- a/components/feed/core/v2/scheduling.cc +++ b/components/feed/core/v2/scheduling.cc
@@ -15,19 +15,17 @@ namespace feed { namespace { -base::Value VectorToValue(const std::vector<base::TimeDelta>& values) { - base::Value result(base::Value::Type::LIST); +base::Value::List VectorToList(const std::vector<base::TimeDelta>& values) { + base::Value::List result; for (base::TimeDelta delta : values) { result.Append(base::TimeDeltaToValue(delta)); } return result; } -bool ValueToVector(const base::Value& value, - std::vector<base::TimeDelta>* result) { - if (!value.is_list()) - return false; - for (const base::Value& entry : value.GetListDeprecated()) { +bool ListToVector(const base::Value::List& value, + std::vector<base::TimeDelta>* result) { + for (const base::Value& entry : value) { absl::optional<base::TimeDelta> delta = base::ValueToTimeDelta(entry); if (!delta) return false; @@ -65,25 +63,21 @@ RequestSchedule::RequestSchedule(RequestSchedule&&) = default; RequestSchedule& RequestSchedule::operator=(RequestSchedule&&) = default; -base::Value RequestScheduleToValue(const RequestSchedule& schedule) { - base::Value result(base::Value::Type::DICTIONARY); - result.SetKey("anchor", base::TimeToValue(schedule.anchor_time)); - result.SetKey("offsets", VectorToValue(schedule.refresh_offsets)); - result.SetKey("type", base::Value(base::to_underlying(schedule.type))); +base::Value::Dict RequestScheduleToDict(const RequestSchedule& schedule) { + base::Value::Dict result; + result.Set("anchor", base::TimeToValue(schedule.anchor_time)); + result.Set("offsets", VectorToList(schedule.refresh_offsets)); + result.Set("type", base::to_underlying(schedule.type)); return result; } -RequestSchedule RequestScheduleFromValue(const base::Value& value) { - if (!value.is_dict()) - return {}; +RequestSchedule RequestScheduleFromDict(const base::Value::Dict& value) { RequestSchedule result; - absl::optional<base::Time> anchor = - base::ValueToTime(value.FindKey("anchor")); - const base::Value* offsets = - value.FindKeyOfType("offsets", base::Value::Type::LIST); - result.type = GetScheduleType(value.FindKey("type")); + absl::optional<base::Time> anchor = base::ValueToTime(value.Find("anchor")); + const base::Value::List* offsets = value.FindList("offsets"); + result.type = GetScheduleType(value.Find("type")); - if (!anchor || !offsets || !ValueToVector(*offsets, &result.refresh_offsets)) + if (!anchor || !offsets || !ListToVector(*offsets, &result.refresh_offsets)) return {}; result.anchor_time = *anchor; return result;
diff --git a/components/feed/core/v2/scheduling.h b/components/feed/core/v2/scheduling.h index 99fed1c9..97c23ff 100644 --- a/components/feed/core/v2/scheduling.h +++ b/components/feed/core/v2/scheduling.h
@@ -8,12 +8,10 @@ #include <vector> #include "base/time/time.h" +#include "base/values.h" #include "components/feed/core/v2/enums.h" #include "components/feed/core/v2/public/stream_type.h" -namespace base { -class Value; -} namespace feedstore { class Metadata; } @@ -41,8 +39,8 @@ Type type = Type::kScheduledRefresh; }; -base::Value RequestScheduleToValue(const RequestSchedule&); -RequestSchedule RequestScheduleFromValue(const base::Value&); +base::Value::Dict RequestScheduleToDict(const RequestSchedule& schedule); +RequestSchedule RequestScheduleFromDict(const base::Value::Dict& dict); // Given a schedule, returns the next time a request should be made. // Updates |schedule| accordingly. If |schedule| has no fetches remaining, // returns a scheduled time using |Config::default_background_refresh_interval|.
diff --git a/components/feed/core/v2/scheduling_unittest.cc b/components/feed/core/v2/scheduling_unittest.cc index 3eba99c..2c5fb6ab 100644 --- a/components/feed/core/v2/scheduling_unittest.cc +++ b/components/feed/core/v2/scheduling_unittest.cc
@@ -20,7 +20,7 @@ const base::Time kAnchorTime = base::Time::UnixEpoch() + base::Hours(6); const base::TimeDelta kDefaultScheduleInterval = base::Hours(24); -std::string ToJSON(const base::Value& value) { +std::string ToJSON(base::ValueView value) { std::string json; CHECK(base::JSONWriter::WriteWithOptions( value, base::JSONWriter::OPTIONS_PRETTY_PRINT, &json)); @@ -35,17 +35,17 @@ schedule.refresh_offsets = {base::Hours(1), base::Hours(6)}; schedule.type = RequestSchedule::Type::kScheduledRefresh; - const base::Value schedule_value = RequestScheduleToValue(schedule); + const base::Value::Dict schedule_dict = RequestScheduleToDict(schedule); ASSERT_EQ(R"({ "anchor": "11644495200000000", "offsets": [ "3600000000", "21600000000" ], "type": 0 } )", - ToJSON(schedule_value)); + ToJSON(schedule_dict)); RequestSchedule deserialized_schedule = - RequestScheduleFromValue(schedule_value); + RequestScheduleFromDict(schedule_dict); EXPECT_EQ(schedule.anchor_time, deserialized_schedule.anchor_time); EXPECT_EQ(schedule.refresh_offsets, deserialized_schedule.refresh_offsets); EXPECT_EQ(schedule.type, deserialized_schedule.type); @@ -57,15 +57,15 @@ schedule.refresh_offsets = {base::Hours(1), base::Hours(6)}; schedule.type = RequestSchedule::Type::kScheduledRefresh; EXPECT_EQ(RequestSchedule::Type::kScheduledRefresh, - RequestScheduleFromValue(RequestScheduleToValue(schedule)).type); + RequestScheduleFromDict(RequestScheduleToDict(schedule)).type); schedule.type = RequestSchedule::Type::kFeedCloseRefresh; - base::Value schedule_value = RequestScheduleToValue(schedule); + base::Value::Dict schedule_dict = RequestScheduleToDict(schedule); EXPECT_EQ(RequestSchedule::Type::kFeedCloseRefresh, - RequestScheduleFromValue(schedule_value).type); + RequestScheduleFromDict(schedule_dict).type); // Default to kScheduledRefresh if the type isn't valid. - schedule_value.GetDict().Set("type", -1); + schedule_dict.Set("type", -1); EXPECT_EQ(RequestSchedule::Type::kScheduledRefresh, - RequestScheduleFromValue(schedule_value).type); + RequestScheduleFromDict(schedule_dict).type); } class NextScheduledRequestTimeTest : public testing::Test {
diff --git a/components/feed/core/v2/stream/info_card_tracker.cc b/components/feed/core/v2/stream/info_card_tracker.cc index 473513c..a9422d8b 100644 --- a/components/feed/core/v2/stream/info_card_tracker.cc +++ b/components/feed/core/v2/stream/info_card_tracker.cc
@@ -160,14 +160,11 @@ std::string base64_state; base::Base64Encode(serialized_state, &base64_state); - base::Value updated_states(base::Value::Type::DICTIONARY); - const base::Value& states = profile_prefs_->GetValue(prefs::kInfoCardStates); - if (states.is_dict()) { - updated_states = states.Clone(); - } - updated_states.SetStringKey(InfoCardTypeToString(info_card_type), - base64_state); - profile_prefs_->Set(prefs::kInfoCardStates, updated_states); + const base::Value::Dict& states = + profile_prefs_->GetValueDict(prefs::kInfoCardStates); + base::Value::Dict updated_states = states.Clone(); + updated_states.Set(InfoCardTypeToString(info_card_type), base64_state); + profile_prefs_->SetDict(prefs::kInfoCardStates, std::move(updated_states)); } } // namespace feed
diff --git a/components/feed/core/v2/types.cc b/components/feed/core/v2/types.cc index 3cf6d1e..03801d8a 100644 --- a/components/feed/core/v2/types.cc +++ b/components/feed/core/v2/types.cc
@@ -155,25 +155,25 @@ DebugStreamData::DebugStreamData(const DebugStreamData&) = default; DebugStreamData& DebugStreamData::operator=(const DebugStreamData&) = default; -base::Value PersistentMetricsDataToValue(const PersistentMetricsData& data) { - base::Value dict(base::Value::Type::DICTIONARY); - dict.SetKey("day_start", base::TimeToValue(data.current_day_start)); - dict.SetKey("time_spent_in_feed", - base::TimeDeltaToValue(data.accumulated_time_spent_in_feed)); +base::Value::Dict PersistentMetricsDataToDict( + const PersistentMetricsData& data) { + base::Value::Dict dict; + dict.Set("day_start", base::TimeToValue(data.current_day_start)); + dict.Set("time_spent_in_feed", + base::TimeDeltaToValue(data.accumulated_time_spent_in_feed)); return dict; } -PersistentMetricsData PersistentMetricsDataFromValue(const base::Value& value) { +PersistentMetricsData PersistentMetricsDataFromDict( + const base::Value::Dict& dict) { PersistentMetricsData result; - if (!value.is_dict()) - return result; absl::optional<base::Time> day_start = - base::ValueToTime(value.FindKey("day_start")); + base::ValueToTime(dict.Find("day_start")); if (!day_start) return result; result.current_day_start = *day_start; absl::optional<base::TimeDelta> time_spent_in_feed = - base::ValueToTimeDelta(value.FindKey("time_spent_in_feed")); + base::ValueToTimeDelta(dict.Find("time_spent_in_feed")); if (time_spent_in_feed) { result.accumulated_time_spent_in_feed = *time_spent_in_feed; }
diff --git a/components/feed/core/v2/types.h b/components/feed/core/v2/types.h index cbca326..7b7df67 100644 --- a/components/feed/core/v2/types.h +++ b/components/feed/core/v2/types.h
@@ -70,8 +70,10 @@ base::TimeDelta accumulated_time_spent_in_feed; }; -base::Value PersistentMetricsDataToValue(const PersistentMetricsData& data); -PersistentMetricsData PersistentMetricsDataFromValue(const base::Value& value); +base::Value::Dict PersistentMetricsDataToDict( + const PersistentMetricsData& data); +PersistentMetricsData PersistentMetricsDataFromDict( + const base::Value::Dict& dict); class LoadLatencyTimes { public:
diff --git a/components/feed/core/v2/types_unittest.cc b/components/feed/core/v2/types_unittest.cc index 92c93f8d..0a84a6b 100644 --- a/components/feed/core/v2/types_unittest.cc +++ b/components/feed/core/v2/types_unittest.cc
@@ -10,7 +10,7 @@ namespace feed { namespace { -std::string ToJSON(const base::Value& value) { +std::string ToJSON(base::ValueView value) { std::string json; CHECK(base::JSONWriter::WriteWithOptions( value, base::JSONWriter::OPTIONS_PRETTY_PRINT, &json)); @@ -26,19 +26,19 @@ data.accumulated_time_spent_in_feed = base::Hours(2); data.current_day_start = base::Time::UnixEpoch(); - const base::Value serialized_value = PersistentMetricsDataToValue(data); - const PersistentMetricsData deserialized_value = - PersistentMetricsDataFromValue(serialized_value); + const base::Value::Dict serialized_dict = PersistentMetricsDataToDict(data); + const PersistentMetricsData deserialized_dict = + PersistentMetricsDataFromDict(serialized_dict); EXPECT_EQ(R"({ "day_start": "11644473600000000", "time_spent_in_feed": "7200000000" } )", - ToJSON(serialized_value)); + ToJSON(serialized_dict)); EXPECT_EQ(data.accumulated_time_spent_in_feed, - deserialized_value.accumulated_time_spent_in_feed); - EXPECT_EQ(data.current_day_start, deserialized_value.current_day_start); + deserialized_dict.accumulated_time_spent_in_feed); + EXPECT_EQ(data.current_day_start, deserialized_dict.current_day_start); } TEST(Types, ToContentRevision) {
diff --git a/components/feed/core/v2/user_actions_collector.cc b/components/feed/core/v2/user_actions_collector.cc index 0f0af43d..38009d1 100644 --- a/components/feed/core/v2/user_actions_collector.cc +++ b/components/feed/core/v2/user_actions_collector.cc
@@ -43,8 +43,7 @@ // TODO: Hook up to browser clearing data delegate so we clear the pref when // user clears data from Chrome settings. UserActionsCollector::UserActionsCollector(PrefService* profile_prefs) - : visit_metadata_string_list_pref_(base::Value::Type::LIST), - profile_prefs_(profile_prefs) { + : profile_prefs_(profile_prefs) { if (!base::FeatureList::IsEnabled(kPersonalizeFeedUnsignedUsers)) return; InitStoreFromPrefs(); @@ -63,8 +62,8 @@ visit_metadata_string_list_pref_.Append(EntryToString(url, entity_mids)); - profile_prefs_->Set(prefs::kFeedOnDeviceUserActionsCollector, - visit_metadata_string_list_pref_); + profile_prefs_->SetList(prefs::kFeedOnDeviceUserActionsCollector, + visit_metadata_string_list_pref_.Clone()); profile_prefs_->SchedulePendingLossyWrites(); UMA_HISTOGRAM_COUNTS( "ContentSuggestions.Feed.UnsignedUserPersonalization.LinkClicked", 1); @@ -112,8 +111,8 @@ count_values_during_store_initialization); if (rewrite_prefs) { - profile_prefs_->Set(prefs::kFeedOnDeviceUserActionsCollector, - visit_metadata_string_list_pref_); + profile_prefs_->SetList(prefs::kFeedOnDeviceUserActionsCollector, + visit_metadata_string_list_pref_.Clone()); profile_prefs_->SchedulePendingLossyWrites(); } }
diff --git a/components/feed/core/v2/user_actions_collector.h b/components/feed/core/v2/user_actions_collector.h index df76d6483..e757b1e5 100644 --- a/components/feed/core/v2/user_actions_collector.h +++ b/components/feed/core/v2/user_actions_collector.h
@@ -25,7 +25,7 @@ void UpdateUserProfileOnLinkClick(const GURL& url, const std::vector<int64_t>& entity_mids); - const base::Value& visit_metadata_string_list_pref_for_testing() const { + const base::Value::List& visit_metadata_string_list_pref_for_testing() const { return visit_metadata_string_list_pref_; } @@ -43,7 +43,7 @@ const std::string& visit_metadata_serialized) const; // Current prefs on the disk. The list is sorted by increasing timestamp. - base::Value visit_metadata_string_list_pref_; + base::Value::List visit_metadata_string_list_pref_; raw_ptr<PrefService> profile_prefs_ = nullptr; };
diff --git a/components/feed/core/v2/user_actions_collector_unittest.cc b/components/feed/core/v2/user_actions_collector_unittest.cc index d169965..2fe7e10 100644 --- a/components/feed/core/v2/user_actions_collector_unittest.cc +++ b/components/feed/core/v2/user_actions_collector_unittest.cc
@@ -88,11 +88,11 @@ "CountValuesDuringStoreInitialization", 1, 1); - const base::Value& list_value = + const base::Value::List& list_value = user_actions_collector_->visit_metadata_string_list_pref_for_testing(); - ASSERT_EQ(1u, list_value.GetList().size()); + ASSERT_EQ(1u, list_value.size()); - const auto& entry = list_value.GetList().front(); + const auto& entry = list_value.front(); std::string base64_decoded; ASSERT_TRUE(base::Base64Decode(entry.GetString(), &base64_decoded)); @@ -242,13 +242,13 @@ "CountValuesDuringStoreInitialization", GetFeedConfig().max_url_entries_in_cache, 1); - const base::Value& list_value = + const base::Value::List& list_value = user_actions_collector_->visit_metadata_string_list_pref_for_testing(); // First |count_entries| entries (with mid from 0 to |count_entries|-1) should // be dropped. long expected_mid = count_entries; - for (const base::Value& entry : list_value.GetList()) { + for (const base::Value& entry : list_value) { std::string base64_decoded; ASSERT_TRUE(base::Base64Decode(entry.GetString(), &base64_decoded)); feedunsignedpersonalizationstore::VisitMetadata entry_proto; @@ -282,12 +282,12 @@ "CountValuesDuringStoreInitialization", 1, 1); - const base::Value& list_value = + const base::Value::List& list_value = user_actions_collector_->visit_metadata_string_list_pref_for_testing(); - ASSERT_EQ(1u, list_value.GetList().size()); + ASSERT_EQ(1u, list_value.size()); - const auto& entry = list_value.GetList().front(); + const auto& entry = list_value.front(); std::string base64_decoded; ASSERT_TRUE(base::Base64Decode(entry.GetString(), &base64_decoded));
diff --git a/components/guest_view/browser/guest_view_base.cc b/components/guest_view/browser/guest_view_base.cc index 033264f9..8cdfc3e 100644 --- a/components/guest_view/browser/guest_view_base.cc +++ b/components/guest_view/browser/guest_view_base.cc
@@ -522,8 +522,14 @@ web_contents()->ResumeLoadingCreatedWebContents(); + // Since this inner WebContents is created from the browser side we do + // not have RemoteFrame mojo channels so we pass in + // NullAssociatedRemote/Receivers. New channels will be bound when the + // `CreateFrameProxy` IPC is sent. owner_web_contents_->AttachInnerWebContents( base::WrapUnique<WebContents>(web_contents()), outer_contents_frame, + /*remote_frame=*/mojo::NullAssociatedRemote(), + /*remote_frame_host_receiver=*/mojo::NullAssociatedReceiver(), is_full_page_plugin); // We don't ACK until after AttachToOuterWebContentsFrame, so that // |outer_contents_frame| gets swapped before the AttachToEmbedderFrame
diff --git a/components/invalidation/impl/invalidator_registrar_with_memory.cc b/components/invalidation/impl/invalidator_registrar_with_memory.cc index e470156..51a5692b 100644 --- a/components/invalidation/impl/invalidator_registrar_with_memory.cc +++ b/components/invalidation/impl/invalidator_registrar_with_memory.cc
@@ -123,8 +123,8 @@ if (migrate_old_prefs) { MigratePrefs(prefs_, sender_id_); } - const base::Value* pref_data = - prefs_->Get(kTopicsToHandler)->FindDictKey(sender_id_); + const base::Value::Dict* pref_data = + prefs_->GetValueDict(kTopicsToHandler).FindDict(sender_id_); if (!pref_data) { DictionaryPrefUpdate update(prefs_, kTopicsToHandler); update->SetKey(sender_id_, base::Value(base::Value::Type::DICTIONARY)); @@ -133,7 +133,7 @@ // Restore |handler_name_to_subscribed_topics_map_| from prefs. if (!base::FeatureList::IsEnabled(kRestoreInterestingTopicsFeature)) return; - for (auto it : pref_data->DictItems()) { + for (auto it : *pref_data) { const std::string& topic_name = it.first; if (it.second.is_dict()) { const std::string* handler = it.second.FindStringKey(kHandler);
diff --git a/components/omnibox/browser/local_history_zero_suggest_provider.cc b/components/omnibox/browser/local_history_zero_suggest_provider.cc index a549d50..165a4a92 100644 --- a/components/omnibox/browser/local_history_zero_suggest_provider.cc +++ b/components/omnibox/browser/local_history_zero_suggest_provider.cc
@@ -39,16 +39,7 @@ #include "components/search_engines/template_url_service.h" #include "url/gurl.h" -using metrics::OmniboxEventProto; - -// Default relevance for the LocalHistoryZeroSuggestProvider query suggestions -// for authenticated and unauthenticated scenarios respectively. These values -// are chosen to place local history zero-prefix suggestions below server -// provided zps when the user is signed in (e.g., pSuggest) and above server -// provided zps when the user is signed out (e.g., trending). -// Server provided relevance for zps is expected to range from 550-1400. -const int kLocalHistoryZPSAuthenticatedRelevance = 500; -const int kLocalHistoryZPSUnauthenticatedRelevance = 1450; +using metrics::OmniboxInputType; namespace { @@ -75,7 +66,7 @@ // Allow local history query suggestions only when the omnibox is empty and is // focused from the NTP. if (input.focus_type() == OmniboxFocusType::DEFAULT || - input.type() != metrics::OmniboxInputType::EMPTY || + input.type() != OmniboxInputType::EMPTY || !BaseSearchProvider::IsNTPPage(input.current_page_classification())) { return false; } @@ -234,9 +225,8 @@ } RecordDBMetrics(db_query_time, results.size()); - int relevance = client_->IsAuthenticated() - ? kLocalHistoryZPSAuthenticatedRelevance - : kLocalHistoryZPSUnauthenticatedRelevance; + int relevance = + OmniboxFieldTrial::kLocalHistoryZeroSuggestRelevanceScore.Get(); for (const auto& result : results) { SearchSuggestionParser::SuggestResult suggestion( /*suggestion=*/result->normalized_term,
diff --git a/components/omnibox/browser/local_history_zero_suggest_provider.h b/components/omnibox/browser/local_history_zero_suggest_provider.h index 7633e7d..cca3185 100644 --- a/components/omnibox/browser/local_history_zero_suggest_provider.h +++ b/components/omnibox/browser/local_history_zero_suggest_provider.h
@@ -20,9 +20,6 @@ class QueryResults; } // namespace history -extern const int kLocalHistoryZPSAuthenticatedRelevance; -extern const int kLocalHistoryZPSUnauthenticatedRelevance; - // Autocomplete provider for on-focus zero-prefix query suggestions from local // history when Google is the default search engine. class LocalHistoryZeroSuggestProvider : public AutocompleteProvider {
diff --git a/components/omnibox/browser/local_history_zero_suggest_provider_unittest.cc b/components/omnibox/browser/local_history_zero_suggest_provider_unittest.cc index 416a4d6..68b12705 100644 --- a/components/omnibox/browser/local_history_zero_suggest_provider_unittest.cc +++ b/components/omnibox/browser/local_history_zero_suggest_provider_unittest.cc
@@ -38,6 +38,7 @@ using base::Time; using OmniboxFieldTrial::GetLocalHistoryZeroSuggestAgeThreshold; +using OmniboxFieldTrial::kLocalHistoryZeroSuggestRelevanceScore; namespace { @@ -273,7 +274,8 @@ "Omnibox.LocalHistoryZeroSuggest.SearchTermsExtractionTime", 0); StartProviderAndWaitUntilDone(); - ExpectMatches({{"hello world", kLocalHistoryZPSUnauthenticatedRelevance}}); + ExpectMatches( + {{"hello world", kLocalHistoryZeroSuggestRelevanceScore.Get()}}); // Following histograms should be logged when zero-prefix suggestions are // allowed and the keyword search terms database is queried. @@ -304,7 +306,8 @@ ExpectMatches({}); StartProviderAndWaitUntilDone(); - ExpectMatches({{"hello world", kLocalHistoryZPSUnauthenticatedRelevance}}); + ExpectMatches( + {{"hello world", kLocalHistoryZeroSuggestRelevanceScore.Get()}}); } // Tests that suggestions are returned only if FeatureFlags is configured @@ -318,7 +321,8 @@ // on Desktop and Android NTP. scoped_feature_list_ = std::make_unique<base::test::ScopedFeatureList>(); StartProviderAndWaitUntilDone(); - ExpectMatches({{"hello world", kLocalHistoryZPSUnauthenticatedRelevance}}); + ExpectMatches( + {{"hello world", kLocalHistoryZeroSuggestRelevanceScore.Get()}}); } // Tests that search terms are extracted from the default search provider's @@ -333,7 +337,8 @@ }); StartProviderAndWaitUntilDone(); - ExpectMatches({{"hello world", kLocalHistoryZPSUnauthenticatedRelevance}}); + ExpectMatches( + {{"hello world", kLocalHistoryZeroSuggestRelevanceScore.Get()}}); template_url_service->SetUserSelectedDefaultSearchProvider( other_search_provider); @@ -364,8 +369,8 @@ StartProviderAndWaitUntilDone(); ExpectMatches( - {{"سلام دنیا", kLocalHistoryZPSUnauthenticatedRelevance}, - {"hello world", kLocalHistoryZPSUnauthenticatedRelevance - 1}}); + {{"سلام دنیا", kLocalHistoryZeroSuggestRelevanceScore.Get()}, + {"hello world", kLocalHistoryZeroSuggestRelevanceScore.Get() - 1}}); } // Tests that the suggestions are ranked correctly. @@ -391,8 +396,9 @@ // More recent searches are ranked higher when searches are just as frequent. StartProviderAndWaitUntilDone(); ExpectMatches( - {{"more recent search", kLocalHistoryZPSUnauthenticatedRelevance}, - {"less recent search", kLocalHistoryZPSUnauthenticatedRelevance - 1}}); + {{"more recent search", kLocalHistoryZeroSuggestRelevanceScore.Get()}, + {"less recent search", + kLocalHistoryZeroSuggestRelevanceScore.Get() - 1}}); // More frequent searches are ranked higher when searches are nearly as old. LoadURLs({ @@ -403,8 +409,9 @@ StartProviderAndWaitUntilDone(); ExpectMatches( - {{"less recent search", kLocalHistoryZPSUnauthenticatedRelevance}, - {"more recent search", kLocalHistoryZPSUnauthenticatedRelevance - 1}}); + {{"less recent search", kLocalHistoryZeroSuggestRelevanceScore.Get()}, + {"more recent search", + kLocalHistoryZeroSuggestRelevanceScore.Get() - 1}}); } // Tests that suggestions are created from fresh search histories only. @@ -420,7 +427,8 @@ // With the new age threshold, one of the two searches qualifies as a // suggestion. With the old threshold, neither would have. StartProviderAndWaitUntilDone(); - ExpectMatches({{"fresh search", kLocalHistoryZPSUnauthenticatedRelevance}}); + ExpectMatches( + {{"fresh search", kLocalHistoryZeroSuggestRelevanceScore.Get()}}); } // Tests that the provider supports deletion of matches. @@ -443,9 +451,9 @@ }); StartProviderAndWaitUntilDone(); - ExpectMatches( - {{"hello world", kLocalHistoryZPSUnauthenticatedRelevance}, - {"not to be deleted", kLocalHistoryZPSUnauthenticatedRelevance - 1}}); + ExpectMatches({{"hello world", kLocalHistoryZeroSuggestRelevanceScore.Get()}, + {"not to be deleted", + kLocalHistoryZeroSuggestRelevanceScore.Get() - 1}}); // The keyword search terms database should be queried for the search terms // submitted to the default search provider only; which are 2 unique @@ -465,12 +473,12 @@ // Make sure the deletion takes effect immediately in the provider before the // history service asynchronously performs the deletion or even before the // provider is started again. - ExpectMatches( - {{"not to be deleted", kLocalHistoryZPSUnauthenticatedRelevance - 1}}); + ExpectMatches({{"not to be deleted", + kLocalHistoryZeroSuggestRelevanceScore.Get() - 1}}); StartProviderAndWaitUntilDone(); ExpectMatches( - {{"not to be deleted", kLocalHistoryZPSUnauthenticatedRelevance}}); + {{"not to be deleted", kLocalHistoryZeroSuggestRelevanceScore.Get()}}); // Wait until the history service performs the deletion. WaitForHistoryService(); @@ -482,7 +490,7 @@ StartProviderAndWaitUntilDone(); ExpectMatches( - {{"not to be deleted", kLocalHistoryZPSUnauthenticatedRelevance}}); + {{"not to be deleted", kLocalHistoryZeroSuggestRelevanceScore.Get()}}); // Make sure all the search terms for the default search provider that would // produce the deleted match are deleted.
diff --git a/components/omnibox/browser/most_visited_sites_provider.cc b/components/omnibox/browser/most_visited_sites_provider.cc index 60e60d7..3d20255 100644 --- a/components/omnibox/browser/most_visited_sites_provider.cc +++ b/components/omnibox/browser/most_visited_sites_provider.cc
@@ -150,6 +150,12 @@ } done_ = false; + + // TODO(ender): Relocate this to StartPrefetch() when additional prefetch + // contexts are available. + // TopSites updates itself after a delay. To ensure up-to-date results, + // force an update now. + top_sites->SyncWithHistory(); top_sites->GetMostVisitedURLs( base::BindRepeating(&MostVisitedSitesProvider::OnMostVisitedUrlsAvailable, request_weak_ptr_factory_.GetWeakPtr())); @@ -167,6 +173,13 @@ AutocompleteProviderListener* listener) : AutocompleteProvider(TYPE_MOST_VISITED_SITES), client_{client} { AddListener(listener); + + // TopSites updates itself after a delay. To ensure up-to-date results, + // force an update now. + scoped_refptr<history::TopSites> top_sites = client_->GetTopSites(); + if (top_sites) { + top_sites->SyncWithHistory(); + } } MostVisitedSitesProvider::~MostVisitedSitesProvider() = default;
diff --git a/components/omnibox/browser/omnibox_field_trial.cc b/components/omnibox/browser/omnibox_field_trial.cc index 79ef929..b9d1dd3 100644 --- a/components/omnibox/browser/omnibox_field_trial.cc +++ b/components/omnibox/browser/omnibox_field_trial.cc
@@ -864,7 +864,15 @@ return base::FeatureList::IsEnabled(omnibox::kShortcutExpanding); } -// Local history zero-prefix (aka zero-suggest) and prefix suggestions. +// Local history zero-prefix (aka zero-suggest) and prefix suggestions: + +// The relevance score for remote zero-suggest ranges from 550-1400. A default +// value of 500 places local history zero-suggest below the remote zero-suggest. +const base::FeatureParam<int> kLocalHistoryZeroSuggestRelevanceScore( + &omnibox::kAdjustLocalHistoryZeroSuggestRelevanceScore, + "LocalHistoryZeroSuggestRelevanceScore", + 500); + const base::FeatureParam<bool> kZeroSuggestIgnoreDuplicateVisits( &omnibox::kLocalHistorySuggestRevamp, "ZeroSuggestIgnoreDuplicateVisits",
diff --git a/components/omnibox/browser/omnibox_field_trial.h b/components/omnibox/browser/omnibox_field_trial.h index 93e781a..56d6e69be 100644 --- a/components/omnibox/browser/omnibox_field_trial.h +++ b/components/omnibox/browser/omnibox_field_trial.h
@@ -518,6 +518,9 @@ // Shortcut Expanding. bool IsShortcutExpandingEnabled(); +// Determines the relevance score for the local history zero-prefix suggestions. +extern const base::FeatureParam<int> kLocalHistoryZeroSuggestRelevanceScore; + // Whether duplicative visits should be ignored for local history zero-suggest. // A duplicative visit is a visit to the same search term in an interval smaller // than kAutocompleteDuplicateVisitIntervalThreshold.
diff --git a/components/omnibox/common/omnibox_features.cc b/components/omnibox/common/omnibox_features.cc index eb8130428..146ca7c6a 100644 --- a/components/omnibox/common/omnibox_features.cc +++ b/components/omnibox/common/omnibox_features.cc
@@ -89,6 +89,13 @@ const base::Feature kDynamicMaxAutocomplete{"OmniboxDynamicMaxAutocomplete", enabled_by_default_desktop_android}; +// Used to adjust the relevance for the local history zero-prefix suggestions. +// If enabled, the relevance is determined by this feature's companion +// parameter, OmniboxFieldTrial::kLocalHistoryZeroSuggestRelevanceScore. +const base::Feature kAdjustLocalHistoryZeroSuggestRelevanceScore{ + "AdjustLocalHistoryZeroSuggestRelevanceScore", + base::FEATURE_DISABLED_BY_DEFAULT}; + // Enable on-clobber (i.e., when the user clears the whole omnibox text) // zero-prefix suggestions on the Open Web, that are contextual to the current // URL. Will only work if user is signed-in and syncing, or is otherwise @@ -275,6 +282,11 @@ const base::Feature kOmniboxFuzzyUrlSuggestions{ "OmniboxFuzzyUrlSuggestions", base::FEATURE_DISABLED_BY_DEFAULT}; +// Feature used to remove the chevron on the right side of suggestion list +// header under omnibox. +const base::Feature kOmniboxRemoveSuggestionHeaderChevron{ + "OmniboxRemoveSuggestionHeaderChevron", base::FEATURE_DISABLED_BY_DEFAULT}; + // Feature to enable memoizing URLs when replacing search terms in // `AutocompleteMatch::GURLToStrippedGURL()`. const base::Feature kStrippedGurlOptimization{
diff --git a/components/omnibox/common/omnibox_features.h b/components/omnibox/common/omnibox_features.h index 923d10c8..8bf3b12 100644 --- a/components/omnibox/common/omnibox_features.h +++ b/components/omnibox/common/omnibox_features.h
@@ -36,6 +36,7 @@ extern const base::Feature kRetainSuggestionsWithHeaders; // Local history zero-prefix (aka zero-suggest) and prefix suggestions. +extern const base::Feature kAdjustLocalHistoryZeroSuggestRelevanceScore; extern const base::Feature kClobberTriggersContextualWebZeroSuggest; extern const base::Feature kClobberTriggersSRPZeroSuggest; extern const base::Feature kFocusTriggersContextualWebZeroSuggest; @@ -79,6 +80,7 @@ extern const base::Feature kNtpRealboxSuggestionAnswers; extern const base::Feature kNtpRealboxTailSuggest; extern const base::Feature kOmniboxFuzzyUrlSuggestions; +extern const base::Feature kOmniboxRemoveSuggestionHeaderChevron; extern const base::Feature kStrippedGurlOptimization; // Omnibox UI - these affect the UI or function of the location bar (not the
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentAppFinder.java b/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentAppFinder.java index 3bdd070d..68f7692 100644 --- a/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentAppFinder.java +++ b/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentAppFinder.java
@@ -14,6 +14,7 @@ import androidx.annotation.VisibleForTesting; import org.chromium.base.Log; +import org.chromium.base.metrics.RecordHistogram; import org.chromium.components.payments.PaymentManifestVerifier.ManifestVerifyCallback; import org.chromium.components.payments.intent.WebPaymentIntentHelper; import org.chromium.payments.mojom.PaymentDetailsModifier; @@ -391,6 +392,14 @@ } urlMethodToSupportedOriginsMapping.get(supportedUrlMethod).add(appOrigin); } + + // Record the total number of payment methods that this activity `ResolveInfo app` + // declares to support in its metadata. + if (!TextUtils.isEmpty(defaultMethod)) supportedMethods.add(defaultMethod); + RecordHistogram.recordCustomCountHistogram( + /*name=*/"PaymentRequest.NumberOfSupportedMethods.AndroidApp", + /*sample=*/supportedMethods.size(), + /*min=*/1, /*max=*/10, /*numBuckets=*/10); } List<PaymentManifestVerifier> manifestVerifiers = new ArrayList<>();
diff --git a/components/policy/core/browser/url_blocklist_manager.cc b/components/policy/core/browser/url_blocklist_manager.cc index 555636a..2451c25 100644 --- a/components/policy/core/browser/url_blocklist_manager.cc +++ b/components/policy/core/browser/url_blocklist_manager.cc
@@ -77,18 +77,18 @@ #endif // Returns a blocklist based on the given |block| and |allow| pattern lists. -std::unique_ptr<URLBlocklist> BuildBlocklist(const base::Value* block, - const base::Value* allow) { +std::unique_ptr<URLBlocklist> BuildBlocklist(const base::Value::List* block, + const base::Value::List* allow) { auto blocklist = std::make_unique<URLBlocklist>(); if (block) - blocklist->Block(&base::Value::AsListValue(*block)); + blocklist->Block(*block); if (allow) - blocklist->Allow(&base::Value::AsListValue(*allow)); + blocklist->Allow(*allow); return blocklist; } -const base::Value* GetPrefValue(PrefService* pref_service, - absl::optional<std::string> pref_path) { +const base::Value::List* GetPrefList(PrefService* pref_service, + absl::optional<std::string> pref_path) { DCHECK(pref_service); if (!pref_path) @@ -97,7 +97,7 @@ DCHECK(!pref_path->empty()); return pref_service->HasPrefPath(*pref_path) - ? pref_service->GetList(*pref_path) + ? &pref_service->GetValueList(*pref_path) : nullptr; } @@ -131,12 +131,12 @@ URLBlocklist::~URLBlocklist() = default; -void URLBlocklist::Block(const base::ListValue* filters) { +void URLBlocklist::Block(const base::Value::List& filters) { url_matcher::util::AddFilters(url_matcher_.get(), false, &id_, filters, &filters_); } -void URLBlocklist::Allow(const base::ListValue* filters) { +void URLBlocklist::Allow(const base::Value::List& filters) { url_matcher::util::AddFilters(url_matcher_.get(), true, &id_, filters, &filters_); } @@ -237,8 +237,10 @@ // Start enforcing the policies without a delay when they are present at // startup. - const base::Value* block = GetPrefValue(pref_service_, blocklist_pref_path_); - const base::Value* allow = GetPrefValue(pref_service_, allowlist_pref_path_); + const base::Value::List* block = + GetPrefList(pref_service_, blocklist_pref_path_); + const base::Value::List* allow = + GetPrefList(pref_service_, allowlist_pref_path_); if (block || allow) SetBlocklist(BuildBlocklist(block, allow)); } @@ -264,16 +266,20 @@ // The URLBlocklist is built in the background. Once it's ready, it is passed // to the URLBlocklistManager back on ui_task_runner_. - const base::Value* block = GetPrefValue(pref_service_, blocklist_pref_path_); - const base::Value* allow = GetPrefValue(pref_service_, allowlist_pref_path_); + const base::Value::List* block = + GetPrefList(pref_service_, blocklist_pref_path_); + const base::Value::List* allow = + GetPrefList(pref_service_, allowlist_pref_path_); base::PostTaskAndReplyWithResult( background_task_runner_.get(), FROM_HERE, base::BindOnce( &BuildBlocklist, - base::Owned(block ? base::Value::ToUniquePtrValue(block->Clone()) - : nullptr), - base::Owned(allow ? base::Value::ToUniquePtrValue(allow->Clone()) - : nullptr)), + base::Owned(block + ? std::make_unique<base::Value::List>(block->Clone()) + : nullptr), + base::Owned(allow + ? std::make_unique<base::Value::List>(allow->Clone()) + : nullptr)), base::BindOnce(&URLBlocklistManager::SetBlocklist, ui_weak_ptr_factory_.GetWeakPtr())); }
diff --git a/components/policy/core/browser/url_blocklist_manager.h b/components/policy/core/browser/url_blocklist_manager.h index fd66142..2dd9a59 100644 --- a/components/policy/core/browser/url_blocklist_manager.h +++ b/components/policy/core/browser/url_blocklist_manager.h
@@ -15,6 +15,7 @@ #include "base/memory/raw_ptr.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" +#include "base/values.h" #include "components/policy/policy_export.h" #include "components/prefs/pref_change_registrar.h" #include "components/url_matcher/url_matcher.h" @@ -24,7 +25,6 @@ class PrefService; namespace base { -class ListValue; class SequencedTaskRunner; } // namespace base @@ -55,11 +55,11 @@ // URLs matching one of the |filters| will be blocked. The filter format is // documented at // http://www.chromium.org/administrators/url-blocklist-filter-format. - void Block(const base::ListValue* filters); + void Block(const base::Value::List& filters); // URLs matching one of the |filters| will be allowed. If a URL is both // Blocked and Allowed, Allow takes precedence. - void Allow(const base::ListValue* filters); + void Allow(const base::Value::List& filters); // Returns true if the URL is blocked. bool IsURLBlocked(const GURL& url) const;
diff --git a/components/policy/core/browser/url_blocklist_manager_unittest.cc b/components/policy/core/browser/url_blocklist_manager_unittest.cc index 52cc185..9880d391 100644 --- a/components/policy/core/browser/url_blocklist_manager_unittest.cc +++ b/components/policy/core/browser/url_blocklist_manager_unittest.cc
@@ -96,9 +96,9 @@ URLBlocklist blocklist; // Add the pattern to blocklist. - base::Value blocked(base::Value::Type::LIST); + base::Value::List blocked; blocked.Append(pattern); - blocklist.Block(&base::Value::AsListValue(blocked)); + blocklist.Block(blocked); return blocklist.IsURLBlocked(GURL(url)); } @@ -111,23 +111,23 @@ URLBlocklist blocklist; // Add the pattern to list. - base::Value blocked(base::Value::Type::LIST); + base::Value::List blocked; blocked.Append(pattern); if (use_allowlist) { - blocklist.Allow(&base::Value::AsListValue(blocked)); + blocklist.Allow(blocked); } else { - blocklist.Block(&base::Value::AsListValue(blocked)); + blocklist.Block(blocked); } return blocklist.GetURLBlocklistState(GURL(url)); } TEST_F(URLBlocklistManagerTest, LoadBlocklistOnCreate) { - base::Value list(base::Value::Type::LIST); + base::Value::List list; list.Append("example.com"); pref_service_.SetManagedPref(policy_prefs::kUrlBlocklist, - base::Value::ToUniquePtrValue(std::move(list))); + std::make_unique<base::Value>(std::move(list))); auto manager = std::make_unique<URLBlocklistManager>( &pref_service_, policy_prefs::kUrlBlocklist, policy_prefs::kUrlAllowlist); task_environment_.RunUntilIdle(); @@ -219,14 +219,14 @@ EXPECT_FALSE(IsMatch("123.123.123.123", "http://123.123.123.124/")); // Test exceptions to path prefixes, and most specific matches. - base::Value blocked(base::Value::Type::LIST); - base::Value allowed(base::Value::Type::LIST); + base::Value::List blocked; + base::Value::List allowed; blocked.Append("s.xxx.com/a"); allowed.Append("s.xxx.com/a/b"); blocked.Append("https://s.xxx.com/a/b/c"); allowed.Append("https://s.xxx.com/a/b/c/d"); - blocklist.Block(&base::Value::AsListValue(blocked)); - blocklist.Allow(&base::Value::AsListValue(allowed)); + blocklist.Block(blocked); + blocklist.Allow(allowed); EXPECT_TRUE(blocklist.IsURLBlocked(GURL("http://s.xxx.com/a"))); EXPECT_TRUE(blocklist.IsURLBlocked(GURL("http://s.xxx.com/a/x"))); EXPECT_TRUE(blocklist.IsURLBlocked(GURL("https://s.xxx.com/a/x"))); @@ -244,20 +244,20 @@ EXPECT_FALSE(blocklist.IsURLBlocked(GURL("http://xxx.com/a/b"))); // Open an exception. - blocked.ClearList(); + blocked.clear(); blocked.Append("google.com"); - allowed.ClearList(); + allowed.clear(); allowed.Append("plus.google.com"); - blocklist.Block(&base::Value::AsListValue(blocked)); - blocklist.Allow(&base::Value::AsListValue(allowed)); + blocklist.Block(blocked); + blocklist.Allow(allowed); EXPECT_TRUE(blocklist.IsURLBlocked(GURL("http://google.com/"))); EXPECT_TRUE(blocklist.IsURLBlocked(GURL("http://www.google.com/"))); EXPECT_FALSE(blocklist.IsURLBlocked(GURL("http://plus.google.com/"))); // Open an exception only when using https for mail. - allowed.ClearList(); + allowed.clear(); allowed.Append("https://mail.google.com"); - blocklist.Allow(&base::Value::AsListValue(allowed)); + blocklist.Allow(allowed); EXPECT_TRUE(blocklist.IsURLBlocked(GURL("http://google.com/"))); EXPECT_TRUE(blocklist.IsURLBlocked(GURL("http://mail.google.com/"))); EXPECT_TRUE(blocklist.IsURLBlocked(GURL("http://www.google.com/"))); @@ -266,21 +266,21 @@ // Match exactly "google.com", only for http. Subdomains without exceptions // are still blocked. - allowed.ClearList(); + allowed.clear(); allowed.Append("http://.google.com"); - blocklist.Allow(&base::Value::AsListValue(allowed)); + blocklist.Allow(allowed); EXPECT_FALSE(blocklist.IsURLBlocked(GURL("http://google.com/"))); EXPECT_TRUE(blocklist.IsURLBlocked(GURL("https://google.com/"))); EXPECT_TRUE(blocklist.IsURLBlocked(GURL("http://www.google.com/"))); // A smaller path match in an exact host overrides a longer path for hosts // that also match subdomains. - blocked.ClearList(); + blocked.clear(); blocked.Append("yyy.com/aaa"); - blocklist.Block(&base::Value::AsListValue(blocked)); - allowed.ClearList(); + blocklist.Block(blocked); + allowed.clear(); allowed.Append(".yyy.com/a"); - blocklist.Allow(&base::Value::AsListValue(allowed)); + blocklist.Allow(allowed); EXPECT_FALSE(blocklist.IsURLBlocked(GURL("http://yyy.com"))); EXPECT_FALSE(blocklist.IsURLBlocked(GURL("http://yyy.com/aaa"))); EXPECT_FALSE(blocklist.IsURLBlocked(GURL("http://yyy.com/aaa2"))); @@ -289,35 +289,35 @@ EXPECT_TRUE(blocklist.IsURLBlocked(GURL("http://www.yyy.com/aaa2"))); // If the exact entry is both allowed and blocked, allowing takes precedence. - blocked.ClearList(); + blocked.clear(); blocked.Append("example.com"); - blocklist.Block(&base::Value::AsListValue(blocked)); - allowed.ClearList(); + blocklist.Block(blocked); + allowed.clear(); allowed.Append("example.com"); - blocklist.Allow(&base::Value::AsListValue(allowed)); + blocklist.Allow(allowed); EXPECT_FALSE(blocklist.IsURLBlocked(GURL("http://example.com"))); // Devtools should not be blocked. - blocked.ClearList(); + blocked.clear(); blocked.Append("*"); - blocklist.Block(&base::Value::AsListValue(blocked)); - allowed.ClearList(); + blocklist.Block(blocked); + allowed.clear(); allowed.Append("devtools://*"); - blocklist.Allow(&base::Value::AsListValue(allowed)); + blocklist.Allow(allowed); EXPECT_FALSE(blocklist.IsURLBlocked(GURL("devtools://something.com"))); EXPECT_TRUE(blocklist.IsURLBlocked(GURL("https://something.com"))); } TEST_F(URLBlocklistManagerTest, QueryParameters) { URLBlocklist blocklist; - base::Value blocked(base::Value::Type::LIST); - base::Value allowed(base::Value::Type::LIST); + base::Value::List blocked; + base::Value::List allowed; // Block domain and all subdomains, for any filtered scheme. blocked.Append("youtube.com"); allowed.Append("youtube.com/watch?v=XYZ"); - blocklist.Block(&base::Value::AsListValue(blocked)); - blocklist.Allow(&base::Value::AsListValue(allowed)); + blocklist.Block(blocked); + blocklist.Allow(allowed); EXPECT_TRUE(blocklist.IsURLBlocked(GURL("http://youtube.com"))); EXPECT_TRUE(blocklist.IsURLBlocked(GURL("http://youtube.com/watch?v=123"))); @@ -331,9 +331,9 @@ EXPECT_FALSE( blocklist.IsURLBlocked(GURL("http://youtube.com/watch?foo=bar&v=XYZ"))); - allowed.ClearList(); + allowed.clear(); allowed.Append("youtube.com/watch?av=XYZ&ag=123"); - blocklist.Allow(&base::Value::AsListValue(allowed)); + blocklist.Allow(allowed); EXPECT_TRUE(blocklist.IsURLBlocked(GURL("http://youtube.com"))); EXPECT_TRUE(blocklist.IsURLBlocked(GURL("http://youtube.com/watch?av=123"))); EXPECT_TRUE(blocklist.IsURLBlocked(GURL("http://youtube.com/watch?av=XYZ"))); @@ -350,9 +350,9 @@ EXPECT_TRUE(blocklist.IsURLBlocked( GURL("http://youtube.com/watch?av=XYZ&ag=123&ag=1234"))); - allowed.ClearList(); + allowed.clear(); allowed.Append("youtube.com/watch?foo=bar*&vid=2*"); - blocklist.Allow(&base::Value::AsListValue(allowed)); + blocklist.Allow(allowed); EXPECT_TRUE(blocklist.IsURLBlocked(GURL("http://youtube.com"))); EXPECT_TRUE(blocklist.IsURLBlocked(GURL("http://youtube.com/watch?vid=2"))); EXPECT_TRUE(blocklist.IsURLBlocked(GURL("http://youtube.com/watch?foo=bar"))); @@ -365,9 +365,9 @@ EXPECT_FALSE(blocklist.IsURLBlocked( GURL("http://youtube.com/watch?vid=234&foo=bar23"))); - blocked.ClearList(); + blocked.clear(); blocked.Append("youtube1.com/disallow?v=44678"); - blocklist.Block(&base::Value::AsListValue(blocked)); + blocklist.Block(blocked); EXPECT_FALSE(blocklist.IsURLBlocked(GURL("http://youtube1.com"))); EXPECT_FALSE(blocklist.IsURLBlocked(GURL("http://youtube1.com?v=123"))); // Path does not match @@ -381,9 +381,9 @@ EXPECT_TRUE(blocklist.IsURLBlocked( GURL("http://youtube1.com/disallow?v=4467&v=123&v=44678"))); - blocked.ClearList(); + blocked.clear(); blocked.Append("youtube1.com/disallow?g=*"); - blocklist.Block(&base::Value::AsListValue(blocked)); + blocklist.Block(blocked); EXPECT_FALSE(blocklist.IsURLBlocked(GURL("http://youtube1.com"))); EXPECT_FALSE(blocklist.IsURLBlocked(GURL("http://youtube1.com?ag=123"))); EXPECT_TRUE( @@ -391,9 +391,9 @@ EXPECT_TRUE( blocklist.IsURLBlocked(GURL("http://youtube1.com/disallow?ag=13&g=123"))); - blocked.ClearList(); + blocked.clear(); blocked.Append("youtube2.com/disallow?a*"); - blocklist.Block(&base::Value::AsListValue(blocked)); + blocklist.Block(blocked); EXPECT_FALSE(blocklist.IsURLBlocked(GURL("http://youtube2.com"))); EXPECT_TRUE(blocklist.IsURLBlocked( GURL("http://youtube2.com/disallow?b=123&a21=467"))); @@ -402,12 +402,12 @@ EXPECT_FALSE( blocklist.IsURLBlocked(GURL("http://youtube2.com/disallow?baba=true"))); - allowed.ClearList(); - blocked.ClearList(); + allowed.clear(); + blocked.clear(); blocked.Append("youtube3.com"); allowed.Append("youtube3.com/watch?fo*"); - blocklist.Block(&base::Value::AsListValue(blocked)); - blocklist.Allow(&base::Value::AsListValue(allowed)); + blocklist.Block(blocked); + blocklist.Allow(allowed); EXPECT_TRUE(blocklist.IsURLBlocked(GURL("http://youtube3.com"))); EXPECT_TRUE( blocklist.IsURLBlocked(GURL("http://youtube3.com/watch?b=123&a21=467"))); @@ -421,22 +421,22 @@ blocklist.IsURLBlocked(GURL("http://youtube3.com/watch?foreign=true"))); EXPECT_FALSE(blocklist.IsURLBlocked(GURL("http://youtube3.com/watch?fold"))); - allowed.ClearList(); - blocked.ClearList(); + allowed.clear(); + blocked.clear(); blocked.Append("youtube4.com"); allowed.Append("youtube4.com?*"); - blocklist.Block(&base::Value::AsListValue(blocked)); - blocklist.Allow(&base::Value::AsListValue(allowed)); + blocklist.Block(blocked); + blocklist.Allow(allowed); EXPECT_TRUE(blocklist.IsURLBlocked(GURL("http://youtube4.com"))); EXPECT_FALSE(blocklist.IsURLBlocked(GURL("http://youtube4.com/?hello"))); EXPECT_FALSE(blocklist.IsURLBlocked(GURL("http://youtube4.com/?foo"))); - allowed.ClearList(); - blocked.ClearList(); + allowed.clear(); + blocked.clear(); blocked.Append("youtube5.com?foo=bar"); allowed.Append("youtube5.com?foo1=bar1&foo2=bar2&"); - blocklist.Block(&base::Value::AsListValue(blocked)); - blocklist.Allow(&base::Value::AsListValue(allowed)); + blocklist.Block(blocked); + blocklist.Allow(allowed); EXPECT_FALSE(blocklist.IsURLBlocked(GURL("http://youtube5.com"))); EXPECT_TRUE(blocklist.IsURLBlocked(GURL("http://youtube5.com/?foo=bar&a=b"))); // More specific filter is given precedence. @@ -447,15 +447,15 @@ TEST_F(URLBlocklistManagerTest, BlockAllWithExceptions) { URLBlocklist blocklist; - base::Value blocked(base::Value::Type::LIST); - base::Value allowed(base::Value::Type::LIST); + base::Value::List blocked; + base::Value::List allowed; blocked.Append("*"); allowed.Append(".www.google.com"); allowed.Append("plus.google.com"); allowed.Append("https://mail.google.com"); allowed.Append("https://very.safe/path"); - blocklist.Block(&base::Value::AsListValue(blocked)); - blocklist.Allow(&base::Value::AsListValue(allowed)); + blocklist.Block(blocked); + blocklist.Allow(allowed); EXPECT_TRUE(blocklist.IsURLBlocked(GURL("http://random.com"))); EXPECT_TRUE(blocklist.IsURLBlocked(GURL("http://google.com"))); EXPECT_TRUE(blocklist.IsURLBlocked(GURL("http://s.www.google.com"))); @@ -472,11 +472,11 @@ TEST_F(URLBlocklistManagerTest, DefaultBlocklistExceptions) { URLBlocklist blocklist; - base::Value blocked(base::Value::Type::LIST); + base::Value::List blocked; // Blocklist everything: blocked.Append("*"); - blocklist.Block(&base::Value::AsListValue(blocked)); + blocklist.Block(blocked); // Internal NTP and extension URLs are not blocked by the "*": EXPECT_TRUE(blocklist.IsURLBlocked(GURL("http://www.google.com"))); @@ -497,10 +497,10 @@ // Unless they are explicitly on the blocklist: blocked.Append("chrome-extension://*"); - base::Value allowed(base::Value::Type::LIST); + base::Value::List allowed; allowed.Append("chrome-extension://abc"); - blocklist.Block(&base::Value::AsListValue(blocked)); - blocklist.Allow(&base::Value::AsListValue(allowed)); + blocklist.Block(blocked); + blocklist.Allow(allowed); EXPECT_TRUE(blocklist.IsURLBlocked(GURL("http://www.google.com"))); EXPECT_TRUE(blocklist.IsURLBlocked(GURL("chrome-extension://xyz")));
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb index 3244528..79338c26 100644 --- a/components/policy/resources/policy_templates_es.xtb +++ b/components/policy/resources/policy_templates_es.xtb
@@ -108,6 +108,11 @@ Si se le asigna un valor a esta política, los usuarios no podrán cambiarlo.</translation> <translation id="1123650965531933634">Niega el permiso de colocación de ventanas en todos los sitios de forma predeterminada</translation> +<translation id="112496019059412872">Permite controlar si la función "Recordar contraseña" está habilitada en el cuadro de diálogo de autenticación Kerberos. Las contraseñas se almacenan cifradas en disco y solo se puede acceder a ellas con el daemon del sistema Kerberos durante una sesión de usuario. + + Si se habilita esta política o no se establece, los usuarios podrán decidir si se recuerdan las contraseñas de Kerberos para que no tengan que introducirlas de nuevo. Los tickets de Kerberos se obtienen automáticamente a menos que se necesite una autenticación adicional (autenticación de dos factores). + + Si se inhabilita esta política, nunca se recordarán las contraseñas y se eliminarán todas las contraseñas almacenadas anteriormente. Los usuarios tendrán que introducir la contraseña cada vez que quieran autenticarse en el sistema Kerberos. Según la configuración del servidor, esto puede ocurrir cada 8 horas o cada varios meses.</translation> <translation id="1133622335785078255">Permite que los usuarios creen y utilicen perfiles secundarios, y que usen el modo Invitado en el navegador <ph name="LACROS_NAME" /></translation> <translation id="1133814529606590009">Si se habilita esta política, siempre estará activa la recogida de datos anónima con clave de URL, que enviará las URL de las páginas que el usuario visite a Google para mejorar las búsquedas y la navegación. @@ -4969,6 +4974,12 @@ Si se inhabilita la política, se inhabilitará la optimización de WPAD, lo que hará que <ph name="PRODUCT_NAME" /> tenga que esperar más tiempo la respuesta de los servidores WPAD basados en DNS. Independientemente de si se establece o no esta política, los usuarios no podrán cambiar la opción de configuración de WPAD.</translation> +<translation id="6365249741643189510">Esta política concede permiso a Projector para crear y transcribir grabaciones de pantalla y subirlas a Drive para los usuarios de empresa. + Esta política no afecta a los usuarios de Family Link. + Esta política no afecta a la política <ph name="PROJECTOR_DOGFOOD_FOR_FAMILY_LINK_ENABLED_POLICY_NAME" /> para los usuarios de Family Link. + + Si se habilita esta política o no se establece, se habilitará Projector. + Si se inhabilita esta política, se inhabilitará Projector.</translation> <translation id="6366574325767783825">Si se le asigna el valor "Habilitada" a esta política o no se le asigna ninguno, <ph name="PRODUCT_NAME" /> aceptará contenidos web de tipo Signed HTTP Exchanges. Si se le asigna el valor "Inhabilitada", los Signed HTTP Exchanges no se podrán cargar.</translation> @@ -5095,6 +5106,7 @@ <translation id="6518102411616460786">Esperar a que la versión actual iguale a la versión inferior objetivo</translation> <translation id="6520802717075138474">Importa los motores de búsqueda desde el navegador predeterminado en la primera ejecución.</translation> <translation id="6521971538031711337">Impedir que el usuario administrado configure el nombre de host del dispositivo</translation> +<translation id="652593254122955308">Tiempo de espera hasta que se cierre el perfil inactivo</translation> <translation id="6532026122543921610">A menos que la política <ph name="SYSTEM_TIMEZONE_POLICY_NAME" /> desactive la detección automática de la zona horaria, asignar un valor a esta política define el método de detección automática de la zona horaria, el cual los usuarios no pueden cambiar. Si se asignan los siguientes valores: @@ -7290,6 +7302,13 @@ Si no se define esta política, se usará la configuración predeterminada del entorno aislado de la red. Esta configuración puede variar en función de la versión de <ph name="PRODUCT_NAME" />, de las pruebas de campo que se estén ejecutando en ese momento y de la plataforma. El objetivo de esta política es dar a las empresas la opción de inhabilitar el entorno aislado de la red si usan software de terceros que interfiere en el entorno aislado del servicio de red.</translation> <translation id="8842208363354615697">Permitir que se habilite el modo solo‑HTTPS</translation> +<translation id="8850156309475162935">Activa una acción cuando el ordenador está inactivo. + + Si se asigna un número positivo a esta política, el número equivaldrá a los minutos. Si pasa ese tiempo y el usuario no ha realizado ninguna acción, <ph name="PRODUCT_NAME" /> cierra todas las ventanas del navegador y muestra el selector de perfil. + + Si se asigna un número menor que 5 a esta política o no se establece, no ocurrirá nada cuando el ordenador esté inactivo. + + Las APIs Operating System definen la función "Entrada del usuario", que incluye acciones como mover el ratón o escribir con el teclado.</translation> <translation id="885147810817138322">Mostrar recomendaciones de contenido multimedia al usuario</translation> <translation id="8852579753940989645">Habilitar la integridad del código del renderizador</translation> <translation id="8854571659927427063">Si se asigna el valor "Habilitada" a esta política, se importarán los marcadores del navegador predeterminado anterior al ejecutarse por primera vez. Si se le asigna el valor "Inhabilitada" o no se le asigna ninguno, no se importará ningún marcador al ejecutarse por primera vez. @@ -7404,6 +7423,13 @@ <translation id="8983537551095611459">Configura la lista de IDs de extensiones que quedarán exentas del proceso de borrado de las sesiones de invitado gestionadas y restringidas.</translation> <translation id="8983539044126123594">Habilitar el inicio de sesión con cuentas de Google adicionales</translation> <translation id="8992176907758534924">No permitir que todos los sitios muestren imágenes</translation> +<translation id="8994954504552592260">Habilitar la migración de dispositivos gestionados por <ph name="MS_AD_NAME" /> a la gestión en la nube. Esta política permite iniciar de forma remota una migración sin contacto de varios dispositivos de una empresa. Además, se ofrecerá toda la información posible sobre la migración a los usuarios finales. + + Si se habilita esta política y el ID de registro ya se ha subido a DMServer, se activará la función Powerwash en un dispositivo de forma remota. + + Si se inhabilita esta política o no se establece, no se activará la función Powerwash en un dispositivo de forma remota, independientemente del estado de subida del ID de registro. + + Esta comprobación se activará siempre que se cargue la pantalla de inicio de sesión y se repetirá cada hora (si el dispositivo se mantiene en la pantalla de inicio de sesión). Así, se evita que la migración comience en medio de la sesión de un usuario, lo que podría causar problemas a los usuarios finales.</translation> <translation id="9007632512838819703">Esta política está obsoleta. Usa la política <ph name="SPELLCHECK_LANGUAGE_BLOCKLIST_POLICY_NAME" /> en su lugar. Permite forzar la inhabilitación del corrector ortográfico de idiomas. Se ignorarán los idiomas no reconocidos de esa lista.
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index 47d2185..3b425ed 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -108,6 +108,11 @@ 설정된 정책은 사용자가 변경할 수 없습니다.</translation> <translation id="1123650965531933634">기본적으로 모든 사이트에 창 배치 권한 거부</translation> +<translation id="112496019059412872">Kerberos 인증 대화상자에서 '비밀번호 기억' 기능의 사용 여부를 제어합니다. 비밀번호는 암호화되어 디스크에 저장되며 사용자 세션 동안에 Kerberos 시스템 데몬에서만 액세스할 수 있습니다. + + 이 정책이 사용 설정되거나 설정되지 않으면 다시 비밀번호를 입력하지 않아도 되도록 사용자가 Kerberos 비밀번호를 저장 여부를 결정할 수 있습니다. 추가 인증이 필요한 경우(2단계 인증)가 아니면 Kerberos 티켓을 자동으로 가져옵니다. + + 이 정책이 사용 중지되면 비밀번호가 저장되지 않으며 이전에 저장된 모든 비밀번호는 삭제됩니다. 사용자는 Kerberos 시스템 인증이 필요할 때마다 비밀번호를 입력해야 합니다. 서버 설정에 따라 보통 8시간에서 몇 달마다 인증이 필요합니다.</translation> <translation id="1133622335785078255">사용자가 <ph name="LACROS_NAME" /> 브라우저에서 보조 프로필을 만들어 사용하고 게스트 모드를 사용하도록 허용</translation> <translation id="1133814529606590009">정책을 사용 설정하면 URL로 입력되며 익명으로 처리되는 데이터 수집(사용자가 방문하는 페이지 URL을 Google로 전송)이 항상 활성화됩니다. @@ -4948,6 +4953,12 @@ 사용 중지하면 WPAD 최적화가 사용 중지되어 <ph name="PRODUCT_NAME" /> 제품이 DNS 기반 WPAD 서버를 더 오래 기다리게 됩니다. 정책의 설정 여부와 관계없이 사용자는 WPAD 최적화 설정을 변경할 수 없습니다.</translation> +<translation id="6365249741643189510">이 정책은 화면 녹화 파일을 만들고, 스크립트를 작성하고, 이러한 항목을 Drive에 업로드하는 Projector 권한을 기업 사용자에게 부여합니다. + 이 정책은 Family Link 사용자에게 영향을 주지 않습니다. + 이 정책은 Family Link 사용자를 위한 <ph name="PROJECTOR_DOGFOOD_FOR_FAMILY_LINK_ENABLED_POLICY_NAME" /> 정책에 영향을 주지 않습니다. + + 정책을 설정하지 않거나 사용 설정하면 Projector가 사용 설정됩니다. + 정책을 사용 중지하면 Projector가 사용 중지됩니다.</translation> <translation id="6366574325767783825">정책을 True로 설정하거나 설정하지 않으면 <ph name="PRODUCT_NAME" />에서 서명된 HTTP 교환(SXG)으로 제공된 웹 콘텐츠를 허용합니다. 정책을 False로 설정하면 서명된 HTTP 교환(SXG)이 로드되지 않습니다.</translation> @@ -5074,6 +5085,7 @@ <translation id="6518102411616460786">채널 다운그레이드 시 보완할 대상 채널 대기</translation> <translation id="6520802717075138474">처음 실행 시 기본 브라우저에서 검색엔진 가져오기</translation> <translation id="6521971538031711337">관리 대상 사용자가 기기 호스트 이름을 구성하지 못하게 차단</translation> +<translation id="652593254122955308">유휴 프로필을 닫기까지 시간 제한</translation> <translation id="6532026122543921610"><ph name="SYSTEM_TIMEZONE_POLICY_NAME" /> 정책에서 자동 시간대 감지를 사용 중지하지 않을 경우 정책을 설정하면 자동 시간대 감지 방식에 관한 개요가 제공되며 이는 사용자가 변경할 수 없습니다. 정책을 다음으로 설정합니다. @@ -7264,6 +7276,13 @@ 정책을 설정하지 않으면 네트워크 샌드박스의 기본 구성이 사용됩니다. 이는 <ph name="PRODUCT_NAME" /> 버전, 현재 실행 중인 필드 체험판, 플랫폼에 따라 다를 수 있습니다. 정책은 기업이 네트워크 서비스 샌드박스를 방해하는 타사 소프트웨어를 사용하는 경우 필요에 따라 기업에서 네트워크 샌드박스를 사용 중지할 수 있도록 만들어졌습니다.</translation> <translation id="8842208363354615697">HTTPS 전용 모드가 사용 설정되도록 허용</translation> +<translation id="8850156309475162935">컴퓨터가 유휴 상태일 때 작업을 트리거합니다. + + 이 정책을 양수로 설정하면 분 단위로 표시됩니다. 사용자 입력 없이 이 시간이 지나면 <ph name="PRODUCT_NAME" />은 모든 브라우저 창을 닫고 프로필 선택 도구를 표시합니다. + + 5보다 작거나 설정되지 않은 경우: 컴퓨터가 유휴 상태일 때 아무 일도 일어나지 않습니다. + + '사용자 입력'은 운영체제 API에 의해 정의되며, 마우스 이동 또는 키보드 입력 등의 항목이 포함됩니다.</translation> <translation id="885147810817138322">사용자에게 미디어 추천 표시</translation> <translation id="8852579753940989645">렌더러 코드 무결성 사용</translation> <translation id="8854571659927427063">정책을 '사용'으로 설정하면 최초 실행 시 이전 기본 브라우저의 북마크를 가져옵니다. 정책을 '사용 안함'으로 설정하거나 설정하지 않으면 최초 실행 시 북마크를 가져오지 않습니다. @@ -7378,6 +7397,13 @@ <translation id="8983537551095611459">제한된 관리되가 게스트 세션 정리 절차에서 제외되는 확장 프로그램 ID 목록을 구성합니다.</translation> <translation id="8983539044126123594">추가 Google 계정으로 로그인 사용함</translation> <translation id="8992176907758534924">모든 사이트에서 이미지 표시 허용 안함</translation> +<translation id="8994954504552592260"><ph name="MS_AD_NAME" /> 관리 기기를 클라우드 관리로 이전할 수 있게 합니다. 이 정책은 회사 내 여러 기기의 터치리스 이전을 원격으로 시작할 수 있게 합니다. 또한 각 이전 단계가 최종 사용자에게 가능한 한 투명하게 공개됩니다. + + 정책이 사용 설정되어 있고 등록 ID가 DMServer에 업로드되어 있다면 원격 기기 파워워시가 트리거됩니다. + + 이 정책이 사용 중지되거나 설정되어 있지 않으면 등록 ID의 업로드 상태와 무관하게 원격 기기 파워워시가 트리거되지 않습니다. + + 이 검사는 로그인 화면이 로드될 때마다 트리거되고 매시간 다시 재시도됩니다(기기의 로그인 화면이 유지되는 경우). 이로써 사용자 세션 도중에 이전이 시작되어 최종 사용자에게 문제가 생기지 않도록 합니다.</translation> <translation id="9007632512838819703">이 정책은 지원 중단되었으므로 <ph name="SPELLCHECK_LANGUAGE_BLOCKLIST_POLICY_NAME" /> 정책을 대신 사용하세요. 맞춤법 검사 언어를 강제로 사용 중지합니다. 목록에서 인식할 수 없는 언어는 무시됩니다.
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index dde461a..4fedb83 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -457,6 +457,14 @@ Opmerking: Dit beleid is ook van toepassing op componentextensies, zoals de Hangout Services-extensie.</translation> <translation id="148194404518916594">Toestaan dat gebruikers 'Tikken om te zoeken' gebruiken</translation> +<translation id="1482155585027825793">Beheert de installatie van externe extensies. + + Als je dit beleid toepast, kunnen externe extensies niet worden geïnstalleerd. + + Als je dit beleid niet toepast of niet instelt, kunnen externe extensies worden geïnstalleerd. + + Externe extensies en de installatie daarvan worden beschreven op https://developer.chrome.com/apps/external_extensions. + </translation> <translation id="1486021504508098388">Informatie over schermverlichting melden</translation> <translation id="1487916040416013623">Als je het beleid instelt, geef je aan welke servers op de toelatingslijst voor geïntegreerde verificatie moeten worden gezet. Geïntegreerde verificatie is alleen aangezet als <ph name="PRODUCT_NAME" /> een verificatie-uitdaging ontvangt van een proxy of een server die op deze toelatingslijst staat. @@ -1045,6 +1053,10 @@ <translation id="2076158466157390917">Automatische opruiming tijdens inloggen beheren</translation> <translation id="2077129598763517140">Hardwareversnelling gebruiken indien beschikbaar</translation> <translation id="2077273864382355561">Vertraging voor uitzetten van scherm als er op batterijspanning wordt gewerkt</translation> +<translation id="2081969239334697268"> + Als je het beleid niet toepast, wordt het updaten van Chrome-kiosk-apps in de sessie uitgezet (waarvoor de update-URL uit het extensiemanifest wordt gebruikt) en blijft alleen CRX-prefetching over als updatemechanisme. + Als je het beleid toepast of niet instelt, kunnen Chrome-kiosk-apps in de sessie worden geüpdatet. + </translation> <translation id="2082205219176343977">Configureer de minimaal toegestane Chrome-versie voor het apparaat.</translation> <translation id="208566302163036794">Uitgezette functies blokkeren</translation> <translation id="208623333578980446">Wake locks voor het scherm toestaan voor stroombeheer</translation> @@ -2517,6 +2529,19 @@ <translation id="3660562134618097814">SAML IdP-cookies overdragen tijdens het inloggen</translation> <translation id="3665437376055221832">De gebruiker alleen vragen als geen enkel certificaat overeenkomt met de automatische selectie.</translation> <translation id="3674010627788940405">CORS-verzoekheaders zonder jokertekens niet ondersteunen.</translation> +<translation id="3675303748198647471">setTimeout(…, 0) wordt vaak gebruikt om lange JavaScript-taken uit te splitsen. + Als je het beleid toepast, worden setTimeouts en setIntervals met een interval van minder dan 4 ms minder dwingend vastgezet. + Dit verbetert de prestaties op de korte termijn, maar voor websites die de API misbruiken, worden de setTimeouts uiteindelijk toch vastgezet. + + Als je het beleid niet toepast, worden time-outs en setIntervals met een interval van minder dan 4 ms vastgezet. + + Hierdoor kan de taakvolgorde op een webpagina veranderen, wat kan leiden tot onverwacht gedrag op sites die afhankelijk zijn van een bepaalde volgorde. + De functie kan ook van invloed zijn op sites die veel instanties van setTimeout() met een time-out van 0 ms gebruiken. De CPU-belasting kan bijvoorbeeld toenemen. + + Voor gebruikers waarvoor dit beleid niet is ingesteld, rolt <ph name="PRODUCT_NAME" /> de wijziging geleidelijk uit op het stabiele kanaal. + + Dit is een tijdelijk beleid dat volgens planning wordt verwijderd in <ph name="PRODUCT_NAME" /> 107. Deze deadline kan worden verlengd als daar bij bedrijven behoefte aan is. + </translation> <translation id="3685979383016152590">Als je dit beleid instelt, kun je aangeven welk toegangsbeleid wordt toegepast op bulksgewijze printerconfiguratie en beheren welke printers van <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" /> beschikbaar zijn voor gebruikers. * <ph name="PRINTERS_BLOCKLIST" /> (waarde 0) gebruikt <ph name="PRINTERS_BULK_BLOCKLIST" /> om de toegang tot de opgegeven printers te beperken, @@ -5578,6 +5603,13 @@ <translation id="7101550508196914704">De snelkoppeling voor apps niet tonen op de bookmarkbalk</translation> <translation id="7109384070286741861">CECPQ2 uitzetten</translation> <translation id="7114169791477667553">De standaard zoekprovider uitzetten</translation> +<translation id="7121046543122812054">Dit beleid is beëindigd. Overweeg in plaats daarvan <ph name="BROWSER_SIGNIN_POLICY_NAME" /> te gebruiken. + + Hiermee kan de gebruiker inloggen bij <ph name="PRODUCT_NAME" />. + + Als je dit beleid toepast, kan de gebruiker inloggen bij <ph name="PRODUCT_NAME" />. + Als je dit beleid niet toepast, kan de gebruiker niet inloggen. Ook wordt de werking geblokkeerd van apps en extensies die de chrome.identity API gebruiken. Als je dat wilt voorkomen, gebruik je in plaats daarvan <ph name="SYNC_DISABLED_POLICY_NAME" />. + </translation> <translation id="7122626777103192518">Als je het beleid instelt op True, wordt het delen van tekst/bestanden van Android-apps naar ondersteunde web-apps mogelijk via het ingebouwde deelsysteem van Android. Als dit is aangezet, worden er voor geïnstalleerde web-apps metadata naar Google gestuurd om een Android-app te maken en te installeren. Als je dit beleid instelt op False, wordt de functionaliteit uitgezet.</translation>
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index ef561eff..6745b48 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -459,6 +459,14 @@ Примечание. Это правило также действует для расширений компонентов, например Hangout Services.</translation> <translation id="148194404518916594">Разрешить использование быстрого поиска</translation> +<translation id="1482155585027825793">Это правило контролирует установку внешних расширений. + + Если оно включено, внешние расширения запрещено устанавливать. + + Если правило отключено или не настроено, установка внешних расширений разрешена. + + Подробная информация о внешних расширениях, в том числе об их установке, приведена на этой странице: https://developer.chrome.com/apps/external_extensions. + </translation> <translation id="1486021504508098388">Передача информации о подсветке</translation> <translation id="1487916040416013623">Это правило указывает, какие серверы можно использовать для встроенной проверки подлинности Windows (IWA). Встроенная проверка подлинности включается, только когда <ph name="PRODUCT_NAME" /> получает запрос на аутентификацию от прокси-сервера или от сервера из списка разрешенных. @@ -1072,6 +1080,10 @@ <translation id="2076158466157390917">Управлять автоматической очисткой диска во время входа</translation> <translation id="2077129598763517140">Использовать аппаратное ускорение (при наличии)</translation> <translation id="2077273864382355561">Задержка отключения экрана при работе от батареи</translation> +<translation id="2081969239334697268"> + Если это правило отключено, киоск-приложения Chrome не смогут обновляться (с использованием URL обновления из манифеста расширения) во время сеанса. Будет доступно только обновление путем упреждающего чтения CRX-файлов. + Если правило включено или не настроено, киоск-приложения Chrome смогут обновляться во время сеанса. + </translation> <translation id="2082205219176343977">Настройка версии Chrome, минимально допустимой для устройства</translation> <translation id="208566302163036794">Блокировать отключенные функции</translation> <translation id="208623333578980446">Разрешить использование запретов блокировки через API расширения управления питанием</translation>
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index ee4aa98d..492a64cb 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -457,6 +457,14 @@ หมายเหตุ: นโยบายนี้ยังมีผลกับส่วนขยายคอมโพเนนต์ด้วย เช่น ส่วนขยายบริการ Hangouts</translation> <translation id="148194404518916594">อนุญาตให้ผู้ใช้ใช้ "แตะเพื่อค้นหา"</translation> +<translation id="1482155585027825793">ควบคุมการติดตั้งส่วนขยายจากภายนอก + + การตั้งค่านโยบายนี้เป็น "เปิดใช้" จะบล็อกการติดตั้งส่วนขยายจากภายนอก + + การตั้งค่านโยบายนี้เป็น "ปิดใช้" หรือไม่ตั้งค่าจะอนุญาตให้ติดตั้งส่วนขยายจากภายนอก + + ดูเอกสารประกอบเกี่ยวกับส่วนขยายจากภายนอกและการติดตั้งได้ที่ https://developer.chrome.com/apps/external_extensions + </translation> <translation id="1486021504508098388">รายงานข้อมูลแบ็กไลต์</translation> <translation id="1487916040416013623">การตั้งค่านโยบายจะระบุว่าเซิร์ฟเวอร์ใดควรจะได้รับอนุญาตสำหรับการตรวจสอบสิทธิ์แบบผสานรวม การตรวจสอบสิทธิ์แบบผสานรวมจะเปิดเฉพาะเมื่อ <ph name="PRODUCT_NAME" /> ได้รับคำขอตรวจสอบสิทธิ์จากพร็อกซีหรือจากเซิร์ฟเวอร์ที่อยู่ในรายการที่ได้รับอนุญาตนี้ @@ -1045,6 +1053,10 @@ <translation id="2076158466157390917">ควบคุมการทำความสะอาดอัตโนมัติในระหว่างเข้าสู่ระบบ</translation> <translation id="2077129598763517140">ใช้การเร่งฮาร์ดแวร์เมื่อสามารถใช้ได้</translation> <translation id="2077273864382355561">ระยะหน่วงเวลาการปิดหน้าจอเมื่อทำงานโดยใช้พลังงานแบตเตอรี่</translation> +<translation id="2081969239334697268"> + การตั้งค่านโยบายเป็น "ปิดใช้" จะปิดใช้การอัปเดตแอป Chrome Kiosk ในเซสชัน (ซึ่งใช้ URL อัปเดตจากไฟล์ Manifest ของส่วนขยาย) และให้เพียงแค่ CRX ดึงข้อมูลล่วงหน้าได้ตามกลไกการอัปเดต + การตั้งค่านโยบายเป็น "เปิดใช้" หรือไม่ตั้งค่าจะอนุญาตให้อัปเดตแอป Chrome Kiosk ในเซสชัน + </translation> <translation id="2082205219176343977">กำหนดค่าเวอร์ชัน Chrome ขั้นต่ำที่อุปกรณ์จะใช้ได้</translation> <translation id="208566302163036794">บล็อกฟีเจอร์ที่ปิดใช้</translation> <translation id="208623333578980446">อนุญาต Wake Lock สำหรับหน้าจอเพื่อการจัดการพลังงาน</translation> @@ -2517,6 +2529,19 @@ <translation id="3660562134618097814">โอนคุกกี้ SAML IdP ขณะลงชื่อเข้าใช้</translation> <translation id="3665437376055221832">แสดงข้อความแจ้งผู้ใช้เฉพาะในกรณีที่ไม่มีใบรับรองตรงกับการเลือกอัตโนมัติ</translation> <translation id="3674010627788940405">ไม่รองรับส่วนหัวของคำขอที่ไม่มีไวลด์การ์ดสำหรับ CORS</translation> +<translation id="3675303748198647471">โดยทั่วไปแล้ว setTimeout(…, 0) จะใช้เพื่อแบ่งงาน JavaScript ที่ยาว + เมื่อตั้งค่านโยบายนี้เป็น "เปิดใช้" ระบบจะไม่บีบ setTimeouts และ setIntervals ที่มีช่วงเวลาน้อยกว่า 4 มิลลิวินาทีมากเกินไป + ตัวเลือกนี้จะช่วยปรับปรุงประสิทธิภาพในระยะสั้น แต่สุดท้ายเว็บไซต์ที่ละเมิด API จะยังคงถูกบีบ setTimeouts ไว้ + + เมื่อตั้งค่านโยบายเป็น "ปิดใช้" ระบบจะบีบ setTimeouts และ setIntervals ที่มีช่วงเวลาน้อยกว่า 4 มิลลิวินาที + + ซึ่งอาจทำให้ลำดับงานของบางหน้าเว็บเปลี่ยนไปได้ จนเกิดลักษณะการทำงานที่ไม่ได้คาดไว้ในเว็บไซต์ที่อาศัยการเรียงลำดับงานในบางรูปแบบ + นอกจากนี้ยังอาจส่งผลต่อเว็บไซต์ที่มี setTimeout() จำนวนมากที่มีการใช้ระยะหมดเวลาที่ 0 มิลลิวินาทีด้วย เช่น ทำให้โหลดของ CPU มากขึ้น + + สำหรับผู้ใช้ที่ไม่ได้ตั้งค่านโยบายนี้ไว้ "<ph name="PRODUCT_NAME" />" จะทยอยทำการเปลี่ยนแปลงทีละน้อยในเวอร์ชันเสถียร + + นโยบายนี้เป็นนโยบายชั่วคราวซึ่งจะถูกนำออกใน "<ph name="PRODUCT_NAME" />" เวอร์ชัน 107 กำหนดเวลานี้อาจเลื่อนออกไปได้หากมีบริษัทที่ยังคงต้องการใช้จำนวนมาก + </translation> <translation id="3685979383016152590">การตั้งค่านโยบายนี้จะกำหนดนโยบายการเข้าถึงที่ใช้กับการกำหนดค่าเครื่องพิมพ์จำนวนมาก โดยควบคุมว่าเครื่องพิมพ์เครื่องใดใน <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" /> ที่พร้อมใช้งานสำหรับผู้ใช้ * <ph name="PRINTERS_BLOCKLIST" /> (ค่า 0) ใช้ <ph name="PRINTERS_BULK_BLOCKLIST" /> เพื่อจำกัดการเข้าถึงเครื่องพิมพ์ที่ระบุไว้ @@ -5581,6 +5606,13 @@ <translation id="7101550508196914704">ไม่แสดงทางลัดของแอปในแถบบุ๊กมาร์ก</translation> <translation id="7109384070286741861">ปิดใช้ CECPQ2</translation> <translation id="7114169791477667553">ปิดใช้ผู้ให้บริการค้นหาเริ่มต้น</translation> +<translation id="7121046543122812054">นโยบายนี้เลิกใช้งานแล้ว ให้ลองใช้ <ph name="BROWSER_SIGNIN_POLICY_NAME" /> แทน + + อนุญาตให้ผู้ใช้ลงชื่อเข้าใช้ "<ph name="PRODUCT_NAME" />" + + การตั้งค่านโยบายนี้เป็น "เปิดใช้" จะอนุญาตให้ผู้ใช้ลงชื่อเข้าใช้ "<ph name="PRODUCT_NAME" />" + การตั้งค่านโยบายนี้เป็น "ปิดใช้" จะป้องกันไม่ให้มีการลงชื่อเข้าใช้ และยังบล็อกแอปและส่วนขยายที่ใช้ chrome.identity API ไม่ให้ทำงานด้วย โปรดใช้ <ph name="SYNC_DISABLED_POLICY_NAME" /> แทนเพื่อหลีกเลี่ยงปัญหานี้ + </translation> <translation id="7122626777103192518">การตั้งค่านโยบายเป็น "จริง" จะทำให้แชร์ข้อความ/ไฟล์จากแอป Android ไปยังเว็บแอปที่รองรับได้โดยใช้ระบบการแชร์ในตัวของ Android เมื่อเปิดใช้ การดำเนินการนี้จะส่งข้อมูลเมตาของเว็บแอปที่ติดตั้งไปยัง Google เพื่อสร้างและติดตั้งแอป Android ที่แสดงถึงเว็บแอป การตั้งค่านโยบายเป็น "เท็จ" จะปิดใช้ฟังก์ชันการทำงานนี้</translation>
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb index 48e9c58..f43a77f 100644 --- a/components/policy/resources/policy_templates_tr.xtb +++ b/components/policy/resources/policy_templates_tr.xtb
@@ -108,6 +108,11 @@ Bu politikayı ayarlarsanız kullanıcılar tarafından değiştirilemez.</translation> <translation id="1123650965531933634">Pencere yerleşimi iznini tüm sitelerde varsayılan olarak reddeder</translation> +<translation id="112496019059412872">Kerberos kimlik doğrulama iletişim kutusunda "Şifreyi hatırla" özelliğinin etkinleştirilip etkinleştirilmediğini kontrol eder. Şifreler diskte şifrelenmiş olarak saklanır ve yalnızca Kerberos sistemi arka alan programı tarafından ve bir kullanıcı oturumu sırasında erişilebilir. + + Bu politika etkinleştirilir veya ayarlanırsa kullanıcılar, tekrar girmeleri gerekmesin diye Kerberos şifrelerinin hatırlanıp hatırlanmayacağına karar verebilirler. Ek bir kimlik doğrulama işlemi (iki faktörlü kimlik doğrulama) gerekmedikçe Kerberos biletleri otomatik olarak getirilir. + + Bu politika devre dışı bırakılırsa şifreler hiçbir zaman hatırlanmaz ve daha önce saklanan tüm şifreler silinir. Kullanıcılar, Kerberos sisteminde kimlik doğrulamaları gerektiğinde her zaman şifrelerini girmelidirler. Sunucu ayarlarına bağlı olarak, bu genellikle her 8 saatte bir ile birkaç ayda bir arasında olur.</translation> <translation id="1133622335785078255">Kullanıcıların, <ph name="LACROS_NAME" /> tarayıcıda hem ikinci profiller oluşturup kullanmalarına hem de misafir modunu kullanmalarına izin ver</translation> <translation id="1133814529606590009">Politika, Etkin değerine ayarlanırsa kullanıcının ziyaret ettiği sayfaların URL'lerini, arama ve göz atmayı iyileştirmek için Google'a gönderen, URL içeren veya URL'lerle ilişkili anonim veri toplama her zaman etkin olur. @@ -4913,6 +4918,12 @@ Politika, Devre Dışı değerine ayarlanırsa WPAD optimizasyonu devre dışı bırakılarak <ph name="PRODUCT_NAME" /> ürününün DNS tabanlı WPAD sunucularını daha fazla beklemesine neden olur. Bu politika ayarlansa da ayarlanmasa da kullanıcılar WPAD optimizasyonu ayarını değiştiremez.</translation> +<translation id="6365249741643189510">Bu politika, kurumsal kullanıcılar için Projector uygulamasının ekran kaydı oluşturup metne dönüştürmesine ve bunları Drive'a yüklemesine izin verir. + Bu politika Family Link kullanıcılarını etkilemez. + Bu politika Family Link kullanıcıları için <ph name="PROJECTOR_DOGFOOD_FOR_FAMILY_LINK_ENABLED_POLICY_NAME" /> politikasını etkilemez. + + Politika ayarlanmazsa veya etkinleştirilirse Projector etkinleştirilir. + Politika devre dışı bırakılırsa Projector da devre dışı bırakılır.</translation> <translation id="6366574325767783825">Politika True (Doğru) değerine ayarlanır veya ayarlanmadan bırakılırsa <ph name="PRODUCT_NAME" />, İmzalanmış HTTP Takası olarak yayınlanan web içeriklerini kabul eder. Politikanın False (Yanlış) değerine ayarlanması, İmzalanmış HTTP Takası içeriğinin yüklenmesini önler.</translation> @@ -5039,6 +5050,7 @@ <translation id="6518102411616460786">Hedef kanalın kanal sürümü değişikliğini yakalamasını bekle</translation> <translation id="6520802717075138474">İlk çalıştırmada arama motorlarını varsayılan tarayıcıdan içe aktar</translation> <translation id="6521971538031711337">Yönetilen kullanıcının, cihazın ana makine adını yapılandırmasını engelle</translation> +<translation id="652593254122955308">Boşta kalan profil kapatılıncaya kadar zaman aşımı</translation> <translation id="6532026122543921610"><ph name="SYSTEM_TIMEZONE_POLICY_NAME" /> politikası otomatik saat dilimi algılama ayarını kapatmadıkça, politikayı ayarlamak kullanıcıların değiştiremeyeceği otomatik saat dilimi algılama yöntemini belirtir. Politika ayarları: @@ -7219,6 +7231,13 @@ Bu politika ayarlanmazsa ağ korumalı alanının varsayılan yapılandırması kullanılır. Bu yapılandırma <ph name="PRODUCT_NAME" /> sürümüne, mevcut saha denemelerine ve platforma bağlı olarak değişebilir. Bu politika, ağ hizmeti korumalı alanının çalışmasını etkileyen üçüncü taraf yazılımı kullanan işletmelere ağ korumalı alanını devre dışı bırakma esnekliği sunmak amacıyla tasarlanmıştır.</translation> <translation id="8842208363354615697">Yalnızca HTTPS Modunun etkinleştirilmesine izin ver</translation> +<translation id="8850156309475162935">Bilgisayar boşta kaldığında işlem tetikler. + + Bu politika pozitif bir sayıya ayarlandığında dakika sayısı ayarlanmış demektir. Ayarlanan dakika sayısı boyunca kullanıcı girişi olmazsa <ph name="PRODUCT_NAME" /> tüm tarayıcı pencerelerini kapatır ve profil seçiciyi gösterir. + + Bu politika 5'ten daha düşük bir sayıya ayarlanırsa veya ayarlanmadan bırakılırsa bilgisayar boşta kaldığında hiçbir şey olmaz. + + "Kullanıcı girişi", işletim sistemi API'leri tarafından tanımlanır ve fareyi hareket ettirme ya da klavyede yazma gibi işlemleri içerir.</translation> <translation id="885147810817138322">Kullanıcıya medya önerileri göster</translation> <translation id="8852579753940989645">Oluşturucu Kod Bütünlüğü'nü etkinleştir</translation> <translation id="8854571659927427063">Politika Etkin değerine ayarlanırsa önceki varsayılan tarayıcıdan yer işaretleri ilk çalıştırmada içe aktarılır. Politika Devre dışı değerine ayarlanır veya ayarlanmadan bırakılırsa yer işaretleri ilk çalıştırmada içe aktarılmaz. @@ -7330,6 +7349,13 @@ <translation id="8983537551095611459">Kısıtlanmış yönetilen misafir oturumunu temizleme prosedüründen muaf tutulan uzantı kimliklerinin listesini yapılandırın</translation> <translation id="8983539044126123594">Ek Google hesaplarıyla oturum açmayı etkinleştir</translation> <translation id="8992176907758534924">Hiçbir sitenin resimleri görüntülemesine izin verme</translation> +<translation id="8994954504552592260"><ph name="MS_AD_NAME" /> tarafından yönetilen cihazların bulut yönetimine taşınmasını etkinleştir. Bu politika, bir şirketteki çeşitli cihazların hiç dokunulmadan uzaktan taşınmasına olanak tanır. Ayrıca, taşıma işlemi son kullanıcılar açısından mümkün olduğunca şeffaf bir şekilde gerçekleştirilir. + + Bu politika etkinleştirilirse ve kayıt kimliği halihazırda DMServer'a yüklenmiş olursa cihazın powerwash işlevi uzaktan tetiklenir. + + Bu politika devre dışı bırakılır veya ayarlanmazsa, kayıt kimliğinin yüklenme durumu ne olursa olsun cihazın powerwash işlevi uzaktan tetiklenmez. + + Bu denetim, giriş ekranı her yüklendiğinde tetiklenir. Cihazda giriş ekranı açık kalırsa denetim saatte bir yeniden tetiklenir. Böylece, taşıma işlemi kullanıcı oturumunun ortasında başlamaz ve son kullanıcıların bundan dolayı sorun yaşama ihtimali ortadan kalkar.</translation> <translation id="9007632512838819703">Bu politika kullanımdan kaldırıldı, lütfen bunun yerine <ph name="SPELLCHECK_LANGUAGE_BLOCKLIST_POLICY_NAME" /> politikasını kullanın. Yazım denetimi dillerini zorla devre dışı bırakır. Bu listedeki tanınmayan diller yoksayılır.
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index ab0ca74c..ae4051e 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -108,6 +108,11 @@ Якщо це правило налаштовано, користувачі не зможуть змінювати його.</translation> <translation id="1123650965531933634">Забороняє розміщення вікон для всіх сайтів за умовчанням</translation> +<translation id="112496019059412872">Указує, чи функцію "Запам’ятати пароль" увімкнено у вікні автентифікації Kerberos. Паролі зберігаються зашифрованими на диску. Вони доступні лише програмі daemon системи Kerberos і під час сеансу користувача. + + Якщо це правило ввімкнено або не налаштовано, користувачі вирішують, чи потрібно запам’ятовувати паролі Kerberos, щоб не вводити їх повторно. Запити Kerberos отримуються автоматично, якщо не потрібно проходити додатковий крок автентифікації (двохетапну перевірку). + + Якщо це правило вимкнено, нові паролі ніколи не запам’ятовуються, а збережені раніше видаляються. Користувачі повинні вводити пароль щоразу, коли автентифікуються в системі Kerberos. Залежно від налаштувань сервера, це відбувається в період від кожних 8 годин до кількох місяців.</translation> <translation id="1133622335785078255">Дозволити користувачам створювати й використовувати додаткові профілі та вмикати режим гостя у веб-переглядачі <ph name="LACROS_NAME" /></translation> <translation id="1133814529606590009">Якщо ввімкнути це правило, завжди збиратимуться анонімні дані за допомогою URL-адрес (адреси відвіданих сторінок надсилатимуться до Google, щоб покращити пошук і веб-перегляд). @@ -4956,6 +4961,12 @@ Якщо це правило вимкнено, оптимізацію WPAD буде деактивовано. Через це <ph name="PRODUCT_NAME" /> довше чекатиме на відповідь серверів WPAD на основі DNS. Незалежно від того, чи це правило налаштовано, користувачі не зможуть змінювати параметри оптимізації WPAD.</translation> +<translation id="6365249741643189510">Для корпоративних користувачів це правило дає функції Projector дозвіл на запис відео з екрана та його перетворення на текст, а також завантаження на Диск. + Це правило не впливає на користувачів Family Link + і не стосується правила <ph name="PROJECTOR_DOGFOOD_FOR_FAMILY_LINK_ENABLED_POLICY_NAME" /> для користувачів Family Link. + + Якщо це правило не налаштовано або ввімкнено, Projector буде ввімкнено, + а якщо його вимкнути, Projector буде вимкнено.</translation> <translation id="6366574325767783825">Якщо для цього правила вибрано значення True або його не налаштовано, <ph name="PRODUCT_NAME" /> прийматиме веб-контент, який розміщено через технологію Signed HTTP Exchange. Якщо для цього правила вибрано значення False, такий контент не завантажуватиметься.</translation> @@ -5081,6 +5092,7 @@ <translation id="6518102411616460786">Чекати, доки цільова версія збігатиметься з версією, яку повертають</translation> <translation id="6520802717075138474">Імпорт пошукових систем із веб-переглядача за умовчанням під час першого запуску</translation> <translation id="6521971538031711337">Заборонити керованим користувачам налаштовувати ім’я хосту на пристрої</translation> +<translation id="652593254122955308">Час очікування до закриття неактивного профілю</translation> <translation id="6532026122543921610">Якщо правило <ph name="SYSTEM_TIMEZONE_POLICY_NAME" /> не вимкне автоматичне визначення часового поясу, тоді налаштування цього правила вказують метод автоматичного визначення часового поясу, і користувачі не можуть змінити його. Якщо для цього правила вибрано значення: @@ -7271,6 +7283,13 @@ Якщо не налаштувати це правило, для мережі застосовуватимуться стандартні параметри щодо ізольованого програмного середовища. Вони можуть відрізнятися залежно від випуску <ph name="PRODUCT_NAME" />, активних тестувань і платформи. Це правило дає можливість підприємствам вимикати для мережі ізольоване програмне середовище, якщо з ним конфліктує ПЗ незалежних розробників.</translation> <translation id="8842208363354615697">Дозволити вмикати режим "Лише HTTPS"</translation> +<translation id="8850156309475162935">Активує дію, коли комп’ютер неактивний. + + Якщо для правила вказано додатне число, воно означає кількість хвилин. Якщо протягом цього часу користувач не виконує жодних дій, <ph name="PRODUCT_NAME" /> закриває всі вікна веб-переглядача та відображає засіб вибору профілю. + + Якщо правило не налаштовано або його значення менше за 5, веб-переглядач не реагуватиме на бездіяльність користувача. + + Що саме вважається діями користувача, визначають API операційної системи (це може бути рух мишею або введення тексту на клавіатурі).</translation> <translation id="885147810817138322">Показувати користувачу рекомендації щодо медіаконтенту</translation> <translation id="8852579753940989645">Увімкнути цілісність коду засобу обробки відео</translation> <translation id="8854571659927427063">Якщо це правило активовано, закладки з попереднього веб-переглядача за умовчанням імпортуються під час першого запуску. Якщо це правило деактивовано або не налаштовано, закладки не імпортуються під час першого запуску. @@ -7382,6 +7401,13 @@ <translation id="8983537551095611459">Налаштувати список ідентифікаторів розширень-винятків у процедурі очищення керованих сеанів у режимі "Гість"</translation> <translation id="8983539044126123594">Увімкнути вхід у додаткові облікові записи Google</translation> <translation id="8992176907758534924">Забороняти всім сайтам показувати зображення</translation> +<translation id="8994954504552592260">Увімкнути перенесення пристроїв, якими керує <ph name="MS_AD_NAME" />, для хмарного керування. Це правило дає змогу дистанційно розпочати одночасне віддалене перенесення кількох пристроїв, що належать компанії. Крім того, перенесення буде максимально прозорим для кінцевих користувачів. + + Якщо це правило ввімкнено й реєстраційний ідентифікатор уже завантажено в DMServer, активується віддалене очищення пристрою за допомогою функції Powerwash. + + Якщо це правило вимкнено або не налаштовано, віддалене очищення пристрою за допомогою функції Powerwash не активується, незалежно від статусу реєстраційного ідентифікатора. + + Ця перевірка активується щоразу після завантаження екрана входу й повторюється щогодини (якщо на пристрої відображається екран входу). Через це перенесення не розпочинається під час сеансу, спричиняючи можливі проблеми для кінцевих користувачів.</translation> <translation id="9007632512838819703">Це правило більше не підтримується. Натомість використовуйте <ph name="SPELLCHECK_LANGUAGE_BLOCKLIST_POLICY_NAME" />. Примусово вимикає мови перевірки правопису Нерозпізнані мови в цьому списку ігноруються.
diff --git a/components/printing/browser/print_to_pdf/BUILD.gn b/components/printing/browser/print_to_pdf/BUILD.gn index 028212e..abe92fd9 100644 --- a/components/printing/browser/print_to_pdf/BUILD.gn +++ b/components/printing/browser/print_to_pdf/BUILD.gn
@@ -11,6 +11,8 @@ sources = [ "pdf_print_manager.cc", "pdf_print_manager.h", + "pdf_print_result.cc", + "pdf_print_result.h", "pdf_print_utils.cc", "pdf_print_utils.h", ]
diff --git a/components/printing/browser/print_to_pdf/pdf_print_manager.cc b/components/printing/browser/print_to_pdf/pdf_print_manager.cc index 82591f8..3975b60 100644 --- a/components/printing/browser/print_to_pdf/pdf_print_manager.cc +++ b/components/printing/browser/print_to_pdf/pdf_print_manager.cc
@@ -6,7 +6,9 @@ #include <utility> +#include "base/bind.h" #include "build/build_config.h" +#include "components/printing/browser/print_to_pdf/pdf_print_result.h" #include "components/printing/browser/print_to_pdf/pdf_print_utils.h" #include "printing/mojom/print.mojom.h" #include "printing/page_range.h" @@ -60,37 +62,6 @@ print_manager->BindReceiver(std::move(receiver), rfh); } -// static -std::string PdfPrintManager::PrintResultToString(PrintResult result) { - switch (result) { - case PRINT_SUCCESS: - return std::string(); // no error message - case PRINTING_FAILED: - return "Printing failed"; - case INVALID_PRINTER_SETTINGS: - return "Show invalid printer settings error"; - case INVALID_MEMORY_HANDLE: - return "Invalid memory handle"; - case METAFILE_MAP_ERROR: - return "Map to shared memory error"; - case METAFILE_INVALID_HEADER: - return "Invalid metafile header"; - case METAFILE_GET_DATA_ERROR: - return "Get data from metafile error"; - case SIMULTANEOUS_PRINT_ACTIVE: - return "The previous printing job hasn't finished"; - case PAGE_RANGE_SYNTAX_ERROR: - return "Page range syntax error"; - case PAGE_RANGE_INVALID_RANGE: - return "Page range is invalid (start > end)"; - case PAGE_COUNT_EXCEEDED: - return "Page range exceeds page count"; - default: - NOTREACHED(); - return "Unknown PrintResult"; - } -} - void PdfPrintManager::PrintToPdf( content::RenderFrameHost* rfh, const std::string& page_ranges, @@ -99,13 +70,13 @@ DCHECK(callback); if (callback_) { - std::move(callback).Run(SIMULTANEOUS_PRINT_ACTIVE, + std::move(callback).Run(PdfPrintResult::SIMULTANEOUS_PRINT_ACTIVE, base::MakeRefCounted<base::RefCountedString>()); return; } if (!rfh->IsRenderFrameLive()) { - std::move(callback).Run(PRINTING_FAILED, + std::move(callback).Run(PdfPrintResult::PRINTING_FAILED, base::MakeRefCounted<base::RefCountedString>()); return; } @@ -113,13 +84,13 @@ absl::variant<printing::PageRanges, PageRangeError> parsed_ranges = TextPageRangesToPageRanges(page_ranges); if (absl::holds_alternative<PageRangeError>(parsed_ranges)) { - PrintResult print_result; + PdfPrintResult print_result; switch (absl::get<PageRangeError>(parsed_ranges)) { case PageRangeError::kSyntaxError: - print_result = PAGE_RANGE_SYNTAX_ERROR; + print_result = PdfPrintResult::PAGE_RANGE_SYNTAX_ERROR; break; case PageRangeError::kInvalidRange: - print_result = PAGE_RANGE_INVALID_RANGE; + print_result = PdfPrintResult::PAGE_RANGE_INVALID_RANGE; break; } std::move(callback).Run(print_result, @@ -132,7 +103,39 @@ set_cookie(print_pages_params->params->document_cookie); callback_ = std::move(callback); - GetPrintRenderFrame(rfh)->PrintWithParams(std::move(print_pages_params)); + // There is no need for a weak pointer here since the mojo proxy is held + // in the base class. If we're gone, mojo will discard the callback. + GetPrintRenderFrame(rfh)->PrintWithParams( + std::move(print_pages_params), + base::BindOnce(&PdfPrintManager::OnDidPrintWithParams, + base::Unretained(this))); +} + +void PdfPrintManager::OnDidPrintWithParams( + printing::mojom::PrintWithParamsResultPtr result) { + if (result->is_failure_reason()) { + switch (result->get_failure_reason()) { + case printing::mojom::PrintFailureReason::kGeneralFailure: + ReleaseJob(PdfPrintResult::PRINTING_FAILED); + return; + case printing::mojom::PrintFailureReason::kInvalidPageRange: + ReleaseJob(PdfPrintResult::PAGE_COUNT_EXCEEDED); + return; + } + } + + auto& content = *result->get_params()->content; + if (!content.metafile_data_region.IsValid()) { + ReleaseJob(PdfPrintResult::INVALID_MEMORY_HANDLE); + return; + } + base::ReadOnlySharedMemoryMapping map = content.metafile_data_region.Map(); + if (!map.IsValid()) { + ReleaseJob(PdfPrintResult::METAFILE_MAP_ERROR); + return; + } + data_ = std::string(static_cast<const char*>(map.memory()), map.size()); + ReleaseJob(PdfPrintResult::PRINT_SUCCESS); } void PdfPrintManager::GetDefaultPrintSettings( @@ -151,15 +154,7 @@ } void PdfPrintManager::ShowInvalidPrinterSettingsError() { - ReleaseJob(INVALID_PRINTER_SETTINGS); -} - -void PdfPrintManager::PrintingFailed( - int32_t cookie, - printing::mojom::PrintFailureReason reason) { - ReleaseJob(reason == printing::mojom::PrintFailureReason::kInvalidPageRange - ? PAGE_COUNT_EXCEEDED - : PRINTING_FAILED); + ReleaseJob(PdfPrintResult::INVALID_PRINTER_SETTINGS); } #if BUILDFLAG(ENABLE_PRINT_PREVIEW) @@ -224,47 +219,27 @@ } if (callback_) { - std::move(callback_).Run(PRINTING_FAILED, + std::move(callback_).Run(PdfPrintResult::PRINTING_FAILED, base::MakeRefCounted<base::RefCountedString>()); } Reset(); } -void PdfPrintManager::DidPrintDocument( - printing::mojom::DidPrintDocumentParamsPtr params, - DidPrintDocumentCallback callback) { - auto& content = *params->content; - if (!content.metafile_data_region.IsValid()) { - ReleaseJob(INVALID_MEMORY_HANDLE); - std::move(callback).Run(false); - return; - } - base::ReadOnlySharedMemoryMapping map = content.metafile_data_region.Map(); - if (!map.IsValid()) { - ReleaseJob(METAFILE_MAP_ERROR); - std::move(callback).Run(false); - return; - } - data_ = std::string(static_cast<const char*>(map.memory()), map.size()); - std::move(callback).Run(true); - ReleaseJob(PRINT_SUCCESS); -} - void PdfPrintManager::Reset() { printing_rfh_ = nullptr; callback_.Reset(); data_.clear(); } -void PdfPrintManager::ReleaseJob(PrintResult result) { +void PdfPrintManager::ReleaseJob(PdfPrintResult result) { if (!callback_) { DLOG(ERROR) << "ReleaseJob is called when callback_ is null. Check whether " "ReleaseJob is called more than once."; return; } - DCHECK(result == PRINT_SUCCESS || data_.empty()); + DCHECK(result == PdfPrintResult::PRINT_SUCCESS || data_.empty()); std::move(callback_).Run(result, base::RefCountedString::TakeString(&data_)); // TODO(https://crbug.com/1286556): In theory, this should not be needed. In // practice, nothing seems to restrict receiving incoming Mojo method calls @@ -273,7 +248,8 @@ // This should probably be changed so that the browser pushes endpoints to the // renderer rather than the renderer connecting on-demand to the browser... if (printing_rfh_ && printing_rfh_->IsRenderFrameLive()) { - GetPrintRenderFrame(printing_rfh_)->PrintingDone(result == PRINT_SUCCESS); + GetPrintRenderFrame(printing_rfh_) + ->PrintingDone(result == PdfPrintResult::PRINT_SUCCESS); } Reset(); }
diff --git a/components/printing/browser/print_to_pdf/pdf_print_manager.h b/components/printing/browser/print_to_pdf/pdf_print_manager.h index bb2508e2..b2dcff28 100644 --- a/components/printing/browser/print_to_pdf/pdf_print_manager.h +++ b/components/printing/browser/print_to_pdf/pdf_print_manager.h
@@ -13,6 +13,7 @@ #include "base/memory/ref_counted_memory.h" #include "build/build_config.h" #include "components/printing/browser/print_manager.h" +#include "components/printing/browser/print_to_pdf/pdf_print_result.h" #include "components/printing/common/print.mojom.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_contents_observer.h" @@ -24,22 +25,8 @@ class PdfPrintManager : public printing::PrintManager, public content::WebContentsUserData<PdfPrintManager> { public: - enum PrintResult { - PRINT_SUCCESS, - PRINTING_FAILED, - INVALID_PRINTER_SETTINGS, - INVALID_MEMORY_HANDLE, - METAFILE_MAP_ERROR, - METAFILE_INVALID_HEADER, - METAFILE_GET_DATA_ERROR, - SIMULTANEOUS_PRINT_ACTIVE, - PAGE_RANGE_SYNTAX_ERROR, - PAGE_RANGE_INVALID_RANGE, - PAGE_COUNT_EXCEEDED, - }; - using PrintToPdfCallback = - base::OnceCallback<void(PrintResult, + base::OnceCallback<void(PdfPrintResult, scoped_refptr<base::RefCountedMemory>)>; ~PdfPrintManager() override; @@ -52,30 +39,27 @@ receiver, content::RenderFrameHost* rfh); - static std::string PrintResultToString(PrintResult result); - void PrintToPdf(content::RenderFrameHost* rfh, const std::string& page_ranges, printing::mojom::PrintPagesParamsPtr print_page_params, PrintToPdfCallback callback); private: - explicit PdfPrintManager(content::WebContents* web_contents); friend class content::WebContentsUserData<PdfPrintManager>; + explicit PdfPrintManager(content::WebContents* web_contents); + + void OnDidPrintWithParams(printing::mojom::PrintWithParamsResultPtr result); + // WebContentsObserver overrides (via PrintManager): void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override; // printing::mojom::PrintManagerHost: - void DidPrintDocument(printing::mojom::DidPrintDocumentParamsPtr params, - DidPrintDocumentCallback callback) override; void GetDefaultPrintSettings( GetDefaultPrintSettingsCallback callback) override; void ScriptedPrint(printing::mojom::ScriptedPrintParamsPtr params, ScriptedPrintCallback callback) override; void ShowInvalidPrinterSettingsError() override; - void PrintingFailed(int32_t cookie, - printing::mojom::PrintFailureReason reason) override; #if BUILDFLAG(ENABLE_PRINT_PREVIEW) void UpdatePrintSettings(int32_t cookie, base::Value::Dict job_settings, @@ -99,7 +83,7 @@ #endif void Reset(); - void ReleaseJob(PrintResult result); + void ReleaseJob(PdfPrintResult result); raw_ptr<content::RenderFrameHost> printing_rfh_ = nullptr; PrintToPdfCallback callback_;
diff --git a/components/printing/browser/print_to_pdf/pdf_print_result.cc b/components/printing/browser/print_to_pdf/pdf_print_result.cc new file mode 100644 index 0000000..836cfb1 --- /dev/null +++ b/components/printing/browser/print_to_pdf/pdf_print_result.cc
@@ -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. + +#include "components/printing/browser/print_to_pdf/pdf_print_result.h" + +#include "base/notreached.h" + +namespace print_to_pdf { + +std::string PdfPrintResultToString(PdfPrintResult result) { + switch (result) { + case PdfPrintResult::PRINT_SUCCESS: + return std::string(); // no error message + case PdfPrintResult::PRINTING_FAILED: + return "Printing failed"; + case PdfPrintResult::INVALID_PRINTER_SETTINGS: + return "Show invalid printer settings error"; + case PdfPrintResult::INVALID_MEMORY_HANDLE: + return "Invalid memory handle"; + case PdfPrintResult::METAFILE_MAP_ERROR: + return "Map to shared memory error"; + case PdfPrintResult::SIMULTANEOUS_PRINT_ACTIVE: + return "The previous printing job hasn't finished"; + case PdfPrintResult::PAGE_RANGE_SYNTAX_ERROR: + return "Page range syntax error"; + case PdfPrintResult::PAGE_RANGE_INVALID_RANGE: + return "Page range is invalid (start > end)"; + case PdfPrintResult::PAGE_COUNT_EXCEEDED: + return "Page range exceeds page count"; + } +} + +} // namespace print_to_pdf
diff --git a/components/printing/browser/print_to_pdf/pdf_print_result.h b/components/printing/browser/print_to_pdf/pdf_print_result.h new file mode 100644 index 0000000..3f526937 --- /dev/null +++ b/components/printing/browser/print_to_pdf/pdf_print_result.h
@@ -0,0 +1,29 @@ +// 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_PRINTING_BROWSER_PRINT_TO_PDF_PDF_PRINT_RESULT_H_ +#define COMPONENTS_PRINTING_BROWSER_PRINT_TO_PDF_PDF_PRINT_RESULT_H_ + +#include <string> + +namespace print_to_pdf { + +enum class PdfPrintResult { + PRINT_SUCCESS, + PRINTING_FAILED, + INVALID_PRINTER_SETTINGS, + INVALID_MEMORY_HANDLE, + METAFILE_MAP_ERROR, + SIMULTANEOUS_PRINT_ACTIVE, + PAGE_RANGE_SYNTAX_ERROR, + PAGE_RANGE_INVALID_RANGE, + PAGE_COUNT_EXCEEDED, + +}; + +std::string PdfPrintResultToString(PdfPrintResult result); + +} // namespace print_to_pdf + +#endif // COMPONENTS_PRINTING_BROWSER_PRINT_TO_PDF_PDF_PRINT_RESULT_H_
diff --git a/components/printing/common/print.mojom b/components/printing/common/print.mojom index f2c17a8f..95d9f190 100644 --- a/components/printing/common/print.mojom +++ b/components/printing/common/print.mojom
@@ -275,6 +275,11 @@ kInvalidPageRange, }; +union PrintWithParamsResult { + DidPrintDocumentParams params; + PrintFailureReason failure_reason; +}; + // Render process interface exposed to the browser to handle most of the // printing grunt work for RenderView. interface PrintRenderFrame { @@ -289,7 +294,8 @@ // interactive print preview -- the final print settings are supplied by // the caller and printing is completed without further round-trips to the // browser. - PrintWithParams(PrintPagesParams params); + PrintWithParams(PrintPagesParams params) + => (PrintWithParamsResult result); // Tells the RenderFrame to switch the CSS to print media type, render every // requested page using the print preview document's frame/node, and then
diff --git a/components/printing/renderer/print_render_frame_helper.cc b/components/printing/renderer/print_render_frame_helper.cc index bb0a934f..0766270 100644 --- a/components/printing/renderer/print_render_frame_helper.cc +++ b/components/printing/renderer/print_render_frame_helper.cc
@@ -1334,19 +1334,26 @@ } void PrintRenderFrameHelper::PrintWithParams( - mojom::PrintPagesParamsPtr settings) { + mojom::PrintPagesParamsPtr settings, + PrintWithParamsCallback callback) { DCHECK(!settings->params->dpi.IsEmpty()); DCHECK(settings->params->document_cookie); ScopedIPC scoped_ipc(weak_ptr_factory_.GetWeakPtr()); - if (ipc_nesting_level_ > kAllowedIpcDepthForPrint) + if (ipc_nesting_level_ > kAllowedIpcDepthForPrint) { + std::move(callback).Run(mojom::PrintWithParamsResult::NewFailureReason( + mojom::PrintFailureReason::kGeneralFailure)); return; + } blink::WebLocalFrame* frame = render_frame()->GetWebFrame(); frame->DispatchBeforePrintEvent(/*print_client=*/nullptr); // Don't print if the RenderFrame is gone. - if (render_frame_gone_) + if (render_frame_gone_) { + std::move(callback).Run(mojom::PrintWithParamsResult::NewFailureReason( + mojom::PrintFailureReason::kGeneralFailure)); return; + } // If we are printing a frame with an internal PDF plugin element, find the // plugin node and print that instead. @@ -1361,6 +1368,10 @@ SetPrintPagesParams(*settings); prep_frame_view_ = std::make_unique<PrepareFrameAndViewForPrint>( *settings->params, frame, plugin_node, /* ignore_css_margins=*/false); + + CHECK(!print_with_params_callback_); + print_with_params_callback_ = std::move(callback); + PrintPages(); FinishFramePrinting(); @@ -2126,6 +2137,19 @@ } void PrintRenderFrameHelper::DidFinishPrinting(PrintingResult result) { + // Code in PrintPagesNative() handles the success case firing the callback, + // so if we get here with the pending callback it must be the failure case. + if (print_with_params_callback_) { + DCHECK_NE(result, OK); + std::move(print_with_params_callback_) + .Run(mojom::PrintWithParamsResult::NewFailureReason( + result == INVALID_PAGE_RANGE + ? mojom::PrintFailureReason::kInvalidPageRange + : mojom::PrintFailureReason::kGeneralFailure)); + Reset(); + return; + } + int cookie = print_pages_params_ ? print_pages_params_->params->document_cookie : 0; #if BUILDFLAG(ENABLE_PRINT_PREVIEW) @@ -2172,6 +2196,11 @@ break; #endif // BUILDFLAG(ENABLE_PRINT_PREVIEW) } + + Reset(); +} + +void PrintRenderFrameHelper::Reset() { prep_frame_view_.reset(); print_pages_params_.reset(); notify_browser_of_print_failure_ = true; @@ -2285,6 +2314,13 @@ #if BUILDFLAG(IS_WIN) page_params->physical_offsets = printer_printable_area_.origin(); #endif + + if (print_with_params_callback_) { + std::move(print_with_params_callback_) + .Run(mojom::PrintWithParamsResult::NewParams(std::move(page_params))); + return true; + } + bool completed = false; GetPrintManagerHost()->DidPrintDocument(std::move(page_params), &completed); return completed;
diff --git a/components/printing/renderer/print_render_frame_helper.h b/components/printing/renderer/print_render_frame_helper.h index c2bf286..6602654 100644 --- a/components/printing/renderer/print_render_frame_helper.h +++ b/components/printing/renderer/print_render_frame_helper.h
@@ -256,7 +256,8 @@ // printing::mojom::PrintRenderFrame: void PrintRequestedPages() override; - void PrintWithParams(mojom::PrintPagesParamsPtr params) override; + void PrintWithParams(mojom::PrintPagesParamsPtr params, + PrintWithParamsCallback callback) override; #if BUILDFLAG(ENABLE_PRINT_PREVIEW) void PrintForSystemDialog() override; void SetPrintPreviewUI( @@ -467,6 +468,9 @@ void QuitScriptedPrintPreviewRunLoop(); void QuitGetPrintSettingsFromUserRunLoop(); + // Resets internal state + void Reset(); + // WebView used only to print the selection. std::unique_ptr<PrepareFrameAndViewForPrint> prep_frame_view_; bool reset_prep_frame_view_ = false; @@ -694,6 +698,9 @@ // parameters so that it can be invoked after DidStopLoading. base::OnceClosure on_stop_loading_closure_; + // This is used to report PrintWithParams() call result. + PrintWithParamsCallback print_with_params_callback_; + // Stores the quit closures of Mojo responses. scoped_refptr<ClosuresForMojoResponse> closures_for_mojo_responses_;
diff --git a/components/safe_browsing/content/common/file_type_policies_policy_util.cc b/components/safe_browsing/content/common/file_type_policies_policy_util.cc index 15df3fa..e13effdc 100644 --- a/components/safe_browsing/content/common/file_type_policies_policy_util.cc +++ b/components/safe_browsing/content/common/file_type_policies_policy_util.cc
@@ -43,7 +43,7 @@ const std::string lower_extension = base::ToLowerASCII(extension); if (heuristic_overrides) { - base::ListValue domains_for_extension; + base::Value::List domains_for_extension; for (const base::Value& entry : heuristic_overrides->GetListDeprecated()) { const base::DictionaryValue& extension_domain_patterns_dict = base::Value::AsDictionaryValue(entry); @@ -62,11 +62,10 @@ } } - if (!domains_for_extension.GetListDeprecated().empty()) { + if (!domains_for_extension.empty()) { url_matcher::URLMatcher matcher; base::MatcherStringPattern::ID id(0); - url_matcher::util::AddFilters(&matcher, true, &id, - &domains_for_extension); + url_matcher::util::AddFilters(&matcher, true, &id, domains_for_extension); auto matching_set_size = matcher.MatchURL(normalized_url).size(); return matching_set_size > 0; }
diff --git a/components/safe_browsing/core/browser/verdict_cache_manager.cc b/components/safe_browsing/core/browser/verdict_cache_manager.cc index ab059db7..a9ab6ca 100644 --- a/components/safe_browsing/core/browser/verdict_cache_manager.cc +++ b/components/safe_browsing/core/browser/verdict_cache_manager.cc
@@ -54,7 +54,7 @@ const int kPageLoadTokenBytes = 32; // The expiration time of a page load token. -const int kPageLoadTokenExpireMinute = 5; +const int kPageLoadTokenExpireMinute = 10; // A helper class to include all match params. It is used as a centralized // place to determine if the current cache entry should be considered as a
diff --git a/components/safe_browsing/core/browser/verdict_cache_manager_unittest.cc b/components/safe_browsing/core/browser/verdict_cache_manager_unittest.cc index 4be882d..bc761a6b 100644 --- a/components/safe_browsing/core/browser/verdict_cache_manager_unittest.cc +++ b/components/safe_browsing/core/browser/verdict_cache_manager_unittest.cc
@@ -825,7 +825,7 @@ cache_manager_->GetPageLoadToken(url); ASSERT_TRUE(token.has_token_value()); - task_environment_.FastForwardBy(base::Minutes(6)); + task_environment_.FastForwardBy(base::Minutes(11)); token = cache_manager_->GetPageLoadToken(url); // Token is not found because it has already expired. ASSERT_FALSE(token.has_token_value());
diff --git a/components/search_engines/prepopulated_engines.json b/components/search_engines/prepopulated_engines.json index 03c0300..df0773c 100644 --- a/components/search_engines/prepopulated_engines.json +++ b/components/search_engines/prepopulated_engines.json
@@ -28,7 +28,7 @@ // Increment this if you change the data in ways that mean users with // existing data should get a new version. Otherwise, existing data may // continue to be used and updates made here will not always appear. - "kCurrentDataVersion": 130 + "kCurrentDataVersion": 131 }, // The following engines are included in country lists and are added to the @@ -108,7 +108,6 @@ "favicon_url": "https://cdn.ecosia.org/assets/images/ico/favicon.ico", "search_url": "https://www.ecosia.org/search?q={searchTerms}&addon=opensearch", "suggest_url": "https://ac.ecosia.org/autocomplete?q={searchTerms}&type=list", - "new_tab_url": "https://www.ecosia.org/newtab", "type": "SEARCH_ENGINE_ECOSIA", "id": 101 },
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb index f61311b..ef6303f 100644 --- a/components/strings/components_strings_am.xtb +++ b/components/strings/components_strings_am.xtb
@@ -116,6 +116,7 @@ <translation id="1263231323834454256">የንባብ ዝርዝር</translation> <translation id="1264309058268477500">ተለዋጭ</translation> <translation id="1264974993859112054">ሰፖርቶች</translation> +<translation id="1266469291454105242">የመሣሪያ መክፈቻ</translation> <translation id="1269516672602708785">በGoogle ጣቢያዎች ውስጥ አዲስ ጣቢያን በፍጥነት ፍጠር</translation> <translation id="1270502636509132238">የመውሰጃ ስልት</translation> <translation id="1281476433249504884">ቁልል 1</translation> @@ -330,6 +331,7 @@ <translation id="1753068535428855445">ለፍቅር መገናኘት እና ራስን ማስተዋወቅ</translation> <translation id="1753706481035618306">የገጽ ቁጥር</translation> <translation id="1755621011177747277">ጉዲፈቻ</translation> +<translation id="1756026472674246267">አገናኙን በአዲስ ትር ውስጥ ይክፈቱ</translation> <translation id="175656076281618225">ማጂክ</translation> <translation id="1757773103848038814">Monospace ቅርጸ-ቁምፊ</translation> <translation id="1763864636252898013">ይህ አገልጋይ <ph name="DOMAIN" /> መሆኑን ሊያረጋግጥ አልቻለም፤ የደህንነት እውቅና ማረጋገጫው በመሣሪያዎ ስርዓተ ክወና የሚታመን አይደለም። ይሄ በተሳሳተ አወቃቀር ወይም አንድ አጥቂ ግንኙነትዎን በመጥለፉ የተከሰተ ሊሆን ይችላል።</translation> @@ -455,6 +457,7 @@ <translation id="214556005048008348">ክፍያን ሰርዝ</translation> <translation id="2148613324460538318">ካርድ አክል</translation> <translation id="2149968176347646218">ግንኙነትዎ ደህንነቱ የተጠበቀ አይደለም</translation> +<translation id="2153609454945889823">የGoogle Play አገልግሎቶችን ለኤአር ይጭናሉ?</translation> <translation id="2154054054215849342">ስምረት ለእርስዎ ጎራ አይገኝም</translation> <translation id="2154484045852737596">ካርትን ያርትዑ</translation> <translation id="2161656808144014275">ጽሑፍ</translation> @@ -831,6 +834,7 @@ <translation id="3229277193950731405">የስሪት ሕብረቁምፊን ቅዳ</translation> <translation id="323107829343500871">የ<ph name="CREDIT_CARD" /> ሲቪሲ ያስገቡ</translation> <translation id="3234666976984236645">ሁልጊዜ በዚህ ጣቢያ ላይ ያለ አስፈላጊ ይዘትን አግኝ</translation> +<translation id="3238395604961564389">አገናኙን ማንነትዎን በማያሳውቅ መስኮት ይክፈቱ</translation> <translation id="3240683217920639535"><ph name="MANAGE_CHROME_THEMES_FOCUSED_FRIENDLY_MATCH_TEXT" />፣ የአሳሽዎን መልክ ለማበጀት ትርን ከዚያ አስገባን ይጫኑ</translation> <translation id="3240791268468473923">ደህንነቱ የተጠበቀ የመግቢያ ማስረጃ ምንም ተዛማጅ የመግቢያ ማስረጃ ሉህ አልተከፈተም</translation> <translation id="324180406144491771">የ«<ph name="HOST_NAME" />» አገናኞች ታግደዋል</translation> @@ -944,6 +948,7 @@ <translation id="3531780078352352885">የስራ ሉሆች</translation> <translation id="3532844647053365774"><ph name="HOST" /> ማይክሮፎንዎን መጠቀም ይፈልጋል</translation> <translation id="3533328374079021623">የመልዕክት ሳጥን 5</translation> +<translation id="3542768452570884558">አገናኙን በአዲስ መስኮት ይክፈቱ</translation> <translation id="3550112004925580947">የመስተንግዶ ኢንዱስትሪ</translation> <translation id="3552297013052089404">Sans-Serif ቅርጸ ቁምፊ</translation> <translation id="3558573058928565255">የቀን ሰዓት</translation> @@ -1114,11 +1119,13 @@ <translation id="4040350669425716613">ኮሌጆች እና ዩኒቨርሲቲዎች</translation> <translation id="4056223980640387499">ቀይ ቡናማ</translation> <translation id="4058922952496707368">ቁልፍ «<ph name="SUBKEY" />»፦ <ph name="ERROR" /></translation> +<translation id="4063924980214801036">ካርዶችን በበለጠ ፍጥነት ለማረጋገጥ የመሣሪያ መክፈቻን ይጠቀሙ</translation> <translation id="4067098466788473230">የትምህርት ልገሳዎች እና የነጻ ትምህርት ዕድሎች</translation> <translation id="4067263367174615723">C1 (የደብዳቤ ፖስታ)</translation> <translation id="4067947977115446013">የሚሰራ አድራሻ ያስገቡ</translation> <translation id="4072193657607981494">መመሪያዎችን በመጫን ላይ</translation> <translation id="4072486802667267160">የእርስዎን ትዕዛዝ መሥራት ላይ የሆነ ስህተት ነበር። እባክዎ እንደገና ይሞክሩ።</translation> +<translation id="4073376909608563327">የመሣሪያ መክፈቻን መጠቀም አልተቻለም</translation> <translation id="4073797364926776829">ካርድ ይመልከቱ</translation> <translation id="4075732493274867456">ደንበኛው እና አገልጋዩ የተለመደ የኤስኤስኤል ፕሮቶኮል ስሪት ወይም የስነ መሰውር ጥቅል አይደግፉም።</translation> <translation id="4079302484614802869">የተኪ ውቅር ቋሚ አገልጋዮችን ሳይሆን የ.pac ስክሪፕት ዩአርኤል ለመጠቀም ነው የተዋቀረው።</translation> @@ -1411,6 +1418,7 @@ <translation id="4840250757394056958">የChrome ታሪክዎን ይመልከቱ</translation> <translation id="484462545196658690">ራስ-ሰር</translation> <translation id="484671803914931257"><ph name="MERCHANT_NAME" /> ላይ ተጨማሪ ቅናሽ ያግኙ እና ሌሎች</translation> +<translation id="484988093836683706">የመሣሪያ መክፈቻን ተጠቀም</translation> <translation id="4850886885716139402">አሳይ</translation> <translation id="4852429274334674023">ስርዓተ ክወናዎች</translation> <translation id="485316830061041779">ጀርመን</translation> @@ -1798,6 +1806,7 @@ <translation id="5921185718311485855">አብራ</translation> <translation id="5921639886840618607">ወደ Google መለያ ካርድ ይቀመጥ?</translation> <translation id="5922853866070715753">በቃ ሊያልቅ ነው</translation> +<translation id="5923492272538889093">በካርድ ማረጋገጫ ኮድ ምትክ የመሣሪያ መክፈቻ ጥቅም ላይ ይዋል?</translation> <translation id="5928444777041341328">ቤት እና የአትክልት ስፍራ</translation> <translation id="5932224571077948991">ጣቢያ ረባሽ ወይም አሳሳች ማስታወቂያዎችን ያሳያል</translation> <translation id="5937560539988385583">ገጽ ተተርጉሟል</translation> @@ -1971,6 +1980,7 @@ <translation id="643051589346665201">የGoogle የይለፍ ቃል ቀይር</translation> <translation id="6433490469411711332">የዕውቂያ መረጃን ያርትዑ</translation> <translation id="6433595998831338502"><ph name="HOST_NAME" /> ማገናኘት አሻፈረኝ ብሏል።</translation> +<translation id="6433797564277305076">ከአሁን በኋላ የመሣሪያ መክፈቻን በመጠቀም በበለጠ ፍጥነት ካርዶችዎን ያረጋግጡ</translation> <translation id="6440503408713884761">የተተወ</translation> <translation id="6443406338865242315">የትኛዎቹ ቅጥያዎች እና ተሰኪዎች ናቸው እርስዎ የጫኑት</translation> <translation id="6446163441502663861">ካሁ (የደብዳቤ ፖስታ)</translation> @@ -2177,6 +2187,7 @@ <translation id="705310974202322020">{NUM_CARDS,plural, =1{ይህ ካርድ አሁን ሊቀመጥ አይችልም}one{እነዚህ ካርዶች አሁን ሊቀመጡ አይችሉም}other{እነዚህ ካርዶች አሁን ሊቀመጡ አይችሉም}}</translation> <translation id="7053983685419859001">አግድ</translation> <translation id="7058163556978339998">ይህን የድር ጣቢያ እውቅና ማረጋገጫ የሰጠው <ph name="ISSUER" /> መሆኑን <ph name="BROWSER" /> አረጋግጧል።</translation> +<translation id="7058774143982824355">CSV የይለፍ ቃል ተንታኝ አገልግሎት</translation> <translation id="7061777300866737982">የቤት ጥንቃቄ እና ደህንነት</translation> <translation id="7062635574500127092">ውሃ አረንጓዴ ሰማያዊ</translation> <translation id="706295145388601875">በChrome ቅንብሮች ውስጥ አድራሻዎችን ያክሉ እና ያቀናብሩ</translation> @@ -2441,6 +2452,7 @@ <translation id="7696089921647603491">የቆየ ተወዳጅ ሮክ እና አንጋፋዎች</translation> <translation id="7697066736081121494">Prc8 (የደብዳቤ ፖስታ)</translation> <translation id="769721561045429135">አሁን ላይ በዚህ መሣሪያ ላይ ብቻ ጥቅም ላይ ሊውሉ የሚችሉ ካርዶች አልዎት ካርዶችን መገምገም ለመቀጠል ጠቅ ያድርጉ።</translation> +<translation id="7698864304447945242">የGoogle Play አገልግሎቶችን ለኤአር ያዘምኑ?</translation> <translation id="7699293099605015246">ጽሑፎች አሁን አይገኙም</translation> <translation id="7701040980221191251">ምንም</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />ወደ <ph name="SITE" /> ቀጥል (ደህንነቱ ያልተጠበቀ)<ph name="END_LINK" /></translation> @@ -2453,6 +2465,7 @@ <translation id="7723047071702270851">ካርትን ያርትዑ</translation> <translation id="7734285854693414638">በGoogle ቅጾች ውስጥ አዲስ ቅጽ በፍጥነት ፍጠር</translation> <translation id="773466115871691567">ገጾችን ሁልጊዜ በ<ph name="SOURCE_LANGUAGE" /> ተርጉም</translation> +<translation id="7736959720849233795">የአገናኝ አድራሻን ይቅዱ</translation> <translation id="7740996059027112821">መደበኛ</translation> <translation id="77424286611022110">ይህ ጣቢያ ረባሽ ወይም አሳሳች ማስታወቂያዎችን ያሳያል። <ph name="LEARN_MORE_LINK_TEXT" /></translation> <translation id="774634243536837715">አደገኛ ይዘት ታግዷል።</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb index 1d0a400..d9c337a 100644 --- a/components/strings/components_strings_en-GB.xtb +++ b/components/strings/components_strings_en-GB.xtb
@@ -1059,6 +1059,7 @@ <translation id="3807873520724684969">Harmful content blocked.</translation> <translation id="3810973564298564668">Manage</translation> <translation id="3816482573645936981">Value (superseded)</translation> +<translation id="3823402221513322552">Your browser is managed by <ph name="BROWSER_DOMAIN" /> and your profile is managed by <ph name="PROFILE_DOMAIN" /></translation> <translation id="382518646247711829">If you use a proxy server...</translation> <translation id="3826050100957962900">Third-party sign-in</translation> <translation id="3827112369919217609">Absolute</translation> @@ -1556,6 +1557,7 @@ <translation id="5179510805599951267">Not in <ph name="ORIGINAL_LANGUAGE" />? Report this error</translation> <translation id="518639307526414276">Pet food and pet care supplies</translation> <translation id="5190835502935405962">Bookmarks Bar</translation> +<translation id="5191315092027169558">Your profile is managed by <ph name="DOMAIN" /></translation> <translation id="51918995459521422"><ph name="ORIGIN" /> wants to download multiple files</translation> <translation id="519422657042045905">Annotation not available</translation> <translation id="5201306358585911203">An embedded page on this page says</translation> @@ -2759,6 +2761,7 @@ <translation id="8623885649813806493">No matching passwords. Show all saved passwords.</translation> <translation id="8624354461147303341">Get discounts</translation> <translation id="8625384913736129811">Save This Card to This Device</translation> +<translation id="8637577059508742477">Your profile and browser are managed by <ph name="DOMAIN" /></translation> <translation id="865032292777205197">motion sensors</translation> <translation id="8663226718884576429">Order Summary, <ph name="TOTAL_LABEL" />, More Details</translation> <translation id="8666678546361132282">English</translation>
diff --git a/components/strings/components_strings_fr-CA.xtb b/components/strings/components_strings_fr-CA.xtb index 3a208a2..0e00184d 100644 --- a/components/strings/components_strings_fr-CA.xtb +++ b/components/strings/components_strings_fr-CA.xtb
@@ -116,6 +116,7 @@ <translation id="1263231323834454256">Liste de lecture</translation> <translation id="1264309058268477500">Autre version</translation> <translation id="1264974993859112054">Sports</translation> +<translation id="1266469291454105242">Déverrouillage de l'appareil</translation> <translation id="1269516672602708785">Créer rapidement un site dans Google Sites</translation> <translation id="1270502636509132238">Mode de ramassage</translation> <translation id="1281476433249504884">Empileur 1</translation> @@ -330,6 +331,7 @@ <translation id="1753068535428855445">Rencontres et services personnels</translation> <translation id="1753706481035618306">Numéro de page</translation> <translation id="1755621011177747277">Adoption</translation> +<translation id="1756026472674246267">Ouvrir le lien dans un nouvel onglet</translation> <translation id="175656076281618225">Magie</translation> <translation id="1757773103848038814">Police à espace unique</translation> <translation id="1763864636252898013">Impossible de vérifier sur le serveur qu'il s'agit bien du domaine <ph name="DOMAIN" />, car son certificat de sécurité n'est pas considéré comme fiable par le système d'exploitation de votre appareil. Cela peut être dû à une mauvaise configuration ou bien à l'interception de votre connexion par un pirate informatique.</translation> @@ -455,6 +457,7 @@ <translation id="214556005048008348">Annuler le paiement</translation> <translation id="2148613324460538318">Ajouter une carte</translation> <translation id="2149968176347646218">La connexion n'est pas sécurisée</translation> +<translation id="2153609454945889823">Installer les services Google Play pour la RA?</translation> <translation id="2154054054215849342">La synchronisation n'est pas offerte pour votre domaine</translation> <translation id="2154484045852737596">Modifier la carte</translation> <translation id="2161656808144014275">Texte</translation> @@ -832,6 +835,7 @@ <translation id="3229277193950731405">Copier la chaîne de version</translation> <translation id="323107829343500871">Entrez le code de vérification de carte (CVC) pour <ph name="CREDIT_CARD" /></translation> <translation id="3234666976984236645">Toujours détecter le contenu important sur ce site</translation> +<translation id="3238395604961564389">Ouvrir le lien dans une fenêtre de navigation privée</translation> <translation id="3240683217920639535"><ph name="MANAGE_CHROME_THEMES_FOCUSED_FRIENDLY_MATCH_TEXT" />, appuyez sur la touche Tabulation, puis sur la touche Entrée pour personnaliser le style de votre navigateur</translation> <translation id="3240791268468473923">La zone de contenu dans le bas de l'écran indiquant qu'aucun authentifiant ne correspond au paiement sécurisé est ouverte</translation> <translation id="324180406144491771">Les liens de « <ph name="HOST_NAME" /> » sont bloqués</translation> @@ -945,6 +949,7 @@ <translation id="3531780078352352885">Feuilles de travail</translation> <translation id="3532844647053365774">L'hôte <ph name="HOST" /> veut utiliser votre microphone</translation> <translation id="3533328374079021623">Boîte aux lettres 5</translation> +<translation id="3542768452570884558">Ouvrir le lien dans une nouvelle fenêtre</translation> <translation id="3550112004925580947">Tourisme réceptif</translation> <translation id="3552297013052089404">Police sans empattement</translation> <translation id="3558573058928565255">Pendant la journée</translation> @@ -1115,11 +1120,13 @@ <translation id="4040350669425716613">Collèges et universités</translation> <translation id="4056223980640387499">Sépia</translation> <translation id="4058922952496707368">Clé « <ph name="SUBKEY" /> » : <ph name="ERROR" /></translation> +<translation id="4063924980214801036">Le déverrouillage de l'appareil est utilisé pour vérifier les cartes plus rapidement</translation> <translation id="4067098466788473230">Bourses d'études</translation> <translation id="4067263367174615723">Enveloppe C1</translation> <translation id="4067947977115446013">Ajouter une adresse valide</translation> <translation id="4072193657607981494">Chargement des politiques en cours…</translation> <translation id="4072486802667267160">Une erreur s'est produite lors du traitement de votre commande. Veuillez réessayer.</translation> +<translation id="4073376909608563327">Impossible d'utiliser le déverrouillage de l'appareil</translation> <translation id="4073797364926776829">Affichez la carte</translation> <translation id="4075732493274867456">Le client et le serveur ne prennent pas en charge une version habituelle du protocole SSL et de la suite de chiffrement.</translation> <translation id="4079302484614802869">La configuration du mandataire est réglée à l'utilisation d'une adresse URL de script .pac, et non des serveurs mandataires fixes.</translation> @@ -1412,6 +1419,7 @@ <translation id="4840250757394056958">Afficher votre historique de Chrome</translation> <translation id="484462545196658690">Auto</translation> <translation id="484671803914931257">Bénéficiez d'un rabais sur <ph name="MERCHANT_NAME" /> et d'autres</translation> +<translation id="484988093836683706">Utiliser le déverrouillage de l'appareil</translation> <translation id="4850886885716139402">Affichage</translation> <translation id="4852429274334674023">Systèmes d'exploitation</translation> <translation id="485316830061041779">Allemand</translation> @@ -1799,6 +1807,7 @@ <translation id="5921185718311485855">Activé</translation> <translation id="5921639886840618607">Enregistrer la carte dans votre compte Google?</translation> <translation id="5922853866070715753">Vous avez presque terminé</translation> +<translation id="5923492272538889093">Utiliser le déverrouillage de l'appareil au lieu du code CVC?</translation> <translation id="5928444777041341328">Maison et jardinage</translation> <translation id="5932224571077948991">Site diffusant des annonces intrusives ou trompeuses</translation> <translation id="5937560539988385583">Page traduite</translation> @@ -1972,6 +1981,7 @@ <translation id="643051589346665201">Modifier le mot de passe Google</translation> <translation id="6433490469411711332">Modifier les coordonnées</translation> <translation id="6433595998831338502"><ph name="HOST_NAME" /> a refusé la connexion.</translation> +<translation id="6433797564277305076">Vérifiez dès maintenant vos cartes plus rapidement avec le déverrouillage de l'appareil</translation> <translation id="6440503408713884761">Ignorée</translation> <translation id="6443406338865242315">Les extensions et les plugiciels que vous avez installés</translation> <translation id="6446163441502663861">Enveloppe Kahu</translation> @@ -2178,6 +2188,7 @@ <translation id="705310974202322020">{NUM_CARDS,plural, =1{Cette carte ne peut pas être enregistrée pour le moment}one{Cette carte ne peut pas être enregistrée pour le moment}other{Ces cartes ne peuvent pas être enregistrées pour le moment}}</translation> <translation id="7053983685419859001">Bloquer</translation> <translation id="7058163556978339998"><ph name="BROWSER" /> a vérifié que <ph name="ISSUER" /> a émis le certificat de ce site Web.</translation> +<translation id="7058774143982824355">Service d'analyse de mots de passe CSV</translation> <translation id="7061777300866737982">Sécurité résidentielle</translation> <translation id="7062635574500127092">Turquoise</translation> <translation id="706295145388601875">Ajoutez et gérez les adresses dans les paramètres de Chrome</translation> @@ -2442,6 +2453,7 @@ <translation id="7696089921647603491">Anciens classiques et classiques du rock</translation> <translation id="7697066736081121494">Enveloppe Prc8</translation> <translation id="769721561045429135">Pour le moment, vous avez des cartes qui peuvent être utilisées uniquement sur cet appareil. Cliquez sur Continuer pour consulter les détails de ces cartes.</translation> +<translation id="7698864304447945242">Mettre à jour les services Google Play pour la RA?</translation> <translation id="7699293099605015246">Les articles ne sont pas disponibles pour le moment</translation> <translation id="7701040980221191251">Aucun</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Continuer vers <ph name="SITE" /> (non recommandé)<ph name="END_LINK" /></translation> @@ -2454,6 +2466,7 @@ <translation id="7723047071702270851">Modifier la carte</translation> <translation id="7734285854693414638">Créer rapidement un formulaire dans Google Formulaires</translation> <translation id="773466115871691567">Toujours traduire les pages en <ph name="SOURCE_LANGUAGE" /></translation> +<translation id="7736959720849233795">Copier l'adresse du lien</translation> <translation id="7740996059027112821">Standard</translation> <translation id="77424286611022110">Ce site diffuse des annonces intrusives ou trompeuses. <ph name="LEARN_MORE_LINK_TEXT" /></translation> <translation id="774634243536837715">Contenu dangereux bloqué.</translation>
diff --git a/components/strings/components_strings_gl.xtb b/components/strings/components_strings_gl.xtb index bf221c2..d073940a 100644 --- a/components/strings/components_strings_gl.xtb +++ b/components/strings/components_strings_gl.xtb
@@ -439,7 +439,7 @@ <translation id="2099652385553570808">Tres grampas na parte esquerda</translation> <translation id="2101225219012730419">Versión:</translation> <translation id="2102134110707549001">Suxerir contrasinal seguro…</translation> -<translation id="2102495993840063010">Aplicacións de Android</translation> +<translation id="2102495993840063010">Aplicacións para Android</translation> <translation id="2107021941795971877">Soportes de impresión</translation> <translation id="2108755909498034140">Reinicia o ordenador</translation> <translation id="2111166930115883695">Pulsa Espazo para xogar</translation>
diff --git a/components/strings/components_strings_lo.xtb b/components/strings/components_strings_lo.xtb index 5a79b11f..f33f358 100644 --- a/components/strings/components_strings_lo.xtb +++ b/components/strings/components_strings_lo.xtb
@@ -116,6 +116,7 @@ <translation id="1263231323834454256">ລາຍການທີ່ຈະອ່ານ</translation> <translation id="1264309058268477500">ສຳຮອງ</translation> <translation id="1264974993859112054">ກິລາ</translation> +<translation id="1266469291454105242">ການປົດລັອກອຸປະກອນ</translation> <translation id="1269516672602708785">ສ້າງເວັບໄຊໃໝ່ໃນ Google Sites ໄດ້ຢ່າງວ່ອງໄວ</translation> <translation id="1270502636509132238">ວິທີການຮັບເຄື່ອງ</translation> <translation id="1281476433249504884">ສະແຕັກເກີ້ 1</translation> @@ -330,6 +331,7 @@ <translation id="1753068535428855445">ການຊອກຄູ່ ແລະ ໂຄສະນາຊອກໝູ່</translation> <translation id="1753706481035618306">ເລກທີໜ້າ</translation> <translation id="1755621011177747277">ການຮັບລ້ຽງບຸດບຸນທຳ</translation> +<translation id="1756026472674246267">ເປີດລິ້ງຢູ່ໃນແຖບໃໝ່</translation> <translation id="175656076281618225">ເວດມົນ</translation> <translation id="1757773103848038814">ຟອນ Monospace</translation> <translation id="1763864636252898013">ເຊີບເວີນີ້ບໍ່ສາມາດພິສູດໄດ້ວ່າ ມັນແມ່ນ <ph name="DOMAIN" />; ໃບຢັ້ງຢືນຄວາມປອດໄພຂອງມັນບໍ່ໄດ້ຮັບການເຊື່ອໝັ້ນໂດຍລະບົບການດໍາເນີນງານຂອງອຸປະກອນຂອງທ່ານ. ອັນນີ້ອາດຈະເຮັດໃຫ້ເກີດມີການປັບຕັ້ງຄ່າຜິດ ຫຼືຜູ້ໂຈມຕີອາດຈະດັກເອົາການເຊື່ອມຕໍ່ຂອງທ່ານ.</translation> @@ -455,6 +457,7 @@ <translation id="214556005048008348">ຍົກເລີກການຈ່າຍເງິນ</translation> <translation id="2148613324460538318">ເພີ່ມບັດ</translation> <translation id="2149968176347646218">ການເຊື່ອມຕໍ່ບໍ່ປອດໄພ</translation> +<translation id="2153609454945889823">ຕິດຕັ້ງບໍລິການ Google Play ສຳລັບ AR ບໍ?</translation> <translation id="2154054054215849342">ການຊິ້ງຂໍ້ມູນບໍ່ມີໃຫ້ນຳໃຊ້ສຳລັບໂດເມນຂອງທ່ານ</translation> <translation id="2154484045852737596">ແກ້ໄຂບັດ</translation> <translation id="2161656808144014275">ຂໍ້ຄວາມ</translation> @@ -832,6 +835,7 @@ <translation id="3229277193950731405">ສຳເນົາສະຕຣິງເວີຊັນ</translation> <translation id="323107829343500871">ປ້ອນ CVC ສຳລັບ <ph name="CREDIT_CARD" /></translation> <translation id="3234666976984236645">ກວດຫາເນື້ອໃນສຳຄັນຢູ່ເທິງເວັບໄຊທ໌ນີ້ທຸກຄັ້ງ</translation> +<translation id="3238395604961564389">ເປີດລິ້ງໃນໜ້າຈໍທີ່ບໍ່ເປີດເຜີຍຕົວຕົນ</translation> <translation id="3240683217920639535"><ph name="MANAGE_CHROME_THEMES_FOCUSED_FRIENDLY_MATCH_TEXT" />, ກົດ tab ຈາກນັ້ນກົດ Enter ເພື່ອປັບແຕ່ງໜ້າຕາຂອງໂປຣແກຣມທ່ອງເວັບທ່ານ</translation> <translation id="3240791268468473923">ເປີດຊີດຂໍ້ມູນການເຂົ້າສູ່ລະບົບການຈ່າຍເງິນທີ່ປອດໄພທີ່ບໍ່ມີຂໍ້ມູນການເຂົ້າສູ່ລະບົບທີ່ກົງກັນແລ້ວ</translation> <translation id="324180406144491771">ລິ້ງ “<ph name="HOST_NAME" />” ຖືກບລັອກໄວ້ແລ້ວ</translation> @@ -945,6 +949,7 @@ <translation id="3531780078352352885">ແຜ່ນວຽກ</translation> <translation id="3532844647053365774"><ph name="HOST" /> ຕ້ອງການໃຊ້ໄມໂຄຣໂຟນຂອງທ່ານ</translation> <translation id="3533328374079021623">ກ່ອງຈົດໝາຍ 5</translation> +<translation id="3542768452570884558">ເປີດລິ້ງຢູ່ໃນໜ້າຕ່າງໃຫມ່</translation> <translation id="3550112004925580947">ອຸດສາຫະກໍາບໍລິການ</translation> <translation id="3552297013052089404">ຟອນ Sans-serif</translation> <translation id="3558573058928565255">ຕອນກາງເວັນ</translation> @@ -1115,11 +1120,13 @@ <translation id="4040350669425716613">ວິທະຍາໄລ ແລະ ມະຫາວິທະຍາໄລ</translation> <translation id="4056223980640387499">ສີນໍ້າຕານດໍາ</translation> <translation id="4058922952496707368">ປຸ່ມ "<ph name="SUBKEY" />": <ph name="ERROR" /></translation> +<translation id="4063924980214801036">ໃຊ້ການປົດລັອກອຸປະກອນເພື່ອຢືນຢັນບັນໄວຂຶ້ນ</translation> <translation id="4067098466788473230">ການຊ່ວຍເຫຼືອດ້ານການສຶກສາ ແລະ ທຶນການສຶກສາ</translation> <translation id="4067263367174615723">C1 (ຊອງຈົດໝາຍ)</translation> <translation id="4067947977115446013">ເພີ່ມທີ່ຢູ່ທີ່ຖືກຕ້ອງ</translation> <translation id="4072193657607981494">ກຳລັງໂຫຼດນະໂຍບາຍ</translation> <translation id="4072486802667267160">ມີຄວາມຜິດພາດໃນການດຳເນີນຄຳສັ່ງຊື້ຂອງທ່ານ, ກະລຸນາລອງອີກຄັ້ງ.</translation> +<translation id="4073376909608563327">ບໍ່ສາມາດໃຊ້ການປົດລັອກອຸປະກອນໄດ້</translation> <translation id="4073797364926776829">ເບິ່ງບັດ</translation> <translation id="4075732493274867456">ລູກຂ່າຍ ແລະ ເຊີບເວີບໍ່ຮອງຮັບເວີຊັນໂປຣໂຕຄໍ ຫຼື ຊຸດລະຫັດລັບ SSL ທົ່ວໄປ.</translation> <translation id="4079302484614802869">ການປັບຕັ້ງຄ່າພຣັອກຊີຕັ້ງຂຶ້ນເພື່ອໃຊ້ URL ຕົວຂຽນ .pac, ບໍ່ແມ່ນເຊີບເວີພຣັອກຊີທີ່ກໍານົດໄວ້.</translation> @@ -1412,6 +1419,7 @@ <translation id="4840250757394056958">ເບິ່ງປະຫວັດ Chrome ຂອງທ່ານ</translation> <translation id="484462545196658690">ອັດຕະໂນມັດ</translation> <translation id="484671803914931257">ຮັບສ່ວນຫຼຸດຢູ່ <ph name="MERCHANT_NAME" /> ແລະ ອື່ນໆ</translation> +<translation id="484988093836683706">ໃຊ້ການປົດລັອກອຸປະກອນ</translation> <translation id="4850886885716139402">ເບິ່ງ</translation> <translation id="4852429274334674023">ລະບົບປະຕິບັດການ</translation> <translation id="485316830061041779">ພາສາເຢຍລະມັນ</translation> @@ -1799,6 +1807,7 @@ <translation id="5921185718311485855">ເປີດ</translation> <translation id="5921639886840618607">ບັນທຶກບັດໄວ້ໃນບັນຊີ Google ບໍ?</translation> <translation id="5922853866070715753">ເກືອບສຳເລັດແລ້ວ</translation> +<translation id="5923492272538889093">ໃຊ້ການປົດລັອກອຸປະກອນແທນ CVC ບໍ?</translation> <translation id="5928444777041341328">ເຮືອນ ແລະ ສວນ</translation> <translation id="5932224571077948991">ເວັບໄຊສະແດງໂຄສະນາທີ່ລົບກວນ ຫຼື ຫຼອກລວງ</translation> <translation id="5937560539988385583">ແປໜ້າແລ້ວ</translation> @@ -1972,6 +1981,7 @@ <translation id="643051589346665201">ປ່ຽນລະຫັດຜ່ານ Google</translation> <translation id="6433490469411711332">ແກ້ໄຂຂໍ້ມູນລາຍຊື່ຜູ້ຕິດຕໍ່</translation> <translation id="6433595998831338502"><ph name="HOST_NAME" /> ໄດ້ປະຕິເສດການເຊື່ອມຕໍ່.</translation> +<translation id="6433797564277305076">ຢືນຢັນບັດຂອງທ່ານໄວຂຶ້ນໂດຍການໃຊ້ການປົດລັອກອຸປະກອນຈາກນີ້ໄປ</translation> <translation id="6440503408713884761">ລະເລີຍ</translation> <translation id="6443406338865242315">ສ່ວນຂະຫຍາຍ ແລະ ປລັກອິນທີ່ທ່ານຕິດຕັ້ງ</translation> <translation id="6446163441502663861">Kahu (ຊອງຈົດໝາຍ)</translation> @@ -2178,6 +2188,7 @@ <translation id="705310974202322020">{NUM_CARDS,plural, =1{ບໍ່ສາມາດບັນທຶກບັດນີ້ໄວ້ໄດ້ໃນຕອນນີ້}other{ບໍ່ສາມາດບັນທຶກບັດເຫຼົ່ານີ້ໄວ້ໄດ້ໃນຕອນນີ້}}</translation> <translation id="7053983685419859001">ບລັອກ</translation> <translation id="7058163556978339998"><ph name="BROWSER" /> ໄດ້ຢັ້ງຢືນວ່າ <ph name="ISSUER" /> ໄດ້ອອກໃບຮັບຮອງຂອງເວັບໄຊນີ້ແລ້ວ.</translation> +<translation id="7058774143982824355">ບໍລິການຕົວແຍກວິເຄາະລະຫັດຜ່ານ CSV</translation> <translation id="7061777300866737982">ຄວາມປອດໄພໃນເຮືອນ</translation> <translation id="7062635574500127092">ສີຂຽວຫົວເປັດ</translation> <translation id="706295145388601875">ເພີ່ມ ແລະ ຈັດການທີ່ຢູ່ໃນການຕັ້ງຄ່າ Chrome</translation> @@ -2442,6 +2453,7 @@ <translation id="7696089921647603491">ຣັອກຄລາດສິກ ແລະ ເພງເກົ່າ</translation> <translation id="7697066736081121494">Prc8 (ຊອງຈົດໝາຍ)</translation> <translation id="769721561045429135">ຕອນນີ້, ທ່ານມີບັດທີ່ສາມາດໃຊ້ໄດ້ຢູ່ໃນອຸປະກອນນີ້ເທົ່ານັ້ນ. ຄລິກສືບຕໍ່ເພື່ອກວດເບິ່ງບັດ.</translation> +<translation id="7698864304447945242">ອັບເດດບໍລິການ Google Play ສຳລັບ AR ບໍ?</translation> <translation id="7699293099605015246">ບົດຄວາມບໍ່ມີໃຫ້ໃນຕອນນີ້</translation> <translation id="7701040980221191251">ບໍ່ມີ</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />ໄປຫາ<ph name="SITE" /> (ບໍ່ປອດໄພ)<ph name="END_LINK" /></translation> @@ -2454,6 +2466,7 @@ <translation id="7723047071702270851">ແກ້ໄຂບັດ</translation> <translation id="7734285854693414638">ສ້າງແບບຟອມໃໝ່ໃນ Google Forms ໄດ້ຢ່າງວ່ອງໄວ</translation> <translation id="773466115871691567">ແປໜ້າຕ່າງໆສະເໝີໃນ <ph name="SOURCE_LANGUAGE" /></translation> +<translation id="7736959720849233795">ສຳເນົາທີ່ຢູ່ລິ້ງ</translation> <translation id="7740996059027112821">ມາດຕະຖານ</translation> <translation id="77424286611022110">ເວັບໄຊນີ້ສະແດງໂຄສະນາທີ່ບຸກຮຸກ ຫຼື ເຮັດໃຫ້ເຂົ້າໃຈຜິດ. <ph name="LEARN_MORE_LINK_TEXT" /></translation> <translation id="774634243536837715">ບລັອກເນື້ອຫາອັນຕະລາຍແລ້ວ.</translation>
diff --git a/components/strings/components_strings_mk.xtb b/components/strings/components_strings_mk.xtb index 0d039598..f0c7475 100644 --- a/components/strings/components_strings_mk.xtb +++ b/components/strings/components_strings_mk.xtb
@@ -1059,6 +1059,7 @@ <translation id="3807873520724684969">Блокирани се штетни содржини.</translation> <translation id="3810973564298564668">Управувај</translation> <translation id="3816482573645936981">Вредност (заменета)</translation> +<translation id="3823402221513322552">Со вашиот прелистувач управува <ph name="BROWSER_DOMAIN" />, а со вашиот профил управува <ph name="PROFILE_DOMAIN" /></translation> <translation id="382518646247711829">Ако користите прокси сервер...</translation> <translation id="3826050100957962900">Најавување на трети страни</translation> <translation id="3827112369919217609">Апсолутна</translation> @@ -1556,6 +1557,7 @@ <translation id="5179510805599951267">Не е на <ph name="ORIGINAL_LANGUAGE" />? Пријави ја грешката.</translation> <translation id="518639307526414276">Храна и производи за миленичиња</translation> <translation id="5190835502935405962">Лента со обележувачи</translation> +<translation id="5191315092027169558">Со вашиот профил управува <ph name="DOMAIN" /></translation> <translation id="51918995459521422"><ph name="ORIGIN" /> сака да преземе повеќе датотеки</translation> <translation id="519422657042045905">Прибелешката не е достапна</translation> <translation id="5201306358585911203">Вметнатата страница во страницава вели</translation> @@ -2759,6 +2761,7 @@ <translation id="8623885649813806493">Нема лозинки што се совпаѓаат. Прикажи ги сите зачувани лозинки.</translation> <translation id="8624354461147303341">Сакам попусти</translation> <translation id="8625384913736129811">Зачувај ја картичкава на уредов</translation> +<translation id="8637577059508742477">Со вашиот профил и прелистувач управува <ph name="DOMAIN" /></translation> <translation id="865032292777205197">сензори за движење</translation> <translation id="8663226718884576429">Краток преглед на нарачка, <ph name="TOTAL_LABEL" />, повеќе детали</translation> <translation id="8666678546361132282">англиски</translation>
diff --git a/components/strings/components_strings_mn.xtb b/components/strings/components_strings_mn.xtb index ef4c012..bbbbb586 100644 --- a/components/strings/components_strings_mn.xtb +++ b/components/strings/components_strings_mn.xtb
@@ -1060,6 +1060,7 @@ <translation id="3807873520724684969">Аюултай когтентыг хориглосон.</translation> <translation id="3810973564298564668">удирдах</translation> <translation id="3816482573645936981">Утга (хүчингүй болгосон)</translation> +<translation id="3823402221513322552">Таны хөтчийг <ph name="BROWSER_DOMAIN" />, харин профайлыг тань <ph name="PROFILE_DOMAIN" /> удирддаг</translation> <translation id="382518646247711829">Хэрэв та прокси серверийг ашиглах бол ...</translation> <translation id="3826050100957962900">Гуравдагч талын нэвтрэлт</translation> <translation id="3827112369919217609">Үнэмлэхүй</translation> @@ -1557,6 +1558,7 @@ <translation id="5179510805599951267"><ph name="ORIGINAL_LANGUAGE" /> хэлээр байхгүй байна уу? Энэ алдааг мэдэгдэнэ үү.</translation> <translation id="518639307526414276">Тэжээвэр амьтны хоол, арчилгааны хэрэгсэл</translation> <translation id="5190835502935405962">Хайлтын жагсаалтын цонх</translation> +<translation id="5191315092027169558">Таны профайлыг <ph name="DOMAIN" /> удирддаг</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> хэд хэдэн файл татах хүсэлтэй байна</translation> <translation id="519422657042045905">Тэмдэглэгээ боломжгүй байна</translation> <translation id="5201306358585911203">Энэ хуудсанд оруулсан хуудас хэлэхдээ</translation> @@ -2759,6 +2761,7 @@ <translation id="8623885649813806493">Таарах нууц үг алга. Бүх хадгалсан нууц үгийг харуулна уу.</translation> <translation id="8624354461147303341">Хөнгөлөлт авах</translation> <translation id="8625384913736129811">Энэ картыг энэ төхөөрөмжид хадгалах</translation> +<translation id="8637577059508742477">Таны профайл болон хөтчийг <ph name="DOMAIN" /> удирддаг</translation> <translation id="865032292777205197">хөдөлгөөн мэдрэгч</translation> <translation id="8663226718884576429">Захиалгын дүн, <ph name="TOTAL_LABEL" />, Дэлгэрэнгүй</translation> <translation id="8666678546361132282">Англи хэл</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb index ef9b6cf..1ca0943c 100644 --- a/components/strings/components_strings_nl.xtb +++ b/components/strings/components_strings_nl.xtb
@@ -1054,6 +1054,7 @@ <translation id="3807873520724684969">Schadelijke content geblokkeerd.</translation> <translation id="3810973564298564668">Beheren</translation> <translation id="3816482573645936981">Waarde (vervangen)</translation> +<translation id="3823402221513322552">Je browser wordt beheerd door <ph name="BROWSER_DOMAIN" /> en je profiel wordt beheerd door <ph name="PROFILE_DOMAIN" /></translation> <translation id="382518646247711829">Als je een proxyserver gebruikt...</translation> <translation id="3826050100957962900">Externe login</translation> <translation id="3827112369919217609">Absoluut</translation> @@ -1551,6 +1552,7 @@ <translation id="5179510805599951267">Niet in het <ph name="ORIGINAL_LANGUAGE" />? Deze fout melden</translation> <translation id="518639307526414276">Voeding en benodigdheden voor huisdieren</translation> <translation id="5190835502935405962">Bookmarkbalk</translation> +<translation id="5191315092027169558">Je profiel wordt beheerd door <ph name="DOMAIN" /></translation> <translation id="51918995459521422"><ph name="ORIGIN" /> wil meerdere bestanden downloaden</translation> <translation id="519422657042045905">Annotatie niet beschikbaar</translation> <translation id="5201306358585911203">Een ingesloten pagina op deze pagina meldt het volgende</translation> @@ -2753,6 +2755,7 @@ <translation id="8623885649813806493">Geen overeenkomende wachtwoorden. Alle opgeslagen wachtwoorden bekijken.</translation> <translation id="8624354461147303341">Kortingen zoeken</translation> <translation id="8625384913736129811">Deze pas opslaan op dit apparaat</translation> +<translation id="8637577059508742477">Je profiel en browser worden beheerd door <ph name="DOMAIN" /></translation> <translation id="865032292777205197">bewegingssensoren</translation> <translation id="8663226718884576429">Besteloverzicht, <ph name="TOTAL_LABEL" />, meer informatie</translation> <translation id="8666678546361132282">Engels</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb index b4832e74..62dec9f0 100644 --- a/components/strings/components_strings_pl.xtb +++ b/components/strings/components_strings_pl.xtb
@@ -1059,6 +1059,7 @@ <translation id="3807873520724684969">Zablokowano szkodliwe treści.</translation> <translation id="3810973564298564668">Zarządzaj</translation> <translation id="3816482573645936981">Wartość (zastąpiona)</translation> +<translation id="3823402221513322552">Przeglądarką zarządza <ph name="BROWSER_DOMAIN" />, a Twoim profilem – <ph name="PROFILE_DOMAIN" /></translation> <translation id="382518646247711829">Jeśli używasz serwera proxy...</translation> <translation id="3826050100957962900">Logowanie się w przypadku innych firm</translation> <translation id="3827112369919217609">Bezwzględna</translation> @@ -1556,6 +1557,7 @@ <translation id="5179510805599951267">Jeśli to nie jest język <ph name="ORIGINAL_LANGUAGE" />, zgłoś błąd</translation> <translation id="518639307526414276">Karma i artykuły dla zwierząt</translation> <translation id="5190835502935405962">Pasek zakładek</translation> +<translation id="5191315092027169558">Twoim profilem zarządza <ph name="DOMAIN" /></translation> <translation id="51918995459521422"><ph name="ORIGIN" /> chce pobrać wiele plików</translation> <translation id="519422657042045905">Adnotacja niedostępna</translation> <translation id="5201306358585911203">Komunikat z elementu umieszczonego na bieżącej stronie</translation> @@ -2759,6 +2761,7 @@ <translation id="8623885649813806493">Nie znaleziono pasujących haseł. Pokaż wszystkie zapisane hasła.</translation> <translation id="8624354461147303341">Otrzymaj zniżki</translation> <translation id="8625384913736129811">Zapisz tę kartę na tym urządzeniu</translation> +<translation id="8637577059508742477">Twoim profilem i przeglądarką zarządza <ph name="DOMAIN" /></translation> <translation id="865032292777205197">czujniki ruchu</translation> <translation id="8663226718884576429">Podsumowanie zamówienia, <ph name="TOTAL_LABEL" />, Szczegółowe informacje</translation> <translation id="8666678546361132282">Angielski</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb index beb2a909..ea1cb96 100644 --- a/components/strings/components_strings_pt-PT.xtb +++ b/components/strings/components_strings_pt-PT.xtb
@@ -610,7 +610,7 @@ <translation id="2557417190997681027">Viagens de negócios</translation> <translation id="2562087035394240049">Faça você mesmo e conteúdo para especialistas e de procedimentos</translation> <translation id="2563042576090522782">Luas de mel e escapadelas românticas</translation> -<translation id="2570734079541893434">Faça a gestão das definições</translation> +<translation id="2570734079541893434">Gerir definições</translation> <translation id="2573834589046842510">Impressão e publicação</translation> <translation id="257674075312929031">Grupo</translation> <translation id="2576880857912732701">Botão Gerir definições de segurança, prima Enter para gerir a Navegação segura e muito mais nas definições do Chrome</translation> @@ -1937,7 +1937,7 @@ <translation id="6305205051461490394"><ph name="URL" /> está inacessível.</translation> <translation id="6312113039770857350">Página Web não disponível</translation> <translation id="6316226860534107313">Scooters e motorizadas</translation> -<translation id="63172326633386613">Faça a gestão das definições de acessibilidade</translation> +<translation id="63172326633386613">Gerir definições de acessibilidade</translation> <translation id="6319249456820053699">Câmaras e câmaras de vídeo</translation> <translation id="6321917430147971392">Verificar as definições do DNS</translation> <translation id="6322182122604171028">Não foi possível utilizar o Windows Hello</translation>
diff --git a/components/strings/components_strings_sr-Latn.xtb b/components/strings/components_strings_sr-Latn.xtb index 0a8aef0..a93b8a8 100644 --- a/components/strings/components_strings_sr-Latn.xtb +++ b/components/strings/components_strings_sr-Latn.xtb
@@ -1059,6 +1059,7 @@ <translation id="3807873520724684969">Blokiran je štetan sadržaj.</translation> <translation id="3810973564298564668">Upravljaj</translation> <translation id="3816482573645936981">Vrednost (zamenjena)</translation> +<translation id="3823402221513322552">Pregledačem upravlja <ph name="BROWSER_DOMAIN" />, a profilom upravlja <ph name="PROFILE_DOMAIN" /></translation> <translation id="382518646247711829">Ako koristite proksi server...</translation> <translation id="3826050100957962900">Prijavljivanje treće strane</translation> <translation id="3827112369919217609">Apsolut</translation> @@ -1556,6 +1557,7 @@ <translation id="5179510805599951267">Nije <ph name="ORIGINAL_LANGUAGE" />? Prijavite ovu grešku</translation> <translation id="518639307526414276">Hrana i sredstva za negu kućnih ljubimaca</translation> <translation id="5190835502935405962">Traka sa obeleživačima</translation> +<translation id="5191315092027169558">Profilom upravlja <ph name="DOMAIN" /></translation> <translation id="51918995459521422"><ph name="ORIGIN" /> želi da preuzme više datoteka</translation> <translation id="519422657042045905">Napomena nije dostupna</translation> <translation id="5201306358585911203">Ugrađena stranica na ovoj veb-stranici navodi:</translation> @@ -2759,6 +2761,7 @@ <translation id="8623885649813806493">Nijedna lozinka se ne podudara. Prikaži sve sačuvane lozinke.</translation> <translation id="8624354461147303341">Ostvarite popuste</translation> <translation id="8625384913736129811">Sačuvaj ovu karticu na ovom uređaju</translation> +<translation id="8637577059508742477">Profilom i pregledačem upravlja <ph name="DOMAIN" /></translation> <translation id="865032292777205197">senzori za pokret</translation> <translation id="8663226718884576429">Rezime porudžbine, <ph name="TOTAL_LABEL" />, još detalja</translation> <translation id="8666678546361132282">engleski</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index 3263f5d..c92b9fd 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -1059,6 +1059,7 @@ <translation id="3807873520724684969">Блокиран је штетан садржај.</translation> <translation id="3810973564298564668">Управљај</translation> <translation id="3816482573645936981">Вредност (замењена)</translation> +<translation id="3823402221513322552">Прегледачем управља <ph name="BROWSER_DOMAIN" />, а профилом управља <ph name="PROFILE_DOMAIN" /></translation> <translation id="382518646247711829">Ако користите прокси сервер...</translation> <translation id="3826050100957962900">Пријављивање треће стране</translation> <translation id="3827112369919217609">Апсолут</translation> @@ -1556,6 +1557,7 @@ <translation id="5179510805599951267">Није <ph name="ORIGINAL_LANGUAGE" />? Пријавите ову грешку</translation> <translation id="518639307526414276">Храна и средства за негу кућних љубимаца</translation> <translation id="5190835502935405962">Трака са обележивачима</translation> +<translation id="5191315092027169558">Профилом управља <ph name="DOMAIN" /></translation> <translation id="51918995459521422"><ph name="ORIGIN" /> жели да преузме више датотека</translation> <translation id="519422657042045905">Напомена није доступна</translation> <translation id="5201306358585911203">Уграђена страница на овој веб-страници наводи:</translation> @@ -2759,6 +2761,7 @@ <translation id="8623885649813806493">Ниједна лозинка се не подудара. Прикажи све сачуване лозинке.</translation> <translation id="8624354461147303341">Остварите попусте</translation> <translation id="8625384913736129811">Сачувај ову картицу на овом уређају</translation> +<translation id="8637577059508742477">Профилом и прегледачем управља <ph name="DOMAIN" /></translation> <translation id="865032292777205197">сензори за покрет</translation> <translation id="8663226718884576429">Резиме поруџбине, <ph name="TOTAL_LABEL" />, још детаља</translation> <translation id="8666678546361132282">енглески</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb index 175dc88..ba44b39c 100644 --- a/components/strings/components_strings_th.xtb +++ b/components/strings/components_strings_th.xtb
@@ -1058,6 +1058,7 @@ <translation id="3807873520724684969">บล็อกเนื้อหาอันตรายแล้ว</translation> <translation id="3810973564298564668">จัดการ</translation> <translation id="3816482573645936981">ค่า (ถูกแทนที่)</translation> +<translation id="3823402221513322552">เบราว์เซอร์ของคุณจัดการโดย <ph name="BROWSER_DOMAIN" /> และโปรไฟล์ของคุณจัดการโดย <ph name="PROFILE_DOMAIN" /></translation> <translation id="382518646247711829">หากคุณใช้พร็อกซีเซิร์ฟเวอร์...</translation> <translation id="3826050100957962900">การลงชื่อเข้าใช้ของบุคคลที่สาม</translation> <translation id="3827112369919217609">Absolute</translation> @@ -1555,6 +1556,7 @@ <translation id="5179510805599951267">หากไม่มีในภาษา <ph name="ORIGINAL_LANGUAGE" /> ให้รายงานข้อผิดพลาดนี้</translation> <translation id="518639307526414276">อาหารและอุปกรณ์ดูแลสัตว์เลี้ยง</translation> <translation id="5190835502935405962">แถบบุ๊กมาร์ก</translation> +<translation id="5191315092027169558">โปรไฟล์ของคุณจัดการโดย <ph name="DOMAIN" /></translation> <translation id="51918995459521422"><ph name="ORIGIN" /> ต้องการดาวน์โหลดหลายไฟล์</translation> <translation id="519422657042045905">โหมดคำอธิบายประกอบไม่พร้อมใช้งาน</translation> <translation id="5201306358585911203">หน้าที่ฝังไว้ในหน้าเว็บนี้บอกว่า</translation> @@ -2759,6 +2761,7 @@ <translation id="8623885649813806493">ไม่มีรหัสผ่านที่ตรงกัน แสดงรหัสผ่านที่บันทึกไว้ทั้งหมด</translation> <translation id="8624354461147303341">รับส่วนลด</translation> <translation id="8625384913736129811">บันทึกบัตรนี้ลงในอุปกรณ์นี้</translation> +<translation id="8637577059508742477">โปรไฟล์และเบราว์เซอร์ของคุณจัดการโดย <ph name="DOMAIN" /></translation> <translation id="865032292777205197">เซ็นเซอร์ตรวจจับการเคลื่อนไหว</translation> <translation id="8663226718884576429">สรุปคำสั่งซื้อ <ph name="TOTAL_LABEL" /> รายละเอียดเพิ่มเติม</translation> <translation id="8666678546361132282">อังกฤษ</translation>
diff --git a/components/strings/components_strings_uz.xtb b/components/strings/components_strings_uz.xtb index c9dc8e3..63917157 100644 --- a/components/strings/components_strings_uz.xtb +++ b/components/strings/components_strings_uz.xtb
@@ -1054,6 +1054,7 @@ <translation id="3807873520724684969">Zararli kontent bloklandi.</translation> <translation id="3810973564298564668">Sozlash</translation> <translation id="3816482573645936981">Qiymat (almashtirildi)</translation> +<translation id="3823402221513322552">Brauzeringiz <ph name="BROWSER_DOMAIN" /> domenida va profilingiz <ph name="PROFILE_DOMAIN" /> domenida boshqariladi</translation> <translation id="382518646247711829">Agar proksi-server ishlatsangiz...</translation> <translation id="3826050100957962900">Tashqi xizmatga kirish</translation> <translation id="3827112369919217609">Mutlaq</translation> @@ -1551,6 +1552,7 @@ <translation id="5179510805599951267">Bu <ph name="ORIGINAL_LANGUAGE" /> tili emasmi? Xatolik haqida xabar yuboring</translation> <translation id="518639307526414276">Uy hayvonlari uchun oziq-ovqat va parvarishlash vositalari</translation> <translation id="5190835502935405962">Xatcho‘plar paneli</translation> +<translation id="5191315092027169558">Profilingiz <ph name="DOMAIN" /> domenida boshqariladi</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> bir nechta faylni yuklab olmoqchi</translation> <translation id="519422657042045905">Annotatsiya qilish imkonsiz.</translation> <translation id="5201306358585911203">Amalni tasdiqlang</translation> @@ -2753,6 +2755,7 @@ <translation id="8623885649813806493">Mos parollar mavjud emas. Saqlangan barcha parollar koʻrsatilsin.</translation> <translation id="8624354461147303341">Chegirmalar olish</translation> <translation id="8625384913736129811">Kartani bu qurilmaga saqlash</translation> +<translation id="8637577059508742477">Profil va brauzeringiz <ph name="DOMAIN" /> domenida boshqariladi</translation> <translation id="865032292777205197">harakat sensorlari</translation> <translation id="8663226718884576429">Buyurtma axboroti, <ph name="TOTAL_LABEL" />, Batafsil</translation> <translation id="8666678546361132282">Ingliz tili</translation>
diff --git a/components/url_matcher/url_util.cc b/components/url_matcher/url_util.cc index 4cec96d..5d33c5b8 100644 --- a/components/url_matcher/url_util.cc +++ b/components/url_matcher/url_util.cc
@@ -411,20 +411,15 @@ void AddFilters(URLMatcher* matcher, bool allow, base::MatcherStringPattern::ID* id, - const base::ListValue* patterns, + const base::Value::List& patterns, std::map<base::MatcherStringPattern::ID, url_matcher::util::FilterComponents>* filters) { URLMatcherConditionSet::Vector all_conditions; - base::Value::ConstListView patterns_list = patterns->GetListDeprecated(); - size_t size = std::min(kMaxFiltersAllowed, patterns_list.size()); + size_t size = std::min(kMaxFiltersAllowed, patterns.size()); scoped_refptr<URLMatcherConditionSet> condition_set; for (size_t i = 0; i < size; ++i) { - std::string pattern; - if (patterns_list[i].is_string()) { - pattern = patterns_list[i].GetString(); - } else { - DCHECK(false); - } + DCHECK(patterns[i].is_string()); + const std::string pattern = patterns[i].GetString(); FilterComponents components; components.allow = allow; if (!FilterToComponents(pattern, &components.scheme, &components.host, @@ -480,7 +475,7 @@ } void AddAllowFilters(url_matcher::URLMatcher* matcher, - const base::ListValue* patterns) { + const base::Value::List& patterns) { base::MatcherStringPattern::ID id(0); AddFilters(matcher, true, &id, patterns); }
diff --git a/components/url_matcher/url_util.h b/components/url_matcher/url_util.h index 8a29308..2d1a14b159 100644 --- a/components/url_matcher/url_util.h +++ b/components/url_matcher/url_util.h
@@ -99,7 +99,7 @@ url_matcher::URLMatcher* matcher, bool allow, base::MatcherStringPattern::ID* id, - const base::ListValue* patterns, + const base::Value::List& patterns, std::map<base::MatcherStringPattern::ID, url_matcher::util::FilterComponents>* filters = nullptr); @@ -121,7 +121,7 @@ url_matcher::util::FilterComponents>* filters = nullptr); URL_MATCHER_EXPORT void AddAllowFilters(url_matcher::URLMatcher* matcher, - const base::ListValue* patterns); + const base::Value::List& patterns); URL_MATCHER_EXPORT void AddAllowFilters( url_matcher::URLMatcher* matcher,
diff --git a/components/url_matcher/url_util_unittest.cc b/components/url_matcher/url_util_unittest.cc index 4849019..fb35ac7 100644 --- a/components/url_matcher/url_util_unittest.cc +++ b/components/url_matcher/url_util_unittest.cc
@@ -79,10 +79,10 @@ const std::string& url) { // Add the pattern to the matcher. URLMatcher matcher; - base::Value list(base::Value::Type::LIST); + base::Value::List list; for (const auto& pattern : patterns) list.Append(pattern); - AddAllowFilters(&matcher, &base::Value::AsListValue(list)); + AddAllowFilters(&matcher, list); return !matcher.MatchURL(GURL(url)).empty(); }
diff --git a/components/viz/service/display/surface_aggregator_perftest.cc b/components/viz/service/display/surface_aggregator_perftest.cc index fb9e3ba..26ae6c4d 100644 --- a/components/viz/service/display/surface_aggregator_perftest.cc +++ b/components/viz/service/display/surface_aggregator_perftest.cc
@@ -485,9 +485,9 @@ } std::string GetHistogramStats(base::HistogramBase* histogram) { - base::Value graph_dict = histogram->ToGraphDict(); + base::Value::Dict graph_dict = histogram->ToGraphDict(); // The header contains the sample count and the mean. - return *graph_dict.FindStringKey("header"); + return *graph_dict.FindString("header"); } protected:
diff --git a/components/web_package/test_support/BUILD.gn b/components/web_package/test_support/BUILD.gn index b4c070e..b3fee259 100644 --- a/components/web_package/test_support/BUILD.gn +++ b/components/web_package/test_support/BUILD.gn
@@ -6,15 +6,21 @@ testonly = true sources = [ + "mock_web_bundle_parser.cc", + "mock_web_bundle_parser.h", + "mock_web_bundle_parser_factory.cc", + "mock_web_bundle_parser_factory.h", "signed_web_bundles/web_bundle_signer.cc", "signed_web_bundles/web_bundle_signer.h", ] deps = [ "//base", + "//base/test:test_support", "//components/cbor", "//components/web_package", "//crypto", + "//testing/gtest", "//third_party/boringssl", ] }
diff --git a/components/web_package/test_support/mock_web_bundle_parser.cc b/components/web_package/test_support/mock_web_bundle_parser.cc new file mode 100644 index 0000000..e458a85 --- /dev/null +++ b/components/web_package/test_support/mock_web_bundle_parser.cc
@@ -0,0 +1,87 @@ +// 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/web_package/test_support/mock_web_bundle_parser.h" + +#include "mojo/public/cpp/bindings/pending_receiver.h" + +namespace web_package { + +MockWebBundleParser::MockWebBundleParser( + mojo::PendingReceiver<mojom::WebBundleParser> receiver) + : receiver_(this, std::move(receiver)) {} + +MockWebBundleParser::~MockWebBundleParser() = default; + +void MockWebBundleParser::RunIntegrityBlockCallback( + mojom::BundleIntegrityBlockPtr integrity_block, + mojom::BundleIntegrityBlockParseErrorPtr error) { + std::move(integrity_block_callback_) + .Run(std::move(integrity_block), std::move(error)); +} + +void MockWebBundleParser::RunMetadataCallback( + mojom::BundleMetadataPtr metadata, + web_package::mojom::BundleMetadataParseErrorPtr error) { + std::move(metadata_callback_).Run(std::move(metadata), std::move(error)); +} + +void MockWebBundleParser::RunResponseCallback( + mojom::BundleResponsePtr response, + mojom::BundleResponseParseErrorPtr error) { + std::move(response_callback_).Run(std::move(response), std::move(error)); +} + +void MockWebBundleParser::WaitUntilParseIntegrityBlockCalled( + base::OnceClosure closure) { + if (integrity_block_callback_.is_null()) + wait_parse_integrity_block_callback_ = std::move(closure); + else + std::move(closure).Run(); +} + +void MockWebBundleParser::WaitUntilParseMetadataCalled( + base::OnceCallback<void(int64_t offset)> callback) { + if (metadata_callback_.is_null()) + wait_parse_metadata_callback_ = std::move(callback); + else + std::move(callback).Run(parse_metadata_args_); +} + +void MockWebBundleParser::WaitUntilParseResponseCalled( + base::OnceCallback<void(mojom::BundleResponseLocationPtr)> callback) { + if (response_callback_.is_null()) + wait_parse_response_callback_ = std::move(callback); + else + std::move(callback).Run(std::move(parse_response_args_)); +} + +void MockWebBundleParser::ParseIntegrityBlock( + ParseIntegrityBlockCallback callback) { + integrity_block_callback_ = std::move(callback); + if (!wait_parse_integrity_block_callback_.is_null()) + std::move(wait_parse_integrity_block_callback_).Run(); +} + +void MockWebBundleParser::ParseMetadata(int64_t offset, + ParseMetadataCallback callback) { + metadata_callback_ = std::move(callback); + parse_metadata_args_ = offset; + if (!wait_parse_metadata_callback_.is_null()) + std::move(wait_parse_metadata_callback_).Run(parse_metadata_args_); +} + +void MockWebBundleParser::ParseResponse(uint64_t response_offset, + uint64_t response_length, + ParseResponseCallback callback) { + response_callback_ = std::move(callback); + parse_response_args_ = + mojom::BundleResponseLocation::New(response_offset, response_length); + if (!wait_parse_response_callback_.is_null()) { + std::move(wait_parse_response_callback_) + .Run(std::move(parse_response_args_)); + } +} + +} // namespace web_package
diff --git a/components/web_package/test_support/mock_web_bundle_parser.h b/components/web_package/test_support/mock_web_bundle_parser.h new file mode 100644 index 0000000..95288b78 --- /dev/null +++ b/components/web_package/test_support/mock_web_bundle_parser.h
@@ -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. + +#ifndef COMPONENTS_WEB_PACKAGE_TEST_SUPPORT_MOCK_WEB_BUNDLE_PARSER_H_ +#define COMPONENTS_WEB_PACKAGE_TEST_SUPPORT_MOCK_WEB_BUNDLE_PARSER_H_ + +#include "components/web_package/mojom/web_bundle_parser.mojom.h" +#include "mojo/public/cpp/bindings/receiver.h" + +namespace web_package { + +class MockWebBundleParser final : public mojom::WebBundleParser { + public: + explicit MockWebBundleParser( + mojo::PendingReceiver<mojom::WebBundleParser> receiver); + + MockWebBundleParser(const MockWebBundleParser&) = delete; + MockWebBundleParser& operator=(const MockWebBundleParser&) = delete; + + ~MockWebBundleParser() override; + + void RunIntegrityBlockCallback( + mojom::BundleIntegrityBlockPtr integrity_block, + mojom::BundleIntegrityBlockParseErrorPtr error = nullptr); + void RunMetadataCallback( + mojom::BundleMetadataPtr metadata, + web_package::mojom::BundleMetadataParseErrorPtr error = nullptr); + void RunResponseCallback(mojom::BundleResponsePtr response, + mojom::BundleResponseParseErrorPtr error = nullptr); + + void WaitUntilParseIntegrityBlockCalled(base::OnceClosure closure); + void WaitUntilParseMetadataCalled( + base::OnceCallback<void(int64_t offset)> callback); + void WaitUntilParseResponseCalled( + base::OnceCallback<void(mojom::BundleResponseLocationPtr)> callback); + + private: + // mojom::WebBundleParser implementation. + void ParseIntegrityBlock(ParseIntegrityBlockCallback callback) override; + void ParseMetadata(int64_t offset, ParseMetadataCallback callback) override; + void ParseResponse(uint64_t response_offset, + uint64_t response_length, + ParseResponseCallback callback) override; + + mojo::Receiver<mojom::WebBundleParser> receiver_; + + ParseIntegrityBlockCallback integrity_block_callback_; + ParseMetadataCallback metadata_callback_; + ParseResponseCallback response_callback_; + int64_t parse_metadata_args_; + mojom::BundleResponseLocationPtr parse_response_args_; + base::OnceClosure wait_parse_integrity_block_callback_; + base::OnceCallback<void(int64_t offset)> wait_parse_metadata_callback_; + base::OnceCallback<void(mojom::BundleResponseLocationPtr)> + wait_parse_response_callback_; +}; + +} // namespace web_package + +#endif // COMPONENTS_WEB_PACKAGE_TEST_SUPPORT_MOCK_WEB_BUNDLE_PARSER_H_
diff --git a/components/web_package/test_support/mock_web_bundle_parser_factory.cc b/components/web_package/test_support/mock_web_bundle_parser_factory.cc new file mode 100644 index 0000000..9076f810 --- /dev/null +++ b/components/web_package/test_support/mock_web_bundle_parser_factory.cc
@@ -0,0 +1,96 @@ +// 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/web_package/test_support/mock_web_bundle_parser_factory.h" + +#include "base/run_loop.h" +#include "base/test/test_future.h" +#include "components/web_package/test_support/mock_web_bundle_parser.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace web_package { + +MockWebBundleParserFactory::MockWebBundleParserFactory() = default; + +MockWebBundleParserFactory::~MockWebBundleParserFactory() = default; + +void MockWebBundleParserFactory::AddReceiver( + mojo::PendingReceiver<mojom::WebBundleParserFactory> receiver) { + receivers_.Add(this, std::move(receiver)); +} + +void MockWebBundleParserFactory::WaitUntilParseIntegrityBlockCalled( + base::OnceClosure closure) { + if (parser_) + parser_->WaitUntilParseIntegrityBlockCalled(std::move(closure)); + else + wait_parse_integrity_block_callback_ = std::move(closure); +} + +void MockWebBundleParserFactory::WaitUntilParseMetadataCalled( + base::OnceCallback<void(int64_t offset)> callback) { + if (parser_) + parser_->WaitUntilParseMetadataCalled(std::move(callback)); + else + wait_parse_metadata_callback_ = std::move(callback); +} + +void MockWebBundleParserFactory::RunIntegrityBlockCallback( + mojom::BundleIntegrityBlockPtr integrity_block, + web_package::mojom::BundleIntegrityBlockParseErrorPtr error) { + base::RunLoop run_loop; + WaitUntilParseIntegrityBlockCalled(run_loop.QuitClosure()); + run_loop.Run(); + + ASSERT_TRUE(parser_); + parser_->RunIntegrityBlockCallback(std::move(integrity_block), + std::move(error)); +} + +void MockWebBundleParserFactory::RunMetadataCallback( + int64_t expected_metadata_offset, + mojom::BundleMetadataPtr metadata, + web_package::mojom::BundleMetadataParseErrorPtr error) { + base::test::TestFuture<int64_t> future; + WaitUntilParseMetadataCalled(future.GetCallback()); + EXPECT_EQ(expected_metadata_offset, future.Get()); + + ASSERT_TRUE(parser_); + parser_->RunMetadataCallback(std::move(metadata), std::move(error)); +} + +void MockWebBundleParserFactory::RunResponseCallback( + mojom::BundleResponseLocationPtr expected_parse_args, + mojom::BundleResponsePtr response, + mojom::BundleResponseParseErrorPtr error) { + ASSERT_TRUE(parser_); + base::test::TestFuture<mojom::BundleResponseLocationPtr> future; + parser_->WaitUntilParseResponseCalled(future.GetCallback()); + auto parse_args = future.Take(); + EXPECT_EQ(expected_parse_args->offset, parse_args->offset); + EXPECT_EQ(expected_parse_args->length, parse_args->length); + parser_->RunResponseCallback(std::move(response), std::move(error)); +} + +void MockWebBundleParserFactory::GetParserForFile( + mojo::PendingReceiver<mojom::WebBundleParser> receiver, + base::File file) { + parser_ = std::make_unique<MockWebBundleParser>(std::move(receiver)); + if (!wait_parse_integrity_block_callback_.is_null()) { + parser_->WaitUntilParseIntegrityBlockCalled( + std::move(wait_parse_integrity_block_callback_)); + } + if (!wait_parse_metadata_callback_.is_null()) { + parser_->WaitUntilParseMetadataCalled( + std::move(wait_parse_metadata_callback_)); + } +} + +void MockWebBundleParserFactory::GetParserForDataSource( + mojo::PendingReceiver<mojom::WebBundleParser> receiver, + mojo::PendingRemote<mojom::BundleDataSource> data_source) { + NOTREACHED(); +} + +} // namespace web_package
diff --git a/components/web_package/test_support/mock_web_bundle_parser_factory.h b/components/web_package/test_support/mock_web_bundle_parser_factory.h new file mode 100644 index 0000000..17c814f --- /dev/null +++ b/components/web_package/test_support/mock_web_bundle_parser_factory.h
@@ -0,0 +1,60 @@ +// 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_WEB_PACKAGE_TEST_SUPPORT_MOCK_WEB_BUNDLE_PARSER_FACTORY_H_ +#define COMPONENTS_WEB_PACKAGE_TEST_SUPPORT_MOCK_WEB_BUNDLE_PARSER_FACTORY_H_ + +#include "components/web_package/mojom/web_bundle_parser.mojom.h" +#include "components/web_package/test_support/mock_web_bundle_parser.h" +#include "mojo/public/cpp/bindings/receiver_set.h" + +namespace web_package { + +class MockWebBundleParserFactory final : public mojom::WebBundleParserFactory { + public: + MockWebBundleParserFactory(); + + MockWebBundleParserFactory(const MockWebBundleParserFactory&) = delete; + MockWebBundleParserFactory& operator=(const MockWebBundleParserFactory&) = + delete; + + ~MockWebBundleParserFactory() override; + + void AddReceiver( + mojo::PendingReceiver<mojom::WebBundleParserFactory> receiver); + + void WaitUntilParseIntegrityBlockCalled(base::OnceClosure closure); + + void WaitUntilParseMetadataCalled( + base::OnceCallback<void(int64_t offset)> callback); + + void RunIntegrityBlockCallback( + mojom::BundleIntegrityBlockPtr integrity_block, + mojom::BundleIntegrityBlockParseErrorPtr error = nullptr); + + void RunMetadataCallback(int64_t expected_metadata_offset, + mojom::BundleMetadataPtr metadata, + mojom::BundleMetadataParseErrorPtr error = nullptr); + + void RunResponseCallback(mojom::BundleResponseLocationPtr expected_parse_args, + mojom::BundleResponsePtr response, + mojom::BundleResponseParseErrorPtr error = nullptr); + + private: + // mojom::WebBundleParserFactory implementation. + void GetParserForFile(mojo::PendingReceiver<mojom::WebBundleParser> receiver, + base::File file) override; + void GetParserForDataSource( + mojo::PendingReceiver<mojom::WebBundleParser> receiver, + mojo::PendingRemote<mojom::BundleDataSource> data_source) override; + + std::unique_ptr<MockWebBundleParser> parser_; + mojo::ReceiverSet<mojom::WebBundleParserFactory> receivers_; + base::OnceClosure wait_parse_integrity_block_callback_; + base::OnceCallback<void(int64_t offset)> wait_parse_metadata_callback_; +}; + +} // namespace web_package + +#endif // COMPONENTS_WEB_PACKAGE_TEST_SUPPORT_MOCK_WEB_BUNDLE_PARSER_FACTORY_H_
diff --git a/components/webapps/browser/android/shortcut_info.cc b/components/webapps/browser/android/shortcut_info.cc index a241056..5dbb3fd 100644 --- a/components/webapps/browser/android/shortcut_info.cc +++ b/components/webapps/browser/android/shortcut_info.cc
@@ -222,16 +222,15 @@ } // static -std::string ShortcutInfo::GetManifestId( - const blink::mojom::Manifest& manifest) { +GURL ShortcutInfo::GetManifestId(const blink::mojom::Manifest& manifest) { if (manifest.id.has_value()) { // Generate the formatted id by <start_url_origin>/<manifest_id>. GURL manifest_id(manifest.start_url.DeprecatedGetOriginAsURL().spec() + base::UTF16ToUTF8(manifest.id.value())); DCHECK(manifest_id.is_valid()); - return manifest_id.spec(); + return manifest_id; } - return manifest.start_url.spec(); + return manifest.start_url; } } // namespace webapps
diff --git a/components/webapps/browser/android/shortcut_info.h b/components/webapps/browser/android/shortcut_info.h index 011e76d..8dc086a 100644 --- a/components/webapps/browser/android/shortcut_info.h +++ b/components/webapps/browser/android/shortcut_info.h
@@ -137,7 +137,7 @@ std::set<GURL> GetWebApkIcons(); // Generate the formatted id field from web manifest. - static std::string GetManifestId(const blink::mojom::Manifest& manifest); + static GURL GetManifestId(const blink::mojom::Manifest& manifest); GURL manifest_url; GURL url; @@ -163,7 +163,7 @@ absl::optional<ShareTarget> share_target; // Id specified in the manifest. - std::string manifest_id; + GURL manifest_id; // Both shortcut item related vectors have the same size. std::vector<blink::Manifest::ShortcutItem> shortcut_items;
diff --git a/components/webapps/browser/android/shortcut_info_unittest.cc b/components/webapps/browser/android/shortcut_info_unittest.cc index ba365385..33c3430 100644 --- a/components/webapps/browser/android/shortcut_info_unittest.cc +++ b/components/webapps/browser/android/shortcut_info_unittest.cc
@@ -251,7 +251,7 @@ info_.UpdateFromManifest(manifest_); - EXPECT_EQ(info_.manifest_id, "https://new.com/new_id"); + EXPECT_EQ(info_.manifest_id.spec(), "https://new.com/new_id"); } TEST_F(ShortcutInfoTest, ManifestIdFallback) { @@ -261,7 +261,7 @@ info_.UpdateFromManifest(manifest_); // If id is not specified, use start_url. - EXPECT_EQ(info_.manifest_id, manifest_.start_url.spec()); + EXPECT_EQ(info_.manifest_id.spec(), manifest_.start_url.spec()); } } // namespace webapps
diff --git a/components/webapps/browser/android/webapk/webapk_proto_builder.cc b/components/webapps/browser/android/webapk/webapk_proto_builder.cc index e8719ba7..d1f4f27 100644 --- a/components/webapps/browser/android/webapk/webapk_proto_builder.cc +++ b/components/webapps/browser/android/webapk/webapk_proto_builder.cc
@@ -94,7 +94,7 @@ std::unique_ptr<std::string> BuildProtoInBackground( const webapps::ShortcutInfo& shortcut_info, - const std::string& app_key, + const GURL& app_key, const std::string& primary_icon_data, bool is_primary_icon_maskable, const std::string& splash_icon_data, @@ -133,8 +133,8 @@ ui::OptionalSkColorToString(shortcut_info.theme_color)); if (base::FeatureList::IsEnabled(features::kWebApkUniqueId)) { - web_app_manifest->set_id(shortcut_info.manifest_id); - webapk->set_app_key(app_key); + web_app_manifest->set_id(shortcut_info.manifest_id.spec()); + webapk->set_app_key(app_key.spec()); } std::string* scope = web_app_manifest->add_scopes(); @@ -277,7 +277,7 @@ void BuildProto( const webapps::ShortcutInfo& shortcut_info, - const std::string& app_key, + const GURL& app_key, const std::string& primary_icon_data, bool is_primary_icon_maskable, const std::string& splash_icon_data, @@ -305,7 +305,7 @@ bool StoreUpdateRequestToFileInBackground( const base::FilePath& update_request_path, const webapps::ShortcutInfo& shortcut_info, - const std::string& app_key, + const GURL& app_key, const std::string& primary_icon_data, bool is_primary_icon_maskable, const std::string& splash_icon_data,
diff --git a/components/webapps/browser/android/webapk/webapk_proto_builder.h b/components/webapps/browser/android/webapk/webapk_proto_builder.h index 807a718..7d551e48 100644 --- a/components/webapps/browser/android/webapk/webapk_proto_builder.h +++ b/components/webapps/browser/android/webapk/webapk_proto_builder.h
@@ -14,6 +14,7 @@ #include "components/webapps/browser/android/shortcut_info.h" #include "components/webapps/browser/android/webapk/webapk_icon_hasher.h" #include "components/webapps/browser/android/webapk/webapk_types.h" +#include "url/gurl.h" namespace base { class FilePath; @@ -28,7 +29,7 @@ // splash icon URL is unknown. std::unique_ptr<std::string> BuildProtoInBackground( const webapps::ShortcutInfo& shortcut_info, - const std::string& app_key, + const GURL& app_key, const std::string& primary_icon_data, bool is_primary_icon_maskable, const std::string& splash_icon_data, @@ -43,7 +44,7 @@ // Runs |callback| on the calling thread when complete. void BuildProto( const webapps::ShortcutInfo& shortcut_info, - const std::string& app_key, + const GURL& app_key, const std::string& primary_icon_data, bool is_primary_icon_maskable, const std::string& splash_icon_data, @@ -61,7 +62,7 @@ bool StoreUpdateRequestToFileInBackground( const base::FilePath& update_request_path, const webapps::ShortcutInfo& shortcut_info, - const std::string& app_key, + const GURL& app_key, const std::string& primary_icon_data, bool is_primary_icon_maskable, const std::string& splash_icon_data,
diff --git a/components/webapps/browser/android/webapk/webapk_proto_builder_unittest.cc b/components/webapps/browser/android/webapk/webapk_proto_builder_unittest.cc index a277a1a..dd76c7e9 100644 --- a/components/webapps/browser/android/webapk/webapk_proto_builder_unittest.cc +++ b/components/webapps/browser/android/webapk/webapk_proto_builder_unittest.cc
@@ -46,8 +46,8 @@ icon_url_to_murmur2_hash, const std::string& primary_icon_data, const std::string& splash_icon_data, - const std::string& manifest_id, - const std::string& app_key, + const GURL& manifest_id, + const GURL& app_key, bool is_manifest_stale, bool is_app_identity_update_supported, const std::vector<GURL>& best_shortcut_icon_urls) { @@ -143,8 +143,8 @@ std::unique_ptr<BuildProtoRunner> runner = CreateBuildProtoRunner(); runner->BuildSync(GURL(), GURL(), std::move(icon_url_to_murmur2_hash), - primary_icon_data, splash_icon_data, "" /*manifest_id*/, - "" /*app_key*/, true /* is_manifest_stale */, + primary_icon_data, splash_icon_data, GURL() /*manifest_id*/, + GURL() /*app_key*/, true /* is_manifest_stale */, true /* is_app_identity_update_supported */, {}); webapk::WebApk* webapk_request = runner->GetWebApkRequest(); ASSERT_NE(nullptr, webapk_request); @@ -185,8 +185,8 @@ std::unique_ptr<BuildProtoRunner> runner = CreateBuildProtoRunner(); runner->BuildSync(GURL(best_primary_icon_url), GURL(best_splash_icon_url), icon_url_to_murmur2_hash, "" /* primary_icon_data */, - "" /* splash_icon_data */, "" /*manifest_id*/, - "" /*app_key*/, false /* is_manifest_stale*/, + "" /* splash_icon_data */, GURL() /*manifest_id*/, + GURL() /*app_key*/, false /* is_manifest_stale*/, false /* is_app_identity_update_supported */, {GURL(best_shortcut_icon_url)}); webapk::WebApk* webapk_request = runner->GetWebApkRequest(); @@ -243,8 +243,8 @@ std::unique_ptr<BuildProtoRunner> runner = CreateBuildProtoRunner(); runner->BuildSync( GURL(best_icon_url), GURL(best_icon_url), icon_url_to_murmur2_hash, - "" /* primary_icon_data */, "" /* splash_icon_data */, "" /*manifest_id*/, - "" /*app_key*/, false /* is_manifest_stale*/, + "" /* primary_icon_data */, "" /* splash_icon_data */, + GURL() /*manifest_id*/, GURL() /*app_key*/, false /* is_manifest_stale*/, false /* is_app_identity_update_supported */, {GURL(best_icon_url)}); webapk::WebApk* webapk_request = runner->GetWebApkRequest(); ASSERT_NE(nullptr, webapk_request); @@ -299,7 +299,7 @@ std::unique_ptr<BuildProtoRunner> runner = CreateBuildProtoRunner(); runner->BuildSync( GURL(), GURL(), icon_url_to_murmur2_hash, "" /* primary_icon_data */, - "" /* splash_icon_data */, "" /*manifest_id*/, "" /*app_key*/, + "" /* splash_icon_data */, GURL() /*manifest_id*/, GURL() /*app_key*/, false /* is_manifest_stale*/, false /* is_app_identity_update_supported */, {GURL(best_shortcut_icon_url1), GURL(best_shortcut_icon_url2)}); @@ -336,7 +336,7 @@ std::unique_ptr<BuildProtoRunner> runner = CreateBuildProtoRunner(); runner->BuildSync( GURL(), GURL(), icon_url_to_murmur2_hash, "" /* primary_icon_data */, - "" /* splash_icon_data */, "" /*manifest_id*/, "" /*app_key*/, + "" /* splash_icon_data */, GURL() /*manifest_id*/, GURL() /*app_key*/, false /* is_manifest_stale*/, false /* is_app_identity_update_supported */, {GURL(best_shortcut_icon_url), GURL(best_shortcut_icon_url)}); @@ -374,8 +374,8 @@ std::unique_ptr<BuildProtoRunner> runner = CreateBuildProtoRunner(); runner->BuildSync( GURL(icon_url_1), GURL(best_icon_url), icon_url_to_murmur2_hash, - "" /* primary_icon_data */, "" /* splash_icon_data */, "" /*manifest_id*/, - "" /*app_key*/, false /* is_manifest_stale*/, + "" /* primary_icon_data */, "" /* splash_icon_data */, + GURL() /*manifest_id*/, GURL() /*app_key*/, false /* is_manifest_stale*/, true /* is_app_identity_update_supported */, {GURL(best_icon_url)}); webapk::WebApk* webapk_request = runner->GetWebApkRequest(); ASSERT_NE(nullptr, webapk_request); @@ -421,8 +421,8 @@ TEST_F(WebApkProtoBuilderTest, BuildWebApkProtoManifestIdAndKey) { base::test::ScopedFeatureList feature_list( webapps::features::kWebApkUniqueId); - std::string manifest_id_1 = "test_id_1"; - std::string app_key_1 = "test_key_1"; + GURL manifest_id_1 = test_server()->GetURL("/test_id"); + GURL app_key_1 = test_server()->GetURL("/test_key"); std::map<std::string, webapps::WebApkIconHasher::Icon> icon_url_to_murmur2_hash; @@ -434,8 +434,6 @@ webapk::WebApk* webapk_request = runner->GetWebApkRequest(); ASSERT_NE(nullptr, webapk_request); - EXPECT_EQ(webapk_request->app_key(), app_key_1); - - webapk::WebAppManifest manifest = webapk_request->manifest(); - EXPECT_EQ(manifest.id(), manifest_id_1); + EXPECT_EQ(webapk_request->app_key(), app_key_1.spec()); + EXPECT_EQ(webapk_request->manifest().id(), manifest_id_1.spec()); }
diff --git a/content/BUILD.gn b/content/BUILD.gn index 49b290b..711d81ae 100644 --- a/content/BUILD.gn +++ b/content/BUILD.gn
@@ -122,7 +122,7 @@ "//content/browser/attribution_reporting:mojo_bindings_webui_js", "//content/browser/preloading/prerender:mojo_bindings_webui_js", "//content/browser/resources/attribution_reporting:build_ts", - "//content/browser/resources/gpu:web_components", + "//content/browser/resources/gpu:html_wrapper_files", "//content/browser/resources/process:build_ts", "//storage/browser/quota:mojo_bindings_webui_js", ]
diff --git a/content/browser/accessibility/browser_accessibility_manager.cc b/content/browser/accessibility/browser_accessibility_manager.cc index e574e88..7a15441 100644 --- a/content/browser/accessibility/browser_accessibility_manager.cc +++ b/content/browser/accessibility/browser_accessibility_manager.cc
@@ -1903,6 +1903,11 @@ return GetRoot()->ApproximateHitTest(blink_screen_point); } +void BrowserAccessibilityManager::DetachFromParentManager() { + connected_to_parent_tree_node_ = false; + delegate_ = nullptr; +} + void BrowserAccessibilityManager::BuildAXTreeHitTestCache() { auto* root = GetRoot(); if (!root)
diff --git a/content/browser/accessibility/browser_accessibility_manager.h b/content/browser/accessibility/browser_accessibility_manager.h index 8351fd6..5bb1cc9 100644 --- a/content/browser/accessibility/browser_accessibility_manager.h +++ b/content/browser/accessibility/browser_accessibility_manager.h
@@ -568,6 +568,10 @@ BrowserAccessibility* ApproximateHitTest( const gfx::Point& blink_screen_point) const; + // Detaches this instance from its parent manager. Useful during + // deconstruction. + void DetachFromParentManager(); + protected: FRIEND_TEST_ALL_PREFIXES(BrowserAccessibilityManagerTest, TestShouldFireEventForNode);
diff --git a/content/browser/fenced_frame/fenced_frame.cc b/content/browser/fenced_frame/fenced_frame.cc index c185869..697249d9 100644 --- a/content/browser/fenced_frame/fenced_frame.cc +++ b/content/browser/fenced_frame/fenced_frame.cc
@@ -168,7 +168,9 @@ return web_contents_->LoadingTree(); } -RenderFrameProxyHost* FencedFrame::CreateProxyAndAttachToOuterFrameTree() { +RenderFrameProxyHost* FencedFrame::CreateProxyAndAttachToOuterFrameTree( + mojom::RemoteFrameInterfacesFromRendererPtr remote_frame_interfaces) { + DCHECK(remote_frame_interfaces); DCHECK(outer_delegate_frame_tree_node_); // Connect the outer delegate RenderFrameHost with the inner main // FrameTreeNode. This allows us to traverse from the outer delegate RFH @@ -186,6 +188,10 @@ ->CreateOuterDelegateProxy( owner_render_frame_host_->GetSiteInstance(), inner_root); + proxy_host->BindRemoteFrameInterfaces( + std::move(remote_frame_interfaces->frame), + std::move(remote_frame_interfaces->frame_host_receiver)); + inner_root->current_frame_host()->PropagateEmbeddingTokenToParentFrame(); // We need to set the `proxy_host` as created because the
diff --git a/content/browser/fenced_frame/fenced_frame.h b/content/browser/fenced_frame/fenced_frame.h index c73906c..cd7ea9a 100644 --- a/content/browser/fenced_frame/fenced_frame.h +++ b/content/browser/fenced_frame/fenced_frame.h
@@ -47,7 +47,9 @@ // Called when a fenced frame is created from a synchronous IPC from the // renderer. This creates a proxy representing the main frame of the inner // `FrameTree`, for use by the embedding RenderFrameHostImpl. - RenderFrameProxyHost* CreateProxyAndAttachToOuterFrameTree(); + // `remote_frame_interfaces` must not be null. + RenderFrameProxyHost* CreateProxyAndAttachToOuterFrameTree( + mojom::RemoteFrameInterfacesFromRendererPtr remote_frame_interfaces); // blink::mojom::FencedFrameOwnerHost implementation. void Navigate(const GURL& url,
diff --git a/content/browser/fenced_frame/fenced_frame_browsertest.cc b/content/browser/fenced_frame/fenced_frame_browsertest.cc index f4f46dfb..90122e1 100644 --- a/content/browser/fenced_frame/fenced_frame_browsertest.cc +++ b/content/browser/fenced_frame/fenced_frame_browsertest.cc
@@ -274,13 +274,14 @@ mojo::PendingAssociatedReceiver<blink::mojom::FencedFrameOwnerHost> pending_receiver, blink::mojom::FencedFrameMode mode, + mojom::RemoteFrameInterfacesFromRendererPtr remote_frame_interfaces, CreateFencedFrameCallback callback) override { mojo::PendingAssociatedRemote<blink::mojom::FencedFrameOwnerHost> original_remote; GetForwardingInterface()->CreateFencedFrame( original_remote.InitWithNewEndpointAndPassReceiver(), mode, - std::move(callback)); + std::move(remote_frame_interfaces), std::move(callback)); std::vector<FencedFrame*> fenced_frames = render_frame_host_->GetFencedFrames(); ASSERT_FALSE(fenced_frames.empty());
diff --git a/content/browser/gpu/gpu_internals_ui.cc b/content/browser/gpu/gpu_internals_ui.cc index 372f989..2e0a7155 100644 --- a/content/browser/gpu/gpu_internals_ui.cc +++ b/content/browser/gpu/gpu_internals_ui.cc
@@ -82,9 +82,15 @@ source->UseStringsJs(); source->AddResourcePath("browser_bridge.js", IDR_GPU_BROWSER_BRIDGE_JS); source->AddResourcePath("gpu_internals.js", IDR_GPU_INTERNALS_JS); + source->AddResourcePath("info_view.html.js", + IDR_GPU_INTERNALS_INFO_VIEW_HTML_JS); source->AddResourcePath("info_view.js", IDR_GPU_INTERNALS_INFO_VIEW_JS); + source->AddResourcePath("info_view_table.html.js", + IDR_GPU_INTERNALS_INFO_VIEW_TABLE_HTML_JS); source->AddResourcePath("info_view_table.js", IDR_GPU_INTERNALS_INFO_VIEW_TABLE_JS); + source->AddResourcePath("info_view_table_row.html.js", + IDR_GPU_INTERNALS_INFO_VIEW_TABLE_ROW_HTML_JS); source->AddResourcePath("info_view_table_row.js", IDR_GPU_INTERNALS_INFO_VIEW_TABLE_ROW_JS); source->AddResourcePath("vulkan_info.js", IDR_GPU_VULKAN_INFO_JS); @@ -258,7 +264,7 @@ "Window system binding extensions", gpu_info.gl_ws_extensions)); { - base::Value::DeprecatedListStorage gpu_extra_info_values = + base::Value::List gpu_extra_info_values = display::Screen::GetScreen()->GetGpuExtraInfo(gpu_extra_info); for (auto& pair : gpu_extra_info_values) { if (!pair.GetDict().FindString("description") ||
diff --git a/content/browser/loader/object_navigation_fallback_body_loader.cc b/content/browser/loader/object_navigation_fallback_body_loader.cc index 7b3d535..ae6b0958 100644 --- a/content/browser/loader/object_navigation_fallback_body_loader.cc +++ b/content/browser/loader/object_navigation_fallback_body_loader.cc
@@ -263,8 +263,11 @@ RenderFrameHostManager* render_manager = navigation_request_.frame_tree_node()->render_manager(); if (RenderFrameProxyHost* proxy = render_manager->GetProxyToParent()) { - proxy->GetAssociatedRemoteFrame()->RenderFallbackContentWithResourceTiming( - std::move(timing_info_), server_timing_value_); + if (proxy->is_render_frame_proxy_live()) { + proxy->GetAssociatedRemoteFrame() + ->RenderFallbackContentWithResourceTiming(std::move(timing_info_), + server_timing_value_); + } } else { render_manager->current_frame_host() ->GetAssociatedLocalFrame()
diff --git a/content/browser/metrics/histograms_internals_ui.cc b/content/browser/metrics/histograms_internals_ui.cc index 37bc51b5..c14ae1d 100644 --- a/content/browser/metrics/histograms_internals_ui.cc +++ b/content/browser/metrics/histograms_internals_ui.cc
@@ -99,8 +99,8 @@ for (base::HistogramBase* histogram : base::StatisticsRecorder::Sort(base::StatisticsRecorder::WithName( base::StatisticsRecorder::GetHistograms(), params.query))) { - base::Value histogram_dict = histogram->ToGraphDict(); - if (!histogram_dict.DictEmpty()) + base::Value::Dict histogram_dict = histogram->ToGraphDict(); + if (!histogram_dict.empty()) histograms_list.Append(std::move(histogram_dict)); }
diff --git a/content/browser/metrics/histograms_monitor.cc b/content/browser/metrics/histograms_monitor.cc index be83229..e10ef4c 100644 --- a/content/browser/metrics/histograms_monitor.cc +++ b/content/browser/metrics/histograms_monitor.cc
@@ -50,7 +50,7 @@ snapshot->Subtract(*it->second.get()); } if (snapshot->TotalCount() > 0) { - base::Value histogram_dict = snapshot->ToGraphDict( + base::Value::Dict histogram_dict = snapshot->ToGraphDict( histogram->histogram_name(), histogram->flags()); histograms_list.Append(std::move(histogram_dict)); }
diff --git a/content/browser/net/dns_https_protocol_upgrade_browsertest.cc b/content/browser/net/dns_https_protocol_upgrade_browsertest.cc index 1df62e1..ab62f44 100644 --- a/content/browser/net/dns_https_protocol_upgrade_browsertest.cc +++ b/content/browser/net/dns_https_protocol_upgrade_browsertest.cc
@@ -55,36 +55,9 @@ absl::optional<net::DnsOverHttpsConfig> doh_config = net::DnsOverHttpsConfig::FromString(doh_server_->GetTemplate()); ASSERT_TRUE(doh_config.has_value()); - - // When the network service runs out-of-process, use `BrowserTestBase` - // methods to poke the DNS configuration. - if (content::IsOutOfProcessNetworkService()) { - SetTestDohConfig(net::SecureDnsMode::kSecure, - std::move(doh_config).value()); - SetReplaceSystemDnsConfig(); - return; - } - // When the network service runs in-process, we can talk to it directly. - // Ideally, we would use Mojo to communicate with the network process - // regardless of where it's running, but for reasons I do not understand, - // Mojo messages seem to cause a deadlock when the network service is - // in-process. - // - // TODO(https://crbug.com/1295732) Rely on `BrowserTestBase` to pass this - // info to the network service via Mojo, regardless of where the network - // service is running. - base::RunLoop run_loop; - content::GetNetworkTaskRunner()->PostTaskAndReply( - FROM_HERE, base::BindLambdaForTesting([&] { - network::NetworkService* network_service = - network::NetworkService::GetNetworkServiceForTesting(); - ASSERT_TRUE(network_service); - network_service->SetTestDohConfigForTesting( - net::SecureDnsMode::kSecure, doh_config.value()); - network_service->ReplaceSystemDnsConfigForTesting(); - }), - run_loop.QuitClosure()); - run_loop.Run(); + SetTestDohConfig(net::SecureDnsMode::kSecure, + std::move(doh_config).value()); + SetReplaceSystemDnsConfig(); } std::unique_ptr<net::TestDohServer> doh_server_;
diff --git a/content/browser/portal/portal.cc b/content/browser/portal/portal.cc index 8094b9eb..465bf224 100644 --- a/content/browser/portal/portal.cc +++ b/content/browser/portal/portal.cc
@@ -120,7 +120,9 @@ owner_render_frame_host_->DestroyPortal(this); } -RenderFrameProxyHost* Portal::CreateProxyAndAttachPortal() { +RenderFrameProxyHost* Portal::CreateProxyAndAttachPortal( + mojom::RemoteFrameInterfacesFromRendererPtr remote_frame_interfaces) { + DCHECK(remote_frame_interfaces); WebContentsImpl* outer_contents_impl = GetPortalHostContents(); // Check if portal has already been attached. @@ -169,7 +171,9 @@ "ownership is yielded"; outer_contents_impl->AttachInnerWebContents( portal_contents_.ReleaseOwnership(), outer_node->current_frame_host(), - false /* is_full_page */); + std::move(remote_frame_interfaces->frame), + std::move(remote_frame_interfaces->frame_host_receiver), + /*is_full_page=*/false); // Create the view for all RenderViewHosts that don't have a // RenderWidgetHostViewChildFrame view.
diff --git a/content/browser/portal/portal.h b/content/browser/portal/portal.h index 1348be9..8cea95c1 100644 --- a/content/browser/portal/portal.h +++ b/content/browser/portal/portal.h
@@ -66,8 +66,9 @@ void DestroySelf(); // Called from a synchronous IPC from the renderer process in order to create - // the proxy. - RenderFrameProxyHost* CreateProxyAndAttachPortal(); + // the proxy. `remote_frame_interfaces` must not be null. + RenderFrameProxyHost* CreateProxyAndAttachPortal( + mojom::RemoteFrameInterfacesFromRendererPtr remote_frame_interfaces); // Closes the contents associated with this object gracefully, and destroys // itself thereafter. This will fire unload and related event handlers.
diff --git a/content/browser/portal/portal_browsertest.cc b/content/browser/portal/portal_browsertest.cc index 59370194..8aca30d8 100644 --- a/content/browser/portal/portal_browsertest.cc +++ b/content/browser/portal/portal_browsertest.cc
@@ -2355,7 +2355,17 @@ portal_interceptor->SetNavigateCallback(base::BindRepeating( [](Portal* portal, const GURL& url, blink::mojom::ReferrerPtr referrer, blink::mojom::Portal::NavigateCallback callback) { - portal->CreateProxyAndAttachPortal(); + // Create stub RemoteFrameInterfaces. + auto remote_frame_interfaces = + mojom::RemoteFrameInterfacesFromRenderer::New(); + remote_frame_interfaces->frame_host_receiver = + mojo::AssociatedRemote<blink::mojom::RemoteFrameHost>() + .BindNewEndpointAndPassDedicatedReceiver(); + mojo::AssociatedRemote<blink::mojom::RemoteFrame> frame; + std::ignore = frame.BindNewEndpointAndPassDedicatedReceiver(); + remote_frame_interfaces->frame = frame.Unbind(); + + portal->CreateProxyAndAttachPortal(std::move(remote_frame_interfaces)); std::move(callback).Run(); }, portal));
diff --git a/content/browser/renderer_host/agent_scheduling_group_host.cc b/content/browser/renderer_host/agent_scheduling_group_host.cc index bb633c5..cb2f3bc 100644 --- a/content/browser/renderer_host/agent_scheduling_group_host.cc +++ b/content/browser/renderer_host/agent_scheduling_group_host.cc
@@ -341,19 +341,20 @@ void AgentSchedulingGroupHost::CreateFrameProxy( const blink::RemoteFrameToken& token, - int32_t routing_id, const absl::optional<blink::FrameToken>& opener_frame_token, int32_t view_routing_id, const absl::optional<blink::RemoteFrameToken>& parent_frame_token, blink::mojom::TreeScopeType tree_scope_type, blink::mojom::FrameReplicationStatePtr replicated_state, const base::UnguessableToken& devtools_frame_token, + mojom::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) { DCHECK_EQ(state_, LifecycleState::kBound); mojo_remote_.get()->CreateFrameProxy( - token, routing_id, opener_frame_token, view_routing_id, - parent_frame_token, tree_scope_type, std::move(replicated_state), - devtools_frame_token, std::move(remote_main_frame_interfaces)); + token, opener_frame_token, view_routing_id, parent_frame_token, + tree_scope_type, std::move(replicated_state), devtools_frame_token, + std::move(remote_frame_interfaces), + std::move(remote_main_frame_interfaces)); } void AgentSchedulingGroupHost::CreateSharedStorageWorkletService(
diff --git a/content/browser/renderer_host/agent_scheduling_group_host.h b/content/browser/renderer_host/agent_scheduling_group_host.h index 432c7464..96a3940 100644 --- a/content/browser/renderer_host/agent_scheduling_group_host.h +++ b/content/browser/renderer_host/agent_scheduling_group_host.h
@@ -106,13 +106,13 @@ void DestroyView(int32_t routing_id); void CreateFrameProxy( const blink::RemoteFrameToken& token, - int32_t routing_id, const absl::optional<blink::FrameToken>& opener_frame_token, int32_t view_routing_id, const absl::optional<blink::RemoteFrameToken>& parent_frame_token, blink::mojom::TreeScopeType tree_scope_type, blink::mojom::FrameReplicationStatePtr replicated_state, const base::UnguessableToken& devtools_frame_token, + mojom::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces); void CreateSharedStorageWorkletService( mojo::PendingReceiver<
diff --git a/content/browser/renderer_host/browsing_context_state.cc b/content/browser/renderer_host/browsing_context_state.cc index 2b2a959..b7eb73d04 100644 --- a/content/browser/renderer_host/browsing_context_state.cc +++ b/content/browser/renderer_host/browsing_context_state.cc
@@ -193,11 +193,16 @@ } // Notify any proxies if the policies have been changed. if (changed) { - for (const auto& pair : proxy_hosts_) { - pair.second->GetAssociatedRemoteFrame()->DidSetFramePolicyHeaders( - replication_state_->active_sandbox_flags, - replication_state_->permissions_policy_header); - } + ExecuteRemoteFramesBroadcastMethod( + base::BindRepeating( + [](blink::mojom::FrameReplicationStatePtr& replication_state, + RenderFrameProxyHost* proxy) { + proxy->GetAssociatedRemoteFrame()->DidSetFramePolicyHeaders( + replication_state->active_sandbox_flags, + replication_state->permissions_policy_header); + }, + std::ref(replication_state_)), + /*instance_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr); } return changed; } @@ -260,10 +265,15 @@ // Note the unique name should only be able to change before the first real // load is committed, but that's not strongly enforced here. - for (const auto& pair : proxy_hosts_) { - pair.second->GetAssociatedRemoteFrame()->SetReplicatedName(name, - unique_name); - } + ExecuteRemoteFramesBroadcastMethod( + base::BindRepeating( + [](const std::string& name, const std::string& unique_name, + RenderFrameProxyHost* proxy) { + proxy->GetAssociatedRemoteFrame()->SetReplicatedName(name, + unique_name); + }, + std::ref(name), std::ref(unique_name)), + /*instance_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr); replication_state_->unique_name = unique_name; replication_state_->name = name; } @@ -277,10 +287,16 @@ return; } - for (const auto& pair : proxy_hosts_) { - pair.second->GetAssociatedRemoteFrame()->SetReplicatedOrigin( - origin, is_potentially_trustworthy_unique_origin); - } + ExecuteRemoteFramesBroadcastMethod( + base::BindRepeating( + [](const url::Origin& origin, + bool is_potentially_trustworthy_unique_origin, + RenderFrameProxyHost* proxy) { + proxy->GetAssociatedRemoteFrame()->SetReplicatedOrigin( + origin, is_potentially_trustworthy_unique_origin); + }, + std::ref(origin), std::ref(is_potentially_trustworthy_unique_origin)), + /*instance_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr); replication_state_->origin = origin; replication_state_->has_potentially_trustworthy_unique_origin = @@ -291,10 +307,15 @@ blink::mojom::InsecureRequestPolicy policy) { if (policy == replication_state_->insecure_request_policy) return; - for (const auto& pair : proxy_hosts_) { - pair.second->GetAssociatedRemoteFrame()->EnforceInsecureRequestPolicy( - policy); - } + ExecuteRemoteFramesBroadcastMethod( + base::BindRepeating( + [](blink::mojom::InsecureRequestPolicy policy, + RenderFrameProxyHost* proxy) { + proxy->GetAssociatedRemoteFrame()->EnforceInsecureRequestPolicy( + policy); + }, + policy), + /*instance_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr); replication_state_->insecure_request_policy = policy; } @@ -304,19 +325,28 @@ insecure_navigations_set.end())); if (insecure_navigations_set == replication_state_->insecure_navigations_set) return; - for (const auto& pair : proxy_hosts_) { - pair.second->GetAssociatedRemoteFrame()->EnforceInsecureNavigationsSet( - insecure_navigations_set); - } + ExecuteRemoteFramesBroadcastMethod( + base::BindRepeating( + [](const std::vector<uint32_t>& insecure_navigations_set, + RenderFrameProxyHost* proxy) { + proxy->GetAssociatedRemoteFrame()->EnforceInsecureNavigationsSet( + insecure_navigations_set); + }, + std::ref(insecure_navigations_set)), + /*instance_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr); replication_state_->insecure_navigations_set = insecure_navigations_set; } void BrowsingContextState::OnSetHadStickyUserActivationBeforeNavigation( bool value) { - for (const auto& pair : proxy_hosts_) { - pair.second->GetAssociatedRemoteFrame() - ->SetHadStickyUserActivationBeforeNavigation(value); - } + ExecuteRemoteFramesBroadcastMethod( + base::BindRepeating( + [](bool value, RenderFrameProxyHost* proxy) { + proxy->GetAssociatedRemoteFrame() + ->SetHadStickyUserActivationBeforeNavigation(value); + }, + value), + /*instance_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr); replication_state_->has_received_user_gesture_before_nav = value; } @@ -325,10 +355,14 @@ return; replication_state_->is_ad_subframe = is_ad_subframe; - for (const auto& pair : proxy_hosts_) { - pair.second->GetAssociatedRemoteFrame()->SetReplicatedIsAdSubframe( - is_ad_subframe); - } + ExecuteRemoteFramesBroadcastMethod( + base::BindRepeating( + [](bool is_ad_subframe, RenderFrameProxyHost* proxy) { + proxy->GetAssociatedRemoteFrame()->SetReplicatedIsAdSubframe( + is_ad_subframe); + }, + is_ad_subframe), + /*instance_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr); } void BrowsingContextState::ActiveFrameCountIsZero( @@ -359,22 +393,34 @@ const blink::FramePolicy& frame_policy) { // Notify all of the frame's proxies about updated policies, excluding // the parent process since it already knows the latest state. - for (const auto& pair : proxy_hosts_) { - if (pair.second->site_instance_group() != parent_group) { - pair.second->GetAssociatedRemoteFrame()->DidUpdateFramePolicy( - frame_policy); - } - } + ExecuteRemoteFramesBroadcastMethod( + base::BindRepeating( + [](SiteInstanceGroup* parent_group, + const blink::FramePolicy& frame_policy, + RenderFrameProxyHost* proxy) { + if (proxy->site_instance_group() == parent_group) + return; + proxy->GetAssociatedRemoteFrame()->DidUpdateFramePolicy( + frame_policy); + }, + base::Unretained(parent_group), std::ref(frame_policy)), + /*instance_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr); } void BrowsingContextState::OnDidStartLoading() { - for (const auto& pair : proxy_hosts_) - pair.second->GetAssociatedRemoteFrame()->DidStartLoading(); + ExecuteRemoteFramesBroadcastMethod( + base::BindRepeating([](RenderFrameProxyHost* proxy) { + proxy->GetAssociatedRemoteFrame()->DidStartLoading(); + }), + /*instance_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr); } void BrowsingContextState::OnDidStopLoading() { - for (const auto& pair : proxy_hosts_) - pair.second->GetAssociatedRemoteFrame()->DidStopLoading(); + ExecuteRemoteFramesBroadcastMethod( + base::BindRepeating([](RenderFrameProxyHost* proxy) { + proxy->GetAssociatedRemoteFrame()->DidStopLoading(); + }), + /*instance_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr); } void BrowsingContextState::ResetProxyHosts() { @@ -401,15 +447,19 @@ // // TODO(alexmos): It would be sufficient to only send this update to proxies // in the current FrameTree. - for (const auto& pair : proxy_hosts_) { - if (pair.second->site_instance_group() != - parent_->GetSiteInstance()->group()) { - auto properties_for_remote_frame = properties.Clone(); - RenderFrameProxyHost* proxy = pair.second.get(); - proxy->GetAssociatedRemoteFrame()->SetFrameOwnerProperties( - std::move(properties_for_remote_frame)); - } - } + ExecuteRemoteFramesBroadcastMethod( + base::BindRepeating( + [](SiteInstanceGroup* parent_group, + const blink::mojom::FrameOwnerProperties& properties, + RenderFrameProxyHost* proxy) { + if (proxy->site_instance_group() == parent_group) + return; + proxy->GetAssociatedRemoteFrame()->SetFrameOwnerProperties( + properties.Clone()); + }, + base::Unretained(parent_->GetSiteInstance()->group()), + std::ref(properties)), + /*instance_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr); } void BrowsingContextState::ExecuteRemoteFramesBroadcastMethod(
diff --git a/content/browser/renderer_host/cross_process_frame_connector.cc b/content/browser/renderer_host/cross_process_frame_connector.cc index 0948a76..201d471 100644 --- a/content/browser/renderer_host/cross_process_frame_connector.cc +++ b/content/browser/renderer_host/cross_process_frame_connector.cc
@@ -105,7 +105,8 @@ view_->SetFrameConnector(this); if (visibility_ != blink::mojom::FrameVisibility::kRenderedInViewport) OnVisibilityChanged(visibility_); - if (frame_proxy_in_parent_renderer_) { + if (frame_proxy_in_parent_renderer_ && + frame_proxy_in_parent_renderer_->is_render_frame_proxy_live()) { frame_proxy_in_parent_renderer_->GetAssociatedRemoteFrame() ->SetFrameSinkId(view_->GetFrameSinkId()); } @@ -175,6 +176,8 @@ (sizing_info->size.height() >= 0.f)); DCHECK((sizing_info->aspect_ratio.width() >= 0.f) && (sizing_info->aspect_ratio.height() >= 0.f)); + if (!frame_proxy_in_parent_renderer_->is_render_frame_proxy_live()) + return; frame_proxy_in_parent_renderer_->GetAssociatedRemoteFrame() ->IntrinsicSizingInfoOfChildChanged(std::move(sizing_info)); }
diff --git a/content/browser/renderer_host/frame_tree.cc b/content/browser/renderer_host/frame_tree.cc index 8135ab7..d3a91fd5 100644 --- a/content/browser/renderer_host/frame_tree.cc +++ b/content/browser/renderer_host/frame_tree.cc
@@ -707,7 +707,8 @@ RenderFrameProxyHost* proxy = root_manager->current_frame_host() ->browsing_context_state() ->GetRenderFrameProxyHost(group); - proxy->GetAssociatedRemoteFrame()->SetPageFocus(is_focused); + if (proxy->is_render_frame_proxy_live()) + proxy->GetAssociatedRemoteFrame()->SetPageFocus(is_focused); } }
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc index eb2774d..13fe2dab 100644 --- a/content/browser/renderer_host/navigation_request.cc +++ b/content/browser/renderer_host/navigation_request.cc
@@ -7781,7 +7781,9 @@ frame_tree_node_->frame_owner_element_type()); if (RenderFrameProxyHost* proxy = frame_tree_node_->render_manager()->GetProxyToParent()) { - proxy->GetAssociatedRemoteFrame()->RenderFallbackContent(); + if (proxy->is_render_frame_proxy_live()) { + proxy->GetAssociatedRemoteFrame()->RenderFallbackContent(); + } } else { frame_tree_node_->current_frame_host() ->GetAssociatedLocalFrame()
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc index 813a6c26..bdfc071 100644 --- a/content/browser/renderer_host/render_frame_host_impl.cc +++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -3624,7 +3624,8 @@ } // Propagate the token to the right process, if a proxy was found. - if (target_render_frame_proxy) { + if (target_render_frame_proxy && + target_render_frame_proxy->is_render_frame_proxy_live()) { target_render_frame_proxy->GetAssociatedRemoteFrame()->SetEmbeddingToken( embedding_token_.value()); } @@ -4738,9 +4739,9 @@ SetLifecycleState(LifecycleStateImpl::kRunningUnloadHandlers); if (IsRenderFrameLive()) { GetMojomFrameInRenderer()->Unload( - proxy->GetRoutingID(), is_loading, + is_loading, proxy->frame_tree_node()->current_replication_state().Clone(), - proxy->GetFrameToken(), + proxy->GetFrameToken(), proxy->CreateAndBindRemoteFrameInterfaces(), proxy->CreateAndBindRemoteMainFrameInterfaces()); // Remember that a RenderFrameProxy was created as part of processing the // Unload message above. @@ -4784,9 +4785,10 @@ proxy.TearDownMojoConnection(); GetMojomFrameInRenderer()->UndoCommitNavigation( - proxy.GetRoutingID(), is_loading, + is_loading, proxy.frame_tree_node()->current_replication_state().Clone(), - proxy.GetFrameToken(), proxy.CreateAndBindRemoteMainFrameInterfaces()); + proxy.GetFrameToken(), proxy.CreateAndBindRemoteFrameInterfaces(), + proxy.CreateAndBindRemoteMainFrameInterfaces()); } SetLifecycleState(LifecycleStateImpl::kReadyToBeDeleted); @@ -4817,9 +4819,10 @@ void RenderFrameHostImpl::SwapOuterDelegateFrame(RenderFrameProxyHost* proxy) { GetMojomFrameInRenderer()->Unload( - proxy->GetRoutingID(), /*is_loading=*/false, + /*is_loading=*/false, browsing_context_state_->current_replication_state().Clone(), - proxy->GetFrameToken(), proxy->CreateAndBindRemoteMainFrameInterfaces()); + proxy->GetFrameToken(), proxy->CreateAndBindRemoteFrameInterfaces(), + proxy->CreateAndBindRemoteMainFrameInterfaces()); } void RenderFrameHostImpl::DetachFromProxy() { @@ -5981,7 +5984,10 @@ return; } - proxy->GetAssociatedRemoteFrame()->SetNeedsOcclusionTracking(needs_tracking); + if (proxy->is_render_frame_proxy_live()) { + proxy->GetAssociatedRemoteFrame()->SetNeedsOcclusionTracking( + needs_tracking); + } } void RenderFrameHostImpl::SetVirtualKeyboardOverlayPolicy( @@ -6119,7 +6125,8 @@ return; } - proxy->GetAssociatedRemoteFrame()->DispatchLoadEventForFrameOwner(); + if (proxy->is_render_frame_proxy_live()) + proxy->GetAssociatedRemoteFrame()->DispatchLoadEventForFrameOwner(); } void RenderFrameHostImpl::GoToEntryAtOffset(int32_t offset, @@ -6257,8 +6264,10 @@ bad_message::RFH_NO_PROXY_TO_PARENT); return; } - proxy->GetAssociatedRemoteFrame()->AddResourceTimingFromChild( - std::move(timing)); + if (proxy->is_render_frame_proxy_live()) { + proxy->GetAssociatedRemoteFrame()->AddResourceTimingFromChild( + std::move(timing)); + } } RenderWidgetHostViewBase* RenderFrameHostImpl::GetViewForAccessibility() { @@ -6549,9 +6558,11 @@ RenderFrameProxyHost* child_proxy = rfh->browsing_context_state()->GetRenderFrameProxyHost( static_cast<SiteInstanceImpl*>(parent_site_instance)->group()); - child_proxy->GetAssociatedRemoteFrame()->WillEnterFullscreen( - options.Clone()); - notified_instances.insert(parent_site_instance); + if (child_proxy->is_render_frame_proxy_live()) { + child_proxy->GetAssociatedRemoteFrame()->WillEnterFullscreen( + options.Clone()); + notified_instances.insert(parent_site_instance); + } } // Focus the window if another frame may have delegated the capability. @@ -6807,8 +6818,10 @@ return; } - proxy->GetAssociatedRemoteFrame()->BubbleLogicalScroll(direction, - granularity); + if (proxy->is_render_frame_proxy_live()) { + proxy->GetAssociatedRemoteFrame()->BubbleLogicalScroll(direction, + granularity); + } } void RenderFrameHostImpl::ShowPopupMenu( @@ -7476,6 +7489,7 @@ void RenderFrameHostImpl::CreatePortal( mojo::PendingAssociatedReceiver<blink::mojom::Portal> pending_receiver, mojo::PendingAssociatedRemote<blink::mojom::PortalClient> client, + mojom::RemoteFrameInterfacesFromRendererPtr remote_frame_interfaces, CreatePortalCallback callback) { if (!Portal::IsEnabled()) { frame_host_associated_receiver_.ReportBadMessage( @@ -7524,7 +7538,14 @@ portal->Bind(std::move(pending_receiver), std::move(client)); auto it = portals_.insert(std::move(portal)).first; - RenderFrameProxyHost* proxy_host = (*it)->CreateProxyAndAttachPortal(); + RenderFrameProxyHost* proxy_host = + (*it)->CreateProxyAndAttachPortal(std::move(remote_frame_interfaces)); + + if (!proxy_host) { + frame_host_associated_receiver_.ReportBadMessage( + "Trying to attach a portal that has already been attached."); + return; + } // Since the portal is newly created and has yet to commit a navigation, this // state is default-constructed. @@ -7532,14 +7553,15 @@ proxy_host->frame_tree_node()->current_replication_state(); DCHECK(initial_replicated_state.origin.opaque()); - std::move(callback).Run(proxy_host->GetRoutingID(), - initial_replicated_state.Clone(), + std::move(callback).Run(initial_replicated_state.Clone(), (*it)->portal_token(), proxy_host->GetFrameToken(), (*it)->GetDevToolsFrameToken()); } -void RenderFrameHostImpl::AdoptPortal(const blink::PortalToken& portal_token, - AdoptPortalCallback callback) { +void RenderFrameHostImpl::AdoptPortal( + const blink::PortalToken& portal_token, + mojom::RemoteFrameInterfacesFromRendererPtr remote_frame_interfaces, + AdoptPortalCallback callback) { Portal* portal = FindPortalByToken(portal_token); if (!portal) { frame_host_associated_receiver_.ReportBadMessage( @@ -7547,7 +7569,14 @@ return; } DCHECK_EQ(portal->owner_render_frame_host(), this); - RenderFrameProxyHost* proxy_host = portal->CreateProxyAndAttachPortal(); + RenderFrameProxyHost* proxy_host = + portal->CreateProxyAndAttachPortal(std::move(remote_frame_interfaces)); + + if (!proxy_host) { + frame_host_associated_receiver_.ReportBadMessage( + "Trying to attach a portal that has already been attached."); + return; + } // |frame_sink_id| should be set to the associated frame. See // https://crbug.com/966119 for details. @@ -7558,7 +7587,6 @@ proxy_host->GetAssociatedRemoteFrame()->SetFrameSinkId(frame_sink_id); std::move(callback).Run( - proxy_host->GetRoutingID(), proxy_host->frame_tree_node()->current_replication_state().Clone(), proxy_host->GetFrameToken(), portal->GetDevToolsFrameToken()); } @@ -7581,13 +7609,14 @@ mojo::PendingAssociatedReceiver<blink::mojom::FencedFrameOwnerHost> pending_receiver, blink::mojom::FencedFrameMode mode, + mojom::RemoteFrameInterfacesFromRendererPtr remote_frame_interfaces, CreateFencedFrameCallback callback) { // We should defer fenced frame creation during prerendering, so creation at // this point is an error. if (GetLifecycleState() == RenderFrameHost::LifecycleState::kPrerendering) { bad_message::ReceivedBadMessage(GetProcess(), bad_message::FF_CREATE_WHILE_PRERENDERING); - std::move(callback).Run(0, blink::mojom::FrameReplicationState::New(), + std::move(callback).Run(blink::mojom::FrameReplicationState::New(), blink::RemoteFrameToken(), base::UnguessableToken::Create()); return; @@ -7595,7 +7624,7 @@ if (!frame_tree_->IsFencedFramesMPArchBased()) { bad_message::ReceivedBadMessage( GetProcess(), bad_message::RFH_FENCED_FRAME_MOJO_WHEN_DISABLED); - std::move(callback).Run(0, blink::mojom::FrameReplicationState::New(), + std::move(callback).Run(blink::mojom::FrameReplicationState::New(), blink::RemoteFrameToken(), base::UnguessableToken::Create()); return; @@ -7606,7 +7635,7 @@ if (IsSandboxed(blink::kFencedFrameMandatoryUnsandboxedFlags)) { bad_message::ReceivedBadMessage( GetProcess(), bad_message::RFH_CREATE_FENCED_FRAME_IN_SANDBOXED_FRAME); - std::move(callback).Run(0, blink::mojom::FrameReplicationState::New(), + std::move(callback).Run(blink::mojom::FrameReplicationState::New(), blink::RemoteFrameToken(), base::UnguessableToken::Create()); return; @@ -7618,7 +7647,7 @@ GetMainFrame()->frame_tree_node()->GetFencedFrameMode() != mode) { bad_message::ReceivedBadMessage( GetProcess(), bad_message::FF_DIFFERENT_MODE_THAN_EMBEDDER); - std::move(callback).Run(0, blink::mojom::FrameReplicationState::New(), + std::move(callback).Run(blink::mojom::FrameReplicationState::New(), blink::RemoteFrameToken(), base::UnguessableToken::Create()); return; @@ -7627,7 +7656,8 @@ std::make_unique<FencedFrame>(weak_ptr_factory_.GetSafeRef(), mode)); FencedFrame* fenced_frame = fenced_frames_.back().get(); RenderFrameProxyHost* proxy_host = - fenced_frame->CreateProxyAndAttachToOuterFrameTree(); + fenced_frame->CreateProxyAndAttachToOuterFrameTree( + std::move(remote_frame_interfaces)); fenced_frame->Bind(std::move(pending_receiver)); // Since the fenced frame is newly created and has yet to commit a navigation, @@ -7640,9 +7670,9 @@ // and this default-constructed FRS does not impact that. DCHECK(initial_replicated_state.origin.opaque()); - std::move(callback).Run( - proxy_host->GetRoutingID(), initial_replicated_state.Clone(), - proxy_host->GetFrameToken(), fenced_frame->GetDevToolsFrameToken()); + std::move(callback).Run(initial_replicated_state.Clone(), + proxy_host->GetFrameToken(), + fenced_frame->GetDevToolsFrameToken()); } void RenderFrameHostImpl::CreateNewPopupWidget( @@ -9569,6 +9599,11 @@ // Resetting the Remote signals the renderer to shutdown accessibility // in the renderer. render_accessibility_.reset(); + + if (browser_accessibility_manager_) { + browser_accessibility_manager_->DetachFromParentManager(); + browser_accessibility_manager_.reset(); + } return; }
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h index 3e2cb80..ea5abf08 100644 --- a/content/browser/renderer_host/render_frame_host_impl.h +++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -2747,13 +2747,17 @@ void CreatePortal( mojo::PendingAssociatedReceiver<blink::mojom::Portal> pending_receiver, mojo::PendingAssociatedRemote<blink::mojom::PortalClient> client, + mojom::RemoteFrameInterfacesFromRendererPtr remote_frame_interfaces, CreatePortalCallback callback) override; - void AdoptPortal(const blink::PortalToken& portal_token, - AdoptPortalCallback callback) override; + void AdoptPortal( + const blink::PortalToken& portal_token, + mojom::RemoteFrameInterfacesFromRendererPtr remote_frame_interfaces, + AdoptPortalCallback callback) override; void CreateFencedFrame( mojo::PendingAssociatedReceiver<blink::mojom::FencedFrameOwnerHost> pending_receiver, blink::mojom::FencedFrameMode mode, + mojom::RemoteFrameInterfacesFromRendererPtr remote_frame_interfaces, CreateFencedFrameCallback callback) override; void GetKeepAliveHandleFactory( mojo::PendingReceiver<blink::mojom::KeepAliveHandleFactory> receiver)
diff --git a/content/browser/renderer_host/render_frame_host_manager.cc b/content/browser/renderer_host/render_frame_host_manager.cc index acfea57..a64114d9 100644 --- a/content/browser/renderer_host/render_frame_host_manager.cc +++ b/content/browser/renderer_host/render_frame_host_manager.cc
@@ -1384,7 +1384,10 @@ // ShadowDOM as well so we need to check the `FrameTree::Type` as well. if (frame_tree_node_->IsFencedFrameRoot() && frame_tree_node_->frame_tree()->type() == FrameTree::Type::kFencedFrame) { - GetProxyToOuterDelegate()->GetAssociatedRemoteFrame()->Collapse(collapsed); + if (GetProxyToOuterDelegate()->is_render_frame_proxy_live()) { + GetProxyToOuterDelegate()->GetAssociatedRemoteFrame()->Collapse( + collapsed); + } return; } @@ -1403,7 +1406,8 @@ RenderFrameProxyHost* proxy_to_parent = frame_tree_node_->GetBrowsingContextStateForSubframe() ->GetRenderFrameProxyHost(parent_site_instance->group()); - proxy_to_parent->GetAssociatedRemoteFrame()->Collapse(collapsed); + if (proxy_to_parent->is_render_frame_proxy_live()) + proxy_to_parent->GetAssociatedRemoteFrame()->Collapse(collapsed); } } @@ -1463,8 +1467,10 @@ for (const auto& pair : render_frame_host_->browsing_context_state()->proxy_hosts()) { RenderFrameProxyHost* proxy = pair.second.get(); - proxy->GetAssociatedRemoteFrame()->UpdateUserActivationState( - update_type, notification_type); + if (proxy->is_render_frame_proxy_live()) { + proxy->GetAssociatedRemoteFrame()->UpdateUserActivationState( + update_type, notification_type); + } } // If any frame in an inner delegate is activated, then the FrameTreeNode that @@ -1477,6 +1483,7 @@ RenderFrameProxyHost* outer_delegate_proxy = root->render_manager()->GetProxyToOuterDelegate(); if (outer_delegate_proxy && + outer_delegate_proxy->is_render_frame_proxy_live() && update_type == blink::mojom::UserActivationUpdateType::kNotifyActivation) { outer_delegate_proxy->GetAssociatedRemoteFrame()->UpdateUserActivationState( @@ -3858,7 +3865,7 @@ // If there is no proxy, the cycle may involve nodes in the same process, // or, if this is a subframe, --site-per-process may be off. Either way, // there's nothing more to do. - if (!proxy) + if (!proxy || !proxy->is_render_frame_proxy_live()) continue; auto opener_frame_token = node->render_manager()->GetOpenerFrameToken(
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 9adb148..9bd75c2 100644 --- a/content/browser/renderer_host/render_frame_host_manager_unittest.cc +++ b/content/browser/renderer_host/render_frame_host_manager_unittest.cc
@@ -2291,7 +2291,7 @@ class Remote : public content::FakeRemoteFrame { public: explicit Remote(RenderFrameProxyHost* proxy) { - Init(proxy->GetRemoteAssociatedInterfacesTesting()); + Init(proxy->BindRemoteFrameReceiverForTesting()); } void UpdateOpener( const absl::optional<blink::FrameToken>& frame_token) override { @@ -2305,7 +2305,7 @@ absl::optional<blink::FrameToken> frame_token_; }; - void OnCreated(RenderFrameProxyHost* proxy_host) override { + void OnRemoteFrameBound(RenderFrameProxyHost* proxy_host) override { remote_frames_[proxy_host] = std::make_unique<Remote>(proxy_host); } @@ -2560,7 +2560,7 @@ class Remote : public content::FakeRemoteFrame { public: explicit Remote(RenderFrameProxyHost* proxy) { - Init(proxy->GetRemoteAssociatedInterfacesTesting()); + Init(proxy->BindRemoteFrameReceiverForTesting()); } void SetPageFocus(bool is_focused) override { set_page_focus_ = is_focused; @@ -2571,7 +2571,7 @@ bool set_page_focus_ = false; }; - void OnCreated(RenderFrameProxyHost* proxy_host) override { + void OnRemoteFrameBound(RenderFrameProxyHost* proxy_host) override { remote_frames_[proxy_host] = std::make_unique<Remote>(proxy_host); } @@ -3264,7 +3264,7 @@ class RemoteFrame : public content::FakeRemoteFrame { public: explicit RemoteFrame(RenderFrameProxyHost* render_frame_proxy_host) { - Init(render_frame_proxy_host->GetRemoteAssociatedInterfacesTesting()); + Init(render_frame_proxy_host->BindRemoteFrameReceiverForTesting()); } void EnforceInsecureRequestPolicy( @@ -3279,7 +3279,7 @@ blink::mojom::InsecureRequestPolicy enforce_insecure_request_policy_; }; - void OnCreated(RenderFrameProxyHost* proxy_host) override { + void OnRemoteFrameBound(RenderFrameProxyHost* proxy_host) override { remote_frames_[proxy_host] = std::make_unique<RemoteFrame>(proxy_host); } @@ -3392,7 +3392,7 @@ class Remote : public content::FakeRemoteFrame { public: explicit Remote(RenderFrameProxyHost* proxy) { - Init(proxy->GetRemoteAssociatedInterfacesTesting()); + Init(proxy->BindRemoteFrameReceiverForTesting()); } void DidStartLoading() override { is_loading_ = true; } void DidStopLoading() override { is_loading_ = false; } @@ -3402,7 +3402,7 @@ bool is_loading_ = false; }; - void OnCreated(RenderFrameProxyHost* proxy_host) override { + void OnRemoteFrameBound(RenderFrameProxyHost* proxy_host) override { remote_frames_[proxy_host] = std::make_unique<Remote>(proxy_host); } @@ -3668,10 +3668,10 @@ RenderFrameProxyHost::SetObserverForTesting(nullptr); } - void OnCreated(RenderFrameProxyHost* proxy_host) override { + void OnRemoteFrameBound(RenderFrameProxyHost* proxy_host) override { auto fake_remote_frame = std::make_unique<AdStatusInterceptingRemoteFrame>(); - fake_remote_frame->Init(proxy_host->GetRemoteAssociatedInterfacesTesting()); + fake_remote_frame->Init(proxy_host->BindRemoteFrameReceiverForTesting()); // TODO(yaoxia): when a proxy host is deleted, remove the corresponding map // entry.
diff --git a/content/browser/renderer_host/render_frame_proxy_host.cc b/content/browser/renderer_host/render_frame_proxy_host.cc index 3c7b1d60..d2fe9298 100644 --- a/content/browser/renderer_host/render_frame_proxy_host.cc +++ b/content/browser/renderer_host/render_frame_proxy_host.cc
@@ -165,7 +165,7 @@ // the top-level RenderFrame will delete the RenderFrameProxy. // This can be removed once we don't have a swapped out state on // RenderFrame. See https://crbug.com/357747 - if (!frame_tree_node_->IsMainFrame()) + if (!frame_tree_node_->IsMainFrame() && is_render_frame_proxy_live()) GetAssociatedRemoteFrame()->DetachAndDispose(); } @@ -259,10 +259,11 @@ int view_routing_id = GetRenderViewHost()->GetRoutingID(); GetAgentSchedulingGroup().CreateFrameProxy( - frame_token_, routing_id_, opener_frame_token, view_routing_id, - parent_frame_token, frame_tree_node_->tree_scope_type(), + frame_token_, opener_frame_token, view_routing_id, parent_frame_token, + frame_tree_node_->tree_scope_type(), frame_tree_node_->current_replication_state().Clone(), frame_tree_node_->devtools_frame_token(), + CreateAndBindRemoteFrameInterfaces(), CreateAndBindRemoteMainFrameInterfaces()); SetRenderFrameProxyCreated(true); @@ -292,37 +293,6 @@ return site_instance_group_->agent_scheduling_group(); } -void RenderFrameProxyHost::OnAssociatedInterfaceRequest( - const std::string& interface_name, - mojo::ScopedInterfaceEndpointHandle handle) { - if (interface_name == blink::mojom::RemoteFrameHost::Name_) { - remote_frame_host_receiver_.Bind( - mojo::PendingAssociatedReceiver<blink::mojom::RemoteFrameHost>( - std::move(handle))); - } -} - -blink::AssociatedInterfaceProvider* -RenderFrameProxyHost::GetRemoteAssociatedInterfaces() { - if (!remote_associated_interfaces_) { - mojo::AssociatedRemote<blink::mojom::AssociatedInterfaceProvider> - remote_interfaces; - IPC::ChannelProxy* channel = GetAgentSchedulingGroup().GetChannel(); - if (channel) { - GetAgentSchedulingGroup().GetRemoteRouteProvider()->GetRoute( - GetRoutingID(), remote_interfaces.BindNewEndpointAndPassReceiver()); - } else { - // The channel may not be initialized in some tests environments. In this - // case we set up a dummy interface provider. - std::ignore = remote_interfaces.BindNewEndpointAndPassDedicatedReceiver(); - } - remote_associated_interfaces_ = - std::make_unique<blink::AssociatedInterfaceProvider>( - remote_interfaces.Unbind()); - } - return remote_associated_interfaces_.get(); -} - void RenderFrameProxyHost::SetRenderFrameProxyCreated(bool created) { render_frame_proxy_created_ = created; @@ -334,8 +304,7 @@ const mojo::AssociatedRemote<blink::mojom::RemoteFrame>& RenderFrameProxyHost::GetAssociatedRemoteFrame() { - if (!remote_frame_) - GetRemoteAssociatedInterfaces()->GetInterface(&remote_frame_); + DCHECK(remote_frame_.is_bound()); return remote_frame_; } @@ -373,6 +342,8 @@ frame_tree_node_->current_frame_host()->browsing_context_state()); } + if (!is_render_frame_proxy_live()) + return; auto opener_frame_token = frame_tree_node_->render_manager()->GetOpenerFrameToken( site_instance_group()); @@ -380,12 +351,16 @@ } void RenderFrameProxyHost::SetFocusedFrame() { + if (!is_render_frame_proxy_live()) + return; GetAssociatedRemoteFrame()->Focus(); } void RenderFrameProxyHost::ScrollRectToVisible( const gfx::RectF& rect_to_scroll, blink::mojom::ScrollIntoViewParamsPtr params) { + if (!is_render_frame_proxy_live()) + return; GetAssociatedRemoteFrame()->ScrollRectToVisible(rect_to_scroll, std::move(params)); } @@ -420,19 +395,27 @@ void RenderFrameProxyHost::EnableAutoResize(const gfx::Size& min_size, const gfx::Size& max_size) { + if (!is_render_frame_proxy_live()) + return; GetAssociatedRemoteFrame()->EnableAutoResize(min_size, max_size); } void RenderFrameProxyHost::DisableAutoResize() { + if (!is_render_frame_proxy_live()) + return; GetAssociatedRemoteFrame()->DisableAutoResize(); } void RenderFrameProxyHost::DidUpdateVisualProperties( const cc::RenderFrameMetadata& metadata) { + if (!is_render_frame_proxy_live()) + return; GetAssociatedRemoteFrame()->DidUpdateVisualProperties(metadata); } void RenderFrameProxyHost::ChildProcessGone() { + if (!is_render_frame_proxy_live()) + return; GetAssociatedRemoteFrame()->ChildProcessGone(); } @@ -756,9 +739,10 @@ return cross_process_frame_connector_->IsInert(); } -blink::AssociatedInterfaceProvider* -RenderFrameProxyHost::GetRemoteAssociatedInterfacesTesting() { - return GetRemoteAssociatedInterfaces(); +mojo::PendingAssociatedReceiver<blink::mojom::RemoteFrame> +RenderFrameProxyHost::BindRemoteFrameReceiverForTesting() { + remote_frame_.reset(); + return remote_frame_.BindNewEndpointAndPassDedicatedReceiver(); } mojo::PendingAssociatedReceiver<blink::mojom::RemoteMainFrame> @@ -767,6 +751,15 @@ return remote_main_frame_.BindNewEndpointAndPassDedicatedReceiver(); } +mojom::RemoteFrameInterfacesFromBrowserPtr +RenderFrameProxyHost::CreateAndBindRemoteFrameInterfaces() { + auto params = mojom::RemoteFrameInterfacesFromBrowser::New(); + BindRemoteFrameInterfaces( + params->frame_receiver.InitWithNewEndpointAndPassRemote(), + params->frame_host.InitWithNewEndpointAndPassReceiver()); + return params; +} + mojom::RemoteMainFrameInterfacesPtr RenderFrameProxyHost::CreateAndBindRemoteMainFrameInterfaces() { auto params = mojom::RemoteMainFrameInterfaces::New(); @@ -776,6 +769,20 @@ return params; } +void RenderFrameProxyHost::BindRemoteFrameInterfaces( + mojo::PendingAssociatedRemote<blink::mojom::RemoteFrame> remote_frame, + mojo::PendingAssociatedReceiver<blink::mojom::RemoteFrameHost> + remote_frame_host_receiver) { + DCHECK(!remote_frame_.is_bound()); + DCHECK(!remote_frame_host_receiver_.is_bound()); + + remote_frame_.Bind(std::move(remote_frame)); + remote_frame_host_receiver_.Bind(std::move(remote_frame_host_receiver)); + + if (g_observer_for_testing) + g_observer_for_testing->OnRemoteFrameBound(this); +} + void RenderFrameProxyHost::BindRemoteMainFrameInterfaces( mojo::PendingAssociatedRemote<blink::mojom::RemoteMainFrame> remote_main_frame,
diff --git a/content/browser/renderer_host/render_frame_proxy_host.h b/content/browser/renderer_host/render_frame_proxy_host.h index 81ef06d..17ee67e 100644 --- a/content/browser/renderer_host/render_frame_proxy_host.h +++ b/content/browser/renderer_host/render_frame_proxy_host.h
@@ -93,8 +93,9 @@ virtual void OnCreated(RenderFrameProxyHost* host) {} // Called when a RenderFrameProxyHost is deleted. virtual void OnDeleted(RenderFrameProxyHost* host) {} - // Called when RemoteMainFrame mojo channels are bound to a + // Called when Remote/RemoteMainFrame mojo channels are bound to a // RenderFrameProxyHost. + virtual void OnRemoteFrameBound(RenderFrameProxyHost* host) {} virtual void OnRemoteMainFrameBound(RenderFrameProxyHost* host) {} }; @@ -249,20 +250,26 @@ void DidUpdateVisualProperties(const cc::RenderFrameMetadata& metadata); void ChildProcessGone(); - blink::AssociatedInterfaceProvider* GetRemoteAssociatedInterfacesTesting(); bool IsInertForTesting(); + mojo::PendingAssociatedReceiver<blink::mojom::RemoteFrame> + BindRemoteFrameReceiverForTesting(); mojo::PendingAssociatedReceiver<blink::mojom::RemoteMainFrame> BindRemoteMainFrameReceiverForTesting(); const blink::RemoteFrameToken& GetFrameToken() const { return frame_token_; } - // Bind mojo endpoints of the RemoteMainFrame in blink and pass unbound + // Bind mojo endpoints of the Remote/RemoteMainFrame in blink and pass unbound // corresponding endpoints. The corresponding endpoints should be transferred // and bound in blink. + mojom::RemoteFrameInterfacesFromBrowserPtr + CreateAndBindRemoteFrameInterfaces(); mojom::RemoteMainFrameInterfacesPtr CreateAndBindRemoteMainFrameInterfaces(); - // Bind mojo endpoints of the RemoteMainFrame in blink. + // Bind mojo endpoints of the Remote/RemoteMainFrame in blink. + void BindRemoteFrameInterfaces( + mojo::PendingAssociatedRemote<blink::mojom::RemoteFrame>, + mojo::PendingAssociatedReceiver<blink::mojom::RemoteFrameHost>); void BindRemoteMainFrameInterfaces( mojo::PendingAssociatedRemote<blink::mojom::RemoteMainFrame> remote_main_frame, @@ -292,13 +299,6 @@ // with. AgentSchedulingGroupHost& GetAgentSchedulingGroup(); - // IPC::Listener - void OnAssociatedInterfaceRequest( - const std::string& interface_name, - mojo::ScopedInterfaceEndpointHandle handle) override; - - blink::AssociatedInterfaceProvider* GetRemoteAssociatedInterfaces(); - // Needed for tests to be able to swap the implementation and intercept calls. mojo::AssociatedReceiver<blink::mojom::RemoteFrameHost>& frame_host_receiver_for_testing() {
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc index 1f6d9be..261e1dd 100644 --- a/content/browser/renderer_host/render_view_host_impl.cc +++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -486,7 +486,8 @@ } else { params->main_frame = mojom::CreateMainFrameUnion::NewRemoteParams( mojom::CreateRemoteMainFrameParams::New( - main_rfph->GetFrameToken(), proxy_route_id, + main_rfph->GetFrameToken(), + main_rfph->CreateAndBindRemoteFrameInterfaces(), main_rfph->CreateAndBindRemoteMainFrameInterfaces())); }
diff --git a/content/browser/resources/gpu/BUILD.gn b/content/browser/resources/gpu/BUILD.gn index 9a4a963..0e784cc 100644 --- a/content/browser/resources/gpu/BUILD.gn +++ b/content/browser/resources/gpu/BUILD.gn
@@ -2,12 +2,14 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//tools/polymer/html_to_js.gni") +import("//tools/polymer/html_to_wrapper.gni") -html_to_js("web_components") { - js_files = [ - "info_view.js", - "info_view_table.js", - "info_view_table_row.js", +html_to_wrapper("html_wrapper_files") { + in_files = [ + "info_view.html", + "info_view_table.html", + "info_view_table_row.html", ] + template = "native" + use_js = true }
diff --git a/content/browser/resources/gpu/info_view.js b/content/browser/resources/gpu/info_view.js index 54841004..0f434c4 100644 --- a/content/browser/resources/gpu/info_view.js +++ b/content/browser/resources/gpu/info_view.js
@@ -5,8 +5,8 @@ import './info_view_table.js'; import {CustomElement} from 'chrome://resources/js/custom_element.js'; -import {getTrustedHTML} from 'chrome://resources/js/static_types.js'; +import {getTemplate} from './info_view.html.js'; import {VulkanInfo} from './vulkan_info.js'; /** @@ -16,7 +16,7 @@ */ export class InfoViewElement extends CustomElement { static get template() { - return getTrustedHTML`{__html_template__}`; + return getTemplate(); } addBrowserBridgeListeners(browserBridge) {
diff --git a/content/browser/resources/gpu/info_view_table.js b/content/browser/resources/gpu/info_view_table.js index 07e5f69..9e04cb8 100644 --- a/content/browser/resources/gpu/info_view_table.js +++ b/content/browser/resources/gpu/info_view_table.js
@@ -5,11 +5,12 @@ import './info_view_table_row.js'; import {CustomElement} from 'chrome://resources/js/custom_element.js'; -import {getTrustedHTML} from 'chrome://resources/js/static_types.js'; + +import {getTemplate} from './info_view_table.html.js'; export class InfoViewTableElement extends CustomElement { static get template() { - return getTrustedHTML`{__html_template__}`; + return getTemplate(); } setData(dataArray) {
diff --git a/content/browser/resources/gpu/info_view_table_row.js b/content/browser/resources/gpu/info_view_table_row.js index e569662d..707ab41 100644 --- a/content/browser/resources/gpu/info_view_table_row.js +++ b/content/browser/resources/gpu/info_view_table_row.js
@@ -3,11 +3,12 @@ // found in the LICENSE file. import {CustomElement} from 'chrome://resources/js/custom_element.js'; -import {getTrustedHTML} from 'chrome://resources/js/static_types.js'; + +import {getTemplate} from './info_view_table_row.html.js'; export class InfoViewTableRowElement extends CustomElement { static get template() { - return getTrustedHTML`{__html_template__}`; + return getTemplate(); } constructor() {
diff --git a/content/browser/security_exploit_browsertest.cc b/content/browser/security_exploit_browsertest.cc index 3056011e..bfb2bf2 100644 --- a/content/browser/security_exploit_browsertest.cc +++ b/content/browser/security_exploit_browsertest.cc
@@ -1916,12 +1916,22 @@ mojo::PendingAssociatedReceiver<blink::mojom::FencedFrameOwnerHost> receiver; receiver = remote.InitWithNewEndpointAndPassReceiver(); + auto remote_frame_interfaces = + mojom::RemoteFrameInterfacesFromRenderer::New(); + remote_frame_interfaces->frame_host_receiver = + mojo::AssociatedRemote<blink::mojom::RemoteFrameHost>() + .BindNewEndpointAndPassDedicatedReceiver(); + mojo::AssociatedRemote<blink::mojom::RemoteFrame> frame; + std::ignore = frame.BindNewEndpointAndPassDedicatedReceiver(); + remote_frame_interfaces->frame = frame.Unbind(); + RenderProcessHostBadIpcMessageWaiter kill_waiter( compromised_rfh->GetProcess()); static_cast<mojom::FrameHost*>(compromised_rfh) ->CreateFencedFrame( std::move(receiver), blink::mojom::FencedFrameMode::kDefault, - base::BindOnce([](int, blink::mojom::FrameReplicationStatePtr, + std::move(remote_frame_interfaces), + base::BindOnce([](blink::mojom::FrameReplicationStatePtr, const blink::RemoteFrameToken&, const base::UnguessableToken&) {})); EXPECT_EQ(bad_message::RFH_FENCED_FRAME_MOJO_WHEN_DISABLED, @@ -1992,13 +2002,23 @@ mojo::PendingAssociatedReceiver<blink::mojom::FencedFrameOwnerHost> pending_receiver = remote.BindNewEndpointAndPassReceiver(); + auto remote_frame_interfaces = + mojom::RemoteFrameInterfacesFromRenderer::New(); + remote_frame_interfaces->frame_host_receiver = + mojo::AssociatedRemote<blink::mojom::RemoteFrameHost>() + .BindNewEndpointAndPassDedicatedReceiver(); + mojo::AssociatedRemote<blink::mojom::RemoteFrame> frame; + std::ignore = frame.BindNewEndpointAndPassDedicatedReceiver(); + remote_frame_interfaces->frame = frame.Unbind(); + RenderProcessHostBadIpcMessageWaiter kill_waiter( compromised_rfh->GetProcess()); static_cast<mojom::FrameHost*>(compromised_rfh) ->CreateFencedFrame(std::move(pending_receiver), blink::mojom::FencedFrameMode::kDefault, + std::move(remote_frame_interfaces), base::BindLambdaForTesting( - [](int, blink::mojom::FrameReplicationStatePtr, + [](blink::mojom::FrameReplicationStatePtr, const blink::RemoteFrameToken&, const base::UnguessableToken&) {})); EXPECT_EQ(compromised_rfh->GetFencedFrames().size(), 1u);
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc index 237e270..5ecaafa 100644 --- a/content/browser/site_per_process_browsertest.cc +++ b/content/browser/site_per_process_browsertest.cc
@@ -5191,7 +5191,6 @@ root->render_manager()->current_frame_host()->GetProcess(); AgentSchedulingGroupHost* agent_scheduling_group_a = AgentSchedulingGroupHost::GetOrCreate(*site_instance_group_a, *process_a); - int new_routing_id = process_a->GetNextRoutingID(); int view_routing_id = root->frame_tree() ->GetRenderViewHost(site_instance_group_a) ->GetRoutingID(); @@ -5203,6 +5202,15 @@ EXPECT_TRUE(ExecJs( root, "document.body.removeChild(document.querySelector('iframe'));")); + auto remote_frame_interfaces = mojom::RemoteFrameInterfacesFromBrowser::New(); + mojo::AssociatedRemote<blink::mojom::RemoteFrame> frame; + remote_frame_interfaces->frame_receiver = + frame.BindNewEndpointAndPassReceiver(); + + mojo::AssociatedRemote<blink::mojom::RemoteFrameHost> frame_host; + std::ignore = frame_host.BindNewEndpointAndPassReceiver(); + remote_frame_interfaces->frame_host = frame_host.Unbind(); + auto remote_main_frame_interfaces = mojom::RemoteMainFrameInterfaces::New(); mojo::AssociatedRemote<blink::mojom::RemoteMainFrame> main_frame; remote_main_frame_interfaces->main_frame = @@ -5216,10 +5224,10 @@ // used to crash, as `parent_frame_token` refers to a proxy that doesn't exist // anymore. agent_scheduling_group_a->CreateFrameProxy( - blink::RemoteFrameToken(), new_routing_id, absl::nullopt, view_routing_id, + blink::RemoteFrameToken(), absl::nullopt, view_routing_id, parent_frame_token, blink::mojom::TreeScopeType::kDocument, blink::mojom::FrameReplicationState::New(), - base::UnguessableToken::Create(), + base::UnguessableToken::Create(), std::move(remote_frame_interfaces), std::move(remote_main_frame_interfaces)); // Ensure the subframe is detached in the browser process.
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index 5a4ab204..860e52d 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -2418,6 +2418,9 @@ void WebContentsImpl::AttachInnerWebContents( std::unique_ptr<WebContents> inner_web_contents, RenderFrameHost* render_frame_host, + mojo::PendingAssociatedRemote<blink::mojom::RemoteFrame> remote_frame, + mojo::PendingAssociatedReceiver<blink::mojom::RemoteFrameHost> + remote_frame_host_receiver, bool is_full_page) { OPTIONAL_TRACE_EVENT2("content", "WebContentsImpl::AttachInnerWebContents", "inner_web_contents", @@ -2489,6 +2492,10 @@ inner_main_frame->browsing_context_state()->CreateOuterDelegateProxy( render_frame_host_impl->GetSiteInstance(), inner_main_frame->frame_tree_node()); + if (remote_frame && remote_frame_host_receiver) { + proxy->BindRemoteFrameInterfaces(std::move(remote_frame), + std::move(remote_frame_host_receiver)); + } // When attaching a GuestView as an inner WebContents, there should already be // a live RenderFrame, which has to be swapped. When attaching a portal, there
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h index 9c90730d..a636e3c 100644 --- a/content/browser/web_contents/web_contents_impl.h +++ b/content/browser/web_contents/web_contents_impl.h
@@ -414,9 +414,13 @@ Visibility GetVisibility() override; bool NeedToFireBeforeUnloadOrUnloadEvents() override; void DispatchBeforeUnload(bool auto_cancel) override; - void AttachInnerWebContents(std::unique_ptr<WebContents> inner_web_contents, - RenderFrameHost* render_frame_host, - bool is_full_page) override; + void AttachInnerWebContents( + std::unique_ptr<WebContents> inner_web_contents, + RenderFrameHost* render_frame_host, + mojo::PendingAssociatedRemote<blink::mojom::RemoteFrame> remote_frame, + mojo::PendingAssociatedReceiver<blink::mojom::RemoteFrameHost> + remote_frame_host_receiver, + bool is_full_page) override; bool IsInnerWebContentsForGuest() override; bool IsPortal() override; WebContentsImpl* GetPortalHostWebContents() override;
diff --git a/content/browser/web_contents/web_contents_impl_browsertest.cc b/content/browser/web_contents/web_contents_impl_browsertest.cc index 96b2aae..860da30f 100644 --- a/content/browser/web_contents/web_contents_impl_browsertest.cc +++ b/content/browser/web_contents/web_contents_impl_browsertest.cc
@@ -4099,9 +4099,11 @@ RenderFrameHost* child_contents_subframe = ChildFrameAt(child_contents->GetPrimaryMainFrame(), 0); ASSERT_TRUE(child_contents_subframe); - child_contents->AttachInnerWebContents(std::move(grandchild_contents_ptr), - child_contents_subframe, - false /* is_full_page */); + child_contents->AttachInnerWebContents( + std::move(grandchild_contents_ptr), child_contents_subframe, + /*remote_frame=*/mojo::NullAssociatedRemote(), + /*remote_frame_host_receiver=*/mojo::NullAssociatedReceiver(), + /*is_full_page=*/false); // At this point the child hasn't been attached to the root. { @@ -4117,9 +4119,11 @@ RenderFrameHost* root_contents_subframe = ChildFrameAt(root_web_contents->GetPrimaryMainFrame(), 0); ASSERT_TRUE(root_contents_subframe); - root_web_contents->AttachInnerWebContents(std::move(child_contents_ptr), - root_contents_subframe, - false /* is_full_page */); + root_web_contents->AttachInnerWebContents( + std::move(child_contents_ptr), root_contents_subframe, + /*remote_frame=*/mojo::NullAssociatedRemote(), + /*remote_frame_host_receiver=*/mojo::NullAssociatedReceiver(), + /*is_full_page=*/false); // Verify views registered for both child and grandchild. {
diff --git a/content/browser/web_package/mock_web_bundle_reader_factory.cc b/content/browser/web_package/mock_web_bundle_reader_factory.cc index 8c7efd6..a76ac0f 100644 --- a/content/browser/web_package/mock_web_bundle_reader_factory.cc +++ b/content/browser/web_package/mock_web_bundle_reader_factory.cc
@@ -6,164 +6,22 @@ #include "base/bind.h" #include "base/callback.h" -#include "base/files/file.h" #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/files/scoped_temp_dir.h" -#include "base/notreached.h" -#include "base/run_loop.h" -#include "base/test/bind.h" #include "base/test/test_future.h" -#include "components/web_package/mojom/web_bundle_parser.mojom.h" +#include "components/web_package/test_support/mock_web_bundle_parser_factory.h" #include "content/browser/web_package/web_bundle_reader.h" #include "content/browser/web_package/web_bundle_source.h" #include "mojo/public/cpp/bindings/pending_receiver.h" -#include "mojo/public/cpp/bindings/receiver.h" -#include "mojo/public/cpp/bindings/remote.h" -#include "mojo/public/cpp/bindings/self_owned_receiver.h" #include "net/base/filename_util.h" #include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h" #include "testing/gtest/include/gtest/gtest.h" -#include "third_party/abseil-cpp/absl/types/optional.h" namespace content { namespace { -class MockParser final : public web_package::mojom::WebBundleParser { - public: - explicit MockParser( - mojo::PendingReceiver<web_package::mojom::WebBundleParser> receiver) - : receiver_(this, std::move(receiver)) {} - - MockParser(const MockParser&) = delete; - MockParser& operator=(const MockParser&) = delete; - - ~MockParser() override = default; - - void RunMetadataCallback(web_package::mojom::BundleMetadataPtr metadata) { - std::move(metadata_callback_).Run(std::move(metadata), nullptr); - } - void RunResponseCallback(web_package::mojom::BundleResponsePtr response) { - std::move(response_callback_).Run(std::move(response), nullptr); - } - - void WaitUntilParseMetadataCalled(base::OnceClosure closure) { - if (metadata_callback_.is_null()) - wait_parse_metadata_callback_ = std::move(closure); - else - std::move(closure).Run(); - } - - void WaitUntilParseResponseCalled( - base::OnceCallback<void(web_package::mojom::BundleResponseLocationPtr)> - callback) { - if (response_callback_.is_null()) - wait_parse_response_callback_ = std::move(callback); - else - std::move(callback).Run(std::move(parse_response_args_)); - } - - private: - // web_package::mojom::WebBundleParser implementation. - void ParseIntegrityBlock(ParseIntegrityBlockCallback callback) override { - NOTREACHED(); - } - void ParseMetadata(int64_t offset, ParseMetadataCallback callback) override { - metadata_callback_ = std::move(callback); - if (!wait_parse_metadata_callback_.is_null()) - std::move(wait_parse_metadata_callback_).Run(); - } - void ParseResponse(uint64_t response_offset, - uint64_t response_length, - ParseResponseCallback callback) override { - response_callback_ = std::move(callback); - parse_response_args_ = web_package::mojom::BundleResponseLocation::New( - response_offset, response_length); - if (!wait_parse_response_callback_.is_null()) { - std::move(wait_parse_response_callback_) - .Run(std::move(parse_response_args_)); - } - } - - mojo::Receiver<web_package::mojom::WebBundleParser> receiver_; - - ParseMetadataCallback metadata_callback_; - ParseResponseCallback response_callback_; - web_package::mojom::BundleResponseLocationPtr parse_response_args_; - base::OnceClosure wait_parse_metadata_callback_; - base::OnceCallback<void(web_package::mojom::BundleResponseLocationPtr)> - wait_parse_response_callback_; -}; - -class MockParserFactory final - : public web_package::mojom::WebBundleParserFactory { - public: - MockParserFactory() {} - - MockParserFactory(const MockParserFactory&) = delete; - MockParserFactory& operator=(const MockParserFactory&) = delete; - - ~MockParserFactory() override = default; - - void AddReceiver( - mojo::PendingReceiver<web_package::mojom::WebBundleParserFactory> - receiver) { - receivers_.Add(this, std::move(receiver)); - } - - void WaitUntilParseMetadataCalled(base::OnceClosure closure) { - if (parser_) - parser_->WaitUntilParseMetadataCalled(std::move(closure)); - else - wait_parse_metadata_callback_ = std::move(closure); - } - - void RunMetadataCallback(web_package::mojom::BundleMetadataPtr metadata) { - base::RunLoop run_loop; - WaitUntilParseMetadataCalled(run_loop.QuitClosure()); - run_loop.Run(); - - ASSERT_TRUE(parser_); - parser_->RunMetadataCallback(std::move(metadata)); - } - - void RunResponseCallback( - web_package::mojom::BundleResponseLocationPtr expected_parse_args, - web_package::mojom::BundleResponsePtr response) { - ASSERT_TRUE(parser_); - base::test::TestFuture<web_package::mojom::BundleResponseLocationPtr> - future; - parser_->WaitUntilParseResponseCalled(future.GetCallback()); - auto parse_args = future.Take(); - EXPECT_EQ(expected_parse_args->offset, parse_args->offset); - EXPECT_EQ(expected_parse_args->length, parse_args->length); - parser_->RunResponseCallback(std::move(response)); - } - - private: - // web_package::mojom::WebBundleParserFactory implementation. - void GetParserForFile( - mojo::PendingReceiver<web_package::mojom::WebBundleParser> receiver, - base::File file) override { - parser_ = std::make_unique<MockParser>(std::move(receiver)); - if (!wait_parse_metadata_callback_.is_null()) { - parser_->WaitUntilParseMetadataCalled( - std::move(wait_parse_metadata_callback_)); - } - } - void GetParserForDataSource( - mojo::PendingReceiver<web_package::mojom::WebBundleParser> receiver, - mojo::PendingRemote<web_package::mojom::BundleDataSource> data_source) - override { - NOTREACHED(); - } - - std::unique_ptr<MockParser> parser_; - mojo::ReceiverSet<web_package::mojom::WebBundleParserFactory> receivers_; - base::OnceClosure wait_parse_metadata_callback_; -}; - class MockWebBundleReaderFactoryImpl final : public MockWebBundleReaderFactory { public: MockWebBundleReaderFactoryImpl() : MockWebBundleReaderFactory() {} @@ -193,10 +51,11 @@ WebBundleSource::MaybeCreateFromTrustedFileUrl( net::FilePathToFileURL(temp_file_path_))); - factory_ = std::make_unique<MockParserFactory>(); + factory_ = std::make_unique<web_package::MockWebBundleParserFactory>(); in_process_data_decoder_.service() .SetWebBundleParserFactoryBinderForTesting(base::BindRepeating( - &MockParserFactory::AddReceiver, base::Unretained(factory_.get()))); + &web_package::MockWebBundleParserFactory::AddReceiver, + base::Unretained(factory_.get()))); return reader; } @@ -210,7 +69,8 @@ base::test::TestFuture<web_package::mojom::BundleMetadataParseErrorPtr> future; reader->ReadMetadata(future.GetCallback()); - factory_->RunMetadataCallback(std::move(metadata)); + factory_->RunMetadataCallback(/*expected_metadata_offset=*/-1, + std::move(metadata)); std::move(callback).Run(future.Take()); } @@ -247,7 +107,7 @@ std::string test_file_data_; base::ScopedTempDir temp_dir_; base::FilePath temp_file_path_; - std::unique_ptr<MockParserFactory> factory_; + std::unique_ptr<web_package::MockWebBundleParserFactory> factory_; }; } // namespace
diff --git a/content/common/agent_scheduling_group.mojom b/content/common/agent_scheduling_group.mojom index 341fcf4c..d1cae10 100644 --- a/content/common/agent_scheduling_group.mojom +++ b/content/common/agent_scheduling_group.mojom
@@ -81,7 +81,6 @@ // // `token`: The frame token. Used to map between RemoteFrame and // RenderFrameProxyHost. - // `routing_id`: The legacy IPC routing ID. // `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. @@ -101,13 +100,14 @@ // 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. - CreateFrameProxy(blink.mojom.RemoteFrameToken token, int32 routing_id, + CreateFrameProxy(blink.mojom.RemoteFrameToken token, blink.mojom.FrameToken? opener_frame_token, int32 view_routing_id, blink.mojom.RemoteFrameToken? parent_frame_token, blink.mojom.TreeScopeType tree_scope_type, blink.mojom.FrameReplicationState replication_state, mojo_base.mojom.UnguessableToken devtools_frame_token, + RemoteFrameInterfacesFromBrowser remote_frame_interfaces, RemoteMainFrameInterfaces remote_main_frame_interfaces); // Tells the renderer process to create a thread that exclusively hosts the
diff --git a/content/common/frame.mojom b/content/common/frame.mojom index ac55759..cc49288 100644 --- a/content/common/frame.mojom +++ b/content/common/frame.mojom
@@ -201,11 +201,8 @@ struct CreateRemoteMainFrameParams { blink.mojom.RemoteFrameToken token; - // The ID of the proxy object for the main frame in this view. Must not be - // kRoutingIdNone. - int32 routing_id = IPC.mojom.kRoutingIdNone; - - // The communication channels for the RemoteMainFrame in this view. + // The communication channels for the Remote/RemoteMainFrame in this view. + RemoteFrameInterfacesFromBrowser frame_interfaces; RemoteMainFrameInterfaces main_frame_interfaces; }; @@ -355,6 +352,17 @@ }; // Struct for communication channels of the RemoteFrame in blink. +struct RemoteFrameInterfacesFromBrowser { + pending_associated_receiver<blink.mojom.RemoteFrame> frame_receiver; + pending_associated_remote<blink.mojom.RemoteFrameHost> frame_host; +}; + +struct RemoteFrameInterfacesFromRenderer { + pending_associated_remote<blink.mojom.RemoteFrame> frame; + pending_associated_receiver<blink.mojom.RemoteFrameHost> frame_host_receiver; +}; + +// 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; @@ -401,16 +409,16 @@ // that any postMessage() calls executed by JS during unload are dispatched, // since postMessage dispatch is always scheduled asynchronously. // - // `new_remote_frame_routing_id`, `new_remote_frame_replication_state`, - // `new_remote_frame_token`, and `new_remote_main_frame_interfaces` are used - // to construct the new RenderFrameProxy. `is_loading` mirrors the loading - // state of the FrameTreeNode's current RenderFrameHost and determines whether + // `new_remote_frame_replication_state`, `new_remote_frame_token`, + // and `new_remote_main_frame_interfaces` are used to construct the new + // RenderFrameProxy. `is_loading` mirrors the loading state of the + // FrameTreeNode's current RenderFrameHost and determines whether // the newly-constructed RenderFrameProxy is marked as loading or not. Unload( - int32 new_remote_frame_routing_id, bool is_loading, blink.mojom.FrameReplicationState new_remote_frame_replication_state, blink.mojom.RemoteFrameToken new_remote_frame_token, + RemoteFrameInterfacesFromBrowser new_remote_frame_interfaces, RemoteMainFrameInterfaces new_remote_main_frame_interfaces); // Delete the frame. This is only called for child frames that the browser @@ -445,19 +453,19 @@ // special handling to ensure messages queued by Window.postMessage() are // forwarded. // - // `new_remote_frame_routing_id`, `new_remote_frame_replication_state`, - // `new_remote_frame_token`, and `new_remote_main_frame_interfaces` are used - // to construct the new RenderFrameProxy. `is_loading` mirrors the loading - // state of the FrameTreeNode's current RenderFrameHost and determines whether + // `new_remote_frame_replication_state`, `new_remote_frame_token`, and + // `new_remote_main_frame_interfaces` are used to construct the new + // RenderFrameProxy. `is_loading` mirrors the loading state of the + // FrameTreeNode's current RenderFrameHost and determines whether // the newly-constructed RenderFrameProxy is marked as loading or not. // // TODO(dcheng): It's unclear if `is_loading` is necessary; presently, it // always seems to be true when this IPC is called. UndoCommitNavigation( - int32 new_remote_frame_routing_id, bool is_loading, blink.mojom.FrameReplicationState new_remote_frame_replication_state, blink.mojom.RemoteFrameToken new_remote_frame_token, + RemoteFrameInterfacesFromBrowser new_remote_frame_interfaces, RemoteMainFrameInterfaces new_remote_main_frame_interfaces); // Causes all new subresource requests to be blocked (not being started) until @@ -654,7 +662,6 @@ // Sent by the renderer process to request the creation of a new portal. // |portal| is the pipe to be used for the Portal object, |client| is the pipe // used to communicate back with the caller. Returns: - // |proxy_routing_id| - the routing id of the RenderFrameProxy // |initial_replicated_state| - the replicated state associated with that // RenderFrameProxy // |portal_token| - the unique identifier for the portal @@ -663,24 +670,24 @@ // frame tree [Sync] CreatePortal( pending_associated_receiver<blink.mojom.Portal> portal, - pending_associated_remote<blink.mojom.PortalClient> client) - => (int32 proxy_routing_id, - blink.mojom.FrameReplicationState initial_replicated_state, + pending_associated_remote<blink.mojom.PortalClient> client, + RemoteFrameInterfacesFromRenderer remote_frame_interfaces) + => (blink.mojom.FrameReplicationState initial_replicated_state, blink.mojom.PortalToken portal_token, blink.mojom.RemoteFrameToken frame_token, mojo_base.mojom.UnguessableToken devtools_frame_token); // Requests that this frame adopts the portal identified by |portal_token|. // Returns: - // |proxy_routing_id| - the routing id of the portal's RenderFrameProxy // |replicated_state| - the replicated state associated with that // RenderFrameProxy // |frame_token| - the unique identifier of the RenderFrameProxy // |devtools_frame_token| - the unique identifier of the frame node in the // frame tree - [Sync] AdoptPortal(blink.mojom.PortalToken portal_token) - => (int32 proxy_routing_id, - blink.mojom.FrameReplicationState replicated_state, + [Sync] AdoptPortal( + blink.mojom.PortalToken portal_token, + RemoteFrameInterfacesFromRenderer remote_frame_interfaces) + => (blink.mojom.FrameReplicationState replicated_state, blink.mojom.RemoteFrameToken frame_token, mojo_base.mojom.UnguessableToken devtools_frame_token); @@ -689,8 +696,6 @@ // frame tree that will host the contents of the <fencedframe> element. // `fenced_frame` - the receiver that the browser will bind to receive // messages from the renderer. - // `proxy_routing_id` - the routing ID assigned to the RenderFrameProxy - // placeholder in the owner process. // `initial_replication_state` - the replicated state associated with the // above RenderFrameProxy. This state is // default-constructed, and thus has an opaque @@ -705,9 +710,9 @@ [Sync] CreateFencedFrame( pending_associated_receiver<blink.mojom.FencedFrameOwnerHost> fenced_frame, - blink.mojom.FencedFrameMode mode) - => (int32 proxy_routing_id, - blink.mojom.FrameReplicationState initial_replication_state, + blink.mojom.FencedFrameMode mode, + RemoteFrameInterfacesFromRenderer remote_frame_interfaces) + => (blink.mojom.FrameReplicationState initial_replication_state, blink.mojom.RemoteFrameToken frame_token, mojo_base.mojom.UnguessableToken devtools_frame_token);
diff --git a/content/common/url_schemes.cc b/content/common/url_schemes.cc index 05423dde..41d374e 100644 --- a/content/common/url_schemes.cc +++ b/content/common/url_schemes.cc
@@ -63,7 +63,7 @@ url::AddStandardScheme(kChromeUIUntrustedScheme, url::SCHEME_WITH_HOST); url::AddStandardScheme(kGuestScheme, url::SCHEME_WITH_HOST); url::AddStandardScheme(kChromeErrorScheme, url::SCHEME_WITH_HOST); - + url::AddStandardScheme(kIsolatedAppScheme, url::SCHEME_WITH_HOST); for (auto& scheme : schemes.standard_schemes) url::AddStandardScheme(scheme.c_str(), url::SCHEME_WITH_HOST); @@ -74,6 +74,7 @@ schemes.secure_schemes.push_back(kChromeUIScheme); schemes.secure_schemes.push_back(kChromeUIUntrustedScheme); schemes.secure_schemes.push_back(kChromeErrorScheme); + schemes.secure_schemes.push_back(kIsolatedAppScheme); for (auto& scheme : schemes.secure_schemes) url::AddSecureScheme(scheme.c_str()); @@ -89,6 +90,7 @@ schemes.cors_enabled_schemes.push_back(kChromeUIScheme); schemes.cors_enabled_schemes.push_back(kChromeUIUntrustedScheme); + schemes.cors_enabled_schemes.push_back(kIsolatedAppScheme); for (auto& scheme : schemes.cors_enabled_schemes) url::AddCorsEnabledScheme(scheme.c_str()); @@ -105,6 +107,7 @@ url::EnableNonStandardSchemesForAndroidWebView(); #endif + schemes.service_worker_schemes.push_back(kIsolatedAppScheme); // This should only be registered if the // kEnableServiceWorkerForChromeUntrusted feature is enabled but checking // it here causes a crash when --no-sandbox is enabled. See crbug.com/1313812 @@ -113,6 +116,8 @@ // enabled. schemes.service_worker_schemes.push_back(kChromeUIUntrustedScheme); + url::AddWebStorageScheme(kIsolatedAppScheme); + // Prevent future modification of the scheme lists. This is to prevent // accidental creation of data races in the program. Add*Scheme aren't // threadsafe so must be called when GURL isn't used on any other thread. This
diff --git a/content/dev_ui_content_resources.grd b/content/dev_ui_content_resources.grd index 6d6ca74..24817e94 100644 --- a/content/dev_ui_content_resources.grd +++ b/content/dev_ui_content_resources.grd
@@ -25,9 +25,12 @@ <include name="IDR_GPU_BROWSER_BRIDGE_JS" file="browser/resources/gpu/browser_bridge.js" type="BINDATA" /> <include name="IDR_GPU_INTERNALS_HTML" file="browser/resources/gpu/gpu_internals.html" type="BINDATA" /> <include name="IDR_GPU_INTERNALS_JS" file="browser/resources/gpu/gpu_internals.js" type="BINDATA" /> - <include name="IDR_GPU_INTERNALS_INFO_VIEW_JS" file="${root_gen_dir}/content/browser/resources/gpu/info_view.js" use_base_dir="false" type="BINDATA" /> - <include name="IDR_GPU_INTERNALS_INFO_VIEW_TABLE_JS" file="${root_gen_dir}/content/browser/resources/gpu/info_view_table.js" use_base_dir="false" type="BINDATA" /> - <include name="IDR_GPU_INTERNALS_INFO_VIEW_TABLE_ROW_JS" file="${root_gen_dir}/content/browser/resources/gpu/info_view_table_row.js" use_base_dir="false" type="BINDATA" /> + <include name="IDR_GPU_INTERNALS_INFO_VIEW_HTML_JS" file="${root_gen_dir}/content/browser/resources/gpu/info_view.html.js" use_base_dir="false" type="BINDATA" /> + <include name="IDR_GPU_INTERNALS_INFO_VIEW_JS" file="browser/resources/gpu/info_view.js" type="BINDATA" /> + <include name="IDR_GPU_INTERNALS_INFO_VIEW_TABLE_HTML_JS" file="${root_gen_dir}/content/browser/resources/gpu/info_view_table.html.js" use_base_dir="false" type="BINDATA" /> + <include name="IDR_GPU_INTERNALS_INFO_VIEW_TABLE_JS" file="browser/resources/gpu/info_view_table.js" type="BINDATA" /> + <include name="IDR_GPU_INTERNALS_INFO_VIEW_TABLE_ROW_HTML_JS" file="${root_gen_dir}/content/browser/resources/gpu/info_view_table_row.html.js" use_base_dir="false" type="BINDATA" /> + <include name="IDR_GPU_INTERNALS_INFO_VIEW_TABLE_ROW_JS" file="browser/resources/gpu/info_view_table_row.js" type="BINDATA" /> <include name="IDR_GPU_VULKAN_INFO_JS" file="browser/resources/gpu/vulkan_info.js" type="BINDATA" /> <include name="IDR_INDEXED_DB_INTERNALS_HTML" file="browser/resources/indexed_db/indexeddb_internals.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" /> <include name="IDR_INDEXED_DB_INTERNALS_JS" file="browser/resources/indexed_db/indexeddb_internals.js" type="BINDATA" />
diff --git a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsObserverProxy.java b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsObserverProxy.java index d89cf6ed..765dfc0 100644 --- a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsObserverProxy.java +++ b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsObserverProxy.java
@@ -7,7 +7,6 @@ import org.chromium.base.ObserverList; import org.chromium.base.ObserverList.RewindableIterator; import org.chromium.base.ThreadUtils; -import org.chromium.base.TraceEvent; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.NativeMethods; @@ -123,119 +122,70 @@ @Override @CalledByNative - // The string passed is safe since it is class and method name. - @SuppressWarnings("NoDynamicStringsInTraceEventCheck") public void didStartNavigation(NavigationHandle navigation) { handleObserverCall(); for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { - WebContentsObserver observer = mObserversIterator.next(); - String s = "WebContentsObserverProxy::didStartNavigation observer:" - + observer.getClass().getName(); - try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { - observer.didStartNavigation(navigation); - } + mObserversIterator.next().didStartNavigation(navigation); } finishObserverCall(); } @Override @CalledByNative - // The string passed is safe since it is class and method name. - @SuppressWarnings("NoDynamicStringsInTraceEventCheck") public void didRedirectNavigation(NavigationHandle navigation) { handleObserverCall(); for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { - WebContentsObserver observer = mObserversIterator.next(); - String s = "WebContentsObserverProxy::didRedirectNavigation observer:" - + observer.getClass().getName(); - try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { - observer.didRedirectNavigation(navigation); - } + mObserversIterator.next().didRedirectNavigation(navigation); } finishObserverCall(); } @Override @CalledByNative - // The string passed is safe since it is class and method name. - @SuppressWarnings("NoDynamicStringsInTraceEventCheck") public void didFinishNavigation(NavigationHandle navigation) { handleObserverCall(); for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { - WebContentsObserver observer = mObserversIterator.next(); - String s = "WebContentsObserverProxy::didFinishNavigation observer:" - + observer.getClass().getName(); - try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { - observer.didFinishNavigation(navigation); - } + mObserversIterator.next().didFinishNavigation(navigation); } finishObserverCall(); } @Override @CalledByNative - // The string passed is safe since it is class and method name. - @SuppressWarnings("NoDynamicStringsInTraceEventCheck") public void didStartLoading(GURL url) { handleObserverCall(); for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { - WebContentsObserver observer = mObserversIterator.next(); - String s = "WebContentsObserverProxy::didStartLoading observer:" - + observer.getClass().getName(); - try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { - observer.didStartLoading(url); - } + mObserversIterator.next().didStartLoading(url); } finishObserverCall(); } @Override @CalledByNative - // The string passed is safe since it is class and method name. - @SuppressWarnings("NoDynamicStringsInTraceEventCheck") public void didStopLoading(GURL url, boolean isKnownValid) { handleObserverCall(); for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { - WebContentsObserver observer = mObserversIterator.next(); - String s = "WebContentsObserverProxy::didStopLoading observer:" - + observer.getClass().getName(); - try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { - observer.didStopLoading(url, isKnownValid); - } + mObserversIterator.next().didStopLoading(url, isKnownValid); } finishObserverCall(); } @Override @CalledByNative - // The string passed is safe since it is class and method name. - @SuppressWarnings("NoDynamicStringsInTraceEventCheck") public void loadProgressChanged(float progress) { handleObserverCall(); for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { - WebContentsObserver observer = mObserversIterator.next(); - String s = "WebContentsObserverProxy::loadProgressChanged observer:" - + observer.getClass().getName(); - try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { - observer.loadProgressChanged(progress); - } + mObserversIterator.next().loadProgressChanged(progress); } finishObserverCall(); } @Override @CalledByNative - // The string passed is safe since it is class and method name. - @SuppressWarnings("NoDynamicStringsInTraceEventCheck") public void didChangeVisibleSecurityState() { handleObserverCall(); for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { - WebContentsObserver observer = mObserversIterator.next(); - String s = "WebContentsObserverProxy::didChangeVisibleSecurityState observer:" - + observer.getClass().getName(); - try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { - observer.didChangeVisibleSecurityState(); - } + mObserversIterator.next().didChangeVisibleSecurityState(); } finishObserverCall(); } @@ -284,17 +234,10 @@ @Override @CalledByNative - // The string passed is safe since it is class and method name. - @SuppressWarnings("NoDynamicStringsInTraceEventCheck") public void titleWasSet(String title) { handleObserverCall(); for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { - WebContentsObserver observer = mObserversIterator.next(); - String s = "WebContentsObserverProxy::titleWasSet observer:" - + observer.getClass().getName(); - try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { - observer.titleWasSet(title); - } + mObserversIterator.next().titleWasSet(title); } finishObserverCall(); } @@ -318,19 +261,12 @@ } @Override - // The string passed is safe since it is class and method name. - @SuppressWarnings("NoDynamicStringsInTraceEventCheck") public void didFinishLoad(GlobalRenderFrameHostId rfhId, GURL url, boolean isKnownValid, boolean isInPrimaryMainFrame, @LifecycleState int rfhLifecycleState) { handleObserverCall(); for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { - WebContentsObserver observer = mObserversIterator.next(); - String s = "WebContentsObserverProxy::didFinishLoad observer:" - + observer.getClass().getName(); - try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { - observer.didFinishLoad( - rfhId, url, isKnownValid, isInPrimaryMainFrame, rfhLifecycleState); - } + mObserversIterator.next().didFinishLoad( + rfhId, url, isKnownValid, isInPrimaryMainFrame, rfhLifecycleState); } finishObserverCall(); } @@ -355,17 +291,10 @@ @Override @CalledByNative - // The string passed is safe since it is class and method name. - @SuppressWarnings("NoDynamicStringsInTraceEventCheck") public void navigationEntryCommitted(LoadCommittedDetails details) { handleObserverCall(); for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { - WebContentsObserver observer = mObserversIterator.next(); - String s = "WebContentsObserverProxy::navigationEntryComitted observer:" - + observer.getClass().getName(); - try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { - observer.navigationEntryCommitted(details); - } + mObserversIterator.next().navigationEntryCommitted(details); } finishObserverCall(); }
diff --git a/content/public/browser/web_contents.h b/content/public/browser/web_contents.h index 2f4791f..5c710de 100644 --- a/content/public/browser/web_contents.h +++ b/content/public/browser/web_contents.h
@@ -39,6 +39,7 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/mojom/favicon/favicon_url.mojom-forward.h" #include "third_party/blink/public/mojom/frame/find_in_page.mojom-forward.h" +#include "third_party/blink/public/mojom/frame/frame.mojom-forward.h" #include "third_party/blink/public/mojom/input/pointer_lock_result.mojom.h" #include "third_party/blink/public/mojom/media/capture_handle_config.mojom-forward.h" #include "third_party/perfetto/include/perfetto/tracing/traced_value_forward.h" @@ -776,6 +777,9 @@ virtual void AttachInnerWebContents( std::unique_ptr<WebContents> inner_web_contents, RenderFrameHost* render_frame_host, + mojo::PendingAssociatedRemote<blink::mojom::RemoteFrame> remote_frame, + mojo::PendingAssociatedReceiver<blink::mojom::RemoteFrameHost> + remote_frame_host_receiver, bool is_full_page) = 0; // Returns whether this WebContents is an inner WebContents for a guest.
diff --git a/content/public/common/url_constants.cc b/content/public/common/url_constants.cc index a502f88..53e29fc 100644 --- a/content/public/common/url_constants.cc +++ b/content/public/common/url_constants.cc
@@ -23,6 +23,7 @@ #if BUILDFLAG(IS_ANDROID) const char kAndroidAppScheme[] = "android-app"; #endif +const char kIsolatedAppScheme[] = "isolated-app"; const char kGoogleChromeScheme[] = "googlechrome"; const char kChromeUIAttributionInternalsHost[] = "attribution-internals";
diff --git a/content/public/common/url_constants.h b/content/public/common/url_constants.h index ebbb5796..9b7dd13 100644 --- a/content/public/common/url_constants.h +++ b/content/public/common/url_constants.h
@@ -29,6 +29,7 @@ #if BUILDFLAG(IS_ANDROID) CONTENT_EXPORT extern const char kAndroidAppScheme[]; #endif +CONTENT_EXPORT extern const char kIsolatedAppScheme[]; // The `googlechrome:` scheme is registered on several platforms, and is // both interesting and dangerous.
diff --git a/content/public/test/browser_test_base.cc b/content/public/test/browser_test_base.cc index c1bf84a..53fa7e6 100644 --- a/content/public/test/browser_test_base.cc +++ b/content/public/test/browser_test_base.cc
@@ -81,6 +81,7 @@ #include "net/dns/public/dns_over_https_server_config.h" #include "net/dns/public/secure_dns_mode.h" #include "net/test/embedded_test_server/embedded_test_server.h" +#include "services/network/network_service.h" #include "services/network/public/cpp/features.h" #include "services/network/public/mojom/network_service_test.mojom.h" #include "services/tracing/public/cpp/trace_startup.h" @@ -1021,10 +1022,27 @@ // pick up the host resolver rules, but it will not automatically see // `replace_system_dns_config_` and `test_doh_config_`. // - // TODO(https://crbug.com/1295732) Always send `replace_system_dns_config_` - // and `test_doh_config_` to the network process, regardless of where it's - // running. + // TODO(https://crbug.com/1295732): Can the Mojo interface also be used in + // this case? if (IsInProcessNetworkService()) { + if (replace_system_dns_config_ || test_doh_config_) { + base::RunLoop run_loop; + content::GetNetworkTaskRunner()->PostTaskAndReply( + FROM_HERE, base::BindLambdaForTesting([&] { + network::NetworkService* network_service = + network::NetworkService::GetNetworkServiceForTesting(); + ASSERT_TRUE(network_service); + if (replace_system_dns_config_) { + network_service->ReplaceSystemDnsConfigForTesting(); + } + if (test_doh_config_) { + network_service->SetTestDohConfigForTesting( + test_doh_config_->first, test_doh_config_->second); + } + }), + run_loop.QuitClosure()); + run_loop.Run(); + } return; }
diff --git a/content/public/test/fake_remote_frame.cc b/content/public/test/fake_remote_frame.cc index aebeeee..770511e 100644 --- a/content/public/test/fake_remote_frame.cc +++ b/content/public/test/fake_remote_frame.cc
@@ -12,11 +12,9 @@ FakeRemoteFrame::~FakeRemoteFrame() = default; -void FakeRemoteFrame::Init(blink::AssociatedInterfaceProvider* provider) { - provider->OverrideBinderForTesting( - blink::mojom::RemoteFrame::Name_, - base::BindRepeating(&FakeRemoteFrame::BindFrameHostReceiver, - base::Unretained(this))); +void FakeRemoteFrame::Init( + mojo::PendingAssociatedReceiver<blink::mojom::RemoteFrame> receiver) { + receiver_.Bind(std::move(receiver)); } void FakeRemoteFrame::WillEnterFullscreen(blink::mojom::FullscreenOptionsPtr) {} @@ -85,12 +83,6 @@ void FakeRemoteFrame::UpdateOpener( const absl::optional<blink::FrameToken>& opener_frame_token) {} -void FakeRemoteFrame::FakeRemoteFrame::BindFrameHostReceiver( - mojo::ScopedInterfaceEndpointHandle handle) { - receiver_.Bind(mojo::PendingAssociatedReceiver<blink::mojom::RemoteFrame>( - std::move(handle))); -} - void FakeRemoteFrame::DetachAndDispose() {} void FakeRemoteFrame::EnableAutoResize(const gfx::Size& min_size,
diff --git a/content/public/test/fake_remote_frame.h b/content/public/test/fake_remote_frame.h index b348e01..ea71d1e 100644 --- a/content/public/test/fake_remote_frame.h +++ b/content/public/test/fake_remote_frame.h
@@ -26,16 +26,16 @@ namespace content { -// This class implements a RemoteFrame that can be attached to the -// AssociatedInterfaceProvider so that it will be called when the browser -// normally sends a request to the renderer process. But for a unittest -// setup it can be intercepted by this class. +// This class implements a RemoteFrame that can be bound and passed to +// the RenderFrameProxy. Calls typically routed to the renderer process +// will then be intercepted to this class. class FakeRemoteFrame : public blink::mojom::RemoteFrame { public: FakeRemoteFrame(); ~FakeRemoteFrame() override; - void Init(blink::AssociatedInterfaceProvider* provider); + void Init( + mojo::PendingAssociatedReceiver<blink::mojom::RemoteFrame> receiver); // blink::mojom::RemoteFrame overrides: void WillEnterFullscreen(blink::mojom::FullscreenOptionsPtr) override; @@ -94,8 +94,6 @@ void ChildProcessGone() override; private: - void BindFrameHostReceiver(mojo::ScopedInterfaceEndpointHandle handle); - mojo::AssociatedReceiver<blink::mojom::RemoteFrame> receiver_{this}; };
diff --git a/content/public/test/test_utils.cc b/content/public/test/test_utils.cc index 9f3d035..2484c13 100644 --- a/content/public/test/test_utils.cc +++ b/content/public/test/test_utils.cc
@@ -286,8 +286,11 @@ // Attach. |inner_contents| becomes owned by |outer_contents|. WebContents* inner_contents = inner_contents_ptr.get(); - outer_contents->AttachInnerWebContents(std::move(inner_contents_ptr), rfh, - false /* is_full_page */); + outer_contents->AttachInnerWebContents( + std::move(inner_contents_ptr), rfh, + /*remote_frame=*/mojo::NullAssociatedRemote(), + /*remote_frame_host_receiver=*/mojo::NullAssociatedReceiver(), + /*is_full_page=*/false); return inner_contents; }
diff --git a/content/renderer/accessibility/blink_ax_tree_source.cc b/content/renderer/accessibility/blink_ax_tree_source.cc index e693e63..df5f6b3 100644 --- a/content/renderer/accessibility/blink_ax_tree_source.cc +++ b/content/renderer/accessibility/blink_ax_tree_source.cc
@@ -517,8 +517,18 @@ return; } - if (accessibility_mode_.has_mode(ui::AXMode::kScreenReader)) { - SerializeOtherScreenReaderAttributes(src, dst); + if (ui::IsImage(dst->role)) + AddImageAnnotations(src, dst); + + // If a link or web area isn't otherwise labeled and contains exactly one + // image (searching only to a max depth of 2), and the link doesn't have + // accessible text from an attribute like aria-label, then annotate the + // link/web area with the image's annotation, too. + if ((ui::IsLink(dst->role) || ui::IsPlatformDocument(dst->role)) && + dst->GetNameFrom() != ax::mojom::NameFrom::kAttribute) { + WebAXObject inner_image; + if (FindExactlyOneInnerImageInMaxDepthThree(src, &inner_image)) + AddImageAnnotations(inner_image, dst); } if (dst->id == image_data_node_id_) { @@ -544,51 +554,6 @@ } } -void BlinkAXTreeSource::SerializeOtherScreenReaderAttributes( - WebAXObject src, - ui::AXNodeData* dst) const { - blink::WebString display_style = src.ComputedStyleDisplay(); - if (!display_style.IsEmpty()) { - TruncateAndAddStringAttribute(dst, ax::mojom::StringAttribute::kDisplay, - display_style.Utf8()); - } - - if (src.KeyboardShortcut().length() && - !dst->HasStringAttribute(ax::mojom::StringAttribute::kKeyShortcuts)) { - TruncateAndAddStringAttribute(dst, - ax::mojom::StringAttribute::kKeyShortcuts, - src.KeyboardShortcut().Utf8()); - } - - if (!src.AriaActiveDescendant().IsDetached()) { - dst->AddIntAttribute(ax::mojom::IntAttribute::kActivedescendantId, - src.AriaActiveDescendant().AxID()); - } - - if (ui::IsImage(dst->role)) - AddImageAnnotations(src, dst); - - // If a link or web area isn't otherwise labeled and contains exactly one - // image (searching only to a max depth of 2), and the link doesn't have - // accessible text from an attribute like aria-label, then annotate the - // link/web area with the image's annotation, too. - if ((ui::IsLink(dst->role) || ui::IsPlatformDocument(dst->role)) && - dst->GetNameFrom() != ax::mojom::NameFrom::kAttribute) { - WebAXObject inner_image; - if (FindExactlyOneInnerImageInMaxDepthThree(src, &inner_image)) - AddImageAnnotations(inner_image, dst); - } - - WebNode node = src.GetNode(); - if (!node.IsNull() && node.IsElementNode()) { - WebElement element = node.To<WebElement>(); - if (element.HasHTMLTagName("input") && element.HasAttribute("type")) { - TruncateAndAddStringAttribute(dst, ax::mojom::StringAttribute::kInputType, - element.GetAttribute("type").Utf8()); - } - } -} - blink::WebDocument BlinkAXTreeSource::GetMainDocument() const { CHECK(frozen_); return document_;
diff --git a/content/renderer/accessibility/blink_ax_tree_source.h b/content/renderer/accessibility/blink_ax_tree_source.h index dd1e7a1..0d0273a 100644 --- a/content/renderer/accessibility/blink_ax_tree_source.h +++ b/content/renderer/accessibility/blink_ax_tree_source.h
@@ -149,8 +149,6 @@ void SerializeBoundingBoxAttributes(blink::WebAXObject src, ui::AXNodeData* dst) const; - void SerializeOtherScreenReaderAttributes(blink::WebAXObject src, - ui::AXNodeData* dst) const; blink::WebAXObject ComputeRoot() const; // Max length for attributes such as aria-label.
diff --git a/content/renderer/agent_scheduling_group.cc b/content/renderer/agent_scheduling_group.cc index 3f0fa1b..8528796 100644 --- a/content/renderer/agent_scheduling_group.cc +++ b/content/renderer/agent_scheduling_group.cc
@@ -290,18 +290,19 @@ void AgentSchedulingGroup::CreateFrameProxy( const blink::RemoteFrameToken& token, - int32_t routing_id, const absl::optional<blink::FrameToken>& opener_frame_token, int32_t view_routing_id, const absl::optional<blink::RemoteFrameToken>& parent_frame_token, blink::mojom::TreeScopeType tree_scope_type, blink::mojom::FrameReplicationStatePtr replicated_state, const base::UnguessableToken& devtools_frame_token, + mojom::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) { RenderFrameProxy::CreateFrameProxy( - *this, token, routing_id, opener_frame_token, view_routing_id, - parent_frame_token, tree_scope_type, std::move(replicated_state), - devtools_frame_token, std::move(remote_main_frame_interfaces)); + *this, token, opener_frame_token, view_routing_id, parent_frame_token, + tree_scope_type, std::move(replicated_state), devtools_frame_token, + std::move(remote_frame_interfaces), + std::move(remote_main_frame_interfaces)); } void AgentSchedulingGroup::CreateSharedStorageWorkletService(
diff --git a/content/renderer/agent_scheduling_group.h b/content/renderer/agent_scheduling_group.h index fe008d0..1f72ab5 100644 --- a/content/renderer/agent_scheduling_group.h +++ b/content/renderer/agent_scheduling_group.h
@@ -95,13 +95,13 @@ void CreateFrame(mojom::CreateFrameParamsPtr params) override; void CreateFrameProxy( const blink::RemoteFrameToken& token, - int32_t routing_id, const absl::optional<blink::FrameToken>& opener_frame_token, int32_t view_routing_id, const absl::optional<blink::RemoteFrameToken>& parent_frame_token, blink::mojom::TreeScopeType tree_scope_type, blink::mojom::FrameReplicationStatePtr replicated_state, const base::UnguessableToken& devtools_frame_token, + mojom::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) override; void CreateSharedStorageWorkletService(
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 130f5285..4a69ce4 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -2061,10 +2061,10 @@ // active RenderFrames in it. // This executes the unload handlers on this frame and its local descendants. void RenderFrameImpl::Unload( - int proxy_routing_id, bool is_loading, blink::mojom::FrameReplicationStatePtr replicated_frame_state, const blink::RemoteFrameToken& proxy_frame_token, + mojom::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) { TRACE_EVENT1("navigation,rail", "RenderFrameImpl::UnloadFrame", "id", routing_id_); @@ -2086,9 +2086,10 @@ GetTaskRunner(blink::TaskType::kInternalPostMessageForwarding); // Important: |this| is deleted after this call! - if (!SwapOutAndDeleteThis( - proxy_routing_id, is_loading, std::move(replicated_frame_state), - proxy_frame_token, std::move(remote_main_frame_interfaces))) { + if (!SwapOutAndDeleteThis(is_loading, std::move(replicated_frame_state), + proxy_frame_token, + std::move(remote_frame_interfaces), + std::move(remote_main_frame_interfaces))) { // The swap is cancelled because running the unload handlers ended up // detaching this frame. return; @@ -2165,10 +2166,10 @@ } void RenderFrameImpl::UndoCommitNavigation( - int proxy_routing_id, bool is_loading, blink::mojom::FrameReplicationStatePtr replicated_frame_state, const blink::RemoteFrameToken& proxy_frame_token, + mojom::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, 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 @@ -2182,8 +2183,8 @@ // for this RenderFrame (which by definition, are still in-flight) will be // processed by the browser process (as it has not yet seen the // `DidCommitNavigation()`). - SwapOutAndDeleteThis(proxy_routing_id, is_loading, - std::move(replicated_frame_state), proxy_frame_token, + SwapOutAndDeleteThis(is_loading, std::move(replicated_frame_state), + proxy_frame_token, std::move(remote_frame_interfaces), std::move(remote_main_frame_interfaces)); } @@ -3492,19 +3493,29 @@ blink::CrossVariantMojoAssociatedRemote< blink::mojom::PortalClientInterfaceBase> client_endpoint, const blink::WebElement& portal_element) { - int proxy_routing_id = MSG_ROUTING_NONE; blink::mojom::FrameReplicationStatePtr initial_replicated_state = blink::mojom::FrameReplicationState::New(); blink::PortalToken portal_token; blink::RemoteFrameToken frame_token; base::UnguessableToken devtools_frame_token; - GetFrameHost()->CreatePortal(std::move(portal_endpoint), - std::move(client_endpoint), &proxy_routing_id, - &initial_replicated_state, &portal_token, - &frame_token, &devtools_frame_token); + + auto remote_frame_interfaces = + mojom::RemoteFrameInterfacesFromRenderer::New(); + mojo::PendingAssociatedRemote<blink::mojom::RemoteFrameHost> + remote_frame_host = remote_frame_interfaces->frame_host_receiver + .InitWithNewEndpointAndPassRemote(); + mojo::PendingAssociatedReceiver<blink::mojom::RemoteFrame> + remote_frame_receiver = + remote_frame_interfaces->frame.InitWithNewEndpointAndPassReceiver(); + + GetFrameHost()->CreatePortal( + std::move(portal_endpoint), std::move(client_endpoint), + std::move(remote_frame_interfaces), &initial_replicated_state, + &portal_token, &frame_token, &devtools_frame_token); RenderFrameProxy* proxy = RenderFrameProxy::CreateProxyForPortalOrFencedFrame( - agent_scheduling_group_, this, proxy_routing_id, frame_token, - devtools_frame_token, portal_element); + agent_scheduling_group_, this, frame_token, devtools_frame_token, + portal_element, std::move(remote_frame_host), + std::move(remote_frame_receiver)); proxy->SetReplicatedState(std::move(initial_replicated_state)); return std::make_pair(proxy->web_frame(), portal_token); } @@ -3512,17 +3523,27 @@ blink::WebRemoteFrame* RenderFrameImpl::AdoptPortal( const blink::PortalToken& portal_token, const blink::WebElement& portal_element) { - int proxy_routing_id = MSG_ROUTING_NONE; blink::mojom::FrameReplicationStatePtr replicated_state = blink::mojom::FrameReplicationState::New(); blink::RemoteFrameToken frame_token; base::UnguessableToken devtools_frame_token; - GetFrameHost()->AdoptPortal(portal_token, &proxy_routing_id, + + auto remote_frame_interfaces = + mojom::RemoteFrameInterfacesFromRenderer::New(); + mojo::PendingAssociatedRemote<blink::mojom::RemoteFrameHost> + remote_frame_host = remote_frame_interfaces->frame_host_receiver + .InitWithNewEndpointAndPassRemote(); + mojo::PendingAssociatedReceiver<blink::mojom::RemoteFrame> + remote_frame_receiver = + remote_frame_interfaces->frame.InitWithNewEndpointAndPassReceiver(); + + GetFrameHost()->AdoptPortal(portal_token, std::move(remote_frame_interfaces), &replicated_state, &frame_token, &devtools_frame_token); RenderFrameProxy* proxy = RenderFrameProxy::CreateProxyForPortalOrFencedFrame( - agent_scheduling_group_, this, proxy_routing_id, frame_token, - devtools_frame_token, portal_element); + agent_scheduling_group_, this, frame_token, devtools_frame_token, + portal_element, std::move(remote_frame_host), + std::move(remote_frame_receiver)); proxy->SetReplicatedState(std::move(replicated_state)); return proxy->web_frame(); } @@ -3532,19 +3553,27 @@ blink::CrossVariantMojoAssociatedReceiver< blink::mojom::FencedFrameOwnerHostInterfaceBase> receiver, blink::mojom::FencedFrameMode mode) { - int proxy_routing_id = MSG_ROUTING_NONE; blink::mojom::FrameReplicationStatePtr initial_replicated_state = blink::mojom::FrameReplicationState::New(); blink::RemoteFrameToken frame_token; base::UnguessableToken devtools_frame_token; + auto remote_frame_interfaces = + mojom::RemoteFrameInterfacesFromRenderer::New(); + mojo::PendingAssociatedRemote<blink::mojom::RemoteFrameHost> + remote_frame_host = remote_frame_interfaces->frame_host_receiver + .InitWithNewEndpointAndPassRemote(); + mojo::PendingAssociatedReceiver<blink::mojom::RemoteFrame> + remote_frame_receiver = + remote_frame_interfaces->frame.InitWithNewEndpointAndPassReceiver(); GetFrameHost()->CreateFencedFrame( - std::move(receiver), mode, &proxy_routing_id, &initial_replicated_state, - &frame_token, &devtools_frame_token); + std::move(receiver), mode, std::move(remote_frame_interfaces), + &initial_replicated_state, &frame_token, &devtools_frame_token); RenderFrameProxy* proxy = RenderFrameProxy::CreateProxyForPortalOrFencedFrame( - agent_scheduling_group_, this, proxy_routing_id, frame_token, - devtools_frame_token, fenced_frame); + agent_scheduling_group_, this, frame_token, devtools_frame_token, + fenced_frame, std::move(remote_frame_host), + std::move(remote_frame_receiver)); proxy->SetReplicatedState(std::move(initial_replicated_state)); for (auto& observer : observers_) @@ -4060,21 +4089,20 @@ } bool RenderFrameImpl::SwapOutAndDeleteThis( - int proxy_routing_id, bool is_loading, blink::mojom::FrameReplicationStatePtr replicated_frame_state, const blink::RemoteFrameToken& proxy_frame_token, + mojom::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) { TRACE_EVENT1("navigation,rail", "RenderFrameImpl::SwapOutAndDeleteThis", "id", routing_id_); DCHECK(!base::RunLoop::IsNestedOnCurrentThread()); - // There should always be a proxy to replace this RenderFrame. Create it now - // so its routing id is registered for receiving IPC messages. - CHECK_NE(proxy_routing_id, MSG_ROUTING_NONE); + // There should always be a proxy to replace this RenderFrame. Create it so + // we can pass a WebRemoteFrame into `Swap`. RenderFrameProxy* proxy = RenderFrameProxy::CreateProxyToReplaceFrame( - agent_scheduling_group_, this, proxy_routing_id, - frame_->GetTreeScopeType(), proxy_frame_token); + agent_scheduling_group_, this, frame_->GetTreeScopeType(), + proxy_frame_token); RenderViewImpl* render_view = render_view_; bool is_main_frame = is_main_frame_; @@ -4088,7 +4116,9 @@ // it to return false without detaching. // // This executes the unload handlers on this frame and its local descendants. - bool success = frame_->Swap(proxy->web_frame()); + bool success = frame_->Swap( + proxy->web_frame(), std::move(remote_frame_interfaces->frame_host), + std::move(remote_frame_interfaces->frame_receiver)); // WARNING: Do not access 'this' past this point!
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h index 62ee125..351a3a2 100644 --- a/content/renderer/render_frame_impl.h +++ b/content/renderer/render_frame_impl.h
@@ -843,18 +843,19 @@ std::unique_ptr<blink::PendingURLLoaderFactoryBundle> subresource_loader_factories) override; void SetWantErrorMessageStackTrace() override; - void Unload(int proxy_routing_id, - bool is_loading, - blink::mojom::FrameReplicationStatePtr replicated_frame_state, - const blink::RemoteFrameToken& frame_token, - mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) - override; - void Delete(mojom::FrameDeleteIntention intent) override; - void UndoCommitNavigation( - int proxy_routing_id, + void Unload( bool is_loading, blink::mojom::FrameReplicationStatePtr replicated_frame_state, const blink::RemoteFrameToken& frame_token, + mojom::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, + mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) + override; + void Delete(mojom::FrameDeleteIntention intent) override; + void UndoCommitNavigation( + bool is_loading, + blink::mojom::FrameReplicationStatePtr replicated_frame_state, + const blink::RemoteFrameToken& frame_token, + mojom::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) override; void BlockRequests() override; @@ -1116,10 +1117,10 @@ // // Important: after this method returns, `this` has been deleted. bool SwapOutAndDeleteThis( - int proxy_routing_id, bool is_loading, blink::mojom::FrameReplicationStatePtr replicated_frame_state, const blink::RemoteFrameToken& frame_token, + mojom::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces); // Stores the WebLocalFrame we are associated with. This is null from the
diff --git a/content/renderer/render_frame_impl_browsertest.cc b/content/renderer/render_frame_impl_browsertest.cc index 2121ab8..33ef502 100644 --- a/content/renderer/render_frame_impl_browsertest.cc +++ b/content/renderer/render_frame_impl_browsertest.cc
@@ -74,7 +74,6 @@ constexpr int32_t kSubframeRouteId = 20; constexpr int32_t kSubframeWidgetRouteId = 21; -constexpr int32_t kFrameProxyRouteId = 22; const char kParentFrameHTML[] = "Parent frame <iframe name='frame'></iframe>"; @@ -131,6 +130,16 @@ frame_replication_state->name = "frame"; frame_replication_state->unique_name = "frame-uniqueName"; + auto remote_frame_interfaces = + mojom::RemoteFrameInterfacesFromBrowser::New(); + mojo::AssociatedRemote<blink::mojom::RemoteFrame> frame; + remote_frame_interfaces->frame_receiver = + frame.BindNewEndpointAndPassDedicatedReceiver(); + + mojo::AssociatedRemote<blink::mojom::RemoteFrameHost> frame_host; + std::ignore = frame_host.BindNewEndpointAndPassDedicatedReceiver(); + remote_frame_interfaces->frame_host = frame_host.Unbind(); + auto remote_main_frame_interfaces = mojom::RemoteMainFrameInterfaces::New(); mojo::AssociatedRemote<blink::mojom::RemoteMainFrame> main_frame; remote_main_frame_interfaces->main_frame = @@ -143,8 +152,9 @@ blink::RemoteFrameToken remote_child_token = blink::RemoteFrameToken(); RenderFrameImpl::FromWebFrame( GetMainRenderFrame()->GetWebFrame()->FirstChild()) - ->Unload(kFrameProxyRouteId, false, frame_replication_state->Clone(), - remote_child_token, std::move(remote_main_frame_interfaces)); + ->Unload(false, frame_replication_state->Clone(), remote_child_token, + std::move(remote_frame_interfaces), + std::move(remote_main_frame_interfaces)); MockPolicyContainerHost mock_policy_container_host; RenderFrameImpl::CreateFrame( *agent_scheduling_group_, blink::LocalFrameToken(), kSubframeRouteId,
diff --git a/content/renderer/render_frame_proxy.cc b/content/renderer/render_frame_proxy.cc index 890d4fd..5f8f4064 100644 --- a/content/renderer/render_frame_proxy.cc +++ b/content/renderer/render_frame_proxy.cc
@@ -39,33 +39,19 @@ namespace content { -namespace { - -// Facilitates lookup of RenderFrameProxy by routing_id. -typedef std::map<int, RenderFrameProxy*> RoutingIDProxyMap; -static base::LazyInstance<RoutingIDProxyMap>::DestructorAtExit - g_routing_id_proxy_map = LAZY_INSTANCE_INITIALIZER; - -} // namespace - // static RenderFrameProxy* RenderFrameProxy::CreateProxyToReplaceFrame( AgentSchedulingGroup& agent_scheduling_group, RenderFrameImpl* frame_to_replace, - int routing_id, blink::mojom::TreeScopeType tree_scope_type, const blink::RemoteFrameToken& proxy_frame_token) { - CHECK_NE(routing_id, MSG_ROUTING_NONE); - - std::unique_ptr<RenderFrameProxy> proxy( - new RenderFrameProxy(agent_scheduling_group, routing_id)); + std::unique_ptr<RenderFrameProxy> proxy(new RenderFrameProxy()); // When a RenderFrame is replaced by a RenderProxy, the WebRemoteFrame should // always come from WebRemoteFrame::create and a call to WebFrame::swap must // follow later. blink::WebRemoteFrame* web_frame = blink::WebRemoteFrame::Create( - tree_scope_type, proxy.get(), proxy->blink_interface_registry_.get(), - proxy->GetRemoteAssociatedInterfaces(), proxy_frame_token); + tree_scope_type, proxy.get(), proxy_frame_token); proxy->Init(web_frame); return proxy.release(); @@ -75,13 +61,13 @@ RenderFrameProxy* RenderFrameProxy::CreateFrameProxy( AgentSchedulingGroup& agent_scheduling_group, const blink::RemoteFrameToken& frame_token, - int routing_id, const absl::optional<blink::FrameToken>& opener_frame_token, int render_view_routing_id, const absl::optional<blink::RemoteFrameToken>& parent_frame_token, blink::mojom::TreeScopeType tree_scope_type, blink::mojom::FrameReplicationStatePtr replicated_state, const base::UnguessableToken& devtools_frame_token, + mojom::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) { blink::WebRemoteFrame* parent = nullptr; if (parent_frame_token) { @@ -93,8 +79,7 @@ return nullptr; } - std::unique_ptr<RenderFrameProxy> proxy( - new RenderFrameProxy(agent_scheduling_group, routing_id)); + std::unique_ptr<RenderFrameProxy> proxy(new RenderFrameProxy()); blink::WebRemoteFrame* web_frame = nullptr; blink::WebFrame* opener = nullptr; @@ -106,9 +91,9 @@ RenderViewImpl::FromRoutingID(render_view_routing_id); blink::WebView* web_view = render_view->GetWebView(); web_frame = blink::WebRemoteFrame::CreateMainFrame( - web_view, proxy.get(), proxy->blink_interface_registry_.get(), - proxy->GetRemoteAssociatedInterfaces(), frame_token, - devtools_frame_token, opener); + web_view, proxy.get(), frame_token, devtools_frame_token, opener, + std::move(remote_frame_interfaces->frame_host), + std::move(remote_frame_interfaces->frame_receiver)); // Root frame proxy has no ancestors to point to their RenderWidget. // The WebRemoteFrame created here was already attached to the Page as its @@ -122,10 +107,10 @@ // should not wind up here. web_frame = parent->CreateRemoteChild( tree_scope_type, blink::WebString::FromUTF8(replicated_state->name), - replicated_state->frame_policy, proxy.get(), - proxy->blink_interface_registry_.get(), - proxy->GetRemoteAssociatedInterfaces(), frame_token, - devtools_frame_token, opener); + replicated_state->frame_policy, proxy.get(), frame_token, + devtools_frame_token, opener, + std::move(remote_frame_interfaces->frame_host), + std::move(remote_frame_interfaces->frame_receiver)); } proxy->Init(web_frame); @@ -145,39 +130,24 @@ RenderFrameProxy* RenderFrameProxy::CreateProxyForPortalOrFencedFrame( AgentSchedulingGroup& agent_scheduling_group, RenderFrameImpl* parent, - int proxy_routing_id, const blink::RemoteFrameToken& frame_token, const base::UnguessableToken& devtools_frame_token, - const blink::WebElement& frame_owner) { - auto proxy = base::WrapUnique( - new RenderFrameProxy(agent_scheduling_group, proxy_routing_id)); + const blink::WebElement& frame_owner, + mojo::PendingAssociatedRemote<blink::mojom::RemoteFrameHost> frame_host, + mojo::PendingAssociatedReceiver<blink::mojom::RemoteFrame> frame) { + auto proxy = base::WrapUnique(new RenderFrameProxy()); blink::WebRemoteFrame* web_frame = blink::WebRemoteFrame::CreateForPortalOrFencedFrame( - blink::mojom::TreeScopeType::kDocument, proxy.get(), - proxy->blink_interface_registry_.get(), - proxy->GetRemoteAssociatedInterfaces(), frame_token, - devtools_frame_token, frame_owner); + blink::mojom::TreeScopeType::kDocument, proxy.get(), frame_token, + devtools_frame_token, frame_owner, std::move(frame_host), + std::move(frame)); proxy->Init(web_frame); return proxy.release(); } -RenderFrameProxy::RenderFrameProxy(AgentSchedulingGroup& agent_scheduling_group, - int routing_id) - : agent_scheduling_group_(agent_scheduling_group), - routing_id_(routing_id) { - std::pair<RoutingIDProxyMap::iterator, bool> result = - g_routing_id_proxy_map.Get().insert(std::make_pair(routing_id_, this)); - CHECK(result.second) << "Inserting a duplicate item."; - agent_scheduling_group_.AddRoute(routing_id_, this); - blink_interface_registry_ = std::make_unique<BlinkInterfaceRegistryImpl>( - binder_registry_.GetWeakPtr(), associated_interfaces_.GetWeakPtr()); -} +RenderFrameProxy::RenderFrameProxy() = default; -RenderFrameProxy::~RenderFrameProxy() { - CHECK(!web_frame_); - agent_scheduling_group_.RemoveRoute(routing_id_); - g_routing_id_proxy_map.Get().erase(routing_id_); -} +RenderFrameProxy::~RenderFrameProxy() = default; void RenderFrameProxy::Init(blink::WebRemoteFrame* web_frame) { CHECK(web_frame); @@ -232,21 +202,6 @@ state->has_received_user_gesture_before_nav); } -bool RenderFrameProxy::OnMessageReceived(const IPC::Message& msg) { - return false; -} - -void RenderFrameProxy::OnAssociatedInterfaceRequest( - const std::string& interface_name, - mojo::ScopedInterfaceEndpointHandle handle) { - if (interface_name == blink::mojom::RemoteFrame::Name_) - associated_interfaces_.TryBindInterface(interface_name, &handle); -} - -bool RenderFrameProxy::Send(IPC::Message* message) { - return agent_scheduling_group_.Send(message); -} - void RenderFrameProxy::DidStartLoading() { web_frame_->DidStartLoading(); } @@ -258,20 +213,4 @@ delete this; } -blink::AssociatedInterfaceProvider* -RenderFrameProxy::GetRemoteAssociatedInterfaces() { - if (!remote_associated_interfaces_) { - mojo::PendingAssociatedRemote<blink::mojom::AssociatedInterfaceProvider> - remote_interfaces; - agent_scheduling_group_.GetRemoteRouteProvider()->GetRoute( - routing_id_, remote_interfaces.InitWithNewEndpointAndPassReceiver()); - remote_associated_interfaces_ = - std::make_unique<blink::AssociatedInterfaceProvider>( - std::move(remote_interfaces), - agent_scheduling_group_.agent_group_scheduler() - .DefaultTaskRunner()); - } - return remote_associated_interfaces_.get(); -} - } // namespace content
diff --git a/content/renderer/render_frame_proxy.h b/content/renderer/render_frame_proxy.h index 8b46ab5..8c9d571 100644 --- a/content/renderer/render_frame_proxy.h +++ b/content/renderer/render_frame_proxy.h
@@ -9,8 +9,6 @@ #include "cc/paint/paint_canvas.h" #include "content/common/content_export.h" #include "content/common/frame.mojom.h" -#include "ipc/ipc_listener.h" -#include "ipc/ipc_sender.h" #include "mojo/public/cpp/bindings/associated_receiver.h" #include "mojo/public/cpp/bindings/associated_remote.h" #include "services/service_manager/public/cpp/binder_registry.h" @@ -31,7 +29,6 @@ namespace content { class AgentSchedulingGroup; -class BlinkInterfaceRegistryImpl; class RenderFrameImpl; // When a page's frames are rendered by multiple processes, each renderer has a @@ -54,19 +51,15 @@ // RenderFrameProxy will be deleted when the node in the frame tree is deleted // or when navigating the frame causes it to return to this process and a new // RenderFrame is created for it. -class CONTENT_EXPORT RenderFrameProxy : public IPC::Listener, - public IPC::Sender, - public blink::WebRemoteFrameClient { +class CONTENT_EXPORT RenderFrameProxy : public blink::WebRemoteFrameClient { public: // This method should be used to create a RenderFrameProxy, which will replace // an existing RenderFrame during its cross-process navigation from the - // current process to a different one. |routing_id| will be ID of the newly - // created RenderFrameProxy. |frame_to_replace| is the frame that the new - // proxy will eventually swap places with. + // current process to a different one. `frame_to_replace` is the frame that + // the new proxy will eventually swap places with. static RenderFrameProxy* CreateProxyToReplaceFrame( AgentSchedulingGroup& agent_scheduling_group, RenderFrameImpl* frame_to_replace, - int routing_id, blink::mojom::TreeScopeType tree_scope_type, const blink::RemoteFrameToken& proxy_frame_token); @@ -74,9 +67,8 @@ // an existing RenderFrame. It should be called to construct a local // representation of a RenderFrame that has been created in another process -- // for example, after a cross-process navigation or after the addition of a - // new frame local to some other process. |routing_id| will be the ID of the - // newly created RenderFrameProxy. |render_view_routing_id| identifies the - // RenderView to be associated with this frame. `opener_frame_token`, if + // new frame local to some other process. `render_view_routing_id` identifies + // the RenderView to be associated with this frame. `opener_frame_token`, if // supplied, is the new frame's opener. `parent_frame_token`, if supplied, // is the frame token of the RenderFrameProxy to which the new frame is // parented. @@ -87,43 +79,31 @@ static RenderFrameProxy* CreateFrameProxy( AgentSchedulingGroup& agent_scheduling_group, const blink::RemoteFrameToken& frame_token, - int routing_id, const absl::optional<blink::FrameToken>& opener_frame_token, int render_view_routing_id, const absl::optional<blink::RemoteFrameToken>& parent_frame_token, blink::mojom::TreeScopeType tree_scope_type, blink::mojom::FrameReplicationStatePtr replicated_state, const base::UnguessableToken& devtools_frame_token, + mojom::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces); // Creates a RenderFrameProxy to be used with a portal or fenced frame owned - // by |parent|. |routing_id| is the routing id of this new RenderFrameProxy. + // by `parent`. static RenderFrameProxy* CreateProxyForPortalOrFencedFrame( AgentSchedulingGroup& agent_scheduling_group, RenderFrameImpl* parent, - int proxy_routing_id, const blink::RemoteFrameToken& frame_token, const base::UnguessableToken& devtools_frame_token, - const blink::WebElement& frame_owner_element); - - // Returns the RenderFrameProxy given a WebRemoteFrame. |web_frame| must not - // be null, nor will this method return null. - static RenderFrameProxy* FromWebFrame(blink::WebRemoteFrame* web_frame); + const blink::WebElement& frame_owner_element, + mojo::PendingAssociatedRemote<blink::mojom::RemoteFrameHost> frame_host, + mojo::PendingAssociatedReceiver<blink::mojom::RemoteFrame> frame); RenderFrameProxy(const RenderFrameProxy&) = delete; RenderFrameProxy& operator=(const RenderFrameProxy&) = delete; ~RenderFrameProxy() override; - // IPC::Sender - bool Send(IPC::Message* msg) override; - - // IPC::Listener - bool OnMessageReceived(const IPC::Message& msg) override; - void OnAssociatedInterfaceRequest( - const std::string& interface_name, - mojo::ScopedInterfaceEndpointHandle handle) override; - // Pass replicated information, such as security origin, to this // RenderFrameProxy's WebRemoteFrame. void SetReplicatedState(blink::mojom::FrameReplicationStatePtr state); @@ -132,35 +112,16 @@ // blink::WebRemoteFrameClient implementation: void FrameDetached(DetachType type) override; - blink::AssociatedInterfaceProvider* GetRemoteAssociatedInterfaces() override; void DidStartLoading(); private: - RenderFrameProxy(AgentSchedulingGroup& agent_scheduling_group, - int routing_id); + explicit RenderFrameProxy(); void Init(blink::WebRemoteFrame* frame); - // The |AgentSchedulingGroup| this proxy is associated with. NOTE: This is - // different than the |AgentSchedulingGroup| associated with the frame being - // proxied. - AgentSchedulingGroup& agent_scheduling_group_; - - // The routing ID by which this RenderFrameProxy is known. - const int routing_id_; - // Stores the WebRemoteFrame we are associated with. blink::WebRemoteFrame* web_frame_ = nullptr; - - // Provides the mojo interface to this RenderFrameProxy's - // RenderFrameProxyHost. - std::unique_ptr<blink::AssociatedInterfaceProvider> - remote_associated_interfaces_; - - service_manager::BinderRegistry binder_registry_; - blink::AssociatedInterfaceRegistry associated_interfaces_; - std::unique_ptr<BlinkInterfaceRegistryImpl> blink_interface_registry_; }; } // namespace content
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc index 069e36c..6fa2928 100644 --- a/content/renderer/render_view_browsertest.cc +++ b/content/renderer/render_view_browsertest.cc
@@ -263,7 +263,20 @@ return params; } -mojom::RemoteMainFrameInterfacesPtr CreateStubRemoteFrameInterfaces() { +mojom::RemoteFrameInterfacesFromBrowserPtr CreateStubRemoteFrameInterfaces() { + auto interfaces = mojom::RemoteFrameInterfacesFromBrowser::New(); + + mojo::AssociatedRemote<blink::mojom::RemoteFrame> frame; + interfaces->frame_receiver = frame.BindNewEndpointAndPassDedicatedReceiver(); + + mojo::AssociatedRemote<blink::mojom::RemoteFrameHost> frame_host; + std::ignore = frame_host.BindNewEndpointAndPassDedicatedReceiver(); + interfaces->frame_host = frame_host.Unbind(); + + return interfaces; +} + +mojom::RemoteMainFrameInterfacesPtr CreateStubRemoteMainFrameInterfaces() { auto interfaces = mojom::RemoteMainFrameInterfaces::New(); mojo::AssociatedRemote<blink::mojom::RemoteMainFrame> main_frame; @@ -601,9 +614,10 @@ root_web_frame->FirstChild()->NextSibling()->ToWebLocalFrame())); ASSERT_TRUE(child_frame_2); static_cast<mojom::Frame*>(child_frame_1) - ->Unload(kProxyRoutingId, true, + ->Unload(/*is_loading=*/true, ReconstructReplicationStateForTesting(child_frame_1), - blink::RemoteFrameToken(), CreateStubRemoteFrameInterfaces()); + blink::RemoteFrameToken(), CreateStubRemoteFrameInterfaces(), + CreateStubRemoteMainFrameInterfaces()); EXPECT_TRUE(root_web_frame->FirstChild()->IsWebRemoteFrame()); EXPECT_FALSE(root_web_frame->FirstChild() ->ToWebRemoteFrame() @@ -629,9 +643,10 @@ // and registering of a new RenderFrameProxy, which should pick up the // existing setting. static_cast<mojom::Frame*>(child_frame_2) - ->Unload(kProxyRoutingId + 1, true, + ->Unload(/*is_loading=*/true, ReconstructReplicationStateForTesting(child_frame_2), - blink::RemoteFrameToken(), CreateStubRemoteFrameInterfaces()); + blink::RemoteFrameToken(), CreateStubRemoteFrameInterfaces(), + CreateStubRemoteMainFrameInterfaces()); EXPECT_TRUE(root_web_frame->FirstChild()->NextSibling()->IsWebRemoteFrame()); // Verify new child has the flag too. EXPECT_TRUE(root_web_frame->FirstChild() @@ -998,9 +1013,10 @@ ASSERT_TRUE(child_frame); static_cast<mojom::Frame*>(child_frame) - ->Unload(kProxyRoutingId + 1, true, + ->Unload(/*is_loading=*/true, ReconstructReplicationStateForTesting(child_frame), - blink::RemoteFrameToken(), CreateStubRemoteFrameInterfaces()); + blink::RemoteFrameToken(), CreateStubRemoteFrameInterfaces(), + CreateStubRemoteMainFrameInterfaces()); EXPECT_TRUE(web_frame->FirstChild()->IsWebRemoteFrame()); // Verify that the system device scale factor has propagated into the @@ -1038,8 +1054,9 @@ auto replication_state = ReconstructReplicationStateForTesting(child_frame); replication_state->origin = url::Origin::Create(GURL("http://foo.com")); static_cast<mojom::Frame*>(child_frame) - ->Unload(kProxyRoutingId, true, replication_state->Clone(), - blink::RemoteFrameToken(), CreateStubRemoteFrameInterfaces()); + ->Unload(/*is_loading=*/true, replication_state->Clone(), + blink::RemoteFrameToken(), CreateStubRemoteFrameInterfaces(), + CreateStubRemoteMainFrameInterfaces()); // The child frame should now be a WebRemoteFrame. EXPECT_TRUE(web_frame->FirstChild()->IsWebRemoteFrame()); @@ -1057,8 +1074,9 @@ static_cast<TestRenderFrame*>(RenderFrame::FromWebFrame( web_frame->FirstChild()->NextSibling()->ToWebLocalFrame())); static_cast<mojom::Frame*>(child_frame2) - ->Unload(kProxyRoutingId + 1, true, std::move(replication_state), - blink::RemoteFrameToken(), CreateStubRemoteFrameInterfaces()); + ->Unload(/*is_loading=*/true, std::move(replication_state), + blink::RemoteFrameToken(), CreateStubRemoteFrameInterfaces(), + CreateStubRemoteMainFrameInterfaces()); EXPECT_TRUE(web_frame->FirstChild()->NextSibling()->IsWebRemoteFrame()); EXPECT_TRUE( web_frame->FirstChild()->NextSibling()->GetSecurityOrigin().IsOpaque()); @@ -1085,8 +1103,8 @@ auto replication_state = ReconstructReplicationStateForTesting(frame()); // replication_state.origin = url::Origin(GURL("http://foo.com")); static_cast<mojom::Frame*>(frame())->Unload( - kProxyRoutingId, true, replication_state->Clone(), - remote_child_frame_token, CreateStubRemoteFrameInterfaces()); + /*is_loading=*/true, replication_state->Clone(), remote_child_frame_token, + CreateStubRemoteFrameInterfaces(), CreateStubRemoteMainFrameInterfaces()); EXPECT_TRUE(web_view_->MainFrame()->IsWebRemoteFrame()); // Do the remote-to-local transition for the proxy, which is to create a @@ -1178,8 +1196,9 @@ blink::RemoteFrameToken child_remote_frame_token = blink::RemoteFrameToken(); auto replication_state = ReconstructReplicationStateForTesting(child_frame); static_cast<mojom::Frame*>(child_frame) - ->Unload(kProxyRoutingId, true, replication_state.Clone(), - child_remote_frame_token, CreateStubRemoteFrameInterfaces()); + ->Unload(/*is_loading=*/true, replication_state.Clone(), + child_remote_frame_token, CreateStubRemoteFrameInterfaces(), + CreateStubRemoteMainFrameInterfaces()); EXPECT_TRUE(web_frame->FirstChild()->IsWebRemoteFrame()); // Do the first step of a remote-to-local transition for the child proxy, @@ -1229,9 +1248,10 @@ // Unload the main frame after which it should become a WebRemoteFrame. TestRenderFrame* main_frame = frame(); static_cast<mojom::Frame*>(main_frame) - ->Unload(kProxyRoutingId, true, + ->Unload(/*is_loading=*/true, ReconstructReplicationStateForTesting(main_frame), - blink::RemoteFrameToken(), CreateStubRemoteFrameInterfaces()); + blink::RemoteFrameToken(), CreateStubRemoteFrameInterfaces(), + CreateStubRemoteMainFrameInterfaces()); EXPECT_TRUE(web_view_->MainFrame()->IsWebRemoteFrame()); } @@ -2960,8 +2980,9 @@ // Unloads the main frame. static_cast<mojom::Frame*>(frame())->Unload( - 1, false, blink::mojom::FrameReplicationState::New(), - blink::RemoteFrameToken(), CreateStubRemoteFrameInterfaces()); + /*is_loading=*/false, blink::mojom::FrameReplicationState::New(), + blink::RemoteFrameToken(), CreateStubRemoteFrameInterfaces(), + CreateStubRemoteMainFrameInterfaces()); was_callback_run = true; run_loop.Quit();
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 11eaa6b..913b3647 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc
@@ -153,10 +153,10 @@ } else { RenderFrameProxy::CreateFrameProxy( agent_scheduling_group_, params->main_frame->get_remote_params()->token, - params->main_frame->get_remote_params()->routing_id, params->opener_frame_token, routing_id_, absl::nullopt, blink::mojom::TreeScopeType::kDocument /* ignored for main frames */, 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)); }
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index d31ceb30..7ed4ee6 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -507,6 +507,7 @@ "//components/variations", "//components/viz/client", "//components/viz/host", + "//components/web_package/test_support", "//content/app:for_content_tests", "//content/browser:for_content_tests", "//content/browser/attribution_reporting:attribution_reporting_proto",
diff --git a/content/test/DEPS b/content/test/DEPS index bccc9bc..8f4c304 100644 --- a/content/test/DEPS +++ b/content/test/DEPS
@@ -52,5 +52,8 @@ ], "content_browser_test_test.cc": [ "+ui/ozone/public/ozone_switches.h", + ], + "mock_web_bundle_reader_factory.cc": [ + "+components/web_package/test_support", ] }
diff --git a/content/test/data/attribution_reporting/interop/top_level_filter_data.json b/content/test/data/attribution_reporting/interop/top_level_filter_data.json index b254f71..84a4fda8 100644 --- a/content/test/data/attribution_reporting/interop/top_level_filter_data.json +++ b/content/test/data/attribution_reporting/interop/top_level_filter_data.json
@@ -16,11 +16,29 @@ "destination": "https://destination.test", "source_event_id": "123", "filter_data": { - "product": ["123"] + "product": ["123", "456"], + "geo": [] } } } }] + }, + { + "timestamp": "1643235573000", + "registration_request": { + "source_origin": "https://source.test", + "attribution_src_url": "https://reporter.test/register-source", + "source_type": "event" + }, + "responses": [{ + "url": "https://reporter.test/register-source", + "response": { + "Attribution-Reporting-Register-Source": { + "destination": "https://another-destination.test", + "source_event_id": "456" + } + } + }] } ], "triggers": [ @@ -40,7 +58,7 @@ } ], "filters": { - "product": ["123"], + "product": [], "source_type": ["navigation"] } } @@ -63,8 +81,8 @@ } ], "filters": { - "product": ["456"], - "source_type": ["navigation"] + "geo": [], + "source_type": ["event"] } } } @@ -85,9 +103,11 @@ "trigger_data": "3" } ], - "not_filters": { - "product": ["456"], - "source_type": ["event"] + "filters": { + "product": ["123"], + "geo": [], + "source_type": ["navigation"], + "campaign": ["example"] } } } @@ -105,11 +125,11 @@ "Attribution-Reporting-Register-Trigger": { "event_trigger_data": [ { - "trigger_data": "4" + "trigger_data": "1" } ], "not_filters": { - "product": ["123"], + "geo": [], "source_type": ["event"] } } @@ -128,14 +148,37 @@ "Attribution-Reporting-Register-Trigger": { "event_trigger_data": [ { - "trigger_data": "5" + "trigger_data": "2" } ], - "filters": { - "product": ["123"] - }, "not_filters": { - "source_type": ["event"] + "product": [], + "source_type": ["navigation"] + } + } + } + }] + }, + { + "timestamp": "1643235578000", + "registration_request": { + "attribution_src_url": "https://reporter.test/register-trigger", + "destination_origin": "https://destination.test" + }, + "responses": [{ + "url": "https://reporter.test/register-trigger", + "response": { + "Attribution-Reporting-Register-Trigger": { + "event_trigger_data": [ + { + "trigger_data": "4" + } + ], + "not_filters": { + "product": [], + "geo": ["US"], + "source_type": ["event"], + "campaign": [] } } } @@ -153,14 +196,14 @@ "Attribution-Reporting-Register-Trigger": { "event_trigger_data": [ { - "trigger_data": "6" + "trigger_data": "1" } ], "filters": { - "product": ["456"] + "source_type": ["navigation"] }, "not_filters": { - "source_type": ["event"] + "product": ["123"] } } } @@ -178,14 +221,83 @@ "Attribution-Reporting-Register-Trigger": { "event_trigger_data": [ { - "trigger_data": "7" + "trigger_data": "2" } ], "filters": { - "product": ["123"] + "source_type": ["event"] }, "not_filters": { + "product": ["789"] + } + } + } + }] + }, + { + "timestamp": "1643235580000", + "registration_request": { + "attribution_src_url": "https://reporter.test/register-trigger", + "destination_origin": "https://destination.test" + }, + "responses": [{ + "url": "https://reporter.test/register-trigger", + "response": { + "Attribution-Reporting-Register-Trigger": { + "event_trigger_data": [ + { + "trigger_data": "5" + } + ], + "filters": { "source_type": ["navigation"] + }, + "not_filters": { + "product": ["789"] + } + } + } + }] + }, + { + "timestamp": "1643235581000", + "registration_request": { + "attribution_src_url": "https://reporter.test/register-trigger", + "destination_origin": "https://another-destination.test" + }, + "responses": [{ + "url": "https://reporter.test/register-trigger", + "response": { + "Attribution-Reporting-Register-Trigger": { + "event_trigger_data": [ + { + "trigger_data": "0" + } + ], + "filters": { + "source_type": ["navigation"] + } + } + } + }] + }, + { + "timestamp": "1643235582000", + "registration_request": { + "attribution_src_url": "https://reporter.test/register-trigger", + "destination_origin": "https://another-destination.test" + }, + "responses": [{ + "url": "https://reporter.test/register-trigger", + "response": { + "Attribution-Reporting-Register-Trigger": { + "event_trigger_data": [ + { + "trigger_data": "1" + } + ], + "filters": { + "source_type": ["event"] } } } @@ -201,7 +313,7 @@ "randomized_trigger_rate": 0.0024, "source_event_id": "123", "source_type": "navigation", - "trigger_data": "1" + "trigger_data": "3" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", "report_time": "1643408373000" @@ -212,22 +324,33 @@ "randomized_trigger_rate": 0.0024, "source_event_id": "123", "source_type": "navigation", - "trigger_data": "3" + "trigger_data": "4" }, "report_time": "1643408373000", "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution" - }, - { - "payload": { - "attribution_destination": "https://destination.test", - "randomized_trigger_rate": 0.0024, - "source_event_id": "123", - "source_type": "navigation", - "trigger_data": "5" }, - "report_time": "1643408373000", - "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution" - } + { + "payload": { + "attribution_destination": "https://destination.test", + "randomized_trigger_rate": 0.0024, + "source_event_id": "123", + "source_type": "navigation", + "trigger_data": "5" + }, + "report_time": "1643408373000", + "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution" + }, + { + "payload": { + "attribution_destination": "https://another-destination.test", + "randomized_trigger_rate": 0.0000025, + "source_event_id": "456", + "source_type": "event", + "trigger_data": "1" + }, + "report_time": "1645831173000", + "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution" + } ] } }
diff --git a/content/test/gpu/gpu_tests/webgpu_cts_integration_test.py b/content/test/gpu/gpu_tests/webgpu_cts_integration_test.py index d79507d8..710ab7374 100644 --- a/content/test/gpu/gpu_tests/webgpu_cts_integration_test.py +++ b/content/test/gpu/gpu_tests/webgpu_cts_integration_test.py
@@ -178,6 +178,8 @@ # since it could technically be hit on any platform. '--disable-backgrounding-occluded-windows', ] + if cls._use_webgpu_adapter: + browser_args.append('--use-webgpu-adapter=%s' % cls._use_webgpu_adapter) if cls._enable_dawn_backend_validation: if sys.platform == 'win32': browser_args.append('--enable-dawn-backend-validation=partial') @@ -310,9 +312,11 @@ log_str) elif status == 'fail': self.fail(log_str) - finally: + except asyncio.TimeoutError: if JAVASCRIPT_DURATION not in self.additionalTags: self.additionalTags[JAVASCRIPT_DURATION] = '%.9fs' % timeout + raise + finally: WebGpuCtsIntegrationTest.total_tests_run += 1 @classmethod
diff --git a/content/test/portal/portal_created_observer.cc b/content/test/portal/portal_created_observer.cc index e50485f..89a0ec04 100644 --- a/content/test/portal/portal_created_observer.cc +++ b/content/test/portal/portal_created_observer.cc
@@ -30,14 +30,15 @@ void PortalCreatedObserver::CreatePortal( mojo::PendingAssociatedReceiver<blink::mojom::Portal> portal, mojo::PendingAssociatedRemote<blink::mojom::PortalClient> client, + mojom::RemoteFrameInterfacesFromRendererPtr remote_frame_interfaces, CreatePortalCallback callback) { PortalInterceptorForTesting* portal_interceptor = PortalInterceptorForTesting::Create(render_frame_host_impl_, std::move(portal), std::move(client)); portal_ = portal_interceptor->GetPortal(); - RenderFrameProxyHost* proxy_host = portal_->CreateProxyAndAttachPortal(); + RenderFrameProxyHost* proxy_host = + portal_->CreateProxyAndAttachPortal(std::move(remote_frame_interfaces)); std::move(callback).Run( - proxy_host->GetRoutingID(), proxy_host->frame_tree_node()->current_replication_state().Clone(), portal_->portal_token(), proxy_host->GetFrameToken(), portal_->GetDevToolsFrameToken()); @@ -45,15 +46,17 @@ DidCreatePortal(); } -void PortalCreatedObserver::AdoptPortal(const blink::PortalToken& portal_token, - AdoptPortalCallback callback) { +void PortalCreatedObserver::AdoptPortal( + const blink::PortalToken& portal_token, + mojom::RemoteFrameInterfacesFromRendererPtr remote_frame_interfaces, + AdoptPortalCallback callback) { Portal* portal = render_frame_host_impl_->FindPortalByToken(portal_token); PortalInterceptorForTesting* portal_interceptor = PortalInterceptorForTesting::Create(render_frame_host_impl_, portal); portal_ = portal_interceptor->GetPortal(); - RenderFrameProxyHost* proxy_host = portal_->CreateProxyAndAttachPortal(); + RenderFrameProxyHost* proxy_host = + portal_->CreateProxyAndAttachPortal(std::move(remote_frame_interfaces)); std::move(callback).Run( - proxy_host->GetRoutingID(), proxy_host->frame_tree_node()->current_replication_state().Clone(), proxy_host->GetFrameToken(), portal->GetDevToolsFrameToken());
diff --git a/content/test/portal/portal_created_observer.h b/content/test/portal/portal_created_observer.h index bb432ac..73d65404 100644 --- a/content/test/portal/portal_created_observer.h +++ b/content/test/portal/portal_created_observer.h
@@ -46,9 +46,12 @@ void CreatePortal( mojo::PendingAssociatedReceiver<blink::mojom::Portal> portal, mojo::PendingAssociatedRemote<blink::mojom::PortalClient> client, + mojom::RemoteFrameInterfacesFromRendererPtr remote_frame_interfaces, CreatePortalCallback callback) override; - void AdoptPortal(const blink::PortalToken& portal_token, - AdoptPortalCallback callback) override; + void AdoptPortal( + const blink::PortalToken& portal_token, + mojom::RemoteFrameInterfacesFromRendererPtr remote_frame_interfaces, + AdoptPortalCallback callback) override; // Wait until a portal is created (either newly or through adoption). Portal* WaitUntilPortalCreated();
diff --git a/content/test/test_render_frame.cc b/content/test/test_render_frame.cc index be0d2521..3faee1ed 100644 --- a/content/test/test_render_frame.cc +++ b/content/test/test_render_frame.cc
@@ -150,25 +150,29 @@ std::move(browser_interface_broker_receiver)); } - void CreatePortal(mojo::PendingAssociatedReceiver<blink::mojom::Portal>, - mojo::PendingAssociatedRemote<blink::mojom::PortalClient>, - CreatePortalCallback callback) override { - std::move(callback).Run(MSG_ROUTING_NONE, - blink::mojom::FrameReplicationState::New(), + void CreatePortal( + mojo::PendingAssociatedReceiver<blink::mojom::Portal>, + mojo::PendingAssociatedRemote<blink::mojom::PortalClient>, + mojom::RemoteFrameInterfacesFromRendererPtr remote_frame_interfaces, + CreatePortalCallback callback) override { + std::move(callback).Run(blink::mojom::FrameReplicationState::New(), blink::PortalToken(), blink::RemoteFrameToken(), base::UnguessableToken()); } - void AdoptPortal(const blink::PortalToken&, - AdoptPortalCallback callback) override { - std::move(callback).Run( - MSG_ROUTING_NONE, blink::mojom::FrameReplicationState::New(), - blink::RemoteFrameToken(), base::UnguessableToken()); + void AdoptPortal( + const blink::PortalToken&, + mojom::RemoteFrameInterfacesFromRendererPtr remote_frame_interfaces, + AdoptPortalCallback callback) override { + std::move(callback).Run(blink::mojom::FrameReplicationState::New(), + blink::RemoteFrameToken(), + base::UnguessableToken()); } void CreateFencedFrame( mojo::PendingAssociatedReceiver<blink::mojom::FencedFrameOwnerHost>, blink::mojom::FencedFrameMode, + mojom::RemoteFrameInterfacesFromRendererPtr remote_frame_interfaces, CreateFencedFrameCallback) override { NOTREACHED() << "At the moment, content::FencedFrame is not used in any " "unit tests, so this path should not be hit";
diff --git a/content/test/test_render_frame_host.cc b/content/test/test_render_frame_host.cc index f0e26d19..77df4e0 100644 --- a/content/test/test_render_frame_host.cc +++ b/content/test/test_render_frame_host.cc
@@ -271,7 +271,17 @@ fenced_frames_.push_back( std::make_unique<FencedFrame>(weak_ptr_factory_.GetSafeRef(), mode)); FencedFrame* fenced_frame = fenced_frames_.back().get(); - fenced_frame->CreateProxyAndAttachToOuterFrameTree(); + // Create stub RemoteFrameInterfaces. + auto remote_frame_interfaces = + mojom::RemoteFrameInterfacesFromRenderer::New(); + remote_frame_interfaces->frame_host_receiver = + mojo::AssociatedRemote<blink::mojom::RemoteFrameHost>() + .BindNewEndpointAndPassDedicatedReceiver(); + mojo::AssociatedRemote<blink::mojom::RemoteFrame> frame; + std::ignore = frame.BindNewEndpointAndPassDedicatedReceiver(); + remote_frame_interfaces->frame = frame.Unbind(); + fenced_frame->CreateProxyAndAttachToOuterFrameTree( + std::move(remote_frame_interfaces)); return static_cast<TestRenderFrameHost*>(fenced_frame->GetInnerRoot()); }
diff --git a/content/test/test_render_view_host.cc b/content/test/test_render_view_host.cc index 53fc7797..3501b4a 100644 --- a/content/test/test_render_view_host.cc +++ b/content/test/test_render_view_host.cc
@@ -411,6 +411,13 @@ } else { // Pretend that mojo connections of the RemoteFrame is transferred to // renderer process and bound in blink. + mojo::AssociatedRemote<blink::mojom::RemoteFrame> remote_frame; + std::ignore = remote_frame.BindNewEndpointAndPassDedicatedReceiver(); + proxy_host->BindRemoteFrameInterfaces( + remote_frame.Unbind(), + mojo::AssociatedRemote<blink::mojom::RemoteFrameHost>() + .BindNewEndpointAndPassDedicatedReceiver()); + mojo::AssociatedRemote<blink::mojom::RemoteMainFrame> remote_main_frame; std::ignore = remote_main_frame.BindNewEndpointAndPassDedicatedReceiver(); proxy_host->BindRemoteMainFrameInterfaces(
diff --git a/content/test/test_web_contents.cc b/content/test/test_web_contents.cc index 5bf6096..be5d949f 100644 --- a/content/test/test_web_contents.cc +++ b/content/test/test_web_contents.cc
@@ -412,7 +412,17 @@ auto portal = std::make_unique<Portal>(GetPrimaryMainFrame(), std::move(web_contents)); const blink::PortalToken& token = portal->portal_token(); - portal->CreateProxyAndAttachPortal(); + // Create stub RemoteFrameInterfaces. + auto remote_frame_interfaces = + mojom::RemoteFrameInterfacesFromRenderer::New(); + remote_frame_interfaces->frame_host_receiver = + mojo::AssociatedRemote<blink::mojom::RemoteFrameHost>() + .BindNewEndpointAndPassDedicatedReceiver(); + mojo::AssociatedRemote<blink::mojom::RemoteFrame> frame; + std::ignore = frame.BindNewEndpointAndPassDedicatedReceiver(); + remote_frame_interfaces->frame = frame.Unbind(); + + portal->CreateProxyAndAttachPortal(std::move(remote_frame_interfaces)); GetPrimaryMainFrame()->OnPortalCreatedForTesting(std::move(portal)); return token; }
diff --git a/fuchsia_web/webengine/DEPS b/fuchsia_web/webengine/DEPS index 750477e..4b02381 100644 --- a/fuchsia_web/webengine/DEPS +++ b/fuchsia_web/webengine/DEPS
@@ -1,7 +1,5 @@ include_rules = [ # Do NOT add components/cast or other Cast-specific code to this file. - "+components/cast/message_port", - "+components/cast_streaming", "+components/embedder_support", "+components/fuchsia_component_support", "+components/media_control",
diff --git a/fuchsia_web/webengine/browser/DEPS b/fuchsia_web/webengine/browser/DEPS index 047aa96..15da599e 100644 --- a/fuchsia_web/webengine/browser/DEPS +++ b/fuchsia_web/webengine/browser/DEPS
@@ -58,4 +58,21 @@ "explicit_sites_filter_browsertest.cc": [ "+components/safe_search_api", ], + + # Exceptions related to Cast Streaming. + "cast_streaming_browsertest\.cc" : [ + "+components/cast/message_port", + "+components/cast_streaming/browser/test", + ], + "context_impl\.cc" : [ + "+components/cast_streaming/browser/public" + ], + "receiver_session_client\.cc" : [ + "+components/cast/message_port", + "+components/cast_streaming/browser/public", + "+components/cast_streaming/public", + ], + "receiver_session_client\.h" : [ + "+components/cast_streaming/public/mojom" + ] }
diff --git a/fuchsia_web/webengine/browser/receiver_session_client.cc b/fuchsia_web/webengine/browser/receiver_session_client.cc index 8b04089..310667f 100644 --- a/fuchsia_web/webengine/browser/receiver_session_client.cc +++ b/fuchsia_web/webengine/browser/receiver_session_client.cc
@@ -6,6 +6,8 @@ #include "base/bind.h" #include "components/cast/message_port/fuchsia/message_port_fuchsia.h" +#include "components/cast/message_port/message_port.h" +#include "components/cast_streaming/browser/public/receiver_session.h" #include "components/cast_streaming/public/config_conversions.h" #include "media/base/audio_decoder_config.h" #include "media/base/video_decoder_config.h"
diff --git a/fuchsia_web/webengine/browser/receiver_session_client.h b/fuchsia_web/webengine/browser/receiver_session_client.h index 4b5dd54..1e69cd3 100644 --- a/fuchsia_web/webengine/browser/receiver_session_client.h +++ b/fuchsia_web/webengine/browser/receiver_session_client.h
@@ -8,10 +8,14 @@ #include <fuchsia/web/cpp/fidl.h> #include "base/callback.h" -#include "components/cast/message_port/message_port.h" -#include "components/cast_streaming/browser/public/receiver_session.h" +#include "components/cast_streaming/public/mojom/demuxer_connector.mojom.h" +#include "mojo/public/cpp/bindings/associated_remote.h" #include "third_party/openscreen/src/cast/common/public/message_port.h" +namespace cast_streaming { +class ReceiverSession; +} // namespace cast_streaming + // Holds a Cast Streaming Receiver Session. class ReceiverSessionClient { public:
diff --git a/fuchsia_web/webengine/renderer/DEPS b/fuchsia_web/webengine/renderer/DEPS index 315e6ff9..1d6ab417d 100644 --- a/fuchsia_web/webengine/renderer/DEPS +++ b/fuchsia_web/webengine/renderer/DEPS
@@ -12,3 +12,10 @@ "+services/service_manager/public/cpp", "+third_party/blink/public", ] + +specific_include_rules = { + # Exceptions related to Cast Streaming. + "web_engine_content_renderer_client\.cc" : [ + "+components/cast_streaming/renderer/public" + ] +}
diff --git a/headless/lib/browser/protocol/page_handler.cc b/headless/lib/browser/protocol/page_handler.cc index 4f601ce..edcbbcd 100644 --- a/headless/lib/browser/protocol/page_handler.cc +++ b/headless/lib/browser/protocol/page_handler.cc
@@ -8,6 +8,7 @@ #include "content/public/browser/web_contents.h" #if BUILDFLAG(ENABLE_PRINTING) +#include "components/printing/browser/print_to_pdf/pdf_print_result.h" #include "components/printing/browser/print_to_pdf/pdf_print_utils.h" #include "third_party/abseil-cpp/absl/types/optional.h" #endif @@ -103,15 +104,14 @@ } #if BUILDFLAG(ENABLE_PRINTING) -void PageHandler::PDFCreated( - bool return_as_stream, - std::unique_ptr<PrintToPDFCallback> callback, - print_to_pdf::PdfPrintManager::PrintResult print_result, - scoped_refptr<base::RefCountedMemory> data) { +void PageHandler::PDFCreated(bool return_as_stream, + std::unique_ptr<PrintToPDFCallback> callback, + print_to_pdf::PdfPrintResult print_result, + scoped_refptr<base::RefCountedMemory> data) { std::unique_ptr<base::DictionaryValue> response; - if (print_result != print_to_pdf::PdfPrintManager::PRINT_SUCCESS) { + if (print_result != print_to_pdf::PdfPrintResult::PRINT_SUCCESS) { callback->sendFailure(Response::ServerError( - print_to_pdf::PdfPrintManager::PrintResultToString(print_result))); + print_to_pdf::PdfPrintResultToString(print_result))); return; }
diff --git a/headless/lib/browser/protocol/page_handler.h b/headless/lib/browser/protocol/page_handler.h index c3df7f1f3..59c47475 100644 --- a/headless/lib/browser/protocol/page_handler.h +++ b/headless/lib/browser/protocol/page_handler.h
@@ -13,6 +13,7 @@ #if BUILDFLAG(ENABLE_PRINTING) #include "components/printing/browser/print_to_pdf/pdf_print_manager.h" +#include "components/printing/browser/print_to_pdf/pdf_print_result.h" #include "headless/public/headless_export.h" #endif @@ -59,7 +60,7 @@ #if BUILDFLAG(ENABLE_PRINTING) void PDFCreated(bool return_as_stream, std::unique_ptr<PrintToPDFCallback> callback, - print_to_pdf::PdfPrintManager::PrintResult print_result, + print_to_pdf::PdfPrintResult print_result, scoped_refptr<base::RefCountedMemory> data); #endif
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_am.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_am.xtb index 9ee07efd..8f065e43 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_am.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_am.xtb
@@ -73,6 +73,7 @@ <translation id="5945387852661427312">በ<ph name="DOMAIN" /> ከሚተዳደር መለያ ዘግተው እየወጡና ለአስተዳዳሪው ሙሉውን በChromium ውሂብዎ ቁጥጥር እየሰጡ ነው። የእርስዎ ውሂብ እስከመጨረሻው ከዚህ መለያ ጋር ይተሳሰራል። ከChromium ዘግቶ መውጣት ውሂብዎን ከዚህ መሣሪያ ይሰርዘዋል፣ ነገር ግን በእርስዎ Google መለያ ላይ እንደተከማቸ ይቆያል።</translation> <translation id="5983312940147103417">Chromiumን የተሻለ ያድርጉት</translation> <translation id="602807004951640891">Chromium በመጠቀምዎ በ<ph name="BEGIN_LINK_TOS" />አገልግሎት ውሉ<ph name="END_LINK_TOS" /> ተስማማተዋል።</translation> +<translation id="6062449165341879460">በዚህ መለያ ውስጥ ለሚያከማቿቸው የእርስዎ የChromium ውሂብ፣ እልባቶች፣ ታሪክ፣ የይለፍ ቃላት እና ሌሎች ቅንብሮች ድርጅትዎ <ph name="DOMAIN" /> መዳረሻ ይኖረዋል። ዘግተው በሚወጡበት ጊዜ፣ ውሂብዎ ከዚህ መሣሪያ ላይ ይጸዳል። ሆኖም፣ ውሂብዎ በሚተዳደር የGoogle መለያዎ እንደተከማቸ የሚቆይ እና ለድርጅትዎ የሚገኝ ይሆናል። እንዲሁም ድርጅትዎ ለዚያ መለያ የChromium ባህሪን ሊቀይሩ የሚችሉ የተወሰኑ የተጠቃሚ መመሪያዎችን ማቀናበር ይችላል።</translation> <translation id="6119647025869519954">Chromiumን የእርስዎ ነባሪ ለማድረግ፦ 1. ቅንብሮችን ይክፈቱ 2. ነባሪ የአሳሽ መተግበሪያን መታ ያድርጉ
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_fr-CA.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_fr-CA.xtb index bd033f0..5a7e7cc 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_fr-CA.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_fr-CA.xtb
@@ -74,6 +74,7 @@ <translation id="5945387852661427312">Vous vous connectez avec un compte géré par <ph name="DOMAIN" />, et son administrateur pourra contrôler vos données Chromium. Celles-ci seront définitivement liées à votre compte. En vous déconnectant de Chromium, vous supprimerez vos données sur cet appareil, mais celles-ci resteront stockées dans votre compte Google.</translation> <translation id="5983312940147103417">Contribuez à améliorer Chromium</translation> <translation id="602807004951640891">En utilisant Chromium, vous acceptez les <ph name="BEGIN_LINK_TOS" />conditions d'utilisation<ph name="END_LINK_TOS" />.</translation> +<translation id="6062449165341879460">Votre organisation <ph name="DOMAIN" /> aura accès à vos données, favoris, historique, mots de passe et autres paramètres Chromium que vous stockez dans ce compte. Lorsque vous vous déconnectez, vos données sont effacées de cet appareil. Cependant, vos données restent stockées dans votre compte Google géré et sont disponibles pour votre organisation. Votre organisation peut également définir des politiques relatives aux utilisateurs propres à ce compte, lesquelles peuvent modifier le comportement de Chromium.</translation> <translation id="6119647025869519954">Pour faire de Chromium votre navigateur par défaut : 1. Ouvrez l'application Réglages. 2. Touchez Navigateur par défaut.
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_lo.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_lo.xtb index fcaa3729..fb468d9 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_lo.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_lo.xtb
@@ -74,6 +74,7 @@ <translation id="5945387852661427312">ທ່ານກຳລັງເຂົ້າສູ່ລະບົບດ້ວຍບັນຊີທີ່ຖືກຈັດການໂດຍ <ph name="DOMAIN" /> ແລະ ກຳລັງໃຫ້ການຄວບຄຸມຂໍ້ມູນ Chromium ຂອງທ່ານແກ່ຜູ້ເບິ່ງແຍງລະບົບຂອງມັນ. ຂໍ້ມູນຂອງທ່ານຈະຖືກເຊື່ອມໂຍງຢ່າງຖາວອນກັບບັນຊີນີ້. ການອອກຈາກລະບົບ Chromium ຈະລຶບຂໍ້ມູນຂອງທ່ານອອກຈາກອຸປະກອນນີ້, ແຕ່ຂໍ້ມູນຈະຍັງຄົງຖືກຮັກສາໄວ້ຢູ່ໃນບັນຊີ Google ຂອງທ່ານ.</translation> <translation id="5983312940147103417">ເຮັດໃຫ້ Chromium ດີຂຶ້ນ</translation> <translation id="602807004951640891">ໂດຍການໃຊ້ Chromium, ແມ່ນຖືວ່າທ່ານເຫັນນຳ <ph name="BEGIN_LINK_TOS" />ຂໍ້ກຳນົດການບໍລິການ<ph name="END_LINK_TOS" />.</translation> +<translation id="6062449165341879460">ອົງການຂອງທ່ານ <ph name="DOMAIN" /> ຈະມີສິດເຂົ້າເຖິງດາຕາ Chromium, ບຸກມາກ, ປະຫວັດ, ລະຫັດຜ່ານ ແລະ ການຕັ້ງຄ່າອື່ນໆຂອງທ່ານທີ່ທ່ານເກັບໄວ້ຢູ່ໃນບັນຊີນີ້. ເມື່ອທ່ານອອກຈາກລະບົບ, ຂໍ້ມູນຂອງທ່ານຈະຖືກລຶບລ້າງອອກຈາກອຸປະກອນນີ້. ແນວໃດກໍຕາມ, ຂໍ້ມູນຂອງທ່ານຈະຍັງຄົງຖືກເກັບມ້ຽນຢູ່ໃນບັນຊີ Google ທີ່ມີການຈັດການຂອງທ່ານ ແລະ ມີໃຫ້ສຳລັບອົງການຂອງທ່ານ. ອົງການຂອງທ່ານຍັງສາມາດຕັ້ງນະໂຍບາຍສຳລັບຜູ້ໃຊ້ເພື່ອກຳນົດສະເພາະໃຫ້ແກ່ບັນຊີທີ່ສາມາດປ່ຽນແປງການປະພຶດຂອງ Chromium ໄດ້ນຳອີກ.</translation> <translation id="6119647025869519954">ເພື່ອເຮັດໃຫ້ Chromium ເປັນໂປຣແກຣມເລີ່ມຕົ້ນຂອງທ່ານ: 1. ເປີດການຕັ້ງຄ່າ ແຕະແອັບໂປຣແກຣມທ່ອງເວັບເລີ່ມຕົ້ນ 3. ເລືອກ Chromium.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_am.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_am.xtb index 8019d29..55d5107 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_am.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_am.xtb
@@ -109,6 +109,7 @@ <translation id="766361182512894255">የይለፍ ቃልዎ በውሂብ ጥሰት ውስጥ ተጋልጧል። Chrome የይለፍ ቃልን አሁኑኑ እንዲቀይሩ ይመክራል።</translation> <translation id="7693590760643069321">አገናኞችን በመልዕክቶች፣ በሰነዶች እና በሌሎች መተግበሪያዎች ውስጥ መታ በሚያደርጉበት ጊዜ ሁሉ Chromeን አሁን መጠቀም ይችላሉ።</translation> <translation id="7698568245838009292">Chrome ካሜራውን መድረስ ይፈልጋል</translation> +<translation id="7754633291442704733">ድርጅትዎ <ph name="DOMAIN" /> በዚህ መለያ ወደሚያከማቹት የእርስዎ Chrome ውሂብ፣ እልባቶች፣ ታሪክ፣ የይለፍ ቃላት እና ሌሎች ቅንብሮች መድረስ ይችላል። ዘግተው በሚወጡበት ጊዜ፣ ውሂብዎ ከዚህ መሣሪያ ላይ ይጸዳል። ሆኖም፣ ውሂብዎ በሚተዳደር የGoogle መለያዎ እንደተከማቸ የሚቆይ እና ለድርጅትዎ የሚገኝ ይሆናል። እንዲሁም ድርጅትዎ የChromeን ባህሪ መቀየር የሚችሉ ለዚያ መለያ የተወሰኑ የተጠቃሚ መመሪያዎችን ማቀናበር ይችላል።</translation> <translation id="7780154209050837198">ከChrome የበለጠ ለማግኘት በGoogle መለያዎ ወደ Chrome ይግቡ።</translation> <translation id="7855730255114109580">Google Chrome የተዘመነ ነው</translation> <translation id="8022947259858476807">አገናኞችን ለመክፈት፣ ከመግብሮች ለመፈለግ እና በሌሎች መተግበሪያዎች ውስጥ የይለፍ ቃሎችን የራስ-ለመሙላት በነባሪነት Chrome ን ይጠቀሙ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fr-CA.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fr-CA.xtb index 9856ec1..a8070a2 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fr-CA.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fr-CA.xtb
@@ -109,6 +109,7 @@ <translation id="766361182512894255">Votre mot de passe a été exposé dans une violation de données. Chromium vous recommande de modifier ce mot de passe maintenant.</translation> <translation id="7693590760643069321">Vous pouvez maintenant utiliser Chrome chaque fois que vous touchez des liens dans des messages, des documents et des applications.</translation> <translation id="7698568245838009292">Chrome souhaite accéder à l'appareil photo</translation> +<translation id="7754633291442704733">Votre organisation <ph name="DOMAIN" /> aura accès à vos données, favoris, historique, mots de passe et autres paramètres Chrome que vous stockez dans ce compte. Lorsque vous vous déconnectez, vos données sont effacées de cet appareil. Cependant, vos données restent stockées dans votre compte Google géré et sont disponibles pour votre organisation. Votre organisation peut également définir des politiques relatives aux utilisateurs propres à ce compte, lesquelles peuvent modifier le comportement de Chrome.</translation> <translation id="7780154209050837198">Connectez-vous à Chrome avec votre compte Google pour en tirer le meilleur parti.</translation> <translation id="7855730255114109580">Google Chrome est à jour</translation> <translation id="8022947259858476807">Utilisez Chrome par défaut pour ouvrir des liens, faire des recherches dans des widgets et entrer automatiquement des mots de passe dans d'autres applications</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_lo.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_lo.xtb index c1bc4764..aa41c21f 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_lo.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_lo.xtb
@@ -109,6 +109,7 @@ <translation id="766361182512894255">ລະຫັດຜ່ານຂອງທ່ານຮົ່ວໄຫຼໃນການລະເມີດຂໍ້ມູນ. Chrome ແນະນຳໃຫ້ປ່ຽນລະຫັດຜ່ານຕອນນີ້ເລີຍ.</translation> <translation id="7693590760643069321">ຕອນນີ້ທ່ານສາມາດໃຊ້ Chrome ຕອນໃດກໍໄດ້ທີ່ທ່ານແຕະລິ້ງໃນຂໍ້ຄວາມ, ເອກະສານ ແລະ ແອັບອື່ນໆ.</translation> <translation id="7698568245838009292">Chrome ຕ້ອງການເຂົ້າເຖິງກ້ອງຖ່າຍຮູບ</translation> +<translation id="7754633291442704733">ອົງການຂອງທ່ານ <ph name="DOMAIN" /> ຈະມີສິດເຂົ້າເຖິງດາຕາ Chrome, ບຸກມາກ, ປະຫວັດ, ລະຫັດຜ່ານ ແລະ ການຕັ້ງຄ່າອື່ນໆຂອງທ່ານທີ່ທ່ານເກັບໄວ້ຢູ່ໃນບັນຊີນີ້. ເມື່ອທ່ານອອກຈາກລະບົບ, ຂໍ້ມູນຂອງທ່ານຈະຖືກລຶບລ້າງອອກຈາກອຸປະກອນນີ້. ແນວໃດກໍຕາມ, ຂໍ້ມູນຂອງທ່ານຈະຍັງຄົງຖືກເກັບມ້ຽນຢູ່ໃນບັນຊີ Google ທີ່ມີການຈັດການຂອງທ່ານ ແລະ ມີໃຫ້ສຳລັບອົງການຂອງທ່ານ. ອົງການຂອງທ່ານຍັງສາມາດຕັ້ງນະໂຍບາຍສຳລັບຜູ້ໃຊ້ເພື່ອກຳນົດສະເພາະໃຫ້ແກ່ບັນຊີທີ່ສາມາດປ່ຽນແປງການປະພຶດຂອງ Chrome ໄດ້ນຳອີກ.</translation> <translation id="7780154209050837198">ເພື່ອໃຊ້ປະໂຫຍດສູງສຸດຈາກ Chrome, ໃຫ້ເຂົ້າສູ່ລະບົບ Chrome ດ້ວຍບັນຊີ Google ຂອງທ່ານ.</translation> <translation id="7855730255114109580">Google Chrome ແມ່ນເວີຊັນໃໝ່ຫຼ້າສຸດແລ້ວ</translation> <translation id="8022947259858476807">ໃຊ້ Chrome ເປັນຄ່າເລີ່ມຕົ້ນເພື່ອເປີດລິ້ງ, ຊອກຫາຈາກວິດເຈັດ ແລະ ການຕື່ມຂໍ້ມູນລະຫັດຜ່ານອັດຕະໂນມັດໃນແອັບອື່ນໆ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb index a20f9d0..749d0e20 100644 --- a/ios/chrome/app/strings/resources/ios_strings_am.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -17,6 +17,7 @@ <translation id="1063454504051558093">ሌላ የይለፍ ቃል ይጠቀሙ...</translation> <translation id="1066060668811609597">ስምረትን ያቀናብሩ</translation> <translation id="1076421457278169141">ኮድ ተቃኝቷል</translation> +<translation id="1076785341346483463">በሚተዳደር መለያ ያስምሩ</translation> <translation id="1084365883616172403">የFacebook ልጥፍ ተጠናቅቋል።</translation> <translation id="1103523840287552314">ሁልጊዜ <ph name="LANGUAGE" />ን መተርጎም</translation> <translation id="1104948393051856124">ተቀበል እና ቀጥል</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 4945e81..40444592 100644 --- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -441,6 +441,7 @@ <translation id="4751645464639803239">New incognito tab</translation> <translation id="4775879719735953715">Default Browser</translation> <translation id="4778644898150334464">Use other password</translation> +<translation id="478808905805139173">Open in Incognito?</translation> <translation id="4802417911091824046">Passphrase encryption doesn’t include payment methods and addresses from Google Pay. To change this setting, <ph name="BEGIN_LINK" />reset sync<ph name="END_LINK" /></translation> @@ -961,6 +962,7 @@ <translation id="9055772144595778347">Cannot Sign In</translation> <translation id="9057972802061533987">Can't follow. Something went wrong.</translation> <translation id="9065203028668620118">Edit</translation> +<translation id="9068336935206019333">Open in Chrome Incognito</translation> <translation id="9079935439869366234">Mark All Unread</translation> <translation id="9081058212938299310">Update password for <ph name="USERNAME" />?</translation> <translation id="9083392325882095631">1 item</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 25926d0..0fdb68a8 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
@@ -17,6 +17,7 @@ <translation id="1063454504051558093">Utiliser un autre mot de passe…</translation> <translation id="1066060668811609597">Gérer la synchronisation</translation> <translation id="1076421457278169141">Code numérisé</translation> +<translation id="1076785341346483463">Synchroniser avec un compte géré</translation> <translation id="1084365883616172403">Message Facebook terminé.</translation> <translation id="1103523840287552314">Toujours traduire les pages rédigées en <ph name="LANGUAGE" /></translation> <translation id="1104948393051856124">Accepter et continuer</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lo.xtb b/ios/chrome/app/strings/resources/ios_strings_lo.xtb index 21bf4fee..11a2f52 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lo.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
@@ -17,6 +17,7 @@ <translation id="1063454504051558093">ໃຊ້ລະຫັດຜ່ານອື່ນ...</translation> <translation id="1066060668811609597">ຈັດການການຊິ້ງຂໍ້ມູນ</translation> <translation id="1076421457278169141">ສະແກນລະຫັດແລ້ວ</translation> +<translation id="1076785341346483463">ຊິ້ງໂດຍບັນຊີທີ່ມີການຈັດການ</translation> <translation id="1084365883616172403">ການໂພສທ໌ Facebook ສຳເລັດ.</translation> <translation id="1103523840287552314">ແປ <ph name="LANGUAGE" /> ຢູ່ສະເໝີ</translation> <translation id="1104948393051856124">ຍອມຮັບ ແລະສືບຕໍ່</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mk.xtb b/ios/chrome/app/strings/resources/ios_strings_mk.xtb index 9ddc7305..aae1a3c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mk.xtb
@@ -441,6 +441,7 @@ <translation id="4751645464639803239">Нова инкогнито картичка</translation> <translation id="4775879719735953715">Стандарден прелистувач</translation> <translation id="4778644898150334464">Употребете друга лозинка</translation> +<translation id="478808905805139173">Да се отвори во „Инкогнито“?</translation> <translation id="4802417911091824046">Шифрирањето на лозинката не ги вклучува начините на плаќање и адресите од Google Pay. За да ја промените поставкава, <ph name="BEGIN_LINK" />ресетирајте ја синхронизацијата<ph name="END_LINK" /></translation> @@ -961,6 +962,7 @@ <translation id="9055772144595778347">Не може да се најави</translation> <translation id="9057972802061533987">Не може да се следи. Нешто тргна наопаку.</translation> <translation id="9065203028668620118">Измени</translation> +<translation id="9068336935206019333">Отвори во „Инкогнито“ на Chrome</translation> <translation id="9079935439869366234">Означи ги сите како непрочитани</translation> <translation id="9081058212938299310">Да се ажурира лозинката за <ph name="USERNAME" />?</translation> <translation id="9083392325882095631">1 ставка</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_strings_mn.xtb index 5687ccd3..37639a4 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
@@ -441,6 +441,7 @@ <translation id="4751645464639803239">Нууцлалын шинэ таб</translation> <translation id="4775879719735953715">Өгөгдмөл хөтөч</translation> <translation id="4778644898150334464">Өөр нууц үг ашиглах</translation> +<translation id="478808905805139173">Нууцлалтай горимд нээх үү?</translation> <translation id="4802417911091824046">Нэвтрэх үгийн шифрлэлтэд Google Pay-н төлбөрийн хэрэгслүүд болон хаягуудыг агуулдаггүй. Энэ тохиргоог өөрчлөхийн тулд <ph name="BEGIN_LINK" />синкийг шинэчилнэ үү<ph name="END_LINK" /></translation> <translation id="4803185665210547709">Танай байгууллагаас удирддаг. @@ -960,6 +961,7 @@ <translation id="9055772144595778347">Нэвтэрч чадахгүй байна</translation> <translation id="9057972802061533987">Дагах боломжгүй. Алдаа гарлаа.</translation> <translation id="9065203028668620118">Засварлах</translation> +<translation id="9068336935206019333">Chrome-н Нууцлалтай горимд нээх үү?</translation> <translation id="9079935439869366234">Бүгдийг уншаагүй гэж тэмдэглэх</translation> <translation id="9081058212938299310"><ph name="USERNAME" />-н нууц үгийг шинэчлэх үү?</translation> <translation id="9083392325882095631">1 зүйл</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb index a1aa871..516a627 100644 --- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -441,6 +441,7 @@ <translation id="4751645464639803239">Nieuw incognitotabblad</translation> <translation id="4775879719735953715">Standaardbrowser</translation> <translation id="4778644898150334464">Ander wachtwoord gebruiken</translation> +<translation id="478808905805139173">Openen in incognitomodus?</translation> <translation id="4802417911091824046">Wachtwoordzinversleuteling is niet van toepassing op betaalmethoden en adressen van Google Pay. <ph name="BEGIN_LINK" />Reset de synchronisatie<ph name="END_LINK" /> als je deze instelling wilt wijzigen.</translation> @@ -961,6 +962,7 @@ <translation id="9055772144595778347">Kan niet inloggen</translation> <translation id="9057972802061533987">Volgen is mislukt. Er is iets misgegaan.</translation> <translation id="9065203028668620118">Bewerken</translation> +<translation id="9068336935206019333">Openen in Chrome-incognitomodus</translation> <translation id="9079935439869366234">Alles als ongelezen markeren</translation> <translation id="9081058212938299310">Wachtwoord voor <ph name="USERNAME" /> updaten?</translation> <translation id="9083392325882095631">1 item</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb index d62fe804..c7ed997 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -439,6 +439,7 @@ <translation id="4751645464639803239">Nowa karta incognito</translation> <translation id="4775879719735953715">Domyślna przeglądarka</translation> <translation id="4778644898150334464">Użyj innego hasła</translation> +<translation id="478808905805139173">Otworzyć w trybie incognito?</translation> <translation id="4802417911091824046">Szyfrowanie hasłem nie obejmuje form płatności ani adresów w Google Pay. Aby zmienić to ustawienie, <ph name="BEGIN_LINK" />zresetuj synchronizację<ph name="END_LINK" />.</translation> @@ -959,6 +960,7 @@ <translation id="9055772144595778347">Nie można zalogować</translation> <translation id="9057972802061533987">Nie udało się dodać do obserwowanych. Coś poszło nie tak.</translation> <translation id="9065203028668620118">Edytuj</translation> +<translation id="9068336935206019333">Otwórz w Chrome w trybie incognito</translation> <translation id="9079935439869366234">Oznacz wszystkie jako nieprzeczytane</translation> <translation id="9081058212938299310">Zaktualizować hasło dla <ph name="USERNAME" />?</translation> <translation id="9083392325882095631">Jeden element</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb index c5b6890..1b2615f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
@@ -441,6 +441,7 @@ <translation id="4751645464639803239">Nova kartica bez arhiviranja</translation> <translation id="4775879719735953715">Podrazumevani pregledač</translation> <translation id="4778644898150334464">Koristite drugu lozinku</translation> +<translation id="478808905805139173">Želite da otvorite u režimu bez arhiviranja?</translation> <translation id="4802417911091824046">Šifrovanje pomoću pristupne fraze ne obuhvata načine plaćanja i adrese iz Google Pay-a. Da biste promenili ovo podešavanje, <ph name="BEGIN_LINK" />resetujte sinhronizaciju<ph name="END_LINK" /></translation> @@ -961,6 +962,7 @@ <translation id="9055772144595778347">Prijavljivanje nije uspelo</translation> <translation id="9057972802061533987">Praćenje nije uspelo. Došlo je do greške.</translation> <translation id="9065203028668620118">Izmeni</translation> +<translation id="9068336935206019333">Otvori u Chrome režimu bez arhiviranja</translation> <translation id="9079935439869366234">Označi sve kao nepročitano</translation> <translation id="9081058212938299310">Želite li da ažurirate lozinku za <ph name="USERNAME" />?</translation> <translation id="9083392325882095631">1 stavka</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb index 9d0d208..03bc218 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -441,6 +441,7 @@ <translation id="4751645464639803239">Нова картица без архивирањa</translation> <translation id="4775879719735953715">Подразумевани прегледач</translation> <translation id="4778644898150334464">Користите другу лозинку</translation> +<translation id="478808905805139173">Желите да отворите у режиму без архивирања?</translation> <translation id="4802417911091824046">Шифровање помоћу приступне фразе не обухвата начине плаћања и адресе из Google Pay-а. Да бисте променили ово подешавање, <ph name="BEGIN_LINK" />ресетујте синхронизацију<ph name="END_LINK" /></translation> @@ -961,6 +962,7 @@ <translation id="9055772144595778347">Пријављивање није успело</translation> <translation id="9057972802061533987">Праћење није успело. Дошло је до грешке.</translation> <translation id="9065203028668620118">Измени</translation> +<translation id="9068336935206019333">Отвори у Chrome режиму без архивирања</translation> <translation id="9079935439869366234">Означи све као непрочитано</translation> <translation id="9081058212938299310">Желите ли да ажурирате лозинку за <ph name="USERNAME" />?</translation> <translation id="9083392325882095631">1 ставка</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb index 2edf230..0769b799 100644 --- a/ios/chrome/app/strings/resources/ios_strings_th.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -441,6 +441,7 @@ <translation id="4751645464639803239">แท็บไม่ระบุตัวตนใหม่</translation> <translation id="4775879719735953715">เบราว์เซอร์เริ่มต้น</translation> <translation id="4778644898150334464">ใช้รหัสผ่านอื่น</translation> +<translation id="478808905805139173">เปิดในโหมดไม่ระบุตัวตนไหม</translation> <translation id="4802417911091824046">การเข้ารหัสลับด้วยรหัสผ่านจะไม่รวมข้อมูลวิธีการชำระเงินและที่อยู่จาก Google Pay หากต้องการเปลี่ยนแปลงการตั้งค่านี้ ให้<ph name="BEGIN_LINK" />รีเซ็ตการซิงค์<ph name="END_LINK" /></translation> @@ -961,6 +962,7 @@ <translation id="9055772144595778347">ไม่สามารถลงชื่อเข้า</translation> <translation id="9057972802061533987">ติดตามไม่ได้ เกิดข้อผิดพลาด</translation> <translation id="9065203028668620118">แก้ไข</translation> +<translation id="9068336935206019333">เปิดในโหมดไม่ระบุตัวตนของ Chrome</translation> <translation id="9079935439869366234">ทำเครื่องหมายทั้งหมดว่ายังไม่ได้อ่าน</translation> <translation id="9081058212938299310">อัปเดตรหัสผ่านของ <ph name="USERNAME" /> ไหม</translation> <translation id="9083392325882095631">1 รายการ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_strings_uz.xtb index 2693b9d..224c6bb 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uz.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
@@ -441,6 +441,7 @@ <translation id="4751645464639803239">Yangi inkognito sahifa</translation> <translation id="4775879719735953715">Standart brauzer</translation> <translation id="4778644898150334464">Boshqa parol ishlatish</translation> +<translation id="478808905805139173">Inkognito rejimida ochilsinmi?</translation> <translation id="4802417911091824046">Kodli ibora yordamida shifrlanganda Google Pay manzillari va toʻlov usullari shifrlanmaydi. Bu sozlamani almashtirish uchun <ph name="BEGIN_LINK" />sinxronizatsiyani tiklang<ph name="END_LINK" /></translation> @@ -961,6 +962,7 @@ <translation id="9055772144595778347">Xatolik</translation> <translation id="9057972802061533987">Obuna qilinmadi. Xatolik yuz berdi.</translation> <translation id="9065203028668620118">O‘zgartirish</translation> +<translation id="9068336935206019333">Chrome Inkognito oynasida ochish</translation> <translation id="9079935439869366234">Hammasini o‘qilmagan deb belgilash</translation> <translation id="9081058212938299310"><ph name="USERNAME" /> paroli yangilansinmi?</translation> <translation id="9083392325882095631">1 ta xatcho‘p</translation>
diff --git a/ios/chrome/browser/app_launcher/app_launcher_abuse_detector.mm b/ios/chrome/browser/app_launcher/app_launcher_abuse_detector.mm index d3231504..9da1a2c 100644 --- a/ios/chrome/browser/app_launcher/app_launcher_abuse_detector.mm +++ b/ios/chrome/browser/app_launcher/app_launcher_abuse_detector.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/app_launcher/app_launcher_abuse_detector.h" +#import "base/metrics/histogram_macros.h" #include "base/strings/sys_string_conversions.h" #import "ios/chrome/browser/app_launcher/app_launching_state.h" #include "url/gurl.h" @@ -14,6 +15,19 @@ const int kMaxAllowedConsecutiveExternalAppLaunches = 2; +namespace { + +// Returns true iff `url`'s scheme is one that is used by other apps to launch +// Chrome. +bool HasChromeAppLaunchScheme(const GURL& url) { + return url.SchemeIs("googlechrome-x-callback") || + url.SchemeIs("chromium-x-callback") || url.SchemeIs("googlechrome") || + url.SchemeIs("chromium") || url.SchemeIs("googlechromes") || + url.SchemeIs("chromiums"); +} + +} // namespace + @interface AppLauncherAbuseDetector () // Maps between external application redirection key and state. // the key is a space separated combination of the absolute string for the @@ -55,6 +69,13 @@ - (ExternalAppLaunchPolicy)launchPolicyForURL:(const GURL&)URL fromSourcePageURL:(const GURL&)sourcePageURL { + // Treat an attempt to launch Chrome from within Chrome as abuse. + bool isChromeLaunchAttempt = HasChromeAppLaunchScheme(URL); + UMA_HISTOGRAM_BOOLEAN("IOS.AppLauncher.AppURLHasChromeLaunchScheme", + isChromeLaunchAttempt); + if (isChromeLaunchAttempt) + return ExternalAppLaunchPolicyBlock; + NSString* key = [[self class] stateKeyForAppURL:URL sourceURL:sourcePageURL]; // Don't block apps that are not registered with the abuse detector. if (!_appLaunchingStates[key])
diff --git a/ios/chrome/browser/app_launcher/app_launcher_abuse_detector_unittest.mm b/ios/chrome/browser/app_launcher/app_launcher_abuse_detector_unittest.mm index 60977261..aef6ab60 100644 --- a/ios/chrome/browser/app_launcher/app_launcher_abuse_detector_unittest.mm +++ b/ios/chrome/browser/app_launcher/app_launcher_abuse_detector_unittest.mm
@@ -156,3 +156,25 @@ [abuseDetector launchPolicyForURL:kAppUrl2 fromSourcePageURL:kSourceUrl2]); } + +// Tests blocking app launch when the target app is Chrome itself. +TEST_F(AppLauncherAbuseDetectorTest, TestBlockLaunchingChrome) { + const GURL kChromeAppUrl1("googlechrome://www.google.com"); + const GURL kChromeAppUrl2("googlechromes://www.google.com"); + const GURL kChromeAppUrl3("googlechrome-x-callback://www.google.com"); + const GURL kSourceUrl("http://www.google.com"); + + AppLauncherAbuseDetector* abuseDetector = + [[AppLauncherAbuseDetector alloc] init]; + EXPECT_EQ(ExternalAppLaunchPolicyBlock, + [abuseDetector launchPolicyForURL:kChromeAppUrl1 + fromSourcePageURL:kSourceUrl]); + + EXPECT_EQ(ExternalAppLaunchPolicyBlock, + [abuseDetector launchPolicyForURL:kChromeAppUrl2 + fromSourcePageURL:kSourceUrl]); + + EXPECT_EQ(ExternalAppLaunchPolicyBlock, + [abuseDetector launchPolicyForURL:kChromeAppUrl3 + fromSourcePageURL:kSourceUrl]); +}
diff --git a/ios/chrome/browser/follow/follow_tab_helper.mm b/ios/chrome/browser/follow/follow_tab_helper.mm index 8f4e4958..e2aa0ba1 100644 --- a/ios/chrome/browser/follow/follow_tab_helper.mm +++ b/ios/chrome/browser/follow/follow_tab_helper.mm
@@ -132,8 +132,10 @@ .GetFollowProvider() ->GetRecommendedStatus(web_page_urls); - // Do not show follow IPH if the site is not recommended. - if (!channel_recommended) + // Do not show follow IPH if: + // 1. The site is not recommended; + // 2. The IPH was shown too recently. + if (!channel_recommended || !IsFollowIPHShownFrequencyEligible()) return; // Check if the site has enough visit count.
diff --git a/ios/chrome/browser/follow/follow_util.h b/ios/chrome/browser/follow/follow_util.h index baf70d4..6cc4c53 100644 --- a/ios/chrome/browser/follow/follow_util.h +++ b/ios/chrome/browser/follow/follow_util.h
@@ -11,7 +11,15 @@ class WebState; } +// Key used to store the last shown time of follow in-product help (IPH). +extern NSString* const kFollowIPHLastShownTime; + // Returns the Follow action state for |webState|. FollowActionState GetFollowActionState(web::WebState* webState); +#pragma mark - For Follow IPH +// Returns true if the time between the last time a Follow IPH was shown and now +// is long enough for another Follow IPH appearance. +bool IsFollowIPHShownFrequencyEligible(); + #endif // IOS_CHROME_BROWSER_FOLLOW_FOLLOW_UTIL_H_
diff --git a/ios/chrome/browser/follow/follow_util.mm b/ios/chrome/browser/follow/follow_util.mm index ee86d3f..0640e54 100644 --- a/ios/chrome/browser/follow/follow_util.mm +++ b/ios/chrome/browser/follow/follow_util.mm
@@ -16,6 +16,13 @@ #error "This file requires ARC support." #endif +namespace { +// Set the Follow IPH apperance threshold to 15 minutes. +NSTimeInterval const kFollowIPHAppearanceThresholdInSeconds = 15 * 60; +} // namespace + +NSString* const kFollowIPHLastShownTime = @"FollowIPHLastShownTime"; + FollowActionState GetFollowActionState(web::WebState* webState) { // This method should be called only if the feature flag has been enabled. DCHECK(IsWebChannelsEnabled()); @@ -46,3 +53,14 @@ } return FollowActionStateHidden; } + +#pragma mark - For Follow IPH +bool IsFollowIPHShownFrequencyEligible() { + NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; + NSDate* lastFollowIPHShownTime = + [defaults objectForKey:kFollowIPHLastShownTime]; + return ( + [[NSDate + dateWithTimeIntervalSinceNow:-kFollowIPHAppearanceThresholdInSeconds] + compare:lastFollowIPHShownTime] != NSOrderedAscending); +}
diff --git a/ios/chrome/browser/ui/bubble/BUILD.gn b/ios/chrome/browser/ui/bubble/BUILD.gn index cf5d574..6320a54 100644 --- a/ios/chrome/browser/ui/bubble/BUILD.gn +++ b/ios/chrome/browser/ui/bubble/BUILD.gn
@@ -25,6 +25,7 @@ "//ios/chrome/browser:chrome_url_constants", "//ios/chrome/browser/browser_state", "//ios/chrome/browser/feature_engagement", + "//ios/chrome/browser/follow:utils", "//ios/chrome/browser/ui/colors", "//ios/chrome/browser/ui/commands", "//ios/chrome/browser/ui/icons:symbols",
diff --git a/ios/chrome/browser/ui/bubble/bubble_presenter.mm b/ios/chrome/browser/ui/bubble/bubble_presenter.mm index 557c131..ef4f80f5 100644 --- a/ios/chrome/browser/ui/bubble/bubble_presenter.mm +++ b/ios/chrome/browser/ui/bubble/bubble_presenter.mm
@@ -14,6 +14,7 @@ #import "ios/chrome/browser/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/chrome_url_constants.h" #import "ios/chrome/browser/feature_engagement/tracker_factory.h" +#import "ios/chrome/browser/follow/follow_util.h" #import "ios/chrome/browser/ui/bubble/bubble_presenter_delegate.h" #import "ios/chrome/browser/ui/bubble/bubble_util.h" #import "ios/chrome/browser/ui/bubble/bubble_view_controller_presenter.h" @@ -245,6 +246,12 @@ return; self.followWhileBrowsingBubbleTipPresenter = presenter; + + // Store the time when showing the Follow IPH. Set it everytime so the value + // in NSUserDefault is always the last time a Follow IPH was shown. + NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; + [defaults setObject:[NSDate date] forKey:kFollowIPHLastShownTime]; + [defaults synchronize]; } - (void)presentDefaultSiteViewTipBubble {
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 bb436f8b..9ee491a 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
@@ -4,12 +4,12 @@ #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.h" -#include "base/check.h" -#include "base/ios/ios_util.h" -#include "base/mac/foundation_util.h" -#include "base/metrics/user_metrics.h" +#import "base/check.h" +#import "base/ios/ios_util.h" +#import "base/mac/foundation_util.h" +#import "base/metrics/user_metrics.h" #import "base/strings/sys_string_conversions.h" -#include "components/strings/grit/components_strings.h" +#import "components/strings/grit/components_strings.h" #import "ios/chrome/browser/ntp/new_tab_page_tab_helper.h" #import "ios/chrome/browser/ui/commands/application_commands.h" #import "ios/chrome/browser/ui/commands/browser_commands.h" @@ -29,13 +29,13 @@ #import "ios/chrome/browser/ui/start_surface/start_surface_features.h" #import "ios/chrome/browser/ui/toolbar/public/fakebox_focuser.h" #import "ios/chrome/browser/ui/toolbar/public/toolbar_utils.h" -#include "ios/chrome/browser/ui/ui_feature_flags.h" +#import "ios/chrome/browser/ui/ui_feature_flags.h" #import "ios/chrome/browser/ui/util/named_guide.h" -#include "ios/chrome/browser/ui/util/ui_util.h" +#import "ios/chrome/browser/ui/util/ui_util.h" #import "ios/chrome/browser/ui/util/uikit_ui_util.h" #import "ios/chrome/common/ui/util/constraints_ui_util.h" -#include "ios/chrome/grit/ios_strings.h" -#include "ui/base/l10n/l10n_util.h" +#import "ios/chrome/grit/ios_strings.h" +#import "ui/base/l10n/l10n_util.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -462,6 +462,7 @@ if ([self.delegate ignoreLoadRequests]) return; base::RecordAction(base::UserMetricsAction("MobileFakeViewNTPTapped")); + [self.delegate fakeboxTapped]; [self focusFakebox]; } @@ -469,6 +470,7 @@ if ([self.delegate ignoreLoadRequests]) return; base::RecordAction(base::UserMetricsAction("MobileFakeboxNTPTapped")); + [self.delegate fakeboxTapped]; [self focusFakebox]; }
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller_delegate.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller_delegate.h index b717bc6..247f5bc 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller_delegate.h +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller_delegate.h
@@ -25,6 +25,9 @@ // queueing multiple loads during this state. - (BOOL)ignoreLoadRequests; +// Indicates to the delegate that the fakebox was tapped. +- (void)fakeboxTapped; + @end #endif // IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_HEADER_VIEW_CONTROLLER_DELEGATE_H_
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 1917b45..ba32fd2e 100644 --- a/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm +++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm
@@ -4,19 +4,20 @@ #import "ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.h" -#include <memory> +#import <memory> -#include "base/mac/foundation_util.h" -#include "base/metrics/user_metrics.h" -#include "base/metrics/user_metrics_action.h" -#include "components/ntp_snippets/content_suggestions_service.h" -#include "components/ntp_snippets/features.h" +#import "base/mac/foundation_util.h" +#import "base/metrics/histogram_macros.h" +#import "base/metrics/user_metrics.h" +#import "base/metrics/user_metrics_action.h" +#import "components/ntp_snippets/content_suggestions_service.h" +#import "components/ntp_snippets/features.h" #import "components/signin/public/identity_manager/objc/identity_manager_observer_bridge.h" -#include "components/strings/grit/components_strings.h" -#include "ios/chrome/browser/browser_state/chrome_browser_state.h" -#include "ios/chrome/browser/chrome_url_constants.h" -#include "ios/chrome/browser/discover_feed/discover_feed_service.h" -#include "ios/chrome/browser/discover_feed/discover_feed_service_factory.h" +#import "components/strings/grit/components_strings.h" +#import "ios/chrome/browser/browser_state/chrome_browser_state.h" +#import "ios/chrome/browser/chrome_url_constants.h" +#import "ios/chrome/browser/discover_feed/discover_feed_service.h" +#import "ios/chrome/browser/discover_feed/discover_feed_service_factory.h" #import "ios/chrome/browser/metrics/new_tab_page_uma.h" #import "ios/chrome/browser/ntp/new_tab_page_tab_helper.h" #import "ios/chrome/browser/policy/policy_util.h" @@ -32,12 +33,13 @@ #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller_audience.h" #import "ios/chrome/browser/ui/content_suggestions/ntp_home_consumer.h" +#import "ios/chrome/browser/ui/content_suggestions/ntp_home_metrics.h" #import "ios/chrome/browser/ui/content_suggestions/user_account_image_update_delegate.h" #import "ios/chrome/browser/ui/ntp/feed_control_delegate.h" #import "ios/chrome/browser/ui/ntp/feed_metrics_recorder.h" #import "ios/chrome/browser/ui/ntp/feed_wrapper_view_controller.h" #import "ios/chrome/browser/ui/ntp/logo_vendor.h" -#include "ios/chrome/browser/ui/ntp/metrics.h" +#import "ios/chrome/browser/ui/ntp/metrics.h" #import "ios/chrome/browser/ui/ntp/new_tab_page_header_constants.h" #import "ios/chrome/browser/ui/ntp/new_tab_page_view_controller.h" #import "ios/chrome/browser/ui/util/uikit_ui_util.h" @@ -46,14 +48,14 @@ #import "ios/chrome/browser/voice/voice_search_availability.h" #import "ios/chrome/browser/web_state_list/web_state_list.h" #import "ios/chrome/common/ui/favicon/favicon_attributes.h" -#include "ios/chrome/grit/ios_strings.h" +#import "ios/chrome/grit/ios_strings.h" #import "ios/web/public/navigation/navigation_item.h" #import "ios/web/public/navigation/navigation_manager.h" -#include "ios/web/public/navigation/referrer.h" +#import "ios/web/public/navigation/referrer.h" #import "ios/web/public/web_state.h" #import "ios/web/public/web_state_observer_bridge.h" -#include "ui/base/l10n/l10n_util.h" -#include "url/gurl.h" +#import "ui/base/l10n/l10n_util.h" +#import "url/gurl.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -317,6 +319,20 @@ return NO; } +- (void)fakeboxTapped { + NewTabPageTabHelper* NTPHelper = + NewTabPageTabHelper::FromWebState(self.webState); + if (NTPHelper) { + if (NTPHelper->ShouldShowStartSurface()) { + UMA_HISTOGRAM_ENUMERATION("IOS.ContentSuggestions.ActionOnStartSurface", + IOSContentSuggestionsActionType::kFakebox); + } else { + UMA_HISTOGRAM_ENUMERATION("IOS.ContentSuggestions.ActionOnNTP", + IOSContentSuggestionsActionType::kFakebox); + } + } +} + #pragma mark - SearchEngineObserving - (void)searchEngineChanged {
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_metrics.h b/ios/chrome/browser/ui/content_suggestions/ntp_home_metrics.h index 57a33796..2f7523b 100644 --- a/ios/chrome/browser/ui/content_suggestions/ntp_home_metrics.h +++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_metrics.h
@@ -29,7 +29,8 @@ kShortcuts = 1, kReturnToRecentTab = 2, kFeedCard = 3, - kMaxValue = kFeedCard, + kFakebox = 4, + kMaxValue = kFakebox, }; // Metrics recorder for the action used to potentially leave the NTP.
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 cabb4788..a72228a 100644 --- a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm +++ b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm
@@ -671,6 +671,10 @@ self.prefService->SetInteger(prefs::kNTPFollowingFeedSortType, sortType); self.discoverFeedService->SetFollowingFeedSortType(sortType); self.feedHeaderViewController.followingFeedSortType = sortType; + + // Changing the sort type affects the scroll position, so update the feed + // layout. + [self updateFeedLayout]; } - (BOOL)shouldFeedBeVisible {
diff --git a/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller.mm b/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller.mm index 55897b3..2ac5c395 100644 --- a/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller.mm
@@ -63,6 +63,7 @@ typedef NS_ENUM(NSInteger, SectionIdentifier) { SectionIdentifierPrivacyContent = kSectionIdentifierEnumZero, SectionIdentifierSafeBrowsing, + SectionIdentifierHTTPSOnlyMode, SectionIdentifierWebServices, SectionIdentifierIncognitoAuth, SectionIdentifierIncognitoInterstitial, @@ -209,6 +210,14 @@ if (base::FeatureList::IsEnabled(safe_browsing::kEnhancedProtection)) { [model addSectionWithIdentifier:SectionIdentifierSafeBrowsing]; } + + if (base::FeatureList::IsEnabled( + security_interstitials::features::kHttpsOnlyMode)) { + [model addSectionWithIdentifier:SectionIdentifierHTTPSOnlyMode]; + [model addItem:self.HTTPSOnlyModeItem + toSectionWithIdentifier:SectionIdentifierHTTPSOnlyMode]; + } + [model addSectionWithIdentifier:SectionIdentifierWebServices]; [model addSectionWithIdentifier:SectionIdentifierIncognitoAuth]; if (base::FeatureList::IsEnabled(kIOS3PIntentsInIncognito)) { @@ -261,12 +270,6 @@ [model addItem:incognitoInterstitialItem toSectionWithIdentifier:SectionIdentifierIncognitoInterstitial]; } - - if (base::FeatureList::IsEnabled( - security_interstitials::features::kHttpsOnlyMode)) { - [model addItem:self.HTTPSOnlyModeItem - toSectionWithIdentifier:SectionIdentifierPrivacyContent]; - } } #pragma mark - Model Objects
diff --git a/ios/chrome/browser/ui/webui/about_ui.cc b/ios/chrome/browser/ui/webui/about_ui.cc index a1f055e..c54754f 100644 --- a/ios/chrome/browser/ui/webui/about_ui.cc +++ b/ios/chrome/browser/ui/webui/about_ui.cc
@@ -139,9 +139,9 @@ if (histogram_name.find(path) == std::string::npos) { continue; } - base::Value histogram_dict = histogram->ToGraphDict(); - std::string* header = histogram_dict.FindStringKey("header"); - std::string* body = histogram_dict.FindStringKey("body"); + base::Value::Dict histogram_dict = histogram->ToGraphDict(); + std::string* header = histogram_dict.FindString("header"); + std::string* body = histogram_dict.FindString("body"); response.append("<PRE>"); response.append("<h4>");
diff --git a/ios/web/common/features.mm b/ios/web/common/features.mm index 180bc1f..cb1ff6e 100644 --- a/ios/web/common/features.mm +++ b/ios/web/common/features.mm
@@ -53,7 +53,7 @@ "EnableUnrealizedWebStates", base::FEATURE_ENABLED_BY_DEFAULT}; const base::Feature kMediaPermissionsControl{"MediaPermissionsControl", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; extern const base::Feature kEnableFullscreenAPI{ "EnableFullscreenAPI", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/media/gpu/chromeos/BUILD.gn b/media/gpu/chromeos/BUILD.gn index 6ddcef75..29f9f8b 100644 --- a/media/gpu/chromeos/BUILD.gn +++ b/media/gpu/chromeos/BUILD.gn
@@ -82,6 +82,7 @@ # TODO(crbug.com/1012587): Merge :fourcc to :common. public_deps = [ ":fourcc", + "//gpu/ipc/service", "//media/mojo/mojom/stable:stable_video_decoder", ]
diff --git a/media/gpu/chromeos/mailbox_video_frame_converter.cc b/media/gpu/chromeos/mailbox_video_frame_converter.cc index d965f8a..c5432c0f 100644 --- a/media/gpu/chromeos/mailbox_video_frame_converter.cc +++ b/media/gpu/chromeos/mailbox_video_frame_converter.cc
@@ -15,7 +15,6 @@ #include "gpu/command_buffer/service/scheduler.h" #include "gpu/ipc/common/gpu_client_ids.h" #include "gpu/ipc/service/gpu_channel.h" -#include "gpu/ipc/service/shared_image_stub.h" #include "media/base/format_utils.h" #include "media/base/video_frame.h" #include "media/base/video_util.h" @@ -32,13 +31,108 @@ } // anonymous namespace +class GpuDelegateImpl : public MailboxVideoFrameConverter::GpuDelegate { + public: + using GetGpuChannelCB = + base::RepeatingCallback<base::WeakPtr<gpu::GpuChannel>()>; + + GpuDelegateImpl(scoped_refptr<base::SingleThreadTaskRunner> gpu_task_runner, + GetGpuChannelCB get_gpu_channel_cb) + : gpu_task_runner_(std::move(gpu_task_runner)), + get_gpu_channel_cb_(std::move(get_gpu_channel_cb)) {} + GpuDelegateImpl(const GpuDelegateImpl&) = delete; + GpuDelegateImpl& operator=(const GpuDelegateImpl&) = delete; + ~GpuDelegateImpl() override = default; + + bool Initialize() override { + DCHECK(gpu_task_runner_->BelongsToCurrentThread()); + + // Use |gpu_channel_| as a marker that we have been initialized already. + if (gpu_channel_) + return true; + + gpu_channel_ = get_gpu_channel_cb_.Run(); + return !!gpu_channel_; + } + + gpu::SharedImageStub::SharedImageDestructionCallback CreateSharedImage( + const gpu::Mailbox& mailbox, + gfx::GpuMemoryBufferHandle handle, + gfx::BufferFormat format, + gfx::BufferPlane plane, + gpu::SurfaceHandle surface_handle, + const gfx::Size& size, + const gfx::ColorSpace& color_space, + GrSurfaceOrigin surface_origin, + SkAlphaType alpha_type, + uint32_t usage) override { + DCHECK(gpu_task_runner_->BelongsToCurrentThread()); + + if (!gpu_channel_) + return base::NullCallback(); + + gpu::SharedImageStub* shared_image_stub = gpu_channel_->shared_image_stub(); + DCHECK(shared_image_stub); + + if (!shared_image_stub->CreateSharedImage( + mailbox, gpu::kPlatformVideoFramePoolClientId, std::move(handle), + format, plane, surface_handle, size, color_space, surface_origin, + alpha_type, usage)) { + return base::NullCallback(); + } + + return shared_image_stub->GetSharedImageDestructionCallback(mailbox); + } + + bool UpdateSharedImage(const gpu::Mailbox& mailbox, + gfx::GpuFenceHandle in_fence_handle) override { + DCHECK(gpu_task_runner_->BelongsToCurrentThread()); + + if (!gpu_channel_) + return false; + + gpu::SharedImageStub* shared_image_stub = gpu_channel_->shared_image_stub(); + DCHECK(shared_image_stub); + + return shared_image_stub->UpdateSharedImage(mailbox, + std::move(in_fence_handle)); + } + + bool WaitOnSyncTokenAndReleaseFrame( + scoped_refptr<VideoFrame> frame, + const gpu::SyncToken& sync_token) override { + DCHECK(gpu_task_runner_->BelongsToCurrentThread()); + + if (!gpu_channel_) + return false; + + gpu::SharedImageStub* shared_image_stub = gpu_channel_->shared_image_stub(); + DCHECK(shared_image_stub); + + auto keep_video_frame_alive = + base::BindOnce([](scoped_refptr<VideoFrame>) {}, std::move(frame)); + auto* scheduler = gpu_channel_->scheduler(); + DCHECK(scheduler); + scheduler->ScheduleTask(gpu::Scheduler::Task( + shared_image_stub->sequence(), std::move(keep_video_frame_alive), + std::vector<gpu::SyncToken>({sync_token}))); + return true; + } + + private: + const scoped_refptr<base::SingleThreadTaskRunner> gpu_task_runner_; + const GetGpuChannelCB get_gpu_channel_cb_; + + // |gpu_channel_| will outlive CommandBufferStub, keep the former as a WeakPtr + // to guarantee proper resource cleanup. To be dereferenced on + // |gpu_task_runner_| only. + base::WeakPtr<gpu::GpuChannel> gpu_channel_; +}; + // A SharedImage wrapper that calls |destroy_shared_image_cb| in dtor on // |gpu_task_runner|. class MailboxVideoFrameConverter::ScopedSharedImage { public: - using DestroySharedImageCB = - gpu::SharedImageStub::SharedImageDestructionCallback; - ScopedSharedImage(scoped_refptr<base::SingleThreadTaskRunner> gpu_task_runner) : destruction_task_runner_(std::move(gpu_task_runner)) {} @@ -50,7 +144,8 @@ void Reset(const gpu::Mailbox& mailbox, const gfx::Size& size, const gfx::ColorSpace& color_space, - DestroySharedImageCB destroy_shared_image_cb) { + gpu::SharedImageStub::SharedImageDestructionCallback + destroy_shared_image_cb) { Destroy(); DCHECK(!mailbox.IsZero()); mailbox_ = mailbox; @@ -80,7 +175,7 @@ gpu::Mailbox mailbox_; gfx::Size size_; gfx::ColorSpace color_space_; - DestroySharedImageCB destroy_shared_image_cb_; + gpu::SharedImageStub::SharedImageDestructionCallback destroy_shared_image_cb_; const scoped_refptr<base::SequencedTaskRunner> destruction_task_runner_; }; @@ -103,20 +198,22 @@ return stub->channel()->AsWeakPtr(); }, get_stub_cb); + auto gpu_delegate = std::make_unique<GpuDelegateImpl>( + gpu_task_runner, std::move(get_gpu_channel_cb)); return base::WrapUnique<VideoFrameConverter>(new MailboxVideoFrameConverter( std::move(unwrap_frame_cb), std::move(gpu_task_runner), - get_gpu_channel_cb, enable_unsafe_webgpu)); + std::move(gpu_delegate), enable_unsafe_webgpu)); } MailboxVideoFrameConverter::MailboxVideoFrameConverter( UnwrapFrameCB unwrap_frame_cb, scoped_refptr<base::SingleThreadTaskRunner> gpu_task_runner, - GetGpuChannelCB get_gpu_channel_cb, + std::unique_ptr<GpuDelegate> gpu_delegate, bool enable_unsafe_webgpu) : unwrap_frame_cb_(std::move(unwrap_frame_cb)), gpu_task_runner_(std::move(gpu_task_runner)), - get_gpu_channel_cb_(get_gpu_channel_cb), + gpu_delegate_(std::move(gpu_delegate)), enable_unsafe_webgpu_(enable_unsafe_webgpu) { DVLOGF(2); @@ -152,13 +249,7 @@ bool MailboxVideoFrameConverter::InitializeOnGPUThread() { DVLOGF(4); DCHECK(gpu_task_runner_->BelongsToCurrentThread()); - - // Use |gpu_channel_| as a marker that we have been initialized already. - if (gpu_channel_) - return true; - - gpu_channel_ = get_gpu_channel_cb_.Run(); - return !!gpu_channel_; + return gpu_delegate_->Initialize(); } void MailboxVideoFrameConverter::ConvertFrame(scoped_refptr<VideoFrame> frame) { @@ -350,13 +441,6 @@ gpu::Mailbox mailbox = gpu::Mailbox::GenerateForSharedImage(); - if (!gpu_channel_) { - OnError(FROM_HERE, "GpuChannel is gone!"); - return false; - } - gpu::SharedImageStub* shared_image_stub = gpu_channel_->shared_image_stub(); - DCHECK(shared_image_stub); - // The SharedImage size ultimately must correspond to the size used to import // the decoded frame into a graphics API (e.g., the EGL image size when using // OpenGL). For most videos, this is simply |destination_visible_rect|.size(). @@ -374,21 +458,20 @@ if (enable_unsafe_webgpu_ && video_frame->metadata().is_webgpu_compatible) shared_image_usage |= gpu::SHARED_IMAGE_USAGE_WEBGPU; - const bool success = shared_image_stub->CreateSharedImage( - mailbox, gpu::kPlatformVideoFramePoolClientId, - std::move(gpu_memory_buffer_handle), *buffer_format, - gfx::BufferPlane::DEFAULT, gpu::kNullSurfaceHandle, shared_image_size, - src_color_space, kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, - shared_image_usage); - if (!success) { + gpu::SharedImageStub::SharedImageDestructionCallback destroy_shared_image_cb = + gpu_delegate_->CreateSharedImage( + mailbox, std::move(gpu_memory_buffer_handle), *buffer_format, + gfx::BufferPlane::DEFAULT, gpu::kNullSurfaceHandle, shared_image_size, + src_color_space, kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, + shared_image_usage); + if (destroy_shared_image_cb.is_null()) { OnError(FROM_HERE, "Failed to create shared image."); return false; } // There's no need to UpdateSharedImage() after CreateSharedImage(). - shared_image->Reset( - mailbox, shared_image_size, src_color_space, - shared_image_stub->GetSharedImageDestructionCallback(mailbox)); + shared_image->Reset(mailbox, shared_image_size, src_color_space, + std::move(destroy_shared_image_cb)); return true; } @@ -426,13 +509,7 @@ bool MailboxVideoFrameConverter::UpdateSharedImageOnGPUThread( const gpu::Mailbox& mailbox) { DCHECK(gpu_task_runner_->BelongsToCurrentThread()); - if (!gpu_channel_) { - OnError(FROM_HERE, "GpuChannel is gone!"); - return false; - } - gpu::SharedImageStub* shared_image_stub = gpu_channel_->shared_image_stub(); - DCHECK(shared_image_stub); - if (!shared_image_stub->UpdateSharedImage(mailbox, gfx::GpuFenceHandle())) { + if (!gpu_delegate_->UpdateSharedImage(mailbox, gfx::GpuFenceHandle())) { OnError(FROM_HERE, "Could not update shared image"); return false; } @@ -443,19 +520,11 @@ scoped_refptr<VideoFrame> frame, const gpu::SyncToken& sync_token) { DCHECK(gpu_task_runner_->BelongsToCurrentThread()); - - if (!gpu_channel_) - return OnError(FROM_HERE, "GpuChannel is gone!"); - gpu::SharedImageStub* shared_image_stub = gpu_channel_->shared_image_stub(); - DCHECK(shared_image_stub); - - auto keep_video_frame_alive = - base::BindOnce([](scoped_refptr<VideoFrame>) {}, std::move(frame)); - auto* scheduler = gpu_channel_->scheduler(); - DCHECK(scheduler); - scheduler->ScheduleTask(gpu::Scheduler::Task( - shared_image_stub->sequence(), std::move(keep_video_frame_alive), - std::vector<gpu::SyncToken>({sync_token}))); + if (!gpu_delegate_->WaitOnSyncTokenAndReleaseFrame(std::move(frame), + sync_token)) { + return OnError(FROM_HERE, + "Could not schedule a task to wait on SyncToken!"); + } } void MailboxVideoFrameConverter::UnregisterSharedImage(
diff --git a/media/gpu/chromeos/mailbox_video_frame_converter.h b/media/gpu/chromeos/mailbox_video_frame_converter.h index 54f3697..b6d0273 100644 --- a/media/gpu/chromeos/mailbox_video_frame_converter.h +++ b/media/gpu/chromeos/mailbox_video_frame_converter.h
@@ -11,8 +11,13 @@ #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "gpu/command_buffer/common/mailbox.h" +#include "gpu/ipc/common/surface_handle.h" +#include "gpu/ipc/service/shared_image_stub.h" #include "media/gpu/chromeos/video_frame_converter.h" #include "media/gpu/media_gpu_export.h" +#include "third_party/skia/include/core/SkAlphaType.h" +#include "third_party/skia/include/gpu/GrTypes.h" +#include "ui/gfx/buffer_types.h" namespace base { class Location; @@ -20,10 +25,13 @@ } // namespace base namespace gpu { -class GpuChannel; class CommandBufferStub; } // namespace gpu +namespace gfx { +struct GpuFenceHandle; +} // namespace gfx + namespace media { class VideoFrame; @@ -38,8 +46,32 @@ base::RepeatingCallback<VideoFrame*(const VideoFrame& wrapped_frame)>; using GetCommandBufferStubCB = base::RepeatingCallback<gpu::CommandBufferStub*()>; - using GetGpuChannelCB = - base::RepeatingCallback<base::WeakPtr<gpu::GpuChannel>()>; + + class GpuDelegate { + public: + GpuDelegate() = default; + GpuDelegate(const GpuDelegate&) = delete; + GpuDelegate& operator=(const GpuDelegate&) = delete; + virtual ~GpuDelegate() = default; + + virtual bool Initialize() = 0; + virtual gpu::SharedImageStub::SharedImageDestructionCallback + CreateSharedImage(const gpu::Mailbox& mailbox, + gfx::GpuMemoryBufferHandle handle, + gfx::BufferFormat format, + gfx::BufferPlane plane, + gpu::SurfaceHandle surface_handle, + const gfx::Size& size, + const gfx::ColorSpace& color_space, + GrSurfaceOrigin surface_origin, + SkAlphaType alpha_type, + uint32_t usage) = 0; + virtual bool UpdateSharedImage(const gpu::Mailbox& mailbox, + gfx::GpuFenceHandle in_fence_handle) = 0; + virtual bool WaitOnSyncTokenAndReleaseFrame( + scoped_refptr<VideoFrame> frame, + const gpu::SyncToken& sync_token) = 0; + }; // Creates a MailboxVideoFrameConverter instance. The callers will send // wrapped VideoFrames to ConvertFrame(), |unwrap_frame_cb| is the callback @@ -78,7 +110,7 @@ MailboxVideoFrameConverter( UnwrapFrameCB unwrap_frame_cb, scoped_refptr<base::SingleThreadTaskRunner> gpu_task_runner, - GetGpuChannelCB get_gpu_channel_cb, + std::unique_ptr<GpuDelegate> gpu_delegate, bool enable_unsafe_webgpu); // Destructor runs on the GPU main thread. ~MailboxVideoFrameConverter() override; @@ -148,12 +180,7 @@ UnwrapFrameCB unwrap_frame_cb_; const scoped_refptr<base::SingleThreadTaskRunner> gpu_task_runner_; - const GetGpuChannelCB get_gpu_channel_cb_; - - // |gpu_channel_| will outlive CommandBufferStub, keep the former as a WeakPtr - // to guarantee proper resource cleanup. To be dereferenced on - // |gpu_task_runner_| only. - base::WeakPtr<gpu::GpuChannel> gpu_channel_; + const std::unique_ptr<GpuDelegate> gpu_delegate_; // Mapping from the unique id of the frame to its corresponding SharedImage. // Accessed only on |parent_task_runner_|. The ScopedSharedImages are owned by
diff --git a/media/gpu/chromeos/mailbox_video_frame_converter_unittest.cc b/media/gpu/chromeos/mailbox_video_frame_converter_unittest.cc index def6217..2bec42a 100644 --- a/media/gpu/chromeos/mailbox_video_frame_converter_unittest.cc +++ b/media/gpu/chromeos/mailbox_video_frame_converter_unittest.cc
@@ -7,8 +7,11 @@ #include "base/bind.h" #include "base/test/task_environment.h" #include "base/threading/thread_task_runner_handle.h" +#include "gpu/command_buffer/common/sync_token.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "ui/gfx/gpu_fence_handle.h" +#include "ui/gfx/gpu_memory_buffer.h" using ::testing::_; @@ -20,9 +23,28 @@ return const_cast<VideoFrame*>(&frame); } -base::WeakPtr<gpu::GpuChannel> GetGpuChannel() { - return nullptr; -} +class MockGpuDelegate : public MailboxVideoFrameConverter::GpuDelegate { + public: + MOCK_METHOD0(Initialize, bool()); + MOCK_METHOD10(CreateSharedImage, + gpu::SharedImageStub::SharedImageDestructionCallback( + const gpu::Mailbox& mailbox, + gfx::GpuMemoryBufferHandle handle, + gfx::BufferFormat format, + gfx::BufferPlane plane, + gpu::SurfaceHandle surface_handle, + const gfx::Size& size, + const gfx::ColorSpace& color_space, + GrSurfaceOrigin surface_origin, + SkAlphaType alpha_type, + uint32_t usage)); + MOCK_METHOD2(UpdateSharedImage, + bool(const gpu::Mailbox& mailbox, + gfx::GpuFenceHandle in_fence_handle)); + MOCK_METHOD2(WaitOnSyncTokenAndReleaseFrame, + bool(scoped_refptr<VideoFrame> frame, + const gpu::SyncToken& sync_token)); +}; } // anonymous namespace @@ -32,7 +54,7 @@ : converter_(new MailboxVideoFrameConverter( base::BindRepeating(&UnwrapVideoFrame), base::ThreadTaskRunnerHandle::Get(), - base::BindRepeating(&GetGpuChannel), + std::make_unique<MockGpuDelegate>(), /*enable_unsafe_webgpu=*/false)) {} MailboxVideoFrameConverterTest(const MailboxVideoFrameConverterTest&) = @@ -51,7 +73,6 @@ MOCK_METHOD1(OutputCB, void(scoped_refptr<VideoFrame>)); base::test::TaskEnvironment task_environment_; - std::unique_ptr<VideoFrameConverter> converter_; };
diff --git a/mojo/public/cpp/base/BUILD.gn b/mojo/public/cpp/base/BUILD.gn index ca4fa1a..a322c54 100644 --- a/mojo/public/cpp/base/BUILD.gn +++ b/mojo/public/cpp/base/BUILD.gn
@@ -159,4 +159,8 @@ "//testing/gtest", "//third_party/abseil-cpp:absl", ] + + if (is_fuchsia) { + public_deps += [ "//mojo/public/cpp/base/fuchsia:unittests" ] + } }
diff --git a/mojo/public/cpp/base/fuchsia/BUILD.gn b/mojo/public/cpp/base/fuchsia/BUILD.gn index e6ae5aa..60a8f83 100644 --- a/mojo/public/cpp/base/fuchsia/BUILD.gn +++ b/mojo/public/cpp/base/fuchsia/BUILD.gn
@@ -5,7 +5,6 @@ assert(is_fuchsia) import("//mojo/public/tools/bindings/mojom.gni") -import("//testing/test.gni") mojom("example_interfaces") { testonly = true @@ -48,9 +47,9 @@ ] } -# TODO(crbug/1081525): Consider merging into //mojo:mojo_unittests, possibly -# via ../:tests. -test("fuchsia_mojo_unittests") { +source_set("unittests") { + testonly = true + sources = [ "fidl_interface_request_mojom_traits_unittest.cc", "test_interface_request_mojom_traits.h", @@ -64,6 +63,4 @@ "//mojo/public/cpp/test_support:test_utils", "//testing/gtest", ] - - visibility = [] }
diff --git a/printing/printing_context.cc b/printing/printing_context.cc index 93db1a8..56ee836 100644 --- a/printing/printing_context.cc +++ b/printing/printing_context.cc
@@ -153,8 +153,6 @@ if (!open_in_external_preview && (printer_type == mojom::PrinterType::kPdf || printer_type == mojom::PrinterType::kExtension)) { - if (printer_type == mojom::PrinterType::kExtension) - settings_->set_dpi(kDefaultPdfDpi); gfx::Size paper_size(GetPdfPaperSizeDeviceUnits()); if (!settings_->requested_media().size_microns.IsEmpty()) { float device_microns_per_device_unit =
diff --git a/services/network/sct_auditing/sct_auditing_handler.cc b/services/network/sct_auditing/sct_auditing_handler.cc index f559d8b..18afd1bb 100644 --- a/services/network/sct_auditing/sct_auditing_handler.cc +++ b/services/network/sct_auditing/sct_auditing_handler.cc
@@ -60,6 +60,11 @@ popular_sct_skipped); } +void RecordReportDroppedDueToLogNotFound(bool report_dropped) { + base::UmaHistogramBoolean( + "Security.SCTAuditing.OptOut.DroppedDueToLogNotFound", report_dropped); +} + } // namespace SCTAuditingHandler::SCTAuditingHandler(NetworkContext* context, @@ -153,7 +158,23 @@ auto log = std::find_if(logs.begin(), logs.end(), [&sct](const auto& log) { return log->id == sct->log_id; }); - CHECK(log != logs.end()); + // It's possible that log entry metadata may not exist for a few reasons: + // + // 1) The PKI Metadata component has not yet been loaded and no log list + // has been set. + // 2) The PKI Metadata component was updated sometime between the SCTs + // being validated and MaybeEnqueueReport() being called. + // 3) The log is actually unknown. (This last case should not happen as the + // SCTs should not have been considered valid.) + // + // In particular, (1) can occur for a short duration at browser startup, so + // handle this gracefully and drop the report. + if (log == logs.end()) { + RecordReportDroppedDueToLogNotFound(true); + return; + } + RecordReportDroppedDueToLogNotFound(false); + sct_metadata->log_id = log->get()->id; sct_metadata->log_mmd = log->get()->mmd; sct_metadata->certificate_expiry =
diff --git a/services/network/sct_auditing/sct_auditing_handler_unittest.cc b/services/network/sct_auditing/sct_auditing_handler_unittest.cc index c922285..68af989 100644 --- a/services/network/sct_auditing/sct_auditing_handler_unittest.cc +++ b/services/network/sct_auditing/sct_auditing_handler_unittest.cc
@@ -956,6 +956,54 @@ "sha256/qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqo=")); } +// Regression test for crbug.com/134432. For hashdance clients, when log list is +// empty the handler should just gracefully drop the report instead of crashing, +// and log a histogram for this case. +TEST_F(SCTAuditingHandlerTest, LogNotFound) { + // Set up an empty CT log list. + std::vector<mojom::CTLogInfoPtr> log_list; + base::RunLoop run_loop; + network_service_->UpdateCtLogList(std::move(log_list), base::Time::Now(), + run_loop.QuitClosure()); + run_loop.Run(); + + const net::HostPortPair host_port_pair("example.com", 443); + net::SignedCertificateTimestampAndStatusList sct_list; + MakeTestSCTAndStatus( + net::ct::SignedCertificateTimestamp::SCT_FROM_TLS_EXTENSION, "extensions", + "valid_signature", base::Time::Now(), net::ct::SCT_STATUS_OK, &sct_list); + net::ct::MerkleTreeLeaf merkle_tree_leaf; + std::string leaf_hash_string; + ASSERT_TRUE(net::ct::GetMerkleTreeLeaf(chain_.get(), sct_list.at(0).sct.get(), + &merkle_tree_leaf)); + ASSERT_TRUE(net::ct::HashMerkleTreeLeaf(merkle_tree_leaf, &leaf_hash_string)); + std::vector<uint8_t> leaf_hash(leaf_hash_string.begin(), + leaf_hash_string.end()); + + for (mojom::SCTAuditingMode mode : + {mojom::SCTAuditingMode::kEnhancedSafeBrowsingReporting, + mojom::SCTAuditingMode::kHashdance}) { + SCOPED_TRACE(testing::Message() << "Mode: " << static_cast<int>(mode)); + base::HistogramTester histograms; + handler_->SetMode(mode); + handler_->MaybeEnqueueReport(host_port_pair, chain_.get(), sct_list); + auto* pending_reporters = handler_->GetPendingReportersForTesting(); + EXPECT_EQ(pending_reporters->size(), + mode == mojom::SCTAuditingMode::kHashdance ? 0u : 1u); + + // The hashdance request should record a count for DroppedDueToLogNotFound. + histograms.ExpectUniqueSample( + "Security.SCTAuditing.OptOut.DroppedDueToLogNotFound", true, + mode == mojom::SCTAuditingMode::kHashdance ? 1 : 0); + + // Reset by clearing all pending reports and cache entries. + base::RunLoop run_loop; + handler_->ClearPendingReports(run_loop.QuitClosure()); + network_service_->sct_auditing_cache()->ClearCache(); + run_loop.Run(); + } +} + class NoPersistenceSCTAuditingHandlerTest : public SCTAuditingHandlerTest { public: void SetUp() override {
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json index 5fc6ada..cd70880 100644 --- a/testing/buildbot/chromium.android.fyi.json +++ b/testing/buildbot/chromium.android.fyi.json
@@ -8154,15 +8154,15 @@ { "args": [ "--additional-apk=apks/WebLayerShellSystemWebView.apk", + "--webview-apk-path=apks/SystemWebView.apk", "--test-runner-outdir", ".", + "--client-outdir", + "../../weblayer_instrumentation_test_M103/out/Release", "--implementation-outdir", ".", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--webview-apk-path=apks/SystemWebView.apk", - "--client-outdir", - "../../weblayer_instrumentation_test_M103/out/Release", "--client-version=103", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -8188,7 +8188,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M103", - "revision": "version:103.0.5060.128" + "revision": "version:103.0.5060.130" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -8664,15 +8664,15 @@ { "args": [ "--additional-apk=apks/WebLayerShellSystemWebView.apk", + "--webview-apk-path=apks/AOSP_SystemWebView.apk", "--test-runner-outdir", ".", "--client-outdir", ".", - "--test-expectations", - "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--webview-apk-path=apks/AOSP_SystemWebView.apk", "--implementation-outdir", "../../weblayer_instrumentation_test_M103/out/Release", + "--test-expectations", + "../../weblayer/browser/android/javatests/skew/expectations.txt", "--impl-version=103", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -8698,7 +8698,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M103", - "revision": "version:103.0.5060.128" + "revision": "version:103.0.5060.130" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json index dc787ed..4cf49e54 100644 --- a/testing/buildbot/chromium.android.json +++ b/testing/buildbot/chromium.android.json
@@ -46513,15 +46513,15 @@ { "args": [ "--additional-apk=apks/WebLayerShellSystemWebView.apk", + "--webview-apk-path=apks/SystemWebView.apk", "--test-runner-outdir", ".", + "--client-outdir", + "../../weblayer_instrumentation_test_M103/out/Release", "--implementation-outdir", ".", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--webview-apk-path=apks/SystemWebView.apk", - "--client-outdir", - "../../weblayer_instrumentation_test_M103/out/Release", "--client-version=103", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -46547,7 +46547,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M103", - "revision": "version:103.0.5060.128" + "revision": "version:103.0.5060.130" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -47023,15 +47023,15 @@ { "args": [ "--additional-apk=apks/WebLayerShellSystemWebView.apk", + "--webview-apk-path=apks/AOSP_SystemWebView.apk", "--test-runner-outdir", ".", "--client-outdir", ".", - "--test-expectations", - "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--webview-apk-path=apks/AOSP_SystemWebView.apk", "--implementation-outdir", "../../weblayer_instrumentation_test_M103/out/Release", + "--test-expectations", + "../../weblayer/browser/android/javatests/skew/expectations.txt", "--impl-version=103", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -47057,7 +47057,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M103", - "revision": "version:103.0.5060.128" + "revision": "version:103.0.5060.130" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -47537,15 +47537,15 @@ { "args": [ "--additional-apk=apks/ChromePublic.apk", + "--webview-apk-path=apks/SystemWebView.apk", "--test-runner-outdir", ".", + "--client-outdir", + "../../weblayer_instrumentation_test_M103/out/Release", "--implementation-outdir", ".", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--webview-apk-path=apks/SystemWebView.apk", - "--client-outdir", - "../../weblayer_instrumentation_test_M103/out/Release", "--client-version=103", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -47571,7 +47571,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M103", - "revision": "version:103.0.5060.128" + "revision": "version:103.0.5060.130" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -48047,15 +48047,15 @@ { "args": [ "--additional-apk=apks/ChromePublic.apk", + "--webview-apk-path=apks/AOSP_SystemWebView.apk", "--test-runner-outdir", ".", "--client-outdir", ".", - "--test-expectations", - "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--webview-apk-path=apks/AOSP_SystemWebView.apk", "--implementation-outdir", "../../weblayer_instrumentation_test_M103/out/Release", + "--test-expectations", + "../../weblayer/browser/android/javatests/skew/expectations.txt", "--impl-version=103", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -48081,7 +48081,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M103", - "revision": "version:103.0.5060.128" + "revision": "version:103.0.5060.130" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -48629,15 +48629,15 @@ { "args": [ "--additional-apk=apks/WebLayerShellSystemWebView.apk", + "--webview-apk-path=apks/SystemWebView.apk", "--test-runner-outdir", ".", + "--client-outdir", + "../../weblayer_instrumentation_test_M103/out/Release", "--implementation-outdir", ".", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--webview-apk-path=apks/SystemWebView.apk", - "--client-outdir", - "../../weblayer_instrumentation_test_M103/out/Release", "--client-version=103", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -48663,7 +48663,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M103", - "revision": "version:103.0.5060.128" + "revision": "version:103.0.5060.130" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -49139,15 +49139,15 @@ { "args": [ "--additional-apk=apks/WebLayerShellSystemWebView.apk", + "--webview-apk-path=apks/SystemWebView.apk", "--test-runner-outdir", ".", "--client-outdir", ".", - "--test-expectations", - "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--webview-apk-path=apks/SystemWebView.apk", "--implementation-outdir", "../../weblayer_instrumentation_test_M103/out/Release", + "--test-expectations", + "../../weblayer/browser/android/javatests/skew/expectations.txt", "--impl-version=103", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -49173,7 +49173,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M103", - "revision": "version:103.0.5060.128" + "revision": "version:103.0.5060.130" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -49721,15 +49721,15 @@ { "args": [ "--additional-apk=apks/WebLayerShellSystemWebView.apk", + "--webview-apk-path=apks/SystemWebView.apk", "--test-runner-outdir", ".", + "--client-outdir", + "../../weblayer_instrumentation_test_M103/out/Release", "--implementation-outdir", ".", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--webview-apk-path=apks/SystemWebView.apk", - "--client-outdir", - "../../weblayer_instrumentation_test_M103/out/Release", "--client-version=103", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -49755,7 +49755,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M103", - "revision": "version:103.0.5060.128" + "revision": "version:103.0.5060.130" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -50231,15 +50231,15 @@ { "args": [ "--additional-apk=apks/WebLayerShellSystemWebView.apk", + "--webview-apk-path=apks/SystemWebView.apk", "--test-runner-outdir", ".", "--client-outdir", ".", - "--test-expectations", - "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--webview-apk-path=apks/SystemWebView.apk", "--implementation-outdir", "../../weblayer_instrumentation_test_M103/out/Release", + "--test-expectations", + "../../weblayer/browser/android/javatests/skew/expectations.txt", "--impl-version=103", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -50265,7 +50265,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M103", - "revision": "version:103.0.5060.128" + "revision": "version:103.0.5060.130" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json index 34847abb..f496454f 100644 --- a/testing/buildbot/chromium.chromiumos.json +++ b/testing/buildbot/chromium.chromiumos.json
@@ -1061,7 +1061,7 @@ "--browser=cros-chrome", "--passthrough", "-v", - "--extra-browser-args=--log-level=0 --js-flags=--expose-gc --force_high_performance_gpu", + "--extra-browser-args=--log-level=0 --js-flags=--expose-gc --force_high_performance_gpu --disable-features=BackgroundVideoPauseOptimization", "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json", "--remote=127.0.0.1", "--remote-ssh-port=9222" @@ -5755,21 +5755,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_v105.0.5181.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5182.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 105.0.5181.0", + "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5182.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_v105.0.5181.0", - "revision": "version:105.0.5181.0" + "location": "lacros_version_skew_tests_v105.0.5182.0", + "revision": "version:105.0.5182.0" } ], "dimension_sets": [ @@ -5782,7 +5782,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 105.0.5181.0" + "variant_id": "Lacros version skew testing ash 105.0.5182.0" }, { "isolate_profile_data": true, @@ -5920,21 +5920,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5181.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5182.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 105.0.5181.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5182.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_v105.0.5181.0", - "revision": "version:105.0.5181.0" + "location": "lacros_version_skew_tests_v105.0.5182.0", + "revision": "version:105.0.5182.0" } ], "dimension_sets": [ @@ -5946,7 +5946,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 105.0.5181.0" + "variant_id": "Lacros version skew testing ash 105.0.5182.0" }, { "args": [ @@ -6066,21 +6066,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5181.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5182.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 105.0.5181.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5182.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_v105.0.5181.0", - "revision": "version:105.0.5181.0" + "location": "lacros_version_skew_tests_v105.0.5182.0", + "revision": "version:105.0.5182.0" } ], "dimension_sets": [ @@ -6092,7 +6092,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 105.0.5181.0" + "variant_id": "Lacros version skew testing ash 105.0.5182.0" }, { "isolate_profile_data": true,
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json index 6509d90..63c01301 100644 --- a/testing/buildbot/chromium.clang.json +++ b/testing/buildbot/chromium.clang.json
@@ -9178,24 +9178,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "fuchsia_mojo_unittests", - "test_id_prefix": "ninja://mojo/public/cpp/base/fuchsia:fuchsia_mojo_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "gcm_unit_tests", "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" }, @@ -10700,25 +10682,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "fuchsia_mojo_unittests", - "test_id_prefix": "ninja://mojo/public/cpp/base/fuchsia:fuchsia_mojo_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "arm64", - "inside_docker": "1", - "os": "Ubuntu-20.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "gcm_unit_tests", "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" },
diff --git a/testing/buildbot/chromium.fuchsia.fyi.json b/testing/buildbot/chromium.fuchsia.fyi.json index 128e896f..00d84c71 100644 --- a/testing/buildbot/chromium.fuchsia.fyi.json +++ b/testing/buildbot/chromium.fuchsia.fyi.json
@@ -463,25 +463,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "fuchsia_mojo_unittests", - "test_id_prefix": "ninja://mojo/public/cpp/base/fuchsia:fuchsia_mojo_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "arm64", - "inside_docker": "1", - "os": "Ubuntu-20.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "gcm_unit_tests", "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" }, @@ -1678,24 +1659,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "fuchsia_mojo_unittests", - "test_id_prefix": "ninja://mojo/public/cpp/base/fuchsia:fuchsia_mojo_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "gcm_unit_tests", "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" }, @@ -2970,24 +2933,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "fuchsia_mojo_unittests", - "test_id_prefix": "ninja://mojo/public/cpp/base/fuchsia:fuchsia_mojo_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "gcm_unit_tests", "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" },
diff --git a/testing/buildbot/chromium.fuchsia.json b/testing/buildbot/chromium.fuchsia.json index 86b68cf4..339303c5 100644 --- a/testing/buildbot/chromium.fuchsia.json +++ b/testing/buildbot/chromium.fuchsia.json
@@ -460,25 +460,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "fuchsia_mojo_unittests", - "test_id_prefix": "ninja://mojo/public/cpp/base/fuchsia:fuchsia_mojo_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "arm64", - "inside_docker": "1", - "os": "Ubuntu-20.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "gcm_unit_tests", "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" }, @@ -1686,24 +1667,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "fuchsia_mojo_unittests", - "test_id_prefix": "ninja://mojo/public/cpp/base/fuchsia:fuchsia_mojo_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "gcm_unit_tests", "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" },
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index b84f0eb8..07635b4 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -20219,29 +20219,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "fuchsia_mojo_unittests", - "test_id_prefix": "ninja://mojo/public/cpp/base/fuchsia:fuchsia_mojo_unittests/" - }, - { - "args": [ - "--ram-size-mb=16384", - "--code-coverage", - "--code-coverage-dir=${ISOLATED_OUTDIR}" - ], - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "gcm_unit_tests", "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" }, @@ -21724,25 +21701,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "fuchsia_mojo_unittests", - "test_id_prefix": "ninja://mojo/public/cpp/base/fuchsia:fuchsia_mojo_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "arm64", - "inside_docker": "1", - "os": "Ubuntu-20.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "gcm_unit_tests", "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" }, @@ -23080,26 +23038,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "fuchsia_mojo_unittests", - "test_id_prefix": "ninja://mojo/public/cpp/base/fuchsia:fuchsia_mojo_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "arm64", - "inside_docker": "1", - "os": "Ubuntu-20.04", - "pool": "chromium.tests.fuchsia" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "gcm_unit_tests", "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" }, @@ -24516,24 +24454,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "fuchsia_mojo_unittests", - "test_id_prefix": "ninja://mojo/public/cpp/base/fuchsia:fuchsia_mojo_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "gcm_unit_tests", "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" }, @@ -26043,28 +25963,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "fuchsia_mojo_unittests", - "test_id_prefix": "ninja://mojo/public/cpp/base/fuchsia:fuchsia_mojo_unittests/" - }, - { - "args": [ - "--gtest_also_run_disabled_tests", - "--gtest_filter=*DISABLE*" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "gcm_unit_tests", "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" }, @@ -94565,21 +94463,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_v105.0.5181.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5182.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 105.0.5181.0", + "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5182.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_v105.0.5181.0", - "revision": "version:105.0.5181.0" + "location": "lacros_version_skew_tests_v105.0.5182.0", + "revision": "version:105.0.5182.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -94587,7 +94485,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 105.0.5181.0" + "variant_id": "Lacros version skew testing ash 105.0.5182.0" }, { "isolate_profile_data": true, @@ -94700,28 +94598,28 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5181.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5182.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 105.0.5181.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5182.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_v105.0.5181.0", - "revision": "version:105.0.5181.0" + "location": "lacros_version_skew_tests_v105.0.5182.0", + "revision": "version:105.0.5182.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 105.0.5181.0" + "variant_id": "Lacros version skew testing ash 105.0.5182.0" }, { "args": [ @@ -94821,28 +94719,28 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5181.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5182.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 105.0.5181.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5182.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_v105.0.5181.0", - "revision": "version:105.0.5181.0" + "location": "lacros_version_skew_tests_v105.0.5182.0", + "revision": "version:105.0.5182.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 105.0.5181.0" + "variant_id": "Lacros version skew testing ash 105.0.5182.0" }, { "isolate_profile_data": true, @@ -96180,20 +96078,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_v105.0.5181.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5182.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5181.0", + "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5182.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_v105.0.5181.0", - "revision": "version:105.0.5181.0" + "location": "lacros_version_skew_tests_v105.0.5182.0", + "revision": "version:105.0.5182.0" } ], "dimension_sets": [ @@ -96207,7 +96105,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 105.0.5181.0" + "variant_id": "Lacros version skew testing ash 105.0.5182.0" }, { "merge": { @@ -96345,20 +96243,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5181.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5182.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5181.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5182.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_v105.0.5181.0", - "revision": "version:105.0.5181.0" + "location": "lacros_version_skew_tests_v105.0.5182.0", + "revision": "version:105.0.5182.0" } ], "dimension_sets": [ @@ -96371,7 +96269,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 105.0.5181.0" + "variant_id": "Lacros version skew testing ash 105.0.5182.0" }, { "args": [ @@ -96491,20 +96389,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5181.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5182.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 105.0.5181.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5182.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_v105.0.5181.0", - "revision": "version:105.0.5181.0" + "location": "lacros_version_skew_tests_v105.0.5182.0", + "revision": "version:105.0.5182.0" } ], "dimension_sets": [ @@ -96517,7 +96415,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 105.0.5181.0" + "variant_id": "Lacros version skew testing ash 105.0.5182.0" }, { "merge": { @@ -98013,20 +97911,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_v105.0.5181.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5182.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5181.0", + "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5182.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_v105.0.5181.0", - "revision": "version:105.0.5181.0" + "location": "lacros_version_skew_tests_v105.0.5182.0", + "revision": "version:105.0.5182.0" } ], "dimension_sets": [ @@ -98040,7 +97938,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 105.0.5181.0" + "variant_id": "Lacros version skew testing ash 105.0.5182.0" }, { "merge": { @@ -98178,20 +98076,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5181.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5182.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5181.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5182.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_v105.0.5181.0", - "revision": "version:105.0.5181.0" + "location": "lacros_version_skew_tests_v105.0.5182.0", + "revision": "version:105.0.5182.0" } ], "dimension_sets": [ @@ -98204,7 +98102,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 105.0.5181.0" + "variant_id": "Lacros version skew testing ash 105.0.5182.0" }, { "args": [ @@ -98324,20 +98222,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5181.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5182.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 105.0.5181.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5182.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_v105.0.5181.0", - "revision": "version:105.0.5181.0" + "location": "lacros_version_skew_tests_v105.0.5182.0", + "revision": "version:105.0.5182.0" } ], "dimension_sets": [ @@ -98350,7 +98248,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 105.0.5181.0" + "variant_id": "Lacros version skew testing ash 105.0.5182.0" }, { "merge": { @@ -99085,20 +98983,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_v105.0.5181.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5182.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5181.0", + "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5182.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_v105.0.5181.0", - "revision": "version:105.0.5181.0" + "location": "lacros_version_skew_tests_v105.0.5182.0", + "revision": "version:105.0.5182.0" } ], "dimension_sets": [ @@ -99111,7 +99009,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 105.0.5181.0" + "variant_id": "Lacros version skew testing ash 105.0.5182.0" } ] },
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json index 4861e27..29469bc8 100644 --- a/testing/buildbot/chromium.memory.json +++ b/testing/buildbot/chromium.memory.json
@@ -20875,21 +20875,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_v105.0.5181.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5182.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 105.0.5181.0", + "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5182.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_v105.0.5181.0", - "revision": "version:105.0.5181.0" + "location": "lacros_version_skew_tests_v105.0.5182.0", + "revision": "version:105.0.5182.0" } ], "dimension_sets": [ @@ -20902,7 +20902,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 105.0.5181.0" + "variant_id": "Lacros version skew testing ash 105.0.5182.0" }, { "isolate_profile_data": true, @@ -21040,21 +21040,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5181.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5182.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 105.0.5181.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5182.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_v105.0.5181.0", - "revision": "version:105.0.5181.0" + "location": "lacros_version_skew_tests_v105.0.5182.0", + "revision": "version:105.0.5182.0" } ], "dimension_sets": [ @@ -21066,7 +21066,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 105.0.5181.0" + "variant_id": "Lacros version skew testing ash 105.0.5182.0" }, { "args": [ @@ -21186,21 +21186,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5181.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5182.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 105.0.5181.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5182.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_v105.0.5181.0", - "revision": "version:105.0.5181.0" + "location": "lacros_version_skew_tests_v105.0.5182.0", + "revision": "version:105.0.5182.0" } ], "dimension_sets": [ @@ -21212,7 +21212,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 105.0.5181.0" + "variant_id": "Lacros version skew testing ash 105.0.5182.0" }, { "isolate_profile_data": true,
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl index ff769890..ba794c5 100644 --- a/testing/buildbot/gn_isolate_map.pyl +++ b/testing/buildbot/gn_isolate_map.pyl
@@ -870,10 +870,6 @@ "script": "//testing/scripts/run_flatbuffers_unittests.py", "type": "script", }, - "fuchsia_mojo_unittests": { - "label": "//mojo/public/cpp/base/fuchsia:fuchsia_mojo_unittests", - "type": "console_test_launcher", - }, "fuchsia_pytype": { "label": "//testing:fuchsia_pytype", "script": "//build/fuchsia/test/run_pytype.py",
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index 33d70f4..72ae133 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -3741,6 +3741,10 @@ ], 'modifications': { 'chromeos-amd64-generic-rel': { + 'args': [ + # Added to debug crbug.com/1293967. + '--extra-browser-args=--disable-features=BackgroundVideoPauseOptimization', + ], 'swarming': { 'quickrun_shards': 40, },
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index f564556..233edb9 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -1969,7 +1969,6 @@ 'crypto_unittests': {}, 'events_unittests': {}, 'filesystem_service_unittests': {}, - 'fuchsia_mojo_unittests': {}, 'gcm_unit_tests': {}, 'gin_unittests': {}, 'google_apis_unittests': {},
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl index ae06415..339fe25 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_v105.0.5181.0/test_ash_chrome', + '--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5182.0/test_ash_chrome', ], - 'identifier': 'Lacros version skew testing ash 105.0.5181.0', + 'identifier': 'Lacros version skew testing ash 105.0.5182.0', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip', - 'location': 'lacros_version_skew_tests_v105.0.5181.0', - 'revision': 'version:105.0.5181.0', + 'location': 'lacros_version_skew_tests_v105.0.5182.0', + 'revision': 'version:105.0.5182.0', }, ], }, @@ -553,16 +553,16 @@ }, 'WEBLAYER_10_AND_M_IMPL_SKEW_TESTS_NTH_MINUS_ONE_MILESTONE': { 'args': [ + '--webview-apk-path=apks/AOSP_SystemWebView.apk', '--test-runner-outdir', '.', '--client-outdir', '.', - '--test-expectations', - '../../weblayer/browser/android/javatests/skew/expectations.txt', - '--webview-apk-path=apks/AOSP_SystemWebView.apk', '--implementation-outdir', '../../weblayer_instrumentation_test_M103/out/Release', - '--impl-version=103' + '--test-expectations', + '../../weblayer/browser/android/javatests/skew/expectations.txt', + '--impl-version=103', ], 'identifier': 'with_impl_from_103', 'swarming': { @@ -570,10 +570,10 @@ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M103', - 'revision': 'version:103.0.5060.128' + 'revision': 'version:103.0.5060.130', } - ] - } + ], + }, }, 'WEBLAYER_10_AND_M_IMPL_SKEW_TESTS_NTH_MINUS_TWO_MILESTONE': { 'args': [ @@ -697,16 +697,16 @@ }, 'WEBLAYER_IMPL_SKEW_TESTS_NTH_MINUS_ONE_MILESTONE': { 'args': [ + '--webview-apk-path=apks/SystemWebView.apk', '--test-runner-outdir', '.', '--client-outdir', '.', - '--test-expectations', - '../../weblayer/browser/android/javatests/skew/expectations.txt', - '--webview-apk-path=apks/SystemWebView.apk', '--implementation-outdir', '../../weblayer_instrumentation_test_M103/out/Release', - '--impl-version=103' + '--test-expectations', + '../../weblayer/browser/android/javatests/skew/expectations.txt', + '--impl-version=103', ], 'identifier': 'with_impl_from_103', 'swarming': { @@ -714,10 +714,10 @@ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M103', - 'revision': 'version:103.0.5060.128' + 'revision': 'version:103.0.5060.130', } - ] - } + ], + }, }, 'WEBLAYER_IMPL_SKEW_TESTS_NTH_MINUS_TWO_MILESTONE': { 'args': [ @@ -841,16 +841,16 @@ }, 'WEBLAYER_CLIENT_SKEW_TESTS_NTH_MINUS_ONE_MILESTONE': { 'args': [ + '--webview-apk-path=apks/SystemWebView.apk', '--test-runner-outdir', '.', + '--client-outdir', + '../../weblayer_instrumentation_test_M103/out/Release', '--implementation-outdir', '.', '--test-expectations', '../../weblayer/browser/android/javatests/skew/expectations.txt', - '--webview-apk-path=apks/SystemWebView.apk', - '--client-outdir', - '../../weblayer_instrumentation_test_M103/out/Release', - '--client-version=103' + '--client-version=103', ], 'identifier': 'with_client_from_103', 'swarming': { @@ -858,10 +858,10 @@ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M103', - 'revision': 'version:103.0.5060.128' + 'revision': 'version:103.0.5060.130', } - ] - } + ], + }, }, 'WEBLAYER_CLIENT_SKEW_TESTS_NTH_MINUS_TWO_MILESTONE': { 'args': [
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index cd6319c..80d3c78 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -8936,6 +8936,28 @@ ] } ], + "UseSyncInvalidations": [ + { + "platforms": [ + "android", + "chromeos", + "chromeos_lacros", + "ios", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "UseSyncInvalidations", + "UseSyncInvalidationsForWalletAndOffer" + ] + } + ] + } + ], "UseThreadPriorityLowest": [ { "platforms": [
diff --git a/third_party/blink/common/loader/throttling_url_loader.cc b/third_party/blink/common/loader/throttling_url_loader.cc index 5b5bd17..68dc99b 100644 --- a/third_party/blink/common/loader/throttling_url_loader.cc +++ b/third_party/blink/common/loader/throttling_url_loader.cc
@@ -45,6 +45,16 @@ const net::HttpRequestHeaders& headers, const net::HttpRequestHeaders& cors_exempt_headers, const std::vector<std::string> cors_exempt_header_list) { + // There are many ways for the renderer to cache the list, e.g. for workers, + // and it might have been cached before the renderer receives a message with + // the list. This isn't guaranteed because the caching paths aren't triggered + // by mojo calls that are associated with the method that receives the list. + // Since the renderer just checks to help catch develper bugs, if the list + // isn't received don't DCHECK. Most of the time it will which is all we need + // on bots. + if (cors_exempt_header_list.empty()) + return; + base::flat_set<std::string> cors_exempt_header_flat_set( cors_exempt_header_list); for (auto& header : headers.GetHeaderVector()) {
diff --git a/third_party/blink/public/web/web_ax_object.h b/third_party/blink/public/web/web_ax_object.h index 03b9aae..e8adee4 100644 --- a/third_party/blink/public/web/web_ax_object.h +++ b/third_party/blink/public/web/web_ax_object.h
@@ -169,7 +169,6 @@ BLINK_EXPORT WebAXObject HitTest(const gfx::Point&) const; // Get the WebAXObject's bounds in frame-relative coordinates as a gfx::Rect. BLINK_EXPORT gfx::Rect GetBoundsInFrameCoordinates() const; - BLINK_EXPORT WebString KeyboardShortcut() const; BLINK_EXPORT WebString Language() const; BLINK_EXPORT WebAXObject InPageLinkTarget() const; BLINK_EXPORT WebVector<WebAXObject> RadioButtonsInGroup() const; @@ -244,7 +243,6 @@ BLINK_EXPORT WebNode GetNode() const; BLINK_EXPORT WebDocument GetDocument() const; - BLINK_EXPORT WebString ComputedStyleDisplay() const; BLINK_EXPORT bool AccessibilityIsIgnored() const; BLINK_EXPORT bool AccessibilityIsIncludedInTree() const;
diff --git a/third_party/blink/public/web/web_frame.h b/third_party/blink/public/web/web_frame.h index 93b6b8c..b34d2f4 100644 --- a/third_party/blink/public/web/web_frame.h +++ b/third_party/blink/public/web/web_frame.h
@@ -32,8 +32,10 @@ #define THIRD_PARTY_BLINK_PUBLIC_WEB_WEB_FRAME_H_ #include "third_party/blink/public/common/tokens/tokens.h" +#include "third_party/blink/public/mojom/frame/frame.mojom-shared.h" #include "third_party/blink/public/mojom/frame/tree_scope_type.mojom-shared.h" #include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-shared.h" +#include "third_party/blink/public/platform/cross_variant_mojo_util.h" #include "third_party/blink/public/platform/web_common.h" #include "third_party/blink/public/web/web_frame_load_type.h" #include "third_party/blink/public/web/web_node.h" @@ -79,7 +81,13 @@ virtual WebRemoteFrame* ToWebRemoteFrame() = 0; virtual const WebRemoteFrame* ToWebRemoteFrame() const = 0; - bool Swap(WebFrame*); + bool Swap(WebLocalFrame* new_frame); + bool Swap( + WebRemoteFrame* new_frame, + CrossVariantMojoAssociatedRemote<mojom::RemoteFrameHostInterfaceBase> + remote_frame_host, + CrossVariantMojoAssociatedReceiver<mojom::RemoteFrameInterfaceBase> + receiver); // This method closes and deletes the WebFrame. This is typically called by // the embedder in response to a frame detached callback to the WebFrame
diff --git a/third_party/blink/public/web/web_remote_frame.h b/third_party/blink/public/web/web_remote_frame.h index c02632d..16f38fe 100644 --- a/third_party/blink/public/web/web_remote_frame.h +++ b/third_party/blink/public/web/web_remote_frame.h
@@ -7,6 +7,7 @@ #include "third_party/blink/public/common/permissions_policy/permissions_policy.h" #include "third_party/blink/public/common/tokens/tokens.h" +#include "third_party/blink/public/mojom/frame/frame.mojom-shared.h" #include "third_party/blink/public/mojom/frame/user_activation_notification_type.mojom-shared.h" #include "third_party/blink/public/mojom/frame/user_activation_update_types.mojom-shared.h" #include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-shared.h" @@ -20,7 +21,6 @@ namespace mojom { enum class TreeScopeType; } -class AssociatedInterfaceProvider; class InterfaceRegistry; class WebElement; class WebLocalFrameClient; @@ -38,29 +38,31 @@ BLINK_EXPORT static WebRemoteFrame* Create( mojom::TreeScopeType, WebRemoteFrameClient*, - InterfaceRegistry*, - AssociatedInterfaceProvider*, const RemoteFrameToken& frame_token); BLINK_EXPORT static WebRemoteFrame* CreateMainFrame( WebView*, WebRemoteFrameClient*, - InterfaceRegistry*, - AssociatedInterfaceProvider*, const RemoteFrameToken& frame_token, const base::UnguessableToken& devtools_frame_token, - WebFrame* opener); + WebFrame* opener, + CrossVariantMojoAssociatedRemote<mojom::RemoteFrameHostInterfaceBase> + remote_frame_host, + CrossVariantMojoAssociatedReceiver<mojom::RemoteFrameInterfaceBase> + receiver); // Also performs core initialization to associate the created remote frame // with the provided <portal> or <fencedframe> element. BLINK_EXPORT static WebRemoteFrame* CreateForPortalOrFencedFrame( mojom::TreeScopeType, WebRemoteFrameClient*, - InterfaceRegistry*, - AssociatedInterfaceProvider*, const RemoteFrameToken& frame_token, const base::UnguessableToken& devtools_frame_token, - const WebElement& frame_owner); + const WebElement& frame_owner, + CrossVariantMojoAssociatedRemote<mojom::RemoteFrameHostInterfaceBase> + remote_frame_host, + CrossVariantMojoAssociatedReceiver<mojom::RemoteFrameInterfaceBase> + receiver); // Specialized factory methods to allow the embedder to replicate the frame // tree between processes. @@ -86,11 +88,13 @@ const WebString& name, const FramePolicy&, WebRemoteFrameClient*, - InterfaceRegistry*, - AssociatedInterfaceProvider*, const RemoteFrameToken& frame_token, const base::UnguessableToken& devtools_frame_token, - WebFrame* opener) = 0; + WebFrame* opener, + CrossVariantMojoAssociatedRemote<mojom::RemoteFrameHostInterfaceBase> + remote_frame_host, + CrossVariantMojoAssociatedReceiver<mojom::RemoteFrameInterfaceBase> + receiver) = 0; // Returns the frame associated with the |frame_token|. BLINK_EXPORT static WebRemoteFrame* FromFrameToken(
diff --git a/third_party/blink/public/web/web_remote_frame_client.h b/third_party/blink/public/web/web_remote_frame_client.h index c16a014..2db0ad0 100644 --- a/third_party/blink/public/web/web_remote_frame_client.h +++ b/third_party/blink/public/web/web_remote_frame_client.h
@@ -26,10 +26,6 @@ // and release any resources associated with it. virtual void FrameDetached(DetachType) {} - // Returns an AssociatedInterfaceProvider the frame can use to request - // associated interfaces from the browser. - virtual AssociatedInterfaceProvider* GetRemoteAssociatedInterfaces() = 0; - protected: virtual ~WebRemoteFrameClient() = default; };
diff --git a/third_party/blink/renderer/controller/performance_manager/renderer_resource_coordinator_impl_test.cc b/third_party/blink/renderer/controller/performance_manager/renderer_resource_coordinator_impl_test.cc index 3bfcafa..93de49f3 100644 --- a/third_party/blink/renderer/controller/performance_manager/renderer_resource_coordinator_impl_test.cc +++ b/third_party/blink/renderer/controller/performance_manager/renderer_resource_coordinator_impl_test.cc
@@ -169,7 +169,7 @@ OnRemoteIframeAttached(main_frame->GetLocalFrameToken(), remote_frame->GetRemoteFrameToken(), iframe_attribution_matcher)); - main_frame->FirstChild()->Swap(remote_frame); + frame_test_helpers::SwapRemoteFrame(main_frame->FirstChild(), remote_frame); mock_process_coordination_unit_->VerifyExpectations(); // Create another remote frame, this time with a remote parent. No @@ -196,7 +196,8 @@ new_remote_frame->GetRemoteFrameToken(), iframe_attribution_matcher)); } - main_frame->FirstChild()->Swap(new_remote_frame); + frame_test_helpers::SwapRemoteFrame(main_frame->FirstChild(), + new_remote_frame); mock_process_coordination_unit_->VerifyExpectations(); // Remote -> Local @@ -244,7 +245,7 @@ remote_frame->GetRemoteFrameToken(), iframe_attribution_matcher)); } - main_frame->FirstChild()->Swap(remote_frame); + frame_test_helpers::SwapRemoteFrame(main_frame->FirstChild(), remote_frame); mock_process_coordination_unit_->VerifyExpectations(); } @@ -269,7 +270,7 @@ WebRemoteFrameImpl* remote_frame = frame_test_helpers::CreateRemote(); EXPECT_CALL(*mock_process_coordination_unit_, OnRemoteIframeAttached(_, _, _)) .Times(0); - main_frame->FirstChild()->Swap(remote_frame); + frame_test_helpers::SwapRemoteFrame(main_frame->FirstChild(), remote_frame); mock_process_coordination_unit_->VerifyExpectations(); }
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index e88b83e..82d73e4 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -3361,6 +3361,11 @@ return localName().LowerASCII(); } +bool Element::IsHTMLWithTagName(const String& tag_name) const { + return html_names::xhtmlNamespaceURI == namespaceURI() && + localName() == String(tag_name).LowerASCII(); +} + const AtomicString& Element::LocateNamespacePrefix( const AtomicString& namespace_to_locate) const { if (!prefix().IsNull() && namespaceURI() == namespace_to_locate)
diff --git a/third_party/blink/renderer/core/dom/element.h b/third_party/blink/renderer/core/dom/element.h index 11405c2..d3323d6f 100644 --- a/third_party/blink/renderer/core/dom/element.h +++ b/third_party/blink/renderer/core/dom/element.h
@@ -467,6 +467,8 @@ const AtomicString& prefix() const { return tag_name_.Prefix(); } const AtomicString& namespaceURI() const { return tag_name_.NamespaceURI(); } + bool IsHTMLWithTagName(const String& tag_name) const; + const AtomicString& LocateNamespacePrefix( const AtomicString& namespace_uri) const;
diff --git a/third_party/blink/renderer/core/exported/web_element.cc b/third_party/blink/renderer/core/exported/web_element.cc index e0eb7e9..108cd3e 100644 --- a/third_party/blink/renderer/core/exported/web_element.cc +++ b/third_party/blink/renderer/core/exported/web_element.cc
@@ -88,14 +88,8 @@ } bool WebElement::HasHTMLTagName(const WebString& tag_name) const { - // How to create class nodeName localName - // createElement('input') HTMLInputElement INPUT input - // createElement('INPUT') HTMLInputElement INPUT input - // createElementNS(xhtmlNS, 'input') HTMLInputElement INPUT input - // createElementNS(xhtmlNS, 'INPUT') HTMLUnknownElement INPUT INPUT const Element* element = ConstUnwrap<Element>(); - return html_names::xhtmlNamespaceURI == element->namespaceURI() && - element->localName() == String(tag_name).LowerASCII(); + return element->IsHTMLWithTagName(String(tag_name)); } bool WebElement::HasAttribute(const WebString& attr_name) const {
diff --git a/third_party/blink/renderer/core/frame/frame.cc b/third_party/blink/renderer/core/frame/frame.cc index 80f4314d..1ced959 100644 --- a/third_party/blink/renderer/core/frame/frame.cc +++ b/third_party/blink/renderer/core/frame/frame.cc
@@ -35,6 +35,7 @@ #include "third_party/blink/public/common/features.h" #include "third_party/blink/public/mojom/fenced_frame/fenced_frame.mojom-blink.h" #include "third_party/blink/public/mojom/frame/frame_owner_properties.mojom-blink.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_remote_frame_client.h" #include "third_party/blink/renderer/bindings/core/v8/window_proxy_manager.h" @@ -721,7 +722,26 @@ } } -bool Frame::Swap(WebFrame* new_web_frame) { +bool Frame::Swap(WebLocalFrame* new_web_frame) { + return SwapImpl(new_web_frame, mojo::NullAssociatedRemote(), + mojo::NullAssociatedReceiver()); +} + +bool Frame::Swap(WebRemoteFrame* new_web_frame, + mojo::PendingAssociatedRemote<mojom::blink::RemoteFrameHost> + remote_frame_host, + mojo::PendingAssociatedReceiver<mojom::blink::RemoteFrame> + remote_frame_receiver) { + return SwapImpl(new_web_frame, std::move(remote_frame_host), + std::move(remote_frame_receiver)); +} + +bool Frame::SwapImpl( + WebFrame* new_web_frame, + mojo::PendingAssociatedRemote<mojom::blink::RemoteFrameHost> + remote_frame_host, + mojo::PendingAssociatedReceiver<mojom::blink::RemoteFrame> + remote_frame_receiver) { DCHECK(IsAttached()); using std::swap; @@ -775,11 +795,14 @@ GetWindowProxyManager()->ReleaseGlobalProxies(global_proxies); if (new_web_frame->IsWebRemoteFrame()) { + DCHECK(remote_frame_host && remote_frame_receiver); CHECK(!WebFrame::ToCoreFrame(*new_web_frame)); To<WebRemoteFrameImpl>(new_web_frame) ->InitializeCoreFrame(*page, owner, WebFrame::FromCoreFrame(parent_), nullptr, FrameInsertType::kInsertLater, name, - &window_agent_factory(), devtools_frame_token_); + &window_agent_factory(), devtools_frame_token_, + std::move(remote_frame_host), + std::move(remote_frame_receiver)); // At this point, a `RemoteFrame` will have already updated // `Page::MainFrame()` or `FrameOwner::ContentFrame()` as appropriate, and // its `parent_` pointer is also populated. @@ -789,6 +812,7 @@ // `Page::MainFrame()` or `FrameOwner::ContentFrame()` updates are deferred // until after `new_frame` is linked into the frame tree. // TODO(dcheng): Make local and remote frame updates more uniform. + DCHECK(!remote_frame_host && !remote_frame_receiver); } Frame* new_frame = WebFrame::ToCoreFrame(*new_web_frame);
diff --git a/third_party/blink/renderer/core/frame/frame.h b/third_party/blink/renderer/core/frame/frame.h index 74a6f72..109c963 100644 --- a/third_party/blink/renderer/core/frame/frame.h +++ b/third_party/blink/renderer/core/frame/frame.h
@@ -32,6 +32,8 @@ #include "base/check_op.h" #include "base/i18n/rtl.h" #include "base/unguessable_token.h" +#include "mojo/public/cpp/bindings/pending_associated_receiver.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" #include "services/network/public/mojom/web_sandbox_flags.mojom-blink.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/frame/frame_ad_evidence.h" @@ -41,6 +43,7 @@ #include "third_party/blink/public/common/permissions_policy/permissions_policy_features.h" #include "third_party/blink/public/common/tokens/tokens.h" #include "third_party/blink/public/mojom/fenced_frame/fenced_frame.mojom-blink-forward.h" +#include "third_party/blink/public/mojom/frame/frame.mojom-blink-forward.h" #include "third_party/blink/public/mojom/frame/frame_owner_properties.mojom-blink-forward.h" #include "third_party/blink/public/mojom/frame/user_activation_notification_type.mojom-blink-forward.h" #include "third_party/blink/public/mojom/input/scroll_direction.mojom-blink-forward.h" @@ -83,6 +86,8 @@ struct FrameLoadRequest; class WindowAgentFactory; class WebFrame; +class WebLocalFrame; +class WebRemoteFrame; enum class FrameDetachType { kRemove, kSwap }; @@ -396,7 +401,18 @@ // Detaches a frame from its parent frame if it has one. void DetachFromParent(); - bool Swap(WebFrame*); + // Swap out this frame for a new local frame. + bool Swap(WebLocalFrame*); + + // Swap out this frame for a new remote frame. This method takes the + // mojo interfaces because they are provided in the construction IPC + // as opposed to being fetched via an AssociatedInterfaceProvider which + // WebLocalFrame uses. + bool Swap(WebRemoteFrame*, + mojo::PendingAssociatedRemote<mojom::blink::RemoteFrameHost> + remote_frame_host, + mojo::PendingAssociatedReceiver<mojom::blink::RemoteFrame> + remote_frame_receiver); // Removes the given child from this frame. void RemoveChild(Frame* child); @@ -501,6 +517,12 @@ void CancelFormSubmissionWithVersion(uint64_t version); + bool SwapImpl(WebFrame*, + mojo::PendingAssociatedRemote<mojom::blink::RemoteFrameHost> + remote_frame_host, + mojo::PendingAssociatedReceiver<mojom::blink::RemoteFrame> + remote_frame_receiver); + Member<FrameClient> client_; const Member<WindowProxyManager> window_proxy_manager_; FrameLifecycle lifecycle_;
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 69509fe..bd5291f 100644 --- a/third_party/blink/renderer/core/frame/frame_test_helpers.cc +++ b/third_party/blink/renderer/core/frame/frame_test_helpers.cc
@@ -131,6 +131,16 @@ return owned_client.get(); } +template <typename T> +mojo::PendingAssociatedRemote<T> CreateStubRemoteIfNeeded( + mojo::PendingAssociatedRemote<T> remote) { + if (remote.is_valid()) + return remote; + mojo::AssociatedRemote<T> stub_remote; + std::ignore = stub_remote.BindNewEndpointAndPassDedicatedReceiver(); + return stub_remote.Unbind(); +} + viz::FrameSinkId AllocateFrameSinkId() { // A static increasing count of frame sinks created so they are all unique. static uint32_t s_frame_sink_count = 0; @@ -306,9 +316,7 @@ std::unique_ptr<TestWebRemoteFrameClient> owned_client; client = CreateDefaultClientIfNeeded(client, owned_client); auto* frame = MakeGarbageCollected<WebRemoteFrameImpl>( - mojom::blink::TreeScopeType::kDocument, client, - InterfaceRegistry::GetEmptyInterfaceRegistry(), - client->GetRemoteAssociatedInterfaces(), RemoteFrameToken()); + mojom::blink::TreeScopeType::kDocument, client, RemoteFrameToken()); client->Bind(frame, std::move(owned_client)); return frame; } @@ -322,9 +330,12 @@ client = CreateDefaultClientIfNeeded(client, owned_client); auto* frame = To<WebRemoteFrameImpl>(parent.CreateRemoteChild( mojom::blink::TreeScopeType::kDocument, name, FramePolicy(), client, - InterfaceRegistry::GetEmptyInterfaceRegistry(), - client->GetRemoteAssociatedInterfaces(), RemoteFrameToken(), - /*devtools_frame_token=*/base::UnguessableToken(), nullptr)); + RemoteFrameToken(), + /*devtools_frame_token=*/base::UnguessableToken(), /*opener=*/nullptr, + CreateStubRemoteIfNeeded<mojom::blink::RemoteFrameHost>( + mojo::NullAssociatedRemote()), + mojo::AssociatedRemote<mojom::blink::RemoteFrame>() + .BindNewEndpointAndPassDedicatedReceiver())); client->Bind(frame, std::move(owned_client)); if (!security_origin) security_origin = SecurityOrigin::CreateUniqueOpaque(); @@ -332,6 +343,17 @@ return frame; } +void SwapRemoteFrame( + WebFrame* old_frame, + WebRemoteFrame* new_remote_frame, + mojo::PendingAssociatedRemote<mojom::blink::RemoteFrameHost> frame_host) { + old_frame->Swap(new_remote_frame, + CreateStubRemoteIfNeeded<mojom::blink::RemoteFrameHost>( + std::move(frame_host)), + mojo::AssociatedRemote<mojom::blink::RemoteFrame>() + .BindNewEndpointAndPassDedicatedReceiver()); +} + WebViewHelper::WebViewHelper( CreateTestWebFrameWidgetCallback create_web_frame_callback) : web_view_(nullptr), @@ -465,11 +487,12 @@ web_remote_frame_client = CreateDefaultClientIfNeeded( web_remote_frame_client, owned_web_remote_frame_client); WebRemoteFrameImpl* frame = WebRemoteFrameImpl::CreateMainFrame( - web_view_, web_remote_frame_client, - InterfaceRegistry::GetEmptyInterfaceRegistry(), - web_remote_frame_client->GetRemoteAssociatedInterfaces(), - RemoteFrameToken(), /*devtools_frame_token=*/base::UnguessableToken(), - opener); + web_view_, web_remote_frame_client, RemoteFrameToken(), + /*devtools_frame_token=*/base::UnguessableToken(), opener, + CreateStubRemoteIfNeeded<mojom::blink::RemoteFrameHost>( + mojo::NullAssociatedRemote()), + mojo::AssociatedRemote<mojom::blink::RemoteFrame>() + .BindNewEndpointAndPassDedicatedReceiver()); web_remote_frame_client->Bind(frame, std::move(owned_web_remote_frame_client)); if (!security_origin) @@ -814,9 +837,7 @@ } } -TestWebRemoteFrameClient::TestWebRemoteFrameClient() - : associated_interface_provider_(new AssociatedInterfaceProvider(nullptr)) { -} +TestWebRemoteFrameClient::TestWebRemoteFrameClient() = default; void TestWebRemoteFrameClient::Bind( WebRemoteFrame* frame,
diff --git a/third_party/blink/renderer/core/frame/frame_test_helpers.h b/third_party/blink/renderer/core/frame/frame_test_helpers.h index 2ed99e1..96c683c0 100644 --- a/third_party/blink/renderer/core/frame/frame_test_helpers.h +++ b/third_party/blink/renderer/core/frame/frame_test_helpers.h
@@ -155,6 +155,14 @@ scoped_refptr<SecurityOrigin> = nullptr, TestWebRemoteFrameClient* = nullptr); +// Call Swap with a `new_remote_frame` stubbing out the mojo channels if +// necessary. +void SwapRemoteFrame( + WebFrame* old_frame, + WebRemoteFrame* new_remote_frame, + mojo::PendingAssociatedRemote<mojom::blink::RemoteFrameHost> = + mojo::NullAssociatedRemote()); + class TestWebFrameWidgetHost : public mojom::blink::WidgetHost, public mojom::blink::FrameWidgetHost { public: @@ -606,16 +614,11 @@ // WebRemoteFrameClient: void FrameDetached(DetachType) override; - AssociatedInterfaceProvider* GetRemoteAssociatedInterfaces() override { - return associated_interface_provider_.get(); - } private: // If set to a non-null value, self-deletes on frame detach. std::unique_ptr<TestWebRemoteFrameClient> self_owned_; - std::unique_ptr<AssociatedInterfaceProvider> associated_interface_provider_; - // This is null from when the client is created until it is initialized with // Bind(). WebRemoteFrame* frame_ = nullptr;
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 f222d27..fe163ea0 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.cc +++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -289,14 +289,14 @@ layout_shift_tracker_(MakeGarbageCollected<LayoutShiftTracker>(this)), paint_timing_detector_(MakeGarbageCollected<PaintTimingDetector>(this)), mobile_friendliness_checker_( - // Only run the mobile friendliness checker for the local main frame. - // The checker will iterate through all local frames in the current - // blink::Page. Also skip the mobile friendliness checks for + // Only run the mobile friendliness checker for the outermost main + // frame. The checker will iterate through all local frames in the + // current blink::Page. Also skip the mobile friendliness checks for // "non-ordinary" pages by checking IsLocalFrameClientImpl(), since // it's not useful to generate mobile friendliness metrics for - // devtools. - // - GetFrame().Client()->IsLocalFrameClientImpl() + // devtools, svg, etc. + GetFrame().Client()->IsLocalFrameClientImpl() && + GetFrame().IsOutermostMainFrame() ? MakeGarbageCollected<MobileFriendlinessChecker>(*this) : nullptr) #if DCHECK_IS_ON()
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.h b/third_party/blink/renderer/core/frame/local_frame_view.h index 232696d..0e6e0000 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.h +++ b/third_party/blink/renderer/core/frame/local_frame_view.h
@@ -1178,7 +1178,7 @@ Member<LayoutShiftTracker> layout_shift_tracker_; Member<PaintTimingDetector> paint_timing_detector_; - // This will be nullptr iff !frame_->IsMainFrame(). + // Non-null in the outermost main frame of an ordinary page only. Member<MobileFriendlinessChecker> mobile_friendliness_checker_; HeapHashSet<WeakMember<LifecycleNotificationObserver>> lifecycle_observers_;
diff --git a/third_party/blink/renderer/core/frame/remote_frame.cc b/third_party/blink/renderer/core/frame/remote_frame.cc index eb7499c..5d1ef16 100644 --- a/third_party/blink/renderer/core/frame/remote_frame.cc +++ b/third_party/blink/renderer/core/frame/remote_frame.cc
@@ -7,7 +7,6 @@ #include "base/stl_util.h" #include "cc/layers/surface_layer.h" #include "services/network/public/mojom/web_sandbox_flags.mojom-blink.h" -#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #include "third_party/blink/public/common/frame/frame_owner_element_type.h" #include "third_party/blink/public/common/navigation/navigation_policy.h" #include "third_party/blink/public/mojom/frame/frame.mojom-blink.h" @@ -16,7 +15,6 @@ #include "third_party/blink/public/mojom/frame/intrinsic_sizing_info.mojom-blink.h" #include "third_party/blink/public/mojom/loader/referrer.mojom-blink.h" #include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h" -#include "third_party/blink/public/platform/interface_registry.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/url_conversion.h" #include "third_party/blink/public/platform/web_url_request_util.h" @@ -100,10 +98,11 @@ FrameInsertType insert_type, const RemoteFrameToken& frame_token, WindowAgentFactory* inheriting_agent_factory, - InterfaceRegistry* interface_registry, - AssociatedInterfaceProvider* associated_interface_provider, WebFrameWidget* ancestor_widget, - const base::UnguessableToken& devtools_frame_token) + const base::UnguessableToken& devtools_frame_token, + mojo::PendingAssociatedRemote<mojom::blink::RemoteFrameHost> + remote_frame_host, + mojo::PendingAssociatedReceiver<mojom::blink::RemoteFrame> receiver) : Frame(client, page, owner, @@ -119,9 +118,6 @@ parent_local_surface_id_allocator_( std::make_unique<viz::ParentLocalSurfaceIdAllocator>()), ancestor_widget_(ancestor_widget), - interface_registry_(interface_registry - ? interface_registry - : InterfaceRegistry::GetEmptyInterfaceRegistry()), task_runner_(page.GetPageScheduler() ->GetAgentGroupScheduler() .DefaultTaskRunner()) { @@ -136,12 +132,9 @@ dom_window_ = MakeGarbageCollected<RemoteDOMWindow>(*this); - interface_registry->AddAssociatedInterface(WTF::BindRepeating( - &RemoteFrame::BindToReceiver, WrapWeakPersistent(this))); - DCHECK(task_runner_); - associated_interface_provider->GetInterface( - remote_frame_host_remote_.BindNewEndpointAndPassReceiver(task_runner_)); + remote_frame_host_remote_.Bind(std::move(remote_frame_host)); + receiver_.Bind(std::move(receiver), task_runner_); UpdateInertIfPossible(); UpdateInheritedEffectiveTouchActionIfPossible(); @@ -1087,11 +1080,4 @@ SynchronizeVisualProperties(); } -void RemoteFrame::BindToReceiver( - RemoteFrame* frame, - mojo::PendingAssociatedReceiver<mojom::blink::RemoteFrame> receiver) { - DCHECK(frame); - frame->receiver_.Bind(std::move(receiver), frame->task_runner_); -} - } // namespace blink
diff --git a/third_party/blink/renderer/core/frame/remote_frame.h b/third_party/blink/renderer/core/frame/remote_frame.h index be58d64..47da0d6b 100644 --- a/third_party/blink/renderer/core/frame/remote_frame.h +++ b/third_party/blink/renderer/core/frame/remote_frame.h
@@ -32,9 +32,7 @@ namespace blink { -class AssociatedInterfaceProvider; class ChildFrameCompositingHelper; -class InterfaceRegistry; class LocalFrame; class RemoteFrameClient; class WebFrameWidget; @@ -53,18 +51,20 @@ // For a description of |inheriting_agent_factory| go see the comment on the // Frame constructor. - RemoteFrame(RemoteFrameClient*, - Page&, - FrameOwner*, - Frame* parent, - Frame* previous_sibling, - FrameInsertType insert_type, - const RemoteFrameToken& frame_token, - WindowAgentFactory* inheriting_agent_factory, - InterfaceRegistry*, - AssociatedInterfaceProvider*, - WebFrameWidget* ancestor_widget, - const base::UnguessableToken& devtools_frame_token); + RemoteFrame( + RemoteFrameClient*, + Page&, + FrameOwner*, + Frame* parent, + Frame* previous_sibling, + FrameInsertType insert_type, + const RemoteFrameToken& frame_token, + WindowAgentFactory* inheriting_agent_factory, + WebFrameWidget* ancestor_widget, + const base::UnguessableToken& devtools_frame_token, + mojo::PendingAssociatedRemote<mojom::blink::RemoteFrameHost> + remote_frame_host, + mojo::PendingAssociatedReceiver<mojom::blink::RemoteFrame> receiver); ~RemoteFrame() override; // Frame overrides: @@ -253,10 +253,6 @@ void ApplyReplicatedPermissionsPolicyHeader(); void RecordSentVisualProperties(); - static void BindToReceiver( - RemoteFrame* frame, - mojo::PendingAssociatedReceiver<mojom::blink::RemoteFrame> receiver); - Member<RemoteFrameView> view_; RemoteSecurityContext security_context_; absl::optional<blink::FrameVisualProperties> sent_visual_properties_; @@ -275,8 +271,6 @@ // is null. WebFrameWidget* ancestor_widget_; - InterfaceRegistry* const interface_registry_; - // True when the process rendering the child's frame contents has terminated // and ChildProcessGone() is called. bool remote_process_gone_ = false;
diff --git a/third_party/blink/renderer/core/frame/remote_frame_client.h b/third_party/blink/renderer/core/frame/remote_frame_client.h index f2218e2..4f6ee29 100644 --- a/third_party/blink/renderer/core/frame/remote_frame_client.h +++ b/third_party/blink/renderer/core/frame/remote_frame_client.h
@@ -13,15 +13,12 @@ #include "third_party/blink/renderer/platform/graphics/touch_action.h" namespace blink { -class AssociatedInterfaceProvider; class RemoteFrameClient : public FrameClient { public: ~RemoteFrameClient() override = default; unsigned BackForwardLength() override = 0; - - virtual AssociatedInterfaceProvider* GetRemoteAssociatedInterfaces() = 0; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/frame/remote_frame_client_impl.cc b/third_party/blink/renderer/core/frame/remote_frame_client_impl.cc index d6626ff..5cac0ba3 100644 --- a/third_party/blink/renderer/core/frame/remote_frame_client_impl.cc +++ b/third_party/blink/renderer/core/frame/remote_frame_client_impl.cc
@@ -74,9 +74,4 @@ return To<WebViewImpl>(web_frame_->View())->HistoryListLength(); } -AssociatedInterfaceProvider* -RemoteFrameClientImpl::GetRemoteAssociatedInterfaces() { - return web_frame_->Client()->GetRemoteAssociatedInterfaces(); -} - } // namespace blink
diff --git a/third_party/blink/renderer/core/frame/remote_frame_client_impl.h b/third_party/blink/renderer/core/frame/remote_frame_client_impl.h index a6abf71e..3d64a28 100644 --- a/third_party/blink/renderer/core/frame/remote_frame_client_impl.h +++ b/third_party/blink/renderer/core/frame/remote_frame_client_impl.h
@@ -22,7 +22,6 @@ void Detached(FrameDetachType) override; unsigned BackForwardLength() override; - AssociatedInterfaceProvider* GetRemoteAssociatedInterfaces() override; WebRemoteFrameImpl* GetWebFrame() const { return web_frame_; }
diff --git a/third_party/blink/renderer/core/frame/viewport_data.cc b/third_party/blink/renderer/core/frame/viewport_data.cc index abc4cd348..212541b 100644 --- a/third_party/blink/renderer/core/frame/viewport_data.cc +++ b/third_party/blink/renderer/core/frame/viewport_data.cc
@@ -9,6 +9,7 @@ #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/local_frame_client.h" #include "third_party/blink/renderer/core/frame/settings.h" +#include "third_party/blink/renderer/core/frame/visual_viewport.h" #include "third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h" #include "third_party/blink/renderer/core/page/chrome_client.h" #include "third_party/blink/renderer/core/page/page.h" @@ -103,7 +104,8 @@ viewport_fit_ = current_viewport_fit; } - if (document_->GetFrame()->IsMainFrame()) { + if (document_->GetFrame()->IsMainFrame() && + document_->GetPage()->GetVisualViewport().IsActiveViewport()) { document_->GetPage()->GetChromeClient().DispatchViewportPropertiesDidChange( GetViewportDescription()); if (auto* mf_checker = document_->View()->GetMobileFriendlinessChecker())
diff --git a/third_party/blink/renderer/core/frame/web_frame.cc b/third_party/blink/renderer/core/frame/web_frame.cc index b440d966..1f70a26 100644 --- a/third_party/blink/renderer/core/frame/web_frame.cc +++ b/third_party/blink/renderer/core/frame/web_frame.cc
@@ -27,10 +27,20 @@ namespace blink { -bool WebFrame::Swap(WebFrame* frame) { +bool WebFrame::Swap(WebLocalFrame* frame) { return ToCoreFrame(*this)->Swap(frame); } +bool WebFrame::Swap( + WebRemoteFrame* frame, + CrossVariantMojoAssociatedRemote<mojom::blink::RemoteFrameHostInterfaceBase> + remote_frame_host, + CrossVariantMojoAssociatedReceiver<mojom::blink::RemoteFrameInterfaceBase> + remote_frame_receiver) { + return ToCoreFrame(*this)->Swap(frame, std::move(remote_frame_host), + std::move(remote_frame_receiver)); +} + void WebFrame::Detach() { ToCoreFrame(*this)->Detach(FrameDetachType::kRemove); }
diff --git a/third_party/blink/renderer/core/frame/web_frame_test.cc b/third_party/blink/renderer/core/frame/web_frame_test.cc index 6af23a5..3206ed5 100644 --- a/third_party/blink/renderer/core/frame/web_frame_test.cc +++ b/third_party/blink/renderer/core/frame/web_frame_test.cc
@@ -9196,7 +9196,7 @@ TEST_F(WebFrameSwapTest, SwapMainFrame) { WebRemoteFrame* remote_frame = frame_test_helpers::CreateRemote(); - MainFrame()->Swap(remote_frame); + frame_test_helpers::SwapRemoteFrame(MainFrame(), remote_frame); WebLocalFrame* local_frame = web_view_helper_.CreateProvisional(*remote_frame); @@ -9215,7 +9215,7 @@ EXPECT_EQ(1.25, WebView()->PageScaleFactor()); WebRemoteFrame* remote_frame = frame_test_helpers::CreateRemote(); - MainFrame()->Swap(remote_frame); + frame_test_helpers::SwapRemoteFrame(MainFrame(), remote_frame); mojo::AssociatedRemote<mojom::blink::RemoteMainFrameHost> main_frame_host; std::ignore = main_frame_host.BindNewEndpointAndPassDedicatedReceiver(); @@ -9231,7 +9231,7 @@ gfx::Size size(111, 222); WebRemoteFrame* remote_frame = frame_test_helpers::CreateRemote(); - MainFrame()->Swap(remote_frame); + frame_test_helpers::SwapRemoteFrame(MainFrame(), remote_frame); To<WebViewImpl>(remote_frame->View())->Resize(size); @@ -9253,7 +9253,7 @@ TEST_F(WebFrameSwapTest, ValidateBrowserControlsSizeOnRemoteToLocalMainFrameSwap) { WebRemoteFrame* remote_frame = frame_test_helpers::CreateRemote(); - MainFrame()->Swap(remote_frame); + frame_test_helpers::SwapRemoteFrame(MainFrame(), remote_frame); // Create a provisional main frame frame but don't swap it in yet. WebLocalFrame* local_frame = @@ -9294,8 +9294,10 @@ if (title.IsEmpty()) return; - if (!Frame()->Parent()) - Frame()->Swap(frame_test_helpers::CreateRemote()); + if (!Frame()->Parent()) { + frame_test_helpers::SwapRemoteFrame(Frame(), + frame_test_helpers::CreateRemote()); + } } }; @@ -9347,7 +9349,12 @@ WebFrame* parent, WebFrame* new_child) { SCOPED_TRACE(message); - parent->FirstChild()->Swap(new_child); + if (new_child->IsWebLocalFrame()) { + parent->FirstChild()->Swap(new_child->ToWebLocalFrame()); + } else { + frame_test_helpers::SwapRemoteFrame(parent->FirstChild(), + new_child->ToWebRemoteFrame()); + } EXPECT_EQ(new_child, parent->FirstChild()); EXPECT_EQ(new_child->Parent(), parent); @@ -9385,7 +9392,7 @@ EXPECT_FALSE(main_frame_client->DidPropagateDisplayNoneProperty()); WebRemoteFrame* remote_frame = frame_test_helpers::CreateRemote(); - child_frame->Swap(remote_frame); + frame_test_helpers::SwapRemoteFrame(child_frame, remote_frame); EXPECT_FALSE(main_frame_client->DidPropagateDisplayNoneProperty()); WebLocalFrame* local_frame = @@ -9400,7 +9407,13 @@ WebFrame* parent, WebFrame* new_child) { SCOPED_TRACE(message); - parent->FirstChild()->NextSibling()->Swap(new_child); + + if (new_child->IsWebLocalFrame()) { + parent->FirstChild()->NextSibling()->Swap(new_child->ToWebLocalFrame()); + } else { + frame_test_helpers::SwapRemoteFrame(parent->FirstChild()->NextSibling(), + new_child->ToWebRemoteFrame()); + } Frame* parent_frame = WebFrame::ToCoreFrame(*parent); Frame* new_child_frame = WebFrame::ToCoreFrame(*new_child); @@ -9438,7 +9451,12 @@ WebFrame* parent, WebFrame* new_child) { SCOPED_TRACE(message); - parent->LastChild()->Swap(new_child); + if (new_child->IsWebLocalFrame()) { + parent->LastChild()->Swap(new_child->ToWebLocalFrame()); + } else { + frame_test_helpers::SwapRemoteFrame(parent->LastChild(), + new_child->ToWebRemoteFrame()); + } EXPECT_EQ(new_child, parent->LastChild()); EXPECT_EQ(new_child->Parent(), parent); @@ -9496,7 +9514,13 @@ SCOPED_TRACE(message); EXPECT_TRUE(old_frame->FirstChild()); - old_frame->Swap(new_frame); + + if (new_frame->IsWebLocalFrame()) { + old_frame->Swap(new_frame->ToWebLocalFrame()); + } else { + frame_test_helpers::SwapRemoteFrame(old_frame, + new_frame->ToWebRemoteFrame()); + } EXPECT_FALSE(new_frame->FirstChild()); EXPECT_FALSE(new_frame->LastChild()); @@ -9593,7 +9617,7 @@ // Make sure window reference stays the same when swapping to a remote frame. WebRemoteFrame* remote_frame = frame_test_helpers::CreateRemote(); WebFrame* target_frame = MainFrame()->FirstChild()->NextSibling(); - target_frame->Swap(remote_frame); + frame_test_helpers::SwapRemoteFrame(target_frame, remote_frame); v8::Local<v8::Value> remote_window = MainFrame()->ExecuteScriptAndReturnValue( WebScriptSource("document.querySelector('#frame2').contentWindow;")); EXPECT_TRUE(original_window->StrictEquals(remote_window)); @@ -9626,7 +9650,7 @@ // Swap the frame to a remote frame. WebRemoteFrame* remote_frame = frame_test_helpers::CreateRemote(); WebFrame* target_frame = MainFrame()->FirstChild(); - target_frame->Swap(remote_frame); + frame_test_helpers::SwapRemoteFrame(target_frame, remote_frame); remote_frame->SetReplicatedOrigin( WebSecurityOrigin(SecurityOrigin::CreateUniqueOpaque()), false); @@ -9660,7 +9684,7 @@ ASSERT_TRUE(last_child->IsObject()); WebRemoteFrame* remote_frame = frame_test_helpers::CreateRemote(); - MainFrame()->LastChild()->Swap(remote_frame); + frame_test_helpers::SwapRemoteFrame(MainFrame()->LastChild(), remote_frame); v8::Local<v8::Value> remote_window_top = MainFrame()->ExecuteScriptAndReturnValue(WebScriptSource("saved.top")); EXPECT_TRUE(remote_window_top->IsObject()); @@ -9681,7 +9705,7 @@ v8::HandleScope scope(v8::Isolate::GetCurrent()); WebRemoteFrame* remote_frame = frame_test_helpers::CreateRemote(); - MainFrame()->LastChild()->Swap(remote_frame); + frame_test_helpers::SwapRemoteFrame(MainFrame()->LastChild(), remote_frame); v8::Local<v8::Value> remote_window = MainFrame()->ExecuteScriptAndReturnValue(WebScriptSource("window[2]")); EXPECT_TRUE(remote_window->IsObject()); @@ -9695,7 +9719,7 @@ v8::HandleScope scope(v8::Isolate::GetCurrent()); WebRemoteFrame* remote_frame = frame_test_helpers::CreateRemote(); - MainFrame()->LastChild()->Swap(remote_frame); + frame_test_helpers::SwapRemoteFrame(MainFrame()->LastChild(), remote_frame); v8::Local<v8::Value> remote_window_length = MainFrame()->ExecuteScriptAndReturnValue( WebScriptSource("window[2].length")); @@ -9710,7 +9734,7 @@ // named window access on a remote window works. For now, just test that // accessing a named property doesn't crash. WebRemoteFrame* remote_frame = frame_test_helpers::CreateRemote(); - MainFrame()->LastChild()->Swap(remote_frame); + frame_test_helpers::SwapRemoteFrame(MainFrame()->LastChild(), remote_frame); remote_frame->SetReplicatedOrigin( WebSecurityOrigin(SecurityOrigin::CreateUniqueOpaque()), false); v8::Local<v8::Value> remote_window_property = @@ -9724,7 +9748,7 @@ v8::HandleScope scope(isolate); WebRemoteFrame* remote_frame = frame_test_helpers::CreateRemote(); - MainFrame()->LastChild()->Swap(remote_frame); + frame_test_helpers::SwapRemoteFrame(MainFrame()->LastChild(), remote_frame); v8::Local<v8::Value> to_string_result = MainFrame()->ExecuteScriptAndReturnValue( WebScriptSource("Object.prototype.toString.call(window[2])")); @@ -9740,7 +9764,7 @@ v8::HandleScope scope(v8::Isolate::GetCurrent()); WebRemoteFrame* remote_parent_frame = frame_test_helpers::CreateRemote(); - MainFrame()->Swap(remote_parent_frame); + frame_test_helpers::SwapRemoteFrame(MainFrame(), remote_parent_frame); remote_parent_frame->SetReplicatedOrigin( WebSecurityOrigin(SecurityOrigin::CreateUniqueOpaque()), false); @@ -9768,7 +9792,7 @@ v8::HandleScope scope(v8::Isolate::GetCurrent()); WebRemoteFrame* remote_parent_frame = frame_test_helpers::CreateRemote(); - MainFrame()->Swap(remote_parent_frame); + frame_test_helpers::SwapRemoteFrame(MainFrame(), remote_parent_frame); remote_parent_frame->SetReplicatedOrigin( WebSecurityOrigin(SecurityOrigin::CreateUniqueOpaque()), false); @@ -9811,7 +9835,7 @@ WebRemoteFrame* remote_frame = frame_test_helpers::CreateRemote(); WebFrame* target_frame = MainFrame()->FirstChild(); ASSERT_TRUE(target_frame); - target_frame->Swap(remote_frame); + frame_test_helpers::SwapRemoteFrame(target_frame, remote_frame); ASSERT_TRUE(MainFrame()->FirstChild()); ASSERT_EQ(MainFrame()->FirstChild(), remote_frame); @@ -9847,15 +9871,15 @@ TEST_F(WebFrameSwapTest, NavigateRemoteFrameViaLocation) { frame_test_helpers::TestWebRemoteFrameClient client; + RemoteFrameHostInterceptor interceptor; WebRemoteFrame* remote_frame = frame_test_helpers::CreateRemote(&client); WebFrame* target_frame = MainFrame()->FirstChild(); ASSERT_TRUE(target_frame); - target_frame->Swap(remote_frame); + frame_test_helpers::SwapRemoteFrame(target_frame, remote_frame, + interceptor.BindNewAssociatedRemote()); ASSERT_TRUE(MainFrame()->FirstChild()); ASSERT_EQ(MainFrame()->FirstChild(), remote_frame); - RemoteFrameHostInterceptor interceptor; - interceptor.Init(client.GetRemoteAssociatedInterfaces()); remote_frame->SetReplicatedOrigin( WebSecurityOrigin::CreateFromString("http://127.0.0.1"), false); MainFrame()->ExecuteScript( @@ -9873,9 +9897,11 @@ TEST_F(WebFrameSwapTest, WindowOpenOnRemoteFrame) { frame_test_helpers::TestWebRemoteFrameClient remote_client; + RemoteFrameHostInterceptor interceptor; WebRemoteFrame* remote_frame = frame_test_helpers::CreateRemote(&remote_client); - MainFrame()->FirstChild()->Swap(remote_frame); + frame_test_helpers::SwapRemoteFrame(MainFrame()->FirstChild(), remote_frame, + interceptor.BindNewAssociatedRemote()); remote_frame->SetReplicatedOrigin( WebSecurityOrigin(SecurityOrigin::CreateUniqueOpaque()), false); @@ -9883,8 +9909,6 @@ LocalDOMWindow* main_window = To<WebLocalFrameImpl>(MainFrame())->GetFrame()->DomWindow(); - RemoteFrameHostInterceptor interceptor; - interceptor.Init(remote_client.GetRemoteAssociatedInterfaces()); String destination = "data:text/html:destination"; NonThrowableExceptionState exception_state; ScriptState* script_state = @@ -10890,10 +10914,11 @@ )HTML"); frame_test_helpers::TestWebRemoteFrameClient remote_frame_client; TestViewportIntersection remote_frame_host; - remote_frame_host.Init(remote_frame_client.GetRemoteAssociatedInterfaces()); WebRemoteFrameImpl* remote_frame = frame_test_helpers::CreateRemote(&remote_frame_client); - web_view_helper.LocalMainFrame()->FirstChild()->Swap(remote_frame); + frame_test_helpers::SwapRemoteFrame( + web_view_helper.LocalMainFrame()->FirstChild(), remote_frame, + remote_frame_host.BindNewAssociatedRemote()); web_view->MainFrameImpl() ->GetFrame() ->View() @@ -11050,8 +11075,6 @@ web_view_helper_.InitializeAndLoad(base_url_ + "single_iframe.html") ->MainFrameImpl(); web_view_helper_.Resize(gfx::Size(640, 480)); - remote_frame_host_.Init( - remote_frame_client_.GetRemoteAssociatedInterfaces()); web_remote_frame_ = frame_test_helpers::CreateRemote(&remote_frame_client_); } @@ -11066,7 +11089,9 @@ } void SwapLocalFrameToRemoteFrame() { - MainFrame()->LastChild()->Swap(RemoteFrame()); + frame_test_helpers::SwapRemoteFrame( + MainFrame()->LastChild(), RemoteFrame(), + remote_frame_host_.BindNewAssociatedRemote()); } WebLocalFrame* MainFrame() { return frame_; } @@ -13544,10 +13569,11 @@ )HTML"); frame_test_helpers::TestWebRemoteFrameClient remote_frame_client; TestViewportIntersection remote_frame_host; - remote_frame_host.Init(remote_frame_client.GetRemoteAssociatedInterfaces()); WebRemoteFrame* remote_frame = frame_test_helpers::CreateRemote(&remote_frame_client); - MainFrame().FirstChild()->Swap(remote_frame); + frame_test_helpers::SwapRemoteFrame( + MainFrame().FirstChild(), remote_frame, + remote_frame_host.BindNewAssociatedRemote()); Compositor().BeginFrame(); RunPendingTasks(); EXPECT_TRUE(remote_frame_host.GetIntersectionState() @@ -13949,7 +13975,8 @@ )HTML"); WebRemoteFrameImpl* remote_frame = frame_test_helpers::CreateRemote(); - web_view_helper.LocalMainFrame()->FirstChild()->Swap(remote_frame); + frame_test_helpers::SwapRemoteFrame( + web_view_helper.LocalMainFrame()->FirstChild(), remote_frame); remote_frame->SetReplicatedOrigin( WebSecurityOrigin(SecurityOrigin::CreateUniqueOpaque()), false); @@ -13988,7 +14015,8 @@ )HTML"); WebRemoteFrameImpl* remote_frame = frame_test_helpers::CreateRemote(); - web_view_helper.LocalMainFrame()->FirstChild()->Swap(remote_frame); + frame_test_helpers::SwapRemoteFrame( + web_view_helper.LocalMainFrame()->FirstChild(), remote_frame); remote_frame->SetReplicatedOrigin( WebSecurityOrigin(SecurityOrigin::CreateUniqueOpaque()), false); @@ -14027,7 +14055,8 @@ )HTML"); WebRemoteFrameImpl* remote_frame = frame_test_helpers::CreateRemote(); - web_view_helper.LocalMainFrame()->FirstChild()->Swap(remote_frame); + frame_test_helpers::SwapRemoteFrame( + web_view_helper.LocalMainFrame()->FirstChild(), remote_frame); remote_frame->SetReplicatedOrigin( WebSecurityOrigin(SecurityOrigin::CreateUniqueOpaque()), false); @@ -14065,7 +14094,8 @@ )HTML"); WebRemoteFrameImpl* remote_frame = frame_test_helpers::CreateRemote(); - web_view_helper.LocalMainFrame()->FirstChild()->Swap(remote_frame); + frame_test_helpers::SwapRemoteFrame( + web_view_helper.LocalMainFrame()->FirstChild(), remote_frame); remote_frame->SetReplicatedOrigin( WebSecurityOrigin(SecurityOrigin::CreateUniqueOpaque()), false);
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_test.cc b/third_party/blink/renderer/core/frame/web_frame_widget_test.cc index ae872b2..13db699f 100644 --- a/third_party/blink/renderer/core/frame/web_frame_widget_test.cc +++ b/third_party/blink/renderer/core/frame/web_frame_widget_test.cc
@@ -844,7 +844,8 @@ WebFrame* grandchild = WebView().MainFrame()->FirstChild()->FirstChild(); EXPECT_TRUE(grandchild); EXPECT_TRUE(grandchild->IsWebLocalFrame()); - grandchild->Swap(frame_test_helpers::CreateRemote()); + frame_test_helpers::SwapRemoteFrame(grandchild, + frame_test_helpers::CreateRemote()); } auto* widget = WebView().MainFrameViewWidget(); widget->SetPageScaleStateAndLimits(1.3f, true, 1.0f, 3.0f);
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 780effe..93d6e572 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
@@ -52,57 +52,56 @@ return WebRemoteFrameImpl::FromFrame(*frame); } -WebRemoteFrame* WebRemoteFrame::Create( - mojom::blink::TreeScopeType scope, - WebRemoteFrameClient* client, - InterfaceRegistry* interface_registry, - AssociatedInterfaceProvider* associated_interface_provider, - const RemoteFrameToken& frame_token) { - return MakeGarbageCollected<WebRemoteFrameImpl>( - scope, client, interface_registry, associated_interface_provider, - frame_token); +WebRemoteFrame* WebRemoteFrame::Create(mojom::blink::TreeScopeType scope, + WebRemoteFrameClient* client, + const RemoteFrameToken& frame_token) { + return MakeGarbageCollected<WebRemoteFrameImpl>(scope, client, frame_token); } // static WebRemoteFrame* WebRemoteFrame::CreateMainFrame( WebView* web_view, WebRemoteFrameClient* client, - InterfaceRegistry* interface_registry, - AssociatedInterfaceProvider* associated_interface_provider, const RemoteFrameToken& frame_token, const base::UnguessableToken& devtools_frame_token, - WebFrame* opener) { + WebFrame* opener, + CrossVariantMojoAssociatedRemote<mojom::blink::RemoteFrameHostInterfaceBase> + remote_frame_host, + CrossVariantMojoAssociatedReceiver<mojom::blink::RemoteFrameInterfaceBase> + receiver) { return WebRemoteFrameImpl::CreateMainFrame( - web_view, client, interface_registry, associated_interface_provider, - frame_token, devtools_frame_token, opener); + web_view, client, frame_token, devtools_frame_token, opener, + std::move(remote_frame_host), std::move(receiver)); } // static WebRemoteFrame* WebRemoteFrame::CreateForPortalOrFencedFrame( mojom::blink::TreeScopeType scope, WebRemoteFrameClient* client, - InterfaceRegistry* interface_registry, - AssociatedInterfaceProvider* associated_interface_provider, const RemoteFrameToken& frame_token, const base::UnguessableToken& devtools_frame_token, - const WebElement& frame_owner) { + const WebElement& frame_owner, + CrossVariantMojoAssociatedRemote<mojom::blink::RemoteFrameHostInterfaceBase> + remote_frame_host, + CrossVariantMojoAssociatedReceiver<mojom::blink::RemoteFrameInterfaceBase> + receiver) { return WebRemoteFrameImpl::CreateForPortalOrFencedFrame( - scope, client, interface_registry, associated_interface_provider, - frame_token, devtools_frame_token, frame_owner); + scope, client, frame_token, devtools_frame_token, frame_owner, + std::move(remote_frame_host), std::move(receiver)); } // static WebRemoteFrameImpl* WebRemoteFrameImpl::CreateMainFrame( WebView* web_view, WebRemoteFrameClient* client, - InterfaceRegistry* interface_registry, - AssociatedInterfaceProvider* associated_interface_provider, const RemoteFrameToken& frame_token, const base::UnguessableToken& devtools_frame_token, - WebFrame* opener) { + WebFrame* opener, + mojo::PendingAssociatedRemote<mojom::blink::RemoteFrameHost> + remote_frame_host, + mojo::PendingAssociatedReceiver<mojom::blink::RemoteFrame> receiver) { WebRemoteFrameImpl* frame = MakeGarbageCollected<WebRemoteFrameImpl>( - mojom::blink::TreeScopeType::kDocument, client, interface_registry, - associated_interface_provider, frame_token); + mojom::blink::TreeScopeType::kDocument, client, frame_token); Page& page = *To<WebViewImpl>(web_view)->GetPage(); // It would be nice to DCHECK that the main frame is not set yet here. // Unfortunately, there is an edge case with a pending RenderFrameHost that @@ -116,7 +115,7 @@ page, nullptr, nullptr, nullptr, FrameInsertType::kInsertInConstructor, g_null_atom, opener ? &ToCoreFrame(*opener)->window_agent_factory() : nullptr, - devtools_frame_token); + devtools_frame_token, std::move(remote_frame_host), std::move(receiver)); Frame* opener_frame = opener ? ToCoreFrame(*opener) : nullptr; ToCoreFrame(*frame)->SetOpenerDoNotNotify(opener_frame); return frame; @@ -125,14 +124,14 @@ WebRemoteFrameImpl* WebRemoteFrameImpl::CreateForPortalOrFencedFrame( mojom::blink::TreeScopeType scope, WebRemoteFrameClient* client, - InterfaceRegistry* interface_registry, - AssociatedInterfaceProvider* associated_interface_provider, const RemoteFrameToken& frame_token, const base::UnguessableToken& devtools_frame_token, - const WebElement& frame_owner) { - auto* frame = MakeGarbageCollected<WebRemoteFrameImpl>( - scope, client, interface_registry, associated_interface_provider, - frame_token); + const WebElement& frame_owner, + mojo::PendingAssociatedRemote<mojom::blink::RemoteFrameHost> + remote_frame_host, + mojo::PendingAssociatedReceiver<mojom::blink::RemoteFrame> receiver) { + auto* frame = + MakeGarbageCollected<WebRemoteFrameImpl>(scope, client, frame_token); // We first convert this to a raw blink::Element*, and manually convert this // to an HTMLElement*. That is the only way the IsA<> and To<> casts below @@ -149,7 +148,8 @@ frame->InitializeCoreFrame( *host_frame->GetPage(), frame_owner_element, /*parent=*/nullptr, /*previous_sibling=*/nullptr, FrameInsertType::kInsertInConstructor, - g_null_atom, &host_frame->window_agent_factory(), devtools_frame_token); + g_null_atom, &host_frame->window_agent_factory(), devtools_frame_token, + std::move(remote_frame_host), std::move(receiver)); return frame; } @@ -241,7 +241,11 @@ FrameInsertType insert_type, const AtomicString& name, WindowAgentFactory* window_agent_factory, - const base::UnguessableToken& devtools_frame_token) { + const base::UnguessableToken& devtools_frame_token, + mojo::PendingAssociatedRemote<mojom::blink::RemoteFrameHost> + remote_frame_host, + mojo::PendingAssociatedReceiver<mojom::blink::RemoteFrame> + remote_frame_receiver) { Frame* parent_frame = parent ? ToCoreFrame(*parent) : nullptr; Frame* previous_sibling_frame = previous_sibling ? ToCoreFrame(*previous_sibling) : nullptr; @@ -268,11 +272,12 @@ ancestor_widget = WebLocalFrameImpl::FromFrame(local_frame)->FrameWidget(); } + DCHECK(remote_frame_host && remote_frame_receiver); SetCoreFrame(MakeGarbageCollected<RemoteFrame>( frame_client_.Get(), page, owner, parent_frame, previous_sibling_frame, - insert_type, GetRemoteFrameToken(), window_agent_factory, - interface_registry_, associated_interface_provider_, ancestor_widget, - devtools_frame_token)); + insert_type, GetRemoteFrameToken(), window_agent_factory, ancestor_widget, + devtools_frame_token, std::move(remote_frame_host), + std::move(remote_frame_receiver))); if (ancestor_widget) InitializeFrameVisualProperties(ancestor_widget, View()); @@ -286,14 +291,15 @@ const WebString& name, const FramePolicy& frame_policy, WebRemoteFrameClient* client, - InterfaceRegistry* interface_registry, - AssociatedInterfaceProvider* associated_interface_provider, const RemoteFrameToken& frame_token, const base::UnguessableToken& devtools_frame_token, - WebFrame* opener) { - auto* child = MakeGarbageCollected<WebRemoteFrameImpl>( - scope, client, interface_registry, associated_interface_provider, - frame_token); + WebFrame* opener, + CrossVariantMojoAssociatedRemote<mojom::blink::RemoteFrameHostInterfaceBase> + remote_frame_host, + CrossVariantMojoAssociatedReceiver<mojom::blink::RemoteFrameInterfaceBase> + receiver) { + auto* child = + MakeGarbageCollected<WebRemoteFrameImpl>(scope, client, frame_token); auto* owner = MakeGarbageCollected<RemoteFrameOwner>( frame_policy, WebFrameOwnerProperties()); WindowAgentFactory* window_agent_factory = nullptr; @@ -305,7 +311,8 @@ child->InitializeCoreFrame(*GetFrame()->GetPage(), owner, this, LastChild(), FrameInsertType::kInsertInConstructor, name, - window_agent_factory, devtools_frame_token); + window_agent_factory, devtools_frame_token, + std::move(remote_frame_host), std::move(receiver)); Frame* opener_frame = opener ? ToCoreFrame(*opener) : nullptr; ToCoreFrame(*child)->SetOpenerDoNotNotify(opener_frame); return child; @@ -422,17 +429,12 @@ return GetFrame()->IsAdSubframe(); } -WebRemoteFrameImpl::WebRemoteFrameImpl( - mojom::blink::TreeScopeType scope, - WebRemoteFrameClient* client, - InterfaceRegistry* interface_registry, - AssociatedInterfaceProvider* associated_interface_provider, - const RemoteFrameToken& frame_token) +WebRemoteFrameImpl::WebRemoteFrameImpl(mojom::blink::TreeScopeType scope, + WebRemoteFrameClient* client, + const RemoteFrameToken& frame_token) : WebRemoteFrame(scope, frame_token), client_(client), - frame_client_(MakeGarbageCollected<RemoteFrameClientImpl>(this)), - interface_registry_(interface_registry), - associated_interface_provider_(associated_interface_provider) { + frame_client_(MakeGarbageCollected<RemoteFrameClientImpl>(this)) { DCHECK(client); }
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 05eab05c..457d8b5 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
@@ -34,24 +34,25 @@ static WebRemoteFrameImpl* CreateMainFrame( WebView*, WebRemoteFrameClient*, - InterfaceRegistry*, - AssociatedInterfaceProvider*, const RemoteFrameToken& frame_token, const base::UnguessableToken& devtools_frame_token, - WebFrame* opener); + WebFrame* opener, + mojo::PendingAssociatedRemote<mojom::blink::RemoteFrameHost> + remote_frame_host, + mojo::PendingAssociatedReceiver<mojom::blink::RemoteFrame> receiver); + static WebRemoteFrameImpl* CreateForPortalOrFencedFrame( mojom::blink::TreeScopeType, WebRemoteFrameClient*, - InterfaceRegistry*, - AssociatedInterfaceProvider*, const RemoteFrameToken& frame_token, const base::UnguessableToken& devtools_frame_token, - const WebElement& frame_owner); + const WebElement& frame_owner, + mojo::PendingAssociatedRemote<mojom::blink::RemoteFrameHost> + remote_frame_host, + mojo::PendingAssociatedReceiver<mojom::blink::RemoteFrame> receiver); WebRemoteFrameImpl(mojom::blink::TreeScopeType, WebRemoteFrameClient*, - InterfaceRegistry*, - AssociatedInterfaceProvider*, const RemoteFrameToken& frame_token); ~WebRemoteFrameImpl() override; @@ -76,11 +77,13 @@ const WebString& name, const FramePolicy&, WebRemoteFrameClient*, - InterfaceRegistry*, - AssociatedInterfaceProvider*, const RemoteFrameToken& frame_token, const base::UnguessableToken& devtools_frame_token, - WebFrame* opener) override; + WebFrame* opener, + CrossVariantMojoAssociatedRemote< + mojom::blink::RemoteFrameHostInterfaceBase> remote_frame_host, + CrossVariantMojoAssociatedReceiver<mojom::blink::RemoteFrameInterfaceBase> + receiver) override; void SetReplicatedOrigin( const WebSecurityOrigin&, bool is_potentially_trustworthy_opaque_origin) override; @@ -104,14 +107,18 @@ const FrameVisualProperties& GetPendingVisualPropertiesForTesting() const override; bool IsAdSubframe() const override; - void InitializeCoreFrame(Page&, - FrameOwner*, - WebFrame* parent, - WebFrame* previous_sibling, - FrameInsertType, - const AtomicString& name, - WindowAgentFactory*, - const base::UnguessableToken& devtools_frame_token); + void InitializeCoreFrame( + Page&, + FrameOwner*, + WebFrame* parent, + WebFrame* previous_sibling, + FrameInsertType, + const AtomicString& name, + WindowAgentFactory*, + const base::UnguessableToken& devtools_frame_token, + mojo::PendingAssociatedRemote<mojom::blink::RemoteFrameHost> + remote_frame_host, + mojo::PendingAssociatedReceiver<mojom::blink::RemoteFrame> receiver); RemoteFrame* GetFrame() const { return frame_.Get(); } WebRemoteFrameClient* Client() const { return client_; } @@ -143,9 +150,6 @@ Member<RemoteFrameClientImpl> frame_client_; Member<RemoteFrame> frame_; - InterfaceRegistry* const interface_registry_; - AssociatedInterfaceProvider* const associated_interface_provider_; - // Oilpan: WebRemoteFrameImpl must remain alive until close() is called. // Accomplish that by keeping a self-referential Persistent<>. It is // cleared upon close().
diff --git a/third_party/blink/renderer/core/html/forms/date_time_local_input_type.cc b/third_party/blink/renderer/core/html/forms/date_time_local_input_type.cc index 5ca494e..b17628c 100644 --- a/third_party/blink/renderer/core/html/forms/date_time_local_input_type.cc +++ b/third_party/blink/renderer/core/html/forms/date_time_local_input_type.cc
@@ -111,7 +111,7 @@ } void DateTimeLocalInputType::WarnIfValueIsInvalid(const String& value) const { - if (value != GetElement().SanitizeValue(value)) + if (value && value != GetElement().SanitizeValue(value)) AddWarningToConsole( "The specified value %s does not conform to the required format. The " "format is \"yyyy-MM-ddThh:mm\" followed by optional \":ss\" or "
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc index a2435657..f315304 100644 --- a/third_party/blink/renderer/core/layout/layout_object.cc +++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -2852,10 +2852,7 @@ StyleRef().OverflowY() == EOverflow::kVisible)) { UseCounter::Count(GetDocument(), WebFeature::kExplicitOverflowVisibleOnReplacedElement); - if (StyleRef().GetObjectFit() == EObjectFit::kNone || - StyleRef().GetObjectFit() == EObjectFit::kCover || - StyleRef().ObjectPosition() != - LengthPoint(Length::Percent(50.0), Length::Percent(50.0))) { + if (!StyleRef().ObjectPropertiesPreventReplacedOverflow()) { UseCounter::Count( GetDocument(), WebFeature::
diff --git a/third_party/blink/renderer/core/layout/layout_replaced.cc b/third_party/blink/renderer/core/layout/layout_replaced.cc index f3e1b60..b55db6c3 100644 --- a/third_party/blink/renderer/core/layout/layout_replaced.cc +++ b/third_party/blink/renderer/core/layout/layout_replaced.cc
@@ -26,6 +26,7 @@ #include "base/memory/scoped_refptr.h" #include "third_party/blink/renderer/core/editing/position_with_affinity.h" #include "third_party/blink/renderer/core/html/html_dimension.h" +#include "third_party/blink/renderer/core/inspector/console_message.h" #include "third_party/blink/renderer/core/layout/api/line_layout_block_flow.h" #include "third_party/blink/renderer/core/layout/geometry/logical_offset.h" #include "third_party/blink/renderer/core/layout/geometry/logical_size.h" @@ -101,6 +102,21 @@ : ComputedStyleInitialValues::InitialZoom(); if (Style() && StyleRef().EffectiveZoom() != old_zoom) IntrinsicSizeChanged(); + + if ((IsLayoutImage() || IsVideo() || IsCanvas()) && !ClipsToContentBox() && + !StyleRef().ObjectPropertiesPreventReplacedOverflow()) { + static constexpr const char kErrorMessage[] = + "Specifying 'overflow: visible' on img, video and canvas tags may " + "cause them to produce visual content outside of the element bounds. " + "See " + "https://github.com/WICG/shared-element-transitions/blob/main/" + "debugging_overflow_on_images.md for details."; + auto* console_message = MakeGarbageCollected<ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kRendering, + mojom::blink::ConsoleMessageLevel::kWarning, kErrorMessage); + constexpr bool kDiscardDuplicates = true; + GetDocument().AddConsoleMessage(console_message, kDiscardDuplicates); + } } void LayoutReplaced::UpdateLayout() {
diff --git a/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.cc index f39a89a1..e4a9381c 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.cc
@@ -706,6 +706,7 @@ bool allow_discard_start_margin = column_break_token && !column_break_token->IsCausedByColumnSpanner(); bool has_violating_break = false; + bool has_oof_fragmentainer_descendants = false; LayoutUnit column_inline_offset(BorderScrollbarPadding().inline_start); int actual_column_count = 0; @@ -739,6 +740,11 @@ const auto& column = To<NGPhysicalBoxFragment>(result->PhysicalFragment()); + if (!has_oof_fragmentainer_descendants && balance_columns && + NGFragmentedOutOfFlowData:: + HasOutOfFlowPositionedFragmentainerDescendants(column)) + has_oof_fragmentainer_descendants = true; + // Add the new column fragment to the list, but don't commit anything to // the fragment builder until we know whether these are the final columns. LogicalOffset logical_offset(column_inline_offset, row_offset); @@ -822,6 +828,49 @@ break; } + // Any OOFs contained within this multicol get laid out once all columns + // complete layout. However, OOFs should affect column balancing. Pass the + // current set of columns into NGOutOfFlowLayoutPart to determine if OOF + // layout will affect column balancing in any way (without actually adding + // the OOF results to the builder - this will be handled at a later point). + if (has_oof_fragmentainer_descendants) { + // If, for example, the columns get split by a column spanner, the offset + // of an OOF's containing block will be relative to the first + // fragmentainer in the first row. However, we are only concerned about + // the current row of columns, so we should adjust the containing block + // offsets to be relative to the first column in the current row. + LayoutUnit containing_block_adjustment = -TotalColumnBlockSize(); + + NGOutOfFlowLayoutPart::ColumnBalancingInfo column_balancing_info; + for (wtf_size_t i = 0; i < new_columns.size(); i++) { + auto& new_column = new_columns[i]; + column_balancing_info.columns.emplace_back(new_column.offset, + &new_column.Fragment()); + + // Because the current set of columns haven't been added to the builder + // yet, any OOF descendants won't have been propagated up yet. Instead, + // propagate any OOF descendants up to |column_balancing_info| so that + // they can be passed into NGOutOfFlowLayoutPart (without affecting the + // builder). + container_builder_.PropagateOOFFragmentainerDescendants( + new_column.Fragment(), new_column.offset, + /* relative_offset */ LogicalOffset(), containing_block_adjustment, + /* fixedpos_containing_block */ nullptr, + &column_balancing_info.out_of_flow_fragmentainer_descendants); + } + DCHECK(column_balancing_info.HasOutOfFlowFragmentainerDescendants()); + + NGOutOfFlowLayoutPart(Node(), ConstraintSpace(), &container_builder_) + .HandleFragmentation(&column_balancing_info); + actual_column_count += column_balancing_info.num_new_columns; + if (column_balancing_info.minimal_space_shortage > LayoutUnit()) { + UpdateMinimalSpaceShortage(column_balancing_info.minimal_space_shortage, + &minimal_space_shortage); + } + if (!has_violating_break) + has_violating_break = column_balancing_info.has_violating_break; + } + // We're balancing columns. Check if the column block-size that we laid out // with was satisfactory. If not, stretch and retry, if possible. // @@ -1398,6 +1447,20 @@ return space_builder.ToConstraintSpace(); } +LayoutUnit NGColumnLayoutAlgorithm::TotalColumnBlockSize() const { + LayoutUnit total_block_size; + WritingMode writing_mode = Style().GetWritingMode(); + for (auto& child : container_builder_.Children()) { + if (child.fragment->IsFragmentainerBox()) { + LayoutUnit fragmentainer_block_size = + child.fragment->Size().ConvertToLogical(writing_mode).block_size; + total_block_size += + ClampedToValidFragmentainerCapacity(fragmentainer_block_size); + } + } + return total_block_size; +} + } // namespace blink WTF_ALLOW_CLEAR_UNUSED_SLOTS_WITH_MEM_FUNCTIONS(blink::ResultWithOffset)
diff --git a/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.h b/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.h index b8b8d77..caf1524 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.h +++ b/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.h
@@ -125,6 +125,11 @@ return !Node().IsFloatingOrOutOfFlowPositioned(); } + // The sum of all the current column children's block-sizes, as if they were + // stacked, including any block-size that is added as a result of + // ClampedToValidFragmentainerCapacity(). + LayoutUnit TotalColumnBlockSize() const; + const NGColumnSpannerPath* spanner_path_ = nullptr; int used_column_count_;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.cc b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.cc index a4d4ccc..97bce83 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.cc
@@ -534,7 +534,8 @@ LogicalOffset offset, LogicalOffset relative_offset, LayoutUnit containing_block_adjustment, - const NGContainingBlock<LogicalOffset>* fixedpos_containing_block) { + const NGContainingBlock<LogicalOffset>* fixedpos_containing_block, + HeapVector<NGLogicalOOFNodeForFragmentation>* out_list) { NGFragmentedOutOfFlowData* oof_data = fragment.FragmentedOutOfFlowData(); if (!oof_data || oof_data->oof_positioned_fragmentainer_descendants.IsEmpty()) return; @@ -655,28 +656,33 @@ fixedpos_containing_block_rel_offset = fixedpos_containing_block->RelativeOffset(); } + NGLogicalOOFNodeForFragmentation oof_node( + descendant.Node(), static_position, new_inline_container, + /* needs_block_offset_adjustment */ false, + NGContainingBlock<LogicalOffset>( + containing_block_offset, containing_block_rel_offset, + containing_block_fragment, container_inside_column_spanner, + descendant.containing_block.RequiresContentBeforeBreaking()), + NGContainingBlock<LogicalOffset>( + fixedpos_containing_block_offset, + fixedpos_containing_block_rel_offset, + fixedpos_containing_block_fragment, + fixedpos_container_inside_column_spanner, + descendant.fixedpos_containing_block + .RequiresContentBeforeBreaking()), + new_fixedpos_inline_container); - AddOutOfFlowFragmentainerDescendant( - {descendant.Node(), static_position, new_inline_container, - /* needs_block_offset_adjustment */ false, - NGContainingBlock<LogicalOffset>( - containing_block_offset, containing_block_rel_offset, - containing_block_fragment, container_inside_column_spanner, - descendant.containing_block.RequiresContentBeforeBreaking()), - NGContainingBlock<LogicalOffset>( - fixedpos_containing_block_offset, - fixedpos_containing_block_rel_offset, - fixedpos_containing_block_fragment, - fixedpos_container_inside_column_spanner, - descendant.fixedpos_containing_block - .RequiresContentBeforeBreaking()), - new_fixedpos_inline_container}); + if (out_list) { + out_list->emplace_back(oof_node); + } else { + AddOutOfFlowFragmentainerDescendant(oof_node); - // Remove any descendants that were propagated to the next fragmentation - // context root (as a result of a column spanner). - if (remove_descendant) { - out_of_flow_fragmentainer_descendants.EraseAt(idx); - next_idx = idx; + // Remove any descendants that were propagated to the next fragmentation + // context root (as a result of a column spanner). + if (remove_descendant) { + out_of_flow_fragmentainer_descendants.EraseAt(idx); + next_idx = idx; + } } } }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h index a05ae89..9cd0334 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h +++ b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h
@@ -264,13 +264,16 @@ nullptr, LogicalOffset additional_fixedpos_offset = LogicalOffset()); // Same as PropagateOOFPositionedInfo(), but only performs the propagation of - // OOF fragmentainer descendants. + // OOF fragmentainer descendants. If |out_list| is provided, any OOF + // fragmentainer descendants should be propagated there rather than to this + // builder. void PropagateOOFFragmentainerDescendants( const NGPhysicalFragment& fragment, LogicalOffset offset, LogicalOffset relative_offset, LayoutUnit containing_block_adjustment, - const NGContainingBlock<LogicalOffset>* fixedpos_containing_block); + const NGContainingBlock<LogicalOffset>* fixedpos_containing_block, + HeapVector<NGLogicalOOFNodeForFragmentation>* out_list = nullptr); void SetIsSelfCollapsing() { is_self_collapsing_ = true; }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc index 0b1abf7..1bec72d0 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
@@ -334,15 +334,19 @@ return candidate_added; } -void NGOutOfFlowLayoutPart::HandleFragmentation() { - if (!container_builder_->IsBlockFragmentationContextRoot() || - has_block_fragmentation_) +void NGOutOfFlowLayoutPart::HandleFragmentation( + ColumnBalancingInfo* column_balancing_info) { + if (!column_balancing_info && + (!container_builder_->IsBlockFragmentationContextRoot() || + has_block_fragmentation_)) return; // Don't use the cache if we are handling fragmentation. allow_first_tier_oof_cache_ = false; if (container_builder_->Node().IsPaginatedRoot()) { + // Column balancing only affects multicols. + DCHECK(!column_balancing_info); HeapVector<NGLogicalOutOfFlowPositionedNode> candidates; ClearCollectionScope<HeapVector<NGLogicalOutOfFlowPositionedNode>> scope( &candidates); @@ -359,24 +363,50 @@ container_builder_->AddOutOfFlowFragmentainerDescendant(candidate); } - while (container_builder_->HasOutOfFlowFragmentainerDescendants() || - container_builder_->HasMulticolsWithPendingOOFs()) { - HandleMulticolsWithPendingOOFs(container_builder_); - if (container_builder_->HasOutOfFlowFragmentainerDescendants()) { - HeapVector<NGLogicalOOFNodeForFragmentation> fragmentainer_descendants; - ClearCollectionScope<HeapVector<NGLogicalOOFNodeForFragmentation>> scope( - &fragmentainer_descendants); - container_builder_->SwapOutOfFlowFragmentainerDescendants( +#if DCHECK_IS_ON() + if (column_balancing_info) { + DCHECK(!column_balancing_info->columns.IsEmpty()); + DCHECK(!column_balancing_info->out_of_flow_fragmentainer_descendants + .IsEmpty()); + } +#endif + base::AutoReset<ColumnBalancingInfo*> balancing_scope(&column_balancing_info_, + column_balancing_info); + + auto ShouldContinue = [&]() -> bool { + if (column_balancing_info_) + return column_balancing_info_->HasOutOfFlowFragmentainerDescendants(); + return container_builder_->HasOutOfFlowFragmentainerDescendants() || + container_builder_->HasMulticolsWithPendingOOFs(); + }; + + while (ShouldContinue()) { + HeapVector<NGLogicalOOFNodeForFragmentation> fragmentainer_descendants; + ClearCollectionScope<HeapVector<NGLogicalOOFNodeForFragmentation>> scope( + &fragmentainer_descendants); + if (column_balancing_info_) { + column_balancing_info_->SwapOutOfFlowFragmentainerDescendants( &fragmentainer_descendants); DCHECK(!fragmentainer_descendants.IsEmpty()); + } else { + HandleMulticolsWithPendingOOFs(container_builder_); + if (container_builder_->HasOutOfFlowFragmentainerDescendants()) { + container_builder_->SwapOutOfFlowFragmentainerDescendants( + &fragmentainer_descendants); + DCHECK(!fragmentainer_descendants.IsEmpty()); + } + } + if (!fragmentainer_descendants.IsEmpty()) { LogicalOffset fragmentainer_progression = GetFragmentainerProgression( *container_builder_, GetFragmentainerType()); LayoutFragmentainerDescendants(&fragmentainer_descendants, fragmentainer_progression); } } - for (auto& descendant : delayed_descendants_) - container_builder_->AddOutOfFlowFragmentainerDescendant(descendant); + if (!column_balancing_info_) { + for (auto& descendant : delayed_descendants_) + container_builder_->AddOutOfFlowFragmentainerDescendant(descendant); + } } // Retrieve the stored ContainingBlockInfo needed for placing positioned nodes. @@ -1158,10 +1188,10 @@ descendant.containing_block.Fragment()->GetLayoutObject()); DCHECK(containing_block); - // We may try to lay out an OOF once we reach a column spanner. However, - // if the containing block has not finished lay out, we should wait to - // lay out the OOF in case its position is dependent on its containing - // block's final size. + // We may try to lay out an OOF once we reach a column spanner or when + // column balancing. However, if the containing block has not finished + // layout, we should wait to lay out the OOF in case its position is + // dependent on its containing block's final size. if (containing_block->PhysicalFragments().back().BreakToken()) { delayed_descendants_.push_back(descendant); continue; @@ -1201,6 +1231,8 @@ const NGPhysicalFragment* fragment = nullptr; if (index < num_children) fragment = children[index].fragment; + else if (column_balancing_info_) + column_balancing_info_->num_new_columns++; // Skip over any column spanners. if (!fragment || fragment->IsFragmentainerBox()) { @@ -1210,12 +1242,17 @@ fragmentainer_progression, &fragmented_descendants); // Retrieve the updated or newly added fragmentainer, and add its block - // contribution to the consumed block size. - fragment = children[index].fragment; - fragmentainer_consumed_block_size_ += - fragment->Size() - .ConvertToLogical(container_builder_->Style().GetWritingMode()) - .block_size; + // contribution to the consumed block size. Skip this if we are column + // balancing, though, since this is only needed when adding OOFs to the + // builder in the true layout pass. + if (!column_balancing_info_) { + fragment = children[index].fragment; + fragmentainer_consumed_block_size_ += + fragment->Size() + .ConvertToLogical( + container_builder_->Style().GetWritingMode()) + .block_size; + } } // Extend |descendants_to_layout| if an OOF element fragments into a @@ -1719,8 +1756,15 @@ LogicalOffset fragmentainer_offset = UpdatedFragmentainerOffset( fragmentainer.offset, index, fragmentainer_progression, is_new_fragment); - const NGBlockBreakToken* previous_break_token = - PreviousFragmentainerBreakToken(*container_builder_, original_index); + const NGBlockBreakToken* previous_break_token = nullptr; + if (!column_balancing_info_) { + // Note: We don't fetch this when column balancing because we don't actually + // create and add new fragments to the builder until a later layout pass. + // However, the break token is only needed when we are actually adding to + // the builder, so it is ok to leave this as nullptr in such cases. + previous_break_token = + PreviousFragmentainerBreakToken(*container_builder_, original_index); + } NGLayoutAlgorithmParams params(node, fragment_geometry, space, previous_break_token, /* early_break */ nullptr); @@ -1816,6 +1860,38 @@ } } + const auto& physical_fragment = + To<NGPhysicalBoxFragment>(result->PhysicalFragment()); + const NGBlockBreakToken* break_token = physical_fragment.BreakToken(); + if (break_token) { + // We must continue layout in the next fragmentainer. Update any information + // in NodeToLayout, and add the node to |fragmented_descendants|. + NodeToLayout fragmented_descendant = descendant; + fragmented_descendant.break_token = break_token; + fragmented_descendant.offset_info.offset.block_offset = LayoutUnit(); + fragmented_descendants->emplace_back(fragmented_descendant); + } + + // Figure out if the current OOF affects column balancing. Then return since + // we don't want to add the OOFs to the builder until the current columns have + // completed layout. + if (column_balancing_info_) { + LayoutUnit space_shortage = CalculateSpaceShortage( + *fragmentainer_space, result, oof_offset.block_offset); + column_balancing_info_->PropagateSpaceShortage(space_shortage); + // We don't check the break appeal of the layout result to determine if + // there is a violating break because OOFs aren't affected by the various + // break rules. However, OOFs aren't pushed to the next fragmentainer if + // they don't fit (when they are monolithic). Use |has_violating_break| to + // tell the column algorithm when this happens so that it knows to attempt + // to expand the columns in such cases. + if (!column_balancing_info_->has_violating_break) { + if (space_shortage > LayoutUnit() && !physical_fragment.BreakToken()) + column_balancing_info_->has_violating_break = true; + } + return; + } + LayoutUnit containing_block_adjustment = container_builder_->BlockOffsetAdjustmentForFragmentainer( fragmentainer_consumed_block_size_); @@ -1830,9 +1906,6 @@ } algorithm->AppendOutOfFlowResult(result); - const auto& physical_fragment = - To<NGPhysicalBoxFragment>(result->PhysicalFragment()); - // Copy the offset of the OOF node back to legacy such that it is relative // to its containing block rather than the fragmentainer that it is being // added to. @@ -1861,16 +1934,6 @@ physical_fragment.Size()), *container, /* previous_container_break_token */ nullptr); } - - const NGBlockBreakToken* break_token = physical_fragment.BreakToken(); - if (break_token) { - // We must continue layout in the next fragmentainer. Update any information - // in NodeToLayout, and add the node to |fragmented_descendants|. - NodeToLayout fragmented_descendant = descendant; - fragmented_descendant.break_token = break_token; - fragmented_descendant.offset_info.offset.block_offset = LayoutUnit(); - fragmented_descendants->emplace_back(fragmented_descendant); - } } void NGOutOfFlowLayoutPart::ReplaceFragmentainer( @@ -1878,6 +1941,10 @@ LogicalOffset offset, bool create_new_fragment, NGSimplifiedOOFLayoutAlgorithm* algorithm) { + // Don't update the builder when performing column balancing. + if (column_balancing_info_) + return; + if (create_new_fragment) { const NGLayoutResult* new_result = algorithm->Layout(); container_builder_->AddChild( @@ -2183,6 +2250,11 @@ return position; } +void NGOutOfFlowLayoutPart::ColumnBalancingInfo::PropagateSpaceShortage( + LayoutUnit space_shortage) { + UpdateMinimalSpaceShortage(space_shortage, &minimal_space_shortage); +} + void NGOutOfFlowLayoutPart::MulticolChildInfo::Trace(Visitor* visitor) const { visitor->Trace(parent_break_token); }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.h b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.h index f3eff214..feab4360 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.h +++ b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.h
@@ -69,8 +69,54 @@ // LayoutResult::OutOfFlowPositionedDescendants. void Run(const LayoutBox* only_layout = nullptr); - // Handle the layout of any OOF elements in a fragmentation context. - void HandleFragmentation(); + struct ColumnBalancingInfo { + DISALLOW_NEW(); + + public: + ColumnBalancingInfo() = default; + + bool HasOutOfFlowFragmentainerDescendants() const { + return !out_of_flow_fragmentainer_descendants.IsEmpty(); + } + void SwapOutOfFlowFragmentainerDescendants( + HeapVector<NGLogicalOOFNodeForFragmentation>* descendants) { + DCHECK(descendants->IsEmpty()); + std::swap(out_of_flow_fragmentainer_descendants, *descendants); + } + + void PropagateSpaceShortage(LayoutUnit space_shortage); + + // The list of columns to balance. + NGContainerFragmentBuilder::ChildrenVector columns; + // The list of OOF fragmentainer descendants of |columns|. + HeapVector<NGLogicalOOFNodeForFragmentation> + out_of_flow_fragmentainer_descendants; + // The smallest space shortage found while laying out the members of + // |out_of_flow_fragmentainer_descendants| within the set of existing + // |columns|. + LayoutUnit minimal_space_shortage = kIndefiniteSize; + // The number of new columns needed to hold the + // |out_of_flow_fragmentainer_descendants| within the existing set of + // |columns|. + wtf_size_t num_new_columns = 0; + // True if there is any violating breaks found when performing layout on the + // |out_of_flow_fragmentainer_descendants|. Since break avoidance rules + // don't apply to OOFs, this can only happen when a monolithic OOF has to + // overflow. + bool has_violating_break = false; + + void Trace(Visitor* visitor) const { + visitor->Trace(columns); + visitor->Trace(out_of_flow_fragmentainer_descendants); + } + }; + + // Handle the layout of any OOF elements in a fragmentation context. If + // |column_balancing_info| is set, perform layout on the column and OOF + // members of |column_balancing_info| rather than of the builder, and keep + // track of any info needed for the OOF children to affect column balancing. + void HandleFragmentation( + ColumnBalancingInfo* column_balancing_info = nullptr); // Information needed to position descendant within a containing block. // Geometry expressed here is complicated: @@ -345,7 +391,8 @@ const NGContainerFragmentBuilder::ChildrenVector& FragmentationContextChildren() const { DCHECK(container_builder_->IsBlockFragmentationContextRoot()); - return container_builder_->Children(); + return column_balancing_info_ ? column_balancing_info_->columns + : container_builder_->Children(); } NGBoxFragmentBuilder* container_builder_; @@ -361,6 +408,11 @@ // Holds the children of an inner multicol if we are laying out OOF elements // inside a nested fragmentation context. HeapVector<MulticolChildInfo>* multicol_children_; + // If set, we are currently attempting to balance the columns of a multicol. + // In which case, we need to know how much any OOF fragmentainer descendants + // will affect column balancing, if any, without actually adding the OOFs to + // the associated columns. + ColumnBalancingInfo* column_balancing_info_ = nullptr; // The block size of the multi-column (before adjustment for spanners, etc.) // This is used to calculate the column size of any newly added proxy // fragments when handling fragmentation for abspos elements.
diff --git a/third_party/blink/renderer/core/layout/ng/svg/layout_ng_svg_text_test.cc b/third_party/blink/renderer/core/layout/ng/svg/layout_ng_svg_text_test.cc index e31b7c7..a9efb19 100644 --- a/third_party/blink/renderer/core/layout/ng/svg/layout_ng_svg_text_test.cc +++ b/third_party/blink/renderer/core/layout/ng/svg/layout_ng_svg_text_test.cc
@@ -109,6 +109,7 @@ ASSERT_FALSE(view.NeedsLayout()); GetElementById("t")->setAttribute("transform", "scale(0.5)"); + GetDocument().UpdateStyleAndLayoutTreeForThisDocument(); EXPECT_TRUE(frame_view->IsSubtreeLayout()); uint32_t pre_layout_count = AllLayoutCallCount();
diff --git a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc index a16a3f1..65a92618 100644 --- a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc +++ b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc
@@ -66,7 +66,7 @@ void MobileFriendlinessChecker::NotifyPaint() { DCHECK(frame_view_->GetFrame().Client()->IsLocalFrameClientImpl()); - DCHECK(frame_view_->GetFrame().IsLocalRoot()); + DCHECK(frame_view_->GetFrame().IsOutermostMainFrame()); if (timer_.IsActive() || base::TimeTicks::Now() - last_evaluated_ < kEvaluationInterval) { return; @@ -384,7 +384,7 @@ // with region tracking by Fenwick tree. The detail of the algorithm is // go/bad-tap-target-ukm int MobileFriendlinessChecker::ComputeBadTapTargetsRatio() { - DCHECK(frame_view_->GetFrame().IsLocalRoot()); + DCHECK(frame_view_->GetFrame().IsOutermostMainFrame()); base::TimeTicks started = base::TimeTicks::Now(); constexpr float kOneDipInMm = 0.15875; @@ -451,6 +451,7 @@ void MobileFriendlinessChecker::Activate(TimerBase*) { DCHECK(frame_view_->GetFrame().Client()->IsLocalFrameClientImpl()); + DCHECK(frame_view_->GetFrame().IsOutermostMainFrame()); // If detached, there's no need to calculate any metrics. if (!frame_view_->GetChromeClient()) @@ -463,7 +464,7 @@ void MobileFriendlinessChecker::DidFinishLifecycleUpdate( const LocalFrameView&) { DCHECK(frame_view_->GetFrame().Client()->IsLocalFrameClientImpl()); - DCHECK(frame_view_->GetFrame().IsLocalRoot()); + DCHECK(frame_view_->GetFrame().IsOutermostMainFrame()); frame_view_->UnregisterFromLifecycleNotifications(this); frame_view_->DidChangeMobileFriendliness(MobileFriendliness{ @@ -488,7 +489,7 @@ void MobileFriendlinessChecker::NotifyViewportUpdated( const ViewportDescription& viewport) { DCHECK(frame_view_->GetFrame().Client()->IsLocalFrameClientImpl()); - DCHECK(frame_view_->GetFrame().IsLocalRoot()); + DCHECK(frame_view_->GetFrame().IsOutermostMainFrame()); if (viewport.type != ViewportDescription::Type::kViewportMeta) return; @@ -522,7 +523,7 @@ void MobileFriendlinessChecker::NotifyInvalidatePaint( const LayoutObject& object) { DCHECK(frame_view_->GetFrame().Client()->IsLocalFrameClientImpl()); - DCHECK(frame_view_->GetFrame().IsLocalRoot()); + DCHECK(frame_view_->GetFrame().IsOutermostMainFrame()); // Compute small text ratio. if (const auto* text = DynamicTo<LayoutText>(object)) {
diff --git a/third_party/blink/renderer/core/page/scrolling/root_scroller_test.cc b/third_party/blink/renderer/core/page/scrolling/root_scroller_test.cc index 67df73a..c8b779a 100644 --- a/third_party/blink/renderer/core/page/scrolling/root_scroller_test.cc +++ b/third_party/blink/renderer/core/page/scrolling/root_scroller_test.cc
@@ -543,7 +543,8 @@ // Swap in a remote frame. Make sure we revert back to the document. { - MainWebFrame()->FirstChild()->Swap(frame_test_helpers::CreateRemote()); + frame_test_helpers::SwapRemoteFrame(MainWebFrame()->FirstChild(), + frame_test_helpers::CreateRemote()); UpdateAllLifecyclePhases(MainFrameView()); EXPECT_EQ(MainFrame()->GetDocument(), EffectiveRootScroller(MainFrame()->GetDocument()));
diff --git a/third_party/blink/renderer/core/page/spatial_navigation_test.cc b/third_party/blink/renderer/core/page/spatial_navigation_test.cc index a17b42b..66e40c7b 100644 --- a/third_party/blink/renderer/core/page/spatial_navigation_test.cc +++ b/third_party/blink/renderer/core/page/spatial_navigation_test.cc
@@ -1141,8 +1141,8 @@ "iframe"); EXPECT_FALSE(HasRemoteFrame(iframe)); - webview->MainFrameImpl()->FirstChild()->Swap( - frame_test_helpers::CreateRemote()); + frame_test_helpers::SwapRemoteFrame(webview->MainFrameImpl()->FirstChild(), + frame_test_helpers::CreateRemote()); EXPECT_TRUE(HasRemoteFrame(iframe)); }
diff --git a/third_party/blink/renderer/core/paint/compositing/compositing_test.cc b/third_party/blink/renderer/core/paint/compositing/compositing_test.cc index 5e5a26b2..e68d81ab 100644 --- a/third_party/blink/renderer/core/paint/compositing/compositing_test.cc +++ b/third_party/blink/renderer/core/paint/compositing/compositing_test.cc
@@ -2574,10 +2574,11 @@ frame_test_helpers::TestWebRemoteFrameClient remote_frame_client; FakeRemoteFrameHost remote_frame_host; - remote_frame_host.Init(remote_frame_client.GetRemoteAssociatedInterfaces()); WebRemoteFrameImpl* remote_frame = frame_test_helpers::CreateRemote(&remote_frame_client); - MainFrame().FirstChild()->Swap(remote_frame); + frame_test_helpers::SwapRemoteFrame( + MainFrame().FirstChild(), remote_frame, + remote_frame_host.BindNewAssociatedRemote()); Compositor().BeginFrame();
diff --git a/third_party/blink/renderer/core/paint/cull_rect_updater_test.cc b/third_party/blink/renderer/core/paint/cull_rect_updater_test.cc index 58393456..004b760 100644 --- a/third_party/blink/renderer/core/paint/cull_rect_updater_test.cc +++ b/third_party/blink/renderer/core/paint/cull_rect_updater_test.cc
@@ -325,11 +325,23 @@ false, false, false); } -TEST_F(CullRectUpdateOnPaintPropertyChangeTest, Filter) { +TEST_F(CullRectUpdateOnPaintPropertyChangeTest, NonPixelMovingFilter) { + TestTargetChange("filter: invert(5%)", "filter: invert(8%)", false, false, + false); + TestTargetChange("filter: invert(5%)", "", true, false, true); + TestTargetChange("", "filter: invert(5%)", true, false, true); + TestTargetChange("will-change: filter; filter: invert(5%)", + "will-change: filter", false, false, false); + TestTargetChange("will-change: filter", + "will-change: filter; filter: invert(5%)", false, false, + false); +} + +TEST_F(CullRectUpdateOnPaintPropertyChangeTest, PixelMovingFilter) { TestTargetChange("filter: blur(5px)", "filter: blur(8px)", false, false, false); - TestTargetChange("filter: blur(5px)", "", true, false, true); - TestTargetChange("", "filter: blur(5px)", true, false, true); + TestTargetChange("filter: blur(5px)", "", true, true, true); + TestTargetChange("", "filter: blur(5px)", true, true, true); TestTargetChange("will-change: filter; filter: blur(5px)", "will-change: filter", false, false, false); TestTargetChange("will-change: filter",
diff --git a/third_party/blink/renderer/core/paint/fragment_data.cc b/third_party/blink/renderer/core/paint/fragment_data.cc index 4c70297..a1c2235 100644 --- a/third_party/blink/renderer/core/paint/fragment_data.cc +++ b/third_party/blink/renderer/core/paint/fragment_data.cc
@@ -92,13 +92,13 @@ const ClipPaintPropertyNodeOrAlias& FragmentData::PreClip() const { if (const auto* properties = PaintProperties()) { - if (const auto* clip = properties->ClipPathClip()) { - // SPv1 composited clip-path has an alternative clip tree structure. - // If the clip-path is parented by the mask clip, it is only used - // to clip mask layer chunks, and not in the clip inheritance chain. + if (const auto* clip = properties->PixelMovingFilterClipExpander()) { DCHECK(clip->Parent()); - if (clip->Parent() != properties->MaskClip()) - return *clip->Parent(); + return *clip->Parent(); + } + if (const auto* clip = properties->ClipPathClip()) { + DCHECK(clip->Parent()); + return *clip->Parent(); } if (const auto* mask_clip = properties->MaskClip()) { DCHECK(mask_clip->Parent()); @@ -138,16 +138,6 @@ return LocalBorderBoxProperties().Effect(); } -const EffectPaintPropertyNodeOrAlias& FragmentData::PreFilter() const { - if (const auto* properties = PaintProperties()) { - if (const auto* filter = properties->Filter()) { - DCHECK(filter->Parent()); - return *filter->Parent(); - } - } - return LocalBorderBoxProperties().Effect(); -} - const EffectPaintPropertyNodeOrAlias& FragmentData::PostIsolationEffect() const { if (const auto* properties = PaintProperties()) {
diff --git a/third_party/blink/renderer/core/paint/fragment_data.h b/third_party/blink/renderer/core/paint/fragment_data.h index c75ccdb4..9a458f8 100644 --- a/third_party/blink/renderer/core/paint/fragment_data.h +++ b/third_party/blink/renderer/core/paint/fragment_data.h
@@ -189,7 +189,6 @@ const ClipPaintPropertyNodeOrAlias& PreClip() const; const ClipPaintPropertyNodeOrAlias& PostOverflowClip() const; const EffectPaintPropertyNodeOrAlias& PreEffect() const; - const EffectPaintPropertyNodeOrAlias& PreFilter() const; const EffectPaintPropertyNodeOrAlias& PostIsolationEffect() const; ~FragmentData() = default;
diff --git a/third_party/blink/renderer/core/paint/ng/ng_table_painters.cc b/third_party/blink/renderer/core/paint/ng/ng_table_painters.cc index 641a2a7c2..d215729 100644 --- a/third_party/blink/renderer/core/paint/ng/ng_table_painters.cc +++ b/third_party/blink/renderer/core/paint/ng/ng_table_painters.cc
@@ -487,8 +487,12 @@ for (const auto& child : section.Children()) { if (!child->IsTableNGRow()) continue; - return !To<NGPhysicalBoxFragment>(*child).IsFirstForNode(); + + const auto* prev_break_token = + FindPreviousBreakToken(To<NGPhysicalBoxFragment>(*child)); + return prev_break_token && !prev_break_token->IsRepeated(); } + return false; } @@ -499,7 +503,8 @@ if (!child->IsTableNGRow()) continue; return child->BreakToken() && - !To<NGBlockBreakToken>(child->BreakToken())->IsAtBlockEnd(); + !To<NGBlockBreakToken>(child->BreakToken())->IsAtBlockEnd() && + !To<NGBlockBreakToken>(child->BreakToken())->IsRepeated(); } return false; }
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 3981a441..48b85cbc 100644 --- a/third_party/blink/renderer/core/paint/object_paint_properties.h +++ b/third_party/blink/renderer/core/paint/object_paint_properties.h
@@ -216,6 +216,10 @@ // [ 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 @@ -251,11 +255,13 @@ // paint element. public: bool HasClipNode() const { - return fragment_clip_ || clip_path_clip_ || mask_clip_ || css_clip_ || + return fragment_clip_ || pixel_moving_filter_clip_expaner_ || + clip_path_clip_ || mask_clip_ || css_clip_ || overflow_controls_clip_ || inner_border_radius_clip_ || overflow_clip_ || clip_isolation_node_; } ADD_CLIP(FragmentClip, fragment_clip_); + ADD_CLIP(PixelMovingFilterClipExpander, pixel_moving_filter_clip_expaner_); ADD_CLIP(ClipPathClip, clip_path_clip_); ADD_CLIP(MaskClip, mask_clip_); ADD_CLIP(CssClip, css_clip_);
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 11d2ce3..b7f3b251 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
@@ -1699,18 +1699,13 @@ // In this example "A" should be clipped if the filter was not present. // With the filter, "A" will be rastered without clipping, but instead // the blurred result will be clipped. - // On the other hand, "B" should not be clipped because the overflow clip - // is not in its containing block chain, but as the filter output will be - // clipped, so a blurred "B" may still be invisible. + // "B" should be also clipped because a filter always creates a containing + // block for all descendants. if (!state.filter.IsEmpty() || (full_context_.direct_compositing_reasons & CompositingReason::kActiveFilterAnimation)) state.output_clip = context_.current.clip; - // TODO(trchen): A filter may contain spatial operations such that an - // output pixel may depend on an input pixel outside of the output clip. - // We should generate a special clip node to represent this expansion. - // We may begin to composite our subtree prior to an animation starts, // but a compositor element ID is only needed when an animation is // current. @@ -1727,24 +1722,37 @@ state.compositor_element_id = GetCompositorElementId(CompositorElementIdNamespace::kEffectFilter); + // This must be computed before std::move(state) below. + bool needs_pixel_moving_filter_clip_expander = + state.direct_compositing_reasons != CompositingReason::kNone || + state.filter.HasFilterThatMovesPixels(); + EffectPaintPropertyNode::AnimationState animation_state; animation_state.is_running_filter_animation_on_compositor = object_.StyleRef().IsRunningFilterAnimationOnCompositor(); OnUpdateEffect(properties_->UpdateFilter( *context_.current_effect, std::move(state), animation_state)); + + if (needs_pixel_moving_filter_clip_expander) { + OnUpdateClip(properties_->UpdatePixelMovingFilterClipExpander( + *context_.current.clip, + ClipPaintPropertyNode::State(context_.current.transform, + properties_->Filter()))); + } else { + OnClearClip(properties_->ClearPixelMovingFilterClipExpander()); + } } else { OnClearEffect(properties_->ClearFilter()); + OnClearClip(properties_->ClearPixelMovingFilterClipExpander()); } } if (properties_->Filter()) { context_.current_effect = properties_->Filter(); - // TODO(trchen): Change input clip to expansion hint once implemented. - if (const auto* input_clip = properties_->Filter()->OutputClip()) { - DCHECK_EQ(input_clip, context_.current.clip); - context_.absolute_position.clip = context_.fixed_position.clip = - input_clip; - } + if (const auto* input_clip = properties_->PixelMovingFilterClipExpander()) + context_.current.clip = input_clip; + } else { + DCHECK(!properties_->PixelMovingFilterClipExpander()); } }
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc index 02f4a17..3ffc99f 100644 --- a/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc +++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc
@@ -4920,11 +4920,37 @@ GetLayoutObjectByElementId("filter")->FirstFragment().PaintProperties(); EXPECT_FALSE(filter_properties->PaintOffsetTranslation()); EXPECT_TRUE(filter_properties->Filter()->Parent()->IsRoot()); + EXPECT_FALSE(filter_properties->PixelMovingFilterClipExpander()); EXPECT_EQ(DocScrollTranslation(), &filter_properties->Filter()->LocalTransformSpace()); EXPECT_EQ(DocContentClip(), filter_properties->Filter()->OutputClip()); } +TEST_P(PaintPropertyTreeBuilderTest, PixelMovingFilter) { + SetBodyInnerHTML( + "<div id='filter' style='filter:blur(10px); height:1000px;'>" + "</div>"); + const ObjectPaintProperties* filter_properties = + GetLayoutObjectByElementId("filter")->FirstFragment().PaintProperties(); + EXPECT_FALSE(filter_properties->PaintOffsetTranslation()); + + auto* filter = filter_properties->Filter(); + ASSERT_TRUE(filter); + EXPECT_TRUE(filter->Parent()->IsRoot()); + EXPECT_TRUE(filter->HasFilterThatMovesPixels()); + EXPECT_EQ(DocScrollTranslation(), &filter->LocalTransformSpace()); + EXPECT_EQ(DocContentClip(), filter->OutputClip()); + + auto* clip = filter_properties->PixelMovingFilterClipExpander(); + ASSERT_TRUE(clip); + EXPECT_EQ(filter->OutputClip(), clip->Parent()); + EXPECT_EQ(&clip->LocalTransformSpace(), &filter->LocalTransformSpace()); + EXPECT_EQ(filter, clip->PixelMovingFilter()); + EXPECT_TRUE(clip->LayoutClipRect().IsInfinite()); + EXPECT_EQ(gfx::RectF(LayoutRect::InfiniteIntRect()), + clip->PaintClipRect().Rect()); +} + TEST_P(PaintPropertyTreeBuilderTest, FilterReparentClips) { SetBodyInnerHTML(R"HTML( <div id='clip' style='overflow:hidden;'>
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 a0a0893..185f0aa4 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
@@ -112,6 +112,7 @@ 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()); @@ -246,6 +247,8 @@ 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);
diff --git a/third_party/blink/renderer/core/paint/scoped_svg_paint_state.cc b/third_party/blink/renderer/core/paint/scoped_svg_paint_state.cc index 1f75f722..da924bb7 100644 --- a/third_party/blink/renderer/core/paint/scoped_svg_paint_state.cc +++ b/third_party/blink/renderer/core/paint/scoped_svg_paint_state.cc
@@ -90,10 +90,13 @@ return; auto& paint_controller = paint_info_.context.GetPaintController(); auto state = paint_controller.CurrentPaintChunkProperties(); - if (const auto* filter = properties.Filter()) + if (const auto* filter = properties.Filter()) { state.SetEffect(*filter); - else if (const auto* effect = properties.Effect()) + if (const auto* filter_clip = properties.PixelMovingFilterClipExpander()) + state.SetClip(*filter_clip); + } else if (const auto* effect = properties.Effect()) { state.SetEffect(*effect); + } if (const auto* mask_clip = properties.MaskClip()) state.SetClip(*mask_clip);
diff --git a/third_party/blink/renderer/core/style/computed_style.h b/third_party/blink/renderer/core/style/computed_style.h index 69aeb25..5bbddd7 100644 --- a/third_party/blink/renderer/core/style/computed_style.h +++ b/third_party/blink/renderer/core/style/computed_style.h
@@ -2325,6 +2325,25 @@ OverflowX() != EOverflow::kClip; } + // Returns true if object-fit, object-position and object-view-box would avoid + // replaced contents overflow. + bool ObjectPropertiesPreventReplacedOverflow() const { + if (GetObjectFit() == EObjectFit::kNone || + GetObjectFit() == EObjectFit::kCover) { + return false; + } + + if (ObjectPosition() != + LengthPoint(Length::Percent(50.0), Length::Percent(50.0))) { + return false; + } + + if (ObjectViewBox()) + return false; + + return true; + } + bool IsDisplayTableRowOrColumnType() const { return Display() == EDisplay::kTableRow || Display() == EDisplay::kTableRowGroup ||
diff --git a/third_party/blink/renderer/core/svg/svg_graphics_element.cc b/third_party/blink/renderer/core/svg/svg_graphics_element.cc index 9811c303..53ce0dc1 100644 --- a/third_party/blink/renderer/core/svg/svg_graphics_element.cc +++ b/third_party/blink/renderer/core/svg/svg_graphics_element.cc
@@ -149,8 +149,6 @@ // away with removing the InvalidationGuard? SetNeedsStyleRecalc(kLocalStyleChange, StyleChangeReasonForTracing::FromAttribute(attr_name)); - if (LayoutObject* object = GetLayoutObject()) - MarkForLayoutAndParentResourceInvalidation(*object); return; }
diff --git a/third_party/blink/renderer/core/testing/fake_remote_frame_host.cc b/third_party/blink/renderer/core/testing/fake_remote_frame_host.cc index f9f79bd..6305dc3 100644 --- a/third_party/blink/renderer/core/testing/fake_remote_frame_host.cc +++ b/third_party/blink/renderer/core/testing/fake_remote_frame_host.cc
@@ -8,11 +8,9 @@ namespace blink { -void FakeRemoteFrameHost::Init(blink::AssociatedInterfaceProvider* provider) { - provider->OverrideBinderForTesting( - mojom::blink::RemoteFrameHost::Name_, - base::BindRepeating(&FakeRemoteFrameHost::BindFrameHostReceiver, - base::Unretained(this))); +mojo::PendingAssociatedRemote<mojom::blink::RemoteFrameHost> +FakeRemoteFrameHost::BindNewAssociatedRemote() { + return receiver_.BindNewEndpointAndPassDedicatedRemote(); } void FakeRemoteFrameHost::SetInheritedEffectiveTouchAction( @@ -62,10 +60,4 @@ void FakeRemoteFrameHost::OpenURL(mojom::blink::OpenURLParamsPtr params) {} -void FakeRemoteFrameHost::BindFrameHostReceiver( - mojo::ScopedInterfaceEndpointHandle handle) { - receiver_.Bind(mojo::PendingAssociatedReceiver<mojom::blink::RemoteFrameHost>( - std::move(handle))); -} - } // namespace blink
diff --git a/third_party/blink/renderer/core/testing/fake_remote_frame_host.h b/third_party/blink/renderer/core/testing/fake_remote_frame_host.h index bbaa28a..29d546e 100644 --- a/third_party/blink/renderer/core/testing/fake_remote_frame_host.h +++ b/third_party/blink/renderer/core/testing/fake_remote_frame_host.h
@@ -24,7 +24,9 @@ public: FakeRemoteFrameHost() = default; - void Init(blink::AssociatedInterfaceProvider* provider); + mojo::PendingAssociatedRemote<mojom::blink::RemoteFrameHost> + BindNewAssociatedRemote(); + void SetInheritedEffectiveTouchAction(cc::TouchAction touch_action) override; void UpdateRenderThrottlingStatus(bool is_throttled, bool subtree_throttled, @@ -58,8 +60,6 @@ void OpenURL(mojom::blink::OpenURLParamsPtr params) override; private: - void BindFrameHostReceiver(mojo::ScopedInterfaceEndpointHandle handle); - mojo::AssociatedReceiver<mojom::blink::RemoteFrameHost> receiver_{this}; };
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.cc b/third_party/blink/renderer/modules/accessibility/ax_object.cc index 466839a..6650370 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_object.cc
@@ -1260,6 +1260,9 @@ } } + if (accessibility_mode.has_mode(ui::AXMode::kScreenReader)) + SerializeScreenReaderAttributes(node_data); + SerializeUnignoredAttributes(node_data, accessibility_mode); if (accessibility_mode.has_mode(ui::AXMode::kPDF)) { @@ -1275,6 +1278,7 @@ if (LiveRegionRoot()) SerializeLiveRegionAttributes(node_data); + SerializeOtherScreenReaderAttributes(node_data); } @@ -1553,6 +1557,77 @@ node_data, ax::mojom::blink::StringAttribute::kPlaceholder, placeholder); } +void AXObject::SerializeScreenReaderAttributes(ui::AXNodeData* node_data) { + String display_style; + Node* node = GetNode(); + if (node && !node->IsDocumentNode()) { + if (const ComputedStyle* computed_style = node->GetComputedStyle()) { + display_style = CSSProperty::Get(CSSPropertyID::kDisplay) + .CSSValueFromComputedStyle( + *computed_style, /* layout_object */ nullptr, + /* allow_visited_style */ false) + ->CssText(); + if (!display_style.IsEmpty()) { + TruncateAndAddStringAttribute( + node_data, ax::mojom::blink::StringAttribute::kDisplay, + display_style); + } + } + } + + if (KeyboardShortcut().length() && + !node_data->HasStringAttribute( + ax::mojom::blink::StringAttribute::kKeyShortcuts)) { + TruncateAndAddStringAttribute( + node_data, ax::mojom::blink::StringAttribute::kKeyShortcuts, + KeyboardShortcut()); + } + + if (AXObject* active_descendant = ActiveDescendant()) { + node_data->AddIntAttribute( + ax::mojom::blink::IntAttribute::kActivedescendantId, + active_descendant->AXObjectID()); + } + + if (Node* node = GetNode()) { + if (node->IsElementNode()) { + Element* element = To<Element>(node); + if (element->IsHTMLWithTagName("input") && + element->hasAttribute("type")) { + TruncateAndAddStringAttribute( + node_data, ax::mojom::blink::StringAttribute::kInputType, + element->getAttribute("type")); + } + } + } +} + +String AXObject::KeyboardShortcut() const { + const AtomicString& access_key = AccessKey(); + if (access_key.IsNull()) + return String(); + + DEFINE_STATIC_LOCAL(String, modifier_string, ()); + if (modifier_string.IsNull()) { + unsigned modifiers = KeyboardEventManager::kAccessKeyModifiers; + // Follow the same order as Mozilla MSAA implementation: + // Ctrl+Alt+Shift+Meta+key. MSDN states that keyboard shortcut strings + // should not be localized and defines the separator as "+". + StringBuilder modifier_string_builder; + if (modifiers & WebInputEvent::kControlKey) + modifier_string_builder.Append("Ctrl+"); + if (modifiers & WebInputEvent::kAltKey) + modifier_string_builder.Append("Alt+"); + if (modifiers & WebInputEvent::kShiftKey) + modifier_string_builder.Append("Shift+"); + if (modifiers & WebInputEvent::kMetaKey) + modifier_string_builder.Append("Win+"); + modifier_string = modifier_string_builder.ToString(); + } + + return String(modifier_string + access_key); +} + void AXObject::SerializeOtherScreenReaderAttributes( ui::AXNodeData* node_data) const { DCHECK_NE(node_data->role, ax::mojom::blink::Role::kUnknown);
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.h b/third_party/blink/renderer/modules/accessibility/ax_object.h index 7a902a6..f3bddc1f 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object.h +++ b/third_party/blink/renderer/modules/accessibility/ax_object.h
@@ -1409,6 +1409,7 @@ void SerializeNameAndDescriptionAttributes(ui::AXMode accessibility_mode, ui::AXNodeData* node_data) const; void SerializeOtherScreenReaderAttributes(ui::AXNodeData* node_data) const; + void SerializeScreenReaderAttributes(ui::AXNodeData* node_data); void SerializeScrollAttributes(ui::AXNodeData* node_data); void SerializeSparseAttributes(ui::AXNodeData* node_data); void SerializeStyleAttributes(ui::AXNodeData* node_data); @@ -1421,6 +1422,7 @@ private: bool ComputeCanSetFocusAttribute() const; + String KeyboardShortcut() const; mutable int last_modification_count_;
diff --git a/third_party/blink/renderer/modules/crypto/crypto.idl b/third_party/blink/renderer/modules/crypto/crypto.idl index 5425601..c642b4a 100644 --- a/third_party/blink/renderer/modules/crypto/crypto.idl +++ b/third_party/blink/renderer/modules/crypto/crypto.idl
@@ -34,6 +34,6 @@ [RaisesException, MeasureAs=CryptoGetRandomValues] ArrayBufferView getRandomValues(ArrayBufferView array); // Implementation of crypto.randomUUID() from the standard: // https://wicg.github.io/uuid/#extensions-to-the-crypto-interface - [RuntimeEnabled=UUID, SecureContext] DOMString randomUUID(); + [SecureContext] DOMString randomUUID(); [SecureContext] readonly attribute SubtleCrypto subtle; };
diff --git a/third_party/blink/renderer/modules/exported/web_ax_object.cc b/third_party/blink/renderer/modules/exported/web_ax_object.cc index f1b68f30..029783a 100644 --- a/third_party/blink/renderer/modules/exported/web_ax_object.cc +++ b/third_party/blink/renderer/modules/exported/web_ax_object.cc
@@ -543,35 +543,6 @@ return ToEnclosingRect(rect); } -WebString WebAXObject::KeyboardShortcut() const { - if (IsDetached()) - return WebString(); - - String access_key = private_->AccessKey(); - if (access_key.IsNull()) - return WebString(); - - DEFINE_STATIC_LOCAL(String, modifier_string, ()); - if (modifier_string.IsNull()) { - unsigned modifiers = KeyboardEventManager::kAccessKeyModifiers; - // Follow the same order as Mozilla MSAA implementation: - // Ctrl+Alt+Shift+Meta+key. MSDN states that keyboard shortcut strings - // should not be localized and defines the separator as "+". - StringBuilder modifier_string_builder; - if (modifiers & WebInputEvent::kControlKey) - modifier_string_builder.Append("Ctrl+"); - if (modifiers & WebInputEvent::kAltKey) - modifier_string_builder.Append("Alt+"); - if (modifiers & WebInputEvent::kShiftKey) - modifier_string_builder.Append("Shift+"); - if (modifiers & WebInputEvent::kMetaKey) - modifier_string_builder.Append("Win+"); - modifier_string = modifier_string_builder.ToString(); - } - - return String(modifier_string + access_key); -} - WebString WebAXObject::Language() const { if (IsDetached()) return WebString(); @@ -902,29 +873,6 @@ return WebDocument(document); } -WebString WebAXObject::ComputedStyleDisplay() const { - if (IsDetached()) - return WebString(); - -#if DCHECK_IS_ON() - CheckLayoutClean(private_->GetDocument()); -#endif - - Node* node = private_->GetNode(); - if (!node || node->IsDocumentNode()) - return WebString(); - - const ComputedStyle* computed_style = node->GetComputedStyle(); - if (!computed_style) - return WebString(); - - return WebString(CSSProperty::Get(CSSPropertyID::kDisplay) - .CSSValueFromComputedStyle( - *computed_style, /* layout_object */ nullptr, - /* allow_visited_style */ false) - ->CssText()); -} - bool WebAXObject::AccessibilityIsIgnored() const { if (IsDetached()) return false;
diff --git a/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.cc b/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.cc index e3648886..1184d00 100644 --- a/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.cc +++ b/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.cc
@@ -3854,8 +3854,11 @@ ScopedRGBEmulationColorMask emulation_color_mask(this, color_mask_, drawing_buffer_.get()); + // Flush any pending implicit clears. This cannot be done after the + // user-requested clearBuffer call because of scissor test side effects. + ClearIfComposited(kClearCallerDrawOrClear); + ContextGL()->ClearBufferiv(buffer, drawbuffer, value.Data() + src_offset); - UpdateBuffersToAutoClear(kClearBufferiv, buffer, drawbuffer); } void WebGL2RenderingContextBase::clearBufferiv(GLenum buffer, @@ -3869,8 +3872,11 @@ ScopedRGBEmulationColorMask emulation_color_mask(this, color_mask_, drawing_buffer_.get()); + // Flush any pending implicit clears. This cannot be done after the + // user-requested clearBuffer call because of scissor test side effects. + ClearIfComposited(kClearCallerDrawOrClear); + ContextGL()->ClearBufferiv(buffer, drawbuffer, value.data() + src_offset); - UpdateBuffersToAutoClear(kClearBufferiv, buffer, drawbuffer); } void WebGL2RenderingContextBase::clearBufferuiv( @@ -3885,8 +3891,10 @@ ScopedRGBEmulationColorMask emulation_color_mask(this, color_mask_, drawing_buffer_.get()); + // This call is not applicable to the default framebuffer attachments + // as they cannot have UINT type. Ignore any pending implicit clears. + ContextGL()->ClearBufferuiv(buffer, drawbuffer, value.Data() + src_offset); - UpdateBuffersToAutoClear(kClearBufferuiv, buffer, drawbuffer); } void WebGL2RenderingContextBase::clearBufferuiv(GLenum buffer, @@ -3900,8 +3908,10 @@ ScopedRGBEmulationColorMask emulation_color_mask(this, color_mask_, drawing_buffer_.get()); + // This call is not applicable to the default framebuffer attachments + // as they cannot have UINT type. Ignore any pending implicit clears. + ContextGL()->ClearBufferuiv(buffer, drawbuffer, value.data() + src_offset); - UpdateBuffersToAutoClear(kClearBufferuiv, buffer, drawbuffer); } void WebGL2RenderingContextBase::clearBufferfv( @@ -3922,14 +3932,16 @@ ScopedRGBEmulationColorMask emulation_color_mask(this, color_mask_, drawing_buffer_.get()); + // Flush any pending implicit clears. This cannot be done after the + // user-requested clearBuffer call because of scissor test side effects. + ClearIfComposited(kClearCallerDrawOrClear); + ContextGL()->ClearBufferfv(buffer, drawbuffer, value.Data() + src_offset); - // clearBufferiv and clearBufferuiv will currently generate an error - // if they're called against the default back buffer. If support for - // extended canvas color spaces is added, this call might need to be - // added to the other versions. + + // This might have been used to clear the color buffer of the default back + // buffer. Notification is required to update the canvas. MarkContextChanged(kCanvasChanged, CanvasPerformanceMonitor::DrawType::kOther); - UpdateBuffersToAutoClear(kClearBufferfv, buffer, drawbuffer); } void WebGL2RenderingContextBase::clearBufferfv(GLenum buffer, @@ -3949,14 +3961,16 @@ ScopedRGBEmulationColorMask emulation_color_mask(this, color_mask_, drawing_buffer_.get()); + // Flush any pending implicit clears. This cannot be done after the + // user-requested clearBuffer call because of scissor test side effects. + ClearIfComposited(kClearCallerDrawOrClear); + ContextGL()->ClearBufferfv(buffer, drawbuffer, value.data() + src_offset); - // clearBufferiv and clearBufferuiv will currently generate an error - // if they're called against the default back buffer. If support for - // extended canvas color spaces is added, this call might need to be - // added to the other versions. + + // This might have been used to clear the color buffer of the default back + // buffer. Notification is required to update the canvas. MarkContextChanged(kCanvasChanged, CanvasPerformanceMonitor::DrawType::kOther); - UpdateBuffersToAutoClear(kClearBufferfv, buffer, drawbuffer); } void WebGL2RenderingContextBase::clearBufferfi(GLenum buffer, @@ -3966,83 +3980,11 @@ if (isContextLost()) return; + // Flush any pending implicit clears. This cannot be done after the + // user-requested clearBuffer call because of scissor test side effects. + ClearIfComposited(kClearCallerDrawOrClear); + ContextGL()->ClearBufferfi(buffer, drawbuffer, depth, stencil); - // This might have been used to clear the depth and stencil buffers - // of the default back buffer. - MarkContextChanged(kCanvasChanged, - CanvasPerformanceMonitor::DrawType::kOther); - UpdateBuffersToAutoClear(kClearBufferfi, buffer, drawbuffer); -} - -void WebGL2RenderingContextBase::UpdateBuffersToAutoClear( - WebGL2RenderingContextBase::ClearBufferCaller caller, - GLenum buffer, - GLint drawbuffer) { - // This method makes sure that we don't auto-clear any buffers which the - // user has manually cleared using the new ES 3.0 clearBuffer* APIs. - - // If the user has a framebuffer bound, don't update the auto-clear - // state of the built-in back buffer. - if (framebuffer_binding_) - return; - - // If the scissor test is on, assume that we can't short-circuit - // these clears. - if (scissor_enabled_) - return; - - // The default back buffer only has one color attachment. - if (drawbuffer != 0) - return; - - // If the call to the driver generated an error, don't claim that - // we've auto-cleared these buffers. The early returns below are for - // cases where errors will be produced. - - // The default back buffer is currently always RGB(A)8, which - // restricts the variants which can legally be used to clear the - // color buffer. TODO(crbug.com/829632): this needs to be - // generalized. - switch (caller) { - case kClearBufferiv: - if (buffer != GL_STENCIL) - return; - break; - case kClearBufferfv: - if (buffer != GL_COLOR && buffer != GL_DEPTH) - return; - break; - case kClearBufferuiv: - return; - case kClearBufferfi: - if (buffer != GL_DEPTH_STENCIL) - return; - break; - } - - GLbitfield buffers_to_clear = 0; - - // Turn it into a bitfield and mask it off. - switch (buffer) { - case GL_COLOR: - buffers_to_clear = GL_COLOR_BUFFER_BIT; - break; - case GL_DEPTH: - buffers_to_clear = GL_DEPTH_BUFFER_BIT; - break; - case GL_STENCIL: - buffers_to_clear = GL_STENCIL_BUFFER_BIT; - break; - case GL_DEPTH_STENCIL: - buffers_to_clear = GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT; - break; - default: - // Illegal value. - return; - } - - GetDrawingBuffer()->SetBuffersToAutoClear( - GetDrawingBuffer()->GetBuffersToAutoClear() & (~buffers_to_clear)); } WebGLQuery* WebGL2RenderingContextBase::createQuery() {
diff --git a/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.h b/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.h index 7f78194..729dba8e 100644 --- a/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.h +++ b/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.h
@@ -1098,16 +1098,6 @@ gfx::Rect GetTextureSourceSubRectangle(GLsizei width, GLsizei height); - enum ClearBufferCaller { - kClearBufferiv, - kClearBufferuiv, - kClearBufferfv, - kClearBufferfi - }; - void UpdateBuffersToAutoClear(ClearBufferCaller caller, - GLenum buffer, - GLint drawbuffer); - /* WebGLRenderingContextBase overrides */ unsigned GetMaxWebGLLocationLength() const override { return 1024; } bool ValidateCapability(const char* function_name, GLenum) override;
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc index 1779c0a6..fa002d2e 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
@@ -1506,10 +1506,8 @@ if (isContextLost()) return kSkipped; - GLbitfield buffers_needing_clearing = - GetDrawingBuffer()->GetBuffersToAutoClear(); - - if (buffers_needing_clearing == 0 || (mask && framebuffer_binding_) || + if (!GetDrawingBuffer()->BufferClearNeeded() || + (mask && framebuffer_binding_) || (rasterizer_discard_enabled_ && caller == kClearCallerDrawOrClear)) return kSkipped; @@ -1567,11 +1565,7 @@ { ScopedDisableRasterizerDiscard scoped_disable(this, rasterizer_discard_enabled_); - // If the WebGL 2.0 clearBuffer APIs already have been used to - // selectively clear some of the buffers, don't destroy those - // results. - GetDrawingBuffer()->ClearFramebuffers(clear_mask & - buffers_needing_clearing); + GetDrawingBuffer()->ClearFramebuffers(clear_mask); } // Call the DrawingBufferClient method to restore scissor test, mask, and @@ -1579,7 +1573,7 @@ DrawingBufferClientRestoreScissorTest(); DrawingBufferClientRestoreMaskAndClearValues(); - GetDrawingBuffer()->SetBuffersToAutoClear(0); + GetDrawingBuffer()->SetBufferClearNeeded(false); return combined_clear ? kCombinedClear : kJustClear; } @@ -1621,7 +1615,7 @@ void WebGLRenderingContextBase::MarkLayerComposited() { if (!isContextLost()) - GetDrawingBuffer()->ResetBuffersToAutoClear(); + GetDrawingBuffer()->SetBufferClearNeeded(true); } bool WebGLRenderingContextBase::UsingSwapChain() const {
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc index 3401c3b..7980212f 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc
@@ -685,9 +685,9 @@ const auto& effect = property_state.Effect(); int transform_id = property_tree_manager.EnsureCompositorTransformNode(transform); - int clip_id = property_tree_manager.EnsureCompositorClipNode(clip); int effect_id = property_tree_manager.SwitchToEffectNodeWithSynthesizedClip( effect, clip, layer.draws_content()); + int clip_id = property_tree_manager.EnsureCompositorClipNode(clip); // We need additional bookkeeping for backdrop-filter mask. if (effect.RequiresCompositingForBackdropFilterMask() &&
diff --git a/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc b/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc index ba36e25..822f2f6 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc
@@ -51,7 +51,10 @@ void PropertyTreeManager::Finalize() { while (effect_stack_.size()) CloseCcEffect(); + DCHECK(effect_stack_.IsEmpty()); + + UpdatePixelMovingFilterClipExpanders(); } static void UpdateCcTransformLocalMatrix( @@ -532,6 +535,11 @@ compositor_node.clip = clip_node.PaintClipRect().Rect(); compositor_node.transform_id = EnsureCompositorTransformNode(clip_node.LocalTransformSpace().Unalias()); + if (clip_node.PixelMovingFilter()) { + // We have to wait until the cc effect node for the filter is ready before + // setting compositor_node.pixel_moving_filter_id. + pixel_moving_filter_clip_expanders_.push_back(&clip_node); + } clip_node.SetCcNodeId(new_sequence_number_, id); clip_tree_.set_needs_update(true); @@ -1254,4 +1262,19 @@ } } +// This is called after all property nodes have been converted and we know +// pixel_moving_filter_id for the pixel-moving clip expanders. +void PropertyTreeManager::UpdatePixelMovingFilterClipExpanders() { + for (auto* clip : pixel_moving_filter_clip_expanders_) { + DCHECK(clip->PixelMovingFilter()); + cc::ClipNode* cc_clip = + clip_tree_.Node(clip->CcNodeId(new_sequence_number_)); + DCHECK(cc_clip); + cc_clip->pixel_moving_filter_id = + clip->PixelMovingFilter()->CcNodeId(new_sequence_number_); + DCHECK(!cc_clip->AppliesLocalClip()); + } + pixel_moving_filter_clip_expanders_.clear(); +} + } // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.h b/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.h index 37ff59e5..311e7f54 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.h +++ b/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.h
@@ -303,6 +303,8 @@ const ScrollPaintPropertyNode&, const cc::TransformNode& scroll_offset_translation); + void UpdatePixelMovingFilterClipExpanders(); + PropertyTreeManagerClient& client_; // Property trees which should be updated by the manager. @@ -338,6 +340,10 @@ // A set of synthetic clips masks which will be applied if a layer under them // is encountered which draws content (and thus necessitates the mask). HashSet<int> pending_synthetic_mask_layers_; + + // EnsureCompositorClipNode() collects pixel moving filter clips. We'll set + // clip_expander of their cc nodes after all effect nodes have been converted. + Vector<const ClipPaintPropertyNode*> pixel_moving_filter_clip_expanders_; }; } // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc index 24a1aeae..fce85ab 100644 --- a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc +++ b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc
@@ -277,27 +277,18 @@ return false; } -void DrawingBuffer::ResetBuffersToAutoClear() { - GLuint buffers = GL_COLOR_BUFFER_BIT; - if (want_depth_) - buffers |= GL_DEPTH_BUFFER_BIT; - if (want_stencil_ || has_implicit_stencil_buffer_) - buffers |= GL_STENCIL_BUFFER_BIT; - SetBuffersToAutoClear(buffers); +bool DrawingBuffer::BufferClearNeeded() const { + return buffer_clear_needed_; } -void DrawingBuffer::SetBuffersToAutoClear(GLbitfield buffers) { +void DrawingBuffer::SetBufferClearNeeded(bool flag) { if (preserve_drawing_buffer_ == kDiscard) { - buffers_to_auto_clear_ = buffers; + buffer_clear_needed_ = flag; } else { - DCHECK_EQ(0u, buffers_to_auto_clear_); + DCHECK(!buffer_clear_needed_); } } -GLbitfield DrawingBuffer::GetBuffersToAutoClear() const { - return buffers_to_auto_clear_; -} - gpu::gles2::GLES2Interface* DrawingBuffer::ContextGL() { return gl_; } @@ -497,7 +488,9 @@ weak_factory_.GetWeakPtr(), std::move(registered)); contents_changed_ = false; - ResetBuffersToAutoClear(); + if (preserve_drawing_buffer_ == kDiscard) { + SetBufferClearNeeded(true); + } return true; } @@ -604,7 +597,9 @@ front_color_buffer_ = color_buffer_for_mailbox; contents_changed_ = false; - ResetBuffersToAutoClear(); + if (preserve_drawing_buffer_ == kDiscard) { + SetBufferClearNeeded(true); + } return true; } @@ -1804,8 +1799,10 @@ size_.width(), size_.height(), GL_FALSE, GL_FALSE, GL_FALSE); } - ResetBuffersToAutoClear(); contents_changed_ = false; + if (preserve_drawing_buffer_ == kDiscard) { + SetBufferClearNeeded(true); + } } scoped_refptr<DrawingBuffer::ColorBuffer> DrawingBuffer::CreateColorBuffer(
diff --git a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.h b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.h index 3809fbf..f4e6c8d 100644 --- a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.h +++ b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.h
@@ -210,12 +210,8 @@ // have not yet been resolved. bool MarkContentsChanged(); - // Maintenance of auto-clearing of color/depth/stencil buffers. The - // Reset method is present to keep calling code simpler, so it - // doesn't have to know which buffers were allocated. - void ResetBuffersToAutoClear(); - void SetBuffersToAutoClear(GLbitfield bitmask); - GLbitfield GetBuffersToAutoClear() const; + void SetBufferClearNeeded(bool); + bool BufferClearNeeded() const; void SetIsInHiddenPage(bool); void SetFilterQuality(cc::PaintFlags::FilterQuality); @@ -663,11 +659,7 @@ // True if resolveIfNeeded() has been called since the last time // markContentsChanged() had been called. bool contents_change_resolved_ = false; - - // A bitmask of GL buffer bits (GL_COLOR_BUFFER_BIT, - // GL_DEPTH_BUFFER_BIT, GL_STENCIL_BUFFER_BIT) which need to be - // auto-cleared. - GLbitfield buffers_to_auto_clear_ = 0; + bool buffer_clear_needed_ = false; // Whether the client wants a depth or stencil buffer. const bool want_depth_;
diff --git a/third_party/blink/renderer/platform/graphics/paint/clip_paint_property_node.cc b/third_party/blink/renderer/platform/graphics/paint/clip_paint_property_node.cc index 08bbee7..f564d72 100644 --- a/third_party/blink/renderer/platform/graphics/paint/clip_paint_property_node.cc +++ b/third_party/blink/renderer/platform/graphics/paint/clip_paint_property_node.cc
@@ -13,7 +13,8 @@ const State& other) const { if (local_transform_space != other.local_transform_space || paint_clip_rect_ != other.paint_clip_rect_ || - !ClipPathEquals(other.clip_path)) { + !ClipPathEquals(other.clip_path) || + pixel_moving_filter != other.pixel_moving_filter) { return PaintPropertyChangeType::kChangedOnlyValues; } if (layout_clip_rect_excluding_overlay_scrollbars != @@ -82,6 +83,10 @@ if (state_.clip_path) { json->SetBoolean("hasClipPath", true); } + if (state_.pixel_moving_filter) { + json->SetString("pixelMovingFilter", + String::Format("%p", state_.pixel_moving_filter)); + } return json; }
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 1db158dc..a23cea4 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
@@ -21,6 +21,7 @@ namespace blink { +class EffectPaintPropertyNode; class GeometryMapperClipCache; class PropertyTreeState; @@ -86,11 +87,23 @@ : local_transform_space(std::move(local_transform_space)) { SetClipRect(layout_clip_rect, paint_clip_rect); } + State(scoped_refptr<const TransformPaintPropertyNodeOrAlias> + local_transform_space, + const EffectPaintPropertyNode* pixel_moving_filter) + : local_transform_space(std::move(local_transform_space)), + pixel_moving_filter(pixel_moving_filter) { + DCHECK(layout_clip_rect_.IsInfinite()); + paint_clip_rect_ = FloatRoundedRect(layout_clip_rect_.Rect()); + } scoped_refptr<const TransformPaintPropertyNodeOrAlias> local_transform_space; absl::optional<FloatClipRect> layout_clip_rect_excluding_overlay_scrollbars; absl::optional<Path> clip_path; + // If this is not nullptr, this clip node will generate a cc clip node to + // expand clip rect for a pixel-moving filter. + // TODO(wangxianzhu): Use this to simplify visual rect mapping in blink. + const EffectPaintPropertyNode* pixel_moving_filter = nullptr; void SetClipRect(const gfx::RectF& layout_clip_rect_arg, const FloatRoundedRect& paint_clip_rect_arg) { @@ -162,6 +175,10 @@ return state_.ClipPathEquals(p); } + const EffectPaintPropertyNode* PixelMovingFilter() const { + return state_.pixel_moving_filter; + } + std::unique_ptr<JSONObject> ToJSON() const; private:
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc index f0c7721e..2bce260 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
@@ -38,8 +38,10 @@ #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/time/time.h" +#include "base/unguessable_token.h" #include "services/network/public/cpp/request_mode.h" #include "services/network/public/mojom/url_loader_factory.mojom-blink.h" +#include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/features.h" #include "third_party/blink/public/common/mime_util/mime_util.h" #include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h" @@ -973,10 +975,7 @@ void ResourceFetcher::AttachWebBundleTokenIfNeeded( ResourceRequest& resource_request) const { - if (!subresource_web_bundles_) - return; - SubresourceWebBundle* bundle = - subresource_web_bundles_->GetMatchingBundle(resource_request.Url()); + SubresourceWebBundle* bundle = GetMatchingBundle(resource_request.Url()); if (!bundle) return; resource_request.SetWebBundleTokenParams( @@ -2232,16 +2231,29 @@ if (archive_) return archive_->GetCacheIdentifier(); - if (subresource_web_bundles_) { - SubresourceWebBundle* bundle = - subresource_web_bundles_->GetMatchingBundle(url); - if (bundle) - return bundle->GetCacheIdentifier(); - } + SubresourceWebBundle* bundle = GetMatchingBundle(url); + if (bundle) + return bundle->GetCacheIdentifier(); return MemoryCache::DefaultCacheIdentifier(); } +absl::optional<base::UnguessableToken> +ResourceFetcher::GetSubresourceBundleToken(const KURL& url) const { + SubresourceWebBundle* bundle = GetMatchingBundle(url); + if (!bundle) + return absl::nullopt; + return bundle->WebBundleToken(); +} + +absl::optional<KURL> ResourceFetcher::GetSubresourceBundleSourceUrl( + const KURL& url) const { + SubresourceWebBundle* bundle = GetMatchingBundle(url); + if (!bundle) + return absl::nullopt; + return bundle->GetBundleUrl(); +} + void ResourceFetcher::EmulateLoadStartedForInspector( Resource* resource, const KURL& url, @@ -2391,6 +2403,13 @@ info->SetLoadResponseEnd(response_end); } +SubresourceWebBundle* ResourceFetcher::GetMatchingBundle( + const KURL& url) const { + return subresource_web_bundles_ + ? subresource_web_bundles_->GetMatchingBundle(url) + : nullptr; +} + void ResourceFetcher::Trace(Visitor* visitor) const { visitor->Trace(context_); visitor->Trace(properties_);
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 f8d9c5d0..8611ea4 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h +++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h
@@ -31,7 +31,9 @@ #include <utility> #include "base/task/single_thread_task_runner.h" +#include "base/unguessable_token.h" #include "services/metrics/public/cpp/mojo_ukm_recorder.h" +#include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/mojom/blob/blob_registry.mojom-blink.h" #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink-forward.h" #include "third_party/blink/public/mojom/service_worker/controller_service_worker_mode.mojom-blink-forward.h" @@ -70,6 +72,7 @@ class ResourceError; class ResourceLoadObserver; class ResourceTimingInfo; +class SubresourceWebBundle; class SubresourceWebBundleList; class WebBackForwardCacheLoaderHelper; class WebCodeCacheLoader; @@ -251,6 +254,13 @@ String GetCacheIdentifier(const KURL& url) const; + // If `url` exists as a resource in a subresource bundle in this frame, + // returns its UnguessableToken; otherwise, returns absl::nullopt. + absl::optional<base::UnguessableToken> GetSubresourceBundleToken( + const KURL& url) const; + + absl::optional<KURL> GetSubresourceBundleSourceUrl(const KURL& url) const; + enum IsImageSet { kImageNotImageSet, kImageIsImageSet }; [[nodiscard]] static mojom::blink::RequestContextType DetermineRequestContext( @@ -434,6 +444,7 @@ void PopulateAndAddResourceTimingInfo(Resource* resource, scoped_refptr<ResourceTimingInfo> info, base::TimeTicks response_end); + SubresourceWebBundle* GetMatchingBundle(const KURL& url) const; Member<DetachableResourceFetcherProperties> properties_; Member<ResourceLoadObserver> resource_load_observer_;
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index f86691e..3b4be6c 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -1196,7 +1196,7 @@ // if the HighlightInheritance feature is not enabled. { name: "HighlightAPI", - status: "experimental", + status: "stable", }, { name: "HighlightInheritance", @@ -2448,10 +2448,6 @@ origin_trial_os: ["android", "chromeos", "fuchsia", "linux", "mac", "win"], }, { - name: "UUID", - status: "stable" - }, - { name: "V8IdleTasks", }, {
diff --git a/third_party/blink/tools/blinkpy/common/checkout/baseline_optimizer.py b/third_party/blink/tools/blinkpy/common/checkout/baseline_optimizer.py index f3569bdc..bac81cf1a 100644 --- a/third_party/blink/tools/blinkpy/common/checkout/baseline_optimizer.py +++ b/third_party/blink/tools/blinkpy/common/checkout/baseline_optimizer.py
@@ -89,13 +89,20 @@ baseline_name = self._default_port.output_filename( test_name, self._default_port.BASELINE_SUFFIX, extension) - non_virtual_baseline_name = self._virtual_base(baseline_name) - if non_virtual_baseline_name: - # The baseline belongs to a virtual suite. + non_virtual_test_name = self._virtual_test_base(test_name) + if non_virtual_test_name: + # The test belongs to a virtual suite. _log.debug('Optimizing virtual fallback path.') self._patch_virtual_subtree(test_name, extension, baseline_name) succeeded &= self._optimize_subtree(test_name, baseline_name) - self._optimize_virtual_root(test_name, extension, baseline_name) + + # Update the non-virtual baseline name + non_virtual_baseline_name = self._default_port.output_filename( + non_virtual_test_name, self._default_port.BASELINE_SUFFIX, + extension) + self._optimize_virtual_root(test_name, extension, baseline_name, + non_virtual_baseline_name) + else: # The given baseline is already non-virtual. non_virtual_baseline_name = baseline_name @@ -112,7 +119,7 @@ def _optimize_flag_specific_baselines(self, test_name, extension): """Optimize flag-specific baselines.""" flag_specific = self._flag_spec_port.flag_specific_config_name() - non_virtual_test_name = self._virtual_base(test_name) + non_virtual_test_name = self._virtual_test_base(test_name) if non_virtual_test_name: _log.debug( 'Optimizing flag-specific virtual fallback path ' @@ -137,7 +144,7 @@ baselines = port.expected_baselines(test_name, extension, all_baselines=True) - non_virtual_test_name = self._virtual_base(test_name) + non_virtual_test_name = self._virtual_test_base(test_name) if non_virtual_test_name: baselines.extend( port.expected_baselines(non_virtual_test_name, @@ -320,7 +327,7 @@ where the two arguments are the absolute paths to the virtual platform baseline and the non-virtual fallback respectively. """ - actual_test_name = self._virtual_base(test_name) + actual_test_name = self._virtual_test_base(test_name) assert actual_test_name, '%s is not a virtual test.' % test_name for directory in self._directories_immediately_preceding_root(): @@ -360,13 +367,15 @@ self._walk_immediate_predecessors_of_virtual_root( test_name, extension, baseline_name, patcher) - def _optimize_virtual_root(self, test_name, extension, baseline_name): + def _optimize_virtual_root(self, test_name, extension, baseline_name, + non_virtual_baseline_name): virtual_root_baseline_path = self._filesystem.join( self._generic_baselines_dir, baseline_name) if self._filesystem.exists(virtual_root_baseline_path): _log.debug( 'Virtual root baseline found. Checking if we can remove it.') - self._try_to_remove_virtual_root(test_name, baseline_name, + self._try_to_remove_virtual_root(test_name, + non_virtual_baseline_name, virtual_root_baseline_path) else: _log.debug( @@ -374,7 +383,7 @@ ) self._unpatch_virtual_subtree(test_name, extension, baseline_name) - def _try_to_remove_virtual_root(self, test_name, baseline_name, + def _try_to_remove_virtual_root(self, test_name, non_virtual_baseline_name, virtual_root_baseline_path): # See if all the successors of the virtual root (i.e. all non-virtual # platforms) have the same baseline as the virtual root. If so, the @@ -385,7 +394,7 @@ # Read the base (non-virtual) results. results_by_directory = self.read_results_by_directory( - test_name, self._virtual_base(baseline_name)) + test_name, non_virtual_baseline_name) results_by_port_name = self._results_by_port_name(results_by_directory) for port_name in self._ports.keys(): @@ -439,12 +448,13 @@ relative_baseline_root = self._baseline_root() return relative_paths + [relative_baseline_root] - def _virtual_base(self, baseline_name): - """Returns the base (non-virtual) version of baseline_name, or None if - baseline_name is not virtual.""" - # Note: port.lookup_virtual_test_base in fact expects a test_name, - # but baseline_name also works here. - return self._default_port.lookup_virtual_test_base(baseline_name) + def _virtual_test_base(self, test_name): + """Returns the base (non-virtual) version of test_name, or None if + test_name is not virtual.""" + # This function should only accept a test name. Use baseline won't work + # because some bases in VirtualTestSuites are full test name which has + # .html as extension. + return self._default_port.lookup_virtual_test_base(test_name) def _join_directory(self, directory, baseline_name): """Returns the absolute path to the baseline in the given directory.""" @@ -597,11 +607,11 @@ # Implicit extra result at the root. return len(search_path) - 1, search_path[-1] - def _remove_extra_result_at_root(self, test_name, baseline_name): + def _remove_extra_result_at_root(self, test_name, + non_virtual_baseline_name): """Removes extra result at the non-virtual root.""" - assert not self._virtual_base(baseline_name), \ - 'A virtual baseline is passed in.' - path = self._join_directory(self._baseline_root(), baseline_name) + path = self._join_directory(self._baseline_root(), + non_virtual_baseline_name) if (self._filesystem.exists(path) and ResultDigest(self._filesystem, path, self._is_reftest(test_name)).is_extra_result):
diff --git a/third_party/blink/tools/blinkpy/common/checkout/baseline_optimizer_unittest.py b/third_party/blink/tools/blinkpy/common/checkout/baseline_optimizer_unittest.py index 7b317bb..17b1d188 100644 --- a/third_party/blink/tools/blinkpy/common/checkout/baseline_optimizer_unittest.py +++ b/third_party/blink/tools/blinkpy/common/checkout/baseline_optimizer_unittest.py
@@ -122,7 +122,8 @@ self.fs.write_text_file( self.fs.join(web_tests_dir, 'VirtualTestSuites'), '[{"prefix": "gpu", "platforms": ["Linux", "Mac", "Win"], ' - '"bases": ["fast/canvas"], "args": ["--foo"]}]') + '"bases": ["fast/canvas", "slow/canvas/mock-test.html"], ' + '"args": ["--foo"]}]') self.fs.write_text_file( self.fs.join(web_tests_dir, 'FlagSpecificConfig'), '[{"name": "highdpi", "args": ["--force-device-scale-factor=1.5"]}]' @@ -414,6 +415,20 @@ }, baseline_dirname='virtual/gpu/fast/canvas') + def test_virtual_all_pass_testharness_falls_back_to_full_base_name(self): + # The all-PASS baseline needs to be preserved in this case. + self._assert_optimization( + { + 'platform/generic/virtual/gpu/slow/canvas': + ALL_PASS_TESTHARNESS_RESULT, + 'platform/linux/slow/canvas': '1', + }, { + 'platform/generic/virtual/gpu/slow/canvas': + ALL_PASS_TESTHARNESS_RESULT, + 'platform/linux/slow/canvas': '1', + }, + baseline_dirname='virtual/gpu/slow/canvas') + def test_empty_at_root(self): self._assert_optimization({'platform/generic': ''}, {'platform/generic': None})
diff --git a/third_party/blink/tools/blinkpy/web_tests/controllers/single_test_runner.py b/third_party/blink/tools/blinkpy/web_tests/controllers/single_test_runner.py index 1d4006c..02fdad8 100644 --- a/third_party/blink/tools/blinkpy/web_tests/controllers/single_test_runner.py +++ b/third_party/blink/tools/blinkpy/web_tests/controllers/single_test_runner.py
@@ -623,8 +623,13 @@ e) if driver_output.image_hash != expected_driver_output.image_hash: - diff, err_str = self._port.diff_image(expected_driver_output.image, - driver_output.image) + max_channel_diff, max_pixels_diff = self._port.get_wpt_fuzzy_metadata( + self._test_name) + diff, err_str = self._port.diff_image( + expected_driver_output.image, + driver_output.image, + max_channel_diff=max_channel_diff, + max_pixels_diff=max_pixels_diff) if diff: driver_output.image_diff = diff @@ -640,7 +645,7 @@ test_failures.FailureImageHashMismatch( driver_output, expected_driver_output) ] - else: + elif not max_pixels_diff: # See https://bugs.webkit.org/show_bug.cgi?id=69444 for why this # isn't a full failure. _log.warning(' %s -> pixel hash failed (but diff passed)', @@ -773,7 +778,7 @@ elif err_str: # TODO(rmhasan) Should we include this error message in the artifacts ? _log.error(' %s : %s', self._test_name, err_str) - else: + elif not max_pixels_diff: _log.warning( " %s -> ref test hashes didn't match but diff passed", self._test_name)
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/base.py b/third_party/blink/tools/blinkpy/web_tests/port/base.py index d2ec44f..e97498a 100644 --- a/third_party/blink/tools/blinkpy/web_tests/port/base.py +++ b/third_party/blink/tools/blinkpy/web_tests/port/base.py
@@ -212,6 +212,14 @@ WPT_REGEX = re.compile( r'^(?:virtual/[^/]+/)?(external/wpt|wpt_internal)/(.*)$') + # This regex parses the WPT-style style fuzzy match syntax. For actual WPT + # tests, this is not needed since this information is contained in the + # manifest. However, we reuse this syntax for some non-WPT tests as well. + WPT_FUZZY_REGEX = re.compile( + r'<(?:html:)?meta\s+name=(?:fuzzy|"fuzzy")\s+content=' + r'"(?:(.+):)?(?:maxDifference=)?(?:(\d+)-)?(\d+);(?:totalPixels=)?(?:(\d+)-)?(\d+)"\s*/?>' + ) + # Because this is an abstract base class, arguments to functions may be # unused in this class - pylint: disable=unused-argument @@ -1134,20 +1142,47 @@ return self.wpt_manifest(wpt_path).is_slow_test(path_in_wpt) def get_wpt_fuzzy_metadata(self, test_name): - """Returns the fuzzy metadata for the given WPT test. + """Returns the WPT-style fuzzy metadata for the given test. The metadata is a pair of lists, (maxDifference, totalPixels), where - each list is a [min, max] range, inclusive. If the test is not a WPT - test or has no fuzzy metadata, returns (None, None). + each list is a [min, max] range, inclusive. If the test has no fuzzy metadata, + returns (None, None). See https://web-platform-tests.org/writing-tests/reftests.html#fuzzy-matching """ match = self.WPT_REGEX.match(test_name) - if not match: - return None, None - wpt_path = match.group(1) - path_in_wpt = match.group(2) - return self.wpt_manifest(wpt_path).extract_fuzzy_metadata(path_in_wpt) + + if match: + # This is an actual WPT test, so we can get the metadata from the manifest. + wpt_path = match.group(1) + path_in_wpt = match.group(2) + return self.wpt_manifest(wpt_path).extract_fuzzy_metadata( + path_in_wpt) + + # This is not a WPT test, so we will parse the metadata ourselves. + if not self.test_isfile(test_name): + return (None, None) + + # We use a safe encoding because some test files are incompatible with utf-8. + test_file = self.read_test(test_name, "latin-1") + if not test_file: + return (None, None) + + # We only take the first match which is in line with what we do for WPT tests. + fuzzy_match = self.WPT_FUZZY_REGEX.search(test_file) + if not fuzzy_match: + return (None, None) + + _, max_diff_min, max_diff_max, tot_pix_min, tot_pix_max = \ + fuzzy_match.groups() + if not max_diff_min: + max_diff_min = max_diff_max + if not tot_pix_min: + tot_pix_min = tot_pix_max + + return ([int(max_diff_min), + int(max_diff_max)], [int(tot_pix_min), + int(tot_pix_max)]) def get_file_path_for_wpt_test(self, test_name): """Returns the real file path for the given WPT test. @@ -1203,6 +1238,24 @@ if fs.isdir(fs.join(web_tests_dir, d)) ] + def read_test(self, test_name, encoding="utf8"): + """Returns the contents of the given test according to the given encoding. + If no corresponding file can be found, returns None instead. + Warning: some tests are in utf8-incompatible encodings. + """ + path = self.abspath_for_test(test_name) + if self._filesystem.isfile(path): + return self._filesystem.read_binary_file(path).decode(encoding) + + base = self.lookup_virtual_test_base(test_name) + if not base: + return None + path = self.abspath_for_test(base) + if self._filesystem.isfile(path): + return self._filesystem.read_binary_file(path).decode(encoding) + + return None + @memoized def test_isfile(self, test_name): """Returns True if the test name refers to an existing test file."""
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/base_unittest.py b/third_party/blink/tools/blinkpy/web_tests/port/base_unittest.py index 80b7db9..f71e663 100644 --- a/third_party/blink/tools/blinkpy/web_tests/port/base_unittest.py +++ b/third_party/blink/tools/blinkpy/web_tests/port/base_unittest.py
@@ -1160,6 +1160,37 @@ self.assertFalse( port.is_slow_wpt_test('/dom/ranges/Range-attributes-slow.html')) + def test_get_wpt_fuzzy_metadata_for_non_wpt_test(self): + port = self.make_port(with_tests=True) + + rt_path = port.abspath_for_test("passes/reftest.html") + + port._filesystem.write_text_file( + rt_path, "<meta name=fuzzy content=\"15;300\">") + result = port.get_wpt_fuzzy_metadata("passes/reftest.html") + self.assertEqual(result, ([15, 15], [300, 300])) + + port._filesystem.write_text_file( + rt_path, "<meta name=fuzzy content=\"3-20;300\">") + result = port.get_wpt_fuzzy_metadata("passes/reftest.html") + self.assertEqual(result, ([3, 20], [300, 300])) + + port._filesystem.write_text_file( + rt_path, "foo<meta name=fuzzy content=\"ref.html:0;1-200\">bar") + result = port.get_wpt_fuzzy_metadata("passes/reftest.html") + self.assertEqual(result, ([0, 0], [1, 200])) + + port._filesystem.write_text_file( + rt_path, + "<meta name=fuzzy\ncontent=\"ref.html:maxDifference=30;totalPixels=1-2\">" + ) + result = port.get_wpt_fuzzy_metadata("passes/reftest.html") + self.assertEqual(result, ([30, 30], [1, 2])) + + result = port.get_wpt_fuzzy_metadata( + "virtual/virtual_passes/passes/reftest.html") + self.assertEqual(result, ([30, 30], [1, 2])) + def test_get_file_path_for_wpt_test(self): port = self.make_port(with_tests=True) add_manifest_to_mock_filesystem(port) @@ -1284,6 +1315,32 @@ port.test_exists( 'virtual/virtual_empty_bases/does_not_exist.html')) + def test_read_test(self): + port = self.make_port(with_tests=True) + + port._filesystem.write_text_file( + port.abspath_for_test("passes/text.html"), "Foo") + self.assertEqual(port.read_test("passes/text.html"), "Foo") + self.assertEqual( + port.read_test("virtual/virtual_passes/passes/text.html"), "Foo") + + port._filesystem.write_text_file( + port.abspath_for_test("virtual/virtual_passes/passes/text.html"), + "Bar") + self.assertEqual( + port.read_test("virtual/virtual_passes/passes/text.html"), "Bar") + + port._filesystem.write_text_file( + port.abspath_for_test( + "virtual/virtual_empty_bases/physical1.html"), "Baz") + self.assertEqual( + port.read_test("virtual/virtual_empty_bases/physical1.html"), + "Baz") + + port._filesystem.write_binary_file( + port.abspath_for_test("passes/text.html"), "Foo".encode("utf16")) + self.assertEqual(port.read_test("passes/text.html", "utf16"), "Foo") + def test_test_isfile(self): port = self.make_port(with_tests=True) self.assertFalse(port.test_isfile('passes'))
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng index 7da3fcb7..6c6cc29 100644 --- a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng +++ b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
@@ -296,6 +296,10 @@ crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-088.html [ Failure ] crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-089.html [ Failure ] crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-090.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-094.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-095.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-096.html [ Failure ] +crbug.com/829028 external/wpt/css/css-break/out-of-flow-in-multicolumn-099.html [ Failure ] crbug.com/829028 external/wpt/css/css-break/overflow-clip-000.html [ Failure ] crbug.com/829028 external/wpt/css/css-break/overflow-clip-001.html [ Failure ] crbug.com/829028 external/wpt/css/css-break/overflow-clip-010.html [ Failure ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index ce99327..4263ce7 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -1791,9 +1791,7 @@ crbug.com/1078927 virtual/layout_ng_table_frag/fragmentation/single-line-cells-multiple-tables-caption-repeating-thead-tfoot-with-border-spacing-at-top-of-row.html [ Failure ] crbug.com/1335870 virtual/layout_ng_table_frag/fragmentation/single-line-cells-multiple-tables-repeating-thead-with-border-spacing-at-top-of-row.html [ Failure ] crbug.com/1078927 virtual/layout_ng_table_frag/fragmentation/single-line-cells-repeating-thead-cell-straddles-page.html [ Failure ] -crbug.com/1078927 virtual/layout_ng_table_frag/fragmentation/single-line-cells-repeating-thead-starts-middle-of-page-break-after-avoid-3.html [ Failure ] crbug.com/1078927 virtual/layout_ng_table_frag/fragmentation/single-line-cells-repeating-thead-starts-middle-of-page-break-after-avoid.html [ Failure ] -crbug.com/1078927 virtual/layout_ng_table_frag/fragmentation/single-line-cells-repeating-thead-starts-middle-of-page.html [ Failure ] crbug.com/1078927 virtual/layout_ng_table_frag/fragmentation/single-line-cells-repeating-thead-tfoot-starts-middle-of-page-break-after-avoid-2.html [ Failure ] crbug.com/1078927 virtual/layout_ng_table_frag/fragmentation/single-line-cells-repeating-thead-tfoot-starts-middle-of-page-break-after-avoid-3.html [ Failure ] crbug.com/1078927 virtual/layout_ng_table_frag/fragmentation/single-line-cells-repeating-thead-tfoot-starts-middle-of-page-break-after-avoid.html [ Failure ] @@ -1802,9 +1800,6 @@ crbug.com/1078927 virtual/layout_ng_table_frag/fragmentation/single-line-cells-repeating-thead-tfoot-with-caption.html [ Failure ] crbug.com/1078927 virtual/layout_ng_table_frag/fragmentation/single-line-cells-repeating-thead-tfoot-with-two-captions.html [ Failure ] crbug.com/1078927 virtual/layout_ng_table_frag/fragmentation/single-line-cells-repeating-thead-tfoot.html [ Failure ] -crbug.com/1078927 virtual/layout_ng_table_frag/fragmentation/single-line-cells-repeating-thead-with-caption.html [ Failure ] -crbug.com/1078927 virtual/layout_ng_table_frag/fragmentation/single-line-cells-repeating-thead-with-two-captions.html [ Failure ] -crbug.com/1078927 virtual/layout_ng_table_frag/fragmentation/single-line-cells-repeating-thead.html [ Failure ] crbug.com/1078927 virtual/layout_ng_table_frag/fragmentation/table-overlapping-rowspan.html [ Failure ] crbug.com/1078927 virtual/layout_ng_table_frag/fragmentation/table-row-dimensions-break-freely.html [ Failure ] crbug.com/1078927 virtual/layout_ng_table_frag/fragmentation/table-row-dimensions-with-thead.html [ Failure ] @@ -7149,5 +7144,4 @@ # Sheriff 2022-07-15 crbug.com/1344652 [ Mac ] external/wpt/webmessaging/with-ports/020.html [ Failure Pass ] - -crbug.com/1344771 [ Win ] virtual/force-defer-script/external/wpt/html/semantics/scripting-1/the-script-element/defer-script/document-write.html [ Failure Pass ] +crbug.com/1344771 virtual/force-defer-script/external/wpt/html/semantics/scripting-1/the-script-element/defer-script/document-write.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/W3CImportExpectations b/third_party/blink/web_tests/W3CImportExpectations index 646fb51..6260046 100644 --- a/third_party/blink/web_tests/W3CImportExpectations +++ b/third_party/blink/web_tests/W3CImportExpectations
@@ -417,10 +417,6 @@ external/wpt/css/css-page/page-size-011.xht [ Skip ] external/wpt/css/css-page/page-size-012.xht [ Skip ] -# This test caused presubmit check failure due to baselines path name exceeds 200 characters -# Skip this test for now. Will rename the test at upstream then unskip -external/wpt/editing/other/insertparagraph-or-insertlinebreak-in-inline-editing-host.tentative.html [ Skip ] - # This test includes arbitrary html in unit test names (via parametrize) which # is currently not well handled in WebDriverExpectations, and causes Lint error # crbug.com/1167318
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-094.html b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-094.html new file mode 100644 index 0000000..1cb04aef --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-094.html
@@ -0,0 +1,16 @@ +<!DOCTYPE html> +<title> + OOFs and column balancing. +</title> +<link rel="help" href="https://www.w3.org/TR/css-position-3/#abspos-breaking"> +<link rel="match" href="../reference/ref-filled-green-200px-square.html"> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div style="height:200px; width:200px; background:red;"> + <div style="width:200px; columns:2; column-rule:solid green; background:green;"> + <div style="contain:size; height:100px;"></div> + <div style="contain:size; height:100px;"></div> + <div style="position:relative;"> + <div style="position:absolute; height:100px;"></div> + </div> + </div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-095.html b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-095.html new file mode 100644 index 0000000..3811791 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-095.html
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<title> + OOFs and column balancing. +</title> +<link rel="help" href="https://www.w3.org/TR/css-position-3/#abspos-breaking"> +<link rel="match" href="../reference/ref-filled-green-200px-square.html"> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div style="height:200px; width:200px; background:red;"> + <div style="width:200px; columns:2; column-rule:solid green; background:green;"> + <div style="contain:size; height:100px;"></div> + <div style="position:relative; height:100px;"> + <div style="position:absolute; contain:size; height:100px;"></div> + </div> + <div style="position:relative;"> + <div style="position:absolute; contain:size; height:100px;"></div> + </div> + </div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-096.html b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-096.html new file mode 100644 index 0000000..f5382d6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-096.html
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<title> + OOFs and nested column balancing. +</title> +<link rel="help" href="https://www.w3.org/TR/css-position-3/#abspos-breaking"> +<link rel="match" href="../reference/ref-filled-green-200px-square.html"> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div style="height:200px; width:200px; background:red;"> + <div style="width:200px; columns:1;"> + <div style="width:200px; columns:2; column-rule:solid green; background:green;"> + <div style="contain:size; height:100px;"></div> + <div style="contain:size; height:100px;"></div> + <div style="position:relative;"> + <div style="position:absolute; height:100px;"></div> + </div> + </div> + </div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-097.html b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-097.html new file mode 100644 index 0000000..faac6070 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-097.html
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<title> + OOFs and column balancing with a spanner. +</title> +<link rel="help" href="https://www.w3.org/TR/css-position-3/#abspos-breaking"> +<link rel="match" href="../reference/ref-filled-green-200px-square.html"> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div style="height:200px; width:200px; background:red;"></div> +<div style="width:200px; columns:2; column-rule:20px solid green; margin-top:-300px; position:relative;"> + <div style="contain:size; height:80px;"></div> + <div style="column-span:all; height:20px;"></div> + <div style="contain:size; height:100px; width:100%; background:green;"></div> + <div style="contain:size; height:100px; width:100%; background:green;"></div> + <div style="position:relative;"> + <div style="position:absolute; width:100%; height:100px; background:green;"></div> + </div> + <div style="position:absolute; bottom:0; right:0; width:90px; height:100px; background:green;"></div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-098.html b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-098.html new file mode 100644 index 0000000..390e869 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-098.html
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<title> + OOFs and column balancing with a spanner and the CB breaks across the spanner. +</title> +<link rel="help" href="https://www.w3.org/TR/css-position-3/#abspos-breaking"> +<link rel="match" href="../reference/ref-filled-green-200px-square.html"> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div style="height:200px; width:200px; background:red;"></div> +<div style="width:200px; columns:2; column-rule:20px solid green; margin-top:-300px; position:relative;"> + <div style="position:relative;"> + <div style="contain:size; height:80px;"></div> + <div style="column-span:all; height:20px;"></div> + <div style="contain:size; height:100px; width:100%; background:green;"></div> + <div style="contain:size; height:100px; width:100%; background:green;"></div> + <div style="position:absolute; width:100%; height:100px; background:green;"></div> + </div> + <div style="position:absolute; bottom:0; right:0; width:90px; height:100px; background:green;"></div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-099.html b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-099.html new file mode 100644 index 0000000..8c75b2b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-099.html
@@ -0,0 +1,15 @@ +<!DOCTYPE html> +<title> + OOFs and column balancing with a nested break-inside:avoid. +</title> +<link rel="help" href="https://www.w3.org/TR/css-position-3/#abspos-breaking"> +<link rel="match" href="../reference/ref-filled-green-200px-square.html"> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div style="width:200px; columns:2; column-rule:solid green; background:green;"> + <div style="contain:size; height:100px;"></div> + <div style="position:relative; height:200px; width:100%; background:red;"> + <div style="position:absolute; width:100%; background:green;"> + <div style="height:200px; break-inside:avoid;"></div> + </div> + </div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/will-change-blur-filter-under-clip.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/will-change-blur-filter-under-clip.html new file mode 100644 index 0000000..68e622c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/will-change-blur-filter-under-clip.html
@@ -0,0 +1,8 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#FilterProperty"> +<link rel="help" href="https://crbug.com/1228817"> +<link rel="match" href="reference/green-100x100.html"> +<div style="width: 100px; height: 100px; overflow: hidden"> + <div style="width: 200px; height: 200px; margin-top: -50px; margin-left: -50px; + background: green; filter: blur(10px); will-change: filter"></div> +</div>
diff --git a/third_party/blink/web_tests/fast/forms/datetimelocal/reset-no-console-messages.html b/third_party/blink/web_tests/fast/forms/datetimelocal/reset-no-console-messages.html new file mode 100644 index 0000000..a7d4cd3 --- /dev/null +++ b/third_party/blink/web_tests/fast/forms/datetimelocal/reset-no-console-messages.html
@@ -0,0 +1,14 @@ +<!DOCTYPE html> +<link rel=author href="mailto:jarhar@chromium.org"> +<link rel=help href="https://bugs.chromium.org/p/chromium/issues/detail?id=1343222"> + +<div>This test passes if it generates no console messages.</div> +<form><input type=datetime-local></form> + +<script> + testRunner.dumpAsText(); + testRunner.setDumpConsoleMessages(true); + // Forcing layout on the input is required to generate the console warning. + document.querySelector('input').getBoundingClientRect(); + document.querySelector('form').reset(); +</script>
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/masks/mask-with-added-filters-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/masks/mask-with-added-filters-expected.png deleted file mode 100644 index 4a95aa2..0000000 --- a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/masks/mask-with-added-filters-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/generic/fast/forms/datetimelocal/reset-no-console-messages-expected.txt b/third_party/blink/web_tests/platform/generic/fast/forms/datetimelocal/reset-no-console-messages-expected.txt new file mode 100644 index 0000000..f7cedac --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/fast/forms/datetimelocal/reset-no-console-messages-expected.txt
@@ -0,0 +1 @@ +This test passes if it generates no console messages.
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/eventsource/eventsource-cors-non-http-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/eventsource/eventsource-cors-non-http-expected.txt index 07bb316..c925fa85 100644 --- a/third_party/blink/web_tests/platform/generic/http/tests/eventsource/eventsource-cors-non-http-expected.txt +++ b/third_party/blink/web_tests/platform/generic/http/tests/eventsource/eventsource-cors-non-http-expected.txt
@@ -1,7 +1,7 @@ CONSOLE ERROR: Not allowed to load local resource: motd -CONSOLE ERROR: Access to resource at 'ftp://127.0.0.1/' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. -CONSOLE ERROR: Access to resource at 'localhost:8080/' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. -CONSOLE ERROR: Access to resource at 'tel:1234' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. +CONSOLE ERROR: Access to resource at 'ftp://127.0.0.1/' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. +CONSOLE ERROR: Access to resource at 'localhost:8080/' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. +CONSOLE ERROR: Access to resource at 'tel:1234' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. Test EventSource with non-HTTP protocol schemes in the URL. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/eventsource/workers/eventsource-cors-non-http-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/eventsource/workers/eventsource-cors-non-http-expected.txt index 33b762a..ac01e942 100644 --- a/third_party/blink/web_tests/platform/generic/http/tests/eventsource/workers/eventsource-cors-non-http-expected.txt +++ b/third_party/blink/web_tests/platform/generic/http/tests/eventsource/workers/eventsource-cors-non-http-expected.txt
@@ -1,7 +1,7 @@ CONSOLE ERROR: Not allowed to load local resource: motd -CONSOLE ERROR: Access to resource at 'ftp://127.0.0.1/' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. -CONSOLE ERROR: Access to resource at 'localhost:8080/' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. -CONSOLE ERROR: Access to resource at 'tel:1234' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. +CONSOLE ERROR: Access to resource at 'ftp://127.0.0.1/' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. +CONSOLE ERROR: Access to resource at 'localhost:8080/' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. +CONSOLE ERROR: Access to resource at 'tel:1234' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. [Worker] Test EventSource with non-HTTP protocol schemes in the URL. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/xmlhttprequest/cross-origin-unsupported-url-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/xmlhttprequest/cross-origin-unsupported-url-expected.txt index 688f10d9..f4d7d32 100644 --- a/third_party/blink/web_tests/platform/generic/http/tests/xmlhttprequest/cross-origin-unsupported-url-expected.txt +++ b/third_party/blink/web_tests/platform/generic/http/tests/xmlhttprequest/cross-origin-unsupported-url-expected.txt
@@ -1,15 +1,15 @@ -CONSOLE ERROR: Access to XMLHttpRequest at 'mailto:foo@bar.com' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. -CONSOLE ERROR: Access to XMLHttpRequest at 'mailto:foo@bar.com' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. -CONSOLE ERROR: Access to XMLHttpRequest at 'localhost:8080/' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. -CONSOLE ERROR: Access to XMLHttpRequest at 'localhost:8080/' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. -CONSOLE ERROR: Access to XMLHttpRequest at 'tel:1234' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. -CONSOLE ERROR: Access to XMLHttpRequest at 'tel:1234' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. -CONSOLE ERROR: Access to XMLHttpRequest at 'mailto:foo@bar.com' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. -CONSOLE ERROR: Access to XMLHttpRequest at 'mailto:foo@bar.com' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. -CONSOLE ERROR: Access to XMLHttpRequest at 'localhost:8080/' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. -CONSOLE ERROR: Access to XMLHttpRequest at 'localhost:8080/' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. -CONSOLE ERROR: Access to XMLHttpRequest at 'tel:1234' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. -CONSOLE ERROR: Access to XMLHttpRequest at 'tel:1234' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. +CONSOLE ERROR: Access to XMLHttpRequest at 'mailto:foo@bar.com' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. +CONSOLE ERROR: Access to XMLHttpRequest at 'mailto:foo@bar.com' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. +CONSOLE ERROR: Access to XMLHttpRequest at 'localhost:8080/' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. +CONSOLE ERROR: Access to XMLHttpRequest at 'localhost:8080/' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. +CONSOLE ERROR: Access to XMLHttpRequest at 'tel:1234' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. +CONSOLE ERROR: Access to XMLHttpRequest at 'tel:1234' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. +CONSOLE ERROR: Access to XMLHttpRequest at 'mailto:foo@bar.com' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. +CONSOLE ERROR: Access to XMLHttpRequest at 'mailto:foo@bar.com' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. +CONSOLE ERROR: Access to XMLHttpRequest at 'localhost:8080/' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. +CONSOLE ERROR: Access to XMLHttpRequest at 'localhost:8080/' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. +CONSOLE ERROR: Access to XMLHttpRequest at 'tel:1234' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. +CONSOLE ERROR: Access to XMLHttpRequest at 'tel:1234' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. This is a testharness.js-based test. PASS sync test for url=mailto:foo@bar.com, contentType=undefined PASS sync test for url=mailto:foo@bar.com, contentType=application/json
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/xmlhttprequest/workers/cross-origin-unsupported-url-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/xmlhttprequest/workers/cross-origin-unsupported-url-expected.txt index 688f10d9..f4d7d32 100644 --- a/third_party/blink/web_tests/platform/generic/http/tests/xmlhttprequest/workers/cross-origin-unsupported-url-expected.txt +++ b/third_party/blink/web_tests/platform/generic/http/tests/xmlhttprequest/workers/cross-origin-unsupported-url-expected.txt
@@ -1,15 +1,15 @@ -CONSOLE ERROR: Access to XMLHttpRequest at 'mailto:foo@bar.com' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. -CONSOLE ERROR: Access to XMLHttpRequest at 'mailto:foo@bar.com' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. -CONSOLE ERROR: Access to XMLHttpRequest at 'localhost:8080/' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. -CONSOLE ERROR: Access to XMLHttpRequest at 'localhost:8080/' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. -CONSOLE ERROR: Access to XMLHttpRequest at 'tel:1234' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. -CONSOLE ERROR: Access to XMLHttpRequest at 'tel:1234' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. -CONSOLE ERROR: Access to XMLHttpRequest at 'mailto:foo@bar.com' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. -CONSOLE ERROR: Access to XMLHttpRequest at 'mailto:foo@bar.com' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. -CONSOLE ERROR: Access to XMLHttpRequest at 'localhost:8080/' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. -CONSOLE ERROR: Access to XMLHttpRequest at 'localhost:8080/' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. -CONSOLE ERROR: Access to XMLHttpRequest at 'tel:1234' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. -CONSOLE ERROR: Access to XMLHttpRequest at 'tel:1234' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. +CONSOLE ERROR: Access to XMLHttpRequest at 'mailto:foo@bar.com' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. +CONSOLE ERROR: Access to XMLHttpRequest at 'mailto:foo@bar.com' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. +CONSOLE ERROR: Access to XMLHttpRequest at 'localhost:8080/' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. +CONSOLE ERROR: Access to XMLHttpRequest at 'localhost:8080/' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. +CONSOLE ERROR: Access to XMLHttpRequest at 'tel:1234' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. +CONSOLE ERROR: Access to XMLHttpRequest at 'tel:1234' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. +CONSOLE ERROR: Access to XMLHttpRequest at 'mailto:foo@bar.com' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. +CONSOLE ERROR: Access to XMLHttpRequest at 'mailto:foo@bar.com' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. +CONSOLE ERROR: Access to XMLHttpRequest at 'localhost:8080/' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. +CONSOLE ERROR: Access to XMLHttpRequest at 'localhost:8080/' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. +CONSOLE ERROR: Access to XMLHttpRequest at 'tel:1234' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. +CONSOLE ERROR: Access to XMLHttpRequest at 'tel:1234' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. This is a testharness.js-based test. PASS sync test for url=mailto:foo@bar.com, contentType=undefined PASS sync test for url=mailto:foo@bar.com, contentType=application/json
diff --git a/third_party/blink/web_tests/platform/generic/mhtml/cid_in_html_resource-expected.txt b/third_party/blink/web_tests/platform/generic/mhtml/cid_in_html_resource-expected.txt index 9ce2af1..4813932 100644 --- a/third_party/blink/web_tests/platform/generic/mhtml/cid_in_html_resource-expected.txt +++ b/third_party/blink/web_tests/platform/generic/mhtml/cid_in_html_resource-expected.txt
@@ -1,2 +1,2 @@ -CONSOLE ERROR: Access to font at 'cid:xxxxxx' from origin '' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https. +CONSOLE ERROR: Access to font at 'cid:xxxxxx' from origin '' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-untrusted, https, isolated-app. No Content-ID url are expected outside of an MHTML document. The document should load without crashing.
diff --git a/third_party/blink/web_tests/platform/generic/paint/invalidation/svg/paintorder-filtered-expected.png b/third_party/blink/web_tests/platform/generic/paint/invalidation/svg/paintorder-filtered-expected.png index 39220495..a6c336d 100644 --- a/third_party/blink/web_tests/platform/generic/paint/invalidation/svg/paintorder-filtered-expected.png +++ b/third_party/blink/web_tests/platform/generic/paint/invalidation/svg/paintorder-filtered-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/global-interface-listing-expected.txt index d757a95..973f73a 100644 --- a/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/global-interface-listing-expected.txt +++ b/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -4040,6 +4040,37 @@ method keys method set method values +interface Highlight + attribute @@toStringTag + getter priority + getter size + getter type + method @@iterator + method add + method clear + method constructor + method delete + method entries + method forEach + method has + method keys + method values + setter priority + setter type +interface HighlightRegistry + attribute @@toStringTag + getter size + method @@iterator + method clear + method constructor + method delete + method entries + method forEach + method get + method has + method keys + method set + method values interface History attribute @@toStringTag getter length @@ -10255,6 +10286,7 @@ [NAMESPACES] namespace CSS attribute @@toStringTag + getter highlights getter paintWorklet method Hz method Q
diff --git a/third_party/blink/web_tests/platform/linux/compositing/masks/mask-with-added-filters-expected.png b/third_party/blink/web_tests/platform/linux/compositing/masks/mask-with-added-filters-expected.png index 4312fbbf..195e0ea 100644 --- a/third_party/blink/web_tests/platform/linux/compositing/masks/mask-with-added-filters-expected.png +++ b/third_party/blink/web_tests/platform/linux/compositing/masks/mask-with-added-filters-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/compositing/masks/mask-with-added-filters-expected.png b/third_party/blink/web_tests/platform/mac/compositing/masks/mask-with-added-filters-expected.png index 048c5357..44f14dbf 100644 --- a/third_party/blink/web_tests/platform/mac/compositing/masks/mask-with-added-filters-expected.png +++ b/third_party/blink/web_tests/platform/mac/compositing/masks/mask-with-added-filters-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/compositing/masks/mask-with-added-filters-expected.png b/third_party/blink/web_tests/platform/win/compositing/masks/mask-with-added-filters-expected.png index 29d002381..43d14a5 100644 --- a/third_party/blink/web_tests/platform/win/compositing/masks/mask-with-added-filters-expected.png +++ b/third_party/blink/web_tests/platform/win/compositing/masks/mask-with-added-filters-expected.png Binary files differ
diff --git a/third_party/swift-toolchain/3pp/3pp.pb b/third_party/swift-toolchain/3pp/3pp.pb index bd80ab0..b31866c3 100644 --- a/third_party/swift-toolchain/3pp/3pp.pb +++ b/third_party/swift-toolchain/3pp/3pp.pb
@@ -13,6 +13,8 @@ download_url: "https://download.swift.org/swift-5.6.2-release/xcode/swift-5.6.2-RELEASE/swift-5.6.2-RELEASE-osx.pkg" version: "5.6.2" } + # Needed to re-trigger packaging for 5.6.2. Not normally necessary. + patch_version: "cr2" } build { install: "install-mac.sh"
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index 8b1694117..aab282a 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -5472,6 +5472,17 @@ </description> </action> +<action name="ChromeOS.SystemTray.Network.SettingsButtonPressed"> + <owner>khorimoto@chromium.org</owner> + <owner>tjohnsonkanu@chromium.org</owner> + <owner>chadduffin@chromium.org</owner> + <owner>cros-connectivity@google.com</owner> + <description> + Recorded when a user clicks on the settings button in Network view within + systems tray. + </description> +</action> + <action name="ClearAuthenticationCache"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <description>Please enter the description of this user action.</description>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 43302e8..b3e184a5d 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -51184,6 +51184,7 @@ <int value="1" label="Shortcuts"/> <int value="2" label="Return to Recent Tab tile"/> <int value="3" label="Feed Card"/> + <int value="4" label="Fake Omnibox"/> </enum> <enum name="iOSCredentialIdentityStoreErrorForReporting"> @@ -56278,6 +56279,8 @@ <int value="-1557527869" label="LoadingWithMojo:disabled"/> <int value="-1556805396" label="ScreenshotsForAndroidV2:enabled"/> <int value="-1555510175" label="PasswordImport:enabled"/> + <int value="-1554921134" + label="OmniboxRemoveSuggestionHeaderChevron:disabled"/> <int value="-1553477903" label="ash-disable-text-filtering-in-overview-mode"/> <int value="-1553280810" label="PromoBrowserCommands:enabled"/> <int value="-1552898031" label="SingleTabMode:enabled"/> @@ -56714,6 +56717,8 @@ <int value="-1298273481" label="http2-grease-settings"/> <int value="-1298067767" label="CalendarModelDebugMode:disabled"/> <int value="-1297079591" label="EnableRemovingAllThirdPartyCookies:disabled"/> + <int value="-1295310553" + label="OmniboxRemoveSuggestionHeaderChevron:enabled"/> <int value="-1295288468" label="MemoriesDebug:enabled"/> <int value="-1294944922" label="Canvas2dStaysGPUOnReadback:disabled"/> <int value="-1294050129" label="ContentFullscreen:disabled"/>
diff --git a/tools/metrics/histograms/metadata/assistant/histograms.xml b/tools/metrics/histograms/metadata/assistant/histograms.xml index c5099ac4..3607c8e7 100644 --- a/tools/metrics/histograms/metadata/assistant/histograms.xml +++ b/tools/metrics/histograms/metadata/assistant/histograms.xml
@@ -226,7 +226,7 @@ </histogram> <histogram name="Assistant.VoiceSearch.AgsaVersion{Timing}" units="Version" - expires_after="2022-08-22"> + expires_after="2022-10-23"> <owner>wylieb@chromium.org</owner> <owner>fgorski@chromium.org</owner> <owner>jds@google.com</owner> @@ -251,7 +251,7 @@ </histogram> <histogram name="Assistant.VoiceSearch.UserEligibility.FailureReason{Timing}" - enum="EligibilityFailureReason" expires_after="2022-08-22"> + enum="EligibilityFailureReason" expires_after="2022-10-23"> <owner>wylieb@chromium.org</owner> <owner>fgorski@chromium.org</owner> <owner>jds@google.com</owner> @@ -272,7 +272,7 @@ </histogram> <histogram name="Assistant.VoiceSearch.UserEligibility{Timing}" - enum="BooleanEligible" expires_after="2022-08-22"> + enum="BooleanEligible" expires_after="2022-10-23"> <owner>wylieb@chromium.org</owner> <owner>fgorski@chromium.org</owner> <owner>jds@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/chromeos/histograms.xml b/tools/metrics/histograms/metadata/chromeos/histograms.xml index 0ff3e16..85d4b8b 100644 --- a/tools/metrics/histograms/metadata/chromeos/histograms.xml +++ b/tools/metrics/histograms/metadata/chromeos/histograms.xml
@@ -1699,6 +1699,23 @@ </summary> </histogram> +<histogram name="ChromeOS.SystemTray.Network.{NetworkType}.Toggled" + enum="BooleanToggled" expires_after="2023-06-20"> + <owner>khorimoto@chromium.org</owner> + <owner>tjohnsonkanu@chromium.org</owner> + <owner>chadduffin@chromium.org</owner> + <owner>cros-connectivity@google.com</owner> + <summary> + Records the new value of the WiFi/Mobile toggle button in system tray. + Metric emitted each time a user clicks on the enable/disable WiFi or Mobile + toggle. + </summary> + <token key="NetworkType"> + <variant name="Mobile"/> + <variant name="WiFi"/> + </token> +</histogram> + <histogram name="ChromeOS.SystemTray.NotificationsRemovedByClearAll" units="notifications" expires_after="2023-04-01"> <owner>amehfooz@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/history/histograms.xml b/tools/metrics/histograms/metadata/history/histograms.xml index f223eab..f459816 100644 --- a/tools/metrics/histograms/metadata/history/histograms.xml +++ b/tools/metrics/histograms/metadata/history/histograms.xml
@@ -535,6 +535,8 @@ <variant name="LinksOpened" summary="links opened"/> <variant name="RelatedSearchesClicked" summary="related search links opened"/> + <variant name="TogglesToBasicHistory" + summary="Tggles to from basic history UI"/> <variant name="VisibilityToggles" summary="Journeys UI toggles on/off"/> </token> </histogram>
diff --git a/tools/metrics/histograms/metadata/ios/histograms.xml b/tools/metrics/histograms/metadata/ios/histograms.xml index 7eb522af..1d62b008 100644 --- a/tools/metrics/histograms/metadata/ios/histograms.xml +++ b/tools/metrics/histograms/metadata/ios/histograms.xml
@@ -32,6 +32,16 @@ </summary> </histogram> +<histogram name="IOS.AppLauncher.AppURLHasChromeLaunchScheme" enum="Boolean" + expires_after="2023-07-04"> + <owner>ajuma@chromium.org</owner> + <owner>bling-fundamentals@google.com</owner> + <summary> + This histogram counts the frequency of app launch attempts where the target + app is Chrome itself. This logged once per app launch attempt. + </summary> +</histogram> + <histogram name="IOS.BackgroundTimeBeforeColdStart" units="minutes" expires_after="2023-04-27"> <owner>thegreenfrog@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/payment/histograms.xml b/tools/metrics/histograms/metadata/payment/histograms.xml index b09620d..027e0e6 100644 --- a/tools/metrics/histograms/metadata/payment/histograms.xml +++ b/tools/metrics/histograms/metadata/payment/histograms.xml
@@ -184,6 +184,16 @@ </summary> </histogram> +<histogram name="PaymentRequest.NumberOfSupportedMethods.AndroidApp" + units="methods" expires_after="2023-07-14"> + <owner>rouslan@chromium.org</owner> + <owner>web-payments-team@google.com</owner> + <summary> + The number of payment methods that an installed Android payment app declares + to support. Recorded when a website creates a new PaymentRequest JS object. + </summary> +</histogram> + <histogram name="PaymentRequest.PaymentHandlerInstallSuccess" enum="BooleanSuccess" expires_after="2023-01-01"> <owner>rouslan@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/printing/histograms.xml b/tools/metrics/histograms/metadata/printing/histograms.xml index 436b0d1..3a19ec6 100644 --- a/tools/metrics/histograms/metadata/printing/histograms.xml +++ b/tools/metrics/histograms/metadata/printing/histograms.xml
@@ -83,7 +83,7 @@ </histogram> <histogram name="Printing.CUPS.AddressResolutionResult" enum="BooleanSuccess" - expires_after="2022-08-07"> + expires_after="2023-02-07"> <owner>bmgordon@chromium.org</owner> <owner>cros-printing-dev@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/security/histograms.xml b/tools/metrics/histograms/metadata/security/histograms.xml index ed1c5c1b..566ebc6e 100644 --- a/tools/metrics/histograms/metadata/security/histograms.xml +++ b/tools/metrics/histograms/metadata/security/histograms.xml
@@ -498,6 +498,17 @@ </summary> </histogram> +<histogram name="Security.SCTAuditing.OptOut.DroppedDueToLogNotFound" + enum="Boolean" expires_after="2022-11-27"> + <owner>cthomp@chromium.org</owner> + <owner>trusty-transport@chromium.org</owner> + <summary> + Records whether a hashdance report was dropped due to not finding the log + metadata for the selected SCT. Recorded once when creating a new auditing + report, but before the report is sampled or deduplicated. + </summary> +</histogram> + <histogram name="Security.SCTAuditing.OptOut.LookupQueryResult" enum="SCTLookupQueryResult" expires_after="2022-12-04"> <owner>cthomp@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/web_apk/histograms.xml b/tools/metrics/histograms/metadata/web_apk/histograms.xml index 51298df..d1bf736f 100644 --- a/tools/metrics/histograms/metadata/web_apk/histograms.xml +++ b/tools/metrics/histograms/metadata/web_apk/histograms.xml
@@ -22,6 +22,11 @@ <histograms> +<variants name="LegacyIdentifierType"> + <variant name="ManifestUrl"/> + <variant name="StartUrl"/> +</variants> + <variants name="WebApkDistributorType"> <variant name=".Browser" summary="Installed by Chrome"/> <variant name=".DevicePolicy" summary="Installed by device policy"/> @@ -357,6 +362,53 @@ </summary> </histogram> +<histogram name="WebApk.Update.UniqueIdDifferent.{LegacyIdentifierType}" + enum="Boolean" expires_after="2023-06-30"> + <owner>eirage@chromium.org</owner> + <owner>hartmanng@chromium.org</owner> + <owner> + src/chrome/android/java/src/org/chromium/chrome/browser/webapps/OWNERS + </owner> + <summary> + When WebApkUpdateDataFetcher found a valid manifest that contains a + different id than the installed WebAPK, record whether each of the + {LegacyIdentifierType} was the same. + </summary> + <token key="LegacyIdentifierType" variants="LegacyIdentifierType"/> +</histogram> + +<histogram name="WebApk.Update.UniqueId{SameOrEmpty}.{LegacyIdentifierType}" + enum="Boolean" expires_after="2023-06-30"> + <owner>eirage@chromium.org</owner> + <owner>hartmanng@chromium.org</owner> + <owner> + src/chrome/android/java/src/org/chromium/chrome/browser/webapps/OWNERS + </owner> + <summary> + When WebAPK updates with empty or same UniqueId, record whether each of the + {LegacyIdentifierType} was the same. + </summary> + <token key="SameOrEmpty"> + <variant name="Empty"/> + <variant name="Same"/> + </token> + <token key="LegacyIdentifierType" variants="LegacyIdentifierType"/> +</histogram> + +<histogram name="WebApk.Update.UpdateEmptyUniqueId.NeedsUpgrade" enum="Boolean" + expires_after="2023-06-30"> + <owner>eirage@chromium.org</owner> + <owner>hartmanng@chromium.org</owner> + <owner> + src/chrome/android/java/src/org/chromium/chrome/browser/webapps/OWNERS + </owner> + <summary> + For WebAPK unique ID migration, record whether an update is neede (with + non-empty update reason). This only records for the first legacy update that + updates the WebAPK from an empty id. + </summary> +</histogram> + <histogram name="WebApk.WebApkService.BindSuccess" enum="BooleanSuccess" expires_after="2023-06-01"> <owner>hartmanng@chromium.org</owner>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index 755b0571..fdad2de9 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -13,16 +13,16 @@ "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux_arm/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell" }, "mac": { - "hash": "37958969ab00730d190579d5956ee1b792c92ec6", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/4a7522f01b43ac3bac8561926e55d7500a55afa2/trace_processor_shell" + "hash": "7ff4aef023c37c64002efbab79fab067d42371fe", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/16075d13d01a9078bb4ca7de52c489b01dae4677/trace_processor_shell" }, "mac_arm64": { "hash": "e1ad4861384b06d911a65f035317914b8cc975c6", "full_remote_path": "perfetto-luci-artifacts/v25.0/mac-arm64/trace_processor_shell" }, "linux": { - "hash": "fc47f3885eb8733d6c699122b36e105002be939b", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/16075d13d01a9078bb4ca7de52c489b01dae4677/trace_processor_shell" + "hash": "34b83707b616994e8d863cfad55bc2e619385025", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/9277dbf0aab13088323e637449d702bebdc3fc15/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml index 5b80247..279a4b5e 100644 --- a/tools/traffic_annotation/summary/annotations.xml +++ b/tools/traffic_annotation/summary/annotations.xml
@@ -351,7 +351,7 @@ <item id="fast_pair_device_metadata_fetcher" added_in_milestone="100" content_hash_code="0655adc6" os_list="chromeos" file_path="ash/quick_pair/repository/fast_pair/device_metadata_fetcher.cc" /> <item id="wallpaper_google_photos_photos" added_in_milestone="100" content_hash_code="00c76007" os_list="chromeos" file_path="chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.cc" /> <item id="webview_proxy_config" added_in_milestone="100" content_hash_code="009d2396" os_list="android" file_path="android_webview/browser/network_service/aw_proxy_config_monitor.cc" /> - <item id="device_trust_key_rotation" added_in_milestone="100" content_hash_code="05cc1b9b" os_list="linux" file_path="chrome/browser/enterprise/connectors/device_trust/key_management/core/network/linux_key_network_delegate.cc" /> + <item id="device_trust_key_rotation" added_in_milestone="100" content_hash_code="05cc1b9b" os_list="linux" file_path="chrome/browser/enterprise/connectors/device_trust/key_management/core/network/mojo_key_network_delegate.cc" /> <item id="sct_auditing_hashdance" added_in_milestone="100" content_hash_code="00ea07d2" os_list="linux,windows,android,chromeos" file_path="chrome/browser/ssl/sct_reporting_service.cc" /> <item id="pull_template_request" added_in_milestone="101" content_hash_code="06335b4a" os_list="android" file_path="components/content_creation/notes/core/templates/template_fetcher.cc" /> <item id="webapk_create_for_service" added_in_milestone="101" content_hash_code="00107cfb" os_list="android" file_path="chrome/browser/android/webapk/webapk_installer.cc" />
diff --git a/ui/accessibility/extensions/strings/accessibility_extensions_strings_mr.xtb b/ui/accessibility/extensions/strings/accessibility_extensions_strings_mr.xtb index 2e50e60..7e86419a 100644 --- a/ui/accessibility/extensions/strings/accessibility_extensions_strings_mr.xtb +++ b/ui/accessibility/extensions/strings/accessibility_extensions_strings_mr.xtb
@@ -19,7 +19,7 @@ <translation id="2648340354586434750">शब्दांनुसार हलविण्यासाठी <span class='key'>पर्याय</span> धरून ठेवा.</translation> <translation id="2795227192542594043">हा विस्तार तुम्हाला कीबोर्डसह मजकूर निवडण्याची अनुमती देणारा, वेबपेजमधील हलणारा कर्सर देतो.</translation> <translation id="2808027189040546825">पायरी 1: सर्वाधिक अंधुक तारे असलेली पंक्ती निवडा:</translation> -<translation id="2965611304828530558"><p>तुम्ही दुव्यावर किंवा नियंत्रणावर पोहचता तेव्हा, ते आपोआप फोकस केले जाते. दुवा किंवा बटण क्लिक करण्यासाठी <span class='key'>Enter</span> दाबा. </p> <p> फोकस केलेले नियंत्रण (जसे की, मजकूर बॉक्स किंवा सूची बॉक्स) बाण की, कॅप्चर करतात तेव्हा, कॅरेट ब्राउझिंग करणे सुरू ठेवण्यासाठी <span class='key'>Esc</span> त्यानंतर डावा किंवा उजवा बाण दाबा. </p> <p> वैकल्पिकपणे, पुढील फोकस करण्यायोग्य नियंत्रणावर हलविण्यासाठी <span class='key'>Tab</span> दाबा. </p></translation> +<translation id="2965611304828530558"><p>तुम्ही लिंकवर किंवा नियंत्रणावर पोहचता तेव्हा, ते आपोआप फोकस केले जाते. लिंक किंवा बटण क्लिक करण्यासाठी <span class='key'>Enter</span> दाबा. </p> <p> फोकस केलेले नियंत्रण (जसे की, मजकूर बॉक्स किंवा सूची बॉक्स) बाण की, कॅप्चर करतात तेव्हा, कॅरेट ब्राउझिंग करणे सुरू ठेवण्यासाठी <span class='key'>Esc</span> त्यानंतर डावा किंवा उजवा बाण दाबा. </p> <p> वैकल्पिकपणे, पुढील फोकस करण्यायोग्य नियंत्रणावर हलविण्यासाठी <span class='key'>Tab</span> दाबा. </p></translation> <translation id="3252573918265662711">सेटअप</translation> <translation id="3410969471888629217">साइट सानुकूलने विसरा</translation> <translation id="3435896845095436175">सुरू करा</translation>
diff --git a/ui/android/java/src/org/chromium/ui/base/Clipboard.java b/ui/android/java/src/org/chromium/ui/base/Clipboard.java index 5419b01..cc34522d 100644 --- a/ui/android/java/src/org/chromium/ui/base/Clipboard.java +++ b/ui/android/java/src/org/chromium/ui/base/Clipboard.java
@@ -99,6 +99,18 @@ } /** + * Resets the clipboard instance for testing. + * + * Particularly relevant for robolectric tests where the application context is not shared + * across test runs and the Clipboard instance would hold onto an older no longer used + * application context instance. + */ + @VisibleForTesting + public static void resetForTesting() { + sInstance = null; + } + + /** * Emulates the behavior of the now-deprecated * {@link android.text.ClipboardManager#getText()} by invoking * {@link android.content.ClipData.Item#coerceToText(Context)} on the first
diff --git a/ui/android/java/strings/translations/android_ui_strings_am.xtb b/ui/android/java/strings/translations/android_ui_strings_am.xtb index c2a9db4a..6547734 100644 --- a/ui/android/java/strings/translations/android_ui_strings_am.xtb +++ b/ui/android/java/strings/translations/android_ui_strings_am.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="am"> +<translation id="2405260961377511836">ፎቶ መምረጫውን መክፈት አልተቻለም</translation> <translation id="3240426699337459095">አገናኝ ተቀድቷል</translation> <translation id="6315516427814392808">በአነስተኛ ማህደረ ትውስታ ምክንያት ቀዳሚውን ክወና ማጠናቀቅ አልተቻለም</translation> <translation id="6555463879959038093">ወደ ቅንጥብ ሰሌዳው መቅዳት አልተሳካም</translation>
diff --git a/ui/android/java/strings/translations/android_ui_strings_fr-CA.xtb b/ui/android/java/strings/translations/android_ui_strings_fr-CA.xtb index d9550c9..6c983cf 100644 --- a/ui/android/java/strings/translations/android_ui_strings_fr-CA.xtb +++ b/ui/android/java/strings/translations/android_ui_strings_fr-CA.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="fr-CA"> +<translation id="2405260961377511836">Sélecteur de photos indisponible</translation> <translation id="3240426699337459095">Lien copié</translation> <translation id="6315516427814392808">Impossible de terminer l'opération précédente en raison d'un manque de mémoire</translation> <translation id="6555463879959038093">Échec de la copie du contenu dans le presse-papiers</translation>
diff --git a/ui/android/java/strings/translations/android_ui_strings_lo.xtb b/ui/android/java/strings/translations/android_ui_strings_lo.xtb index 2cba909..74fa220 100644 --- a/ui/android/java/strings/translations/android_ui_strings_lo.xtb +++ b/ui/android/java/strings/translations/android_ui_strings_lo.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="lo"> +<translation id="2405260961377511836">ບໍ່ສາມາດເປີດນຳໃຊ້ຕົວເລືອກຮູບພາບໄດ້</translation> <translation id="3240426699337459095">ອັດສຳເນົາລິ້ງແລ້ວ</translation> <translation id="6315516427814392808">ບໍ່ສາມາດດໍາເນີນງານຜ່ານມາໄດ້ສໍາເລັດເນື່ອງມາຈາກຄວາມຈໍາຕໍ່າ</translation> <translation id="6555463879959038093">ກັອບປີ້ໄປໃສ່ຄລິບບອດບໍ່ສໍາເລັດ</translation>
diff --git a/ui/aura/screen_ozone.cc b/ui/aura/screen_ozone.cc index a78a6a4..008e95e 100644 --- a/ui/aura/screen_ozone.cc +++ b/ui/aura/screen_ozone.cc
@@ -133,7 +133,7 @@ return platform_screen_->GetCurrentWorkspace(); } -std::vector<base::Value> ScreenOzone::GetGpuExtraInfo( +base::Value::List ScreenOzone::GetGpuExtraInfo( const gfx::GpuExtraInfo& gpu_extra_info) { return platform_screen_->GetGpuExtraInfo(gpu_extra_info); }
diff --git a/ui/aura/screen_ozone.h b/ui/aura/screen_ozone.h index 2970a0e..72d4fa1 100644 --- a/ui/aura/screen_ozone.h +++ b/ui/aura/screen_ozone.h
@@ -8,6 +8,7 @@ #include <memory> #include <vector> +#include "base/values.h" #include "build/chromeos_buildflags.h" #include "ui/aura/aura_export.h" #include "ui/display/screen.h" @@ -53,7 +54,7 @@ void AddObserver(display::DisplayObserver* observer) override; void RemoveObserver(display::DisplayObserver* observer) override; std::string GetCurrentWorkspace() override; - std::vector<base::Value> GetGpuExtraInfo( + base::Value::List GetGpuExtraInfo( const gfx::GpuExtraInfo& gpu_extra_info) override; // Returns the NativeWindow associated with the AcceleratedWidget.
diff --git a/ui/base/linux/linux_desktop.cc b/ui/base/linux/linux_desktop.cc index 6721512..18dae59 100644 --- a/ui/base/linux/linux_desktop.cc +++ b/ui/base/linux/linux_desktop.cc
@@ -14,21 +14,21 @@ namespace ui { -std::vector<base::Value> GetDesktopEnvironmentInfo() { - std::vector<base::Value> result; +base::Value::List GetDesktopEnvironmentInfo() { + base::Value::List result; auto env(base::Environment::Create()); std::string value; if (env->GetVar(base::nix::kXdgCurrentDesktopEnvVar, &value)) { - result.push_back( + result.Append( display::BuildGpuInfoEntry(base::nix::kXdgCurrentDesktopEnvVar, value)); } if (env->GetVar(base::nix::kXdgSessionTypeEnvVar, &value)) { - result.push_back( + result.Append( display::BuildGpuInfoEntry(base::nix::kXdgSessionTypeEnvVar, value)); } constexpr char kGDMSession[] = "GDMSESSION"; if (env->GetVar(kGDMSession, &value)) - result.push_back(display::BuildGpuInfoEntry(kGDMSession, value)); + result.Append(display::BuildGpuInfoEntry(kGDMSession, value)); return result; }
diff --git a/ui/base/linux/linux_desktop.h b/ui/base/linux/linux_desktop.h index c4dd042c..ea92700 100644 --- a/ui/base/linux/linux_desktop.h +++ b/ui/base/linux/linux_desktop.h
@@ -5,15 +5,13 @@ #ifndef UI_BASE_LINUX_LINUX_DESKTOP_H_ #define UI_BASE_LINUX_LINUX_DESKTOP_H_ -#include <vector> - #include "base/component_export.h" #include "base/values.h" namespace ui { // Returns desktop environment info as list of values. -COMPONENT_EXPORT(UI_BASE) std::vector<base::Value> GetDesktopEnvironmentInfo(); +COMPONENT_EXPORT(UI_BASE) base::Value::List GetDesktopEnvironmentInfo(); } // namespace ui
diff --git a/ui/chromeos/translations/ui_chromeos_strings_af.xtb b/ui/chromeos/translations/ui_chromeos_strings_af.xtb index 10049765..6b1eec1cf 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_af.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_af.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Laai mobiele profiel af, netwerk <ph name="NETWORK_INDEX" /> van <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Engels (VK)</translation> <translation id="3975895378829046965">Bangla-foneties</translation> -<translation id="3991446849494482687">Dit sal ook die SIM-slotinstelling op die toestel deaktiveer.</translation> <translation id="4002066346123236978">Titel</translation> <translation id="4017788180641807848">Engels (VSA) met Workman-sleutelbord</translation> <translation id="4040753847560036377">Verkeerde PUK</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_am.xtb b/ui/chromeos/translations/ui_chromeos_strings_am.xtb index 8c7f5f2..912fdb3 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_am.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_am.xtb
@@ -193,6 +193,7 @@ <translation id="2621713457727696555">ደህንነቱ ተጠብቋል</translation> <translation id="2638942478653899953">Google Drive ሊደረስበት አልተቻለም። እባክዎ <ph name="BEGIN_LINK" />ዘግተው ይውጡ<ph name="END_LINK" />ና ተመልሰው ይግቡ።</translation> <translation id="2649120831653069427">የቀስተዳመና አሳ</translation> +<translation id="2653059201992392941"><ph name="RETRIES" /> ቀሪ ሙከራዎች አሉዎት።</translation> <translation id="2663066752008346276">በርማኛ/ሚያንማር በሚያንሳን ቁልፍ ሰሌዳ</translation> <translation id="2664412712123763093">የፋይል ቦታ</translation> <translation id="2718540689505416944">መተግበሪያ በLinux ጫን</translation> @@ -341,7 +342,6 @@ <translation id="3971140002794351170">የሞባይል መገለጫን ያውርዱ፣ አውታረ መረብ <ph name="NETWORK_INDEX" /> ከ<ph name="NETWORK_COUNT" />፣ <ph name="NETWORK_NAME" />፣ <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">እንግሊዝኛ (ዩኬ)</translation> <translation id="3975895378829046965">ባንግላ ፎነቲክ</translation> -<translation id="3991446849494482687">እንዲሁም ይህ በመሣሪያው ላይ ያለውን የሲም መቆለፊያ ቅንብርን ያሰናክላል።</translation> <translation id="4002066346123236978">ርዕስ</translation> <translation id="4017788180641807848">እንግሊዝኛ (አሜሪካ) ከዎርክማን ቁልፍ ሰሌዳ ጋር</translation> <translation id="4040753847560036377">ትክክል ያልኾነ PUK</translation> @@ -528,6 +528,7 @@ <translation id="5489067830765222292">ላትቪያኛ</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> ማጣሪያ ጠፍቷል።</translation> <translation id="5494920125229734069">ሁሉንም ይመርጣል</translation> +<translation id="5500104704744051184">PUKውን እስካላስገቡ ድረስ ይህን አውታረ መረብ ሊጠቀሙበት አይችሉም</translation> <translation id="5500122897333236901">አይስላንድኛ</translation> <translation id="5508696409934741614">ነጥቦች</translation> <translation id="5522908512596376669">የፋይል ዝርዝር ወደ ዝርዝር ዕይታ ተለውጧል።</translation> @@ -633,6 +634,7 @@ <translation id="6395575651121294044"><ph name="NUMBER_OF_FILES" /> ንጥሎች</translation> <translation id="642282551015776456">ይህ ስም የፋይል ወይም አቃፊ ስም ሆኖ ሊያገለግል አይችልም።</translation> <translation id="6423031066725912715">ቪዬትናምኛ በTCVN ቁልፍ ሰሌዳ</translation> +<translation id="6430271654280079150">1 ቀሪ ሙከራ አለዎት።</translation> <translation id="6485131920355264772">የቦታ መረጃን ማምጣት አልተቻለም</translation> <translation id="6495925982925244349">አውታረ መረብ <ph name="NETWORK_INDEX" /> ከ<ph name="NETWORK_COUNT" />፣ <ph name="NETWORK_NAME" />፣ <ph name="SECURITY_STATUS" />፣ <ph name="CONNECTION_STATUS" />፣ የሲግናል ጥንካሬ <ph name="SIGNAL_STRENGTH" />%፣ በእርስዎ አስተዳዳሪ የሚተዳደር፣ ዝርዝሮች</translation> <translation id="649877868557234318"><ph name="FILE_NAME" />ን ወደ <ph name="FOLDER_NAME" /> በማውጣት ላይ</translation> @@ -899,6 +901,7 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> ንጥሎችን በማመሳሰል ላይ...</translation> <translation id="8600173386174225982">የፋይል ዝርዝር ወደ ድንክየ ዕይታ ተለውጧል።</translation> <translation id="8601932370724196034">የCrostini ምስል ፋይል</translation> +<translation id="8608515571837163082">የተሳሳተ ፒን ከልክ በላይ ብዙ ጊዜ ገብቷል። በአገልግሎት አቅራቢው የቀረበውን ባለ 8-አሃዝ የግል እገዳውን ማንሻ ቁልፍ (PUK) ያስገቡ።</translation> <translation id="8609695766746872526">አይስላንድኛ</translation> <translation id="863903787380594467">የተሳሳተ ፒን። እርስዎ <ph name="RETRIES" /> ቀሪ ሙከራዎች አሉዎት።</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - ወደብ</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb index 92f1ca58..0d0fd2a7 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
@@ -341,7 +341,6 @@ <translation id="3971140002794351170">تنزيل الملف الشخصي لشريحة eSIM على الجهاز الجوّال، الشبكة رقم <ph name="NETWORK_INDEX" /> من أصل <ph name="NETWORK_COUNT" />، <ph name="NETWORK_NAME" />، <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">الإنجليزية (المملكة المتحدة)</translation> <translation id="3975895378829046965">البنغالية الصوتية</translation> -<translation id="3991446849494482687">سيؤدي هذا الإجراء أيضًا إلى إيقاف إعداد "قفل شريحة SIM" على الجهاز.</translation> <translation id="4002066346123236978">العنوان</translation> <translation id="4017788180641807848">الإنجليزية (الولايات المتحدة) باستخدام لوحة مفاتيح Workman</translation> <translation id="4040753847560036377">رمز PUK غير صحيح.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_as.xtb b/ui/chromeos/translations/ui_chromeos_strings_as.xtb index e018bde1..0ab11628 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_as.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_as.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">ম’বাইলৰ প্ৰ’ফাইল ডাউনল’ড কৰক, <ph name="NETWORK_COUNT" /> টা নেটৱৰ্কৰ <ph name="NETWORK_INDEX" /> নম্বৰৰটো, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">ইংৰাজী (যুক্তৰাজ্য)</translation> <translation id="3975895378829046965">বাংলা ফ’নেটিক</translation> -<translation id="3991446849494482687">এইটোৱে ডিভাইচটোত ছিম লকৰ ছেটিঙো অক্ষম কৰিব।</translation> <translation id="4002066346123236978">শিৰোনাম</translation> <translation id="4017788180641807848">Workman কীব’ৰ্ডৰ সৈতে ইংৰাজী (যুক্তৰাষ্ট্ৰ)</translation> <translation id="4040753847560036377">ভুল PUK</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_az.xtb b/ui/chromeos/translations/ui_chromeos_strings_az.xtb index 4e40728c..fbb0c00 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_az.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_az.xtb
@@ -345,7 +345,6 @@ <translation id="3971140002794351170">Mobil profili endirin, Şəbəkə <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">İngilis (BK)</translation> <translation id="3975895378829046965">Banqla Fonetikası</translation> -<translation id="3991446849494482687">Bu, həmçinin cihazda SİM Kilidi ayarını deaktiv edəcək.</translation> <translation id="4002066346123236978">Başlıq</translation> <translation id="4017788180641807848">Workman klaviaturası ilə İngilis dili (ABŞ)</translation> <translation id="4040753847560036377">Yanlış PUK</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_be.xtb b/ui/chromeos/translations/ui_chromeos_strings_be.xtb index e68e66a5..e112450b 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_be.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_be.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Спампаваць мабільны профіль, сетка <ph name="NETWORK_INDEX" /> з <ph name="NETWORK_COUNT" />, "<ph name="NETWORK_NAME" />", <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Англійская (Вялікабрытанія)</translation> <translation id="3975895378829046965">Бенгальская (фанетычная раскладка)</translation> -<translation id="3991446849494482687">Гэта дзеянне адключыць блакіроўку SIM-карты на прыладзе.</translation> <translation id="4002066346123236978">Назва</translation> <translation id="4017788180641807848">Англійская (ЗША) з раскладкай Workman</translation> <translation id="4040753847560036377">Няправільны PUK-код</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_bg.xtb b/ui/chromeos/translations/ui_chromeos_strings_bg.xtb index c6f6325c..6a4d65f 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_bg.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_bg.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Изтегляне на мобилния потребителски профил, мрежа <ph name="NETWORK_INDEX" /> от <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Английски (ОК)</translation> <translation id="3975895378829046965">Бенгалски (фонетична клавиатура)</translation> -<translation id="3991446849494482687">Това действие ще деактивира и настройката на устройството за заключване на SIM картата.</translation> <translation id="4002066346123236978">Заглавие</translation> <translation id="4017788180641807848">Английски (САЩ) с клавиатура „Уъркман“</translation> <translation id="4040753847560036377">Неправилен PUK код</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_bn.xtb b/ui/chromeos/translations/ui_chromeos_strings_bn.xtb index b33d9cf0..bc9e6b4 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_bn.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_bn.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">মোবাইল প্রোফাইল ডাউনলোড করুন, <ph name="NETWORK_COUNT" />টির মধ্যে <ph name="NETWORK_INDEX" /> নম্বর নেটওয়ার্ক, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">ইংরেজি (যুক্তরাজ্য)</translation> <translation id="3975895378829046965">বাংলা ফোনেটিক</translation> -<translation id="3991446849494482687">এর ফলে, ডিভাইসের সিম লক সেটিং বন্ধ হয়ে যাবে।</translation> <translation id="4002066346123236978">শিরোনাম</translation> <translation id="4017788180641807848">ইংরেজি (মার্কিন যুক্তরাষ্ট্র) ওয়ার্কম্যান কীবোর্ড</translation> <translation id="4040753847560036377">ভুল PUK দিয়েছেন</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_bs.xtb b/ui/chromeos/translations/ui_chromeos_strings_bs.xtb index 53cd93de..74284752 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_bs.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_bs.xtb
@@ -138,7 +138,7 @@ <translation id="2148716181193084225">Danas</translation> <translation id="2163152940313951844">Nevažeći znak: <ph name="CHARACTER_NAME" /></translation> <translation id="2184934335987813305">portugalski s međunarodnom SAD tastaturom za PC</translation> -<translation id="2193661397560634290">Iskorišteno: <ph name="SPACE_USED" /></translation> +<translation id="2193661397560634290">Iskorišteno <ph name="SPACE_USED" /></translation> <translation id="2198315389084035571">Pojednostavljeni kineski</translation> <translation id="22085916256174561">korejski</translation> <translation id="2208919847696382164">Instaliraj s Linuxom</translation> @@ -202,7 +202,7 @@ <translation id="2724954091494693138">turski s tastaturom F</translation> <translation id="2732839045120506979">vijetnamski VNI</translation> <translation id="2735623501230989521">Odobrite da Parallels Desktop pristupa fajlovima u folderu <ph name="FOLDER_NAME" /></translation> -<translation id="2764206540577097904">Iskoristili ste svu svoju privatnu pohranu na Google Workspaceu.</translation> +<translation id="2764206540577097904">Iskoristili ste svu individualnu pohranu Google Workspacea.</translation> <translation id="2771816809568414714">Sir</translation> <translation id="2781645665747935084">belgijska</translation> <translation id="2782104745158847185">Greška prilikom instalacije Linux aplikacije</translation> @@ -223,7 +223,7 @@ <translation id="2943503720238418293">Koristite kraći naziv</translation> <translation id="2949781154072577687">Formatiranje diska <ph name="DRIVE_NAME" />...</translation> <translation id="2951236788251446349">Meduza</translation> -<translation id="2958458230122209142">Preostalo je malo pohrane, još <ph name="REMAINING_PERCENTAGE" />% od ukupno <ph name="TOTAL_SPACE" /> u vašoj privatnoj pohrani.</translation> +<translation id="2958458230122209142">Malo prostora za pohranu. Preostalo je <ph name="REMAINING_PERCENTAGE" />% od <ph name="TOTAL_SPACE" /> individualne pohrane.</translation> <translation id="2977940621473452797">Ovaj fajl je dizajniran za računar koji koristi Macintosh softver. Sadržaj nije kompatibilan s vašim uređajem koji koristi ChromeOS. Pretražite Chrome Web trgovinu da pronađete odgovarajuću zamjensku aplikaciju.</translation> <translation id="2984337792991268709">Danas u <ph name="TODAY_DAYTIME" /></translation> <translation id="2994320653639462337">Vraćanje sljedećeg broja stavki: <ph name="COUNT" />…</translation> @@ -345,7 +345,6 @@ <translation id="3971140002794351170">Preuzimanje profila mobilnog uređaja, mreža <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">engleski (UK)</translation> <translation id="3975895378829046965">bengalski fonetski</translation> -<translation id="3991446849494482687">Ovim se također onemogućuje postavka zaključavanja SIM-a na uređaju.</translation> <translation id="4002066346123236978">Naslov</translation> <translation id="4017788180641807848">engleski (SAD) s Workman tastaturom</translation> <translation id="4040753847560036377">Pogrešan PUK</translation> @@ -673,7 +672,7 @@ <translation id="6823166707458800069">Za sve fajlove koje sačuvate u ovom folderu se automatski kreira sigurnosna kopija na mreži.</translation> <translation id="6825883775269213504">ruski</translation> <translation id="6847101934483209767">Stavka <ph name="ENTRY_NAME" /> je uklonjena iz odabira.</translation> -<translation id="6848194403851638089">Organizacija <ph name="ORGANIZATION_NAME" /> iskoristila je svu svoju pohranu na Google Workspaceu.</translation> +<translation id="6848194403851638089">Organizacija <ph name="ORGANIZATION_NAME" /> je iskoristila svu individualnu pohranu Google Workspacea.</translation> <translation id="6856459657722366306">Mreža <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, <ph name="CONNECTION_STATUS" />, jačina signala <ph name="SIGNAL_STRENGTH" />%, detalji</translation> <translation id="6861394552169064235">perzijski</translation> <translation id="6862635236584086457">Za sve datoteke spremljene u ovoj mapi automatski se izrađuje sigurnosna kopija na mreži</translation> @@ -705,7 +704,7 @@ <translation id="6989942356279143254">švedski</translation> <translation id="6990081529015358884">Nestalo vam je prostora</translation> <translation id="6998711733709403587">Broj odabranih foldera: <ph name="SELCTED_FOLDERS_COUNT" /></translation> -<translation id="7008426324576352165">Vaša organizacija treba imati više pohrane da bi se prijenos dovršio.</translation> +<translation id="7008426324576352165">Vašoj organizaciji treba više pohrane da dovrši otpremanje.</translation> <translation id="7012943028104619157"><ph name="ROOT_TITLE" /> (<ph name="ROOT_SUMMARY" />)</translation> <translation id="7014174261166285193">Instalacija nije uspjela:</translation> <translation id="7031639531908619281">turski</translation> @@ -939,7 +938,7 @@ <translation id="8919081441417203123">danski</translation> <translation id="8965697826696209160">Nema dovoljno prostora.</translation> <translation id="8997962250644902079">kineski (tradicionalni) pinyin</translation> -<translation id="8998871447376656508">Nema dovoljno slobodnog prostora na Google disku da biste dovršili prijenos.</translation> +<translation id="8998871447376656508">Na vašem Google Disku nema dovoljno prostora da se dovrši otpremanje.</translation> <translation id="9003940392834790328">Mreža <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, jačina signala <ph name="SIGNAL_STRENGTH" />%, upravlja vaš administrator, detalji</translation> <translation id="9017798300203431059">Ruska fonetska</translation> <translation id="9034924485347205037">Linux fajlovi</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ca.xtb b/ui/chromeos/translations/ui_chromeos_strings_ca.xtb index 87fc2a8f..6b76ea4 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ca.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ca.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Baixa el perfil mòbil, xarxa <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Anglès (Regne Unit)</translation> <translation id="3975895378829046965">Bengalí fonètic</translation> -<translation id="3991446849494482687">També es desactivarà al dispositiu l'opció de configuració per bloquejar la SIM.</translation> <translation id="4002066346123236978">Títol</translation> <translation id="4017788180641807848">Anglès (EUA) amb teclat Workman</translation> <translation id="4040753847560036377">El PUK no és correcte</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_cs.xtb b/ui/chromeos/translations/ui_chromeos_strings_cs.xtb index cfdcd68..1b0d608 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_cs.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_cs.xtb
@@ -345,7 +345,6 @@ <translation id="3971140002794351170">Stáhněte si mobilní profil, síť <ph name="NETWORK_INDEX" /> z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">angličtina (Velká Británie)</translation> <translation id="3975895378829046965">bengálština (fonetická)</translation> -<translation id="3991446849494482687">Tímto také v zařízení deaktivujete nastavení zámku SIM karty.</translation> <translation id="4002066346123236978">Název</translation> <translation id="4017788180641807848">angličtina (USA) s klávesnicí Workman</translation> <translation id="4040753847560036377">Nesprávný kód PUK</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_cy.xtb b/ui/chromeos/translations/ui_chromeos_strings_cy.xtb index d853892..9fc23da0 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_cy.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_cy.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Lawrlwytho proffil dyfais symudol, Rhwydwaith <ph name="NETWORK_INDEX" /> o <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Saesneg (DU)</translation> <translation id="3975895378829046965">Seinegol Bangala</translation> -<translation id="3991446849494482687">Bydd hyn hefyd yn analluogi'r gosodiad Cloi SIM ar y ddyfais.</translation> <translation id="4002066346123236978">Teitl</translation> <translation id="4017788180641807848">Saesneg (UDA) gyda bysellfwrdd Gweithiwr</translation> <translation id="4040753847560036377">PUK anghywir</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_da.xtb b/ui/chromeos/translations/ui_chromeos_strings_da.xtb index a580ec9..6cdf8932 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_da.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_da.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Download mobilprofil. Netværk <ph name="NETWORK_INDEX" /> af <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Engelsk (Storbritannien)</translation> <translation id="3975895378829046965">Bangla fonetisk</translation> -<translation id="3991446849494482687">Denne handling deaktiverer også indstillingen for SIM-lås på enheden.</translation> <translation id="4002066346123236978">Titel</translation> <translation id="4017788180641807848">Engelsk (USA) med Workman-tastatur</translation> <translation id="4040753847560036377">PUK-koden er forkert</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_de.xtb b/ui/chromeos/translations/ui_chromeos_strings_de.xtb index 293bf0d3..3ee353a6 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_de.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_de.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Mobiles Profil herunterladen, Netzwerk <ph name="NETWORK_INDEX" /> von <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Englisch (Vereinigtes Königreich)</translation> <translation id="3975895378829046965">Bengalisch (phonetisch)</translation> -<translation id="3991446849494482687">Hierdurch wird auch die Einstellung für die SIM-Sperre auf dem Gerät deaktiviert.</translation> <translation id="4002066346123236978">Titel</translation> <translation id="4017788180641807848">Englisch (USA) mit Workman-Tastatur</translation> <translation id="4040753847560036377">Falscher PUK</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_el.xtb b/ui/chromeos/translations/ui_chromeos_strings_el.xtb index f5daa149..279caff 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_el.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_el.xtb
@@ -350,7 +350,6 @@ <translation id="3971140002794351170">Λήψη προφίλ κινητού, Δίκτυο <ph name="NETWORK_INDEX" /> από <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Αγγλικά (ΗΒ)</translation> <translation id="3975895378829046965">Φωνητική εισαγωγή Βεγγαλικών</translation> -<translation id="3991446849494482687">Αυτή η ενέργεια θα απενεργοποιήσει επίσης τη ρύθμιση κλειδώματος SIM στη συσκευή.</translation> <translation id="4002066346123236978">Τίτλος</translation> <translation id="4017788180641807848">Αγγλικά (ΗΠΑ) με πληκτρολόγιο Workman</translation> <translation id="4040753847560036377">Εσφαλμένος κωδικός PUK</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb b/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb index 98b5245..d9baee0 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb
@@ -184,6 +184,7 @@ <translation id="2544853746127077729">Authentication certificate rejected by network</translation> <translation id="255937426064304553">US international</translation> <translation id="2563185590376525700">Frog</translation> +<translation id="2570012981255377263">Your recent files will appear here</translation> <translation id="2578394532502990878">Tamil phonetic</translation> <translation id="2579959351793446050">Odia</translation> <translation id="2602810353103180630">Network <ph name="NETWORK_INDEX" /> of <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, signal strength <ph name="SIGNAL_STRENGTH" />%, blocked by your administrator. Details</translation> @@ -342,7 +343,6 @@ <translation id="3971140002794351170">Download mobile profile, network <ph name="NETWORK_INDEX" /> of <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">English (UK)</translation> <translation id="3975895378829046965">Bangla phonetic</translation> -<translation id="3991446849494482687">This will also disable the SIM lock setting on the device.</translation> <translation id="4002066346123236978">Title</translation> <translation id="4017788180641807848">English (US) with Workman keyboard</translation> <translation id="4040753847560036377">Incorrect PUK</translation> @@ -545,6 +545,7 @@ <translation id="5625294776298156701">Tamil with Tamil99 keyboard</translation> <translation id="5633226425545095130">Moving this item will share it with everyone who can see the shared folder '<ph name="DESTINATION_NAME" />'.</translation> <translation id="5649768706273821470">Listen</translation> +<translation id="5665074015635552640">Your recent videos will appear here</translation> <translation id="5669691691057771421">Enter new PIN</translation> <translation id="5678784840044122290">The Linux application will be available within your Terminal and may also show an icon in your Launcher.</translation> <translation id="5686799162999241776"><ph name="BEGIN_BOLD" />Can't disconnect from an archive or virtual disk<ph name="END_BOLD" /> @@ -688,6 +689,7 @@ <ph name="FILE_COUNT" /> found</translation> <translation id="6935521024859866267">Upside Down</translation> <translation id="6943836128787782965">HTTP get failed</translation> +<translation id="6945604978460872381">Your recent documents will appear here</translation> <translation id="6949408524333579394">Serbian transliteration</translation> <translation id="6954309393500027528">Pasting this file is blocked by your administrator</translation> <translation id="6960565108681981554">Not activated. Contact your operator.</translation> @@ -734,6 +736,7 @@ <translation id="7295662345261934369">Share with others</translation> <translation id="7297443947353982503">Username/password incorrect or EAP-auth failed</translation> <translation id="7309413087278791451">German (Belgium)</translation> +<translation id="7313374447885864533">Your recent audio files will appear here</translation> <translation id="7339898014177206373">New window</translation> <translation id="7343393116438664539">Vietnamese Telex</translation> <translation id="7357762654218998920">This file type is not supported. <ph name="BEGIN_LINK_HELP" />Learn more<ph name="END_LINK_HELP" /> about opening files on Chrome OS.</translation> @@ -867,6 +870,7 @@ <translation id="8342318071240498787">A file or a directory with the same name already exists.</translation> <translation id="8372369524088641025">Bad WEP key</translation> <translation id="8372852072747894550">Greek</translation> +<translation id="8384716930968677505">Your recent images will appear here</translation> <translation id="8386903983509584791">Scan completed</translation> <translation id="8387733224523483503"><ph name="FILE_NAME" /> extracted.</translation> <translation id="8395901698320285466">Dimensions</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb b/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb index 91af54b..7418097e 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Descarga un perfil de dispositivo móvil, red <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Inglés (Reino Unido)</translation> <translation id="3975895378829046965">Bengalí (fonético)</translation> -<translation id="3991446849494482687">Esta acción también inhabilitará la configuración del bloqueo de la tarjeta SIM en el dispositivo.</translation> <translation id="4002066346123236978">Título</translation> <translation id="4017788180641807848">Inglés (EE.UU.) con teclado Workman</translation> <translation id="4040753847560036377">La PUK es incorrecta.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_es.xtb b/ui/chromeos/translations/ui_chromeos_strings_es.xtb index dea90ed8..38eabc2d 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_es.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_es.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Descargar perfil móvil, red <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Inglés (Reino Unido)</translation> <translation id="3975895378829046965">Bengalí (fonético)</translation> -<translation id="3991446849494482687">También se inhabilitará el ajuste de bloqueo de la SIM en el dispositivo.</translation> <translation id="4002066346123236978">Título</translation> <translation id="4017788180641807848">Inglés (EE. UU.) con teclado Workman</translation> <translation id="4040753847560036377">PUK incorrecto</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_et.xtb b/ui/chromeos/translations/ui_chromeos_strings_et.xtb index 97df3516..0637f43 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_et.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_et.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Mobiiliprofiili allalaadimine, võrk <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">inglise (Ühendkuningriik)</translation> <translation id="3975895378829046965">bengali, foneetiline</translation> -<translation id="3991446849494482687">Sellega keelatakse seadmes ka SIM-kaardi luku seade.</translation> <translation id="4002066346123236978">Pealkiri</translation> <translation id="4017788180641807848">inglise (USA), Workmani klaviatuuriga</translation> <translation id="4040753847560036377">Vale PUK</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_eu.xtb b/ui/chromeos/translations/ui_chromeos_strings_eu.xtb index 34d634b..46b4b264 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_eu.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_eu.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Deskargatu mugikorreko profila, <ph name="NETWORK_INDEX" /> / <ph name="NETWORK_COUNT" /> sare, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Ingelesa (Erresuma Batua)</translation> <translation id="3975895378829046965">Bengalar fonetikoa</translation> -<translation id="3991446849494482687">SIMa blokeatzeko ezarpena ere desgaituko da gailuan.</translation> <translation id="4002066346123236978">Izena</translation> <translation id="4017788180641807848">Ingelesa (AEB), Workman teklatuarekin</translation> <translation id="4040753847560036377">Okerreko PUKa</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fa.xtb b/ui/chromeos/translations/ui_chromeos_strings_fa.xtb index 5b767f4..11f9bfa 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fa.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fa.xtb
@@ -138,6 +138,7 @@ <translation id="2148716181193084225">امروز</translation> <translation id="2163152940313951844">نویسه نامعتبر: <ph name="CHARACTER_NAME" /></translation> <translation id="2184934335987813305">پرتغالی با صفحهکلید بینالمللی آمریکایی رایانه</translation> +<translation id="2193661397560634290"><ph name="SPACE_USED" /> مصرفشده</translation> <translation id="2198315389084035571">چینی ساده</translation> <translation id="22085916256174561">کرهای</translation> <translation id="2208919847696382164">نصب با Linux</translation> @@ -201,6 +202,7 @@ <translation id="2724954091494693138">ترکی با صفحهکلید F</translation> <translation id="2732839045120506979">ویتنامی (VNI)</translation> <translation id="2735623501230989521">به Parallels Desktop اجازه دهید به فایلهای پوشه <ph name="FOLDER_NAME" /> دسترسی داشته باشد</translation> +<translation id="2764206540577097904">از کل فضای ذخیرهسازی شخصی Google Workspace استفاده کردهاید.</translation> <translation id="2771816809568414714">پنیر</translation> <translation id="2781645665747935084">بلژیکی</translation> <translation id="2782104745158847185">خطا هنگام نصب برنامه Linux</translation> @@ -221,6 +223,7 @@ <translation id="2943503720238418293">از نام کوتاهتری استفاده کنید</translation> <translation id="2949781154072577687">درحال قالببندی <ph name="DRIVE_NAME" />…</translation> <translation id="2951236788251446349">عروس دریایی</translation> +<translation id="2958458230122209142">فضای ذخیرهسازی کم است، <ph name="REMAINING_PERCENTAGE" />٪ از <ph name="TOTAL_SPACE" /> فضای ذخیرهسازی شخصی شما باقی مانده است.</translation> <translation id="2977940621473452797">این فایل برای رایانهای که از نرمافزار Macintosh استفاده میکند طراحی شده است. این فایل با دستگاه شما که ChromeOS را اجرا میکند سازگار نیست. لطفاً «نتبازار Chrome» را برای یافتن برنامه جایگزین مناسب جستجو کنید.</translation> <translation id="2984337792991268709">امروز <ph name="TODAY_DAYTIME" /></translation> <translation id="2994320653639462337">درحال بازیابی <ph name="COUNT" /> مورد…</translation> @@ -342,7 +345,6 @@ <translation id="3971140002794351170">بارگیری نمایه تلفن همراه، شبکه <ph name="NETWORK_INDEX" /> از <ph name="NETWORK_COUNT" />، <ph name="NETWORK_NAME" />، <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">انگلیسی (بریتانیا)</translation> <translation id="3975895378829046965">بنگلا (آوایی)</translation> -<translation id="3991446849494482687">این کار همچنین تنظیم «قفل سیمکارت» را در دستگاه غیرفعال میکند.</translation> <translation id="4002066346123236978">عنوان</translation> <translation id="4017788180641807848">انگلیسی (آمریکایی) با صفحهکلید Workman</translation> <translation id="4040753847560036377">PUK نادرست است</translation> @@ -670,6 +672,7 @@ <translation id="6823166707458800069">از همه فایلهای ذخیرهشده در این پوشه بهطور خودکار و آنلاین پشتیبانگیری شده است.</translation> <translation id="6825883775269213504">روسی</translation> <translation id="6847101934483209767"><ph name="ENTRY_NAME" /> از موارد انتخابی برداشته شد.</translation> +<translation id="6848194403851638089"><ph name="ORGANIZATION_NAME" /> از کل فضای ذخیرهسازی Google Workspace استفاده کرده است.</translation> <translation id="6856459657722366306">شبکه <ph name="NETWORK_INDEX" /> از <ph name="NETWORK_COUNT" />، <ph name="NETWORK_NAME" />، <ph name="NETWORK_PROVIDER_NAME" />، <ph name="CONNECTION_STATUS" />، قدرت سیگنال <ph name="SIGNAL_STRENGTH" />٪، جزئیات</translation> <translation id="6861394552169064235">فارسی</translation> <translation id="6862635236584086457">از همه فایلهای ذخیره شده در این پوشه بهصورت خودکار و آنلاین نسخهٔ پشتیبان تهیه میشود</translation> @@ -701,6 +704,7 @@ <translation id="6989942356279143254">سوئدی</translation> <translation id="6990081529015358884">فضای شما تمام شده است</translation> <translation id="6998711733709403587"><ph name="SELCTED_FOLDERS_COUNT" /> پوشه انتخاب شد</translation> +<translation id="7008426324576352165">سازمانتان برای تکمیل بارگذاری به فضای ذخیرهسازی بیشتری نیاز دارد.</translation> <translation id="7012943028104619157"><ph name="ROOT_TITLE" /> (<ph name="ROOT_SUMMARY" />)</translation> <translation id="7014174261166285193">نصب انجام نشد.</translation> <translation id="7031639531908619281">ترکی</translation> @@ -934,11 +938,13 @@ <translation id="8919081441417203123">دانمارکی</translation> <translation id="8965697826696209160">فضای کافی وجود ندارد.</translation> <translation id="8997962250644902079">چینی پینیین (سنتی)</translation> +<translation id="8998871447376656508">فضای ذخیرهسازی کافی در Google Drive برای تکمیل بارگذاری وجود ندارد.</translation> <translation id="9003940392834790328">شبکه <ph name="NETWORK_INDEX" /> از <ph name="NETWORK_COUNT" />، <ph name="NETWORK_NAME" />، <ph name="CONNECTION_STATUS" />، قدرت سیگنال <ph name="SIGNAL_STRENGTH" />٪، تحتمدیریت سرپرست، جزئیات</translation> <translation id="9017798300203431059">آوایی روسیه</translation> <translation id="9034924485347205037">فایلهای Linux</translation> <translation id="9035012421917565900">این موارد نمیتوانند به «<ph name="DESTINATION_NAME" />» برگردانده شوند، بنابراین نمیتوانید این اقدام را واگرد کنید.</translation> <translation id="9035689366572880647">پین کنونی را وارد کنید</translation> +<translation id="9037777873893411148">*فضای ذخیرهسازی سازمان پر است</translation> <translation id="9038620279323455325">فایلی با نام «<ph name="FILE_NAME" />» ازقبل وجود دارد. لطفاً نام دیگری انتخاب کنید.</translation> <translation id="9046895021617826162">اتصال برقرار نشد</translation> <translation id="9065512565307033593">اگر نتوانید بهتأیید برسانید، دسترسی شما به شبکه غیرفعال خواهد شد.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fi.xtb b/ui/chromeos/translations/ui_chromeos_strings_fi.xtb index a819798..17d4edc 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fi.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fi.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Lataa mobiiliprofiili, verkko <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">englanti (Yhdistynyt kuningaskunta)</translation> <translation id="3975895378829046965">foneettinen bangla</translation> -<translation id="3991446849494482687">Tämä poistaa myös SIM-kortin lukitusasetuksen käytöstä laitteella.</translation> <translation id="4002066346123236978">Nimi</translation> <translation id="4017788180641807848">englanti (Yhdysvallat), Workman-näppäimistö</translation> <translation id="4040753847560036377">Väärä PUK-koodi</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fil.xtb b/ui/chromeos/translations/ui_chromeos_strings_fil.xtb index a1bdb6a..6fe2be2 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fil.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fil.xtb
@@ -138,6 +138,7 @@ <translation id="2148716181193084225">Ngayong Araw</translation> <translation id="2163152940313951844">Invalid na character: <ph name="CHARACTER_NAME" /></translation> <translation id="2184934335987813305">Portuguese na may US International PC keyboard</translation> +<translation id="2193661397560634290"><ph name="SPACE_USED" /> ang nagamit</translation> <translation id="2198315389084035571">Simplified Chinese</translation> <translation id="22085916256174561">Korean</translation> <translation id="2208919847696382164">I-install gamit ang Linux</translation> @@ -201,6 +202,7 @@ <translation id="2724954091494693138">Turkish na may F-keyboard</translation> <translation id="2732839045120506979">Vietnamese VNI</translation> <translation id="2735623501230989521">Bigyan ng pahintulot ang Parallels Desktop na ma-access ang mga file sa folder na <ph name="FOLDER_NAME" /></translation> +<translation id="2764206540577097904">Nagamit mo na ang lahat ng iyong indibidwal na storage sa Google Workspace.</translation> <translation id="2771816809568414714">Keso</translation> <translation id="2781645665747935084">Belgian</translation> <translation id="2782104745158847185">Nagkaroon ng error sa pag-install ng Linux application</translation> @@ -221,6 +223,7 @@ <translation id="2943503720238418293">Gumamit ng mas maikling pangalan</translation> <translation id="2949781154072577687">Fino-format ang <ph name="DRIVE_NAME" />...</translation> <translation id="2951236788251446349">Jellyfish</translation> +<translation id="2958458230122209142">Paubos na ang storage na may natitirang <ph name="REMAINING_PERCENTAGE" />% sa iyong <ph name="TOTAL_SPACE" /> indibidwal na storage.</translation> <translation id="2977940621473452797">Idinisenyo ang file na ito para sa isang computer na gumagamit ng Macintosh software. Hindi ito compatible sa iyong device na nagpapatakbo ng ChromeOS. Maghanap sa Chrome Web Store ng naaangkop na pamalit na app.</translation> <translation id="2984337792991268709">Ngayon <ph name="TODAY_DAYTIME" /></translation> <translation id="2994320653639462337">Nire-restore ang <ph name="COUNT" /> (na) item...</translation> @@ -342,7 +345,6 @@ <translation id="3971140002794351170">I-download ang mobile profile, Network <ph name="NETWORK_INDEX" /> ng <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">English (UK)</translation> <translation id="3975895378829046965">Bangla Phonetic</translation> -<translation id="3991446849494482687">Idi-disable din nito ang setting ng Lock ng SIM sa device.</translation> <translation id="4002066346123236978">Pamagat</translation> <translation id="4017788180641807848">English (US) na may Workman keyboard</translation> <translation id="4040753847560036377">Mali ang PUK</translation> @@ -670,6 +672,7 @@ <translation id="6823166707458800069">Awtomatikong na-back up online ang lahat ng file na na-save sa folder na ito.</translation> <translation id="6825883775269213504">Russian</translation> <translation id="6847101934483209767">Inalis ang <ph name="ENTRY_NAME" /> sa pagpipilian.</translation> +<translation id="6848194403851638089">Nagamit na ng <ph name="ORGANIZATION_NAME" /> ang buong storage nito sa Google Workspace.</translation> <translation id="6856459657722366306">Network <ph name="NETWORK_INDEX" /> sa <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, <ph name="CONNECTION_STATUS" />, Lakas ng Signal <ph name="SIGNAL_STRENGTH" />%, Mga Detalye</translation> <translation id="6861394552169064235">Persian</translation> <translation id="6862635236584086457">Lahat ng file na na-save sa folder na ito ay awtomatikong na-back up online</translation> @@ -701,6 +704,7 @@ <translation id="6989942356279143254">Swedish</translation> <translation id="6990081529015358884">Naubusan ka na ng espasyo</translation> <translation id="6998711733709403587"><ph name="SELCTED_FOLDERS_COUNT" /> (na) folder ang napili</translation> +<translation id="7008426324576352165">Kailangan ng iyong organisasyon ng mas malaking storage para makumpleto ang pag-upload.</translation> <translation id="7012943028104619157"><ph name="ROOT_TITLE" /> (<ph name="ROOT_SUMMARY" />)</translation> <translation id="7014174261166285193">Nabigo ang pag-install.</translation> <translation id="7031639531908619281">Turkish</translation> @@ -934,11 +938,13 @@ <translation id="8919081441417203123">Danish</translation> <translation id="8965697826696209160">Walang sapat na espasyo.</translation> <translation id="8997962250644902079">Chinese (Traditional) Pinyin</translation> +<translation id="8998871447376656508">Walang sapat na bakanteng espasyo sa iyong Google Drive para makumpleto ang pag-upload.</translation> <translation id="9003940392834790328">Network <ph name="NETWORK_INDEX" /> sa <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Lakas ng Signal <ph name="SIGNAL_STRENGTH" />%, Pinapamahalaan ng iyong Administrator, Mga Detalye</translation> <translation id="9017798300203431059">Russian phonetic</translation> <translation id="9034924485347205037">Mga Linux file</translation> <translation id="9035012421917565900">Hindi na maibabalik ang mga item sa '<ph name="DESTINATION_NAME" />,' kaya hindi mo maa-undo ang pagkilos na ito.</translation> <translation id="9035689366572880647">Ilagay ang kasalukuyang PIN</translation> +<translation id="9037777873893411148">*Puno na ang storage ng org</translation> <translation id="9038620279323455325">Mayroon nang file na may pangalang "<ph name="FILE_NAME" />." Pumili ng ibang pangalan.</translation> <translation id="9046895021617826162">Nabigo ang pagkonekta</translation> <translation id="9065512565307033593">Kung hindi ka makakapag-verify, madi-disable ang iyong access sa network.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fr-CA.xtb b/ui/chromeos/translations/ui_chromeos_strings_fr-CA.xtb index 2c103a9..fc9a497 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fr-CA.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fr-CA.xtb
@@ -193,6 +193,7 @@ <translation id="2621713457727696555">Sécurisé</translation> <translation id="2638942478653899953">Impossible d'accéder à Google Disque. Veuillez vous <ph name="BEGIN_LINK" />déconnecter<ph name="END_LINK" />, puis vous reconnecter.</translation> <translation id="2649120831653069427">Poisson-arc-en-ciel</translation> +<translation id="2653059201992392941">Il vous reste <ph name="RETRIES" /> tentatives.</translation> <translation id="2663066752008346276">Birman/Myanmar avec clavier myansan</translation> <translation id="2664412712123763093">Lieu du fichier</translation> <translation id="2718540689505416944">Installer l'application avec Linux</translation> @@ -341,7 +342,6 @@ <translation id="3971140002794351170">Télécharger le profil cellulaire, réseau <ph name="NETWORK_INDEX" /> sur <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Anglais (R.-U.)</translation> <translation id="3975895378829046965">Bangla (phonétique)</translation> -<translation id="3991446849494482687">Cela désactivera également le paramètre de verrouillage SIM sur l'appareil.</translation> <translation id="4002066346123236978">Titre</translation> <translation id="4017788180641807848">Anglais (É.-U.) avec clavier Workman</translation> <translation id="4040753847560036377">Clé personnelle de déblocage incorrecte</translation> @@ -529,6 +529,7 @@ <translation id="5489067830765222292">Letton</translation> <translation id="5489965683297092283">Le filtre <ph name="FILTER_NAME" /> est désactivé.</translation> <translation id="5494920125229734069">Tout sélectionner</translation> +<translation id="5500104704744051184">Vous ne pourrez pas utiliser ce réseau tant que vous n'aurez pas entré la PUK.</translation> <translation id="5500122897333236901">Islandais</translation> <translation id="5508696409934741614">Points</translation> <translation id="5522908512596376669">La liste de fichiers utilise maintenant l'affichage en liste.</translation> @@ -634,6 +635,7 @@ <translation id="6395575651121294044"><ph name="NUMBER_OF_FILES" /> éléments</translation> <translation id="642282551015776456">Ce nom ne peut être utilisé comme nom de fichier ou de dossier</translation> <translation id="6423031066725912715">Vietnamien avec clavier TCVN</translation> +<translation id="6430271654280079150">Il vous reste 1 tentative.</translation> <translation id="6485131920355264772">Échec de récupération de l'information sur l'espace</translation> <translation id="6495925982925244349">Réseau <ph name="NETWORK_INDEX" /> sur <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, <ph name="CONNECTION_STATUS" />, force du signal : <ph name="SIGNAL_STRENGTH" /> %, géré par votre administrateur, détails</translation> <translation id="649877868557234318">Extraction de <ph name="FILE_NAME" /> vers <ph name="FOLDER_NAME" /></translation> @@ -900,6 +902,7 @@ <translation id="8579285237314169903">Synchronisation de <ph name="NUMBER_OF_FILES" /> éléments en cours...</translation> <translation id="8600173386174225982">La liste de fichiers utilise maintenant l'affichage en miniatures.</translation> <translation id="8601932370724196034">Fichier d'image Crostini</translation> +<translation id="8608515571837163082">Un NIP incorrect a été entré trop de fois. Entrez la clé personnelle de déblocage (PUK) à huit chiffres fournie par le fournisseur de services.</translation> <translation id="8609695766746872526">Islandais</translation> <translation id="863903787380594467">NIP incorrect. Il vous reste <ph name="RETRIES" /> tentatives.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – Port</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fr.xtb b/ui/chromeos/translations/ui_chromeos_strings_fr.xtb index a18642a6..ceac292 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fr.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Téléchargez le profil mobile, Réseau <ph name="NETWORK_INDEX" /> sur <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Anglais (Royaume-Uni)</translation> <translation id="3975895378829046965">Bengali (phonétique)</translation> -<translation id="3991446849494482687">Cette opération désactivera également le paramètre de verrouillage de la carte SIM sur l'appareil.</translation> <translation id="4002066346123236978">Titre</translation> <translation id="4017788180641807848">Anglais (États-Unis) avec clavier Workman</translation> <translation id="4040753847560036377">PUK incorrect</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_gl.xtb b/ui/chromeos/translations/ui_chromeos_strings_gl.xtb index d9db66a..c580c4ef 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_gl.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_gl.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Descargar perfil para móbiles, rede <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Inglés (Reino Unido)</translation> <translation id="3975895378829046965">Bengalí (fonético)</translation> -<translation id="3991446849494482687">Tamén se desactivará no dispositivo a opción de configuración de bloqueo da SIM.</translation> <translation id="4002066346123236978">Título</translation> <translation id="4017788180641807848">Inglés (EUA) con teclado Workman</translation> <translation id="4040753847560036377">O PUK é incorrecto</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_gu.xtb b/ui/chromeos/translations/ui_chromeos_strings_gu.xtb index f427493..cbe21ac 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_gu.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_gu.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170"><ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />ના નેટવર્ક <ph name="NETWORK_COUNT" />માંથી <ph name="NETWORK_INDEX" /> મોબાઇલ પ્રોફાઇલ ડાઉનલોડ કરો</translation> <translation id="3973925058222872294">અંગ્રેજી (યુકે)</translation> <translation id="3975895378829046965">બંગાળી ફોનેટિક</translation> -<translation id="3991446849494482687">આ ડિવાઇસ પર સિમ કાર્ડ લૉક કરવાના સેટિંગને પણ બંધ કરશે.</translation> <translation id="4002066346123236978">શીર્ષક</translation> <translation id="4017788180641807848">અંગ્રેજી (યુએસ), વર્કમેન કીબોર્ડ સાથે</translation> <translation id="4040753847560036377">ખોટો PUK</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hi.xtb b/ui/chromeos/translations/ui_chromeos_strings_hi.xtb index 0fc74cb1b..44d0866 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_hi.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_hi.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">मोबाइल प्रोफ़ाइल डाउनलोड करें. यह <ph name="NETWORK_PROVIDER_NAME" /> के <ph name="NETWORK_COUNT" /> <ph name="NETWORK_NAME" /> नेटवर्क में से नेटवर्क <ph name="NETWORK_INDEX" /> है</translation> <translation id="3973925058222872294">अंग्रेज़ी (यूके)</translation> <translation id="3975895378829046965">बांग्ला फ़ोनेटिक</translation> -<translation id="3991446849494482687">ऐसा करने से, डिवाइस पर सिम लॉक करने की सेटिंग भी बंद हो जाएगी.</translation> <translation id="4002066346123236978">शीर्षक</translation> <translation id="4017788180641807848">वर्कमैन कीबोर्ड के साथ अंग्रेज़ी (यूएस)</translation> <translation id="4040753847560036377">PUK गलत है</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hr.xtb b/ui/chromeos/translations/ui_chromeos_strings_hr.xtb index 65e25abd..28e5a1a3 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_hr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_hr.xtb
@@ -345,7 +345,6 @@ <translation id="3971140002794351170">Preuzmi mobilni profil, mreža <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">engleski (UK)</translation> <translation id="3975895378829046965">bengalski fonetski</translation> -<translation id="3991446849494482687">Time će se onemogućiti i postavka zaključavanja SIM-a na uređaju.</translation> <translation id="4002066346123236978">Naslov</translation> <translation id="4017788180641807848">engleski (SAD) s Workman tipkovnicom</translation> <translation id="4040753847560036377">PUK nije točan</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hu.xtb b/ui/chromeos/translations/ui_chromeos_strings_hu.xtb index 633a9f5..b1f0e1c 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_hu.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_hu.xtb
@@ -138,6 +138,7 @@ <translation id="2148716181193084225">Ma</translation> <translation id="2163152940313951844">Érvénytelen karakter: <ph name="CHARACTER_NAME" /></translation> <translation id="2184934335987813305">portugál, amerikai nemzetközi PC-billentyűzettel</translation> +<translation id="2193661397560634290"><ph name="SPACE_USED" /> felhasználva</translation> <translation id="2198315389084035571">Egyszerűsített kínai</translation> <translation id="22085916256174561">koreai</translation> <translation id="2208919847696382164">Telepítés Linux segítségével</translation> @@ -201,6 +202,7 @@ <translation id="2724954091494693138">török, F-billentyűzettel</translation> <translation id="2732839045120506979">vietnámi, VNI</translation> <translation id="2735623501230989521">A Parallels Desktop engedélyt kap arra, hogy hozzáférjen a fájlokhoz a következő mappában: <ph name="FOLDER_NAME" />.</translation> +<translation id="2764206540577097904">Felhasználta Google Workspace-tárhelyét.</translation> <translation id="2771816809568414714">Sajt</translation> <translation id="2781645665747935084">belga</translation> <translation id="2782104745158847185">Hiba történt a Linux-alkalmazás telepítése során</translation> @@ -221,6 +223,7 @@ <translation id="2943503720238418293">Rövidebb nevet adjon meg</translation> <translation id="2949781154072577687"><ph name="DRIVE_NAME" /> formázása…</translation> <translation id="2951236788251446349">Medúza</translation> +<translation id="2958458230122209142">Kevés tárhely (<ph name="REMAINING_PERCENTAGE" />%) maradt a(z) <ph name="TOTAL_SPACE" /> méretű egyéni tárhelyéből.</translation> <translation id="2977940621473452797">A fájl Macintosh-szoftvert használó számítógéphez készült. ChromeOS-t futtató eszközével nem kompatibilis. Keressen a Chrome Webáruházban megfelelő helyettesítő alkalmazást.</translation> <translation id="2984337792991268709">Ma <ph name="TODAY_DAYTIME" /></translation> <translation id="2994320653639462337"><ph name="COUNT" /> elem visszaállítása…</translation> @@ -342,7 +345,6 @@ <translation id="3971140002794351170">Mobilprofil letöltése, <ph name="NETWORK_COUNT" />/<ph name="NETWORK_INDEX" />. hálózat, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">angol (Egyesült Királyság)</translation> <translation id="3975895378829046965">bengáli, fonetikus</translation> -<translation id="3991446849494482687">Ezzel a SIM-zárolási beállítást is kikapcsolja az eszközön.</translation> <translation id="4002066346123236978">Cím</translation> <translation id="4017788180641807848">angol (USA) billentyűzet Workman kiosztással</translation> <translation id="4040753847560036377">Helytelen PUK-kód</translation> @@ -670,6 +672,7 @@ <translation id="6823166707458800069">Az ebbe a mappába mentett minden fájlról online biztonsági másolat készül.</translation> <translation id="6825883775269213504">orosz</translation> <translation id="6847101934483209767"><ph name="ENTRY_NAME" /> eltávolítva a kijelöltek közül.</translation> +<translation id="6848194403851638089">A(z) <ph name="ORGANIZATION_NAME" /> felhasználta a teljes Google Workspace-tárhelyét.</translation> <translation id="6856459657722366306"><ph name="NETWORK_INDEX" />. hálózat (összesen <ph name="NETWORK_COUNT" />), <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, <ph name="CONNECTION_STATUS" />, jelerősség: <ph name="SIGNAL_STRENGTH" />%, részletek</translation> <translation id="6861394552169064235">perzsa</translation> <translation id="6862635236584086457">Az ebbe a mappába mentett minden fájlról online biztonsági másolat készül</translation> @@ -701,6 +704,7 @@ <translation id="6989942356279143254">svéd</translation> <translation id="6990081529015358884">Elfogyott a hely</translation> <translation id="6998711733709403587"><ph name="SELCTED_FOLDERS_COUNT" /> kiválasztott mappa</translation> +<translation id="7008426324576352165">Szervezetének további tárhelyre van szüksége a feltöltés befejezéséhez.</translation> <translation id="7012943028104619157"><ph name="ROOT_TITLE" /> (<ph name="ROOT_SUMMARY" />)</translation> <translation id="7014174261166285193">A telepítés nem sikerült.</translation> <translation id="7031639531908619281">török</translation> @@ -934,11 +938,13 @@ <translation id="8919081441417203123">dán</translation> <translation id="8965697826696209160">Nincs elég tárhely.</translation> <translation id="8997962250644902079">kínai (hagyományos) pinjin</translation> +<translation id="8998871447376656508">Nincs elég szabad tárhelye a Google Drive-on a feltöltés befejezéséhez.</translation> <translation id="9003940392834790328"><ph name="NETWORK_INDEX" />. hálózat (összesen <ph name="NETWORK_COUNT" />), <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, jelerősség: <ph name="SIGNAL_STRENGTH" />%, a rendszergazdája kezeli, részletek</translation> <translation id="9017798300203431059">orosz fonetikus</translation> <translation id="9034924485347205037">Linux-fájlok</translation> <translation id="9035012421917565900">Az elemek nem helyezhetők vissza ide: „<ph name="DESTINATION_NAME" />”. Nem tudja visszavonni a műveletet.</translation> <translation id="9035689366572880647">Adja meg a jelenlegi PIN-kódot</translation> +<translation id="9037777873893411148">* Megtelt a szervezet tárhelye</translation> <translation id="9038620279323455325">Már van „<ph name="FILE_NAME" />” nevű fájl. Válasszon másik nevet.</translation> <translation id="9046895021617826162">Csatlakozás sikertelen</translation> <translation id="9065512565307033593">Ha nem sikerül az igazolás, a hálózati hozzáférés le lesz tiltva.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hy.xtb b/ui/chromeos/translations/ui_chromeos_strings_hy.xtb index 7be3bb5..a34786ee 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_hy.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_hy.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Ներբեռնել բջջային պրոֆիլը, ցանց <ph name="NETWORK_INDEX" />՝ <ph name="NETWORK_COUNT" />-ից, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">անգլերեն (ՄԹ)</translation> <translation id="3975895378829046965">բանգլա (հնչյունային)</translation> -<translation id="3991446849494482687">SIM քարտի կողպման կարգավորումը նույնպես կանջատվի։</translation> <translation id="4002066346123236978">Վերնագիր</translation> <translation id="4017788180641807848">անգլերեն (ԱՄՆ)՝ Workman ստեղնաշարով</translation> <translation id="4040753847560036377">PUK կոդը սխալ է</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_id.xtb b/ui/chromeos/translations/ui_chromeos_strings_id.xtb index afbd863..fc33cacf 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_id.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_id.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Download profil seluler, Jaringan <ph name="NETWORK_INDEX" /> dari <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Inggris (Inggris Raya)</translation> <translation id="3975895378829046965">Fonetik Bengali</translation> -<translation id="3991446849494482687">Tindakan ini juga akan menonaktifkan setelan Kunci SIM di perangkat.</translation> <translation id="4002066346123236978">Judul</translation> <translation id="4017788180641807848">Inggris (AS) dengan keyboard Workman</translation> <translation id="4040753847560036377">PUK salah</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_is.xtb b/ui/chromeos/translations/ui_chromeos_strings_is.xtb index bc56e57..0b71f214 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_is.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_is.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Sækja snjallprófíl, netkerfi <ph name="NETWORK_INDEX" /> af <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Enska (bresk)</translation> <translation id="3975895378829046965">Bengalska hljóðritun</translation> -<translation id="3991446849494482687">Þetta mun einnig slökkva á stillingum fyrir SIM-lás í tækinu.</translation> <translation id="4002066346123236978">Heiti</translation> <translation id="4017788180641807848">Enska (bandarísk) með Workman-lyklaborði</translation> <translation id="4040753847560036377">Rangt PUK-númer</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_it.xtb b/ui/chromeos/translations/ui_chromeos_strings_it.xtb index 0d35fb6..cd4b5d7c 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_it.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_it.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Scarica il profilo per dispositivi mobili, rete <ph name="NETWORK_INDEX" /> di <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Inglese (UK)</translation> <translation id="3975895378829046965">Bengalese fonetica</translation> -<translation id="3991446849494482687">Verrà disattivata anche l'impostazione Blocco SIM sul dispositivo.</translation> <translation id="4002066346123236978">Titolo</translation> <translation id="4017788180641807848">Inglese (USA) con tastiera Workman</translation> <translation id="4040753847560036377">PUK errato</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_iw.xtb b/ui/chromeos/translations/ui_chromeos_strings_iw.xtb index 6161db5..b3a7c0dfc 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_iw.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_iw.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">הורדה של פרופיל נייד, רשת <ph name="NETWORK_INDEX" /> מתוך <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">אנגלית (בריטניה)</translation> <translation id="3975895378829046965">בנגלית פונטית</translation> -<translation id="3991446849494482687">הפעולה הזו תשבית גם את ההגדרה של נעילת ה-SIM במכשיר.</translation> <translation id="4002066346123236978">כותרת</translation> <translation id="4017788180641807848">מקלדת Workman באנגלית (ארה"ב)</translation> <translation id="4040753847560036377">ה-PUK שגוי</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ja.xtb b/ui/chromeos/translations/ui_chromeos_strings_ja.xtb index 3c34d9b..edf4882 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ja.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ja.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">モバイル プロファイルのダウンロード - <ph name="NETWORK_INDEX" /> 番目のネットワーク(全 <ph name="NETWORK_COUNT" /> 件)、<ph name="NETWORK_NAME" />、<ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">英語(イギリス)</translation> <translation id="3975895378829046965">ベンガル語(表音)</translation> -<translation id="3991446849494482687">デバイスの SIM ロック設定も無効になります。</translation> <translation id="4002066346123236978">タイトル</translation> <translation id="4017788180641807848">英語(アメリカ)(Workman)キーボード</translation> <translation id="4040753847560036377">PUK が正しくありません</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ka.xtb b/ui/chromeos/translations/ui_chromeos_strings_ka.xtb index 54a85bd..ec4bf20 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ka.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ka.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">მობილური პროფილის ჩამოტვირთვა, ქსელი <ph name="NETWORK_INDEX" /> / <ph name="NETWORK_COUNT" />-დან, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">ინგლისური (გაერთიანებული სამეფო)</translation> <translation id="3975895378829046965">ბენგალური ფონეტიკური</translation> -<translation id="3991446849494482687">ეს მოქმედება მოწყობილობაზე, ასევე, გათიშავს SIM ბარათის ჩაკეტვის პარამეტრს.</translation> <translation id="4002066346123236978">სათაური</translation> <translation id="4017788180641807848">ინგლისური (აშშ) Workman კლავიატურით</translation> <translation id="4040753847560036377">PUK-კოდი არასწორია</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_kk.xtb b/ui/chromeos/translations/ui_chromeos_strings_kk.xtb index 772db8a..56ec0dec 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_kk.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_kk.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Мобильдік профильді жүктеп алу, <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" /> желі, <ph name="NETWORK_PROVIDER_NAME" /> провайдерінің <ph name="NETWORK_NAME" /> желісі</translation> <translation id="3973925058222872294">Ағылшын (БK)</translation> <translation id="3975895378829046965">Бенгал (фонетикалық)</translation> -<translation id="3991446849494482687">Құрылғыдағы SIM картасын құлыптау параметрі де өшіріледі.</translation> <translation id="4002066346123236978">Тақырып</translation> <translation id="4017788180641807848">Ағылшын (АҚШ), Workman пернетақтасымен</translation> <translation id="4040753847560036377">PUK коды дұрыс емес.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_km.xtb b/ui/chromeos/translations/ui_chromeos_strings_km.xtb index 894d71a2..d279077 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_km.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_km.xtb
@@ -138,6 +138,7 @@ <translation id="2148716181193084225">ថ្ងៃនេះ</translation> <translation id="2163152940313951844">តួអក្សរមិនត្រឹមត្រូវ៖ <ph name="CHARACTER_NAME" /></translation> <translation id="2184934335987813305">ភាសាព័រទុយហ្កាល់ដែលប្រើក្ដារចុចកុំព្យូទ័រអាមេរិកអន្តរជាតិ</translation> +<translation id="2193661397560634290">បានប្រើអស់ <ph name="SPACE_USED" /></translation> <translation id="2198315389084035571">ភាសាចិនសាមញ្ញ</translation> <translation id="22085916256174561">ភាសាកូរ៉េ</translation> <translation id="2208919847696382164">ដំឡើងតាមរយៈ Linux</translation> @@ -201,6 +202,7 @@ <translation id="2724954091494693138">ភាសាតួកគីដែលប្រើក្ដារចុច F</translation> <translation id="2732839045120506979">ភាសាវៀតណាម VNI</translation> <translation id="2735623501230989521">ផ្ដល់ការអនុញ្ញាតឱ្យ Parallels Desktop ចូលប្រើឯកសារនៅក្នុងថត <ph name="FOLDER_NAME" /></translation> +<translation id="2764206540577097904">អ្នកបានប្រើទំហំផ្ទុក Google Workspace បុគ្គលរបស់អ្នកអស់ហើយ។</translation> <translation id="2771816809568414714">ឈីស</translation> <translation id="2781645665747935084">ភាសាប៊ែលស៊ិក</translation> <translation id="2782104745158847185">មានបញ្ហាក្នុងការដំឡើងកម្មវិធី Linux</translation> @@ -221,6 +223,7 @@ <translation id="2943503720238418293">ប្រើឈ្មោះខ្លីជាងនេះ</translation> <translation id="2949781154072577687">កំពុងសម្អាត <ph name="DRIVE_NAME" />...</translation> <translation id="2951236788251446349">ខ្ញែសមុទ្រ</translation> +<translation id="2958458230122209142">ទំហំផ្ទុកជិតអស់ហើយ នៅសល់<ph name="REMAINING_PERCENTAGE" /> % នៃទំហំផ្ទុកបុគ្គល <ph name="TOTAL_SPACE" /> របស់អ្នក។</translation> <translation id="2977940621473452797">ឯកសារនេះត្រូវបានរចនាឡើងសម្រាប់កុំព្យូទ័រដែលប្រើកម្មវិធី Macintosh។ វាមិនត្រូវគ្នាជាមួយឧបករណ៍របស់អ្នកដែលដំណើរការ ChromeOS ទេ។ សូមស្វែងរកកម្មវិធីជំនួសដែលសមស្របនៅលើ Chrome Web Store។</translation> <translation id="2984337792991268709">ថ្ងៃនេះ <ph name="TODAY_DAYTIME" /></translation> <translation id="2994320653639462337">កំពុងស្ដារធាតុ <ph name="COUNT" />...</translation> @@ -342,7 +345,6 @@ <translation id="3971140002794351170">ទាញយកកម្រងព័ត៌មានឧបករណ៍ចល័ត បណ្ដាញ <ph name="NETWORK_INDEX" /> នៃ <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">ភាសាអង់គ្លេស (ចក្រភពអង់គ្លេស)</translation> <translation id="3975895378829046965">សូរសព្ទជាភាសាបេងហ្គាល់</translation> -<translation id="3991446849494482687">ការធ្វើបែបនេះក៏នឹងបិទការកំណត់ការចាក់សោស៊ីមនៅលើឧបករណ៍ផងដែរ។</translation> <translation id="4002066346123236978">ចំណងជើង</translation> <translation id="4017788180641807848">ភាសាអង់គ្លេស (សហរដ្ឋអាមេរិក) ដែលប្រើក្ដារចុច Workman</translation> <translation id="4040753847560036377">PUK មិនត្រឹមត្រូវទេ</translation> @@ -669,6 +671,7 @@ <translation id="6823166707458800069">ឯកសារទាំងអស់ដែលបានរក្សាទុកនៅក្នុងថតនេះត្រូវបានបម្រុងទុកនៅលើអ៊ីនធឺណិតដោយស្វ័យប្រវត្តិ។</translation> <translation id="6825883775269213504">រុស្សី</translation> <translation id="6847101934483209767"><ph name="ENTRY_NAME" /> ដែលបានលុបចេញពីការជ្រើសរើស។</translation> +<translation id="6848194403851638089"><ph name="ORGANIZATION_NAME" /> បានប្រើប្រាស់ទំហំផ្ទុក Google Workspace របស់ខ្លួនអស់ហើយ។</translation> <translation id="6856459657722366306">បណ្ដាញ <ph name="NETWORK_INDEX" /> នៃ <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, <ph name="CONNECTION_STATUS" />, កម្លាំងរលកសញ្ញា <ph name="SIGNAL_STRENGTH" />%, ព័ត៌មានលម្អិត</translation> <translation id="6861394552169064235">ភាសាពែក្ស</translation> <translation id="6862635236584086457">ឯកសារទាំងអស់ត្រូវបានរក្សាទុកនៅក្នុងថតឯកសារនេះត្រូវបានបម្រុងនៅលើអ៊ីនធឺណិតដោយស្វ័យប្រវត្តិ</translation> @@ -700,6 +703,7 @@ <translation id="6989942356279143254">ភាសាស៊ុយអែត</translation> <translation id="6990081529015358884">អ្នកអស់ចន្លោះផ្ទុកហើយ</translation> <translation id="6998711733709403587"><ph name="SELCTED_FOLDERS_COUNT" /> ឯកសារត្រូវបានជ្រើសរើស</translation> +<translation id="7008426324576352165">ស្ថាប័នរបស់អ្នកតម្រូវឱ្យមានទំហំផ្ទុកបន្ថែម ដើម្បីបញ្ចប់ការបង្ហោះ។</translation> <translation id="7012943028104619157"><ph name="ROOT_TITLE" /> (<ph name="ROOT_SUMMARY" />)</translation> <translation id="7014174261166285193">ការដំឡើងបានបរាជ័យ។</translation> <translation id="7031639531908619281">ភាសាតួកគី</translation> @@ -933,11 +937,13 @@ <translation id="8919081441417203123">ភាសាដាណឺម៉ាក</translation> <translation id="8965697826696209160">គ្មានចន្លោះផ្ទុកគ្រប់គ្រាន់ទេ។</translation> <translation id="8997962250644902079">ភាសាចិន (អក្សរពេញ) ភីងអ៊ីង</translation> +<translation id="8998871447376656508">មិនមានទំហំផ្ទុកទំនេរគ្រប់គ្រាន់នៅក្នុង Google ថាសរបស់អ្នក ដើម្បីបញ្ចប់ការបង្ហោះទេ។</translation> <translation id="9003940392834790328">បណ្ដាញ <ph name="NETWORK_INDEX" /> នៃ <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, កម្លាំងរលកសញ្ញា <ph name="SIGNAL_STRENGTH" />%, គ្រប់គ្រងដោយអ្នកគ្រប់គ្រងរបស់អ្នក, ព័ត៌មានលម្អិត</translation> <translation id="9017798300203431059">ស្រះជាភាសារុស្សី</translation> <translation id="9034924485347205037">ឯកសារ Linux</translation> <translation id="9035012421917565900">ធាតុទាំងនេះមិនអាចផ្លាស់ទីទៅក្នុង '<ph name="DESTINATION_NAME" />' បានទេ ដូច្នេះអ្នកនឹងមិនអាចត្រឡប់សកម្មភាពនេះវិញបានទេ។</translation> <translation id="9035689366572880647">បញ្ចូលកូដ PIN បច្ចុប្បន្ន</translation> +<translation id="9037777873893411148">*ទំហំផ្ទុកស្ថាប័នពេញហើយ</translation> <translation id="9038620279323455325">ឯកសារដែលដាក់ឈ្មោះ "<ph name="FILE_NAME" />" មានរួចហើយ។ សូមជ្រើសរើសឈ្មោះផ្សេង។</translation> <translation id="9046895021617826162">ការភ្ជាប់បានបរាជ័យ</translation> <translation id="9065512565307033593">ប្រសិនបើអ្នកមិនអាចផ្ទៀងផ្ទាត់បានទេ សិទ្ធិចូលប្រើបណ្ដាញរបស់អ្នកនឹងត្រូវបានបិទ។</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_kn.xtb b/ui/chromeos/translations/ui_chromeos_strings_kn.xtb index 6b0d6f24..16dd38f 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_kn.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_kn.xtb
@@ -338,7 +338,6 @@ <translation id="3971140002794351170">ಮೊಬೈಲ್ ಪ್ರೊಫೈಲ್ ಡೌನ್ಲೋಡ್ ಮಾಡಿ, ನೆಟ್ವರ್ಕ್ <ph name="NETWORK_COUNT" /> ರಲ್ಲಿ <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">ಇಂಗ್ಲಿಷ್ (ಯುಕೆ)</translation> <translation id="3975895378829046965">ಬಾಂಗ್ಲಾ ಫೋನೆಟಿಕ್</translation> -<translation id="3991446849494482687">ಇದು ಸಾಧನದಲ್ಲಿನ ಸಿಮ್ ಲಾಕ್ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಸಹ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ.</translation> <translation id="4002066346123236978">ಶೀರ್ಷಿಕೆ</translation> <translation id="4017788180641807848">ವರ್ಕ್ಮ್ಯಾನ್ ಕೀಬೋರ್ಡ್ನಲ್ಲಿ ಇಂಗ್ಲಿಷ್ (ಯುಎಸ್)</translation> <translation id="4040753847560036377">ತಪ್ಪಾದ PUK</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ko.xtb b/ui/chromeos/translations/ui_chromeos_strings_ko.xtb index 13b91024..6ffdc7a 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ko.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ko.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">모바일 프로필 다운로드, 네트워크 <ph name="NETWORK_COUNT" />개 중 <ph name="NETWORK_INDEX" />번째, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">영어(영국)</translation> <translation id="3975895378829046965">벵골어(표음)</translation> -<translation id="3991446849494482687">이렇게 하면 기기의 SIM 잠금 설정도 사용 중지됩니다.</translation> <translation id="4002066346123236978">제목</translation> <translation id="4017788180641807848">영어(미국, 워크맨 키보드)</translation> <translation id="4040753847560036377">잘못된 PUK</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ky.xtb b/ui/chromeos/translations/ui_chromeos_strings_ky.xtb index efde65c3..28a0cd1 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ky.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ky.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Мобилдик профилди жүктөп алуу, <ph name="NETWORK_COUNT" /> ичинен <ph name="NETWORK_INDEX" />-тармак, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Англисче (Улуу Британия)</translation> <translation id="3975895378829046965">Бенгаличе (фонетикалык)</translation> -<translation id="3991446849494482687">Ушуну менен түзмөгүңүздөгү SIM картаны кулпулоо параметри да өчүрүлөт.</translation> <translation id="4002066346123236978">Аталышы</translation> <translation id="4017788180641807848">Англисче (АКШ) жана Workman баскычтобу</translation> <translation id="4040753847560036377">PUK туура эмес</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_lo.xtb b/ui/chromeos/translations/ui_chromeos_strings_lo.xtb index 78c9771e..299a36d 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_lo.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_lo.xtb
@@ -193,6 +193,7 @@ <translation id="2621713457727696555">ຮັກສາຄວາມປອດໄພແລ້ວ</translation> <translation id="2638942478653899953">ບໍ່ສາມາດເຂົ້າຫາ Google Drive ໄດ້. ກະລຸນາ <ph name="BEGIN_LINK" />ອອກຈາກລະບົບ<ph name="END_LINK" /> ແລະລົງຊື່ກັບເຂົ້າຫາອີກ.</translation> <translation id="2649120831653069427">ປາສາຍຮຸ້ງ</translation> +<translation id="2653059201992392941">ທ່ານລອງໄດ້ອີກ <ph name="RETRIES" /> ເທື່ອ.</translation> <translation id="2663066752008346276">ພາສາມຽມມາ/ພະມ້າທີ່ໃຊ້ແປ້ນພິມ Myansan</translation> <translation id="2664412712123763093">ສະຖານທີ່ຂອງໄຟລ໌</translation> <translation id="2718540689505416944">ຕິດຕັ້ງແອັບດ້ວຍ Linux</translation> @@ -341,7 +342,6 @@ <translation id="3971140002794351170">ດາວໂຫຼດໂປຣໄຟລ໌ມືຖື, ເຄືອຂ່າຍ <ph name="NETWORK_INDEX" /> ຈາກທັງໝົດ <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">ພາສາອັງກິດ (ສະຫະລາດຊະອານາຈັກ)</translation> <translation id="3975895378829046965">ການອອກສຽງພາສາບັງກລາ</translation> -<translation id="3991446849494482687">ນີ້ຈະເປັນການປິດການນຳໃຊ້ການຕັ້ງຄ່າການລັອກຊິມຢູ່ອຸປະກອນນຳ.</translation> <translation id="4002066346123236978">ຫົວຂໍ້</translation> <translation id="4017788180641807848">ພາສາອັງກິດ (ສະຫະລັດ) ທີ່ໃຊ້ແປ້ນພິມ Workman</translation> <translation id="4040753847560036377">PUK ບໍ່ຖືກຕ້ອງ</translation> @@ -527,6 +527,7 @@ <translation id="5489067830765222292">ພາສາລັດວຽນ</translation> <translation id="5489965683297092283">ປິດຕົວກັ່ນຕອງ <ph name="FILTER_NAME" /> ແລ້ວ.</translation> <translation id="5494920125229734069">ເລືອກທັງຫມົດ</translation> +<translation id="5500104704744051184">ທ່ານຈະບໍ່ສາມາດໃຊ້ເຄືອຂ່າຍນີ້ໄດ້ຈົນກວ່າທ່ານຈະໃສ່ລະຫັດ PUK</translation> <translation id="5500122897333236901">ພາສາໄອແລນດິກ</translation> <translation id="5508696409934741614">ຈຸດ</translation> <translation id="5522908512596376669">ລາຍການໄຟລ໌ໄດ້ປ່ຽນເປັນມຸມມອງລາຍການແລ້ວ.</translation> @@ -632,6 +633,7 @@ <translation id="6395575651121294044"><ph name="NUMBER_OF_FILES" /> ລາຍການ</translation> <translation id="642282551015776456">ຊື່ນີ້ອາດຈະບໍ່ໃຊ້ເປັນຊື່ໄຟລ໌ ຫຼືໂຟລເດີໄດ້</translation> <translation id="6423031066725912715">ພາສາຫວຽດນາມທີ່ໃຊ້ແປ້ນພິມ TCVN</translation> +<translation id="6430271654280079150">ທ່ານລອງໄດ້ອີກ 1 ເທື່ອ.</translation> <translation id="6485131920355264772">ດຶງເອົາຂໍ້ມູນຊ່ອງຫວ່າງບໍ່ສໍາເລັດ</translation> <translation id="6495925982925244349">ເຄືອຂ່າຍທີ <ph name="NETWORK_INDEX" /> ຈາກທັງໝົດ <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="SECURITY_STATUS" />, <ph name="CONNECTION_STATUS" />, ຄວາມແຮງສັນຍານ <ph name="SIGNAL_STRENGTH" />%, ຈັດການໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ, ລາຍລະອຽດ</translation> <translation id="649877868557234318">ກຳລັງແຕກໄຟລ໌ <ph name="FILE_NAME" /> ໄປໃສ່ <ph name="FOLDER_NAME" /></translation> @@ -898,6 +900,7 @@ <translation id="8579285237314169903">ກໍາລັງຊິງຄ໌ <ph name="NUMBER_OF_FILES" /> ລາຍການ...</translation> <translation id="8600173386174225982">ລາຍການໄຟລ໌ໄດ້ປ່ຽນເປັນມຸມມອງຮູບຫຍໍ້ແລ້ວ.</translation> <translation id="8601932370724196034">ໄຟລ໌ຮູບພາບ Crostini</translation> +<translation id="8608515571837163082">ລະບຸ PIN ບໍ່ຖືກຕ້ອງຫຼາຍເທື່ອເກີນໄປແລ້ວ. ປ້ອນລະຫັດຍົກເລີກການບລັອກ (PUK) 8 ຫຼັກ ທີ່ໃຫ້ມາໂດຍຜູ້ໃຫ້ບໍລິການ.</translation> <translation id="8609695766746872526">ພາສາໄອແລນດິກ</translation> <translation id="863903787380594467">PIN ບໍ່ຖືກຕ້ອງ. ທ່ານລອງໄດ້ອີກ <ph name="RETRIES" /> ເທື່ອ.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - ຜອດ</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_lt.xtb b/ui/chromeos/translations/ui_chromeos_strings_lt.xtb index 6458e4c..625fea91 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_lt.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_lt.xtb
@@ -138,6 +138,7 @@ <translation id="2148716181193084225">Šiandien</translation> <translation id="2163152940313951844">Netinkamas simbolis: <ph name="CHARACTER_NAME" /></translation> <translation id="2184934335987813305">Portugalų k. su JAV tarptautine AK klaviatūra</translation> +<translation id="2193661397560634290">Išnaudota: <ph name="SPACE_USED" /></translation> <translation id="2198315389084035571">Supaprastinta kinų k.</translation> <translation id="22085916256174561">Korėjiečių k.</translation> <translation id="2208919847696382164">Diegimas naudojant „Linux“</translation> @@ -201,6 +202,7 @@ <translation id="2724954091494693138">Turkų k. su F klaviatūra</translation> <translation id="2732839045120506979">Vietnamiečių k. VNI</translation> <translation id="2735623501230989521">Suteikite „Parallels Desktop“ leidimą pasiekti failus aplanke „<ph name="FOLDER_NAME" />“</translation> +<translation id="2764206540577097904">Išnaudojote visą asmeninę „Google Workspace“ saugyklą.</translation> <translation id="2771816809568414714">Sūris</translation> <translation id="2781645665747935084">Belgų</translation> <translation id="2782104745158847185">Įdiegiant „Linux“ programą įvyko klaida</translation> @@ -221,6 +223,7 @@ <translation id="2943503720238418293">Naudokite trumpesnį pavadinimą</translation> <translation id="2949781154072577687">Formatuojama: „<ph name="DRIVE_NAME" />“...</translation> <translation id="2951236788251446349">Medūza</translation> +<translation id="2958458230122209142">Mažai vietos saugykloje: liko <ph name="REMAINING_PERCENTAGE" /> proc. individualios saugyklos vietos iš <ph name="TOTAL_SPACE" />.</translation> <translation id="2977940621473452797">Šis failas skirtas kompiuteriui, kuriame naudojama „Macintosh“ programinė įranga. Jis nesuderinamas su jūsų įrenginiu, kuriame veikia „Chrome“ OS. Ieškokite tinkamos pakaitinės programos „Chrome“ internetinėje parduotuvėje.</translation> <translation id="2984337792991268709">Šiandien <ph name="TODAY_DAYTIME" /></translation> <translation id="2994320653639462337">Atkuriama elementų: <ph name="COUNT" />...</translation> @@ -342,7 +345,6 @@ <translation id="3971140002794351170">Atsisiųsti mobiliojo ryšio tinklo profilį; <ph name="NETWORK_INDEX" /> tinklas iš <ph name="NETWORK_COUNT" />, „<ph name="NETWORK_NAME" />“, „<ph name="NETWORK_PROVIDER_NAME" />“</translation> <translation id="3973925058222872294">Anglų k. (JK)</translation> <translation id="3975895378829046965">Bengalų k. fonetinė</translation> -<translation id="3991446849494482687">Įrenginyje taip pat bus išjungtas SIM užrakto nustatymas.</translation> <translation id="4002066346123236978">Pavadinimas</translation> <translation id="4017788180641807848">Anglų k. (JAV) su „Workman“ klaviatūra</translation> <translation id="4040753847560036377">Netinkamas PUK kodas</translation> @@ -670,6 +672,7 @@ <translation id="6823166707458800069">Visų šiame aplanke saugomų failų kopija automatiškai kuriama internete.</translation> <translation id="6825883775269213504">Rusų</translation> <translation id="6847101934483209767">„<ph name="ENTRY_NAME" />“ pašalintas iš pasirinkimo srities.</translation> +<translation id="6848194403851638089">„<ph name="ORGANIZATION_NAME" />“ išnaudojo visą „Google Workspace“ saugyklą.</translation> <translation id="6856459657722366306"><ph name="NETWORK_INDEX" /> tinklas iš <ph name="NETWORK_COUNT" />, „<ph name="NETWORK_NAME" />“, „<ph name="NETWORK_PROVIDER_NAME" />“, <ph name="CONNECTION_STATUS" />, signalo stiprumas <ph name="SIGNAL_STRENGTH" /> %, išsami informacija</translation> <translation id="6861394552169064235">Persų k.</translation> <translation id="6862635236584086457">Visų šiame aplanke saugomų failų kopija automatiškai kuriama internete</translation> @@ -701,6 +704,7 @@ <translation id="6989942356279143254">Švedų k.</translation> <translation id="6990081529015358884">Nebėra laisvos vietos</translation> <translation id="6998711733709403587">Pasirinkta aplankų: <ph name="SELCTED_FOLDERS_COUNT" /></translation> +<translation id="7008426324576352165">Norint užbaigti įkėlimą, organizacijai reikia daugiau saugyklos vietos.</translation> <translation id="7012943028104619157"><ph name="ROOT_TITLE" /> (<ph name="ROOT_SUMMARY" />)</translation> <translation id="7014174261166285193">Nepavyko įdiegti.</translation> <translation id="7031639531908619281">Turkų k.</translation> @@ -934,11 +938,13 @@ <translation id="8919081441417203123">Danų</translation> <translation id="8965697826696209160">Nepakanka vietos.</translation> <translation id="8997962250644902079">Kinų k. (tradicinė) „Pinyin“</translation> +<translation id="8998871447376656508">„Google“ diske nepakanka laisvos vietos, kad būtų galima užbaigti įkėlimą.</translation> <translation id="9003940392834790328"><ph name="NETWORK_INDEX" /> tinklas iš <ph name="NETWORK_COUNT" />, „<ph name="NETWORK_NAME" />“, <ph name="CONNECTION_STATUS" />, signalo stiprumas <ph name="SIGNAL_STRENGTH" /> %, tvarko administratorius, išsami informacija</translation> <translation id="9017798300203431059">Fonetinė rusų</translation> <translation id="9034924485347205037">„Linux“ failai</translation> <translation id="9035012421917565900">Elementų negalima perkelti atgal į „<ph name="DESTINATION_NAME" />“, todėl negalėsite anuliuoti šio veiksmo.</translation> <translation id="9035689366572880647">Įveskite dabartinį PIN kodą</translation> +<translation id="9037777873893411148">* Organizacijos saugykla pilna</translation> <translation id="9038620279323455325">Failas pavadinimu „<ph name="FILE_NAME" />“ jau yra. Pasirinkite kitą pavadinimą.</translation> <translation id="9046895021617826162">Nepavyko prisijungti</translation> <translation id="9065512565307033593">Jei jums nepavyks patvirtinti, tinklo prieiga bus išjungta.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_lv.xtb b/ui/chromeos/translations/ui_chromeos_strings_lv.xtb index 68c44465..c238e19 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_lv.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_lv.xtb
@@ -345,7 +345,6 @@ <translation id="3971140002794351170">Lejupielādēt mobilo sakaru profilu, tīkls numur <ph name="NETWORK_INDEX" />, tīklu skaits ir <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Angļu (Apvienotā Karaliste)</translation> <translation id="3975895378829046965">Bengāļu, fonētiskā</translation> -<translation id="3991446849494482687">Tādējādi ierīcē tiks atspējots arī SIM kartes bloķēšanas iestatījums.</translation> <translation id="4002066346123236978">Nosaukums</translation> <translation id="4017788180641807848">Angļu (ASV), ar Workman tastatūru</translation> <translation id="4040753847560036377">Nepareizs PUK kods</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_mk.xtb b/ui/chromeos/translations/ui_chromeos_strings_mk.xtb index 71dd3753..5a21a8f5 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_mk.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_mk.xtb
@@ -185,6 +185,7 @@ <translation id="2544853746127077729">Мрежата го отфрли сертификатот за автентикација</translation> <translation id="255937426064304553">Меѓународен англиски (САД)</translation> <translation id="2563185590376525700">Жаба</translation> +<translation id="2570012981255377263">Неодамнешните датотеки ќе се појават тука</translation> <translation id="2578394532502990878">фонетски тамилски</translation> <translation id="2579959351793446050">одија</translation> <translation id="2602810353103180630">Мрежа <ph name="NETWORK_INDEX" /> од <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, јачина на сигналот: <ph name="SIGNAL_STRENGTH" /> %, блокирано од администраторот, детали</translation> @@ -345,7 +346,6 @@ <translation id="3971140002794351170">Преземи го профилот на мобилниот уред, мрежа <ph name="NETWORK_INDEX" /> од <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">англиски (ОК)</translation> <translation id="3975895378829046965">фонетски бангла</translation> -<translation id="3991446849494482687">Ова ќе ја оневозможи и поставката „Заклучување SIM“ на уредот.</translation> <translation id="4002066346123236978">Наслов</translation> <translation id="4017788180641807848">англиски (САД) со тастатура Workman</translation> <translation id="4040753847560036377">Погрешен PUK</translation> @@ -547,6 +547,7 @@ <translation id="5625294776298156701">тамилски со тастатура Tamil99</translation> <translation id="5633226425545095130">Ако ја преместите ставкава, таа ќе биде споделена со сите кои можат да ја видат споделената папка „<ph name="DESTINATION_NAME" />“.</translation> <translation id="5649768706273821470">Слушај</translation> +<translation id="5665074015635552640">Неодамнешните видеа ќе се појават тука</translation> <translation id="5669691691057771421">Внесете го новиот PIN</translation> <translation id="5678784840044122290">Апликацијата за Linux ќе биде достапна во вашиот терминал, а може да се прикаже икона и во „Стартерот“.</translation> <translation id="5686799162999241776"><ph name="BEGIN_BOLD" />Не може да се исклучи од архива или виртуелен диск<ph name="END_BOLD" /> @@ -691,6 +692,7 @@ Најдени се <ph name="FILE_COUNT" /></translation> <translation id="6935521024859866267">Превртено</translation> <translation id="6943836128787782965">HTTP не успеа</translation> +<translation id="6945604978460872381">Неодамнешните документи ќе се појават тука</translation> <translation id="6949408524333579394">транслитерација на српски</translation> <translation id="6954309393500027528">Администраторот блокирал лепење на датотекава</translation> <translation id="6960565108681981554">Не е активирана. Контактирајте со вашиот оператор.</translation> @@ -738,6 +740,7 @@ <translation id="7295662345261934369">Сподели со другите</translation> <translation id="7297443947353982503">Корисничкото име/лозинката не се точни или автентикацијата со EAP не успеа</translation> <translation id="7309413087278791451">германски (Белгија)</translation> +<translation id="7313374447885864533">Неодамнешните аудиодатотеки ќе се појават тука</translation> <translation id="7339898014177206373">Нов прозорец</translation> <translation id="7343393116438664539">виетнамски телекс</translation> <translation id="7357762654218998920">Типов датотека не е поддржан. <ph name="BEGIN_LINK_HELP" />Дознајте повеќе<ph name="END_LINK_HELP" /> за отворање датотеки во Chrome OS.</translation> @@ -871,6 +874,7 @@ <translation id="8342318071240498787">Веќе постои датотека или директориум со истото име.</translation> <translation id="8372369524088641025">Погрешен клуч WEP</translation> <translation id="8372852072747894550">грчки</translation> +<translation id="8384716930968677505">Неодамнешните слики ќе се појават тука</translation> <translation id="8386903983509584791">Скенирањето заврши</translation> <translation id="8387733224523483503">Отпакувана е <ph name="FILE_NAME" />.</translation> <translation id="8395901698320285466">Димензии</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ml.xtb b/ui/chromeos/translations/ui_chromeos_strings_ml.xtb index d825c4d..f34fbd6 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ml.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ml.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">മൊബൈൽ പ്രൊഫൈൽ ഡൗൺലോഡ് ചെയ്യുക, <ph name="NETWORK_COUNT" /> എണ്ണത്തിൽ <ph name="NETWORK_INDEX" />-ാമത്തെ നെറ്റ്വർക്ക്, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">ഇംഗ്ലീഷ് (യുകെ)</translation> <translation id="3975895378829046965">ബംഗ്ലാ ഉച്ചാരണ ശബ്ദം</translation> -<translation id="3991446849494482687">ഇത് ഉപകരണത്തിലെ സിം ലോക്ക് ക്രമീകരണവും പ്രവർത്തനരഹിതമാക്കും.</translation> <translation id="4002066346123236978">ശീർഷകം</translation> <translation id="4017788180641807848">Workman കീബോർഡ് ഉള്ള ഇംഗ്ലീഷ് (യുഎസ്)</translation> <translation id="4040753847560036377">PUK തെറ്റാണ്</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_mn.xtb b/ui/chromeos/translations/ui_chromeos_strings_mn.xtb index 137924d..5ad3005 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_mn.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_mn.xtb
@@ -138,6 +138,7 @@ <translation id="2148716181193084225">Өнөөдөр</translation> <translation id="2163152940313951844">Хүчингүй тэмдэгт: <ph name="CHARACTER_NAME" /></translation> <translation id="2184934335987813305">АНУ-ын олон улсын компьютерын гартай португал</translation> +<translation id="2193661397560634290"><ph name="SPACE_USED" />-г ашигласан</translation> <translation id="2198315389084035571">Хялбаршуулсан Хятад хэл</translation> <translation id="22085916256174561">Солонгос</translation> <translation id="2208919847696382164">Linux-р суулгах</translation> @@ -184,6 +185,7 @@ <translation id="2544853746127077729">Таниулах гэрчилгээг сүлжээнээс цуцалсан байна</translation> <translation id="255937426064304553">АНУ олон улсын</translation> <translation id="2563185590376525700">Frog</translation> +<translation id="2570012981255377263">Таны саяхны файлууд энд харагдана</translation> <translation id="2578394532502990878">Тамил авиа зүй</translation> <translation id="2579959351793446050">Одиа</translation> <translation id="2602810353103180630"><ph name="NETWORK_COUNT" />-н <ph name="NETWORK_INDEX" />-р сүлжээ, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Дохионы хүч <ph name="SIGNAL_STRENGTH" />%, Танай администратор блоклосон, Дэлгэрэнгүй</translation> @@ -201,6 +203,7 @@ <translation id="2724954091494693138">F-гартай турк</translation> <translation id="2732839045120506979">Вьетнам VNI</translation> <translation id="2735623501230989521">Parallels Desktop-д <ph name="FOLDER_NAME" /> фолдерын файлуудад хандах зөвшөөрөл өгнө үү</translation> +<translation id="2764206540577097904">Та Google Workspace-н хувь хүний хадгалах сангаа бүгдийг нь ашигласан байна.</translation> <translation id="2771816809568414714">Бяслаг</translation> <translation id="2781645665747935084">Бельги</translation> <translation id="2782104745158847185">Linux аппыг суулгахад алдаа гарлаа</translation> @@ -221,6 +224,7 @@ <translation id="2943503720238418293">Богино нэр ашиглах</translation> <translation id="2949781154072577687"><ph name="DRIVE_NAME" />-г форматалж байна...</translation> <translation id="2951236788251446349">Далайн мөгөөрс</translation> +<translation id="2958458230122209142">Хадгалах сан бага байна. <ph name="TOTAL_SPACE" />-н хувь хүний хадгалах сангаас <ph name="REMAINING_PERCENTAGE" />% үлдсэн байна.</translation> <translation id="2977940621473452797">Энэ файл нь Macintosh программ хангамжийг ашиглаж буй компьютерт зориулагдсан байна. Энэ нь таны ChromeOS-г ажиллуулдаг төхөөрөмжид тохирохгүй. Chrome Веб Дэлгүүрээс орлуулж болох тохирох аппыг хайна уу.</translation> <translation id="2984337792991268709">Өнөөдөр <ph name="TODAY_DAYTIME" /></translation> <translation id="2994320653639462337"><ph name="COUNT" /> зүйлийг сэргээж байна...</translation> @@ -342,7 +346,6 @@ <translation id="3971140002794351170">Мобайл профайл татах, <ph name="NETWORK_COUNT" />-н <ph name="NETWORK_INDEX" /> сүлжээ, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Англи (UK)</translation> <translation id="3975895378829046965">Бенгал авиа зүй</translation> -<translation id="3991446849494482687">Энэ нь мөн төхөөрөмж дээрх SIM түгжээний тохиргоог идэвхгүй болгоно.</translation> <translation id="4002066346123236978">Гарчиг</translation> <translation id="4017788180641807848">Workman гартай англи (АНУ)</translation> <translation id="4040753847560036377">PUK буруу байна</translation> @@ -542,6 +545,7 @@ <translation id="5625294776298156701">Tamil99 гартай тамил</translation> <translation id="5633226425545095130">Энэ зүйлийг зөөснөөр үүнийг '<ph name="DESTINATION_NAME" />' хуваалцсан фолдерыг харах боломжтой бүх хүнтэй хуваалцана.</translation> <translation id="5649768706273821470">Сонсох</translation> +<translation id="5665074015635552640">Таны саяхны видеонууд энд харагдана</translation> <translation id="5669691691057771421">Шинэ ПИН оруулна уу</translation> <translation id="5678784840044122290">Linux апп таны Терминалд боломжтой болохоос гадна таны Эхлүүлэгчид дүрс тэмдэг харуулж болзошгүй.</translation> <translation id="5686799162999241776"><ph name="BEGIN_BOLD" />Архив эсвэл виртуал дискнээс салгах боломжгүй байна<ph name="END_BOLD" /> @@ -667,6 +671,7 @@ <translation id="6823166707458800069">Энэ фолдерт хадгалсан бүх файлыг автоматаар онлайнд нөөцөлсөн.</translation> <translation id="6825883775269213504">Орос хэл</translation> <translation id="6847101934483209767"><ph name="ENTRY_NAME" />-г сонголтоос хассан.</translation> +<translation id="6848194403851638089"><ph name="ORGANIZATION_NAME" /> Google Workspace-н бүх хадгалах сангаа ашигласан байна.</translation> <translation id="6856459657722366306">Сүлжээ <ph name="NETWORK_COUNT" />-н <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, <ph name="CONNECTION_STATUS" />, дохионы хүч <ph name="SIGNAL_STRENGTH" />%, дэлгэрэнгүй мэдээлэл</translation> <translation id="6861394552169064235">Перс</translation> <translation id="6862635236584086457">Энэ хавтсанд хадгалагдсан бүх файл нь автоматиар онлайнд давхар хадгалагдсан байгаа</translation> @@ -685,6 +690,7 @@ <ph name="FILE_COUNT" /> олдсон</translation> <translation id="6935521024859866267">180 хэм эргэсэн</translation> <translation id="6943836128787782965">HTTP амжилтгүй болсон</translation> +<translation id="6945604978460872381">Таны саяхны документууд энд харагдана</translation> <translation id="6949408524333579394">Серби галиг</translation> <translation id="6954309393500027528">Энэ файлыг буулгахыг танай администратор блоклосон</translation> <translation id="6960565108681981554">Идэвхжүүлээгүй байна. Оператор компанитайгаа холбогдоно уу.</translation> @@ -698,6 +704,7 @@ <translation id="6989942356279143254">Швед</translation> <translation id="6990081529015358884">Таны хангалттай зай алга байна.</translation> <translation id="6998711733709403587"><ph name="SELCTED_FOLDERS_COUNT" /> файл сонгосон байна</translation> +<translation id="7008426324576352165">Танай байгууллагад байршуулалтыг дуусгахад илүү их хадгалах сан шаардлагатай.</translation> <translation id="7012943028104619157"><ph name="ROOT_TITLE" /> (<ph name="ROOT_SUMMARY" />)</translation> <translation id="7014174261166285193">Суулгах ажиллагаа амжилтгүй боллоо.</translation> <translation id="7031639531908619281">Турк</translation> @@ -731,6 +738,7 @@ <translation id="7295662345261934369">Бусадтай хуваалцах</translation> <translation id="7297443947353982503">Хэрэглэгчийн нэр/нууц үг буруу эсвэл EAP-Auth амжилтгүй болсон байна</translation> <translation id="7309413087278791451">Герман (Бельги)</translation> +<translation id="7313374447885864533">Таны саяхны аудио файлууд энд харагдана</translation> <translation id="7339898014177206373">Шинэ цонх</translation> <translation id="7343393116438664539">Вьетнам телекс</translation> <translation id="7357762654218998920">Энэ файлын төрлийг дэмждэггүй. ChromeOS дээр файл нээх талаар <ph name="BEGIN_LINK_HELP" />нэмэлт мэдээлэл авна уу<ph name="END_LINK_HELP" />.</translation> @@ -864,6 +872,7 @@ <translation id="8342318071240498787">Ийм нэртэй файл болон файлын хадгалалтын сан байна.</translation> <translation id="8372369524088641025">WEP сул түлхүүр байна</translation> <translation id="8372852072747894550">Грек</translation> +<translation id="8384716930968677505">Таны саяхны зургууд энд харагдана</translation> <translation id="8386903983509584791">Шалгаж дууслаа</translation> <translation id="8387733224523483503"><ph name="FILE_NAME" />-г задалсан.</translation> <translation id="8395901698320285466">Хэмжээ</translation> @@ -931,11 +940,13 @@ <translation id="8919081441417203123">Дани хэл</translation> <translation id="8965697826696209160">Хангалттай багтаамж байхгүй байна.</translation> <translation id="8997962250644902079">Хятад (уламжлалт) пиньинь</translation> +<translation id="8998871447376656508">Таны Google Драйвт байршуулалтыг дуусгах хангалттай сул зай байхгүй байна.</translation> <translation id="9003940392834790328">Сүлжээ: <ph name="NETWORK_COUNT" />-н <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, дохионы хүч <ph name="SIGNAL_STRENGTH" />%, таны администратор удирддаг, дэлгэрэнгүй мэдээлэл</translation> <translation id="9017798300203431059">Орос хэлний авиа зүй</translation> <translation id="9034924485347205037">Linux-н файл</translation> <translation id="9035012421917565900">Зүйлийг буцааж '<ph name="DESTINATION_NAME" />' руу зөөх боломжгүй тул та энэ үйлдлийг буцаах боломжгүй.</translation> <translation id="9035689366572880647">Одоогийн ПИН-г оруулах</translation> +<translation id="9037777873893411148">*Байгууллагын хадгалах сан дүүрсэн</translation> <translation id="9038620279323455325">"<ph name="FILE_NAME" />" нэртэй файл аль хэдийн байна. Өөр нэр сонгоно уу.</translation> <translation id="9046895021617826162">Холболт амжилтгүй боллоо</translation> <translation id="9065512565307033593">Хэрэв та баталгаажуулж чадаагүй бол таны сүлжээний хандалтыг идэвхгүй болгоно.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_mr.xtb b/ui/chromeos/translations/ui_chromeos_strings_mr.xtb index c51f679..9af63f3 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_mr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_mr.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">मोबाइल प्रोफाइल डाउनलोड करा, <ph name="NETWORK_COUNT" /> पैकी <ph name="NETWORK_INDEX" /> नेटवर्क, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">इंग्रजी (यूके)</translation> <translation id="3975895378829046965">बंगाली फोनेटिक</translation> -<translation id="3991446849494482687">हे डिव्हाइसवरील सिम लॉक सेटिंगदेखील बंद करेल.</translation> <translation id="4002066346123236978">शीर्षक</translation> <translation id="4017788180641807848">वर्कमॅन कीबोर्डसह इंग्रजी (यूएस)</translation> <translation id="4040753847560036377">चुकीचा PUK</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ms.xtb b/ui/chromeos/translations/ui_chromeos_strings_ms.xtb index 8724ec50..b1e954c 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ms.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ms.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Muat turun profil mudah alih, Rangkaian <ph name="NETWORK_INDEX" /> daripada <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Inggeris (UK)</translation> <translation id="3975895378829046965">Fonetik Bangla</translation> -<translation id="3991446849494482687">Ini juga akan melumpuhkan tetapan Kunci SIM pada peranti.</translation> <translation id="4002066346123236978">Tajuk</translation> <translation id="4017788180641807848">Inggeris (AS) dengan papan kekunci Workman</translation> <translation id="4040753847560036377">PUK salah</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_my.xtb b/ui/chromeos/translations/ui_chromeos_strings_my.xtb index 1f1f179..1f12aee 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_my.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_my.xtb
@@ -138,6 +138,7 @@ <translation id="2148716181193084225">ယနေ့</translation> <translation id="2163152940313951844">အက္ခရာ မမှန်ကန်ပါ- <ph name="CHARACTER_NAME" /></translation> <translation id="2184934335987813305">ယူအက်စ်နိုင်ငံတကာ PC ကီးဘုတ်ဖြင့် ပေါ်တူဂီ</translation> +<translation id="2193661397560634290"><ph name="SPACE_USED" /> သုံးထားသည်</translation> <translation id="2198315389084035571">ရိုးရှင်း တရုတ်</translation> <translation id="22085916256174561">ကိုရီးယား</translation> <translation id="2208919847696382164">Linux ဖြင့် ထည့်သွင်းရန်</translation> @@ -201,6 +202,7 @@ <translation id="2724954091494693138">F ကီးဘုတ်ဖြင့် တူရကီ</translation> <translation id="2732839045120506979">ဗီယက်နမ် VNI</translation> <translation id="2735623501230989521"><ph name="FOLDER_NAME" /> ဖိုင်တွဲရှိ ဖိုင်များကို Parallels Desktop အား အသုံးပြုခွင့်ပေးမည်</translation> +<translation id="2764206540577097904">သင်၏တစ်ဦးချင်း Google Workspace သိုလှောင်ခန်းအားလုံးကို သုံးပြီးပါပြီ။</translation> <translation id="2771816809568414714">ဒိန်ခဲ</translation> <translation id="2781645665747935084">ဘယ်လ်ဂျီယံ</translation> <translation id="2782104745158847185">Linux အပလီကေးရှင်းကို ထည့်ရာတွင် အမှားအယွင်းရှိနေသည်</translation> @@ -221,6 +223,7 @@ <translation id="2943503720238418293">ပိုတိုသောအမည်ကို အသုံးပြုပါ</translation> <translation id="2949781154072577687"><ph name="DRIVE_NAME" /> ကို ဖော်မက်ချနေသည်...</translation> <translation id="2951236788251446349">ငါးထီး</translation> +<translation id="2958458230122209142">သင်၏တစ်ဦးချင်းသိုလှောင်ခန်း <ph name="TOTAL_SPACE" /> အနက် <ph name="REMAINING_PERCENTAGE" />% သာ အနည်းငယ်ကျန်တော့သည်။</translation> <translation id="2977940621473452797">ဤဖိုင်ကို ကွန်ပျူတာအတွက် Macintosh ဆော့ဖ်ဝဲဖြင့် ထုတ်လုပ်ထားခြင်းဖြစ်သည်။ ChromeOS သုံးသော သင့်စက်နှင့် တွဲဖက်အသုံးမပြုနိုင်ပါ။ သင့်လျော်သည့် အစားထိုးအက်ပ်အား Chrome Web Store တွင် ရှာဖွေပါ။</translation> <translation id="2984337792991268709">ယနေ့ <ph name="TODAY_DAYTIME" /></translation> <translation id="2994320653639462337"><ph name="COUNT" /> ခုကို ပြန်ယူနေသည်...</translation> @@ -342,7 +345,6 @@ <translation id="3971140002794351170">မိုဘိုင်းပရိုဖိုင် ဒေါင်းလုဒ်လုပ်ရန်၊ ကွန်ရက် <ph name="NETWORK_COUNT" /> ခုအနက် <ph name="NETWORK_INDEX" />၊ <ph name="NETWORK_NAME" />၊ <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">အင်္ဂလိပ် (ယူကေ)</translation> <translation id="3975895378829046965">ဘင်္ဂါလီ အသံထွက်</translation> -<translation id="3991446849494482687">၎င်းက စက်ရှိ ‘ဆင်းမ်ကတ်လော့ခ်’ ဆက်တင်ကိုလည်း ပိတ်ပါမည်။</translation> <translation id="4002066346123236978">ခေါင်းစဉ်</translation> <translation id="4017788180641807848">Workman ကီးဘုတ်ဖြင့် အင်္ဂလိပ် (ယူအက်စ်)</translation> <translation id="4040753847560036377">PUK မမှန်ပါ</translation> @@ -669,6 +671,7 @@ <translation id="6823166707458800069">ဤဖိုင်တွဲတွင်သိမ်းထားသည့် ဖိုင်အားလုံးကို အွန်လိုင်းတွင် အလိုအလျောက် အရန်သိမ်းသည်။</translation> <translation id="6825883775269213504">ရုရှား</translation> <translation id="6847101934483209767"><ph name="ENTRY_NAME" /> ကို ရွေးချယ်မှုမှ ဖယ်ရှားထားသည်။</translation> +<translation id="6848194403851638089"><ph name="ORGANIZATION_NAME" /> သည် ၎င်း၏ Google Workspace သိုလှောင်ခန်းအားလုံးကို သုံးပြီးပါပြီ။</translation> <translation id="6856459657722366306">ကွန်ရက် <ph name="NETWORK_COUNT" /> ခုအနက်မှ <ph name="NETWORK_INDEX" />၊ <ph name="NETWORK_NAME" />၊ <ph name="NETWORK_PROVIDER_NAME" />၊ <ph name="CONNECTION_STATUS" />၊ လိုင်းဆွဲအား <ph name="SIGNAL_STRENGTH" />%၊ အသေးစိတ်</translation> <translation id="6861394552169064235">ပါရှား</translation> <translation id="6862635236584086457">ဒီဖိုလ်ဒါ ထဲမှာ သိမ်းဆည်းထားသည့် ဖိုင်များ အားလုံးကို အွန်လိုင်းမှာ အလိုအလျောက် ဘက်အာပ် လုပ်ပေးသည်</translation> @@ -700,6 +703,7 @@ <translation id="6989942356279143254">ဆွီဒင်</translation> <translation id="6990081529015358884">သင့်ဆီမှာ နေရာ ကုန်သွားပြီ</translation> <translation id="6998711733709403587"><ph name="SELCTED_FOLDERS_COUNT" /> ဖိုင်တွဲရွေးထား</translation> +<translation id="7008426324576352165">အပ်လုဒ်ပြီးစီးနိုင်ရန် သင့်အဖွဲ့အစည်းက သိုလှောင်ခန်း ထပ်မံလိုအပ်ပါသည်။</translation> <translation id="7012943028104619157"><ph name="ROOT_TITLE" /> (<ph name="ROOT_SUMMARY" />)</translation> <translation id="7014174261166285193">ထည့်သွင်းခြင်း မအောင်မြင်ပါ။</translation> <translation id="7031639531908619281">တူရကီ</translation> @@ -933,11 +937,13 @@ <translation id="8919081441417203123">ဒိန်းမတ်</translation> <translation id="8965697826696209160">နေရာ လုံလုံလောက်လောက် မရှိပါ။</translation> <translation id="8997962250644902079">တရုတ် (ရိုးရာ) ပင်ယင်</translation> +<translation id="8998871447376656508">အပ်လုဒ်ပြီးစီးနိုင်ရန် သင်၏ Google Drive တွင် နေရာ မလုံလောက်ပါ။</translation> <translation id="9003940392834790328">ကွန်ရက် <ph name="NETWORK_COUNT" /> ခုအနက်မှ <ph name="NETWORK_INDEX" />၊ <ph name="NETWORK_NAME" />၊ <ph name="CONNECTION_STATUS" />၊ လိုင်းဆွဲအား <ph name="SIGNAL_STRENGTH" />%၊ သင့် 'ကြီးကြပ်သူ' က စီမံထားသည်၊ အသေးစိတ်များ</translation> <translation id="9017798300203431059">ရုရှားအသံထွက်</translation> <translation id="9034924485347205037">Linux ဖိုင်များ</translation> <translation id="9035012421917565900">၎င်းတို့ကို '<ph name="DESTINATION_NAME" />' သို့ ပြန်ရွှေ့၍မရသည့်အတွက် ဤလုပ်ဆောင်ချက်ကို တစ်ဆင့်နောက်ပြန်၍ ရမည်မဟုတ်ပါ။</translation> <translation id="9035689366572880647">လက်ရှိပင်နံပါတ် ထည့်ပါ</translation> +<translation id="9037777873893411148">*အဖွဲ့အစည်းသိုလှောင်ခန်း ပြည့်ပါပြီ</translation> <translation id="9038620279323455325">"<ph name="FILE_NAME" />" အမည်ဖြင့်ဖိုင် ရှိပြီးဖြစ်သည်။ အခြားအမည်ရွေးပါ။</translation> <translation id="9046895021617826162">ကွန်ရက်ချိတ်ဆက်မှု မအောင်မြင်ပါ</translation> <translation id="9065512565307033593">အတည်ပြု၍မရပါက သင့်ကွန်ရက်သုံးခွင့်ကို ပိတ်လိုက်ပါမည်။</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ne.xtb b/ui/chromeos/translations/ui_chromeos_strings_ne.xtb index 7dd156a..9ac6819 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ne.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ne.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">मोबाइल प्रोफाइल डाउनलोड गर्नुहोस्, <ph name="NETWORK_COUNT" /> मध्ये <ph name="NETWORK_INDEX" /> औँ नेटवर्क, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">अङ्ग्रेजी (संयुक्त अधिराज्य)</translation> <translation id="3975895378829046965">बङ्गाली फोनेटिक</translation> -<translation id="3991446849494482687">तपाईंले यसो गर्नुभयो भने डिभाइसमा SIM लक गर्ने सेटिङ पनि अफ हुने छ।</translation> <translation id="4002066346123236978">शीर्षक</translation> <translation id="4017788180641807848">अङ्ग्रेजी (सं. रा. अमेरिकी) वर्कमेन किबोर्ड</translation> <translation id="4040753847560036377">PUK मिलेन</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_nl.xtb b/ui/chromeos/translations/ui_chromeos_strings_nl.xtb index b080bd5..768e7c6 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_nl.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_nl.xtb
@@ -138,6 +138,7 @@ <translation id="2148716181193084225">Vandaag</translation> <translation id="2163152940313951844">Ongeldig teken: <ph name="CHARACTER_NAME" /></translation> <translation id="2184934335987813305">Portugees met Amerikaans pc-toetsenbord (internationaal)</translation> +<translation id="2193661397560634290"><ph name="SPACE_USED" /> gebruikt</translation> <translation id="2198315389084035571">Vereenvoudigd Chinees</translation> <translation id="22085916256174561">Koreaans</translation> <translation id="2208919847696382164">Installeren met Linux</translation> @@ -184,6 +185,7 @@ <translation id="2544853746127077729">Verificatiecertificaat geweigerd door netwerk</translation> <translation id="255937426064304553">Verenigde Staten (internationaal)</translation> <translation id="2563185590376525700">Kikker</translation> +<translation id="2570012981255377263">Je recente bestanden zie je hier</translation> <translation id="2578394532502990878">Tamil (fonetisch)</translation> <translation id="2579959351793446050">Odia</translation> <translation id="2602810353103180630">Netwerk <ph name="NETWORK_INDEX" /> van <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, signaalsterkte <ph name="SIGNAL_STRENGTH" />%, geblokkeerd door je beheerder, details</translation> @@ -201,6 +203,7 @@ <translation id="2724954091494693138">Turks met F-toetsenbord</translation> <translation id="2732839045120506979">Vietnamees (VNI)</translation> <translation id="2735623501230989521">Parallels Desktop toegang geven tot bestanden in de map <ph name="FOLDER_NAME" /></translation> +<translation id="2764206540577097904">Je persoonlijke Google Workspace-opslag is helemaal vol.</translation> <translation id="2771816809568414714">Kaas</translation> <translation id="2781645665747935084">Belgisch</translation> <translation id="2782104745158847185">Fout bij het installeren van de Linux-app</translation> @@ -221,6 +224,7 @@ <translation id="2943503720238418293">Gebruik een kortere naam</translation> <translation id="2949781154072577687"><ph name="DRIVE_NAME" /> formatteren…</translation> <translation id="2951236788251446349">Kwal</translation> +<translation id="2958458230122209142">Nog <ph name="REMAINING_PERCENTAGE" />% opslagruimte over van je <ph name="TOTAL_SPACE" /> aan persoonlijke opslag.</translation> <translation id="2977940621473452797">Dit bestand is bedoeld voor een computer met Macintosh-software. Het werkt niet met je apparaat, dat Chrome OS gebruikt. Zoek in de Chrome Web Store naar een geschikte vervangende app.</translation> <translation id="2984337792991268709">Vandaag <ph name="TODAY_DAYTIME" /></translation> <translation id="2994320653639462337"><ph name="COUNT" /> items herstellen...</translation> @@ -342,7 +346,6 @@ <translation id="3971140002794351170">Mobiel profiel downloaden, netwerk <ph name="NETWORK_INDEX" /> van <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Engels (VK)</translation> <translation id="3975895378829046965">Bangla (fonetisch)</translation> -<translation id="3991446849494482687">Hiermee wordt ook de simlockinstelling op het apparaat uitgezet.</translation> <translation id="4002066346123236978">Titel</translation> <translation id="4017788180641807848">Engels (VS) met Workman-toetsenbord</translation> <translation id="4040753847560036377">Onjuiste pukcode</translation> @@ -546,6 +549,7 @@ <translation id="5625294776298156701">Tamil met Tamil99-toetsenbord</translation> <translation id="5633226425545095130">Als je dit item verplaatst, wordt het gedeeld met iedereen die de gedeelde map <ph name="DESTINATION_NAME" /> kan bekijken.</translation> <translation id="5649768706273821470">Luisteren</translation> +<translation id="5665074015635552640">Je recente video's zie je hier</translation> <translation id="5669691691057771421">Nieuwe pincode opgeven</translation> <translation id="5678784840044122290">De Linux-app is beschikbaar in je terminal. Mogelijk staat er ook een icoon van de app in de Launcher.</translation> <translation id="5686799162999241776"><ph name="BEGIN_BOLD" />Kan een archiveringsschijf of virtuele schijf niet deactiveren<ph name="END_BOLD" /> @@ -671,6 +675,7 @@ <translation id="6823166707458800069">Er wordt automatisch online een back-up gemaakt van alle bestanden die in deze map zijn opgeslagen.</translation> <translation id="6825883775269213504">Russisch</translation> <translation id="6847101934483209767"><ph name="ENTRY_NAME" /> is uit selectie verwijderd.</translation> +<translation id="6848194403851638089">De Google Workspace-opslag van <ph name="ORGANIZATION_NAME" /> is helemaal vol.</translation> <translation id="6856459657722366306">Netwerk <ph name="NETWORK_INDEX" /> van <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, <ph name="CONNECTION_STATUS" />, signaalsterkte <ph name="SIGNAL_STRENGTH" />%, details</translation> <translation id="6861394552169064235">Perzisch</translation> <translation id="6862635236584086457">Er wordt automatisch online een back-up gemaakt van alle bestanden die in deze map zijn opgeslagen</translation> @@ -689,6 +694,7 @@ <ph name="FILE_COUNT" /> gevonden</translation> <translation id="6935521024859866267">Ondersteboven</translation> <translation id="6943836128787782965">Ophalen van HTTP mislukt</translation> +<translation id="6945604978460872381">Je recente documenten zie je hier</translation> <translation id="6949408524333579394">Servisch (transliteratie)</translation> <translation id="6954309393500027528">Plakken van dit bestand is geblokkeerd door je beheerder</translation> <translation id="6960565108681981554">Niet geactiveerd. Neem contact op met je provider.</translation> @@ -702,6 +708,7 @@ <translation id="6989942356279143254">Zweeds</translation> <translation id="6990081529015358884">Er is onvoldoende ruimte beschikbaar</translation> <translation id="6998711733709403587"><ph name="SELCTED_FOLDERS_COUNT" /> mappen geselecteerd</translation> +<translation id="7008426324576352165">Je organisatie heeft meer opslagruimte nodig om de upload af te ronden.</translation> <translation id="7012943028104619157"><ph name="ROOT_TITLE" /> (<ph name="ROOT_SUMMARY" />)</translation> <translation id="7014174261166285193">Installatie mislukt.</translation> <translation id="7031639531908619281">Turks</translation> @@ -735,6 +742,7 @@ <translation id="7295662345261934369">Delen met anderen</translation> <translation id="7297443947353982503">Gebruikersnaam/wachtwoord onjuist of EAP-verificatie mislukt</translation> <translation id="7309413087278791451">Duits (België)</translation> +<translation id="7313374447885864533">Je recente audiobestanden zie je hier</translation> <translation id="7339898014177206373">Nieuw venster</translation> <translation id="7343393116438664539">Vietnamees (Telex)</translation> <translation id="7357762654218998920">Dit bestandstype wordt niet ondersteund. Bekijk <ph name="BEGIN_LINK_HELP" />meer informatie<ph name="END_LINK_HELP" /> over hoe je bestanden opent in Chrome OS.</translation> @@ -868,6 +876,7 @@ <translation id="8342318071240498787">Er bestaat al een bestand of map met dezelfde naam.</translation> <translation id="8372369524088641025">Slechte WEP-sleutel</translation> <translation id="8372852072747894550">Grieks</translation> +<translation id="8384716930968677505">Je recente afbeeldingen zie je hier</translation> <translation id="8386903983509584791">Scan voltooid</translation> <translation id="8387733224523483503"><ph name="FILE_NAME" /> geëxtraheerd.</translation> <translation id="8395901698320285466">Afmetingen</translation> @@ -935,11 +944,13 @@ <translation id="8919081441417203123">Deens</translation> <translation id="8965697826696209160">Er is onvoldoende ruimte.</translation> <translation id="8997962250644902079">Chinees (traditioneel, Pinyin)</translation> +<translation id="8998871447376656508">Er is onvoldoende ruimte in je Google Drive beschikbaar om de upload af te ronden.</translation> <translation id="9003940392834790328">Netwerk <ph name="NETWORK_INDEX" /> van <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, signaalsterkte <ph name="SIGNAL_STRENGTH" />%, beheerd door je beheerder, details</translation> <translation id="9017798300203431059">Russisch fonetisch</translation> <translation id="9034924485347205037">Linux-bestanden</translation> <translation id="9035012421917565900">De items kunnen niet worden teruggezet naar '<ph name="DESTINATION_NAME" />', dus je kunt deze actie niet ongedaan maken.</translation> <translation id="9035689366572880647">Geef je huidige pincode op</translation> +<translation id="9037777873893411148">*Opslag van organisatie is vol</translation> <translation id="9038620279323455325">Er bestaat al een bestand met de naam '<ph name="FILE_NAME" />'. Kies een andere naam.</translation> <translation id="9046895021617826162">Verbinding mislukt</translation> <translation id="9065512565307033593">Als de verificatie mislukt, wordt je netwerktoegang ingetrokken.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_no.xtb b/ui/chromeos/translations/ui_chromeos_strings_no.xtb index 8637784..e334e274 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_no.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_no.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Last ned mobilprofilen, nettverk <ph name="NETWORK_INDEX" /> av <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Engelsk (Storbritannia)</translation> <translation id="3975895378829046965">Bengali, fonetisk</translation> -<translation id="3991446849494482687">Dette deaktiverer også SIM-låsinnstillingen på enheten.</translation> <translation id="4002066346123236978">Tittel</translation> <translation id="4017788180641807848">Engelsk (USA) med Workman-tastatur</translation> <translation id="4040753847560036377">Feil PUK-kode.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_or.xtb b/ui/chromeos/translations/ui_chromeos_strings_or.xtb index 3efe46e..b7a4053 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_or.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_or.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">ମୋବାଇଲ ପ୍ରୋଫାଇଲ୍, <ph name="NETWORK_COUNT" />ର <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /> ନେଟୱାର୍କ ଡାଉନଲୋଡ୍ କରନ୍ତୁ</translation> <translation id="3973925058222872294">ଇଂରାଜୀ (UK)</translation> <translation id="3975895378829046965">ବଙ୍ଗଳା ଫୋନେଟିକ୍</translation> -<translation id="3991446849494482687">ଏହା ମଧ୍ୟ ଏହି ଡିଭାଇସରେ SIM ଲକ ସେଟିଂକୁ ଅକ୍ଷମ କରିଦେବ।</translation> <translation id="4002066346123236978">ଆଖ୍ୟା</translation> <translation id="4017788180641807848">ୱାର୍କମ୍ୟାନ୍ କୀବୋର୍ଡ ସହ ଇଂରାଜୀ (US)</translation> <translation id="4040753847560036377">ଭୁଲ PUK</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pa.xtb b/ui/chromeos/translations/ui_chromeos_strings_pa.xtb index ebf91aa77..d5d17ea 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_pa.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_pa.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">ਮੋਬਾਈਲ ਪ੍ਰੋਫਾਈਲ ਡਾਊਨਲੋਡ ਕਰੋ, <ph name="NETWORK_COUNT" /> ਵਿੱਚੋਂ <ph name="NETWORK_INDEX" /> ਨੈੱਟਵਰਕ, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">ਅੰਗਰੇਜ਼ੀ (ਯੂ.ਕੇ.)</translation> <translation id="3975895378829046965">ਬੰਗਾਲੀ ਧੁਨੀਆਤਮਿਕ</translation> -<translation id="3991446849494482687">ਇਸ ਨਾਲ ਡੀਵਾਈਸ 'ਤੇ ਸਿਮ ਲਾਕ ਸੈਟਿੰਗ ਵੀ ਬੰਦ ਹੋ ਜਾਵੇਗੀ।</translation> <translation id="4002066346123236978">ਸਿਰਲੇਖ</translation> <translation id="4017788180641807848">ਵਰਕਮੈਨ ਕੀ-ਬੋਰਡ ਦੇ ਨਾਲ ਅੰਗਰੇਜ਼ੀ (ਯੂ.ਐੱਸ.)</translation> <translation id="4040753847560036377">ਗਲਤ PUK</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pl.xtb b/ui/chromeos/translations/ui_chromeos_strings_pl.xtb index 38595ad..a0e916ca 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_pl.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_pl.xtb
@@ -185,6 +185,7 @@ <translation id="2544853746127077729">Certyfikat uwierzytelniania został odrzucony przez sieć</translation> <translation id="255937426064304553">amerykańska klawiatura międzynarodowa</translation> <translation id="2563185590376525700">Żaba</translation> +<translation id="2570012981255377263">Tutaj będą się pojawiać ostatnie pliki</translation> <translation id="2578394532502990878">Tamilski fonetyczny</translation> <translation id="2579959351793446050">Orija</translation> <translation id="2602810353103180630">Sieć <ph name="NETWORK_INDEX" /> z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, siła sygnału: <ph name="SIGNAL_STRENGTH" />%, zablokowana przez administratora, szczegóły</translation> @@ -345,7 +346,6 @@ <translation id="3971140002794351170">Pobierz profil mobilny: sieć <ph name="NETWORK_INDEX" /> z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Angielski (Wielka Brytania)</translation> <translation id="3975895378829046965">Bengalski fonetyczny</translation> -<translation id="3991446849494482687">Spowoduje to też wyłączenie ustawienia blokady SIM na urządzeniu.</translation> <translation id="4002066346123236978">Tytuł</translation> <translation id="4017788180641807848">Angielski (USA) z klawiaturą Workman</translation> <translation id="4040753847560036377">Nieprawidłowy kod PUK</translation> @@ -548,6 +548,7 @@ <translation id="5625294776298156701">Tamilski z klawiaturą Tamil99</translation> <translation id="5633226425545095130">Przeniesienie tego elementu spowoduje jego udostępnienie wszystkim osobom, które mogą widzieć udostępniony folder „<ph name="DESTINATION_NAME" />”.</translation> <translation id="5649768706273821470">Posłuchaj</translation> +<translation id="5665074015635552640">Tutaj będą pojawiać się ostatnie filmy</translation> <translation id="5669691691057771421">Wpisz nowy kod PIN</translation> <translation id="5678784840044122290">Aplikacja na Linuksa będzie dostępna na terminalu. Może mieć też ikonę w Menu z aplikacjami.</translation> <translation id="5686799162999241776"><ph name="BEGIN_BOLD" />Nie można odłączyć archiwum lub dysku wirtualnego<ph name="END_BOLD" /> @@ -692,6 +693,7 @@ Znaleziono <ph name="FILE_COUNT" /></translation> <translation id="6935521024859866267">Do góry nogami</translation> <translation id="6943836128787782965">Wykonanie metody GET protokołu HTTP nie powiodło się.</translation> +<translation id="6945604978460872381">Tutaj będą się pojawiać ostatnie dokumenty</translation> <translation id="6949408524333579394">Serbski – transliteracja</translation> <translation id="6954309393500027528">Administrator zablokował możliwość wklejenia tego pliku</translation> <translation id="6960565108681981554">Nie aktywowano. Skontaktuj się ze swoim operatorem.</translation> @@ -739,6 +741,7 @@ <translation id="7295662345261934369">Udostępnij innym</translation> <translation id="7297443947353982503">Niepoprawna nazwa użytkownika lub hasło albo uwierzytelnianie EAP nie powiodło się</translation> <translation id="7309413087278791451">Niemiecki (Belgia)</translation> +<translation id="7313374447885864533">Tutaj będą się pojawiać ostatnie pliki audio</translation> <translation id="7339898014177206373">Nowe okno</translation> <translation id="7343393116438664539">Wietnamski teleks</translation> <translation id="7357762654218998920">Ten typ pliku nie jest obsługiwany. <ph name="BEGIN_LINK_HELP" />Dowiedz się więcej<ph name="END_LINK_HELP" /> o otwieraniu plików w Chrome OS.</translation> @@ -872,6 +875,7 @@ <translation id="8342318071240498787">Plik lub katalog o tej nazwie już istnieje.</translation> <translation id="8372369524088641025">Błędny klucz WEP</translation> <translation id="8372852072747894550">Grecki</translation> +<translation id="8384716930968677505">Tutaj będą się pojawiać ostatnie zdjęcia</translation> <translation id="8386903983509584791">Skanowanie ukończone</translation> <translation id="8387733224523483503">Element <ph name="FILE_NAME" /> został wyodrębniony.</translation> <translation id="8395901698320285466">Wymiary</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb b/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb index c802d5d5..a752124 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Download do perfil móvel. Rede <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Inglês (Reino Unido)</translation> <translation id="3975895378829046965">Bengali (fonético)</translation> -<translation id="3991446849494482687">Isso também vai desativar a configuração de bloqueio do chip no dispositivo.</translation> <translation id="4002066346123236978">Título</translation> <translation id="4017788180641807848">Inglês (EUA) com teclado Workman</translation> <translation id="4040753847560036377">PUK incorreta</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb b/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb index 30c9bde3..082b551 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb
@@ -345,7 +345,6 @@ <translation id="3971140002794351170">Transferir perfil móvel, rede <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Inglês (RU)</translation> <translation id="3975895378829046965">Fonética de bengali</translation> -<translation id="3991446849494482687">Esta ação também desativa a definição de bloqueio do SIM no dispositivo.</translation> <translation id="4002066346123236978">Título</translation> <translation id="4017788180641807848">Inglês (EUA) com teclado Workman</translation> <translation id="4040753847560036377">PUK incorreto</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ro.xtb b/ui/chromeos/translations/ui_chromeos_strings_ro.xtb index 17ce1b4..2433147 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ro.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ro.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Descarcă profilul mobil, Rețeaua <ph name="NETWORK_INDEX" /> din <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Engleză (Regatul Unit)</translation> <translation id="3975895378829046965">Bengaleză fonetică</translation> -<translation id="3991446849494482687">Astfel, se va dezactiva și setarea SIM Lock de pe dispozitiv.</translation> <translation id="4002066346123236978">Titlu</translation> <translation id="4017788180641807848">Engleză (S.U.A.) cu tastatură Workman</translation> <translation id="4040753847560036377">Cod PUK incorect</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ru.xtb b/ui/chromeos/translations/ui_chromeos_strings_ru.xtb index 99facae..10e7fc2 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ru.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ru.xtb
@@ -138,6 +138,7 @@ <translation id="2148716181193084225">Сегодня</translation> <translation id="2163152940313951844">Недопустимый символ: <ph name="CHARACTER_NAME" /></translation> <translation id="2184934335987813305">Португальский, американская международная раскладка (ПК)</translation> +<translation id="2193661397560634290">Занято: <ph name="SPACE_USED" /></translation> <translation id="2198315389084035571">Китайский (упрощенный)</translation> <translation id="22085916256174561">Корейский</translation> <translation id="2208919847696382164">Установить с помощью Linux</translation> @@ -201,6 +202,7 @@ <translation id="2724954091494693138">Турецкий, раскладка Turkish F</translation> <translation id="2732839045120506979">Вьетнамский, раскладка VNI</translation> <translation id="2735623501230989521">Parallels Desktop сможет получать доступ к файлам в папке "<ph name="FOLDER_NAME" />".</translation> +<translation id="2764206540577097904">Закончилось место в хранилище вашего личного аккаунта Google Workplace.</translation> <translation id="2771816809568414714">Сыр</translation> <translation id="2781645665747935084">Бельгийская</translation> <translation id="2782104745158847185">Не удалось установить приложение для Linux</translation> @@ -221,6 +223,7 @@ <translation id="2943503720238418293">Слишком длинное название.</translation> <translation id="2949781154072577687">Форматирование внешнего хранилища "<ph name="DRIVE_NAME" />"…</translation> <translation id="2951236788251446349">Медуза</translation> +<translation id="2958458230122209142">Заканчивается место в индивидуальном хранилище. Свободно <ph name="REMAINING_PERCENTAGE" /> % из <ph name="TOTAL_SPACE" />.</translation> <translation id="2977940621473452797">Этот файл предназначен для компьютеров с ПО Macintosh и несовместим с Chrome OS на вашем устройстве. Чтобы найти аналогичное приложение, перейдите в интернет-магазин Chrome.</translation> <translation id="2984337792991268709">Сегодня, <ph name="TODAY_DAYTIME" /></translation> <translation id="2994320653639462337">Восстановление объектов (<ph name="COUNT" />)…</translation> @@ -342,7 +345,6 @@ <translation id="3971140002794351170">Скачать мобильный профиль, сеть <ph name="NETWORK_INDEX" /> из <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Английский (Великобритания)</translation> <translation id="3975895378829046965">Бенгальский, фонетический</translation> -<translation id="3991446849494482687">Это действие разблокирует SIM-карту устройства.</translation> <translation id="4002066346123236978">Название</translation> <translation id="4017788180641807848">Английский (США), раскладка Workman</translation> <translation id="4040753847560036377">Неверный PUK-код.</translation> @@ -670,6 +672,7 @@ <translation id="6823166707458800069">Для всех файлов, сохраненных в этой папке, автоматически создается резервная копия в онлайн-хранилище.</translation> <translation id="6825883775269213504">Русский</translation> <translation id="6847101934483209767">Выбор объекта "<ph name="ENTRY_NAME" />" отменен.</translation> +<translation id="6848194403851638089">Закончилось место в хранилище Google Workspace организации "<ph name="ORGANIZATION_NAME" />".</translation> <translation id="6856459657722366306">Сеть <ph name="NETWORK_INDEX" /> из <ph name="NETWORK_COUNT" />, название – "<ph name="NETWORK_NAME" />", оператор – <ph name="NETWORK_PROVIDER_NAME" />, статус подключения – "<ph name="CONNECTION_STATUS" />", уровень сигнала – <ph name="SIGNAL_STRENGTH" /> %, подробная информация</translation> <translation id="6861394552169064235">Персидский</translation> <translation id="6862635236584086457">Для всех файлов, сохраненных в этой папке, автоматически создается резервная копия в Интернете</translation> @@ -701,6 +704,7 @@ <translation id="6989942356279143254">Шведский</translation> <translation id="6990081529015358884">Недостаточно свободного места</translation> <translation id="6998711733709403587">Выбрано папок: <ph name="SELCTED_FOLDERS_COUNT" /></translation> +<translation id="7008426324576352165">Чтобы выполнить загрузку, увеличьте хранилище организации.</translation> <translation id="7012943028104619157"><ph name="ROOT_TITLE" /> (<ph name="ROOT_SUMMARY" />)</translation> <translation id="7014174261166285193">Установка не выполнена.</translation> <translation id="7031639531908619281">Турецкий</translation> @@ -934,11 +938,13 @@ <translation id="8919081441417203123">Датский</translation> <translation id="8965697826696209160">Недостаточно свободного места.</translation> <translation id="8997962250644902079">Китайский (традиционный), пиньинь</translation> +<translation id="8998871447376656508">Не удалось завершить загрузку. На Google Диске недостаточно свободного места.</translation> <translation id="9003940392834790328">Сеть <ph name="NETWORK_INDEX" /> из <ph name="NETWORK_COUNT" />, название – "<ph name="NETWORK_NAME" />", статус подключения – "<ph name="CONNECTION_STATUS" />", уровень сигнала – <ph name="SIGNAL_STRENGTH" /> %, под управлением администратора, подробная информация</translation> <translation id="9017798300203431059">Русская (фонетическая)</translation> <translation id="9034924485347205037">Файлы Linux</translation> <translation id="9035012421917565900">Объекты нельзя переместить обратно на общий диск "<ph name="DESTINATION_NAME" />", поэтому вы не сможете отменить это действие.</translation> <translation id="9035689366572880647">Введите текущий PIN-код</translation> +<translation id="9037777873893411148">Хранилище организации заполнено</translation> <translation id="9038620279323455325">Файл "<ph name="FILE_NAME" />" уже существует. Выберите другое название.</translation> <translation id="9046895021617826162">Сбой подключения</translation> <translation id="9065512565307033593">Если не пройти проверку, доступ к сети будет отключен.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_si.xtb b/ui/chromeos/translations/ui_chromeos_strings_si.xtb index c5381c1..eb6bd8b 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_si.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_si.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">ජංගම පැතිකඩ බාගන්න, ජාල <ph name="NETWORK_COUNT" />කින් <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">ඉංග්රීසි (එ.රා.)</translation> <translation id="3975895378829046965">බංග්ලා ශබ්දිම</translation> -<translation id="3991446849494482687">මෙය උපාංගයේ SIM අගුලු සැකසීමද අබල කරනු ඇත.</translation> <translation id="4002066346123236978">සිරස්තලය</translation> <translation id="4017788180641807848">Workman යතුරුපුවරුව සමග ඉංග්රීසි (එ.ජ.)</translation> <translation id="4040753847560036377">වැරදි PUK එකකි.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sk.xtb b/ui/chromeos/translations/ui_chromeos_strings_sk.xtb index 7264982..a982eec 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sk.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sk.xtb
@@ -138,6 +138,7 @@ <translation id="2148716181193084225">Dnes</translation> <translation id="2163152940313951844">Neplatný znak: <ph name="CHARACTER_NAME" /></translation> <translation id="2184934335987813305">Portugalská klávesnica s americkou klávesnicou s medzinárodným rozložením klávesov (PC)</translation> +<translation id="2193661397560634290">Využité: <ph name="SPACE_USED" /></translation> <translation id="2198315389084035571">zjednodušená čínština</translation> <translation id="22085916256174561">Kórejská klávesnica</translation> <translation id="2208919847696382164">Inštalovať pomocou systému Linux</translation> @@ -201,6 +202,7 @@ <translation id="2724954091494693138">Turecká klávesnica (typ F)</translation> <translation id="2732839045120506979">Vietnamská klávesnica s rozložením VNI</translation> <translation id="2735623501230989521">Povoľte aplikácii Parallels Desktop prístup k súborom v priečinku <ph name="FOLDER_NAME" /></translation> +<translation id="2764206540577097904">Vyčerpali ste celý svoj osobný ukladací priestor v službe Google Workspace.</translation> <translation id="2771816809568414714">Syr</translation> <translation id="2781645665747935084">Belgická klávesnica</translation> <translation id="2782104745158847185">Pri inštalácii aplikácie pre Linux sa vyskytla chyba</translation> @@ -221,6 +223,7 @@ <translation id="2943503720238418293">Použite kratší názov</translation> <translation id="2949781154072577687">Disk <ph name="DRIVE_NAME" /> sa formátuje...</translation> <translation id="2951236788251446349">Medúza</translation> +<translation id="2958458230122209142">Neodstatok priestoru, zostáva <ph name="REMAINING_PERCENTAGE" /> % z vášho osobného priestoru <ph name="TOTAL_SPACE" />.</translation> <translation id="2977940621473452797">Tento súbor je určený pre počítač so softvérom Macintosh. Nie je kompatibilný s vaším zariadením so systémom Chrome OS. Nájdite vhodnú náhradnú aplikáciu v Internetovom obchode Chrome.</translation> <translation id="2984337792991268709">Dnes o <ph name="TODAY_DAYTIME" /></translation> <translation id="2994320653639462337">Obnovujú sa položky (<ph name="COUNT" />)…</translation> @@ -342,7 +345,6 @@ <translation id="3971140002794351170">Stiahnite si mobilný profil, sieť <ph name="NETWORK_INDEX" /> z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Anglická (UK) klávesnica</translation> <translation id="3975895378829046965">Bengálska fonetická klávesnica</translation> -<translation id="3991446849494482687">Deaktivuje sa aj nastavenie zámky SIM karty v zariadení.</translation> <translation id="4002066346123236978">Názov</translation> <translation id="4017788180641807848">Anglická (US) klávesnica s rozložením Workman</translation> <translation id="4040753847560036377">Nesprávny kód PUK</translation> @@ -670,6 +672,7 @@ <translation id="6823166707458800069">Všetky súbory uložené v tomto priečinku sa automaticky zálohujú online.</translation> <translation id="6825883775269213504">Ruština</translation> <translation id="6847101934483209767">Položka <ph name="ENTRY_NAME" /> bola odstránená z výberu.</translation> +<translation id="6848194403851638089">Organizácia <ph name="ORGANIZATION_NAME" /> vyčerpala všetok svoj priestor v službe Google Workspace.</translation> <translation id="6856459657722366306"><ph name="NETWORK_INDEX" />. sieť z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, <ph name="CONNECTION_STATUS" />, intenzita signálu <ph name="SIGNAL_STRENGTH" /> %, podrobnosti</translation> <translation id="6861394552169064235">Perzská klávesnica</translation> <translation id="6862635236584086457">Všetky súbory uložené v tomto priečinku sa automaticky zálohujú online</translation> @@ -701,6 +704,7 @@ <translation id="6989942356279143254">Švédska klávesnica</translation> <translation id="6990081529015358884">Nemáte dostatok miesta</translation> <translation id="6998711733709403587">Počet vybratých priečinkov: <ph name="SELCTED_FOLDERS_COUNT" /></translation> +<translation id="7008426324576352165">Vaša organizácia vyžaduje na dokončenie nahrávania viac priestoru.</translation> <translation id="7012943028104619157"><ph name="ROOT_TITLE" /> (<ph name="ROOT_SUMMARY" />)</translation> <translation id="7014174261166285193">Inštalácia zlyhala.</translation> <translation id="7031639531908619281">Turecká klávesnica</translation> @@ -934,11 +938,13 @@ <translation id="8919081441417203123">Dánčina</translation> <translation id="8965697826696209160">Nedostatok miesta</translation> <translation id="8997962250644902079">Čínska klávesnica Pchin-jin (tradičná)</translation> +<translation id="8998871447376656508">Na Disku Google nie je dostatok voľného priestoru na dokončenie nahrávania.</translation> <translation id="9003940392834790328"><ph name="NETWORK_INDEX" />. sieť z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, sila signálu <ph name="SIGNAL_STRENGTH" /> %, ovládané správcom, podrobnosti</translation> <translation id="9017798300203431059">Ruská fonetická klávesnica</translation> <translation id="9034924485347205037">Súbory systému Linux</translation> <translation id="9035012421917565900">Položky sa nedajú presunúť späť do cieľa <ph name="DESTINATION_NAME" />, takže túto akciu nebude možné vrátiť späť.</translation> <translation id="9035689366572880647">Zadajte aktuálny kód PIN</translation> +<translation id="9037777873893411148">* Priestor organizácie je plný.</translation> <translation id="9038620279323455325">Súbor s názvom <ph name="FILE_NAME" /> už existuje. Vyberte iný názov.</translation> <translation id="9046895021617826162">Zlyhanie pripojenia</translation> <translation id="9065512565307033593">Ak sa vám nepodarí overiť, váš prístup k sieti bude zakázaný.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sl.xtb b/ui/chromeos/translations/ui_chromeos_strings_sl.xtb index 3b59ca9..8dff2b2 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sl.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sl.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Profil za prenos v mobilni napravi, omrežje <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">angleščina (Združeno kraljestvo)</translation> <translation id="3975895378829046965">bengalščina (fonetična)</translation> -<translation id="3991446849494482687">S tem boste onemogočili tudi nastavitev zaklepanja kartice SIM v napravi.</translation> <translation id="4002066346123236978">Naslov</translation> <translation id="4017788180641807848">angleščina (ZDA) s tipkovnico Workman</translation> <translation id="4040753847560036377">Napačna koda PUK</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sq.xtb b/ui/chromeos/translations/ui_chromeos_strings_sq.xtb index 4d5ba56..1255eef 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sq.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sq.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Shkarko profilin e celularit, rrjeti <ph name="NETWORK_INDEX" /> nga <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Anglisht (Mbretëria e Bashkuar)</translation> <translation id="3975895378829046965">Bengalisht fonetike</translation> -<translation id="3991446849494482687">Kjo do të çaktivizojë po ashtu cilësimet e "Kyçjes së kartës SIM" në pajisje.</translation> <translation id="4002066346123236978">Titulli</translation> <translation id="4017788180641807848">Anglisht (SHBA) me tastierën Workman</translation> <translation id="4040753847560036377">Kodi PUK i pasaktë</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sr-Latn.xtb b/ui/chromeos/translations/ui_chromeos_strings_sr-Latn.xtb index f8ccd4a..aa3e6f3 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sr-Latn.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sr-Latn.xtb
@@ -185,6 +185,7 @@ <translation id="2544853746127077729">Mreža je odbila sertifikat za potvrdu autentičnosti</translation> <translation id="255937426064304553">međunarodna američka</translation> <translation id="2563185590376525700">Žaba</translation> +<translation id="2570012981255377263">Nedavni fajlovi će se prikazivati ovde</translation> <translation id="2578394532502990878">fonetski tamilski</translation> <translation id="2579959351793446050">orija</translation> <translation id="2602810353103180630"><ph name="NETWORK_INDEX" />. mreža od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, jačina signala <ph name="SIGNAL_STRENGTH" />%, blokirao administrator, detalji</translation> @@ -345,7 +346,6 @@ <translation id="3971140002794351170">Preuzmite profil za mobilne uređaje, <ph name="NETWORK_INDEX" />. mreža od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">engleski (UK)</translation> <translation id="3975895378829046965">fonetski bengalski</translation> -<translation id="3991446849494482687">Time ćete onemogućiti i podešavanje zaključavanja SIM kartice na uređaju.</translation> <translation id="4002066346123236978">Naslov</translation> <translation id="4017788180641807848">engleski (SAD) sa tastaturom Workman</translation> <translation id="4040753847560036377">Netačan PUK</translation> @@ -548,6 +548,7 @@ <translation id="5625294776298156701">tamilski sa tastaturom Tamil99</translation> <translation id="5633226425545095130">Premeštanjem ove stavke delite je sa svima koji mogu da vide deljeni folder <ph name="DESTINATION_NAME" />.</translation> <translation id="5649768706273821470">Slušaj</translation> +<translation id="5665074015635552640">Nedavni video snimci će se prikazivati ovde</translation> <translation id="5669691691057771421">Unesite novi PIN</translation> <translation id="5678784840044122290">Linux aplikacija će biti dostupna na terminalu, a možda će prikazivati i ikonu u Pokretaču.</translation> <translation id="5686799162999241776"><ph name="BEGIN_BOLD" />Nije uspeo prekid veze sa arhivskim ili virtuelnim diskom<ph name="END_BOLD" /> @@ -692,6 +693,7 @@ Pronađene su datoteke (<ph name="FILE_COUNT" />)</translation> <translation id="6935521024859866267">Naopačke</translation> <translation id="6943836128787782965">HTTP get nije uspeo</translation> +<translation id="6945604978460872381">Nedavni dokumenti će se prikazivati ovde</translation> <translation id="6949408524333579394">transliteracija srpskog</translation> <translation id="6954309393500027528">Administrator je blokirao nalepljivanje ovog fajla</translation> <translation id="6960565108681981554">Nije aktivirano. Obratite se mobilnom operateru.</translation> @@ -739,6 +741,7 @@ <translation id="7295662345261934369">Delite sa drugima</translation> <translation id="7297443947353982503">Korisničko ime/lozinka je netačna ili EAP potvrda autentičnosti nije uspela</translation> <translation id="7309413087278791451">nemački (Belgija)</translation> +<translation id="7313374447885864533">Nedavni audio fajlovi će se prikazivati ovde</translation> <translation id="7339898014177206373">Novi prozor</translation> <translation id="7343393116438664539">vijetnamski (Telex)</translation> <translation id="7357762654218998920">Ovaj tip fajla nije podržan. <ph name="BEGIN_LINK_HELP" />Saznajte više<ph name="END_LINK_HELP" /> o otvaranju fajlova u Chrome OS-u.</translation> @@ -872,6 +875,7 @@ <translation id="8342318071240498787">Već postoji datoteka ili direktorijum sa istim nazivom.</translation> <translation id="8372369524088641025">Neispravna WEP šifra</translation> <translation id="8372852072747894550">grčki</translation> +<translation id="8384716930968677505">Nedavne slike će se prikazivati ovde</translation> <translation id="8386903983509584791">Skeniranje je završeno</translation> <translation id="8387733224523483503">Fajl <ph name="FILE_NAME" /> je izveden.</translation> <translation id="8395901698320285466">Dimenzije</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sr.xtb b/ui/chromeos/translations/ui_chromeos_strings_sr.xtb index ea23075..42febd4 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sr.xtb
@@ -185,6 +185,7 @@ <translation id="2544853746127077729">Мрежа је одбила сертификат за потврду аутентичности</translation> <translation id="255937426064304553">међународна америчка</translation> <translation id="2563185590376525700">Жаба</translation> +<translation id="2570012981255377263">Недавни фајлови ће се приказивати овде</translation> <translation id="2578394532502990878">фонетски тамилски</translation> <translation id="2579959351793446050">орија</translation> <translation id="2602810353103180630"><ph name="NETWORK_INDEX" />. мрежа од <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, јачина сигнала <ph name="SIGNAL_STRENGTH" />%, блокирао администратор, детаљи</translation> @@ -345,7 +346,6 @@ <translation id="3971140002794351170">Преузмите профил за мобилне уређаје, <ph name="NETWORK_INDEX" />. мрежа од <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">енглески (УК)</translation> <translation id="3975895378829046965">фонетски бенгалски</translation> -<translation id="3991446849494482687">Тиме ћете онемогућити и подешавање закључавања SIM картице на уређају.</translation> <translation id="4002066346123236978">Наслов</translation> <translation id="4017788180641807848">енглески (САД) са тастатуром Workman</translation> <translation id="4040753847560036377">Нетачан PUK</translation> @@ -548,6 +548,7 @@ <translation id="5625294776298156701">тамилски са тастатуром Tamil99</translation> <translation id="5633226425545095130">Премештањем ове ставке делите је са свима који могу да виде дељени фолдер <ph name="DESTINATION_NAME" />.</translation> <translation id="5649768706273821470">Слушај</translation> +<translation id="5665074015635552640">Недавни видео снимци ће се приказивати овде</translation> <translation id="5669691691057771421">Унесите нови PIN</translation> <translation id="5678784840044122290">Linux апликација ће бити доступна на терминалу, а можда ће приказивати и икону у Покретачу.</translation> <translation id="5686799162999241776"><ph name="BEGIN_BOLD" />Није успео прекид везе са архивским или виртуелним диском<ph name="END_BOLD" /> @@ -692,6 +693,7 @@ Пронађене су датотеке (<ph name="FILE_COUNT" />)</translation> <translation id="6935521024859866267">Наопачке</translation> <translation id="6943836128787782965">HTTP get није успео</translation> +<translation id="6945604978460872381">Недавни документи ће се приказивати овде</translation> <translation id="6949408524333579394">транслитерација српског</translation> <translation id="6954309393500027528">Администратор је блокирао налепљивање овог фајла</translation> <translation id="6960565108681981554">Није активирано. Обратите се мобилном оператеру.</translation> @@ -739,6 +741,7 @@ <translation id="7295662345261934369">Делите са другима</translation> <translation id="7297443947353982503">Корисничко име/лозинка је нетачна или EAP потврда аутентичности није успела</translation> <translation id="7309413087278791451">немачки (Белгија)</translation> +<translation id="7313374447885864533">Недавни аудио фајлови ће се приказивати овде</translation> <translation id="7339898014177206373">Нови прозор</translation> <translation id="7343393116438664539">вијетнамски (Telex)</translation> <translation id="7357762654218998920">Овај тип фајла није подржан. <ph name="BEGIN_LINK_HELP" />Сазнајте више<ph name="END_LINK_HELP" /> о отварању фајлова у Chrome ОС-у.</translation> @@ -872,6 +875,7 @@ <translation id="8342318071240498787">Већ постоји датотека или директоријум са истим називом.</translation> <translation id="8372369524088641025">Неисправна WEP шифра</translation> <translation id="8372852072747894550">грчки</translation> +<translation id="8384716930968677505">Недавне слике ће се приказивати овде</translation> <translation id="8386903983509584791">Скенирање је завршено</translation> <translation id="8387733224523483503">Фајл <ph name="FILE_NAME" /> је изведен.</translation> <translation id="8395901698320285466">Димензије</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sv.xtb b/ui/chromeos/translations/ui_chromeos_strings_sv.xtb index 37d3321..e4a3b5bf 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sv.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sv.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Ladda ned mobilprofil, Nätverk <ph name="NETWORK_INDEX" /> av <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">engelska (Storbritannien)</translation> <translation id="3975895378829046965">bengali, fonetiskt</translation> -<translation id="3991446849494482687">Det här inaktiverar även låsinställningen för SIM-kort på enheten.</translation> <translation id="4002066346123236978">Titel</translation> <translation id="4017788180641807848">engelska (USA) med Workman-tangentbord</translation> <translation id="4040753847560036377">Fel PUK-kod</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sw.xtb b/ui/chromeos/translations/ui_chromeos_strings_sw.xtb index 81cfb30..f6550e92 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sw.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sw.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Pakua maelezo ya eSIM ya vifaa vya mkononi, Mtandao <ph name="NETWORK_INDEX" /> kati ya <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Kiingereza (Uingereza)</translation> <translation id="3975895378829046965">Fonetiki ya Kibangla</translation> -<translation id="3991446849494482687">Hali hii pia itazima mipangilio ya kufunga SIM kwenye kifaa.</translation> <translation id="4002066346123236978">Kichwa</translation> <translation id="4017788180641807848">Kiingereza (Marekani) kwenye kibodi ya Workman</translation> <translation id="4040753847560036377">PUK si sahihi</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb index 423dfb4..09ab5d4 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">இந்த மொபைல் சுயவிவரத்தைப் பதிவிறக்கும்: நெட்வொர்க் <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">ஆங்கிலம் (யுகே)</translation> <translation id="3975895378829046965">வங்காளம் ஒலிப்புமுறை</translation> -<translation id="3991446849494482687">இது இந்தச் சாதனத்தில் சிம் பூட்டு அமைப்பையும் முடக்கும்.</translation> <translation id="4002066346123236978">தலைப்பு</translation> <translation id="4017788180641807848">ஆங்கிலம் (யூஎஸ்) - வொர்க்மேன் கீபோர்டு</translation> <translation id="4040753847560036377">தவறான PUK</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_te.xtb b/ui/chromeos/translations/ui_chromeos_strings_te.xtb index 32acb69..b9c87e8 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_te.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_te.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170"><ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /> నుండి <ph name="NETWORK_COUNT" />లో <ph name="NETWORK_INDEX" />వ నెట్వర్క్ మొబైల్ ప్రొఫైల్ను డౌన్లోడ్ చేయండి</translation> <translation id="3973925058222872294">ఇంగ్లీష్ (UK)</translation> <translation id="3975895378829046965">బంగ్లా ఫొనెటిక్</translation> -<translation id="3991446849494482687">పరికరంలోని SIM లాక్ సెట్టింగ్ను కూడా ఇది డిజేబుల్ చేస్తుంది.</translation> <translation id="4002066346123236978">శీర్షిక</translation> <translation id="4017788180641807848">వర్క్మాన్ కీబోర్డ్తో ఇంగ్లీష్ (US)</translation> <translation id="4040753847560036377">తప్పు PUK</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_th.xtb b/ui/chromeos/translations/ui_chromeos_strings_th.xtb index 3811ec9f..2f1db5a 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_th.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_th.xtb
@@ -138,6 +138,7 @@ <translation id="2148716181193084225">วันนี้</translation> <translation id="2163152940313951844">อักขระไม่ถูกต้อง: <ph name="CHARACTER_NAME" /></translation> <translation id="2184934335987813305">โปรตุเกสด้วยแป้นพิมพ์พีซีสหรัฐฯ แบบสากล</translation> +<translation id="2193661397560634290">ใช้ไป <ph name="SPACE_USED" /></translation> <translation id="2198315389084035571">จีนตัวย่อ</translation> <translation id="22085916256174561">เกาหลี</translation> <translation id="2208919847696382164">ติดตั้งด้วย Linux</translation> @@ -184,6 +185,7 @@ <translation id="2544853746127077729">ใบรับรองการตรวจสอบสิทธิ์ได้รับการปฏิเสธจากเครือข่าย</translation> <translation id="255937426064304553">สหรัฐอเมริกาสากล</translation> <translation id="2563185590376525700">กบ</translation> +<translation id="2570012981255377263">ไฟล์ล่าสุดจะปรากฏที่นี่</translation> <translation id="2578394532502990878">ทมิฬ (ตามการออกเสียง)</translation> <translation id="2579959351793446050">โอเดีย</translation> <translation id="2602810353103180630">เครือข่ายที่ <ph name="NETWORK_INDEX" /> จาก <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, ความแรงสัญญาณ <ph name="SIGNAL_STRENGTH" />%, ถูกผู้ดูแลระบบบล็อก, รายละเอียด</translation> @@ -201,6 +203,7 @@ <translation id="2724954091494693138">ตุรกี (F-keyboard)</translation> <translation id="2732839045120506979">เวียดนาม (VNI)</translation> <translation id="2735623501230989521">ให้สิทธิ์ Parallels Desktop เข้าถึงไฟล์ในโฟลเดอร์ "<ph name="FOLDER_NAME" />"</translation> +<translation id="2764206540577097904">คุณใช้พื้นที่เก็บข้อมูลส่วนบุคคลใน Google Workspace หมดแล้ว</translation> <translation id="2771816809568414714">ชีส</translation> <translation id="2781645665747935084">เบลเยียม</translation> <translation id="2782104745158847185">เกิดข้อผิดพลาดในการติดตั้งแอปพลิเคชัน Linux</translation> @@ -221,6 +224,7 @@ <translation id="2943503720238418293">ใช้ชื่อที่สั้นลง</translation> <translation id="2949781154072577687">กำลังจัดรูปแบบ <ph name="DRIVE_NAME" />...</translation> <translation id="2951236788251446349">แมงกะพรุน</translation> +<translation id="2958458230122209142">มีพื้นที่น้อย เหลือ <ph name="REMAINING_PERCENTAGE" />% จากพื้นที่เก็บข้อมูลส่วนบุคคล <ph name="TOTAL_SPACE" /></translation> <translation id="2977940621473452797">ไฟล์นี้ออกแบบมาสำหรับคอมพิวเตอร์ที่ใช้ซอฟต์แวร์ Macintosh จึงไม่สามารถใช้ร่วมกับอุปกรณ์ของคุณซึ่งใช้ Chrome OS โปรดค้นหาแอปทดแทนที่เหมาะสมใน Chrome เว็บสโตร์</translation> <translation id="2984337792991268709">วันนี้ <ph name="TODAY_DAYTIME" /></translation> <translation id="2994320653639462337">กำลังคืนค่า <ph name="COUNT" /> รายการ...</translation> @@ -342,7 +346,6 @@ <translation id="3971140002794351170">ดาวน์โหลดโปรไฟล์อุปกรณ์เคลื่อนที่, เครือข่าย <ph name="NETWORK_INDEX" /> จาก <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">อังกฤษ (สหราชอาณาจักร)</translation> <translation id="3975895378829046965">บังกลา (ตามการออกเสียง)</translation> -<translation id="3991446849494482687">การดำเนินการนี้จะปิดใช้การตั้งค่าการล็อกซิมในอุปกรณ์ด้วย</translation> <translation id="4002066346123236978">ชื่อ</translation> <translation id="4017788180641807848">อังกฤษ (สหรัฐฯ) ด้วยแป้นพิมพ์ Workman</translation> <translation id="4040753847560036377">PUK ไม่ถูกต้อง</translation> @@ -545,6 +548,7 @@ <translation id="5625294776298156701">ทมิฬด้วยแป้นพิมพ์ Tamil99</translation> <translation id="5633226425545095130">การย้ายรายการนี้จะเป็นการแชร์กับทุกคนที่ดูโฟลเดอร์ที่แชร์ "<ph name="DESTINATION_NAME" />" ได้</translation> <translation id="5649768706273821470">ฟัง</translation> +<translation id="5665074015635552640">วิดีโอล่าสุดจะปรากฏที่นี่</translation> <translation id="5669691691057771421">ป้อน PIN ใหม่</translation> <translation id="5678784840044122290">แอปพลิเคชัน Linux จะพร้อมให้ใช้งานในเทอร์มินัลของคุณและอาจแสดงไอคอนใน Launcher ด้วย</translation> <translation id="5686799162999241776"><ph name="BEGIN_BOLD" />ยกเลิกการเชื่อมต่อจากที่เก็บถาวรหรือดิสก์เสมือนไม่สำเร็จ<ph name="END_BOLD" /> @@ -670,6 +674,7 @@ <translation id="6823166707458800069">ระบบจะสำรองข้อมูลไฟล์ทั้งหมดที่บันทึกไว้ในโฟลเดอร์นี้แบบออนไลน์โดยอัตโนมัติ</translation> <translation id="6825883775269213504">รัสเซีย</translation> <translation id="6847101934483209767">นำ <ph name="ENTRY_NAME" /> ออกจากรายการที่เลือกแล้ว</translation> +<translation id="6848194403851638089"><ph name="ORGANIZATION_NAME" /> ใช้พื้นที่เก็บข้อมูลใน Google Workspace หมดแล้ว</translation> <translation id="6856459657722366306">เครือข่ายที่ <ph name="NETWORK_INDEX" /> จาก <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, <ph name="CONNECTION_STATUS" />, ความแรงสัญญาณ <ph name="SIGNAL_STRENGTH" />%, รายละเอียด</translation> <translation id="6861394552169064235">เปอร์เซีย</translation> <translation id="6862635236584086457">ไฟล์ทั้งหมดที่บันทึกไว้ในโฟลเดอร์นี้จะถูกสำรองข้อมูลแบบออนไลน์โดยอัตโนมัติ</translation> @@ -688,6 +693,7 @@ พบ <ph name="FILE_COUNT" /></translation> <translation id="6935521024859866267">กลับหัว</translation> <translation id="6943836128787782965">การรับ HTTP ล้มเหลว</translation> +<translation id="6945604978460872381">เอกสารล่าสุดจะปรากฏที่นี่</translation> <translation id="6949408524333579394">เซอร์เบีย (การทับศัพท์)</translation> <translation id="6954309393500027528">ผู้ดูแลระบบได้บล็อกการวางไฟล์นี้</translation> <translation id="6960565108681981554">ไม่ได้เปิดการใช้งาน โปรดติดต่อผู้ให้บริการเครือข่าย</translation> @@ -701,6 +707,7 @@ <translation id="6989942356279143254">สวีเดน</translation> <translation id="6990081529015358884">คุณไม่มีพื้นที่เหลือแล้ว</translation> <translation id="6998711733709403587">เลือก <ph name="SELCTED_FOLDERS_COUNT" /> โฟลเดอร์</translation> +<translation id="7008426324576352165">องค์กรต้องมีพื้นที่เก็บข้อมูลมากกว่านี้เพื่ออัปโหลดให้เสร็จสิ้น</translation> <translation id="7012943028104619157"><ph name="ROOT_TITLE" /> (<ph name="ROOT_SUMMARY" />)</translation> <translation id="7014174261166285193">การติดตั้งล้มเหลว</translation> <translation id="7031639531908619281">ตุรกี</translation> @@ -734,6 +741,7 @@ <translation id="7295662345261934369">แชร์กับคนอื่นๆ</translation> <translation id="7297443947353982503">ชื่อผู้ใช้/รหัสผ่านไม่ถูกต้องหรือการตรวจสอบสิทธิ์ EAP ล้มเหลว</translation> <translation id="7309413087278791451">เยอรมัน (เบลเยียม)</translation> +<translation id="7313374447885864533">ไฟล์เสียงล่าสุดจะปรากฏที่นี่</translation> <translation id="7339898014177206373">หน้าต่างใหม่</translation> <translation id="7343393116438664539">เวียดนาม (Telex)</translation> <translation id="7357762654218998920">ไม่รองรับไฟล์ประเภทนี้ <ph name="BEGIN_LINK_HELP" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK_HELP" />เกี่ยวกับการเปิดไฟล์ใน Chrome OS</translation> @@ -867,6 +875,7 @@ <translation id="8342318071240498787">มีไฟล์หรือไดเรกทอรีที่มีชื่อเดียวกันนี้อยู่แล้ว</translation> <translation id="8372369524088641025">คีย์ WEP ไม่ถูกต้อง</translation> <translation id="8372852072747894550">กรีก</translation> +<translation id="8384716930968677505">รูปภาพล่าสุดจะปรากฏที่นี่</translation> <translation id="8386903983509584791">สแกนเสร็จแล้ว</translation> <translation id="8387733224523483503">แตกไฟล์ <ph name="FILE_NAME" /> แล้ว</translation> <translation id="8395901698320285466">มิติข้อมูล</translation> @@ -934,11 +943,13 @@ <translation id="8919081441417203123">เดนมาร์ก</translation> <translation id="8965697826696209160">พื้นที่ไม่เพียงพอ</translation> <translation id="8997962250644902079">พินอินภาษาจีน (ตัวเต็ม)</translation> +<translation id="8998871447376656508">มีพื้นที่ว่างใน Google ไดรฟ์ไม่เพียงพอที่จะอัปโหลดให้เสร็จสิ้น</translation> <translation id="9003940392834790328">เครือข่ายที่ <ph name="NETWORK_INDEX" /> จาก <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, ความแรงสัญญาณ <ph name="SIGNAL_STRENGTH" />%, จัดการโดยผู้ดูแลระบบ, รายละเอียด</translation> <translation id="9017798300203431059">การออกเสียงภาษารัสเซีย</translation> <translation id="9034924485347205037">ไฟล์ Linux</translation> <translation id="9035012421917565900">ไม่สามารถย้ายรายการกลับไปที่ "<ph name="DESTINATION_NAME" />" คุณจึงไม่สามารถเลิกทำการดำเนินการนี้</translation> <translation id="9035689366572880647">ป้อน PIN ปัจจุบัน</translation> +<translation id="9037777873893411148">*พื้นที่เก็บข้อมูลขององค์กรเต็มแล้ว</translation> <translation id="9038620279323455325">มีไฟล์ชื่อ "<ph name="FILE_NAME" />" อยู่แล้ว โปรดเลือกชื่ออื่น</translation> <translation id="9046895021617826162">การเชื่อมต่อล้มเหลว</translation> <translation id="9065512565307033593">หากไม่ยืนยัน ระบบจะปิดใช้สิทธิ์เข้าถึงเครือข่ายของคุณ</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_tr.xtb b/ui/chromeos/translations/ui_chromeos_strings_tr.xtb index 8e905b5..a4003bd3 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_tr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_tr.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Mobil profili indir, <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /> ağı</translation> <translation id="3973925058222872294">İngilizce (BK)</translation> <translation id="3975895378829046965">Bengalce Fonetik</translation> -<translation id="3991446849494482687">Bu seçenek ayrıca cihazdaki SIM Kilidi ayarını devre dışı bırakır.</translation> <translation id="4002066346123236978">Başlık</translation> <translation id="4017788180641807848">Workman klavye ile İngilizce (ABD)</translation> <translation id="4040753847560036377">Yanlış PUK</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_uk.xtb b/ui/chromeos/translations/ui_chromeos_strings_uk.xtb index ce3af1a..4662f1b4 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_uk.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_uk.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Завантажити мобільний профіль, мережа <ph name="NETWORK_INDEX" /> з <ph name="NETWORK_COUNT" />, "<ph name="NETWORK_NAME" />", <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Англійська (Велика Британія)</translation> <translation id="3975895378829046965">Бенгальська, фонетична розкладка</translation> -<translation id="3991446849494482687">Також буде вимкнено параметр блокування SIM-карти на пристрої.</translation> <translation id="4002066346123236978">Назва</translation> <translation id="4017788180641807848">Англійська (США), розкладка Workman</translation> <translation id="4040753847560036377">Неправильний PUK-код</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ur.xtb b/ui/chromeos/translations/ui_chromeos_strings_ur.xtb index a7ce5172..512b9a5f 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ur.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ur.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">موبائل پروفائل ڈاؤن لوڈ کریں، نیٹ ورک <ph name="NETWORK_INDEX" /> از <ph name="NETWORK_COUNT" />، <ph name="NETWORK_NAME" />، <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">انگریزی (برطانیہ)</translation> <translation id="3975895378829046965">بنگالی فونیٹک</translation> -<translation id="3991446849494482687">یہ آلہ پر SIM لاک کی ترتیب کو بھی غیر فعال کر دے گا۔</translation> <translation id="4002066346123236978">عنوان</translation> <translation id="4017788180641807848">Workman کی بورڈ کے ساتھ انگریزی (امریکہ)</translation> <translation id="4040753847560036377">غلط PUK</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_uz.xtb b/ui/chromeos/translations/ui_chromeos_strings_uz.xtb index 6fc3722..17bbd896 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_uz.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_uz.xtb
@@ -184,6 +184,7 @@ <translation id="2544853746127077729">Haqiqiylikni tekshirish sertifikati tarmoq tomonidan rad etildi</translation> <translation id="255937426064304553">AQSH (xalqaro)</translation> <translation id="2563185590376525700">Qurbaqa</translation> +<translation id="2570012981255377263">Oxirgi fayllar shu yerda chiqadi</translation> <translation id="2578394532502990878">Tamil (fonetik)</translation> <translation id="2579959351793446050">Oriya</translation> <translation id="2602810353103180630">Tarmoq: <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Signal darajasi: <ph name="SIGNAL_STRENGTH" />%, Administrator tomonidan bloklangan, Batafsil</translation> @@ -342,7 +343,6 @@ <translation id="3971140002794351170">Mobil profil, tarmoq <ph name="NETWORK_INDEX" /><ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /> kabilarni yuklab olish</translation> <translation id="3973925058222872294">Ingliz (Buyuk Britaniya)</translation> <translation id="3975895378829046965">Bangla (Fonetik)</translation> -<translation id="3991446849494482687">Bunda qurilmadagi SIM kartani qulflash sozlamasi ham faolsizlantiriladi.</translation> <translation id="4002066346123236978">Nomi</translation> <translation id="4017788180641807848">Ingliz (AQSH) va Workman klaviaturasi</translation> <translation id="4040753847560036377">PUK kod xato</translation> @@ -544,6 +544,7 @@ <translation id="5625294776298156701">Tamil (Tamil99 klaviaturasi)</translation> <translation id="5633226425545095130">Bu fayl koʻchirilsa, u <ph name="DESTINATION_NAME" /> jildiga ruxsati bor barcha foydalanuvchilarga ulashiladi.</translation> <translation id="5649768706273821470">Tinglash</translation> +<translation id="5665074015635552640">Oxirgi videolar shu yerda chiqadi</translation> <translation id="5669691691057771421">Yangi PIN kodni kiriting</translation> <translation id="5678784840044122290">Linux ilovasi terminal ichida ham ishlaydi, shuningdek, Launcherda ham ikonkasi chiqadi.</translation> <translation id="5686799162999241776"><ph name="BEGIN_BOLD" />Arxiv yoki virtual disk uzilmadi<ph name="END_BOLD" /> @@ -687,6 +688,7 @@ <ph name="FILE_COUNT" /> topildi</translation> <translation id="6935521024859866267">Oyog‘i osmonda</translation> <translation id="6943836128787782965">HTTP GET so‘rovida xatolik yuz berdi</translation> +<translation id="6945604978460872381">Oxirgi hujjatlar shu yerda chiqadi</translation> <translation id="6949408524333579394">Serb (transliteratsiya)</translation> <translation id="6954309393500027528">Bu faylning joylanishi administrator tomonidan bloklandi</translation> <translation id="6960565108681981554">Faollashtirilmagan. Aloqa operatoringizga murojaat qiling.</translation> @@ -733,6 +735,7 @@ <translation id="7295662345261934369">Boshqalar bilan ulashish</translation> <translation id="7297443947353982503">Foydalanuvchi nomi/parol noto‘g‘ri yoki EAP protokoli bo‘yicha haqiqiylikni tekshirish amalga oshmadi</translation> <translation id="7309413087278791451">Nemis (Belgiya)</translation> +<translation id="7313374447885864533">Oxirgi audio fayllar shu yerda chiqadi</translation> <translation id="7339898014177206373">Yangi oyna</translation> <translation id="7343393116438664539">Vyetnam (Telex)</translation> <translation id="7357762654218998920">Bunday fayl turi ochilmaydi. ChromeOS tizimida fayllarni ochish haqida <ph name="BEGIN_LINK_HELP" />batafsil<ph name="END_LINK_HELP" />.</translation> @@ -866,6 +869,7 @@ <translation id="8342318071240498787">Shu nomli fayl yoki katalog avvaldan mavjud.</translation> <translation id="8372369524088641025">WEP kaliti yaroqsiz</translation> <translation id="8372852072747894550">Grek</translation> +<translation id="8384716930968677505">Oxirgi rasmlar shu yerda chiqadi</translation> <translation id="8386903983509584791">Tarmoq tekshirildi</translation> <translation id="8387733224523483503"><ph name="FILE_NAME" /> arxivdan chiqarildi.</translation> <translation id="8395901698320285466">O‘lchamlar</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_vi.xtb b/ui/chromeos/translations/ui_chromeos_strings_vi.xtb index a89a4e9..6a35044 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_vi.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_vi.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Tải hồ sơ mạng di động xuống, Mạng <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Tiếng Anh (Anh)</translation> <translation id="3975895378829046965">Tiếng Bangla (phiên âm)</translation> -<translation id="3991446849494482687">Thao tác này cũng sẽ tắt chế độ Khoá SIM trên thiết bị.</translation> <translation id="4002066346123236978">Tiêu đề</translation> <translation id="4017788180641807848">Tiếng Anh (Mỹ) bằng bàn phím Workman</translation> <translation id="4040753847560036377">Mã PUK không chính xác</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb b/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb index 4387ffd..5f1486c 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">下载移动网络配置文件,第 <ph name="NETWORK_INDEX" /> 个网络(共 <ph name="NETWORK_COUNT" /> 个),网络名称为“<ph name="NETWORK_NAME" />”,网络服务提供商为“<ph name="NETWORK_PROVIDER_NAME" />”</translation> <translation id="3973925058222872294">英语(英国)</translation> <translation id="3975895378829046965">孟加拉语注音</translation> -<translation id="3991446849494482687">这样做也会停用设备上的 SIM 卡锁定设置。</translation> <translation id="4002066346123236978">标题</translation> <translation id="4017788180641807848">英语(美国)Workman 键盘</translation> <translation id="4040753847560036377">PUK 不正确</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb b/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb index 79f5ede..29d384c 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">下載流動裝置設定檔,<ph name="NETWORK_COUNT" /> 個網絡之中嘅第 <ph name="NETWORK_INDEX" /> 個,<ph name="NETWORK_NAME" />,<ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">英文 (英國)</translation> <translation id="3975895378829046965">孟加拉文 (拼音)</translation> -<translation id="3991446849494482687">此操作亦會停用裝置上的「SIM 卡鎖定」設定。</translation> <translation id="4002066346123236978">標題</translation> <translation id="4017788180641807848">英文 (美國),Workman 鍵盤</translation> <translation id="4040753847560036377">PUK 不正確</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb b/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb index 4c11b25..5948218 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">下載行動裝置設定檔,<ph name="NETWORK_COUNT" /> 個網路中的第 <ph name="NETWORK_INDEX" /> 個,名稱為 <ph name="NETWORK_NAME" />,供應商為 <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">英文 (英國)</translation> <translation id="3975895378829046965">孟加拉文 (拼音)</translation> -<translation id="3991446849494482687">這項操作也會停用裝置上的 SIM 卡鎖定設定。</translation> <translation id="4002066346123236978">標題</translation> <translation id="4017788180641807848">英文 (美國) 搭配 Workman 鍵盤</translation> <translation id="4040753847560036377">PUK 不正確</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zu.xtb b/ui/chromeos/translations/ui_chromeos_strings_zu.xtb index 71836c2..2f188023 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_zu.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_zu.xtb
@@ -342,7 +342,6 @@ <translation id="3971140002794351170">Landa iphrofayela yeselula, Inethiwekhi engu-<ph name="NETWORK_INDEX" /> kwezingu-<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">English (UK)</translation> <translation id="3975895378829046965">I-Bangla Phonetic</translation> -<translation id="3991446849494482687">Lokhu kuzophinde kukhubaze isethingi Yokukhiya I-SIM kudivayisi.</translation> <translation id="4002066346123236978">Isihloko</translation> <translation id="4017788180641807848">English (US) enekhibhodi ye-Workman</translation> <translation id="4040753847560036377">I-PUK engalungile</translation>
diff --git a/ui/display/manager/json_converter.cc b/ui/display/manager/json_converter.cc index 54a670a..2b2e562 100644 --- a/ui/display/manager/json_converter.cc +++ b/ui/display/manager/json_converter.cc
@@ -185,23 +185,24 @@ if (!value->is_dict()) return false; - value->SetBoolKey(kDefaultUnifiedKey, layout.default_unified); - value->SetStringKey(kPrimaryIdKey, base::NumberToString(layout.primary_id)); + base::Value::Dict& dict = value->GetDict(); - base::Value::ListStorage placement_list; + dict.Set(kDefaultUnifiedKey, layout.default_unified); + dict.Set(kPrimaryIdKey, base::NumberToString(layout.primary_id)); + + base::Value::List placement_list; for (const auto& placement : layout.placement_list) { - base::Value placement_value(base::Value::Type::DICTIONARY); - placement_value.SetStringKey( - kPositionKey, DisplayPlacement::PositionToString(placement.position)); - placement_value.SetIntKey(kOffsetKey, placement.offset); - placement_value.SetStringKey(kDisplayPlacementDisplayIdKey, - base::NumberToString(placement.display_id)); - placement_value.SetStringKey( - kDisplayPlacementParentDisplayIdKey, - base::NumberToString(placement.parent_display_id)); - placement_list.push_back(std::move(placement_value)); + base::Value::Dict placement_value; + placement_value.Set(kPositionKey, + DisplayPlacement::PositionToString(placement.position)); + placement_value.Set(kOffsetKey, placement.offset); + placement_value.Set(kDisplayPlacementDisplayIdKey, + base::NumberToString(placement.display_id)); + placement_value.Set(kDisplayPlacementParentDisplayIdKey, + base::NumberToString(placement.parent_display_id)); + placement_list.Append(std::move(placement_value)); } - value->SetKey(kDisplayPlacementKey, base::Value(std::move(placement_list))); + dict.Set(kDisplayPlacementKey, std::move(placement_list)); return true; }
diff --git a/ui/display/screen.cc b/ui/display/screen.cc index b972388..484c27a 100644 --- a/ui/display/screen.cc +++ b/ui/display/screen.cc
@@ -152,9 +152,9 @@ return {}; } -std::vector<base::Value> Screen::GetGpuExtraInfo( +base::Value::List Screen::GetGpuExtraInfo( const gfx::GpuExtraInfo& gpu_extra_info) { - return std::vector<base::Value>(); + return base::Value::List(); } void Screen::SetScopedDisplayForNewWindows(int64_t display_id) {
diff --git a/ui/display/screen.h b/ui/display/screen.h index c4b69c7..e4aff81 100644 --- a/ui/display/screen.h +++ b/ui/display/screen.h
@@ -197,7 +197,7 @@ // Returns human readable description of the window manager, desktop, and // other system properties related to the compositing. - virtual std::vector<base::Value> GetGpuExtraInfo( + virtual base::Value::List GetGpuExtraInfo( const gfx::GpuExtraInfo& gpu_extra_info); protected:
diff --git a/ui/events/event.h b/ui/events/event.h index ed2c6f8a..c4a1976 100644 --- a/ui/events/event.h +++ b/ui/events/event.h
@@ -226,7 +226,7 @@ bool IsLocatedEvent() const { return IsMouseEvent() || IsScrollEvent() || IsTouchEvent() || - IsGestureEvent(); + IsGestureEvent() || type_ == ET_DROP_TARGET_EVENT; } // Convenience methods to cast |this| to a CancelModeEvent.
diff --git a/ui/lottie/animation.cc b/ui/lottie/animation.cc index dff6b09..62a2595 100644 --- a/ui/lottie/animation.cc +++ b/ui/lottie/animation.cc
@@ -264,6 +264,9 @@ std::ref(all_frame_data))); canvas->DrawSkottie(skottie(), gfx::Rect(size), t, std::move(all_frame_data), color_map_, text_map_); + for (AnimationObserver& obs : observers_) { + obs.AnimationFramePainted(this, t); + } } void Animation::SetPlaybackSpeed(float playback_speed) {
diff --git a/ui/lottie/animation_observer.h b/ui/lottie/animation_observer.h index 7a03e70..7eb7416 100644 --- a/ui/lottie/animation_observer.h +++ b/ui/lottie/animation_observer.h
@@ -25,6 +25,13 @@ // Called when the animation has successfully resumed. virtual void AnimationResuming(const Animation* animation) {} + // Called after each animation frame is painted. Note this is not synonymous + // with the frame ultimately being rendered on screen; it only means the frame + // has been submitted to the rest of the graphics pipeline for rendering. + // + // |t| is the normalized timestamp in range [0, 1] of the frame just painted. + virtual void AnimationFramePainted(const Animation* animation, float t) {} + protected: ~AnimationObserver() override = default; };
diff --git a/ui/lottie/animation_unittest.cc b/ui/lottie/animation_unittest.cc index 9427a97..53f40a7 100644 --- a/ui/lottie/animation_unittest.cc +++ b/ui/lottie/animation_unittest.cc
@@ -103,6 +103,10 @@ animation_resuming_ = true; } + void AnimationFramePainted(const Animation* animation, float t) override { + last_frame_painted_ = t; + } + void Reset() { animation_cycle_ended_ = false; animation_will_start_playing_ = false; @@ -114,12 +118,16 @@ return animation_will_start_playing_; } bool animation_resuming() const { return animation_resuming_; } + const absl::optional<float>& last_frame_painted() const { + return last_frame_painted_; + } private: base::ScopedObservation<Animation, AnimationObserver> observation_{this}; bool animation_cycle_ended_ = false; bool animation_will_start_playing_ = false; bool animation_resuming_ = false; + absl::optional<float> last_frame_painted_; }; class TestSkottieFrameDataProvider : public cc::SkottieFrameDataProvider { @@ -942,6 +950,39 @@ IsAllSameColor(SK_ColorBLUE, canvas.GetBitmap()); } +TEST_F(AnimationTest, NotifiesObserverFramePainted) { + TestAnimationObserver observer(animation_.get()); + + AdvanceClock(base::Milliseconds(300)); + + animation_->Start(Animation::Style::kLoop); + + animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize()); + ASSERT_TRUE(observer.last_frame_painted()); + EXPECT_EQ(*observer.last_frame_painted(), 0.f); + + AdvanceClock(kAnimationDuration / 4); + animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize()); + ASSERT_TRUE(observer.last_frame_painted()); + EXPECT_FLOAT_EQ(*observer.last_frame_painted(), 0.25f); + + AdvanceClock(kAnimationDuration / 4); + animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize()); + ASSERT_TRUE(observer.last_frame_painted()); + EXPECT_FLOAT_EQ(*observer.last_frame_painted(), 0.5f); + + AdvanceClock(kAnimationDuration / 2 - base::Milliseconds(1)); + animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize()); + ASSERT_TRUE(observer.last_frame_painted()); + EXPECT_NEAR(*observer.last_frame_painted(), 1.f, 1E-3); + + AdvanceClock(base::Milliseconds(2)); + animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize()); + ASSERT_TRUE(observer.last_frame_painted()); + EXPECT_FLOAT_EQ(*observer.last_frame_painted(), + base::Milliseconds(1) / kAnimationDuration); +} + TEST_F(AnimationTest, SetsPlaybackSpeed) { TestAnimationObserver observer(animation_.get());
diff --git a/ui/ozone/platform/wayland/BUILD.gn b/ui/ozone/platform/wayland/BUILD.gn index b386d96..1bb3bb9 100644 --- a/ui/ozone/platform/wayland/BUILD.gn +++ b/ui/ozone/platform/wayland/BUILD.gn
@@ -171,6 +171,16 @@ "host/wayland_zaura_output.h", "host/wayland_zaura_shell.cc", "host/wayland_zaura_shell.h", + "host/wayland_zcr_color_management_output.cc", + "host/wayland_zcr_color_management_output.h", + "host/wayland_zcr_color_management_surface.cc", + "host/wayland_zcr_color_management_surface.h", + "host/wayland_zcr_color_manager.cc", + "host/wayland_zcr_color_manager.h", + "host/wayland_zcr_color_space.cc", + "host/wayland_zcr_color_space.h", + "host/wayland_zcr_color_space_creator.cc", + "host/wayland_zcr_color_space_creator.h", "host/wayland_zcr_cursor_shapes.cc", "host/wayland_zcr_cursor_shapes.h", "host/wayland_zcr_touchpad_haptics.cc", @@ -230,6 +240,7 @@ "//build/config/linux/libdrm", "//components/crash/core/common:crash_key", "//components/exo/wayland/protocol:aura_shell_protocol", + "//components/exo/wayland/protocol:chrome_color_management_protocol", "//components/exo/wayland/protocol:overlay_prioritizer_protocol", "//components/exo/wayland/protocol:surface_augmenter_protocol", "//mojo/public/cpp/bindings", @@ -273,8 +284,11 @@ "//ui/base/dragdrop:types", "//ui/base/dragdrop/mojom", "//ui/base/ime/linux", + "//ui/base/wayland:color_manager_util", "//ui/base/wayland:wayland_client_input_types", + "//ui/display", "//ui/display/util:gpu_info_util", + "//ui/display/util:util", "//ui/events", "//ui/events:dom_keycode_converter", "//ui/events/devices",
diff --git a/ui/ozone/platform/wayland/common/wayland_object.cc b/ui/ozone/platform/wayland/common/wayland_object.cc index d5d45a7..4ae5ee8 100644 --- a/ui/ozone/platform/wayland/common/wayland_object.cc +++ b/ui/ozone/platform/wayland/common/wayland_object.cc
@@ -6,6 +6,7 @@ #include <alpha-compositing-unstable-v1-client-protocol.h> #include <aura-shell-client-protocol.h> +#include <chrome-color-management-client-protocol.h> #include <cursor-shapes-unstable-v1-client-protocol.h> #include <extended-drag-unstable-v1-client-protocol.h> #include <gtk-primary-selection-client-protocol.h> @@ -183,6 +184,11 @@ IMPLEMENT_WAYLAND_OBJECT_TRAITS(zaura_toplevel) IMPLEMENT_WAYLAND_OBJECT_TRAITS(zaura_popup) IMPLEMENT_WAYLAND_OBJECT_TRAITS(zcr_cursor_shapes_v1) +IMPLEMENT_WAYLAND_OBJECT_TRAITS(zcr_color_manager_v1) +IMPLEMENT_WAYLAND_OBJECT_TRAITS(zcr_color_management_output_v1) +IMPLEMENT_WAYLAND_OBJECT_TRAITS(zcr_color_management_surface_v1) +IMPLEMENT_WAYLAND_OBJECT_TRAITS(zcr_color_space_creator_v1) +IMPLEMENT_WAYLAND_OBJECT_TRAITS(zcr_color_space_v1) IMPLEMENT_WAYLAND_OBJECT_TRAITS(zcr_keyboard_extension_v1) IMPLEMENT_WAYLAND_OBJECT_TRAITS(zcr_extended_keyboard_v1) IMPLEMENT_WAYLAND_OBJECT_TRAITS(zcr_extended_drag_v1)
diff --git a/ui/ozone/platform/wayland/common/wayland_object.h b/ui/ozone/platform/wayland/common/wayland_object.h index 8d278bb..70c32c8 100644 --- a/ui/ozone/platform/wayland/common/wayland_object.h +++ b/ui/ozone/platform/wayland/common/wayland_object.h
@@ -154,6 +154,11 @@ DECLARE_WAYLAND_OBJECT_TRAITS(zaura_toplevel) DECLARE_WAYLAND_OBJECT_TRAITS(zaura_popup) DECLARE_WAYLAND_OBJECT_TRAITS(zcr_cursor_shapes_v1) +DECLARE_WAYLAND_OBJECT_TRAITS(zcr_color_manager_v1) +DECLARE_WAYLAND_OBJECT_TRAITS(zcr_color_management_output_v1) +DECLARE_WAYLAND_OBJECT_TRAITS(zcr_color_management_surface_v1) +DECLARE_WAYLAND_OBJECT_TRAITS(zcr_color_space_creator_v1) +DECLARE_WAYLAND_OBJECT_TRAITS(zcr_color_space_v1) DECLARE_WAYLAND_OBJECT_TRAITS(zcr_blending_v1) DECLARE_WAYLAND_OBJECT_TRAITS(zcr_alpha_compositing_v1) DECLARE_WAYLAND_OBJECT_TRAITS(zcr_keyboard_extension_v1)
diff --git a/ui/ozone/platform/wayland/host/wayland_connection.cc b/ui/ozone/platform/wayland/host/wayland_connection.cc index b8cc84f..f93cd32 100644 --- a/ui/ozone/platform/wayland/host/wayland_connection.cc +++ b/ui/ozone/platform/wayland/host/wayland_connection.cc
@@ -20,13 +20,11 @@ #include "base/strings/string_util.h" #include "base/task/current_thread.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "ui/events/devices/device_data_manager.h" #include "ui/events/devices/input_device.h" #include "ui/events/ozone/layout/keyboard_layout_engine_manager.h" #include "ui/gfx/geometry/point.h" #include "ui/ozone/common/features.h" -#include "ui/ozone/platform/wayland/common/wayland_object.h" #include "ui/ozone/platform/wayland/host/gtk_primary_selection_device_manager.h" #include "ui/ozone/platform/wayland/host/gtk_shell1.h" #include "ui/ozone/platform/wayland/host/org_kde_kwin_idle.h" @@ -35,11 +33,9 @@ #include "ui/ozone/platform/wayland/host/surface_augmenter.h" #include "ui/ozone/platform/wayland/host/wayland_buffer_factory.h" #include "ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h" -#include "ui/ozone/platform/wayland/host/wayland_clipboard.h" #include "ui/ozone/platform/wayland/host/wayland_cursor.h" #include "ui/ozone/platform/wayland/host/wayland_cursor_position.h" #include "ui/ozone/platform/wayland/host/wayland_data_device_manager.h" -#include "ui/ozone/platform/wayland/host/wayland_data_drag_controller.h" #include "ui/ozone/platform/wayland/host/wayland_drm.h" #include "ui/ozone/platform/wayland/host/wayland_event_source.h" #include "ui/ozone/platform/wayland/host/wayland_input_method_context.h" @@ -51,6 +47,8 @@ #include "ui/ozone/platform/wayland/host/wayland_window.h" #include "ui/ozone/platform/wayland/host/wayland_window_drag_controller.h" #include "ui/ozone/platform/wayland/host/wayland_zaura_shell.h" +#include "ui/ozone/platform/wayland/host/wayland_zcr_color_management_output.h" +#include "ui/ozone/platform/wayland/host/wayland_zcr_color_manager.h" #include "ui/ozone/platform/wayland/host/wayland_zcr_cursor_shapes.h" #include "ui/ozone/platform/wayland/host/wayland_zcr_touchpad_haptics.h" #include "ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.h" @@ -184,6 +182,8 @@ &WaylandShm::Instantiate); RegisterGlobalObjectFactory(WaylandZAuraShell::kInterfaceName, &WaylandZAuraShell::Instantiate); + RegisterGlobalObjectFactory(WaylandZcrColorManager::kInterfaceName, + &WaylandZcrColorManager::Instantiate); RegisterGlobalObjectFactory(WaylandZcrCursorShapes::kInterfaceName, &WaylandZcrCursorShapes::Instantiate); RegisterGlobalObjectFactory(WaylandZcrTouchpadHaptics::kInterfaceName,
diff --git a/ui/ozone/platform/wayland/host/wayland_connection.h b/ui/ozone/platform/wayland/host/wayland_connection.h index 6410a3ac..2d9fe18 100644 --- a/ui/ozone/platform/wayland/host/wayland_connection.h +++ b/ui/ozone/platform/wayland/host/wayland_connection.h
@@ -48,6 +48,7 @@ class WaylandOutputManager; class WaylandSeat; class WaylandZAuraShell; +class WaylandZcrColorManager; class WaylandZcrCursorShapes; class WaylandZcrTouchpadHaptics; class WaylandZwpPointerConstraints; @@ -180,6 +181,10 @@ WaylandZAuraShell* zaura_shell() const { return zaura_shell_.get(); } + WaylandZcrColorManager* zcr_color_manager() const { + return zcr_color_manager_.get(); + } + WaylandZcrCursorShapes* zcr_cursor_shapes() const { return zcr_cursor_shapes_.get(); } @@ -318,6 +323,7 @@ friend class WaylandZwpPointerConstraints; friend class WaylandZwpPointerGestures; friend class WaylandZwpRelativePointerManager; + friend class WaylandZcrColorManager; friend class WaylandZcrCursorShapes; friend class XdgForeignWrapper; friend class ZwpIdleInhibitManager; @@ -394,6 +400,7 @@ std::unique_ptr<WaylandOutputManager> wayland_output_manager_; std::unique_ptr<WaylandCursorPosition> wayland_cursor_position_; std::unique_ptr<WaylandZAuraShell> zaura_shell_; + std::unique_ptr<WaylandZcrColorManager> zcr_color_manager_; std::unique_ptr<WaylandZcrCursorShapes> zcr_cursor_shapes_; std::unique_ptr<WaylandZcrTouchpadHaptics> zcr_touchpad_haptics_; std::unique_ptr<WaylandZwpPointerConstraints>
diff --git a/ui/ozone/platform/wayland/host/wayland_output.cc b/ui/ozone/platform/wayland/host/wayland_output.cc index b395abd..5d9c04a 100644 --- a/ui/ozone/platform/wayland/host/wayland_output.cc +++ b/ui/ozone/platform/wayland/host/wayland_output.cc
@@ -5,15 +5,19 @@ #include "ui/ozone/platform/wayland/host/wayland_output.h" #include <aura-shell-client-protocol.h> +#include <chrome-color-management-client-protocol.h> #include <xdg-output-unstable-v1-client-protocol.h> #include "base/logging.h" #include "base/strings/string_util.h" #include "ui/display/display.h" #include "ui/gfx/color_space.h" +#include "ui/ozone/platform/wayland/common/wayland_object.h" #include "ui/ozone/platform/wayland/host/wayland_connection.h" #include "ui/ozone/platform/wayland/host/wayland_output_manager.h" #include "ui/ozone/platform/wayland/host/wayland_zaura_output.h" +#include "ui/ozone/platform/wayland/host/wayland_zcr_color_management_output.h" +#include "ui/ozone/platform/wayland/host/wayland_zcr_color_manager.h" #include "ui/ozone/platform/wayland/host/xdg_output.h" namespace ui { @@ -75,6 +79,13 @@ zaura_shell_get_aura_output(aura_shell, output_.get())); } +void WaylandOutput::InitializeColorManagementOutput( + WaylandZcrColorManager* zcr_color_manager) { + DCHECK(!color_management_output_); + color_management_output_ = std::make_unique<WaylandZcrColorManagementOutput>( + zcr_color_manager->CreateColorManagementOutput(output_.get()).release()); +} + void WaylandOutput::Initialize(Delegate* delegate) { DCHECK(!delegate_); delegate_ = delegate;
diff --git a/ui/ozone/platform/wayland/host/wayland_output.h b/ui/ozone/platform/wayland/host/wayland_output.h index 8e12a60..89f9c06 100644 --- a/ui/ozone/platform/wayland/host/wayland_output.h +++ b/ui/ozone/platform/wayland/host/wayland_output.h
@@ -16,6 +16,8 @@ namespace ui { class XDGOutput; +class WaylandZcrColorManager; +class WaylandZcrColorManagementOutput; class WaylandConnection; class WaylandZAuraOutput; @@ -59,6 +61,7 @@ void Initialize(Delegate* delegate); void InitializeXdgOutput(struct zxdg_output_manager_v1* manager); void InitializeZAuraOutput(zaura_shell* aura_shell); + void InitializeColorManagementOutput(WaylandZcrColorManager* manager); float GetUIScaleFactor() const; uint32_t output_id() const { return output_id_; } @@ -71,6 +74,9 @@ gfx::Size physical_size() const { return physical_size_; } gfx::Insets insets() const; const std::string& label() const; + WaylandZcrColorManagementOutput* color_management_output() const { + return color_management_output_.get(); + } // Tells if the output has already received physical screen dimensions in the // global compositor space. @@ -112,6 +118,7 @@ wl::Object<wl_output> output_; std::unique_ptr<XDGOutput> xdg_output_; std::unique_ptr<WaylandZAuraOutput> aura_output_; + std::unique_ptr<WaylandZcrColorManagementOutput> color_management_output_; float scale_factor_ = kDefaultScaleFactor; int32_t panel_transform_ = WL_OUTPUT_TRANSFORM_NORMAL; // Origin of the output in DIP screen coordinate.
diff --git a/ui/ozone/platform/wayland/host/wayland_output_manager.cc b/ui/ozone/platform/wayland/host/wayland_output_manager.cc index 243fef96..0786fab 100644 --- a/ui/ozone/platform/wayland/host/wayland_output_manager.cc +++ b/ui/ozone/platform/wayland/host/wayland_output_manager.cc
@@ -50,6 +50,10 @@ wayland_output->InitializeZAuraOutput( connection_->zaura_shell()->wl_object()); } + if (connection_->zcr_color_manager()) { + wayland_output->InitializeColorManagementOutput( + connection_->zcr_color_manager()); + } DCHECK(!wayland_output->is_ready()); output_list_[output_id] = std::move(wayland_output); @@ -87,6 +91,13 @@ } } +void WaylandOutputManager::InitializeAllColorManagementOutputs() { + DCHECK(connection_->zcr_color_manager()); + for (const auto& output : output_list_) + output.second->InitializeColorManagementOutput( + connection_->zcr_color_manager()); +} + std::unique_ptr<WaylandScreen> WaylandOutputManager::CreateWaylandScreen() { auto wayland_screen = std::make_unique<WaylandScreen>(connection_); wayland_screen_ = wayland_screen->GetWeakPtr();
diff --git a/ui/ozone/platform/wayland/host/wayland_output_manager.h b/ui/ozone/platform/wayland/host/wayland_output_manager.h index 6c532d2..7890d5b 100644 --- a/ui/ozone/platform/wayland/host/wayland_output_manager.h +++ b/ui/ozone/platform/wayland/host/wayland_output_manager.h
@@ -40,6 +40,7 @@ void InitializeAllXdgOutputs(); void InitializeAllZAuraOutputs(); + void InitializeAllColorManagementOutputs(); // Creates a platform screen. std::unique_ptr<WaylandScreen> CreateWaylandScreen();
diff --git a/ui/ozone/platform/wayland/host/wayland_screen.cc b/ui/ozone/platform/wayland/host/wayland_screen.cc index 95d7fad..da26bc91 100644 --- a/ui/ozone/platform/wayland/host/wayland_screen.cc +++ b/ui/ozone/platform/wayland/host/wayland_screen.cc
@@ -395,7 +395,7 @@ display_list_.RemoveObserver(observer); } -std::vector<base::Value> WaylandScreen::GetGpuExtraInfo( +base::Value::List WaylandScreen::GetGpuExtraInfo( const gfx::GpuExtraInfo& gpu_extra_info) { auto values = GetDesktopEnvironmentInfo(); std::vector<std::string> protocols; @@ -404,7 +404,7 @@ protocol_and_version.first.c_str(), protocol_and_version.second)); } - values.push_back( + values.Append( display::BuildGpuInfoEntry("Interfaces exposed by the Wayland compositor", base::JoinString(protocols, " "))); StorePlatformNameIntoListOfValues(values, "wayland");
diff --git a/ui/ozone/platform/wayland/host/wayland_screen.h b/ui/ozone/platform/wayland/host/wayland_screen.h index 7d11373..5f8b3520 100644 --- a/ui/ozone/platform/wayland/host/wayland_screen.h +++ b/ui/ozone/platform/wayland/host/wayland_screen.h
@@ -11,6 +11,7 @@ #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/observer_list.h" +#include "base/values.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/display/display_list.h" #include "ui/display/display_observer.h" @@ -75,7 +76,7 @@ base::TimeDelta CalculateIdleTime() const override; void AddObserver(display::DisplayObserver* observer) override; void RemoveObserver(display::DisplayObserver* observer) override; - std::vector<base::Value> GetGpuExtraInfo( + base::Value::List GetGpuExtraInfo( const gfx::GpuExtraInfo& gpu_extra_info) override; private:
diff --git a/ui/ozone/platform/wayland/host/wayland_zcr_color_management_output.cc b/ui/ozone/platform/wayland/host/wayland_zcr_color_management_output.cc new file mode 100644 index 0000000..e0f83f0 --- /dev/null +++ b/ui/ozone/platform/wayland/host/wayland_zcr_color_management_output.cc
@@ -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. + +#include "ui/ozone/platform/wayland/host/wayland_zcr_color_management_output.h" + +#include <chrome-color-management-client-protocol.h> +#include <memory> + +#include "base/notreached.h" +#include "ui/ozone/platform/wayland/host/wayland_connection.h" + +namespace ui { + +WaylandZcrColorManagementOutput::WaylandZcrColorManagementOutput( + zcr_color_management_output_v1* color_management_output) + : zcr_color_management_output_(color_management_output) { + DCHECK(color_management_output); + static const zcr_color_management_output_v1_listener listener = { + &WaylandZcrColorManagementOutput::OnColorSpaceChanged, + &WaylandZcrColorManagementOutput::OnExtendedDynamicRange, + }; + + zcr_color_management_output_v1_add_listener( + zcr_color_management_output_.get(), &listener, this); +} + +WaylandZcrColorManagementOutput::~WaylandZcrColorManagementOutput() = default; + +// static +void WaylandZcrColorManagementOutput::OnColorSpaceChanged( + void* data, + struct zcr_color_management_output_v1* cmo) { + NOTIMPLEMENTED_LOG_ONCE(); +} + +void WaylandZcrColorManagementOutput::OnColorSpaceDone( + const gfx::ColorSpace& color_space) { + NOTIMPLEMENTED_LOG_ONCE(); +} + +// static +void WaylandZcrColorManagementOutput::OnExtendedDynamicRange( + void* data, + struct zcr_color_management_output_v1* cmo, + uint32_t value) { + NOTIMPLEMENTED_LOG_ONCE(); +} + +} // namespace ui
diff --git a/ui/ozone/platform/wayland/host/wayland_zcr_color_management_output.h b/ui/ozone/platform/wayland/host/wayland_zcr_color_management_output.h new file mode 100644 index 0000000..209a018 --- /dev/null +++ b/ui/ozone/platform/wayland/host/wayland_zcr_color_management_output.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 UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_COLOR_MANAGEMENT_OUTPUT_H_ +#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_COLOR_MANAGEMENT_OUTPUT_H_ + +#include "base/memory/weak_ptr.h" +#include "ui/gfx/color_space.h" +#include "ui/ozone/platform/wayland/host/wayland_zcr_color_space.h" + +namespace ui { + +// ZcrColorManagementOutput tracks the color space of its associated +// Wayland Output. +class WaylandZcrColorManagementOutput { + public: + explicit WaylandZcrColorManagementOutput( + struct zcr_color_management_output_v1* management_output); + WaylandZcrColorManagementOutput(const WaylandZcrColorManagementOutput&) = + delete; + WaylandZcrColorManagementOutput& operator=( + const WaylandZcrColorManagementOutput&) = delete; + ~WaylandZcrColorManagementOutput(); + + private: + // zcr_color_management_output_v1_listener + static void OnColorSpaceChanged(void* data, + struct zcr_color_management_output_v1* cmo); + static void OnExtendedDynamicRange(void* data, + struct zcr_color_management_output_v1* cmo, + uint32_t value); + + void OnColorSpaceDone(const gfx::ColorSpace& color_space); + + wl::Object<zcr_color_management_output_v1> zcr_color_management_output_; + base::WeakPtrFactory<WaylandZcrColorManagementOutput> weak_factory_{this}; +}; + +} // namespace ui + +#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_COLOR_MANAGEMENT_OUTPUT_H_
diff --git a/ui/ozone/platform/wayland/host/wayland_zcr_color_management_surface.cc b/ui/ozone/platform/wayland/host/wayland_zcr_color_management_surface.cc new file mode 100644 index 0000000..b757fe7a --- /dev/null +++ b/ui/ozone/platform/wayland/host/wayland_zcr_color_management_surface.cc
@@ -0,0 +1,48 @@ +// 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 "ui/ozone/platform/wayland/host/wayland_zcr_color_management_surface.h" + +#include <chrome-color-management-client-protocol.h> +#include <memory> + +#include "base/notreached.h" +#include "ui/ozone/platform/wayland/host/wayland_connection.h" + +namespace ui { + +WaylandZcrColorManagementSurface::WaylandZcrColorManagementSurface( + zcr_color_management_surface_v1* color_management_surface, + WaylandConnection* connection) + : zcr_color_management_surface_(color_management_surface), + connection_(connection) { + DCHECK(color_management_surface); + static const zcr_color_management_surface_v1_listener listener = { + &WaylandZcrColorManagementSurface::OnPreferredColorSpace, + }; + + zcr_color_management_surface_v1_add_listener( + zcr_color_management_surface_.get(), &listener, this); +} + +WaylandZcrColorManagementSurface::~WaylandZcrColorManagementSurface() = default; + +void WaylandZcrColorManagementSurface::SetDefaultColorSpace() { + NOTIMPLEMENTED_LOG_ONCE(); +} + +void WaylandZcrColorManagementSurface::SetColorSpace( + gfx::ColorSpace color_space) { + NOTIMPLEMENTED_LOG_ONCE(); +} + +// static +void WaylandZcrColorManagementSurface::OnPreferredColorSpace( + void* data, + struct zcr_color_management_surface_v1* cms, + struct wl_output* output) { + NOTIMPLEMENTED_LOG_ONCE(); +} + +} // namespace ui
diff --git a/ui/ozone/platform/wayland/host/wayland_zcr_color_management_surface.h b/ui/ozone/platform/wayland/host/wayland_zcr_color_management_surface.h new file mode 100644 index 0000000..958df8a41 --- /dev/null +++ b/ui/ozone/platform/wayland/host/wayland_zcr_color_management_surface.h
@@ -0,0 +1,43 @@ +// 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 UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_COLOR_MANAGEMENT_SURFACE_H_ +#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_COLOR_MANAGEMENT_SURFACE_H_ + +#include "ui/gfx/color_space.h" +#include "ui/ozone/platform/wayland/host/wayland_zcr_color_space.h" + +namespace ui { + +class WaylandConnection; + +// TODO(b/237094484): merge into wayland_surface.h along with +// color_space_creator zcr_color_mangement_surface_v1 +class WaylandZcrColorManagementSurface { + public: + explicit WaylandZcrColorManagementSurface( + struct zcr_color_management_surface_v1* management_surface, + WaylandConnection* connection); + WaylandZcrColorManagementSurface(const WaylandZcrColorManagementSurface&) = + delete; + WaylandZcrColorManagementSurface& operator=( + const WaylandZcrColorManagementSurface&) = delete; + ~WaylandZcrColorManagementSurface(); + + void SetDefaultColorSpace(); + void SetColorSpace(gfx::ColorSpace color_space); + + private: + // zcr_color_management_surface_v1_listener + static void OnPreferredColorSpace(void* data, + struct zcr_color_management_surface_v1* cms, + struct wl_output* output); + + wl::Object<zcr_color_management_surface_v1> zcr_color_management_surface_; + const raw_ptr<WaylandConnection> connection_; +}; + +} // namespace ui + +#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_COLOR_MANAGEMENT_SURFACE_H_
diff --git a/ui/ozone/platform/wayland/host/wayland_zcr_color_manager.cc b/ui/ozone/platform/wayland/host/wayland_zcr_color_manager.cc new file mode 100644 index 0000000..c3ff81d --- /dev/null +++ b/ui/ozone/platform/wayland/host/wayland_zcr_color_manager.cc
@@ -0,0 +1,60 @@ +// 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 "ui/ozone/platform/wayland/host/wayland_zcr_color_manager.h" + +#include <chrome-color-management-client-protocol.h> + +#include "base/logging.h" +#include "ui/ozone/platform/wayland/host/wayland_connection.h" +#include "ui/ozone/platform/wayland/host/wayland_output_manager.h" + +namespace ui { + +namespace { +constexpr uint32_t kMinVersion = 1; +constexpr uint32_t kMaxVersion = 1; +} // namespace + +// static +constexpr char WaylandZcrColorManager::kInterfaceName[]; + +// static +void WaylandZcrColorManager::Instantiate(WaylandConnection* connection, + wl_registry* registry, + uint32_t name, + const std::string& interface, + uint32_t version) { + DCHECK_EQ(interface, kInterfaceName); + + if (connection->zcr_color_manager_) + return; + + auto color_manager = wl::Bind<struct zcr_color_manager_v1>( + registry, name, std::min(kMinVersion, kMaxVersion)); + if (!color_manager) { + LOG(ERROR) << "Failed to bind zcr_color_manager_v1"; + return; + } + connection->zcr_color_manager_ = std::make_unique<WaylandZcrColorManager>( + color_manager.release(), connection); + if (connection->wayland_output_manager()) + connection->wayland_output_manager()->InitializeAllColorManagementOutputs(); +} + +WaylandZcrColorManager::WaylandZcrColorManager( + zcr_color_manager_v1* zcr_color_manager, + WaylandConnection* connection) + : zcr_color_manager_(zcr_color_manager), connection_(connection) {} + +WaylandZcrColorManager::~WaylandZcrColorManager() = default; + +wl::Object<zcr_color_management_output_v1> +WaylandZcrColorManager::CreateColorManagementOutput(wl_output* output) { + return wl::Object<zcr_color_management_output_v1>( + zcr_color_manager_v1_get_color_management_output(zcr_color_manager_.get(), + output)); +} + +} // namespace ui
diff --git a/ui/ozone/platform/wayland/host/wayland_zcr_color_manager.h b/ui/ozone/platform/wayland/host/wayland_zcr_color_manager.h new file mode 100644 index 0000000..56907a8 --- /dev/null +++ b/ui/ozone/platform/wayland/host/wayland_zcr_color_manager.h
@@ -0,0 +1,52 @@ +// 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 UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_COLOR_MANAGER_H_ +#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_COLOR_MANAGER_H_ + +#include "base/memory/raw_ptr.h" +#include "third_party/abseil-cpp/absl/types/optional.h" +#include "ui/ozone/platform/wayland/common/wayland_object.h" +#include "ui/ozone/platform/wayland/common/wayland_util.h" + +struct zcr_color_manager_v1; + +namespace ui { + +class WaylandConnection; + +// Wrapper around |zcr_color_manager_v1| Wayland factory +class WaylandZcrColorManager + : public wl::GlobalObjectRegistrar<WaylandZcrColorManager> { + public: + static constexpr char kInterfaceName[] = "zcr_color_manager_v1"; + + static void Instantiate(WaylandConnection* connection, + wl_registry* registry, + uint32_t name, + const std::string& interface, + uint32_t version); + + WaylandZcrColorManager(zcr_color_manager_v1* zcr_color_manager_, + WaylandConnection* connection); + + WaylandZcrColorManager(const WaylandZcrColorManager&) = delete; + WaylandZcrColorManager& operator=(const WaylandZcrColorManager&) = delete; + + ~WaylandZcrColorManager(); + + wl::Object<zcr_color_management_output_v1> CreateColorManagementOutput( + wl_output* output); + + private: + // Holds pointer to the zcr_color_manager_v1 Wayland factory. + const wl::Object<zcr_color_manager_v1> zcr_color_manager_; + + // Non-owned. + const raw_ptr<WaylandConnection> connection_; +}; + +} // namespace ui + +#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_COLOR_MANAGER_H_
diff --git a/ui/ozone/platform/wayland/host/wayland_zcr_color_space.cc b/ui/ozone/platform/wayland/host/wayland_zcr_color_space.cc new file mode 100644 index 0000000..a00cbe6 --- /dev/null +++ b/ui/ozone/platform/wayland/host/wayland_zcr_color_space.cc
@@ -0,0 +1,66 @@ +// 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 "ui/ozone/platform/wayland/host/wayland_zcr_color_space.h" + +#include <chrome-color-management-client-protocol.h> + +#include "base/notreached.h" +#include "ui/ozone/platform/wayland/host/wayland_connection.h" + +namespace ui { + +WaylandZcrColorSpace::WaylandZcrColorSpace( + struct zcr_color_space_v1* color_space) + : zcr_color_space_(color_space) { + DCHECK(color_space); + static const zcr_color_space_v1_listener listener = { + &WaylandZcrColorSpace::OnIccFile, + &WaylandZcrColorSpace::OnNames, + &WaylandZcrColorSpace::OnParams, + &WaylandZcrColorSpace::OnDone, + }; + + zcr_color_space_v1_add_listener(zcr_color_space_.get(), &listener, this); + zcr_color_space_v1_get_information(zcr_color_space_.get()); +} + +WaylandZcrColorSpace::~WaylandZcrColorSpace() = default; + +// static +void WaylandZcrColorSpace::OnIccFile(void* data, + struct zcr_color_space_v1* cs, + int32_t icc, + uint32_t icc_size) { + NOTIMPLEMENTED_LOG_ONCE(); +} + +// static +void WaylandZcrColorSpace::OnNames(void* data, + struct zcr_color_space_v1* cs, + uint32_t eotf, + uint32_t chromaticity, + uint32_t whitepoint) {} + +// static +void WaylandZcrColorSpace::OnParams(void* data, + struct zcr_color_space_v1* cs, + uint32_t eotf, + uint32_t primary_r_x, + uint32_t primary_r_y, + uint32_t primary_g_x, + uint32_t primary_g_y, + uint32_t primary_b_x, + uint32_t primary_b_y, + uint32_t whitepoint_x, + uint32_t whitepoint_y) { + NOTIMPLEMENTED_LOG_ONCE(); +} + +// static +void WaylandZcrColorSpace::OnDone(void* data, struct zcr_color_space_v1* cs) { + NOTIMPLEMENTED_LOG_ONCE(); +} + +} // namespace ui
diff --git a/ui/ozone/platform/wayland/host/wayland_zcr_color_space.h b/ui/ozone/platform/wayland/host/wayland_zcr_color_space.h new file mode 100644 index 0000000..2255700 --- /dev/null +++ b/ui/ozone/platform/wayland/host/wayland_zcr_color_space.h
@@ -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. + +#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_COLOR_SPACE_H_ +#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_COLOR_SPACE_H_ + +#include <memory> +#include <utility> + +#include "base/callback.h" +#include "ui/gfx/color_space.h" +#include "ui/ozone/platform/wayland/common/wayland_object.h" + +namespace ui { + +// ZcrColorSpace is used to send color space information over wayland protocol. +// its requests and events are specified in chrome-color-management.xml. +// The ui::gfx::ColorSpace equivalent of ZcrColorSpace can be gotten with +// gfx_color_space(). +class WaylandZcrColorSpace { + public: + using WaylandZcrColorSpaceDoneCallback = + base::OnceCallback<void(const gfx::ColorSpace&)>; + explicit WaylandZcrColorSpace(zcr_color_space_v1* color_space); + WaylandZcrColorSpace(const WaylandZcrColorSpace&) = delete; + WaylandZcrColorSpace& operator=(const WaylandZcrColorSpace&) = delete; + ~WaylandZcrColorSpace(); + + zcr_color_space_v1* zcr_color_space() const { return zcr_color_space_.get(); } + bool HasColorSpaceDoneCallback() const { + return !color_space_done_callback_.is_null(); + } + void SetColorSpaceDoneCallback(WaylandZcrColorSpaceDoneCallback callback) { + color_space_done_callback_ = std::move(callback); + } + + private: + // zcr_color_space_v1_listener + static void OnIccFile(void* data, + struct zcr_color_space_v1* cs, + int32_t icc, + uint32_t icc_size); + static void OnNames(void* data, + struct zcr_color_space_v1* cs, + uint32_t eotf, + uint32_t chromaticity, + uint32_t whitepoint); + static void OnDone(void* data, struct zcr_color_space_v1* cs); + static void OnParams(void* data, + struct zcr_color_space_v1* cs, + uint32_t eotf, + uint32_t primary_r_x, + uint32_t primary_r_y, + uint32_t primary_g_x, + uint32_t primary_g_y, + uint32_t primary_b_x, + uint32_t primary_b_y, + uint32_t whitepoint_x, + uint32_t whitepoint_y); + + wl::Object<zcr_color_space_v1> zcr_color_space_; + WaylandZcrColorSpaceDoneCallback color_space_done_callback_; +}; + +} // namespace ui + +#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_COLOR_SPACE_H_
diff --git a/ui/ozone/platform/wayland/host/wayland_zcr_color_space_creator.cc b/ui/ozone/platform/wayland/host/wayland_zcr_color_space_creator.cc new file mode 100644 index 0000000..b0467cb6 --- /dev/null +++ b/ui/ozone/platform/wayland/host/wayland_zcr_color_space_creator.cc
@@ -0,0 +1,48 @@ +// 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 "ui/ozone/platform/wayland/host/wayland_zcr_color_space_creator.h" + +#include <chrome-color-management-client-protocol.h> +#include <memory> + +#include "base/check.h" +#include "base/notreached.h" + +namespace ui { + +WaylandZcrColorSpaceCreator::WaylandZcrColorSpaceCreator( + struct zcr_color_space_creator_v1* color_space_creator, + struct zcr_color_management_surface_v1* management_surface) + : zcr_color_space_creator_(color_space_creator), + zcr_color_management_surface_(management_surface) { + DCHECK(color_space_creator); + static const zcr_color_space_creator_v1_listener listener = { + &WaylandZcrColorSpaceCreator::OnCreated, + &WaylandZcrColorSpaceCreator::OnError, + }; + DCHECK(zcr_color_management_surface_); + zcr_color_space_creator_v1_add_listener(zcr_color_space_creator_.get(), + &listener, this); +} + +WaylandZcrColorSpaceCreator::~WaylandZcrColorSpaceCreator() = default; + +// static +void WaylandZcrColorSpaceCreator::OnCreated( + void* data, + struct zcr_color_space_creator_v1* css, + struct zcr_color_space_v1* color_space) { + NOTIMPLEMENTED_LOG_ONCE(); +} + +// static +void WaylandZcrColorSpaceCreator::OnError( + void* data, + struct zcr_color_space_creator_v1* css, + uint32_t error) { + NOTIMPLEMENTED_LOG_ONCE(); +} + +} // namespace ui
diff --git a/ui/ozone/platform/wayland/host/wayland_zcr_color_space_creator.h b/ui/ozone/platform/wayland/host/wayland_zcr_color_space_creator.h new file mode 100644 index 0000000..14276472 --- /dev/null +++ b/ui/ozone/platform/wayland/host/wayland_zcr_color_space_creator.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 UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_COLOR_SPACE_CREATOR_H_ +#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_COLOR_SPACE_CREATOR_H_ + +#include "ui/gfx/color_space.h" +#include "ui/ozone/platform/wayland/host/wayland_zcr_color_space.h" + +namespace ui { + +// WaylandZcrColorSpaceCreator is used to create a zcr_color_space_v1 object +// that can be sent to exo over wayland protocol. +class WaylandZcrColorSpaceCreator { + public: + WaylandZcrColorSpaceCreator( + struct zcr_color_space_creator_v1* creator, + struct zcr_color_management_surface_v1* management_surface); + WaylandZcrColorSpaceCreator(const WaylandZcrColorSpaceCreator&) = delete; + WaylandZcrColorSpaceCreator& operator=(const WaylandZcrColorSpaceCreator&) = + delete; + ~WaylandZcrColorSpaceCreator(); + + private: + // zcr_color_space_creator_v1_listener + static void OnCreated(void* data, + struct zcr_color_space_creator_v1* css, + struct zcr_color_space_v1* color_space); + static void OnError(void* data, + struct zcr_color_space_creator_v1* css, + uint32_t error); + + wl::Object<zcr_color_space_creator_v1> zcr_color_space_creator_; + zcr_color_management_surface_v1* zcr_color_management_surface_; +}; + +} // namespace ui + +#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_COLOR_SPACE_CREATOR_H_
diff --git a/ui/ozone/platform/wayland/wayland_utils.h b/ui/ozone/platform/wayland/wayland_utils.h index 1616460..8c7cadb 100644 --- a/ui/ozone/platform/wayland/wayland_utils.h +++ b/ui/ozone/platform/wayland/wayland_utils.h
@@ -10,6 +10,9 @@ namespace ui { +#define PARAM_TO_FLOAT(x) (x / 10000.f) +#define FLOAT_TO_PARAM(x) static_cast<uint32_t>(x * 10000) + class WaylandConnection; class WaylandUtils : public PlatformUtils {
diff --git a/ui/ozone/platform/x11/x11_screen_ozone.cc b/ui/ozone/platform/x11/x11_screen_ozone.cc index 9696057..6972a5b0 100644 --- a/ui/ozone/platform/x11/x11_screen_ozone.cc +++ b/ui/ozone/platform/x11/x11_screen_ozone.cc
@@ -161,7 +161,7 @@ return x11_display_manager_->GetCurrentWorkspace(); } -std::vector<base::Value> X11ScreenOzone::GetGpuExtraInfo( +base::Value::List X11ScreenOzone::GetGpuExtraInfo( const gfx::GpuExtraInfo& gpu_extra_info) { auto result = GetDesktopEnvironmentInfo(); StorePlatformNameIntoListOfValues(result, "x11");
diff --git a/ui/ozone/platform/x11/x11_screen_ozone.h b/ui/ozone/platform/x11/x11_screen_ozone.h index 7f84bc5..554ac3f 100644 --- a/ui/ozone/platform/x11/x11_screen_ozone.h +++ b/ui/ozone/platform/x11/x11_screen_ozone.h
@@ -57,7 +57,7 @@ void AddObserver(display::DisplayObserver* observer) override; void RemoveObserver(display::DisplayObserver* observer) override; std::string GetCurrentWorkspace() override; - std::vector<base::Value> GetGpuExtraInfo( + base::Value::List GetGpuExtraInfo( const gfx::GpuExtraInfo& gpu_extra_info) override; void SetDeviceScaleFactor(float scale) override;
diff --git a/ui/ozone/public/platform_screen.cc b/ui/ozone/public/platform_screen.cc index 98f599a..85fb4bd8 100644 --- a/ui/ozone/public/platform_screen.cc +++ b/ui/ozone/public/platform_screen.cc
@@ -45,20 +45,20 @@ return base::Seconds(0); } -std::vector<base::Value> PlatformScreen::GetGpuExtraInfo( +base::Value::List PlatformScreen::GetGpuExtraInfo( const gfx::GpuExtraInfo& gpu_extra_info) { - return std::vector<base::Value>(); + return base::Value::List(); } void PlatformScreen::SetDeviceScaleFactor(float scale) {} void PlatformScreen::StorePlatformNameIntoListOfValues( - std::vector<base::Value>& values, + base::Value::List& values, const std::string& platform_name) { - base::Value dict(base::Value::Type::DICTIONARY); - dict.SetKey("description", base::Value("Ozone platform")); - dict.SetKey("value", base::Value(platform_name)); - values.push_back(std::move(dict)); + base::Value::Dict dict; + dict.Set("description", "Ozone platform"); + dict.Set("value", platform_name); + values.Append(std::move(dict)); } } // namespace ui
diff --git a/ui/ozone/public/platform_screen.h b/ui/ozone/public/platform_screen.h index 091220a..54b13c8 100644 --- a/ui/ozone/public/platform_screen.h +++ b/ui/ozone/public/platform_screen.h
@@ -111,7 +111,7 @@ // Returns human readable description of the window manager, desktop, and // other system properties related to the compositing. - virtual std::vector<base::Value> GetGpuExtraInfo( + virtual base::Value::List GetGpuExtraInfo( const gfx::GpuExtraInfo& gpu_extra_info); // Sets device scale factor received from external sources such as toolkits. @@ -119,7 +119,7 @@ virtual void SetDeviceScaleFactor(float scale); protected: - void StorePlatformNameIntoListOfValues(std::vector<base::Value>& values, + void StorePlatformNameIntoListOfValues(base::Value::List& values, const std::string& platform_name); };
diff --git a/ui/shell_dialogs/BUILD.gn b/ui/shell_dialogs/BUILD.gn index 72e7324..3c75b8f 100644 --- a/ui/shell_dialogs/BUILD.gn +++ b/ui/shell_dialogs/BUILD.gn
@@ -83,6 +83,7 @@ "execute_select_file_win.h", "select_file_dialog_win.cc", "select_file_dialog_win.h", + "select_file_utils_win.h", ] } @@ -152,8 +153,8 @@ if (is_win) { sources += [ - "execute_select_file_win_unittest.cc", "select_file_dialog_win_unittest.cc", + "select_file_utils_win_unittest.cc", ] }
diff --git a/ui/shell_dialogs/execute_select_file_win.cc b/ui/shell_dialogs/execute_select_file_win.cc index 162dbc3a..024b691 100644 --- a/ui/shell_dialogs/execute_select_file_win.cc +++ b/ui/shell_dialogs/execute_select_file_win.cc
@@ -10,7 +10,6 @@ #include "base/callback.h" #include "base/files/file.h" #include "base/files/file_util.h" -#include "base/strings/string_tokenizer.h" #include "base/strings/string_util.h" #include "base/win/com_init_util.h" #include "base/win/registry.h" @@ -18,6 +17,7 @@ #include "base/win/shortcut.h" #include "ui/base/l10n/l10n_util.h" #include "ui/shell_dialogs/base_shell_dialog_win.h" +#include "ui/shell_dialogs/select_file_utils_win.h" #include "ui/strings/grit/ui_strings.h" namespace ui { @@ -31,12 +31,6 @@ : path.EndsWithSeparator(); } -// Given |extension|, if it's not empty, then remove the leading dot. -std::wstring GetExtensionWithoutLeadingDot(const std::wstring& extension) { - DCHECK(extension.empty() || extension[0] == L'.'); - return extension.empty() ? extension : extension.substr(1); -} - // Sets which path is going to be open when the dialog will be shown. If // |default_path| is not only a directory, also sets the contents of the text // box equals to the basename of the path. @@ -51,7 +45,9 @@ default_folder = default_path; } else { default_folder = default_path.DirName(); - default_file_name = GetSanitizedFileName(default_path.BaseName()); + std::wstring sanitized = RemoveEnvVarFromFileName<wchar_t>( + default_path.BaseName().value(), std::wstring(L"%")); + default_file_name = base::FilePath(sanitized); } // Do not fail the file dialog operation if the specified folder is invalid. @@ -332,73 +328,6 @@ } // namespace -// This function takes the output of a SaveAs dialog: a filename, a filter and -// the extension originally suggested to the user (shown in the dialog box) and -// returns back the filename with the appropriate extension appended. If the -// user requests an unknown extension and is not using the 'All files' filter, -// the suggested extension will be appended, otherwise we will leave the -// filename unmodified. |filename| should contain the filename selected in the -// SaveAs dialog box and may include the path, |filter_selected| should be -// '*.something', for example '*.*' or it can be blank (which is treated as -// *.*). |suggested_ext| should contain the extension without the dot (.) in -// front, for example 'jpg'. -std::wstring AppendExtensionIfNeeded(const std::wstring& filename, - const std::wstring& filter_selected, - const std::wstring& suggested_ext) { - DCHECK(!filename.empty()); - std::wstring return_value = filename; - - // If we wanted a specific extension, but the user's filename deleted it or - // changed it to something that the system doesn't understand, re-append. - // Careful: Checking net::GetMimeTypeFromExtension() will only find - // extensions with a known MIME type, which many "known" extensions on Windows - // don't have. So we check directly for the "known extension" registry key. - std::wstring file_extension( - GetExtensionWithoutLeadingDot(base::FilePath(filename).Extension())); - std::wstring key(L"." + file_extension); - if (!(filter_selected.empty() || filter_selected == L"*.*") && - !base::win::RegKey(HKEY_CLASSES_ROOT, key.c_str(), KEY_READ).Valid() && - file_extension != suggested_ext) { - if (return_value.back() != L'.') - return_value.append(L"."); - return_value.append(suggested_ext); - } - - // Strip any trailing dots, which Windows doesn't allow. - size_t index = return_value.find_last_not_of(L'.'); - if (index < return_value.size() - 1) - return_value.resize(index + 1); - - return return_value; -} - -base::FilePath GetSanitizedFileName(const base::FilePath& file_name) { - base::StringTokenizerT<std::wstring, std::wstring::const_iterator> t( - file_name.value(), L"%"); - t.set_options(base::StringTokenizer::RETURN_EMPTY_TOKENS); - std::wstring result; - bool token_valid = t.GetNext(); - while (token_valid) { - // Append substring before the first "%". - result.append(t.token()); - // Done if we are reaching the end delimiter, - if (!t.GetNext()) { - break; - } - std::wstring string_after_first_percent = t.token(); - token_valid = t.GetNext(); - // If there are no other "%", append the string after - // the first "%". Otherwise, remove the string between - // the "%" and continue handing the remaining string. - if (!token_valid) { - result.append(L"%"); - result.append(string_after_first_percent); - break; - } - } - return base::FilePath(result); -} - void ExecuteSelectFile( SelectFileDialog::Type type, const std::u16string& title,
diff --git a/ui/shell_dialogs/execute_select_file_win.h b/ui/shell_dialogs/execute_select_file_win.h index 8fa96906..238553e 100644 --- a/ui/shell_dialogs/execute_select_file_win.h +++ b/ui/shell_dialogs/execute_select_file_win.h
@@ -20,18 +20,6 @@ namespace ui { -// Implementation detail exported for unit tests. -SHELL_DIALOGS_EXPORT std::wstring AppendExtensionIfNeeded( - const std::wstring& filename, - const std::wstring& filter_selected, - const std::wstring& suggested_ext); - -// Given a file name, return the sanitized version by removing substrings that -// are embedded in double '%' characters as those are reserved for environment -// variables. Implementation detail exported for unit tests. -SHELL_DIALOGS_EXPORT base::FilePath GetSanitizedFileName( - const base::FilePath& file_name); - // Describes a filter for a file dialog. struct FileFilterSpec { // A human readable description of this filter. E.g. "HTML Files."
diff --git a/ui/shell_dialogs/execute_select_file_win_unittest.cc b/ui/shell_dialogs/execute_select_file_win_unittest.cc deleted file mode 100644 index b6c604f..0000000 --- a/ui/shell_dialogs/execute_select_file_win_unittest.cc +++ /dev/null
@@ -1,87 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/shell_dialogs/execute_select_file_win.h" - -#include <stddef.h> - -#include "base/strings/stringprintf.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "ui/shell_dialogs/select_file_dialog.h" - -TEST(ShellDialogsWin, AppendExtensionIfNeeded) { - struct AppendExtensionTestCase { - const wchar_t* filename; - const wchar_t* filter_selected; - const wchar_t* suggested_ext; - const wchar_t* expected_filename; - } test_cases[] = { - // Known extensions, with or without associated MIME types, should not get - // an extension appended. - {L"sample.html", L"*.txt", L"txt", L"sample.html"}, - {L"sample.reg", L"*.txt", L"txt", L"sample.reg"}, - - // An unknown extension, or no extension, should get the default extension - // appended. - {L"sample.unknown", L"*.txt", L"txt", L"sample.unknown.txt"}, - {L"sample", L"*.txt", L"txt", L"sample.txt"}, - // ...unless the unknown and default extensions match. - {L"sample.unknown", L"*.unknown", L"unknown", L"sample.unknown"}, - - // The extension alone should be treated like a filename with no - // extension. - {L"txt", L"*.txt", L"txt", L"txt.txt"}, - - // Trailing dots should cause us to append an extension. - {L"sample.txt.", L"*.txt", L"txt", L"sample.txt.txt"}, - {L"...", L"*.txt", L"txt", L"...txt"}, - - // If the filter is changed to "All files", we allow any filename. - {L"sample.unknown", L"*.*", L"", L"sample.unknown"}, - }; - - for (size_t i = 0; i < std::size(test_cases); ++i) { - SCOPED_TRACE(base::StringPrintf("i=%zu", i)); - - EXPECT_EQ(std::wstring(test_cases[i].expected_filename), - ui::AppendExtensionIfNeeded(test_cases[i].filename, - test_cases[i].filter_selected, - test_cases[i].suggested_ext)); - } -} - -TEST(ShellDialogsWin, GetSanitizedFileName) { - struct GetSanitizedFileNameTestCase { - const wchar_t* filename; - const wchar_t* sanitized_filename; - } test_cases[] = { - {L"", L""}, - {L"a.txt", L"a.txt"}, - - // Only 1 "%" in file name. - {L"%", L"%"}, - {L"%.txt", L"%.txt"}, - {L"ab%c.txt", L"ab%c.txt"}, - {L"abc.t%", L"abc.t%"}, - - // 2 "%" in file name. - {L"%%", L""}, - {L"%c%", L""}, - {L"%c%d", L"d"}, - {L"d%c%.txt", L"d.txt"}, - {L"ab%c.t%", L"ab"}, - {L"abc.%t%", L"abc."}, - - // More than 2 "%" in file name. - {L"%ab%c%.txt", L"c%.txt"}, - {L"%abc%.%txt%", L"."}, - {L"%ab%c%.%txt%", L"ctxt%"}, - }; - - for (size_t i = 0; i < std::size(test_cases); ++i) { - SCOPED_TRACE(base::StringPrintf("i=%zu", i)); - EXPECT_EQ(base::FilePath(test_cases[i].sanitized_filename), - ui::GetSanitizedFileName(base::FilePath(test_cases[i].filename))); - } -}
diff --git a/ui/shell_dialogs/select_file_dialog_win.cc b/ui/shell_dialogs/select_file_dialog_win.cc index e2959960..cf1fee6c 100644 --- a/ui/shell_dialogs/select_file_dialog_win.cc +++ b/ui/shell_dialogs/select_file_dialog_win.cc
@@ -27,6 +27,7 @@ #include "ui/shell_dialogs/base_shell_dialog_win.h" #include "ui/shell_dialogs/execute_select_file_win.h" #include "ui/shell_dialogs/select_file_policy.h" +#include "ui/shell_dialogs/select_file_utils_win.h" #include "ui/strings/grit/ui_strings.h" namespace ui { @@ -83,7 +84,8 @@ result.reserve(file_ext.size() + 1); for (size_t i = 0; i < file_ext.size(); ++i) { - std::u16string ext = file_ext[i]; + std::u16string ext = + RemoveEnvVarFromFileName<char16_t>(file_ext[i], std::u16string(u"%")); std::u16string desc; if (i < ext_desc.size()) desc = ext_desc[i];
diff --git a/ui/shell_dialogs/select_file_utils_win.h b/ui/shell_dialogs/select_file_utils_win.h new file mode 100644 index 0000000..cd8cca5 --- /dev/null +++ b/ui/shell_dialogs/select_file_utils_win.h
@@ -0,0 +1,48 @@ +// 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 UI_SHELL_DIALOGS_SELECT_FILE_UTILS_WIN_H_ +#define UI_SHELL_DIALOGS_SELECT_FILE_UTILS_WIN_H_ + +#include "base/strings/string_tokenizer.h" + +namespace ui { + +// Given a file name, return the sanitized version by removing substrings that +// are embedded in double '%' characters as those are reserved for environment +// variables. Implementation detail exported for unit tests. +template <typename T> +std::basic_string<T> RemoveEnvVarFromFileName( + const std::basic_string<T>& file_name, + const std::basic_string<T>& env_delimit) { + base::StringTokenizerT<std::basic_string<T>, + typename std::basic_string<T>::const_iterator> + t(file_name, env_delimit); + t.set_options(base::StringTokenizer::RETURN_EMPTY_TOKENS); + std::basic_string<T> result; + bool token_valid = t.GetNext(); + while (token_valid) { + // Append substring before the first "%". + result.append(t.token()); + // Done if we are reaching the end delimiter, + if (!t.GetNext()) { + break; + } + std::basic_string<T> string_after_first_percent = t.token(); + token_valid = t.GetNext(); + // If there are no other "%", append the string after + // the first "%". Otherwise, remove the string between + // the "%" and continue handing the remaining string. + if (!token_valid) { + result.append(env_delimit); + result.append(string_after_first_percent); + break; + } + } + return result; +} + +} // namespace ui + +#endif // UI_SHELL_DIALOGS_SELECT_FILE_UTILS_WIN_H_
diff --git a/ui/shell_dialogs/select_file_utils_win_unittest.cc b/ui/shell_dialogs/select_file_utils_win_unittest.cc new file mode 100644 index 0000000..01f73c3 --- /dev/null +++ b/ui/shell_dialogs/select_file_utils_win_unittest.cc
@@ -0,0 +1,47 @@ +// 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 "ui/shell_dialogs/select_file_utils_win.h" + +#include <stddef.h> + +#include "base/strings/stringprintf.h" +#include "testing/gtest/include/gtest/gtest.h" + +TEST(SelectFileUtilsWin, RemoveEnvVarFromFileName) { + struct RemoveEnvFromFileNameTestCase { + const wchar_t* filename; + const wchar_t* sanitized_filename; + } test_cases[] = { + {L"", L""}, + {L"a.txt", L"a.txt"}, + + // Only 1 "%" in file name. + {L"%", L"%"}, + {L"%.txt", L"%.txt"}, + {L"ab%c.txt", L"ab%c.txt"}, + {L"abc.t%", L"abc.t%"}, + + // 2 "%" in file name. + {L"%%", L""}, + {L"%c%", L""}, + {L"%c%d", L"d"}, + {L"d%c%.txt", L"d.txt"}, + {L"ab%c.t%", L"ab"}, + {L"abc.%t%", L"abc."}, + {L"*.%txt%", L"*."}, + + // More than 2 "%" in file name. + {L"%ab%c%.txt", L"c%.txt"}, + {L"%abc%.%txt%", L"."}, + {L"%ab%c%.%txt%", L"ctxt%"}, + }; + + for (size_t i = 0; i < std::size(test_cases); ++i) { + SCOPED_TRACE(base::StringPrintf("i=%zu", i)); + std::wstring sanitized = ui::RemoveEnvVarFromFileName<wchar_t>( + std::wstring(test_cases[i].filename), std::wstring(L"%")); + EXPECT_EQ(std::wstring(test_cases[i].sanitized_filename), sanitized); + } +}
diff --git a/ui/strings/ui_strings.grd b/ui/strings/ui_strings.grd index de13721..c13631e2 100644 --- a/ui/strings/ui_strings.grd +++ b/ui/strings/ui_strings.grd
@@ -525,6 +525,18 @@ <message name="IDS_APP_ACCNAME_COLOR_CHOOSER_HEX_INPUT" desc="The accessible name for the color chooser hexadecimal input field"> Hex color value </message> + <message name="IDS_APP_ACCNAME_HALF" desc="The accessible name for the Half button on Multitask Menu"> + Half + </message> + <message name="IDS_APP_ACCNAME_PARTIAL" desc="The accessible name for the Partial button on the Multitask Menu"> + Partial + </message> + <message name="IDS_APP_ACCNAME_FULL" desc="The accessible name for the Full button on the Multitask Menu"> + Full + </message> + <message name="IDS_APP_ACCNAME_FLOAT_ON_TOP" desc="The accessible name for the Float on top button on the Multitask Menu"> + Float on top + </message> <!-- Scroll Bar Context Menu Labels --> <message name="IDS_APP_SCROLLBAR_CXMENU_SCROLLHERE" desc="The label for the 'Scroll Here' item">
diff --git a/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_FLOAT_ON_TOP.png.sha1 b/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_FLOAT_ON_TOP.png.sha1 new file mode 100644 index 0000000..35595ae --- /dev/null +++ b/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_FLOAT_ON_TOP.png.sha1
@@ -0,0 +1 @@ +ded49a8d4683847a3caa449f49bc5d6b95d58a50 \ No newline at end of file
diff --git a/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_FULL.png.sha1 b/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_FULL.png.sha1 new file mode 100644 index 0000000..adacea2 --- /dev/null +++ b/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_FULL.png.sha1
@@ -0,0 +1 @@ +b3bbad8de6d49c9ccedfc8d9b8558427a4406564 \ No newline at end of file
diff --git a/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_HALF.png.sha1 b/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_HALF.png.sha1 new file mode 100644 index 0000000..2805eb0 --- /dev/null +++ b/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_HALF.png.sha1
@@ -0,0 +1 @@ +345896126d653ee01d5edbd9d32dbd0df387f4c0 \ No newline at end of file
diff --git a/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_PARTIAL.png.sha1 b/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_PARTIAL.png.sha1 new file mode 100644 index 0000000..fff1f0f --- /dev/null +++ b/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_PARTIAL.png.sha1
@@ -0,0 +1 @@ +64660eb22c59612af7b1762a6149f0d26e9bd350 \ No newline at end of file
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/interfaces/PRESUBMIT.py b/weblayer/browser/java/org/chromium/weblayer_private/interfaces/PRESUBMIT.py index c782cd9..e507cad30 100644 --- a/weblayer/browser/java/org/chromium/weblayer_private/interfaces/PRESUBMIT.py +++ b/weblayer/browser/java/org/chromium/weblayer_private/interfaces/PRESUBMIT.py
@@ -85,7 +85,14 @@ from devil.android.sdk import build_tools devil_chromium.Initialize() - aidl_tool_path = build_tools.GetPath('aidl') + try: + aidl_tool_path = build_tools.GetPath('aidl') + except Exception as e: + if input_api.no_diffs: + # If we are running presubmits with --all or --files and the 'aidl' tool + # cannot be found then that probably means that target_os = 'android' is + # missing from .gclient and the failure is not interesting. + return [] if not os.path.exists(aidl_tool_path): return [output_api.PresubmitError( 'Android sdk does not contain aidl command ' + aidl_tool_path)]