diff --git a/BUILD.gn b/BUILD.gn index 3bb7c25..772fde9e 100644 --- a/BUILD.gn +++ b/BUILD.gn
@@ -76,7 +76,6 @@ ":gn_visibility", "//base:base_perftests", "//base:base_unittests", - "//base/util:base_util_unittests", "//chrome/installer", "//chrome/updater", "//codelabs", @@ -419,6 +418,7 @@ "//chrome/android:chrome_junit_tests", "//chrome/android:chrome_public_apk", "//chrome/android:chrome_public_test_apk", + "//chrome/android:chrome_public_unit_test_apk", "//chrome/browser/android/examples/custom_tabs_client:custom_tabs_client_example_apk", "//chrome/browser/android/examples/partner_browser_customizations_provider:partner_browser_customizations_example_apk", "//chrome/test/chromedriver/test/webview_shell:chromedriver_webview_shell_apk", @@ -702,6 +702,7 @@ if (!is_fuchsia) { deps += [ "//chromecast:cast_shell" ] + deps += [ "//chromecast/cast_core:core_runtime_simple" ] } if (enable_extensions && use_aura) { deps += [ "//chrome/browser/resources/chromeos/accessibility:build" ]
diff --git a/DEPS b/DEPS index 12911076..eba0acf 100644 --- a/DEPS +++ b/DEPS
@@ -228,7 +228,7 @@ # 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': 'abae48eb5b73dfe3c0de737eeda34bde2a9fb797', + 'skia_revision': 'abe39f5cb932e1d230c37335bbd66088820de5b6', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. @@ -240,7 +240,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': '201960e4aa83b532bd21166d133aa73883dac9be', + 'angle_revision': '1fb846cbed194e990c76bd475987665c37009c1a', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -248,7 +248,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': '9778968ebcf520e51b4807f2f93d946e30538ed1', + 'pdfium_revision': 'fb6dd8b4064ecf0b5bf592395795ea23afcbea11', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling BoringSSL # and whatever else without interference from each other. @@ -263,7 +263,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling googletest # and whatever else without interference from each other. - 'googletest_revision': '47f819c3ca54fb602f432904443e00a0a1fe2f42', + 'googletest_revision': '0134d73a4902574269ff2e42827f7573d3df08ae', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling lighttpd # and whatever else without interference from each other. @@ -299,7 +299,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': 'bd47f22ad262b4e1f5beef55fd52a93a992e8007', + 'catapult_revision': '126f6a8996c232101feb381b184dded12a5e5c15', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -347,7 +347,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': 'e5dd6746bdbff7ec98ad0001000e6ae2aab16345', + 'dawn_revision': '0becd05857218a4de386aec5aa27805997029f0c', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -610,7 +610,7 @@ }, 'src/ios/third_party/material_components_ios/src': { - 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + 'ec5124c182b823838aa9aace773cdf1f8cb704bd', + 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '5b76e6e21b40d1cbe4bb77ec8d0f078337213370', 'condition': 'checkout_ios', }, @@ -767,7 +767,7 @@ 'packages': [ { 'package': 'chromium/third_party/androidx', - 'version': 'krtkAyAj_Vhfu3r0xami8YhOw7sbY3Zh_JEHbIchaFYC', + 'version': 'wapweqY3T9FEHpjaWRsHugloyn-WT9pGg45FvDUjXwUC', }, ], 'condition': 'checkout_android', @@ -800,7 +800,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_build_tools/aapt2', - 'version': 'aKJ5MrSRXjVPtBx2DoBnJtmmjO6W6PkQrTYuBtdu46YC', + 'version': 'PHj2SHpCe6Sr9lcIR9W1onhKN4FIIPL2Mho5aAQG-QIC', }, ], 'condition': 'checkout_android', @@ -1003,7 +1003,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '699d70d878603ebb3861c8f4487c4b05f5d81643', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '0c42eff6d19a79d0c8af825ece86d63d5f58e98b', 'src/third_party/devtools-frontend/src': Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), @@ -1389,7 +1389,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '76f7830d7f2b74640a2304db5c75588cb0da5ff4', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '303b88cfe5f0a6cf2f6f9f961c65b7b0b530155d', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1582,7 +1582,7 @@ 'src/third_party/usrsctp/usrsctplib': Var('chromium_git') + '/external/github.com/sctplab/usrsctp' + '@' + '978003f36a3bc1e9fdeafae26dbfe825684b0a25', - 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@4640eee1e16f98d1ae11e551fa760f29a961ee81', + 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@89745c68aa1236038af3a7a35b3995b3eeeed896', 'src/third_party/vulkan_memory_allocator': Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'f67d7fa397e83060b76a1ec53579116a0bbdff7a', @@ -1618,10 +1618,10 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '9ec0bd5501c6a35eb365dc49be7618a763135a10', 'src/third_party/webgpu-cts/src': - Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '201435f657c0b3942418a34a8fe87d593fa433d8', + Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '45b9cd139f6ea2b9c2f88a1497d4709c3d7c3600', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '95f6e8bebb7364bb582ab15e913286266ae6198e', + Var('webrtc_git') + '/src.git' + '@' + 'a7d32e3dcb4c86223c951643e4ae2159dcbfa8fb', 'src/third_party/libgifcodec': Var('skia_git') + '/libgifcodec' + '@'+ Var('libgifcodec_revision'), @@ -1682,7 +1682,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@e30bb86e689fb0be2b67d54d9ce68e1eb949434c', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@c62eecd50d9f207d78ba7eab382a0b0f2d3be571', 'condition': 'checkout_src_internal', }, @@ -1719,17 +1719,6 @@ 'dep_type': 'cipd', }, - 'src/third_party/google_android_play_core': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/com_google_android_play_core_verification', - 'version': 'ojrkXUE6tjG8FYmoLfCD3YdOxTyl2BXMdmk7Fb6cS5MC', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - 'src/third_party/webpagereplay': { 'packages' : [ {
diff --git a/WATCHLISTS b/WATCHLISTS index 9423b04..ae33c91 100644 --- a/WATCHLISTS +++ b/WATCHLISTS
@@ -2459,7 +2459,6 @@ 'odejesush+watch@chromium.org'], 'devtools': ['devtools-reviews@chromium.org'], 'diagnostics_ui': ['gavinwill+diagnostics-watch@chromium.org', - 'joonbug+diagnostics-watch@chromium.org', 'michaelcheco+diagnostics-watch@google.com', 'zentaro+diagnostics-watch@chromium.org', 'gavindodd+diagnostics-watch@google.com',
diff --git a/android_webview/docs/developer-ui.md b/android_webview/docs/developer-ui.md index bbaffd0c..d7ede0b 100644 --- a/android_webview/docs/developer-ui.md +++ b/android_webview/docs/developer-ui.md
@@ -152,12 +152,28 @@ ### Adding your flags and features to the UI If you're intending to launch a feature in WebView or start a field trial (AKA -Finch experiment), we **highly encourage** you to [add to the -list](/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java) -(ex. [CL](https://crrev.com/c/2008007), [CL](https://crrev.com/c/2066144)). -After that, update `enums.xml` by running -`android_webview/tools/generate_flag_labels.py` (see [this -doc](/tools/metrics/histograms/README.md#Flag-Histograms) for more context). +Finch experiment), we **highly encourage** you to [add to +ProductionSupportedFlagList](/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java): + +1. Since ProductionSupportedFlagList is in Java, you will need to autogenerate + a Java constant for your flag. See [these + docs](/docs/android_accessing_cpp_features_in_java.md) if your code is behind + a `base::Feature` or [these + docs](/docs/android_accessing_cpp_switches_in_java.md) if it is behind a + commandline switch ([example + CL](https://chromium-review.googlesource.com/c/chromium/src/+/2429252)). +2. Add your switch/feature to the list with a brief description (this + description will be visible to users). If your feature depends on enabling a + different feature too, this is a good spot to call that out. +3. Run `android_webview/tools/generate_flag_labels.py` to generate labels for + `enums.xml` ([example + CL](https://chromium-review.googlesource.com/c/chromium/src/+/3016396)). Note + that this is only a best-effort attempt to generate correct labels, so you + may need to [modify the + script](https://source.chromium.org/chromium/chromium/src/+/main:android_webview/tools/generate_flag_labels.py;l=46;drc=cf0fb02287669436154b83bf862b4be38226016c) + if you think it made a mistake. See + [this doc](/tools/metrics/histograms/README.md#Flag-Histograms) for more info + about flag labels. Exposing your feature this way has several benefits:
diff --git a/ash/accessibility/magnifier/docked_magnifier_controller_unittest.cc b/ash/accessibility/magnifier/docked_magnifier_controller_unittest.cc index cc057f0..c88ce481 100644 --- a/ash/accessibility/magnifier/docked_magnifier_controller_unittest.cc +++ b/ash/accessibility/magnifier/docked_magnifier_controller_unittest.cc
@@ -736,7 +736,7 @@ // Tests various magnifier layer transform in the simple cases (i.e. no device // scale factors or screen rotations). TEST_F(DockedMagnifierTest, TransformSimple) { - UpdateDisplay("800x800"); + UpdateDisplay("800x700"); const auto root_windows = Shell::GetAllRootWindows(); ASSERT_EQ(1u, root_windows.size()); @@ -749,8 +749,8 @@ controller()->GetViewportWidgetForTesting(); ASSERT_NE(nullptr, viewport_widget); EXPECT_EQ(root_windows[0], viewport_widget->GetNativeView()->GetRootWindow()); - const int viewport_height = - 800 / DockedMagnifierController::kScreenHeightDivisor; + const int viewport_height = root_windows[0]->bounds().height() / + DockedMagnifierController::kScreenHeightDivisor; EXPECT_EQ(gfx::Rect(0, 0, 800, viewport_height), viewport_widget->GetWindowBoundsInScreen());
diff --git a/ash/accessibility/magnifier/fullscreen_magnifier_controller_unittest.cc b/ash/accessibility/magnifier/fullscreen_magnifier_controller_unittest.cc index 71cbaeb..2f05c46 100644 --- a/ash/accessibility/magnifier/fullscreen_magnifier_controller_unittest.cc +++ b/ash/accessibility/magnifier/fullscreen_magnifier_controller_unittest.cc
@@ -1096,7 +1096,7 @@ // Tests that the magnifier gets updated when dragging a window. TEST_F(FullscreenMagnifierControllerTest, DragWindow) { - UpdateDisplay("800x800"); + UpdateDisplay("800x700"); // Create a window and start dragging by grabbing its caption. const gfx::Rect initial_window_bounds(200, 200, 400, 400);
diff --git a/ash/accessibility/ui/accessibility_highlight_controller_unittest.cc b/ash/accessibility/ui/accessibility_highlight_controller_unittest.cc index 9b37f1e..e95cd061 100644 --- a/ash/accessibility/ui/accessibility_highlight_controller_unittest.cc +++ b/ash/accessibility/ui/accessibility_highlight_controller_unittest.cc
@@ -195,7 +195,7 @@ // Integration test of cursor handling between AccessibilityHighlightController // and AccessibilityFocusRingController. TEST_F(AccessibilityHighlightControllerTest, CursorWorksOnMultipleDisplays) { - UpdateDisplay("400x400,500x500"); + UpdateDisplay("500x400,500x500"); aura::Window::Windows root_windows = Shell::Get()->GetAllRootWindows(); ASSERT_EQ(2u, root_windows.size());
diff --git a/ash/app_list/views/app_drag_icon_proxy.cc b/ash/app_list/views/app_drag_icon_proxy.cc index 105c26d..7efcaea 100644 --- a/ash/app_list/views/app_drag_icon_proxy.cc +++ b/ash/app_list/views/app_drag_icon_proxy.cc
@@ -89,6 +89,11 @@ animation_completion_callback_ = std::move(animation_completion_callback); closing_widget_ = true; + // Prevent any in progress animations from interfering with the timing on the + // animation completion callback. + ui::Layer* target_layer = drag_image_widget_->GetContentsView()->layer(); + target_layer->GetAnimator()->AbortAllAnimations(); + gfx::Rect current_bounds = GetBoundsInScreen(); if (current_bounds.IsEmpty()) { drag_image_widget_.reset(); @@ -97,11 +102,6 @@ return; } - // Prevent any in progress animations from interfering with the timing on the - // animation completion callback. - ui::Layer* target_layer = drag_image_widget_->GetContentsView()->layer(); - target_layer->GetAnimator()->AbortAllAnimations(); - ui::ScopedLayerAnimationSettings animation_settings( target_layer->GetAnimator()); animation_settings.SetTweenType(gfx::Tween::FAST_OUT_LINEAR_IN);
diff --git a/ash/app_list/views/app_list_bubble_search_page.cc b/ash/app_list/views/app_list_bubble_search_page.cc index 2eea8efd..bc1efcd 100644 --- a/ash/app_list/views/app_list_bubble_search_page.cc +++ b/ash/app_list/views/app_list_bubble_search_page.cc
@@ -35,8 +35,10 @@ DCHECK(search_box_view_); SetUseDefaultFillLayout(true); - // The entire page scrolls. - auto* scroll = AddChildView(std::make_unique<views::ScrollView>()); + // The entire page scrolls. Use layer scrolling so that the contents will + // paint on top of the parent, which uses SetPaintToLayer(). + auto* scroll = AddChildView(std::make_unique<views::ScrollView>( + views::ScrollView::ScrollWithLayers::kEnabled)); scroll->ClipHeightTo(0, std::numeric_limits<int>::max()); scroll->SetDrawOverflowIndicator(false); scroll->SetHorizontalScrollBarMode(
diff --git a/ash/app_list/views/app_list_bubble_view.cc b/ash/app_list/views/app_list_bubble_view.cc index fd61d091..2152b37 100644 --- a/ash/app_list/views/app_list_bubble_view.cc +++ b/ash/app_list/views/app_list_bubble_view.cc
@@ -26,11 +26,15 @@ #include "base/check_op.h" #include "base/cxx17_backports.h" #include "base/i18n/rtl.h" +#include "third_party/skia/include/core/SkColor.h" #include "ui/base/ui_base_types.h" +#include "ui/compositor/layer.h" +#include "ui/compositor/layer_type.h" #include "ui/display/display.h" #include "ui/display/screen.h" #include "ui/gfx/geometry/insets.h" #include "ui/gfx/geometry/rect.h" +#include "ui/gfx/geometry/rounded_corners_f.h" #include "ui/views/bubble/bubble_border.h" #include "ui/views/controls/scroll_view.h" #include "ui/views/controls/textfield/textfield.h" @@ -42,12 +46,6 @@ namespace ash { namespace { -constexpr int kDefaultHeight = 688; - -// As of August 2021 the assistant cards require a minimum width of 640. If the -// cards become narrower then this could be reduced. -constexpr int kDefaultWidth = 640; - // Space between the AppListBubbleView and the top of the screen should be at // least this value plus the shelf height. constexpr int kExtraTopOfScreenSpacing = 16; @@ -102,28 +100,39 @@ AppListBubbleView::AppListBubbleView(AppListViewDelegate* view_delegate, aura::Window* root_window, ShelfAlignment shelf_alignment) - : view_delegate_(view_delegate) { + : BubbleDialogDelegateView(/*anchor_view=*/nullptr, + GetArrowCorner(shelf_alignment), + BubbleBorder::NO_SHADOW), + view_delegate_(view_delegate) { DCHECK(view_delegate); DCHECK(root_window); // The bubble is anchored to a screen corner point, but the API takes a rect. SetAnchorRect(gfx::Rect(GetAnchorPointInScreen(root_window, shelf_alignment), gfx::Size())); - SetArrow(GetArrowCorner(shelf_alignment)); SetButtons(ui::DIALOG_BUTTON_NONE); set_parent_window( Shell::GetContainer(root_window, kShellWindowId_AppListContainer)); - // Match the system tray bubble radius. - set_corner_radius(kUnifiedTrayCornerRadius); - // Remove the default margins so the content fills the bubble. set_margins(gfx::Insets()); - // TODO(https://crbug.com/1218229): Add background blur. See TrayBubbleView - // and BubbleBorder. - set_color(AshColorProvider::Get()->GetBaseLayerColor( - AshColorProvider::BaseLayerType::kOpaque)); + // Ensure the BubbleFrameView does not draw a background behind the bubble. + // set_use_custom_frame(false) does not work because BubbleDialogDelegateView + // requires a frame to compute its bounds. + set_color(SK_ColorTRANSPARENT); + + // Bubbles that use transparent colors should not paint their ClientViews to a + // layer as doing so could result in visual artifacts. + SetPaintClientToLayer(false); + + // Set up rounded corners and background blur, similar to TrayBubbleView. + SetPaintToLayer(ui::LAYER_SOLID_COLOR); + layer()->SetRoundedCornerRadius( + gfx::RoundedCornersF{kUnifiedTrayCornerRadius}); + layer()->SetFillsBoundsOpaquely(false); + layer()->SetIsFastRoundedCorner(true); + layer()->SetBackgroundBlur(kUnifiedMenuBackgroundBlur); // Arrow left/right and up/down triggers the same focus movement as // tab/shift+tab. @@ -212,17 +221,25 @@ } gfx::Size AppListBubbleView::CalculatePreferredSize() const { - int height = kDefaultHeight - margins().height(); - int width = kDefaultWidth - margins().width(); - display::Display display = - display::Screen::GetScreen()->GetDisplayNearestWindow( - GetWidget()->GetNativeWindow()); - gfx::Rect work_area = GetWorkAreaForBubble(GetWidget()->GetNativeWindow()); + const int default_height = 688; + // As of August 2021 the assistant cards require a minimum width of 640. If + // the cards become narrower then this could be reduced. + const int default_width = 640; + const int shelf_size = ShelfConfig::Get()->shelf_size(); + const gfx::Rect work_area = + GetWorkAreaForBubble(GetWidget()->GetNativeWindow()); + int height = default_height; - if (display.bounds().height() < 800) { - height = work_area.height() - margins().height() - - ShelfConfig::Get()->shelf_size() - kExtraTopOfScreenSpacing; - } else if (display.bounds().height() > 1200) { + // If the work area height is too small to fit the default size bubble, then + // calculate a smaller height to fit in the work area. Otherwise, if the work + // area height is tall enough to fit at least two default sized bubbles, then + // calculate a taller bubble with height taking no more than half the work + // area. + if (work_area.height() < + default_height + shelf_size + kExtraTopOfScreenSpacing) { + height = work_area.height() - shelf_size - kExtraTopOfScreenSpacing; + } else if (work_area.height() > + default_height * 2 + shelf_size + kExtraTopOfScreenSpacing) { // Calculate the height required to fit the contents of the AppListBubble // with no scrolling. int height_to_fit_all_apps = @@ -230,15 +247,13 @@ search_box_view_->GetPreferredSize().height(); int max_height = - (work_area.height() - margins().height() - - ShelfConfig::Get()->shelf_size() + kExtraTopOfScreenSpacing) / - 2; + (work_area.height() - shelf_size - kExtraTopOfScreenSpacing) / 2; - height = base::clamp(height_to_fit_all_apps, - kDefaultHeight - margins().height(), max_height); + DCHECK_GE(max_height, default_height); + height = base::clamp(height_to_fit_all_apps, default_height, max_height); } - return gfx::Size(width, height); + return gfx::Size(default_width, height); } void AppListBubbleView::OnPaint(gfx::Canvas* canvas) { @@ -255,6 +270,13 @@ views::View::OnPaint(canvas); } +void AppListBubbleView::OnThemeChanged() { + views::BubbleDialogDelegateView::OnThemeChanged(); + + layer()->SetColor(AshColorProvider::Get()->GetBaseLayerColor( + AshColorProvider::BaseLayerType::kTransparent80)); +} + void AppListBubbleView::QueryChanged(SearchBoxViewBase* sender) { DCHECK_EQ(sender, search_box_view_); // TODO(https://crbug.com/1204551): Animated transitions.
diff --git a/ash/app_list/views/app_list_bubble_view.h b/ash/app_list/views/app_list_bubble_view.h index b3e23da..853191d 100644 --- a/ash/app_list/views/app_list_bubble_view.h +++ b/ash/app_list/views/app_list_bubble_view.h
@@ -22,7 +22,10 @@ class SearchBoxView; enum class ShelfAlignment; -// Contains the views for the bubble version of the launcher. +// Contains the views for the bubble version of the launcher. It looks like a +// system tray bubble. It derives from BubbleDialogDelegateView instead of +// TrayBubbleView because it takes focus by default, uses a different +// EventHandler for closing, and isn't tied to the system tray area. class ASH_EXPORT AppListBubbleView : public views::BubbleDialogDelegateView, public SearchBoxViewDelegate { public: @@ -51,6 +54,7 @@ bool AcceleratorPressed(const ui::Accelerator& accelerator) override; gfx::Size CalculatePreferredSize() const override; void OnPaint(gfx::Canvas* canvas) override; + void OnThemeChanged() override; // SearchBoxViewDelegate: void QueryChanged(SearchBoxViewBase* sender) override;
diff --git a/ash/app_list/views/app_list_bubble_view_unittest.cc b/ash/app_list/views/app_list_bubble_view_unittest.cc index 868f13f..1bfcd39c 100644 --- a/ash/app_list/views/app_list_bubble_view_unittest.cc +++ b/ash/app_list/views/app_list_bubble_view_unittest.cc
@@ -22,12 +22,14 @@ #include "ash/constants/ash_features.h" #include "ash/shell.h" #include "ash/style/ash_color_provider.h" +#include "ash/system/tray/tray_constants.h" #include "ash/test/ash_test_base.h" #include "base/run_loop.h" #include "base/strings/string_number_conversions.h" #include "base/test/icu_test_util.h" #include "base/test/scoped_feature_list.h" #include "testing/gtest/include/gtest/gtest.h" +#include "ui/compositor/layer.h" #include "ui/display/display.h" #include "ui/events/keycodes/keyboard_codes_posix.h" #include "ui/gfx/geometry/point.h" @@ -143,6 +145,20 @@ base::test::ScopedFeatureList scoped_features_; }; +TEST_F(AppListBubbleViewTest, LayerConfiguration) { + ShowAppList(); + + // Verify that nothing has changed the layer configuration. + ui::Layer* layer = GetBubblePresenter()->bubble_view_for_test()->layer(); + ASSERT_TRUE(layer); + EXPECT_FALSE(layer->fills_bounds_opaquely()); + EXPECT_TRUE(layer->is_fast_rounded_corner()); + EXPECT_EQ(layer->background_blur(), kUnifiedMenuBackgroundBlur); + EXPECT_EQ(layer->background_color(), + AshColorProvider::Get()->GetBaseLayerColor( + AshColorProvider::BaseLayerType::kTransparent80)); +} + TEST_F(AppListBubbleViewTest, BubbleOpensInBottomLeftForBottomShelf) { GetPrimaryShelf()->SetAlignment(ShelfAlignment::kBottom); @@ -387,7 +403,8 @@ } TEST_F(AppListBubbleViewTest, BubbleSizedForDisplay) { - UpdateDisplay("800x800"); + const int default_bubble_height = 688; + UpdateDisplay("800x900"); AppListBubblePresenter* presenter = GetBubblePresenter(); presenter->Show(GetPrimaryDisplay().id()); @@ -395,7 +412,7 @@ // Check that the AppListBubble has the initial default bounds. EXPECT_EQ(640, client_view->bounds().width()); - EXPECT_EQ(688, client_view->bounds().height()); + EXPECT_EQ(default_bubble_height, client_view->bounds().height()); // Check that the space between the top of the AppListBubble and the top of // the screen is greater than the shelf size. @@ -412,6 +429,32 @@ // AppListBubble and the top of the screen is greater than the shelf size. EXPECT_GE(client_view->GetBoundsInScreen().y(), ShelfConfig::Get()->shelf_size()); + // The bubble height should be smaller than the default bubble height. + EXPECT_LT(client_view->bounds().height(), default_bubble_height); + + // Change the display height so that the work area is slightly smaller than + // twice the default bubble height. + UpdateDisplay("800x1470"); + presenter->Dismiss(); + presenter->Show(GetPrimaryDisplay().id()); + client_view = presenter->bubble_view_for_test()->parent(); + + // The bubble height should still be the default. + EXPECT_EQ(client_view->bounds().height(), default_bubble_height); + + // Change the display height so that the work area is slightly bigger than + // twice the default bubble height. Add apps so the bubble height grows to its + // maximum possible height. + UpdateDisplay("800x1490"); + presenter->Dismiss(); + AddAppItems(50); + presenter->Show(GetPrimaryDisplay().id()); + client_view = presenter->bubble_view_for_test()->parent(); + + // The bubble height should be slightly larger than the default bubble height, + // but less than half the display height. + EXPECT_GT(client_view->bounds().height(), default_bubble_height); + EXPECT_LT(client_view->bounds().height(), 1490 / 2); } // Test that the AppListBubbleView scales up with more apps on a larger display.
diff --git a/ash/app_list/views/app_list_view.cc b/ash/app_list/views/app_list_view.cc index 58b7c50..a024693 100644 --- a/ash/app_list/views/app_list_view.cc +++ b/ash/app_list/views/app_list_view.cc
@@ -637,6 +637,12 @@ state_animation_metrics_reporter_( std::make_unique<StateAnimationMetricsReporter>()) { CHECK(delegate); + // Default role of WidgetDelegate is ax::mojom::Role::kWindow which traps + // ChromeVox focus within the root view. Assign ax::mojom::Role::kGroup here + // to allow the focus to move from elements in app list view to search box. + // TODO(pbos): Should this be necessary with the OverrideNextFocus() used + // below? + SetAccessibleRole(ax::mojom::Role::kGroup); } AppListView::~AppListView() { @@ -935,13 +941,6 @@ SetBackgroundShieldColor(); } -ax::mojom::Role AppListView::GetAccessibleWindowRole() { - // Default role of root view is ax::mojom::Role::kWindow which traps ChromeVox - // focus within the root view. Assign ax::mojom::Role::kGroup here to allow - // the focus to move from elements in app list view to search box. - return ax::mojom::Role::kGroup; -} - const AppListConfig& AppListView::GetAppListConfig() const { return *app_list_config_; }
diff --git a/ash/app_list/views/app_list_view.h b/ash/app_list/views/app_list_view.h index 2be991b..3ea3f653 100644 --- a/ash/app_list/views/app_list_view.h +++ b/ash/app_list/views/app_list_view.h
@@ -209,9 +209,6 @@ void Layout() override; void OnThemeChanged() override; - // WidgetDelegate: - ax::mojom::Role GetAccessibleWindowRole() override; - // ui::EventHandler: void OnKeyEvent(ui::KeyEvent* event) override; void OnScrollEvent(ui::ScrollEvent* event) override;
diff --git a/ash/app_list/views/assistant/app_list_bubble_assistant_page.cc b/ash/app_list/views/assistant/app_list_bubble_assistant_page.cc index 46aa6f98..2f6168c 100644 --- a/ash/app_list/views/assistant/app_list_bubble_assistant_page.cc +++ b/ash/app_list/views/assistant/app_list_bubble_assistant_page.cc
@@ -27,6 +27,7 @@ layout->set_cross_axis_alignment( views::BoxLayout::CrossAxisAlignment::kCenter); + SetPaintToLayer(); SetBackground(views::CreateSolidBackground(assistant::ResolveAssistantColor( assistant_colors::ColorName::kBgAssistantPlate)));
diff --git a/ash/display/display_error_observer_unittest.cc b/ash/display/display_error_observer_unittest.cc index f70a3cf..e693b12 100644 --- a/ash/display/display_error_observer_unittest.cc +++ b/ash/display/display_error_observer_unittest.cc
@@ -43,7 +43,7 @@ }; TEST_F(DisplayErrorObserverTest, Normal) { - UpdateDisplay("200x200,300x300"); + UpdateDisplay("300x200,400x300"); observer()->OnDisplayModeChangeFailed( display::DisplayConfigurator::DisplayStateList(), display::MULTIPLE_DISPLAY_STATE_MULTI_MIRROR); @@ -52,7 +52,7 @@ } TEST_F(DisplayErrorObserverTest, CallTwice) { - UpdateDisplay("200x200,300x300"); + UpdateDisplay("300x200,400x300"); observer()->OnDisplayModeChangeFailed( display::DisplayConfigurator::DisplayStateList(), display::MULTIPLE_DISPLAY_STATE_MULTI_MIRROR); @@ -68,7 +68,7 @@ } TEST_F(DisplayErrorObserverTest, CallWithDifferentState) { - UpdateDisplay("200x200,300x300"); + UpdateDisplay("300x200,400x300"); observer()->OnDisplayModeChangeFailed( display::DisplayConfigurator::DisplayStateList(), display::MULTIPLE_DISPLAY_STATE_MULTI_MIRROR); @@ -85,7 +85,7 @@ TEST_F(DisplayErrorObserverTest, FailureWithInternalDisplay) { // Failure with a single internal display --> No notification. - UpdateDisplay("200x200,300x300"); + UpdateDisplay("300x200,400x300"); const int64_t internal_display_id = display_manager()->GetDisplayAt(0).id(); const int64_t external_display_id = display_manager()->GetDisplayAt(1).id(); display::test::ScopedSetInternalDisplayId set_internal(display_manager(),
diff --git a/ash/display/display_prefs_unittest.cc b/ash/display/display_prefs_unittest.cc index 5590607..ba9b6ea 100644 --- a/ash/display/display_prefs_unittest.cc +++ b/ash/display/display_prefs_unittest.cc
@@ -305,7 +305,7 @@ // displays. So set internal display first before adding display. display::test::ScopedSetInternalDisplayId set_internal(display_manager(), id1); - UpdateDisplay("300x200*2, 400x300#400x400|300x200*1.25"); + UpdateDisplay("300x200*2, 400x300#500x400|300x200*1.25"); display::test::DisplayManagerTestApi display_manager_test(display_manager()); int64_t id2 = display_manager_test.GetSecondaryDisplay().id(); int64_t dummy_id = display::GetNextSynthesizedDisplayId(id2);
diff --git a/ash/display/extended_mouse_warp_controller_unittest.cc b/ash/display/extended_mouse_warp_controller_unittest.cc index 93368781..c7363592 100644 --- a/ash/display/extended_mouse_warp_controller_unittest.cc +++ b/ash/display/extended_mouse_warp_controller_unittest.cc
@@ -394,7 +394,7 @@ DISABLED_CheckHostPointToScreenInMouseWarpRegion) { // Zoom factor is needed to trigger rounding error which occured in previous // code. - UpdateDisplay("50+50-200x200@0.8,50+300-300x100/r"); + UpdateDisplay("50+50-300x200@0.8,50+300-300x100/r"); aura::Window::Windows root_windows = Shell::Get()->GetAllRootWindows();
diff --git a/ash/display/mirror_window_controller_unittest.cc b/ash/display/mirror_window_controller_unittest.cc index e9ee340..e955fd6 100644 --- a/ash/display/mirror_window_controller_unittest.cc +++ b/ash/display/mirror_window_controller_unittest.cc
@@ -48,7 +48,7 @@ void SetUp() override { base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( - ::switches::kHostWindowBounds, "1+1-300x300,1+301-300x300"); + ::switches::kHostWindowBounds, "1+1-400x300,1+301-400x300"); base::CommandLine::ForCurrentProcess()->AppendSwitch( ::switches::kEnableSoftwareMirroring); AshTestBase::SetUp();
diff --git a/ash/display/mouse_cursor_event_filter_unittest.cc b/ash/display/mouse_cursor_event_filter_unittest.cc index 0baca6d..c403add 100644 --- a/ash/display/mouse_cursor_event_filter_unittest.cc +++ b/ash/display/mouse_cursor_event_filter_unittest.cc
@@ -142,7 +142,7 @@ // across root windows with different device scale factors // (http://crbug.com/154183). TEST_F(MouseCursorEventFilterTest, CursorDeviceScaleFactor) { - UpdateDisplay("400x400,800x800*2"); + UpdateDisplay("400x300,800x800*2"); display_manager()->SetLayoutForCurrentDisplays( display::test::CreateDisplayLayout(display_manager(), display::DisplayPlacement::RIGHT, 0));
diff --git a/ash/display/resolution_notification_controller_unittest.cc b/ash/display/resolution_notification_controller_unittest.cc index c7a3ee3fc..57f55d70 100644 --- a/ash/display/resolution_notification_controller_unittest.cc +++ b/ash/display/resolution_notification_controller_unittest.cc
@@ -187,7 +187,7 @@ // Basic behaviors and verifies it doesn't cause crashes. TEST_P(ResolutionNotificationControllerTest, Basic) { - UpdateDisplay("300x300#300x300%57|200x200%58,250x250#250x250%60|200x200%59"); + UpdateDisplay("400x300#400x300%57|300x200%58,250x250#250x250%60|300x200%59"); display::test::DisplayManagerTestApi display_manager_test(display_manager()); int64_t id2 = display_manager_test.GetSecondaryDisplay().id(); ASSERT_EQ(0, accept_count()); @@ -195,14 +195,14 @@ // Changes the resolution and apply the result. SetDisplayResolutionAndNotify(display_manager_test.GetSecondaryDisplay(), - gfx::Size(200, 200), 59, /*old_is_native=*/true, + gfx::Size(300, 200), 59, /*old_is_native=*/true, /*new_is_native=*/false); EXPECT_TRUE(IsNotificationVisible()); - EXPECT_EQ(ExpectedNotificationMessage(id2, gfx::Size(200, 200), 59), + EXPECT_EQ(ExpectedNotificationMessage(id2, gfx::Size(300, 200), 59), GetNotificationMessage()); display::ManagedDisplayMode mode; EXPECT_TRUE(display_manager()->GetSelectedModeForDisplayId(id2, &mode)); - EXPECT_EQ("200x200", mode.size().ToString()); + EXPECT_EQ("300x200", mode.size().ToString()); EXPECT_EQ(59.0, mode.refresh_rate()); // Click the revert button, which reverts to the best resolution. @@ -217,7 +217,7 @@ // Check that notification is not shown when changes are forced by policy. TEST_P(ResolutionNotificationControllerTest, ForcedByPolicy) { - UpdateDisplay("300x300#300x300%57|200x200%58,250x250#250x250%59|200x200%60"); + UpdateDisplay("400x300#400x300%57|300x200%58,250x250#250x250%59|300x200%60"); display::test::DisplayManagerTestApi display_manager_test(display_manager()); int64_t id2 = display_manager_test.GetSecondaryDisplay().id(); ASSERT_EQ(0, accept_count()); @@ -225,18 +225,18 @@ // Changes the resolution and apply the result. SetDisplayResolutionAndNotify(display_manager_test.GetSecondaryDisplay(), - gfx::Size(200, 200), 60, /*old_is_native=*/true, + gfx::Size(300, 200), 60, /*old_is_native=*/true, /*new_is_native=*/false, mojom::DisplayConfigSource::kPolicy); EXPECT_FALSE(IsNotificationVisible()); display::ManagedDisplayMode mode; EXPECT_TRUE(display_manager()->GetSelectedModeForDisplayId(id2, &mode)); - EXPECT_EQ("200x200", mode.size().ToString()); + EXPECT_EQ("300x200", mode.size().ToString()); EXPECT_EQ(60.0, mode.refresh_rate()); } TEST_P(ResolutionNotificationControllerTest, ClickMeansAccept) { - UpdateDisplay("300x300#300x300%57|200x200%58,250x250#250x250%59|200x200%60"); + UpdateDisplay("400x300#400x300%57|300x200%58,250x250#250x250%59|300x200%60"); display::test::DisplayManagerTestApi display_manager_test(display_manager()); int64_t id2 = display_manager_test.GetSecondaryDisplay().id(); ASSERT_EQ(0, accept_count()); @@ -244,12 +244,12 @@ // Changes the resolution and apply the result. SetDisplayResolutionAndNotify(display_manager_test.GetSecondaryDisplay(), - gfx::Size(200, 200), 60, /*old_is_native=*/true, + gfx::Size(300, 200), 60, /*old_is_native=*/true, /*new_is_native=*/false); EXPECT_TRUE(IsNotificationVisible()); display::ManagedDisplayMode mode; EXPECT_TRUE(display_manager()->GetSelectedModeForDisplayId(id2, &mode)); - EXPECT_EQ("200x200", mode.size().ToString()); + EXPECT_EQ("300x200", mode.size().ToString()); EXPECT_EQ(60.0, mode.refresh_rate()); ClickOnNotification(); @@ -257,15 +257,15 @@ EXPECT_FALSE(IsNotificationVisible()); EXPECT_EQ(1, accept_count()); EXPECT_TRUE(display_manager()->GetSelectedModeForDisplayId(id2, &mode)); - EXPECT_EQ("200x200", mode.size().ToString()); + EXPECT_EQ("300x200", mode.size().ToString()); EXPECT_EQ(60.0, mode.refresh_rate()); } TEST_P(ResolutionNotificationControllerTest, AcceptButton) { - UpdateDisplay("300x300#300x300%59|200x200%60"); + UpdateDisplay("400x300#400x300%59|300x200%60"); const display::Display& display = display::Screen::GetScreen()->GetPrimaryDisplay(); - SetDisplayResolutionAndNotify(display, gfx::Size(200, 200), 60, + SetDisplayResolutionAndNotify(display, gfx::Size(300, 200), 60, /*old_is_native=*/true, /*new_is_native=*/false); EXPECT_TRUE(IsNotificationVisible()); @@ -280,12 +280,12 @@ EXPECT_TRUE( display_manager()->GetSelectedModeForDisplayId(display.id(), &mode)); - EXPECT_EQ("200x200", mode.size().ToString()); + EXPECT_EQ("300x200", mode.size().ToString()); EXPECT_EQ(60.0f, mode.refresh_rate()); // In that case the second button is revert. - UpdateDisplay("300x300#300x300%60|200x200%59"); - SetDisplayResolutionAndNotify(display, gfx::Size(200, 200), 59, + UpdateDisplay("400x300#400x300%60|300x200%59"); + SetDisplayResolutionAndNotify(display, gfx::Size(300, 200), 59, /*old_is_native=*/true, /*new_is_native=*/false); EXPECT_TRUE(IsNotificationVisible()); @@ -298,12 +298,12 @@ EXPECT_TRUE( display_manager()->GetSelectedModeForDisplayId(display.id(), &mode)); - EXPECT_EQ("300x300", mode.size().ToString()); + EXPECT_EQ("400x300", mode.size().ToString()); EXPECT_EQ(60.0f, mode.refresh_rate()); } TEST_P(ResolutionNotificationControllerTest, Close) { - UpdateDisplay("100x100,150x150#150x150%59|200x200%60"); + UpdateDisplay("100x100,150x150#150x150%59|300x200%60"); display::test::DisplayManagerTestApi display_manager_test(display_manager()); int64_t id2 = display_manager_test.GetSecondaryDisplay().id(); ASSERT_EQ(0, accept_count()); @@ -311,12 +311,12 @@ // Changes the resolution and apply the result. SetDisplayResolutionAndNotify( - display_manager_test.GetSecondaryDisplay(), gfx::Size(200, 200), 60, + display_manager_test.GetSecondaryDisplay(), gfx::Size(300, 200), 60, /*old_is_native=*/false, /*new_is_native=*/true); EXPECT_TRUE(IsNotificationVisible()); display::ManagedDisplayMode mode; EXPECT_TRUE(display_manager()->GetSelectedModeForDisplayId(id2, &mode)); - EXPECT_EQ("200x200", mode.size().ToString()); + EXPECT_EQ("300x200", mode.size().ToString()); EXPECT_EQ(60.0f, mode.refresh_rate()); // Close the notification (imitates clicking [x] button). Also verifies if @@ -328,10 +328,10 @@ } TEST_P(ResolutionNotificationControllerTest, Timeout) { - UpdateDisplay("300x300#300x300%60|200x200%60"); + UpdateDisplay("400x300#400x300%60|300x200%60"); const display::Display& display = display::Screen::GetScreen()->GetPrimaryDisplay(); - SetDisplayResolutionAndNotify(display, gfx::Size(200, 200), 60, + SetDisplayResolutionAndNotify(display, gfx::Size(300, 200), 60, /*old_is_native=*/true, /*new_is_native=*/false); @@ -346,14 +346,14 @@ display::ManagedDisplayMode mode; EXPECT_TRUE( display_manager()->GetSelectedModeForDisplayId(display.id(), &mode)); - EXPECT_EQ("300x300", mode.size().ToString()); + EXPECT_EQ("400x300", mode.size().ToString()); EXPECT_EQ(60.0f, mode.refresh_rate()); } TEST_P(ResolutionNotificationControllerTest, DisplayDisconnected) { UpdateDisplay( - "300x300#300x300%56|200x200%57," - "200x200#250x250%58|200x200%60|100x100%60"); + "400x300#400x300%56|300x200%57," + "300x200#250x250%58|300x200%60|100x100%60"); display::test::DisplayManagerTestApi display_manager_test(display_manager()); int64_t id2 = display_manager_test.GetSecondaryDisplay().id(); SetDisplayResolutionAndNotify( @@ -362,58 +362,58 @@ ASSERT_TRUE(IsNotificationVisible()); // Disconnects the secondary display and verifies it doesn't cause crashes. - UpdateDisplay("300x300#300x300%60|200x200%60"); + UpdateDisplay("400x300#400x300%60|300x200%60"); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(IsNotificationVisible()); EXPECT_EQ(0, accept_count()); display::ManagedDisplayMode mode; EXPECT_TRUE(display_manager()->GetSelectedModeForDisplayId(id2, &mode)); - EXPECT_EQ("200x200", mode.size().ToString()); + EXPECT_EQ("300x200", mode.size().ToString()); EXPECT_EQ(60.0f, mode.refresh_rate()); } // See http://crbug.com/869401 for details. TEST_P(ResolutionNotificationControllerTest, MultipleResolutionChange) { UpdateDisplay( - "300x300#300x300%56|200x200%57," - "250x250#250x250%58|200x200%59"); + "400x300#400x300%56|300x200%57," + "350x250#350x250%58|300x200%59"); display::test::DisplayManagerTestApi display_manager_test(display_manager()); int64_t id2 = display_manager_test.GetSecondaryDisplay().id(); SetDisplayResolutionAndNotify(display_manager_test.GetSecondaryDisplay(), - gfx::Size(200, 200), 59, /*old_is_native=*/true, + gfx::Size(300, 200), 59, /*old_is_native=*/true, /*new_is_native=*/false); EXPECT_TRUE(IsNotificationVisible()); display::ManagedDisplayMode mode; EXPECT_TRUE(display_manager()->GetSelectedModeForDisplayId(id2, &mode)); - EXPECT_EQ("200x200", mode.size().ToString()); + EXPECT_EQ("300x200", mode.size().ToString()); EXPECT_EQ(59.0f, mode.refresh_rate()); // Invokes SetDisplayResolutionAndNotify during the previous notification is // visible. SetDisplayResolutionAndNotify( - display_manager_test.GetSecondaryDisplay(), gfx::Size(250, 250), 58, + display_manager_test.GetSecondaryDisplay(), gfx::Size(350, 250), 58, /*old_is_native=*/false, /*new_is_native=*/true); EXPECT_TRUE(display_manager()->GetSelectedModeForDisplayId(id2, &mode)); - EXPECT_EQ("250x250", mode.size().ToString()); + EXPECT_EQ("350x250", mode.size().ToString()); EXPECT_EQ(58.0f, mode.refresh_rate()); // Then, click the revert button. Although |old_resolution| for the second - // SetDisplayResolutionAndNotify is 200x200, it should revert to the original - // size 250x250. + // SetDisplayResolutionAndNotify is 300x200, it should revert to the original + // size 350x250. CancelNotification(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(IsNotificationVisible()); EXPECT_EQ(0, accept_count()); EXPECT_TRUE(display_manager()->GetSelectedModeForDisplayId(id2, &mode)); - EXPECT_EQ("250x250", mode.size().ToString()); + EXPECT_EQ("350x250", mode.size().ToString()); EXPECT_EQ(58.0f, mode.refresh_rate()); } TEST_P(ResolutionNotificationControllerTest, Fallback) { UpdateDisplay( - "300x300#300x300%56|200x200%57," - "250x250#250x250%60|220x220%60|200x200%60"); + "400x300#400x300%56|300x200%57," + "350x250#350x250%60|220x210%60|300x200%60"); display::test::DisplayManagerTestApi display_manager_test(display_manager()); int64_t id2 = display_manager_test.GetSecondaryDisplay().id(); ASSERT_EQ(0, accept_count()); @@ -421,15 +421,15 @@ // Changes the resolution and apply the result. SetDisplayResolutionAndNotifyWithResolution( - display_manager_test.GetSecondaryDisplay(), gfx::Size(220, 220), - gfx::Size(200, 200), 60, /*old_is_native=*/true, /*new_is_native=*/false); + display_manager_test.GetSecondaryDisplay(), gfx::Size(220, 210), + gfx::Size(300, 200), 60, /*old_is_native=*/true, /*new_is_native=*/false); EXPECT_TRUE(IsNotificationVisible()); - EXPECT_EQ(ExpectedFallbackNotificationMessage(id2, gfx::Size(220, 220), 60, - gfx::Size(200, 200), 60), + EXPECT_EQ(ExpectedFallbackNotificationMessage(id2, gfx::Size(220, 210), 60, + gfx::Size(300, 200), 60), GetNotificationMessage()); display::ManagedDisplayMode mode; EXPECT_TRUE(display_manager()->GetSelectedModeForDisplayId(id2, &mode)); - EXPECT_EQ("200x200", mode.size().ToString()); + EXPECT_EQ("300x200", mode.size().ToString()); EXPECT_EQ(60.0f, mode.refresh_rate()); // Click the revert button, which reverts to the best resolution. @@ -439,7 +439,7 @@ EXPECT_EQ(0, accept_count()); EXPECT_TRUE(display_manager()->GetSelectedModeForDisplayId(id2, &mode)); - EXPECT_EQ("250x250", mode.size().ToString()); + EXPECT_EQ("350x250", mode.size().ToString()); EXPECT_EQ(60.0f, mode.refresh_rate()); } @@ -455,10 +455,10 @@ EXPECT_EQ(LoginStatus::KIOSK_APP, Shell::Get()->session_controller()->login_status()); - UpdateDisplay("300x300#300x300%59|200x200%60"); + UpdateDisplay("400x300#400x300%59|300x200%60"); const display::Display& display = display::Screen::GetScreen()->GetPrimaryDisplay(); - SetDisplayResolutionAndNotify(display, gfx::Size(200, 200), 60, + SetDisplayResolutionAndNotify(display, gfx::Size(300, 200), 60, /*old_is_native=*/true, /*new_is_native=*/false); } @@ -475,7 +475,7 @@ EXPECT_EQ(LoginStatus::KIOSK_APP, Shell::Get()->session_controller()->login_status()); - UpdateDisplay("100x100,150x150#150x150%59|200x200%60"); + UpdateDisplay("200x100,250x150#250x150%59|300x200%60"); display::test::DisplayManagerTestApi display_manager_test(display_manager()); int64_t id2 = display_manager_test.GetSecondaryDisplay().id(); ASSERT_EQ(0, accept_count()); @@ -483,12 +483,12 @@ // Changes the resolution and apply the result. SetDisplayResolutionAndNotify( - display_manager_test.GetSecondaryDisplay(), gfx::Size(200, 200), 60, + display_manager_test.GetSecondaryDisplay(), gfx::Size(300, 200), 60, /*old_is_native=*/false, /*new_is_native=*/true); EXPECT_FALSE(IsNotificationVisible()); display::ManagedDisplayMode mode; EXPECT_TRUE(display_manager()->GetSelectedModeForDisplayId(id2, &mode)); - EXPECT_EQ("200x200", mode.size().ToString()); + EXPECT_EQ("300x200", mode.size().ToString()); EXPECT_EQ(60.0f, mode.refresh_rate()); }
diff --git a/ash/display/root_window_transformers_unittest.cc b/ash/display/root_window_transformers_unittest.cc index 8544e39..8ddf3ec4e 100644 --- a/ash/display/root_window_transformers_unittest.cc +++ b/ash/display/root_window_transformers_unittest.cc
@@ -314,7 +314,7 @@ TestEventHandler event_handler; Shell::Get()->AddPreTargetHandler(&event_handler); - UpdateDisplay("200x200*2"); + UpdateDisplay("300x200*2"); display::Display display = display::Screen::GetScreen()->GetPrimaryDisplay(); aura::Window::Windows root_windows = Shell::GetAllRootWindows(); aura::Window* root_window = root_windows[0];
diff --git a/ash/display/screen_ash_unittest.cc b/ash/display/screen_ash_unittest.cc index 081ed82..14e2f73 100644 --- a/ash/display/screen_ash_unittest.cc +++ b/ash/display/screen_ash_unittest.cc
@@ -16,25 +16,25 @@ // Tests that ScreenAsh::GetWindowAtScreenPoint() returns the correct window on // the correct display. TEST_F(ScreenAshTest, TestGetWindowAtScreenPoint) { - UpdateDisplay("200x200,400x400"); + UpdateDisplay("300x200,500x400"); aura::test::TestWindowDelegate delegate; std::unique_ptr<aura::Window> win1(CreateTestWindowInShellWithDelegate( &delegate, 0, gfx::Rect(0, 0, 200, 200))); std::unique_ptr<aura::Window> win2(CreateTestWindowInShellWithDelegate( - &delegate, 1, gfx::Rect(200, 200, 100, 100))); + &delegate, 1, gfx::Rect(300, 200, 100, 100))); ASSERT_NE(win1->GetRootWindow(), win2->GetRootWindow()); EXPECT_EQ(win1.get(), display::Screen::GetScreen()->GetWindowAtScreenPoint( gfx::Point(50, 60))); EXPECT_EQ(win2.get(), display::Screen::GetScreen()->GetWindowAtScreenPoint( - gfx::Point(250, 260))); + gfx::Point(350, 260))); } TEST_F(ScreenAshTest, GetDisplayForNewWindows) { - UpdateDisplay("200x200,400x400"); + UpdateDisplay("300x200,500x400"); display::Screen* screen = display::Screen::GetScreen(); const std::vector<display::Display> displays = screen->GetAllDisplays(); ASSERT_EQ(2u, displays.size());
diff --git a/ash/display/screen_position_controller_unittest.cc b/ash/display/screen_position_controller_unittest.cc index 18030146..f4c9f03a 100644 --- a/ash/display/screen_position_controller_unittest.cc +++ b/ash/display/screen_position_controller_unittest.cc
@@ -80,22 +80,22 @@ TEST_F(ScreenPositionControllerTest, ConvertHostPointToScreen) { // Make sure that the point is in host coordinates. (crbug.com/521919) - UpdateDisplay("100+100-200x200,100+300-200x200"); + UpdateDisplay("100+100-200x190,100+300-200x190"); // The point 150,210 should be in host coords, and detected as outside. EXPECT_EQ("350,10", ConvertHostPointToScreen(150, 210)); - UpdateDisplay("100+100-200x200,100+500-200x200"); + UpdateDisplay("100+100-200x190,100+500-200x190"); aura::Window::Windows root_windows = Shell::Get()->GetAllRootWindows(); EXPECT_EQ( "100,100", root_windows[0]->GetHost()->GetBoundsInPixels().origin().ToString()); - EXPECT_EQ("200x200", + EXPECT_EQ("200x190", root_windows[0]->GetHost()->GetBoundsInPixels().size().ToString()); EXPECT_EQ( "100,500", root_windows[1]->GetHost()->GetBoundsInPixels().origin().ToString()); - EXPECT_EQ("200x200", + EXPECT_EQ("200x190", root_windows[1]->GetHost()->GetBoundsInPixels().size().ToString()); const gfx::Point window_pos(100, 100); @@ -116,7 +116,7 @@ // The point is out of the all root windows. EXPECT_EQ("250,250", ConvertHostPointToScreen(250, 250)); // The point is on the secondary display. - EXPECT_EQ("50,200", ConvertHostPointToScreen(50, 400)); + EXPECT_EQ("50,190", ConvertHostPointToScreen(50, 400)); SetSecondaryDisplayLayout(display::DisplayPlacement::LEFT); // The point is on the primary root window. @@ -132,7 +132,7 @@ // The point is out of the all root windows. EXPECT_EQ("250,250", ConvertHostPointToScreen(250, 250)); // The point is on the secondary display. - EXPECT_EQ("50,-200", ConvertHostPointToScreen(50, 400)); + EXPECT_EQ("50,-190", ConvertHostPointToScreen(50, 400)); SetSecondaryDisplayLayout(display::DisplayPlacement::RIGHT); const gfx::Point window_pos2(300, 100); @@ -148,9 +148,9 @@ SetSecondaryDisplayLayout(display::DisplayPlacement::BOTTOM); // The point is on the secondary display. - EXPECT_EQ("50,250", ConvertHostPointToScreen(50, 50)); + EXPECT_EQ("50,240", ConvertHostPointToScreen(50, 50)); // The point is out of the all root windows. - EXPECT_EQ("250,450", ConvertHostPointToScreen(250, 250)); + EXPECT_EQ("250,440", ConvertHostPointToScreen(250, 250)); // The point is on the primary root window. EXPECT_EQ("50,0", ConvertHostPointToScreen(50, -400)); @@ -164,20 +164,20 @@ SetSecondaryDisplayLayout(display::DisplayPlacement::TOP); // The point is on the secondary display. - EXPECT_EQ("50,-150", ConvertHostPointToScreen(50, 50)); + EXPECT_EQ("50,-140", ConvertHostPointToScreen(50, 50)); // The point is out of the all root windows. - EXPECT_EQ("250,50", ConvertHostPointToScreen(250, 250)); + EXPECT_EQ("250,60", ConvertHostPointToScreen(250, 250)); // The point is on the primary root window. EXPECT_EQ("50,0", ConvertHostPointToScreen(50, -400)); } TEST_F(ScreenPositionControllerTest, ConvertHostPointToScreenHiDPI) { - UpdateDisplay("50+50-200x200*2,50+300-300x300"); + UpdateDisplay("50+50-200x190*2,50+300-300x290"); aura::Window::Windows root_windows = Shell::Get()->GetAllRootWindows(); - EXPECT_EQ("50,50 200x200", + EXPECT_EQ("50,50 200x190", root_windows[0]->GetHost()->GetBoundsInPixels().ToString()); - EXPECT_EQ("50,300 300x300", + EXPECT_EQ("50,300 300x290", root_windows[1]->GetHost()->GetBoundsInPixels().ToString()); // Put |window_| to the primary 2x display. @@ -188,12 +188,12 @@ EXPECT_EQ("15,15", ConvertHostPointToScreen(30, 30)); // Similar to above but the point is out of the all root windows. EXPECT_EQ("200,200", ConvertHostPointToScreen(400, 400)); - // Similar to above but the point is on the secondary display. + // Similar to above but the point is on the first display. EXPECT_EQ("100,15", ConvertHostPointToScreen(200, 30)); - // On secondary display. The position on the 2nd host window is (150,200) - // so the screen position is (100,0) + (150,200). - EXPECT_EQ("250,200", ConvertHostPointToScreen(150, 450)); + // On secondary display. The position on the 2nd host window is (100,95) + // and the relative position is (150, 100). + EXPECT_EQ("250,195", ConvertHostPointToScreen(150, 450)); // At the edge but still in the primary display. Remaining of the primary // display is (50, 50) but adding ~100 since it's 2x-display. @@ -205,7 +205,7 @@ TEST_F(ScreenPositionControllerTest, ConvertHostPointToScreenRotate) { // 1st display is rotated 90 clockise, and 2nd display is rotated // 270 clockwise. - UpdateDisplay("100+100-200x200/r,100+500-200x200/l"); + UpdateDisplay("100+100-200x190/r,100+500-200x190/l"); // Put |window_| to the 1st. window_->SetBoundsInScreen(gfx::Rect(20, 20, 50, 50), display::Screen::GetScreen()->GetPrimaryDisplay()); @@ -216,7 +216,7 @@ EXPECT_EQ("250,-50", ConvertHostPointToScreen(250, 250)); // The point is on the 2nd host. Point on 2nd host (30,150) - // rotate 270 clockwise -> (149, 30) - layout [+(200,0)] -> (349,30). - EXPECT_EQ("350,30", ConvertHostPointToScreen(30, 450)); + EXPECT_EQ("330,30", ConvertHostPointToScreen(30, 450)); // Move |window_| to the 2nd. window_->SetBoundsInScreen( @@ -228,9 +228,9 @@ // The point is on the 2nd host. (50,70) on 2n host - // roatate 270 clockwise -> (129,50) -layout [+(200,0)] -> (329,50) - EXPECT_EQ("330,50", ConvertHostPointToScreen(50, 70)); + EXPECT_EQ("310,50", ConvertHostPointToScreen(50, 70)); // The point is out of the host windows. - EXPECT_EQ("450,50", ConvertHostPointToScreen(50, -50)); + EXPECT_EQ("430,50", ConvertHostPointToScreen(50, -50)); // The point is on the 2nd host. Point on 2nd host (50,50) - // rotate 90 clockwise -> (50, 149) EXPECT_EQ("50,150", ConvertHostPointToScreen(50, -350)); @@ -238,7 +238,7 @@ TEST_F(ScreenPositionControllerTest, ConvertHostPointToScreenZoomScale) { // 1st display is 2x density with 1.5 UI scale. - UpdateDisplay("100+100-200x200*2@0.8,100+500-200x200"); + UpdateDisplay("100+100-200x190*2@0.8,100+500-200x190"); // Put |window_| to the 1st. window_->SetBoundsInScreen(gfx::Rect(20, 20, 50, 50), display::Screen::GetScreen()->GetPrimaryDisplay());
diff --git a/ash/display/touch_calibrator_controller_unittest.cc b/ash/display/touch_calibrator_controller_unittest.cc index bb771ffb..d407569c 100644 --- a/ash/display/touch_calibrator_controller_unittest.cc +++ b/ash/display/touch_calibrator_controller_unittest.cc
@@ -375,7 +375,7 @@ TEST_F(TouchCalibratorControllerTest, HighDPIMonitorsCalibration) { // Initialize 3 displays each with different device scale factors. - UpdateDisplay("500x500*2,300x300*3,500x500*1.5"); + UpdateDisplay("500x500*2,400x300*3,500x500*1.5"); // Index 0 points to the native internal display, we will calibrate the touch // display at index 2.
diff --git a/ash/drag_drop/drag_drop_controller_unittest.cc b/ash/drag_drop/drag_drop_controller_unittest.cc index 1055f17..759d8be 100644 --- a/ash/drag_drop/drag_drop_controller_unittest.cc +++ b/ash/drag_drop/drag_drop_controller_unittest.cc
@@ -1129,7 +1129,7 @@ // Verifies the drag image moves back to the position where drag is started // across displays when drag is cancelled. TEST_F(DragDropControllerTest, DragCancelAcrossDisplays) { - UpdateDisplay("400x400,400x400"); + UpdateDisplay("500x400,500x400"); aura::Window::Windows root_windows = Shell::Get()->GetAllRootWindows(); for (aura::Window::Windows::iterator iter = root_windows.begin(); iter != root_windows.end(); ++iter) { @@ -1210,7 +1210,7 @@ // Verifies that a drag is aborted if a display is disconnected during the drag. TEST_F(DragDropControllerTest, DragCancelOnDisplayDisconnect) { - UpdateDisplay("400x400,400x400"); + UpdateDisplay("500x400,500x400"); for (aura::Window* root : Shell::Get()->GetAllRootWindows()) { aura::client::SetDragDropClient(root, drag_drop_controller_.get()); }
diff --git a/ash/drag_drop/drag_drop_tracker_unittest.cc b/ash/drag_drop/drag_drop_tracker_unittest.cc index 034dcbe1..d1ffbc3f 100644 --- a/ash/drag_drop/drag_drop_tracker_unittest.cc +++ b/ash/drag_drop/drag_drop_tracker_unittest.cc
@@ -46,7 +46,7 @@ }; TEST_F(DragDropTrackerTest, GetTarget) { - UpdateDisplay("200x200,300x300"); + UpdateDisplay("200x300,400x300"); aura::Window::Windows root_windows = Shell::GetAllRootWindows(); EXPECT_EQ(2U, root_windows.size()); @@ -106,7 +106,7 @@ } TEST_F(DragDropTrackerTest, ConvertEvent) { - UpdateDisplay("200x200,300x300"); + UpdateDisplay("200x300,400x300"); aura::Window::Windows root_windows = Shell::GetAllRootWindows(); EXPECT_EQ(2U, root_windows.size());
diff --git a/ash/drag_drop/drag_drop_unittest.cc b/ash/drag_drop/drag_drop_unittest.cc index 3f179acaf..4732c497 100644 --- a/ash/drag_drop/drag_drop_unittest.cc +++ b/ash/drag_drop/drag_drop_unittest.cc
@@ -124,7 +124,7 @@ TEST_F(DragDropTest, DragDropAcrossMultiDisplay) { ui_controls::InstallUIControlsAura(test::CreateAshUIControls()); - UpdateDisplay("400x400,400x400"); + UpdateDisplay("400x300,400x300"); aura::Window::Windows root_windows = Shell::Get()->GetAllRootWindows(); auto draggable_view = std::make_unique<DraggableView>(); draggable_view->set_drag_controller(NULL);
diff --git a/ash/events/select_to_speak_event_handler_unittest.cc b/ash/events/select_to_speak_event_handler_unittest.cc index 9a751e4..82a8432 100644 --- a/ash/events/select_to_speak_event_handler_unittest.cc +++ b/ash/events/select_to_speak_event_handler_unittest.cc
@@ -649,7 +649,7 @@ } TEST_F(SelectToSpeakEventHandlerTest, TouchFirstOfMultipleDisplays) { - UpdateDisplay("1+0-800x800,801+1-800x800"); + UpdateDisplay("1+0-800x700,801+1-800x700"); // On the first display. gfx::Point touch_location(200, 200); @@ -661,7 +661,7 @@ } TEST_F(SelectToSpeakEventHandlerTest, TouchSecondOfMultipleDisplays) { - UpdateDisplay("1+0-800x800,801+1-800x800"); + UpdateDisplay("1+0-800x700,801+1-800x700"); // On the second display. gfx::Point touch_location(1000, 200);
diff --git a/ash/focus_cycler_unittest.cc b/ash/focus_cycler_unittest.cc index 17bab8f..241c0cc 100644 --- a/ash/focus_cycler_unittest.cc +++ b/ash/focus_cycler_unittest.cc
@@ -383,10 +383,10 @@ TEST_F(FocusCyclerTest, RemoveWidgetOnDisplayRemoved) { // Two displays are added, so two shelf widgets and two status area widgets // are added to focus cycler. - UpdateDisplay("800x800, 500x500"); + UpdateDisplay("800x700, 500x500"); // Remove one display. Its shelf widget and status area widget should also be // removed from focus cycler. - UpdateDisplay("800x800"); + UpdateDisplay("800x700"); // Create a single test window. std::unique_ptr<Window> window(CreateTestWindowInShellWithId(0));
diff --git a/ash/quick_pair/pairing/fast_pair/fast_pair_gatt_service_client_impl.cc b/ash/quick_pair/pairing/fast_pair/fast_pair_gatt_service_client_impl.cc index da2d3993..cf43015 100644 --- a/ash/quick_pair/pairing/fast_pair/fast_pair_gatt_service_client_impl.cc +++ b/ash/quick_pair/pairing/fast_pair/fast_pair_gatt_service_client_impl.cc
@@ -144,6 +144,7 @@ gatt_service_discovery_timer_.Stop(); passkey_notify_session_timer_.Stop(); keybased_notify_session_timer_.Stop(); + write_request_timer_.Stop(); bluetooth_gatt_notify_sessions_.clear(); } @@ -326,6 +327,14 @@ DCHECK(!key_based_write_response_callback_); key_based_write_response_callback_ = std::move(write_response_callback); + + write_request_timer_.Start( + FROM_HERE, kConnectingTimeout, + base::BindOnce(&FastPairGattServiceClientImpl::OnWriteTimeout, + weak_ptr_factory_.GetWeakPtr(), + PairFailure::kKeyBasedPairingResponseTimeout, + key_based_characteristic_)); + key_based_characteristic_->WriteRemoteCharacteristic( CreateRequest(message_type, flags, provider_address, seekers_address), device::BluetoothRemoteGattCharacteristic::WriteType::kWithResponse, @@ -342,6 +351,11 @@ const std::vector<uint8_t>& value) { DCHECK_EQ(adapter, adapter_.get()); + // We check that the write response callback exists still before we run the + // callback with the response bytes to handle the case where the callback + // has already been used to notify error. This can happen if the timer for + // the write request fires with an error, and then the write request + // completes afterwards. if (characteristic == key_based_characteristic_ && key_based_write_response_callback_) { std::move(key_based_write_response_callback_) @@ -354,6 +368,18 @@ "characteristic successful."; } +void FastPairGattServiceClientImpl::OnWriteTimeout( + PairFailure failure, + device::BluetoothRemoteGattCharacteristic* characteristic) { + // We don't need to check that the write response callback exists still before + // we run the callback with the timeout PairFailure. If the callback is used + // to notify error before the timer expires, |NotifyWriteRequestError| + // will stop the timer before it fires here. + if (characteristic == key_based_characteristic_) { + NotifyWriteError(failure); + } +} + void FastPairGattServiceClientImpl::OnWriteRequestError( PairFailure failure, device::BluetoothGattService::GattErrorCode error) {
diff --git a/ash/quick_pair/pairing/fast_pair/fast_pair_gatt_service_client_impl.h b/ash/quick_pair/pairing/fast_pair/fast_pair_gatt_service_client_impl.h index 0d139d0..fbafbd1d 100644 --- a/ash/quick_pair/pairing/fast_pair/fast_pair_gatt_service_client_impl.h +++ b/ash/quick_pair/pairing/fast_pair/fast_pair_gatt_service_client_impl.h
@@ -128,9 +128,14 @@ void OnWriteRequestError(PairFailure failure, device::BluetoothGattService::GattErrorCode error); + void OnWriteTimeout( + PairFailure failure, + device::BluetoothRemoteGattCharacteristic* characteristic); + base::OneShotTimer gatt_service_discovery_timer_; base::OneShotTimer passkey_notify_session_timer_; base::OneShotTimer keybased_notify_session_timer_; + base::OneShotTimer write_request_timer_; base::OnceCallback<void(absl::optional<PairFailure>)> on_initialized_callback_;
diff --git a/ash/quick_pair/pairing/fast_pair/fast_pair_gatt_service_client_unittest.cc b/ash/quick_pair/pairing/fast_pair/fast_pair_gatt_service_client_unittest.cc index 4bda909..107cbc2 100644 --- a/ash/quick_pair/pairing/fast_pair/fast_pair_gatt_service_client_unittest.cc +++ b/ash/quick_pair/pairing/fast_pair/fast_pair_gatt_service_client_unittest.cc
@@ -179,7 +179,7 @@ testing::NiceMock<device::MockBluetoothGattNotifySession>>( GetWeakPtr()); - if (timeout_) + if (notify_timeout_) task_environment_->FastForwardBy(kConnectingTestTimeout); std::move(callback).Run(std::move(fake_notify_session)); @@ -195,6 +195,9 @@ return; } + if (write_timeout_) + task_environment_->FastForwardBy(kConnectingTestTimeout); + std::move(callback).Run(); } @@ -202,20 +205,27 @@ write_remote_error_ = write_remote_error; } + void SetWriteTimeout(bool write_timeout, + base::test::TaskEnvironment* task_environment) { + write_timeout_ = write_timeout; + task_environment_ = task_environment; + } + void SetNotifySessionError(bool notify_session_error) { notify_session_error_ = notify_session_error; } void SetNotifySessionTimeout(bool timeout, base::test::TaskEnvironment* task_environment) { - timeout_ = timeout; + notify_timeout_ = timeout; task_environment_ = task_environment; } private: bool notify_session_error_ = false; bool write_remote_error_ = false; - bool timeout_ = false; + bool notify_timeout_ = false; + bool write_timeout_ = false; base::test::TaskEnvironment* task_environment_ = nullptr; }; @@ -302,6 +312,11 @@ fake_key_based_characteristic_->SetWriteError(true); } + if (key_based_write_timeout_) { + fake_key_based_characteristic_->SetWriteTimeout(true, + &task_environment_); + } + temp_fake_key_based_characteristic_ = fake_key_based_characteristic_.get(); gatt_service_->AddMockCharacteristic( @@ -401,6 +416,8 @@ void SetKeyBasedWriteError() { key_based_write_error_ = true; } + void SetWriteRequestTimeout() { key_based_write_timeout_ = true; } + protected: base::test::TaskEnvironment task_environment_{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; @@ -416,6 +433,7 @@ bool passkey_notify_session_timeout_ = false; bool keybased_notify_session_timeout_ = false; bool key_based_write_error_ = false; + bool key_based_write_timeout_ = false; absl::optional<PairFailure> initalized_failure_; absl::optional<PairFailure> write_failure_; @@ -532,7 +550,21 @@ EXPECT_TRUE(ServiceIsSet()); WriteRequestToKeyBased(); TriggerKeyBasedGattChanged(); - EXPECT_NE(GetWriteCallbackResult(), absl::nullopt); + EXPECT_EQ(GetWriteCallbackResult(), + PairFailure::kKeyBasedPairingCharacteristicWrite); +} + +TEST_F(FastPairGattServiceClientTest, WriteKeyBasedRequestTimeout) { + SetWriteRequestTimeout(); + SuccessfulGattConnectionSetUp(); + NotifyGattDiscoveryCompleteForService(); + EXPECT_EQ(GetInitializedCallbackResult(), absl::nullopt); + EXPECT_TRUE(ServiceIsSet()); + WriteRequestToKeyBased(); + TriggerKeyBasedGattChanged(); + EXPECT_TRUE(ServiceIsSet()); + EXPECT_EQ(GetWriteCallbackResult(), + PairFailure::kKeyBasedPairingResponseTimeout); } } // namespace quick_pair
diff --git a/ash/root_window_controller_unittest.cc b/ash/root_window_controller_unittest.cc index de843dd8..ce207d2b 100644 --- a/ash/root_window_controller_unittest.cc +++ b/ash/root_window_controller_unittest.cc
@@ -132,10 +132,10 @@ TEST_F(RootWindowControllerTest, MoveWindows_Basic) { // Windows origin should be doubled when moved to the 1st display. - UpdateDisplay("600x600,300x300"); + UpdateDisplay("600x500,300x250"); aura::Window::Windows root_windows = Shell::GetAllRootWindows(); - int bottom_inset = 300 - ShelfConfig::Get()->shelf_size(); + int bottom_inset = 250 - ShelfConfig::Get()->shelf_size(); views::Widget* normal = CreateTestWidget(gfx::Rect(650, 10, 100, 100)); EXPECT_EQ(root_windows[1], normal->GetNativeView()->GetRootWindow()); EXPECT_EQ("650,10 100x100", normal->GetWindowBoundsInScreen().ToString()); @@ -164,8 +164,8 @@ fullscreen->SetFullscreen(true); EXPECT_EQ(root_windows[1], fullscreen->GetNativeView()->GetRootWindow()); - EXPECT_EQ("600,0 300x300", fullscreen->GetWindowBoundsInScreen().ToString()); - EXPECT_EQ("0,0 300x300", + EXPECT_EQ("600,0 300x250", fullscreen->GetWindowBoundsInScreen().ToString()); + EXPECT_EQ("0,0 300x250", fullscreen->GetNativeView()->GetBoundsInRootWindow().ToString()); views::Widget* unparented_control = new Widget; @@ -189,7 +189,7 @@ aura::client::GetFocusClient(root_windows[0])->FocusWindow(d2); tracker.Add(d2); - UpdateDisplay("600x600"); + UpdateDisplay("600x500"); // d2 must have been deleted. EXPECT_FALSE(tracker.Contains(d2)); @@ -199,7 +199,7 @@ EXPECT_EQ("100,20 100x100", normal->GetNativeView()->GetBoundsInRootWindow().ToString()); - bottom_inset = 600 - ShelfConfig::Get()->shelf_size(); + bottom_inset = 500 - ShelfConfig::Get()->shelf_size(); // First clear fullscreen status, since both fullscreen and maximized windows // share the same desktop workspace, which cancels the shelf status. @@ -224,8 +224,8 @@ EXPECT_EQ(root_windows[0], fullscreen->GetNativeView()->GetRootWindow()); EXPECT_TRUE(fullscreen->IsFullscreen()); - EXPECT_EQ("0,0 600x600", fullscreen->GetWindowBoundsInScreen().ToString()); - EXPECT_EQ("0,0 600x600", + EXPECT_EQ("0,0 600x500", fullscreen->GetWindowBoundsInScreen().ToString()); + EXPECT_EQ("0,0 600x500", fullscreen->GetNativeView()->GetBoundsInRootWindow().ToString()); // Test if the restore bounds are correctly updated. @@ -247,12 +247,12 @@ } TEST_F(RootWindowControllerTest, MoveWindows_Modal) { - UpdateDisplay("500x500,500x500"); + UpdateDisplay("500x400,500x600"); aura::Window::Windows root_windows = Shell::GetAllRootWindows(); // Emulate virtual screen coordinate system. - root_windows[0]->SetBounds(gfx::Rect(0, 0, 500, 500)); - root_windows[1]->SetBounds(gfx::Rect(500, 0, 500, 500)); + root_windows[0]->SetBounds(gfx::Rect(0, 0, 500, 400)); + root_windows[1]->SetBounds(gfx::Rect(500, 0, 500, 600)); views::Widget* normal = CreateTestWidget(gfx::Rect(300, 10, 100, 100)); EXPECT_EQ(root_windows[0], normal->GetNativeView()->GetRootWindow()); @@ -268,7 +268,7 @@ generator_1st.ClickLeftButton(); EXPECT_TRUE(wm::IsActiveWindow(modal->GetNativeView())); - UpdateDisplay("500x500"); + UpdateDisplay("500x400"); EXPECT_EQ(root_windows[0], modal->GetNativeView()->GetRootWindow()); EXPECT_TRUE(wm::IsActiveWindow(modal->GetNativeView())); generator_1st.ClickLeftButton(); @@ -279,7 +279,7 @@ TEST_F(RootWindowControllerTest, MoveWindows_LockWindowsInUnified) { display_manager()->SetUnifiedDesktopEnabled(true); - UpdateDisplay("500x500"); + UpdateDisplay("500x400"); const int kLockScreenWindowId = 1000; RootWindowController* controller = Shell::GetPrimaryRootWindowController(); @@ -294,17 +294,17 @@ ASSERT_EQ(lock_screen->GetNativeWindow(), controller->GetRootWindow()->GetChildById(kLockScreenWindowId)); - EXPECT_EQ("0,0 500x500", lock_screen->GetNativeWindow()->bounds().ToString()); + EXPECT_EQ("0,0 500x400", lock_screen->GetNativeWindow()->bounds().ToString()); // Switch to unified. - UpdateDisplay("500x500,500x500"); + UpdateDisplay("500x400,500x400"); // In unified mode, RWC is created controller = Shell::GetPrimaryRootWindowController(); ASSERT_EQ(lock_screen->GetNativeWindow(), controller->GetRootWindow()->GetChildById(kLockScreenWindowId)); - EXPECT_EQ("0,0 500x500", lock_screen->GetNativeWindow()->bounds().ToString()); + EXPECT_EQ("0,0 500x400", lock_screen->GetNativeWindow()->bounds().ToString()); // Switch to mirror. display_manager()->SetMirrorMode(display::MirrorMode::kNormal, absl::nullopt); @@ -313,7 +313,7 @@ controller = Shell::GetPrimaryRootWindowController(); ASSERT_EQ(lock_screen->GetNativeWindow(), controller->GetRootWindow()->GetChildById(kLockScreenWindowId)); - EXPECT_EQ("0,0 500x500", lock_screen->GetNativeWindow()->bounds().ToString()); + EXPECT_EQ("0,0 500x400", lock_screen->GetNativeWindow()->bounds().ToString()); // Switch to unified. display_manager()->SetMirrorMode(display::MirrorMode::kOff, absl::nullopt); @@ -323,7 +323,7 @@ ASSERT_EQ(lock_screen->GetNativeWindow(), controller->GetRootWindow()->GetChildById(kLockScreenWindowId)); - EXPECT_EQ("0,0 500x500", lock_screen->GetNativeWindow()->bounds().ToString()); + EXPECT_EQ("0,0 500x400", lock_screen->GetNativeWindow()->bounds().ToString()); // Switch to single display. UpdateDisplay("600x500"); @@ -339,7 +339,7 @@ // Tests that the moved windows maintain MRU ordering. TEST_F(RootWindowControllerTest, MoveWindows_MaintainMRUordering) { - UpdateDisplay("600x600,300x300"); + UpdateDisplay("600x500,300x250"); display::Screen* screen = display::Screen::GetScreen(); const display::Display primary_display = screen->GetPrimaryDisplay(); @@ -379,7 +379,7 @@ } TEST_F(RootWindowControllerTest, ModalContainer) { - UpdateDisplay("600x600"); + UpdateDisplay("600x500"); RootWindowController* controller = Shell::GetPrimaryRootWindowController(); EXPECT_TRUE(Shell::Get()->session_controller()->IsActiveUserSessionStarted()); EXPECT_EQ(GetLayoutManager(controller, kShellWindowId_SystemModalContainer), @@ -413,7 +413,7 @@ } TEST_F(RootWindowControllerTest, ModalContainerNotLoggedInLoggedIn) { - UpdateDisplay("600x600"); + UpdateDisplay("600x500"); // Configure login screen environment. SessionControllerImpl* session_controller = @@ -452,7 +452,7 @@ } TEST_F(RootWindowControllerTest, ModalContainerBlockedSession) { - UpdateDisplay("600x600"); + UpdateDisplay("600x500"); RootWindowController* controller = Shell::GetPrimaryRootWindowController(); aura::Window* lock_container = controller->GetContainer(kShellWindowId_LockScreenContainer); @@ -492,7 +492,7 @@ } TEST_F(RootWindowControllerTest, GetWindowForFullscreenMode) { - UpdateDisplay("600x600"); + UpdateDisplay("600x500"); RootWindowController* controller = Shell::GetPrimaryRootWindowController(); Widget* w1 = CreateTestWidget(gfx::Rect(0, 0, 100, 100)); @@ -523,7 +523,7 @@ } TEST_F(RootWindowControllerTest, MultipleDisplaysGetWindowForFullscreenMode) { - UpdateDisplay("600x600,600x600"); + UpdateDisplay("600x500,600x500"); Shell::RootWindowControllerList controllers = Shell::Get()->GetAllRootWindowControllers(); @@ -559,7 +559,7 @@ // Test that ForWindow() works with multiple displays and child widgets. TEST_F(RootWindowControllerTest, ForWindow) { - UpdateDisplay("600x600,600x600"); + UpdateDisplay("600x500,600x500"); Shell::RootWindowControllerList controllers = Shell::Get()->GetAllRootWindowControllers(); ASSERT_EQ(2u, controllers.size()); @@ -588,7 +588,7 @@ // Test that user session window can't be focused if user session blocked by // some overlapping UI. TEST_F(RootWindowControllerTest, FocusBlockedWindow) { - UpdateDisplay("600x600"); + UpdateDisplay("600x500"); RootWindowController* controller = Shell::GetPrimaryRootWindowController(); aura::Window* lock_container = controller->GetContainer(kShellWindowId_LockScreenContainer); @@ -890,7 +890,7 @@ TEST_F(VirtualKeyboardRootWindowControllerTest, EnsureCaretInWorkAreaWithMultipleDisplays) { - UpdateDisplay("500x500,600x600"); + UpdateDisplay("600x500,600x500"); const int64_t primary_display_id = display::Screen::GetScreen()->GetPrimaryDisplay().id(); const int64_t secondary_display_id = GetSecondaryDisplay().id();
diff --git a/ash/shelf/drag_handle_unittest.cc b/ash/shelf/drag_handle_unittest.cc index 1b90ce6..b6a69de 100644 --- a/ash/shelf/drag_handle_unittest.cc +++ b/ash/shelf/drag_handle_unittest.cc
@@ -81,7 +81,7 @@ TEST_P(DragHandleTest, AccessibilityFeaturesEnabled) { Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); - UpdateDisplay("800x800"); + UpdateDisplay("800x700"); // Create a widget to transition to the in-app shelf. TestWidgetBuilder() .SetTestWidgetDelegate()
diff --git a/ash/shelf/drag_window_from_shelf_controller_unittest.cc b/ash/shelf/drag_window_from_shelf_controller_unittest.cc index 99bb54b51..270af2e 100644 --- a/ash/shelf/drag_window_from_shelf_controller_unittest.cc +++ b/ash/shelf/drag_window_from_shelf_controller_unittest.cc
@@ -128,7 +128,7 @@ // kHideDuringWindowDragging. TEST_F(DragWindowFromShelfControllerTest, HideWindowDuringWindowDraggingWithFlag) { - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); const gfx::Rect shelf_bounds = Shelf::ForWindow(Shell::GetPrimaryRootWindow())->GetIdealBounds(); @@ -163,7 +163,7 @@ // windows correctly after dragging. TEST_F(DragWindowFromShelfControllerTest, HideWindowDuringWindowDraggingInSplitView) { - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); const gfx::Rect shelf_bounds = Shelf::ForWindow(Shell::GetPrimaryRootWindow())->GetIdealBounds(); @@ -222,7 +222,7 @@ // Test home launcher is hidden during dragging. TEST_F(DragWindowFromShelfControllerTest, HideHomeLauncherDuringDraggingTest) { - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); const gfx::Rect shelf_bounds = Shelf::ForWindow(Shell::GetPrimaryRootWindow())->GetIdealBounds(); auto window = CreateTestWindow(); @@ -241,7 +241,7 @@ // Test the windows that were hidden before drag started may or may not reshow, // depending on different scenarios. TEST_F(DragWindowFromShelfControllerTest, MayOrMayNotReShowHiddenWindows) { - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); const gfx::Rect shelf_bounds = Shelf::ForWindow(Shell::GetPrimaryRootWindow())->GetIdealBounds(); auto window2 = CreateTestWindow(); @@ -300,7 +300,7 @@ // Test during window dragging, if overview is open, the minimized windows can // show correctly in overview. TEST_F(DragWindowFromShelfControllerTest, MinimizedWindowsShowInOverview) { - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); const gfx::Rect shelf_bounds = Shelf::ForWindow(Shell::GetPrimaryRootWindow())->GetIdealBounds(); auto window3 = CreateTestWindow(); @@ -334,7 +334,7 @@ // Test when swiping up from the shelf, we only open overview when the y scroll // delta (velocity) decrease to kOpenOverviewThreshold or less. TEST_F(DragWindowFromShelfControllerTest, OpenOverviewWhenHold) { - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); const gfx::Rect shelf_bounds = Shelf::ForWindow(Shell::GetPrimaryRootWindow())->GetIdealBounds(); auto window = CreateTestWindow(); @@ -354,7 +354,7 @@ // |GetReturnToMaximizedThreshold| (the top of the hotseat), it will restore // back to its original position. TEST_F(DragWindowFromShelfControllerTest, RestoreWindowToOriginalBounds) { - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); const gfx::Rect shelf_bounds = Shelf::ForWindow(Shell::GetPrimaryRootWindow())->GetIdealBounds(); auto window = CreateTestWindow(); @@ -409,7 +409,7 @@ // Test if overview is active and splitview is not active, fling in overview may // or may not head to the home screen. TEST_F(DragWindowFromShelfControllerTest, FlingInOverview) { - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); const gfx::Rect shelf_bounds = Shelf::ForWindow(Shell::GetPrimaryRootWindow())->GetIdealBounds(); auto window = CreateTestWindow(); @@ -458,7 +458,7 @@ ui::ScopedAnimationDurationScaleMode non_zero_duration_mode( ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION); - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); const gfx::Rect shelf_bounds = Shelf::ForWindow(Shell::GetPrimaryRootWindow())->GetIdealBounds(); auto window = CreateTestWindow(); @@ -483,7 +483,7 @@ // Test if splitview is active when fling happens, the window will be put in // overview. TEST_F(DragWindowFromShelfControllerTest, DragOrFlingInSplitView) { - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); const gfx::Rect shelf_bounds = Shelf::ForWindow(Shell::GetPrimaryRootWindow())->GetIdealBounds(); @@ -554,7 +554,7 @@ // Test wallpaper should be blurred as in overview, even though overview might // not open during dragging. TEST_F(DragWindowFromShelfControllerTest, WallpaperBlurDuringDragging) { - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); const gfx::Rect shelf_bounds = Shelf::ForWindow(Shell::GetPrimaryRootWindow())->GetIdealBounds(); auto window = CreateTestWindow(); @@ -578,7 +578,7 @@ // Test overview is hidden during dragging and shown when drag slows down or // stops. TEST_F(DragWindowFromShelfControllerTest, HideOverviewDuringDragging) { - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); const gfx::Rect shelf_bounds = Shelf::ForWindow(Shell::GetPrimaryRootWindow())->GetIdealBounds(); auto window2 = CreateTestWindow(); @@ -620,7 +620,7 @@ // Check the split view drag indicators window dragging states. TEST_F(DragWindowFromShelfControllerTest, SplitViewDragIndicatorsWindowDraggingStates) { - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); const gfx::Rect shelf_bounds = Shelf::ForWindow(Shell::GetPrimaryRootWindow())->GetIdealBounds(); auto window = CreateTestWindow(); @@ -773,7 +773,7 @@ } TEST_F(DragWindowFromShelfControllerTest, DragToSnapMinDistance) { - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); const gfx::Rect shelf_bounds = Shelf::ForWindow(Shell::GetPrimaryRootWindow())->GetIdealBounds(); @@ -899,7 +899,7 @@ // Test that if overview is invisible when drag ends, the window will either be // restored or taken to the home screen. TEST_F(DragWindowFromShelfControllerTest, TestOverviewInvisible) { - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); const gfx::Rect shelf_bounds = Shelf::ForWindow(Shell::GetPrimaryRootWindow())->GetIdealBounds(); @@ -945,7 +945,7 @@ // to the home screen, even if drag satisfied min snap distance. TEST_F(DragWindowFromShelfControllerTest, TestOverviewInvisibleWithMinSnapDistance) { - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); const gfx::Rect shelf_bounds = Shelf::ForWindow(Shell::GetPrimaryRootWindow())->GetIdealBounds(); @@ -978,7 +978,7 @@ // Test that the original backdrop is restored in the drag window after drag // ends, no matter where the window ends. TEST_F(DragWindowFromShelfControllerTest, RestoreBackdropAfterDragEnds) { - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); const gfx::Rect shelf_bounds = Shelf::ForWindow(Shell::GetPrimaryRootWindow())->GetIdealBounds(); auto window = CreateTestWindow(); @@ -1052,7 +1052,7 @@ TEST_F(DragWindowFromShelfControllerTest, DoNotChangeActiveWindowDuringDragging) { - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); const gfx::Rect shelf_bounds = Shelf::ForWindow(Shell::GetPrimaryRootWindow())->GetIdealBounds(); auto window = CreateTestWindow(); @@ -1088,7 +1088,7 @@ overview_controller->set_delayed_animation_task_delay_for_test( base::TimeDelta::FromMilliseconds(100)); - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); const gfx::Rect shelf_bounds = Shelf::ForWindow(Shell::GetPrimaryRootWindow())->GetIdealBounds(); auto window = CreateTestWindow(); @@ -1222,7 +1222,7 @@ // still keep at the original snap position. TEST_F(DragWindowFromShelfControllerTest, KeepSplitWindowSnappedAfterRestoreToOriginalBounds) { - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); const gfx::Rect shelf_bounds = Shelf::ForWindow(Shell::GetPrimaryRootWindow())->GetIdealBounds();
diff --git a/ash/shelf/shelf_bubble.cc b/ash/shelf/shelf_bubble.cc index 5600f8f..6f80cb1 100644 --- a/ash/shelf/shelf_bubble.cc +++ b/ash/shelf/shelf_bubble.cc
@@ -47,19 +47,16 @@ set_parent_window( anchor_widget()->GetNativeWindow()->GetRootWindow()->GetChildById( kShellWindowId_SettingBubbleContainer)); + // We override the role because the base class sets it to alert dialog, + // which results in each tooltip title being announced twice on screen + // readers each time it is shown. + SetAccessibleRole(ax::mojom::Role::kDialog); } ShelfBubble::~ShelfBubble() { background_animator_.RemoveObserver(this); } -ax::mojom::Role ShelfBubble::GetAccessibleWindowRole() { - // We override the role because the base class sets it to alert dialog, - // which results in each tooltip title being announced twice on screen - // readers each time it is shown. - return ax::mojom::Role::kDialog; -} - void ShelfBubble::CreateBubble() { // Actually create the bubble. views::BubbleDialogDelegateView::CreateBubble(this);
diff --git a/ash/shelf/shelf_bubble.h b/ash/shelf/shelf_bubble.h index 140f833b..04c4177a 100644 --- a/ash/shelf/shelf_bubble.h +++ b/ash/shelf/shelf_bubble.h
@@ -27,9 +27,6 @@ SkColor background_color); ~ShelfBubble() override; - // views::BubbleDialogDelegateView - ax::mojom::Role GetAccessibleWindowRole() override; - // Returns true if we should close when we get a press down event within our // bounds. virtual bool ShouldCloseOnPressDown() = 0;
diff --git a/ash/shelf/shelf_layout_manager_unittest.cc b/ash/shelf/shelf_layout_manager_unittest.cc index 767e3888..d4c1127 100644 --- a/ash/shelf/shelf_layout_manager_unittest.cc +++ b/ash/shelf/shelf_layout_manager_unittest.cc
@@ -993,7 +993,7 @@ // hidden shelf. TEST_F(ShelfLayoutManagerTest, DualDisplayOpenAppListWithShelfAutoHideState) { // Create two displays. - UpdateDisplay("0+0-200x200,+200+0-100x100"); + UpdateDisplay("0+0-200x300,+200+0-100x200"); aura::Window::Windows root_windows = Shell::GetAllRootWindows(); EXPECT_EQ(root_windows.size(), 2U); @@ -1259,7 +1259,7 @@ // open when we have dual display. TEST_F(ShelfLayoutManagerTest, ShelfWithSystemModalWindowDualDisplay) { // Create two displays. - UpdateDisplay("200x200,100x100"); + UpdateDisplay("200x300,100x200"); aura::Window::Windows root_windows = Shell::GetAllRootWindows(); EXPECT_EQ(2U, root_windows.size());
diff --git a/ash/shelf/shelf_test_util.cc b/ash/shelf/shelf_test_util.cc index 9b46f22..4987cccf 100644 --- a/ash/shelf/shelf_test_util.cc +++ b/ash/shelf/shelf_test_util.cc
@@ -26,14 +26,22 @@ } // namespace // static -ShelfItem ShelfTestUtil::AddAppShortcut(const std::string id, - const ShelfItemType type) { +ShelfItem ShelfTestUtil::AddAppShortcut(const std::string& id, + ShelfItemType type) { + return AddAppShortcutWithIcon(id, type, gfx::ImageSkia()); +} + +// static +ShelfItem ShelfTestUtil::AddAppShortcutWithIcon(const std::string& id, + ShelfItemType type, + gfx::ImageSkia icon) { ShelfController* controller = Shell::Get()->shelf_controller(); ShelfItem item; item.type = type; if (type == TYPE_APP) item.status = STATUS_RUNNING; item.id = ShelfID(id); + item.image = icon; controller->model()->Add(item, std::make_unique<TestShelfItemDelegate>(item.id)); return item;
diff --git a/ash/shelf/shelf_test_util.h b/ash/shelf/shelf_test_util.h index d233c5b..b9f9dca 100644 --- a/ash/shelf/shelf_test_util.h +++ b/ash/shelf/shelf_test_util.h
@@ -10,15 +10,23 @@ #include "ash/public/cpp/shelf_item.h" #include "base/macros.h" +namespace gfx { +class ImageSkia; +} // namespace gfx + namespace ash { class ShelfTestUtil { public: // Adds an application shortcut to the shelf model, with the given identifier // and the given shelf item type. - static ShelfItem AddAppShortcut(const std::string id, - const ShelfItemType type); + static ShelfItem AddAppShortcut(const std::string& id, ShelfItemType type); + // Adds an application shortcut to the shelf model, with the given identifier, + // the given shelf item type, and the given icon. + static ShelfItem AddAppShortcutWithIcon(const std::string& id, + ShelfItemType type, + gfx::ImageSkia icon); DISALLOW_COPY_AND_ASSIGN(ShelfTestUtil); };
diff --git a/ash/shelf/shelf_view.cc b/ash/shelf/shelf_view.cc index 2276cb0..89e18f3 100644 --- a/ash/shelf/shelf_view.cc +++ b/ash/shelf/shelf_view.cc
@@ -1252,6 +1252,11 @@ if (index == -1 || view_model_->view_size() < 1) return; // View is being deleted, ignore request. + // Reset drag icon proxy from previous drag (which could be set if the drop + // animation is still in progress), as drag icon proxy is not expected to be + // reused after it starts animating out. + drag_icon_proxy_.reset(); + // Only when the repost event occurs on the same shelf item, we should ignore // the call in ShelfView::ButtonPressed(...). is_repost_event_on_same_item_ =
diff --git a/ash/shelf/shelf_view_unittest.cc b/ash/shelf/shelf_view_unittest.cc index 5dd42ca..957466e 100644 --- a/ash/shelf/shelf_view_unittest.cc +++ b/ash/shelf/shelf_view_unittest.cc
@@ -71,6 +71,7 @@ #include "ui/base/test/ui_controls.h" #include "ui/base/ui_base_features.h" #include "ui/compositor/layer.h" +#include "ui/compositor/scoped_animation_duration_scale_mode.h" #include "ui/display/display.h" #include "ui/display/screen.h" #include "ui/display/test/display_manager_test_api.h" @@ -98,6 +99,14 @@ namespace ash { namespace { +// Create a test 1x1 icon image with a given |color|. +gfx::ImageSkia CreateImageSkiaIcon(SkColor color) { + SkBitmap bitmap; + bitmap.allocN32Pixels(1, 1); + bitmap.eraseColor(color); + return gfx::ImageSkia::CreateFrom1xBitmap(bitmap); +} + class TestShelfItemDelegate : public ShelfItemDelegate { public: explicit TestShelfItemDelegate(const ShelfID& shelf_id) @@ -291,7 +300,7 @@ // Make sure creating/deleting an window on one displays notifies a // shelf on external display as well as one on primary. TEST_F(ShelfObserverIconTest, AddRemoveWithMultipleDisplays) { - UpdateDisplay("400x400,400x400"); + UpdateDisplay("500x400,500x400"); observer()->Reset(); Shelf* second_shelf = Shelf::ForWindow(Shell::GetAllRootWindows()[1]); @@ -385,8 +394,8 @@ protected: // Add shelf items of various types, and optionally wait for animations. ShelfID AddItem(ShelfItemType type, bool wait_for_animations) { - ShelfItem item = - ShelfTestUtil::AddAppShortcut(base::NumberToString(id_++), type); + ShelfItem item = ShelfTestUtil::AddAppShortcutWithIcon( + base::NumberToString(id_++), type, CreateImageSkiaIcon(SK_ColorRED)); // Set a delegate; some tests require one to select the item. model_->ReplaceShelfItemDelegate( item.id, std::make_unique<ShelfItemSelectionTracker>()); @@ -1114,6 +1123,41 @@ EXPECT_FALSE(IsAppPinned(GetItemId(index))); } +// Double click an app while animating drag icon drop. +TEST_P(LtrRtlShelfViewTest, ActivateAppButtonDuringDropAnimation) { + ui::test::EventGenerator* generator = GetEventGenerator(); + + // Enable animations, as the test verifies behavior while a drop animation is + // in progress. + ui::ScopedAnimationDurationScaleMode regular_animations( + ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION); + + // The test makes some assumptions that the shelf is bottom aligned. + ASSERT_EQ(shelf_view_->shelf()->alignment(), ShelfAlignment::kBottom); + + const ShelfID drag_item_id = AddApp(); + const ShelfID activated_item_id = AddApp(); + + // Watch for selection of the browser shortcut. + auto owned_selection_tracker = std::make_unique<ShelfItemSelectionTracker>(); + ShelfItemSelectionTracker* selection_tracker = owned_selection_tracker.get(); + model_->ReplaceShelfItemDelegate(activated_item_id, + std::move(owned_selection_tracker)); + + generator->set_current_screen_location( + GetButtonCenter(GetButtonByID(drag_item_id))); + generator->PressLeftButton(); + generator->MoveMouseBy(0, -ShelfConfig::Get()->shelf_size() / 2 - 1); + generator->ReleaseLeftButton(); + + generator->set_current_screen_location( + GetButtonCenter(GetButtonByID(activated_item_id))); + generator->DoubleClickLeftButton(); + + EXPECT_EQ(1u, selection_tracker->item_selected_count()); + VerifyShelfItemBoundsAreValid(); +} + // Confirm that item status changes are reflected in the buttons // for platform apps. TEST_P(LtrRtlShelfViewTest, ShelfItemStatusPlatformApp) {
diff --git a/ash/shelf/shelf_widget_unittest.cc b/ash/shelf/shelf_widget_unittest.cc index 95f994c..053fe1c4 100644 --- a/ash/shelf/shelf_widget_unittest.cc +++ b/ash/shelf/shelf_widget_unittest.cc
@@ -65,79 +65,79 @@ using ShelfWidgetTest = AshTestBase; TEST_F(ShelfWidgetTest, TestAlignment) { - UpdateDisplay("400x400"); + UpdateDisplay("401x400"); const int bottom_inset = 400 - ShelfConfig::Get()->shelf_size(); { SCOPED_TRACE("Single Bottom"); TestLauncherAlignment(Shell::GetPrimaryRootWindow(), ShelfAlignment::kBottom, - gfx::Rect(0, 0, 400, bottom_inset)); + gfx::Rect(0, 0, 401, bottom_inset)); } { SCOPED_TRACE("Single Locked"); TestLauncherAlignment(Shell::GetPrimaryRootWindow(), ShelfAlignment::kBottomLocked, - gfx::Rect(0, 0, 400, bottom_inset)); + gfx::Rect(0, 0, 401, bottom_inset)); } { SCOPED_TRACE("Single Right"); TestLauncherAlignment(Shell::GetPrimaryRootWindow(), ShelfAlignment::kRight, - gfx::Rect(0, 0, bottom_inset, 400)); + gfx::Rect(0, 0, bottom_inset + 1, 400)); } { SCOPED_TRACE("Single Left"); TestLauncherAlignment( Shell::GetPrimaryRootWindow(), ShelfAlignment::kLeft, - gfx::Rect(ShelfConfig::Get()->shelf_size(), 0, bottom_inset, 400)); + gfx::Rect(ShelfConfig::Get()->shelf_size(), 0, bottom_inset + 1, 400)); } } TEST_F(ShelfWidgetTest, TestAlignmentForMultipleDisplays) { - UpdateDisplay("300x300,500x500"); + UpdateDisplay("301x300,501x500"); const int shelf_inset_first = 300 - ShelfConfig::Get()->shelf_size(); const int shelf_inset_second = 500 - ShelfConfig::Get()->shelf_size(); aura::Window::Windows root_windows = Shell::GetAllRootWindows(); { SCOPED_TRACE("Primary Bottom"); TestLauncherAlignment(root_windows[0], ShelfAlignment::kBottom, - gfx::Rect(0, 0, 300, shelf_inset_first)); + gfx::Rect(0, 0, 301, shelf_inset_first)); } { SCOPED_TRACE("Primary Locked"); TestLauncherAlignment(root_windows[0], ShelfAlignment::kBottomLocked, - gfx::Rect(0, 0, 300, shelf_inset_first)); + gfx::Rect(0, 0, 301, shelf_inset_first)); } { SCOPED_TRACE("Primary Right"); TestLauncherAlignment(root_windows[0], ShelfAlignment::kRight, - gfx::Rect(0, 0, shelf_inset_first, 300)); + gfx::Rect(0, 0, shelf_inset_first + 1, 300)); } { SCOPED_TRACE("Primary Left"); - TestLauncherAlignment( - root_windows[0], ShelfAlignment::kLeft, - gfx::Rect(ShelfConfig::Get()->shelf_size(), 0, shelf_inset_first, 300)); + TestLauncherAlignment(root_windows[0], ShelfAlignment::kLeft, + gfx::Rect(ShelfConfig::Get()->shelf_size(), 0, + shelf_inset_first + 1, 300)); } { SCOPED_TRACE("Secondary Bottom"); TestLauncherAlignment(root_windows[1], ShelfAlignment::kBottom, - gfx::Rect(300, 0, 500, shelf_inset_second)); + gfx::Rect(301, 0, 501, shelf_inset_second)); } { SCOPED_TRACE("Secondary Locked"); TestLauncherAlignment(root_windows[1], ShelfAlignment::kBottomLocked, - gfx::Rect(300, 0, 500, shelf_inset_second)); + gfx::Rect(301, 0, 501, shelf_inset_second)); } { SCOPED_TRACE("Secondary Right"); TestLauncherAlignment(root_windows[1], ShelfAlignment::kRight, - gfx::Rect(300, 0, shelf_inset_second, 500)); + gfx::Rect(301, 0, shelf_inset_second + 1, 500)); } { SCOPED_TRACE("Secondary Left"); TestLauncherAlignment(root_windows[1], ShelfAlignment::kLeft, - gfx::Rect(300 + ShelfConfig::Get()->shelf_size(), 0, - shelf_inset_second, 500)); + gfx::Rect(301 + ShelfConfig::Get()->shelf_size(), 0, + shelf_inset_second + 1, 500)); } } @@ -333,7 +333,7 @@ // Tests that the shelf lets mouse-events close to the edge fall through to the // window underneath. TEST_F(ShelfWidgetTest, ShelfEdgeOverlappingWindowHitTestMouse) { - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); ShelfWidget* shelf_widget = GetShelfWidget(); gfx::Rect shelf_bounds = shelf_widget->GetWindowBoundsInScreen(); @@ -452,7 +452,7 @@ ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION); Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); - UpdateDisplay("800x800"); + UpdateDisplay("800x700"); ASSERT_FALSE(GetShelfWidget()->GetDragHandle()->GetVisible()); ASSERT_FALSE(GetShelfWidget()->GetOpaqueBackground()->visible()); @@ -469,7 +469,7 @@ // Ensure the ShelfWidget and drag handle have the correct bounds and // visibility for in-app shelf. EXPECT_EQ(GetShelfWidget()->GetWindowBoundsInScreen(), - gfx::Rect(0, 760, 800, 40)); + gfx::Rect(0, 660, 800, 40)); EXPECT_EQ(GetShelfWidget()->GetDragHandle()->bounds(), gfx::Rect(360, 18, 80, 4)); ASSERT_TRUE(GetShelfWidget()->GetDragHandle()->GetVisible()); @@ -484,7 +484,7 @@ // Tests the shelf widget does not animate for hotseat transitions during tablet // mode start. TEST_F(ShelfWidgetTest, NoAnimatingBackgroundDuringTabletModeStartToInApp) { - UpdateDisplay("800x800"); + UpdateDisplay("800x700"); // Create a window so tablet mode uses in-app shelf. auto window = AshTestBase::CreateTestWindow(gfx::Rect(0, 0, 800, 800)); @@ -511,7 +511,7 @@ // Tests the shelf widget does not animate for hotseat transitions during tablet // mode end. TEST_F(ShelfWidgetTest, NoAnimatingBackgroundDuringTabletModeEndFromInApp) { - UpdateDisplay("800x800"); + UpdateDisplay("800x700"); Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); // Create a window so tablet mode uses in-app shelf. @@ -541,7 +541,7 @@ // Tests the shelf widget does not animate for hotseat transitions during tablet // mode start with no app windows. TEST_F(ShelfWidgetTest, NoAnimatingBackgroundDuringTabletModeStartToHome) { - UpdateDisplay("800x800"); + UpdateDisplay("800x700"); EXPECT_TRUE(GetShelfWidget()->GetOpaqueBackground()->visible()); EXPECT_FALSE(GetShelfWidget()->GetDragHandle()->GetVisible()); @@ -567,7 +567,7 @@ // Tests the shelf widget does not animate for hotseat transitions during tablet // mode end with no app windows. TEST_F(ShelfWidgetTest, NoAnimatingBackgroundDuringTabletModeEndFromHome) { - UpdateDisplay("800x800"); + UpdateDisplay("800x700"); Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); EXPECT_FALSE(GetShelfWidget()->GetOpaqueBackground()->visible()); @@ -595,7 +595,7 @@ // is locked. TEST_F(ShelfWidgetTest, NoAnimatingBackgroundOnLockScreen) { Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); - UpdateDisplay("800x800"); + UpdateDisplay("800x700"); ASSERT_FALSE(GetShelfWidget()->GetDragHandle()->GetVisible()); ASSERT_FALSE(GetShelfWidget()->GetOpaqueBackground()->visible()); @@ -645,7 +645,7 @@ // the screen is locked. TEST_F(ShelfWidgetTest, ScreenLockStopsHotseatTransitionAnimation) { Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); - UpdateDisplay("800x800"); + UpdateDisplay("800x700"); ASSERT_FALSE(GetShelfWidget()->GetDragHandle()->GetVisible()); ASSERT_FALSE(GetShelfWidget()->GetOpaqueBackground()->visible()); @@ -682,7 +682,7 @@ ASSERT_TRUE(GetShelfWidget()->GetOpaqueBackground()->visible()); ASSERT_FALSE(GetShelfWidget()->GetAnimatingBackground()->visible()); EXPECT_EQ(GetShelfWidget()->GetWindowBoundsInScreen(), - gfx::Rect(0, 760, 800, 40)); + gfx::Rect(0, 660, 800, 40)); EXPECT_EQ(GetShelfWidget()->GetDragHandle()->bounds(), gfx::Rect(360, 18, 80, 4)); } @@ -692,7 +692,7 @@ TEST_F(ShelfWidgetTest, OpaqueBackgroundReshownAfterTransitionFromHomeChangesBackToHome) { Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); - UpdateDisplay("800x800"); + UpdateDisplay("800x700"); ASSERT_FALSE(GetShelfWidget()->GetDragHandle()->GetVisible()); ASSERT_FALSE(GetShelfWidget()->GetOpaqueBackground()->visible());
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_mr.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_mr.xtb index d215c6d..66cc186 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_mr.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_mr.xtb
@@ -105,7 +105,7 @@ <translation id="4458670250301149821">अॅप आयकन अॅप ग्रिडमधील फोल्डरच्या आत/बाहेर हलवा</translation> <translation id="4472417192667361414">सिस्टम आणि डिस्प्ले सेटिंग्ज</translation> <translation id="449214506787633354"><ph name="CTRL" />, त्यानंतर <ph name="LEFT" /> किंवा <ph name="RIGHT" /> किंवा <ph name="UP" /> किंवा <ph name="DOWN" /></translation> -<translation id="4556221320735744018">कीबोर्ड शॉर्टकट मदतनीस पाहा</translation> +<translation id="4556221320735744018">कीबोर्ड शॉर्टकट मदतनीस पहा</translation> <translation id="4609344656788228519"><ph name="CTRL1" /><ph name="SEPARATOR1" /><ph name="BACK1" /> किंवा <ph name="CTRL2" /><ph name="SEPARATOR2" /><ph name="SHIFT" /><ph name="SEPARATOR3" /><ph name="BACK2" /></translation> <translation id="4628718545549558538">स्थिती क्षेत्र (जेथे तुमच्या खात्यावरील फोटो दिसतो) उघडा</translation> <translation id="4698850295812410683">स्टायलस टूल दाखवा</translation> @@ -203,7 +203,7 @@ <translation id="8609384513243082612">नवीन टॅब उघडा</translation> <translation id="8644639153978066712">Files अॅप मध्ये लपवलेल्या फाइल डिस्प्ले करा</translation> <translation id="8717459106217102612">आधीचा शब्द किंवा अक्षर निवडा</translation> -<translation id="8727232706774971183">तुमच्या सूचना पाहा</translation> +<translation id="8727232706774971183">तुमच्या सूचना पहा</translation> <translation id="8855885154700222542">क्षेत्रे की</translation> <translation id="8881584919399569791">सुरू असलेली विंडो डेस्कच्या डाव्या बाजूला हलवा</translation> <translation id="88986195241502842">पृष्ठ खाली</translation>
diff --git a/ash/shortcut_viewer/views/keyboard_shortcut_view.cc b/ash/shortcut_viewer/views/keyboard_shortcut_view.cc index 214454a..69fda3a 100644 --- a/ash/shortcut_viewer/views/keyboard_shortcut_view.cc +++ b/ash/shortcut_viewer/views/keyboard_shortcut_view.cc
@@ -236,10 +236,6 @@ return "KeyboardShortcutView"; } -ax::mojom::Role KeyboardShortcutView::GetAccessibleWindowRole() { - return ax::mojom::Role::kWindow; -} - std::u16string KeyboardShortcutView::GetAccessibleWindowTitle() const { return l10n_util::GetStringUTF16(IDS_KSV_TITLE); }
diff --git a/ash/shortcut_viewer/views/keyboard_shortcut_view.h b/ash/shortcut_viewer/views/keyboard_shortcut_view.h index bb640436..fcaf240 100644 --- a/ash/shortcut_viewer/views/keyboard_shortcut_view.h +++ b/ash/shortcut_viewer/views/keyboard_shortcut_view.h
@@ -48,7 +48,6 @@ // views::View: const char* GetClassName() const override; - ax::mojom::Role GetAccessibleWindowRole() override; std::u16string GetAccessibleWindowTitle() const override; bool AcceleratorPressed(const ui::Accelerator& accelerator) override; void Layout() override;
diff --git a/ash/strings/ash_strings_af.xtb b/ash/strings/ash_strings_af.xtb index cb3c199d..45c89f3e 100644 --- a/ash/strings/ash_strings_af.xtb +++ b/ash/strings/ash_strings_af.xtb
@@ -997,7 +997,6 @@ <translation id="8818320199597151042">Verwyder tans profiel. Wag 'n paar minute.</translation> <translation id="8825863694328519386">Swiep van links af om terug te gaan</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Jy kan pakketvasvang enige tyd stop.</translation> <translation id="8841375032071747811">Terugknoppie</translation> <translation id="8843682306134542540">Wissel rotasieslot. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb index 6a46518..42cb3631 100644 --- a/ash/strings/ash_strings_am.xtb +++ b/ash/strings/ash_strings_am.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">መገለጫን በማስወገድ ላይ። ጥቂት ደቂቃዎችን ይጠብቁ።</translation> <translation id="8825863694328519386">ለመመለስ ከግራ ጀምረው ይጥረጉ</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">በማንኛውም ጊዜ የፓኬት ቀረጻን ማቆም ይችላሉ።</translation> <translation id="8841375032071747811">የተመለስ አዝራር</translation> <translation id="8843682306134542540">የማሽከርከሪያ ቁልፍን አብራ ወይም አጥፋ። <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb index 0e24d31..22f7d2d 100644 --- a/ash/strings/ash_strings_ar.xtb +++ b/ash/strings/ash_strings_ar.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">جارٍ إزالة الملف التعريفي. يُرجى الانتظار بضع دقائق.</translation> <translation id="8825863694328519386">التمرير السريع من اليسار للرجوع</translation> <translation id="8828714802988429505">90 درجة</translation> -<translation id="8832757911363938552">يمكنك إيقاف التقاط حِزم الشبكة في أي وقت.</translation> <translation id="8841375032071747811">زر الرجوع</translation> <translation id="8843682306134542540">تبديل قفل التدوير. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_as.xtb b/ash/strings/ash_strings_as.xtb index 6f99e88..1a2ffaed 100644 --- a/ash/strings/ash_strings_as.xtb +++ b/ash/strings/ash_strings_as.xtb
@@ -986,7 +986,6 @@ <translation id="8818320199597151042">প্ৰ’ফাইলটো আঁতৰাই থকা হৈছে। কেইমিনিটমান অপেক্ষা কৰক।</translation> <translation id="8825863694328519386">উভতি যাবলৈ বাওঁফালৰ পৰা ছোৱাইপ কৰক</translation> <translation id="8828714802988429505">৯০°</translation> -<translation id="8832757911363938552">আপুনি পেকেট কেপচাৰ কৰাটো যিকোনো সময়তে বন্ধ কৰিব পাৰে।</translation> <translation id="8841375032071747811">পূর্বৱর্তী পৃষ্ঠালৈ যোৱা বুটাম</translation> <translation id="8843682306134542540">ঘূৰ্ণন লক ট’গল কৰক৷<ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_az.xtb b/ash/strings/ash_strings_az.xtb index 8dba3cb9..a522e5f 100644 --- a/ash/strings/ash_strings_az.xtb +++ b/ash/strings/ash_strings_az.xtb
@@ -243,6 +243,7 @@ <translation id="2946119680249604491">Bağlantı əlavə edin</translation> <translation id="2961963223658824723">Xəta baş verdi. Bir neçə dəqiqə sonra yenidən cəhd edin.</translation> <translation id="2963773877003373896">mod3</translation> +<translation id="296762781903199866"><ph name="LANGUAGE" /> dilində danışıq fayllarını endirmək mümkün olmadı</translation> <translation id="2970920913501714344">Tətbiq, artırma və temaları quraşdırın</translation> <translation id="2977598380246111477">Növbəti nömrə</translation> <translation id="2992327365391326550">Cihazın mikrofon düyməsi deaktivdir.</translation> @@ -484,6 +485,7 @@ <translation id="4696813013609194136">Cihazı valideyn kodu ilə kiliddən çıxarın</translation> <translation id="4702647871202761252">Məxfilik ekranı deaktivdir</translation> <translation id="4705716602320768426">Rəy göndərin</translation> +<translation id="4706121060329443414">Endirməyə daha sonra cəhd ediləcək. Danışıq hələlik emal üçün Google'a göndəriləcək.</translation> <translation id="4731797938093519117">Valideyn girişi</translation> <translation id="4734965478015604180">Üfüqi</translation> <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + Rəqəm klaviaturası qısayolu dəyişib. Funksiya düymələrindən istifadə etmək üçün <ph name="LAUNCHER_KEY_NAME" /> + üst sıradakı bir düyməyə basın.</translation> @@ -589,6 +591,7 @@ <translation id="5600837773213129531">Səsli rəyi deaktiv etmək üçün Ctrl + Alt + Z düymələrinə basın.</translation> <translation id="5601503069213153581">PIN</translation> <translation id="5619862035903135339">Administrator siyasəti ekran çəkimini deaktiv edir</translation> +<translation id="5620281292257375798">Yalnız daxili</translation> <translation id="5625955975703555628">LTE+</translation> <translation id="5648021990716966815">Mikrofon yuvası</translation> <translation id="5649768706273821470">Dinləyin</translation> @@ -657,6 +660,7 @@ <translation id="6073451960410192870">Çəkməyi dayandırın</translation> <translation id="607652042414456612">Kompeteriniz yaxınlıqdakı Bluetooth cihazlarına görünür və "<ph name="NAME" />" adına, <ph name="ADDRESS" /> ünvanına malikdir.</translation> <translation id="6094290315941448991">Administrator siyasəti məxfi məzmun görünəndə ekranın yazılmasını deaktiv edir</translation> +<translation id="6114505516289286752"><ph name="LANGUAGE" /> dilində danışıq faylları endirilib</translation> <translation id="6119360623251949462"><ph name="CHARGING_STATE" />. <ph name="BATTERY_SAVER_STATE" /></translation> <translation id="612734058257491180">Google Assistent qonaq sessiyasında əlçatan deyil.</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" /> üçün silinmə dialoqunu açın</translation> @@ -738,6 +742,7 @@ <translation id="6816797338148849397">Seçiminizlə əlaqəli məlumat əlçatandır. Giriş üçün Yuxarı ox düyməsini istifadə edin.</translation> <translation id="6818242057446442178">Söz üzrə geri qayıdın</translation> <translation id="6820676911989879663">Fasilə verin!</translation> +<translation id="6836499262298959512">Təhlükəli fayl</translation> <translation id="6837064795450991317">Masaüstü paneli gizlədin</translation> <translation id="6850010208275816200">Cari tətbiqiniz tam ekranda açılıb. Tətbiq parol tələb edərsə, əvvəlcə tam ekrandan çıxın.</translation> <translation id="6852052252232534364">Aktiv etmək üçün klikləyin</translation> @@ -878,6 +883,7 @@ <translation id="7901405293566323524">Telefon Habı</translation> <translation id="7902625623987030061">Barmaq izi sensoruna toxunun</translation> <translation id="7904094684485781019">Administrator bu hesab üçün çoxsaylı girişlərə icazə verməyib.</translation> +<translation id="7930731167419639574">Danışıq indi lokal olaraq emal edilir və oflayn işləyir</translation> <translation id="7933084174919150729">Google Assistent yalnız ilkin profildə əlçatandır.</translation> <translation id="79341161159229895"><ph name="FIRST_PARENT_EMAIL" /> və <ph name="SECOND_PARENT_EMAIL" /> tərəfindən idarə edilən hesab</translation> <translation id="793716872548410480">Mübadilə buferinə baxmaq üçün <ph name="SHORTCUT_KEY_NAME" /> + V düyməsinə basın. Kopyaladığınız sonuncu 5 element mübadilə buferində saxlanılıb.</translation> @@ -990,7 +996,6 @@ <translation id="8818320199597151042">Profil silinir. Bir neçə dəqiqə gözləyin.</translation> <translation id="8825863694328519386">Geri qayıtmaq üçün soldan sürüşdürün</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">İstənilən vaxt şəbəkə paketini dayandıra bilərsiniz.</translation> <translation id="8841375032071747811">"Geri" düyməsi</translation> <translation id="8843682306134542540">Fırlanma kilidini aktiv edin. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_be.xtb b/ash/strings/ash_strings_be.xtb index ac44c48..7b39370 100644 --- a/ash/strings/ash_strings_be.xtb +++ b/ash/strings/ash_strings_be.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Ідзе выдаленне профілю. Пачакайце некалькі хвілін.</translation> <translation id="8825863694328519386">Каб вярнуцца назад, правядзіце пальцам з левага краю</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Спыніць захоп пакетаў можна ў любы момант.</translation> <translation id="8841375032071747811">Кнопка "Назад"</translation> <translation id="8843682306134542540">Уключыць або выключыць блакіроўку павароту. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Клавіша пошуку + Esc</translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb index 6c19da71..b5cd7b6 100644 --- a/ash/strings/ash_strings_bg.xtb +++ b/ash/strings/ash_strings_bg.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Профилът за мобилна мрежа се премахва. Изчакайте няколко минути.</translation> <translation id="8825863694328519386">Прекарайте пръст от ляво, за да се върнете назад</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Можете да спрете улавянето на пакети по всяко време.</translation> <translation id="8841375032071747811">Бутон за връщане назад</translation> <translation id="8843682306134542540">Превключване на функцията за заключване на завъртането. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">търсене + Esc</translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb index 7c72c21..98db533 100644 --- a/ash/strings/ash_strings_bn.xtb +++ b/ash/strings/ash_strings_bn.xtb
@@ -990,7 +990,6 @@ <translation id="8818320199597151042">প্রোফাইল সরানো হচ্ছে। কয়েক মিনিট অপেক্ষা করুন।</translation> <translation id="8825863694328519386">ফিরে যেতে আপনার স্ক্রিনের বাম প্রান্ত থেকে সোয়াইপ করুন</translation> <translation id="8828714802988429505">৯০°</translation> -<translation id="8832757911363938552">আপনি যেকোনও সময় প্যাকেট ক্যাপচার বন্ধ করে দিতে পারবেন।</translation> <translation id="8841375032071747811">ফিরে যাওয়ার বোতাম</translation> <translation id="8843682306134542540">রোটেশন লক টগল করুন। <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_bs.xtb b/ash/strings/ash_strings_bs.xtb index af992ee..08833f7 100644 --- a/ash/strings/ash_strings_bs.xtb +++ b/ash/strings/ash_strings_bs.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Uklanjanje profila. Pričekajte nekoliko minuta.</translation> <translation id="8825863694328519386">Prevucite prstom slijeva nadesno da se vratite</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Možete bilo kada zaustaviti snimanje paketa.</translation> <translation id="8841375032071747811">Dugme Nazad</translation> <translation id="8843682306134542540">Uključi/isključi zaključavanje rotacije. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb index a8045c82..de420a5f 100644 --- a/ash/strings/ash_strings_ca.xtb +++ b/ash/strings/ash_strings_ca.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">S'està suprimint el perfil. Espera uns minuts.</translation> <translation id="8825863694328519386">Llisca des de l'esquerra per tornar enrere</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Pots aturar la captura de paquets en qualsevol moment.</translation> <translation id="8841375032071747811">Botó Enrere</translation> <translation id="8843682306134542540">Activa o desactiva el bloqueig de rotació. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Cerca + Esc</translation>
diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb index 0bebbdd..7f06504 100644 --- a/ash/strings/ash_strings_cs.xtb +++ b/ash/strings/ash_strings_cs.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Odstraňování profilu. Několik minut počkejte.</translation> <translation id="8825863694328519386">Chcete-li se vrátit, přejeďte prstem zleva</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Záznam paketů lze kdykoli ukončit.</translation> <translation id="8841375032071747811">Tlačítko Zpět</translation> <translation id="8843682306134542540">Přepnout zámek otáčení. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Hledat+Esc</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb index 7df8a3e..52ec1a3 100644 --- a/ash/strings/ash_strings_da.xtb +++ b/ash/strings/ash_strings_da.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Profilen fjernes. Vent et par minutter.</translation> <translation id="8825863694328519386">Stryg fra venstre for at gå tilbage</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Du kan til enhver tid afbryde registrering af pakker.</translation> <translation id="8841375032071747811">Knappen Tilbage</translation> <translation id="8843682306134542540">Slå Lås rotation til eller fra. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Søg+Esc</translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb index eede0bf..2f64dd1 100644 --- a/ash/strings/ash_strings_de.xtb +++ b/ash/strings/ash_strings_de.xtb
@@ -990,7 +990,6 @@ <translation id="8818320199597151042">Profil wird entfernt. Warten Sie ein paar Minuten.</translation> <translation id="8825863694328519386">Von links nach rechts wischen, um zurückzugehen</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Sie können die Paketaufnahme jederzeit beenden.</translation> <translation id="8841375032071747811">Schaltfläche "Zurück"</translation> <translation id="8843682306134542540">Rotationssperre an/aus. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Suche + Esc</translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb index 2a7baed8..e766c98 100644 --- a/ash/strings/ash_strings_el.xtb +++ b/ash/strings/ash_strings_el.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Η κατάργηση του προφίλ βρίσκεται σε εξέλιξη. Περιμένετε λίγα λεπτά.</translation> <translation id="8825863694328519386">Για να επιστρέψετε, σύρετε από τα αριστερά.</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Μπορείτε να διακόψετε την καταγραφή πληροφοριών πακέτων οποιαδήποτε στιγμή.</translation> <translation id="8841375032071747811">Κουμπί "Πίσω"</translation> <translation id="8843682306134542540">Εναλλαγή κλειδώματος περιστροφής. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Πλήκτρο αναζήτησης+Esc</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb index 2f4fda4b..a384631 100644 --- a/ash/strings/ash_strings_en-GB.xtb +++ b/ash/strings/ash_strings_en-GB.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Removing profile. Wait a few minutes.</translation> <translation id="8825863694328519386">Swipe from the left to go back</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">You can stop packet capture at any time.</translation> <translation id="8841375032071747811">Back button</translation> <translation id="8843682306134542540">Toggle rotation lock. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb index 5fad795..7ee779f 100644 --- a/ash/strings/ash_strings_es-419.xtb +++ b/ash/strings/ash_strings_es-419.xtb
@@ -997,7 +997,6 @@ <translation id="8818320199597151042">Se está quitando el perfil. Espera unos minutos.</translation> <translation id="8825863694328519386">Para volver, desliza el dedo desde la izquierda</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Puedes detener la captura de paquetes en cualquier momento.</translation> <translation id="8841375032071747811">Botón Atrás</translation> <translation id="8843682306134542540">Activar o desactivar el bloqueo de rotación: <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Tecla de búsqueda + Esc</translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb index 7e283e7..d0e5782 100644 --- a/ash/strings/ash_strings_es.xtb +++ b/ash/strings/ash_strings_es.xtb
@@ -997,7 +997,6 @@ <translation id="8818320199597151042">Quitando perfil. Espera unos minutos.</translation> <translation id="8825863694328519386">Desliza el dedo desde la izquierda para volver</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Puedes detener la captura de paquetes en cualquier momento.</translation> <translation id="8841375032071747811">Botón Atrás</translation> <translation id="8843682306134542540">Activa o desactiva el bloqueo. <ph name="STATE_TEXT" />.</translation> <translation id="8850991929411075241">Buscar+Esc</translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb index c0ef6c67..ea1279a 100644 --- a/ash/strings/ash_strings_et.xtb +++ b/ash/strings/ash_strings_et.xtb
@@ -997,7 +997,6 @@ <translation id="8818320199597151042">Profiil eemaldatakse. Oodake mõni minut.</translation> <translation id="8825863694328519386">Tagasiliikumiseks pühkige vasakult paremale</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Võite pakettide püüdmise igal ajal peatada.</translation> <translation id="8841375032071747811">Nupp Tagasi</translation> <translation id="8843682306134542540">Lülitab pööramisluku sisse või välja. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Otsing + ESC</translation>
diff --git a/ash/strings/ash_strings_eu.xtb b/ash/strings/ash_strings_eu.xtb index 4a46148..fd4aad2 100644 --- a/ash/strings/ash_strings_eu.xtb +++ b/ash/strings/ash_strings_eu.xtb
@@ -997,7 +997,6 @@ <translation id="8818320199597151042">Profila kentzen. Itxaron minutu batzuk.</translation> <translation id="8825863694328519386">Atzera egiteko, pasatu hatza ezkerretik eskuinera</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Nahi duzunean geldi dezakezu paketeak hautemateko prozesua.</translation> <translation id="8841375032071747811">Atzera botoia</translation> <translation id="8843682306134542540">Aldatu biratzearen blokeoa. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Bilaketa + Ihes</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb index 0a3e1c8..e79d19e62 100644 --- a/ash/strings/ash_strings_fa.xtb +++ b/ash/strings/ash_strings_fa.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">درحال برداشتن نمایه. چند دقیقه صبر کنید.</translation> <translation id="8825863694328519386">برای برگشتن به عقب از سمت راست تند بکشید</translation> <translation id="8828714802988429505">۹۰°</translation> -<translation id="8832757911363938552">هرزمان خواستید میتوانید ضبط بسته را متوقف کنید.</translation> <translation id="8841375032071747811">دکمه برگشت</translation> <translation id="8843682306134542540">تغییر وضعیت قفل چرخش. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb index cce705cc..94d0afc 100644 --- a/ash/strings/ash_strings_fi.xtb +++ b/ash/strings/ash_strings_fi.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Poistetaan profiilia. Odota muutama minuutti.</translation> <translation id="8825863694328519386">Palaa takaisin pyyhkäisemällä vasemmasta reunasta</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Voit lopettaa pakettien kaappaukset milloin tahansa.</translation> <translation id="8841375032071747811">Takaisin-painike</translation> <translation id="8843682306134542540">Laita kierron lukitus päälle tai pois päältä. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Haku+Esc</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb index 8a822485..3966eb99 100644 --- a/ash/strings/ash_strings_fil.xtb +++ b/ash/strings/ash_strings_fil.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Inaalis ang profile. Maghintay nang ilang minuto.</translation> <translation id="8825863694328519386">Mag-swipe mula sa kaliwa para bumalik</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Puwede mong ihinto ang packet capture anumang oras.</translation> <translation id="8841375032071747811">Button na Bumalik</translation> <translation id="8843682306134542540">I-toggle ang lock ng pag-rotate. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_fr-CA.xtb b/ash/strings/ash_strings_fr-CA.xtb index ff419f9..88b9fc9a 100644 --- a/ash/strings/ash_strings_fr-CA.xtb +++ b/ash/strings/ash_strings_fr-CA.xtb
@@ -990,7 +990,6 @@ <translation id="8818320199597151042">Retrait du profil en cours… Patientez quelques minutes.</translation> <translation id="8825863694328519386">Balayez l'écran de gauche à droite pour revenir en arrière</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Vous pouvez arrêter la capture des paquets en tout temps.</translation> <translation id="8841375032071747811">Bouton Précédent</translation> <translation id="8843682306134542540">Activer/désactiver le verrouillage de la rotation. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Recherche+Échap</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb index a8bc26a..01cc9a1d 100644 --- a/ash/strings/ash_strings_fr.xtb +++ b/ash/strings/ash_strings_fr.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Suppression du profil… Attendez quelques minutes.</translation> <translation id="8825863694328519386">Faites glisser votre doigt de gauche à droite pour revenir en arrière</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Vous pouvez interrompre la capture de paquets à tout moment.</translation> <translation id="8841375032071747811">Bouton Retour</translation> <translation id="8843682306134542540">Activer/Désactiver le verrouillage de la rotation. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Recherche+Échap</translation>
diff --git a/ash/strings/ash_strings_gl.xtb b/ash/strings/ash_strings_gl.xtb index 766081e5..37e68056 100644 --- a/ash/strings/ash_strings_gl.xtb +++ b/ash/strings/ash_strings_gl.xtb
@@ -243,6 +243,7 @@ <translation id="2946119680249604491">Engadir conexión</translation> <translation id="2961963223658824723">Produciuse un erro. Téntao de novo nuns segundos.</translation> <translation id="2963773877003373896">mod3</translation> +<translation id="296762781903199866">Non se puideron descargar os ficheiros de voz en <ph name="LANGUAGE" /></translation> <translation id="2970920913501714344">Instalar aplicacións, extensións e temas</translation> <translation id="2977598380246111477">Número seguinte</translation> <translation id="2992327365391326550">O botón do micrófono do dispositivo está desactivado.</translation> @@ -485,6 +486,7 @@ <translation id="4696813013609194136">Desbloquea o dispositivo co código parental</translation> <translation id="4702647871202761252">A pantalla de privacidade está desactivada</translation> <translation id="4705716602320768426">Enviar comentarios</translation> +<translation id="4706121060329443414">Tentarase descargar os ficheiros máis tarde. De momento, o que se fale enviarase a Google para que o procese.</translation> <translation id="4731797938093519117">Acceso parental</translation> <translation id="4734965478015604180">Horizontal</translation> <translation id="4735498845456076464">O atallo de teclado <ph name="LAUNCHER_KEY_NAME" /> + número cambiou. Para usar as teclas de función, preme <ph name="LAUNCHER_KEY_NAME" /> + unha das teclas da fila superior.</translation> @@ -590,6 +592,7 @@ <translation id="5600837773213129531">Preme Ctrl + Alt + Z para desactivar os comentarios de voz.</translation> <translation id="5601503069213153581">PIN</translation> <translation id="5619862035903135339">A política do administrador desactivou o modo de captura de pantalla</translation> +<translation id="5620281292257375798">Só para uso interno</translation> <translation id="5625955975703555628">LTE+</translation> <translation id="5648021990716966815">Conector do micrófono</translation> <translation id="5649768706273821470">Escoitar</translation> @@ -658,6 +661,7 @@ <translation id="6073451960410192870">Deter gravación</translation> <translation id="607652042414456612">Os dispositivos Bluetooth situados nas proximidades poderán detectar o teu dispositivo, que aparecerá como "<ph name="NAME" />" co enderezo <ph name="ADDRESS" /></translation> <translation id="6094290315941448991">A política do administrador desactiva a gravación da pantalla cando nela se mostra contido confidencial</translation> +<translation id="6114505516289286752">Descargáronse os ficheiros de voz en <ph name="LANGUAGE" /></translation> <translation id="6119360623251949462"><ph name="CHARGING_STATE" />. <ph name="BATTERY_SAVER_STATE" /></translation> <translation id="612734058257491180">O Asistente de Google non está dispoñible cando se utiliza unha sesión de convidado.</translation> <translation id="6137566720514957455">Abrir cadro de diálogo de eliminación para <ph name="USER_EMAIL_ADDRESS" /></translation> @@ -739,6 +743,7 @@ <translation id="6816797338148849397">Hai dispoñible información sobre a túa selección. Utilizar frecha arriba para acceder.</translation> <translation id="6818242057446442178">Retroceder unha palabra</translation> <translation id="6820676911989879663">Fai unha pausa!</translation> +<translation id="6836499262298959512">Ficheiro perigoso</translation> <translation id="6837064795450991317">Ocultar barra de escritorio</translation> <translation id="6850010208275816200">A aplicación actual está aberta a pantalla completa. Se che pide o contrasinal, primeiro tes que saír do modo de pantalla completa.</translation> <translation id="6852052252232534364">Facer clic para activar</translation> @@ -879,6 +884,7 @@ <translation id="7901405293566323524">Phone Hub</translation> <translation id="7902625623987030061">Toca o sensor de impresión dixital</translation> <translation id="7904094684485781019">O administrador desta conta non permitiu o inicio de sesión múltiple.</translation> +<translation id="7930731167419639574">O que se diga procésase de xeito local e o ditado funciona sen conexión</translation> <translation id="7933084174919150729">O Asistente de Google só está dispoñible para o perfil principal.</translation> <translation id="79341161159229895">A conta está xestionada por <ph name="FIRST_PARENT_EMAIL" /> e <ph name="SECOND_PARENT_EMAIL" /></translation> <translation id="793716872548410480">Preme <ph name="SHORTCUT_KEY_NAME" /> + V para ver o portapapeis. Nel gárdanse os últimos 5 elementos que copiaches.</translation> @@ -991,7 +997,6 @@ <translation id="8818320199597151042">Quitando perfil. Agarda uns minutos.</translation> <translation id="8825863694328519386">Pasa o dedo desde a esquerda para volver</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Podes deter a captura de paquetes cando queiras.</translation> <translation id="8841375032071747811">Botón Atrás</translation> <translation id="8843682306134542540">Activar/desactivar o bloqueo de rotación. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Busca+Esc</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb index aafbe12..0a6f41e 100644 --- a/ash/strings/ash_strings_gu.xtb +++ b/ash/strings/ash_strings_gu.xtb
@@ -990,7 +990,6 @@ <translation id="8818320199597151042">પ્રોફાઇલ કાઢી નાખી રહ્યાં છીએ. થોડીવાર રાહ જુઓ.</translation> <translation id="8825863694328519386">પાછળ જવા ડાબેથી સ્વાઇપ કરો</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">તમે કોઈપણ સમયે પૅકેટ કૅપ્ચર બંધ કરી શકો છો.</translation> <translation id="8841375032071747811">પાછળ બટન</translation> <translation id="8843682306134542540">રોટેશન લૉક ટૉગલ કરો. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb index 71fd1ee..26f4e92 100644 --- a/ash/strings/ash_strings_hi.xtb +++ b/ash/strings/ash_strings_hi.xtb
@@ -997,7 +997,6 @@ <translation id="8818320199597151042">प्रोफ़ाइल हटाई जा रही है. थोड़ा इंतज़ार करें.</translation> <translation id="8825863694328519386">वापस जाने के लिए, स्क्रीन के बाएं किनारे से स्वाइप करें</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">आप किसी भी समय पैकेट कैप्चर की कार्रवाई रोक सकते हैं.</translation> <translation id="8841375032071747811">वापस जाएं बटन</translation> <translation id="8843682306134542540">रोटेशन लॉक को टॉगल करें. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb index f4427ba..4ff5f17 100644 --- a/ash/strings/ash_strings_hr.xtb +++ b/ash/strings/ash_strings_hr.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Profil se uklanja. Pričekajte nekoliko minuta.</translation> <translation id="8825863694328519386">Prijeđite prstom slijeva nadesno da biste se vratili</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Snimanje paketa uvijek možete zaustaviti.</translation> <translation id="8841375032071747811">Gumb Natrag</translation> <translation id="8843682306134542540">Prebacivanje zaključavanja rotacije. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Pretraživanje + Esc</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb index badea5d..3247bc8a 100644 --- a/ash/strings/ash_strings_hu.xtb +++ b/ash/strings/ash_strings_hu.xtb
@@ -997,7 +997,6 @@ <translation id="8818320199597151042">Profil eltávolítása. Várjon néhány percet.</translation> <translation id="8825863694328519386">A visszalépéshez csúsztasson balról jobbra</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">A csomagok elfogását bármikor leállíthatja.</translation> <translation id="8841375032071747811">Vissza gomb</translation> <translation id="8843682306134542540">Váltás a forgatás zárolásának állapotai közt. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Keresés+Esc</translation>
diff --git a/ash/strings/ash_strings_hy.xtb b/ash/strings/ash_strings_hy.xtb index 978b7cf26..75c8cb3 100644 --- a/ash/strings/ash_strings_hy.xtb +++ b/ash/strings/ash_strings_hy.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Պրոֆիլը հեռացվում է։ Մի փոքր սպասեք։</translation> <translation id="8825863694328519386">Սահեցրեք մատը ձախից՝ հետ գնալու համար</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Ցանկացած ժամանակ կարող եք կանգնեցնել փաթեթների գրանցումը։</translation> <translation id="8841375032071747811">«Հետ» կոճակ</translation> <translation id="8843682306134542540">Միացնել/անջատել պտտման կողպումը: <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Որոնել+Esc</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb index 289a8b30..1cec3f2 100644 --- a/ash/strings/ash_strings_id.xtb +++ b/ash/strings/ash_strings_id.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Menghapus profil. Tunggu beberapa menit.</translation> <translation id="8825863694328519386">Geser dari kiri untuk kembali</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Anda dapat menghentikan penangkapan paket kapan saja.</translation> <translation id="8841375032071747811">Tombol kembali</translation> <translation id="8843682306134542540">Alihkan kunci rotasi. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_is.xtb b/ash/strings/ash_strings_is.xtb index 545e6fc..c655680 100644 --- a/ash/strings/ash_strings_is.xtb +++ b/ash/strings/ash_strings_is.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Fjarlægir prófíl. Hinkraðu í nokkrar mínútur.</translation> <translation id="8825863694328519386">Strjúktu frá vinstri til að fara til baka</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Þú getur stöðvað pakkaupptöku hvenær sem er.</translation> <translation id="8841375032071747811">Bakkhnappur</translation> <translation id="8843682306134542540">Víxla snúningslás. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb index 09fc4dd..dcf28db 100644 --- a/ash/strings/ash_strings_it.xtb +++ b/ash/strings/ash_strings_it.xtb
@@ -997,7 +997,6 @@ <translation id="8818320199597151042">Rimozione del profilo in corso… Attendi qualche minuto.</translation> <translation id="8825863694328519386">Scorri da sinistra per tornare indietro</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Puoi fermare l'acquisizione del pacchetto in qualsiasi momento.</translation> <translation id="8841375032071747811">Pulsante Indietro</translation> <translation id="8843682306134542540">Attiva/disattiva blocco rotazione. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Tasto di ricerca+ESC</translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb index 8a548768..4ac36e7 100644 --- a/ash/strings/ash_strings_iw.xtb +++ b/ash/strings/ash_strings_iw.xtb
@@ -992,7 +992,6 @@ <translation id="8818320199597151042">הסרת הפרופיל מתבצעת. יש להמתין מספר דקות.</translation> <translation id="8825863694328519386">יש להחליק מצד ימין כדי לחזור אחורה</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">תמיד אפשר להפסיק את תיעוד החבילות.</translation> <translation id="8841375032071747811">לחצן 'הקודם'</translation> <translation id="8843682306134542540">הפעלה או השבתה של נעילת הסיבוב. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb index 8db35ac..7c7d032 100644 --- a/ash/strings/ash_strings_ja.xtb +++ b/ash/strings/ash_strings_ja.xtb
@@ -997,7 +997,6 @@ <translation id="8818320199597151042">プロファイルを削除しています。数分お待ちください。</translation> <translation id="8825863694328519386">左側からスワイプすると前の画面に戻ります</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">パケット キャプチャはいつでも停止できます。</translation> <translation id="8841375032071747811">戻るボタン</translation> <translation id="8843682306134542540">画面の向きの固定を切り替えます。<ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_ka.xtb b/ash/strings/ash_strings_ka.xtb index cee3022..a93ae8f 100644 --- a/ash/strings/ash_strings_ka.xtb +++ b/ash/strings/ash_strings_ka.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">მიმდინარეობს პროფილის ამოშლა. მოითმინეთ რამდენიმე წუთი.</translation> <translation id="8825863694328519386">უკან დასაბრუნებლად გადაფურცლეთ მარცხნიდან</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">პაკეტების აღბეჭდვის შეწყვეტა ნებისმიერ დროს შეგიძლიათ.</translation> <translation id="8841375032071747811">ღილაკი „უკან“</translation> <translation id="8843682306134542540">ბრუნვის ჩაკეტვის გადართვა. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_kk.xtb b/ash/strings/ash_strings_kk.xtb index d4e75942..1ce335a7 100644 --- a/ash/strings/ash_strings_kk.xtb +++ b/ash/strings/ash_strings_kk.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Профиль өшірілуде. Бірнеше минут күтіңіз.</translation> <translation id="8825863694328519386">Артқа оралу үшін солдан оңға қарай сырғытыңыз.</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Желі жинағын алу әрекетін кез келген уақытта тоқтата аласыз.</translation> <translation id="8841375032071747811">"Артқа" түймесі</translation> <translation id="8843682306134542540">Бұру құлпын ашу/жабу. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_km.xtb b/ash/strings/ash_strings_km.xtb index dcc3bfbc..0db588e 100644 --- a/ash/strings/ash_strings_km.xtb +++ b/ash/strings/ash_strings_km.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">កំពុងលុបកម្រងព័ត៌មាន។ សូមរង់ចាំមួយភ្លែត។</translation> <translation id="8825863694328519386">អូសពីឆ្វេងដើម្បីថយក្រោយ</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">អ្នកអាចបញ្ឈប់ការថតកញ្ចប់បានគ្រប់ពេល។</translation> <translation id="8841375032071747811">ប៊ូតុងថយក្រោយ</translation> <translation id="8843682306134542540">បិទ/បើកការចាក់សោការបង្វិល។ <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb index ad40ab7..3b065ad 100644 --- a/ash/strings/ash_strings_kn.xtb +++ b/ash/strings/ash_strings_kn.xtb
@@ -991,7 +991,6 @@ <translation id="8818320199597151042">ಪ್ರೊಫೈಲ್ ತೆಗೆದುಹಾಕಲಾಗುತ್ತಿದೆ. ಕೆಲವು ನಿಮಿಷಗಳು ಕಾಯಿರಿ.</translation> <translation id="8825863694328519386">ಹಿಂದಕ್ಕೆ ಹೋಗಲು, ಎಡದಿಂದ ಸ್ವೈಪ್ ಮಾಡಿ</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">ನೀವು ಯಾವಾಗ ಬೇಕಾದರೂ ಪ್ಯಾಕೆಟ್ ಕ್ಯಾಪ್ಚರ್ ಅನ್ನು ನಿಲ್ಲಸಬಹುದು.</translation> <translation id="8841375032071747811">ಹಿಂದೆ ಬಟನ್</translation> <translation id="8843682306134542540">ಪರದೆ ತಿರುಗಿಸುವಿಕೆಯ ಲಾಕ್ ಅನ್ನು ಟಾಗಲ್ ಮಾಡಿ. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">ಹುಡುಕಾಟ+Esc</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb index 3d1debf2..25ccc71 100644 --- a/ash/strings/ash_strings_ko.xtb +++ b/ash/strings/ash_strings_ko.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">프로필을 삭제하는 중입니다. 잠시만 기다려 주세요.</translation> <translation id="8825863694328519386">돌아가려면 왼쪽에서 스와이프하세요.</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">언제든지 패킷 캡처를 중단할 수 있습니다.</translation> <translation id="8841375032071747811">뒤로 버튼</translation> <translation id="8843682306134542540">회전 잠금을 전환합니다. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_ky.xtb b/ash/strings/ash_strings_ky.xtb index 062cc295..a9d5f64 100644 --- a/ash/strings/ash_strings_ky.xtb +++ b/ash/strings/ash_strings_ky.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Профиль өчүрүлүүдө. Бир нече мүнөт күтө туруңуз.</translation> <translation id="8825863694328519386">Артка кайтуу үчүн экраныңыздын сол четинен сүрүп коюңуз</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Пакетти алууну каалаган убакта токтото аласыз.</translation> <translation id="8841375032071747811">Артка баскычы</translation> <translation id="8843682306134542540">Буруу кулпусун өчүрүү/күйгүзүү. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_lo.xtb b/ash/strings/ash_strings_lo.xtb index db50ddd9..e20b82a 100644 --- a/ash/strings/ash_strings_lo.xtb +++ b/ash/strings/ash_strings_lo.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">ກຳລັງລຶບໂປຣໄຟລ໌ອອກ. ກະລຸນາລໍຖ້າສອງສາມນາທີ.</translation> <translation id="8825863694328519386">ປັດຈາກຊ້າຍເພື່ອກັບຄືນ</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">ທ່ານສາມາດຢຸດການບັນທຶກແພັກເກັດຕອນໃດກໍໄດ້.</translation> <translation id="8841375032071747811">ປຸ່ມກັບຄືນ</translation> <translation id="8843682306134542540">ປິດເປີດການລັອກການໝຸນ. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb index eea2a806..146ead62 100644 --- a/ash/strings/ash_strings_lt.xtb +++ b/ash/strings/ash_strings_lt.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Pašalinamas profilis. Palaukite kelias minutes.</translation> <translation id="8825863694328519386">Kad grįžtumėte, perbraukite iš kairės</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Galite bet kuriuo metu sustabdyti paketo fiksavimą.</translation> <translation id="8841375032071747811">Mygtukas „Atgal“</translation> <translation id="8843682306134542540">Perjungti pasukimo užrakinimą. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Paieškos klavišas + „Esc“</translation>
diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb index 8c43e5e..4b887c0a 100644 --- a/ash/strings/ash_strings_lv.xtb +++ b/ash/strings/ash_strings_lv.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Notiek profila noņemšana. Uzgaidiet dažas minūtes.</translation> <translation id="8825863694328519386">Lai atgrieztos, velciet no kreisās malas.</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Varat jebkurā brīdī apturēt pakešu tveršanu.</translation> <translation id="8841375032071747811">Poga Atpakaļ</translation> <translation id="8843682306134542540">Pārslēgt pagriešanas bloķēšanu. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_mk.xtb b/ash/strings/ash_strings_mk.xtb index 22df10f..57263451 100644 --- a/ash/strings/ash_strings_mk.xtb +++ b/ash/strings/ash_strings_mk.xtb
@@ -991,7 +991,6 @@ <translation id="8818320199597151042">Се отстранува профилот. Почекајте неколку минути.</translation> <translation id="8825863694328519386">Повлечете одлево за да се вратите назад</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Може да го прекинете евидентирањето на пресретнатиот пакет во секое време.</translation> <translation id="8841375032071747811">Копче за назад</translation> <translation id="8843682306134542540">Заклучи/отклучи ротација. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Пребарај+Esc</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb index f9395314..c1d899f 100644 --- a/ash/strings/ash_strings_ml.xtb +++ b/ash/strings/ash_strings_ml.xtb
@@ -243,6 +243,7 @@ <translation id="2946119680249604491">കണക്ഷൻ ചേർക്കുക</translation> <translation id="2961963223658824723">എന്തോ കുഴപ്പം സംഭവിച്ചു. അൽപ്പസമയത്തിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="2963773877003373896">mod3</translation> +<translation id="296762781903199866"><ph name="LANGUAGE" /> സംഭാഷണ ഫയലുകൾ ഡൗൺലോഡ് ചെയ്യാനായില്ല</translation> <translation id="2970920913501714344">ആപ്പുകൾ, വിപുലീകരണങ്ങൾ, തീമുകൾ എന്നിവ ഇന്സ്റ്റാള് ചെയ്യുക</translation> <translation id="2977598380246111477">അടുത്ത നമ്പർ</translation> <translation id="2992327365391326550">ഉപകരണത്തിന്റെ മൈക്രോഫോൺ ബട്ടൺ ഓഫാണ്.</translation> @@ -484,6 +485,7 @@ <translation id="4696813013609194136">രക്ഷാകർതൃ കോഡ് ഉപയോഗിച്ച് ഉപകരണം അൺലോക്ക് ചെയ്യുക</translation> <translation id="4702647871202761252">സ്വകാര്യതാ സ്ക്രീൻ ഓഫാണ്</translation> <translation id="4705716602320768426">ഫീഡ്ബാക്ക് നൽകുക</translation> +<translation id="4706121060329443414">പിന്നീട് ഡൗൺലോഡ് ചെയ്യാൻ ശ്രമിക്കും. സംഭാഷണം ഇപ്പോൾ പ്രോസസ് ചെയ്യുന്നതിനായി Google-ലേക്ക് അയയ്ക്കും.</translation> <translation id="4731797938093519117">രക്ഷാകർതൃ ആക്സസ്</translation> <translation id="4734965478015604180">സമാന്തരം</translation> <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + നമ്പർ' കീബോഡ് കുറുക്കുവഴി മാറിയിട്ടുണ്ട്. ഫംഗ്ഷന് കീകൾ ഉപയോഗിക്കാൻ, <ph name="LAUNCHER_KEY_NAME" /> + ഏറ്റവും മുകളിലെ വരിയിലുള്ള കീ അമർത്തുക.</translation> @@ -589,6 +591,7 @@ <translation id="5600837773213129531">സംഭാഷണ ഫീഡ്ബാക്ക് പ്രവർത്തനരഹിതമാക്കാൻ Ctrl + Alt + Z അമർത്തുക.</translation> <translation id="5601503069213153581">PIN</translation> <translation id="5619862035903135339">അഡ്മിൻ നയം സ്ക്രീൻ ക്യാപ്ചർ പ്രവർത്തനരഹിതമാക്കുന്നു</translation> +<translation id="5620281292257375798">ആന്തരികം മാത്രം</translation> <translation id="5625955975703555628">LTE+</translation> <translation id="5648021990716966815">Mic jack</translation> <translation id="5649768706273821470">കേൾക്കുക</translation> @@ -657,6 +660,7 @@ <translation id="6073451960410192870">റെക്കോർഡിംഗ് നിർത്തുക</translation> <translation id="607652042414456612">നിങ്ങളുടെ കമ്പ്യൂട്ടർ സമീപത്തുള്ള Bluetooth ഉപകരണങ്ങൾക്ക് കണ്ടെത്താനാകുന്നതാണ് ഒപ്പം അത് <ph name="ADDRESS" /> എന്ന വിലാസത്തിൽ "<ph name="NAME" />" എന്നതായി ദൃശ്യമാകും.</translation> <translation id="6094290315941448991">രഹസ്യാത്മക ഉള്ളടക്കം ദൃശ്യമായിരിക്കുമ്പോൾ അഡ്മിൻ നയം സ്ക്രീൻ റെക്കോർഡിംഗ് പ്രവർത്തനരഹിതമാക്കുന്നു</translation> +<translation id="6114505516289286752"><ph name="LANGUAGE" /> സംഭാഷണ ഫയലുകൾ ഡൗൺലോഡ് ചെയ്തു</translation> <translation id="6119360623251949462"><ph name="CHARGING_STATE" />. <ph name="BATTERY_SAVER_STATE" /></translation> <translation id="612734058257491180">അതിഥി സെഷനിൽ Google അസിസ്റ്റന്റ് ലഭ്യമല്ല.</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" /> -നുള്ള ഡയലോഗ് നീക്കം ചെയ്യുക തുറക്കുക</translation> @@ -738,6 +742,7 @@ <translation id="6816797338148849397">നിങ്ങളുടെ തിരഞ്ഞെടുപ്പുമായി ബന്ധപ്പെട്ട വിവരങ്ങൾ ലഭ്യമാണ്. ആക്സസ് ചെയ്യാൻ മുകളിലേയ്ക്കുള്ള അമ്പടയാളം കീ ഉപയോഗിക്കുക.</translation> <translation id="6818242057446442178">ഒരു വാക്ക് പിന്നിലേക്ക് പോവുക</translation> <translation id="6820676911989879663">ഒരു ഇടവേള എടുക്കൂ!</translation> +<translation id="6836499262298959512">അപകടകരമായ ഫയൽ</translation> <translation id="6837064795450991317">ഡെസ്ക്ബാർ മറയ്ക്കുക</translation> <translation id="6850010208275816200">നിങ്ങളുടെ നിലവിലെ ആപ്പ് പൂർണ്ണ സ്ക്രീനിൽ ആണ്. ആപ്പ് നിങ്ങളുടെ പാസ്വേഡ് ആവശ്യപ്പെടുകയാണെങ്കിൽ ആദ്യം പൂർണ്ണ സ്ക്രീനിൽ നിന്ന് പുറത്ത് കടക്കുക.</translation> <translation id="6852052252232534364">ക്ലിക്ക് ചെയ്ത് സജീവമാക്കൂ</translation> @@ -878,6 +883,7 @@ <translation id="7901405293566323524">ഫോൺ ഹബ്</translation> <translation id="7902625623987030061">വിരലടയാള സെൻസർ സ്പർശിക്കുക</translation> <translation id="7904094684485781019">ഈ അക്കൗണ്ടിന്റെ അഡ്മിനിസ്ട്രേറ്റർ ഒന്നിലധികം സൈൻ-ഇൻ അനുവദിക്കുന്നില്ല.</translation> +<translation id="7930731167419639574">സംഭാഷണം ഇപ്പോൾ ലോക്കലായി പ്രോസസ് ചെയ്ത് കേട്ടെഴുത്ത് ഓഫ്ലൈനിൽ പ്രവർത്തിക്കുന്നു</translation> <translation id="7933084174919150729">പ്രാഥമിക പ്രൊഫൈലിന് മാത്രമേ Google അസിസ്റ്റന്റ് ലഭ്യമാകൂ.</translation> <translation id="79341161159229895">അക്കൗണ്ട് മാനേജ് ചെയ്യുന്നത് <ph name="FIRST_PARENT_EMAIL" />, <ph name="SECOND_PARENT_EMAIL" /> എന്നിവരാണ്</translation> <translation id="793716872548410480">നിങ്ങളുടെ ക്ലിപ്പ്ബോർഡ് കാണാൻ <ph name="SHORTCUT_KEY_NAME" /> + V അമർത്തുക. നിങ്ങൾ അവസാനമായി പകർത്തിയ 5 ഇനങ്ങൾ ക്ലിപ്പ്ബോർഡിൽ സംരക്ഷിക്കുന്നു.</translation> @@ -990,7 +996,6 @@ <translation id="8818320199597151042">പ്രൊഫൈല് നീക്കം ചെയ്യുന്നു. അൽപ്പസമയം കാത്തിരിക്കുക.</translation> <translation id="8825863694328519386">തിരികെ പോകാൻ ഇടതുഭാഗത്ത് നിന്ന് സ്വൈപ്പ് ചെയ്യുക</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">നിങ്ങൾക്ക് ഏതുസമയത്തും പാക്കറ്റ് ക്യാപ്ചർ അവസാനിപ്പിക്കാം.</translation> <translation id="8841375032071747811">ബാക്ക് ബട്ടൺ</translation> <translation id="8843682306134542540">റൊട്ടേഷൻ ലോക്ക് മാറ്റുക. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">തിരയൽ+Esc</translation>
diff --git a/ash/strings/ash_strings_mn.xtb b/ash/strings/ash_strings_mn.xtb index f5fee7c..cff1fae5 100644 --- a/ash/strings/ash_strings_mn.xtb +++ b/ash/strings/ash_strings_mn.xtb
@@ -998,7 +998,6 @@ <translation id="8818320199597151042">Профайлыг хасаж байна. Цөөн хэдэн минут хүлээнэ үү.</translation> <translation id="8825863694328519386">Буцахын тулд зүүн талаас шударна уу</translation> <translation id="8828714802988429505">90 °</translation> -<translation id="8832757911363938552">Та хүссэн үедээ пакет авахыг зогсоох боломжтой.</translation> <translation id="8841375032071747811">Буцах товчлуур</translation> <translation id="8843682306134542540">Эргүүлэлтийн түгжээг унтрааж/асаана уу. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb index da35506..216e686 100644 --- a/ash/strings/ash_strings_mr.xtb +++ b/ash/strings/ash_strings_mr.xtb
@@ -243,6 +243,7 @@ <translation id="2946119680249604491">कनेक्शन जोडा</translation> <translation id="2961963223658824723">काहीतरी चूक झाली. काही सेकंदांनी पुन्हा प्रयत्न करा.</translation> <translation id="2963773877003373896">mod3</translation> +<translation id="296762781903199866"><ph name="LANGUAGE" /> च्या स्पीच फाइल डाउनलोड करता आल्या नाहीत</translation> <translation id="2970920913501714344">ॲप्स, एक्स्टेंशन आणि थीम इंस्टॉल करा</translation> <translation id="2977598380246111477">पुढील नंबर</translation> <translation id="2992327365391326550">डिव्हाइसच्या मायक्रोफोनचे बटण बंद केले आहे.</translation> @@ -377,7 +378,7 @@ <translation id="3945319193631853098">सेट करणे पूर्ण करण्यासाठी टॅप करा</translation> <translation id="3945867833895287237">हॉटस्पॉटशी कनेक्ट करत आहे...</translation> <translation id="3950820424414687140">साइन इन करा</translation> -<translation id="3958465044488004317">Assistant मध्ये परिणाम पाहा</translation> +<translation id="3958465044488004317">Assistant मध्ये परिणाम पहा</translation> <translation id="3962859241508114581">मागील ट्रॅक</translation> <translation id="3969043077941541451">बंद आहे</translation> <translation id="397105322502079400">गणना करत आहे...</translation> @@ -484,6 +485,7 @@ <translation id="4696813013609194136">पालक कोडने डिव्हाइस अनलॉक करा</translation> <translation id="4702647871202761252">गोपनीयता स्क्रीन बंद आहे</translation> <translation id="4705716602320768426">फाइल फीडबॅक</translation> +<translation id="4706121060329443414">नंतर डाउनलोड करण्याचा प्रयत्न केला जाईल. सध्या प्रक्रिया करण्यासाठी स्पीच Google ला पाठवली जाईल.</translation> <translation id="4731797938093519117">पालक अॅक्सेस</translation> <translation id="4734965478015604180">आडवा</translation> <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + नंबर कीबोर्ड शॉर्टकट बदलला आहे. फंक्शन की वापरण्यासाठी, <ph name="LAUNCHER_KEY_NAME" /> की + सर्वात वरच्या पंक्तीमधील की दाबा.</translation> @@ -589,6 +591,7 @@ <translation id="5600837773213129531">वाचिक फीडबॅक देणे बंद करण्यासाठी Ctrl + Alt + Z दाबा.</translation> <translation id="5601503069213153581">पिन</translation> <translation id="5619862035903135339">अॅडमिनिस्ट्रेटर धोरण स्क्रीन कॅप्चर बंद करते</translation> +<translation id="5620281292257375798">फक्त अंतर्गत</translation> <translation id="5625955975703555628">LTE+</translation> <translation id="5648021990716966815">माइक जॅक</translation> <translation id="5649768706273821470">ऐका</translation> @@ -657,6 +660,7 @@ <translation id="6073451960410192870">रेकॉर्डिंग थांबवा</translation> <translation id="607652042414456612">तुमचा कॉंप्युटर जवळपासच्या ब्लूटूथ डिव्हाइसवर शोधता येऊ शकतो आणि <ph name="ADDRESS" /> पत्त्यासह "<ph name="NAME" />" म्हणून दिसेल</translation> <translation id="6094290315941448991">गोपनीय आशय दृश्यमान असेल तेव्हा अॅडमिनिस्ट्रेटर धोरण स्क्रीन रेकॉर्डिंग बंद करते</translation> +<translation id="6114505516289286752"><ph name="LANGUAGE" /> च्या स्पीच फाइल डाउनलोड केल्या आहेत</translation> <translation id="6119360623251949462"><ph name="CHARGING_STATE" />. <ph name="BATTERY_SAVER_STATE" /></translation> <translation id="612734058257491180">अतिथी सत्रामध्ये Google असिस्टंट उपलब्ध नाही.</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" /> साठी काढून टाकणे डायलॉग उघडा</translation> @@ -718,7 +722,7 @@ <translation id="6650933572246256093">"<ph name="DEVICE_NAME" />" Bluetooth डिव्हाइस जोडण्यासाठी परवानगी घेऊ इच्छिते. कृपया त्या डिव्हाइसवर ही पासकी एंटर करा: <ph name="PASSKEY" /></translation> <translation id="6657585470893396449">पासवर्ड</translation> <translation id="6665545700722362599">वेबसाइट, अॅप्स आणि एक्स्टेंशनना स्थान सेवा, डिव्हाइसचा मायक्रोफोन, कॅमेरा किंवा इतर वैशिष्ट्ये वापरण्याची परवानगी द्या</translation> -<translation id="6667908387435388584">तुमच्या फोनच्या हॉटस्पॉटशी कनेक्ट करा, सायलंट करा व तुमचे डिव्हाइस शोधा आणि तुमच्या फोनवर उघडलेले अलीकडील Chrome टॅब पाहा</translation> +<translation id="6667908387435388584">तुमच्या फोनच्या हॉटस्पॉटशी कनेक्ट करा, सायलंट करा व तुमचे डिव्हाइस शोधा आणि तुमच्या फोनवर उघडलेले अलीकडील Chrome टॅब पहा</translation> <translation id="6670153871843998651">डेस्क ३</translation> <translation id="6671495933530132209">इमेज कॉपी करा</translation> <translation id="6692996468359469499">तुमच्या निवडीशी संबंधित माहिती मिळवा</translation> @@ -738,6 +742,7 @@ <translation id="6816797338148849397">तुमच्या निवडीशी संबंधित माहिती उपलब्ध आहे. अॅक्सेस करण्यासाठी अप अॅरो की वापरा.</translation> <translation id="6818242057446442178">एक शब्द मागे जा</translation> <translation id="6820676911989879663">ब्रेक घ्या!</translation> +<translation id="6836499262298959512">धोकादायक फाइल</translation> <translation id="6837064795450991317">डेस्कबार लपवा</translation> <translation id="6850010208275816200">तुमचे सध्याचे अॅप फुल स्क्रीन मोडमध्ये आहे. अॅपने तुमच्या पासवर्डची विनंती केल्यास, प्रथम फुल स्क्रीनमधून बाहेर पडा.</translation> <translation id="6852052252232534364">अॅक्टिव्हेट करण्यासाठी क्लिक करा</translation> @@ -817,7 +822,7 @@ <translation id="746232733191930409">स्क्रीन रेकॉर्डिंग मोड</translation> <translation id="7466449121337984263">कृपया सेन्सरला स्पर्श करा</translation> <translation id="7473891865547856676">नाही, नको</translation> -<translation id="7477793887173910789">व्हिडिओ पाहा आणि बरेच काही नियंत्रित करा</translation> +<translation id="7477793887173910789">व्हिडिओ पहा आणि बरेच काही नियंत्रित करा</translation> <translation id="7482097454533720217">तुम्ही मजकुरावर राइट क्लिक करता किंवा त्यावर स्पर्श करून तो धरून ठेवता तेव्हा व्याख्या, भाषांतरे किंवा युनिट कन्व्हर्जन मिळवा.</translation> <translation id="7483025031359818980">निवड क्षेत्र फुल स्क्रीनवर सेट आहे</translation> <translation id="7486227320194954040">मार्कर टूल कोलॅप्स करा</translation> @@ -878,6 +883,7 @@ <translation id="7901405293566323524">फोन हब</translation> <translation id="7902625623987030061">फिंगरप्रिंट सेन्सरला स्पर्श करा</translation> <translation id="7904094684485781019">या खात्याच्या ॲडमिनिस्ट्रेटरने एकाहून अधिक साइन इन ची परवानगी रद्द केली आहे.</translation> +<translation id="7930731167419639574">स्पीचवर आता स्थानिक पातळीवर प्रक्रिया केली जाते आणि डिक्टेशन ऑफलाइन काम करते</translation> <translation id="7933084174919150729">Google Assistant फक्त प्राथमिक प्रोफाइलवर उपलब्ध आहे.</translation> <translation id="79341161159229895">खाते <ph name="FIRST_PARENT_EMAIL" /> आणि <ph name="SECOND_PARENT_EMAIL" /> ने व्यवस्थापित केले आहे</translation> <translation id="793716872548410480">तुमचा क्लिपबोर्ड पाहण्यासाठी <ph name="SHORTCUT_KEY_NAME" /> + V दाबा. तुम्ही कॉपी केलेल्या शेवटच्या पाच गोष्टी तुमच्या क्लिपबोर्डवर सेव्ह केल्या आहेत.</translation> @@ -990,7 +996,6 @@ <translation id="8818320199597151042">प्रोफाइल काढून टाकत आहे. काही मिनिटे प्रतीक्षा करा.</translation> <translation id="8825863694328519386">मागे जाण्यासाठी डावीकडून स्वाइप करा</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">तुम्ही पॅकेट कॅप्चर कधीही थांबवू शकता.</translation> <translation id="8841375032071747811">मागे जा बटण</translation> <translation id="8843682306134542540">रोटेशन लॉक टॉगल करा. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb index 1def0c45..42070367d 100644 --- a/ash/strings/ash_strings_ms.xtb +++ b/ash/strings/ash_strings_ms.xtb
@@ -997,7 +997,6 @@ <translation id="8818320199597151042">Mengalih keluar profil. Tunggu beberapa minit.</translation> <translation id="8825863694328519386">Leret dari kiri untuk kembali</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Anda boleh menghentikan tangkapan paket pada bila-bila masa.</translation> <translation id="8841375032071747811">Butang kembali</translation> <translation id="8843682306134542540">Togol kunci putaran. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Carian+Esc</translation>
diff --git a/ash/strings/ash_strings_my.xtb b/ash/strings/ash_strings_my.xtb index 1973322..7d14150 100644 --- a/ash/strings/ash_strings_my.xtb +++ b/ash/strings/ash_strings_my.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">ပရိုဖိုင်ကို ဖယ်ရှားနေသည်။ မိနစ်အနည်းငယ် စောင့်ပါ။</translation> <translation id="8825863694328519386">နောက်သို့ပြန်သွားရန် ဘယ်ဘက်မှ ပွတ်ဆွဲပါ</translation> <translation id="8828714802988429505">၉၀°</translation> -<translation id="8832757911363938552">အပိုင်းငယ်ဖမ်းယူမှုကို အချိန်မရွေး ရပ်နိုင်သည်။</translation> <translation id="8841375032071747811">နောက်သို့ပြန်သည့် ခလုတ်</translation> <translation id="8843682306134542540">လှည့်ခြင်းလော့ခ် ခလုတ်။ <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">ရှာဖွေမှု+Esc</translation>
diff --git a/ash/strings/ash_strings_ne.xtb b/ash/strings/ash_strings_ne.xtb index f27be93..46ce3d2 100644 --- a/ash/strings/ash_strings_ne.xtb +++ b/ash/strings/ash_strings_ne.xtb
@@ -243,6 +243,7 @@ <translation id="2946119680249604491">जडान थप्नुहोस्</translation> <translation id="2961963223658824723">केही चिज गडबड भयो। केही बेरमा फेरि प्रयास गर्नुहोस्।</translation> <translation id="2963773877003373896">मोड3</translation> +<translation id="296762781903199866"><ph name="LANGUAGE" /> भाषाका वाक् पहिचानसम्बन्धी फाइलहरू डाउनलोड गर्न सकिएन</translation> <translation id="2970920913501714344">एप, विस्तार र विषयवस्तुहरू स्थापना गर्नुहोस्</translation> <translation id="2977598380246111477">अर्को नम्बर</translation> <translation id="2992327365391326550">डिभाइसको माइक्रोफोन बटन अफ गरिएको छ।</translation> @@ -484,6 +485,7 @@ <translation id="4696813013609194136">अभिभावकको कोडमार्फत डिभाइस अनलक गर्नुहोस्</translation> <translation id="4702647871202761252">गोपनीयताको स्क्रिन निष्क्रिय छ</translation> <translation id="4705716602320768426">प्रतिक्रिया दिनुहोस्</translation> +<translation id="4706121060329443414">डाउनलोड गर्ने प्रयास पछि गरिने छ। बोलिएको कुरा प्रोसेस गर्नका निम्ति Google मा पठाइने छ।</translation> <translation id="4731797938093519117">अभिभावकको पहुँच</translation> <translation id="4734965478015604180">तेर्सो</translation> <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + Number किबोर्डका सर्टकट परिवर्तन गरिएको छ। फङ्सन की प्रयोग गर्न <ph name="LAUNCHER_KEY_NAME" /> की + माथिल्लो रोमा भएको कुनै की थिच्नुहोस्।</translation> @@ -589,6 +591,7 @@ <translation id="5600837773213129531">बोली प्रतिक्रिया असक्षम पार्न Ctrl + Alt + Z थिच्नुहोस्।</translation> <translation id="5601503069213153581">पिन</translation> <translation id="5619862035903135339">एड्मिनले तोक्नुभएको नीतिअनुसार स्क्रिन क्याप्चर गर्ने सुविधा अफ गरिन्छ</translation> +<translation id="5620281292257375798">आन्तरिक प्रयोजनका लागि मात्र</translation> <translation id="5625955975703555628">LTE+</translation> <translation id="5648021990716966815">माइकको ज्याक</translation> <translation id="5649768706273821470">सुन्नुहोस्</translation> @@ -657,6 +660,7 @@ <translation id="6073451960410192870">रेकर्ड गर्न छाड्नुहोस्</translation> <translation id="607652042414456612">तपाइँको कम्प्युटर नजिकको ब्लुतुथ डिभाइसहरूको लागि दृश्य-योग्य छ र "<ph name="NAME" />" को रूपमा ठेगाना <ph name="ADDRESS" /> सँग देखा पर्नेछ</translation> <translation id="6094290315941448991">स्क्रिनमा गोप्य सामग्री देखिएका बेला एड्मिनले तोक्नुभएको नीतिअनुसार स्क्रिन रेकर्ड गर्ने सुविधा अफ गरिन्छ</translation> +<translation id="6114505516289286752"><ph name="LANGUAGE" /> भाषाका वाक् पहिचानसम्बन्धी फाइलहरू डाउनलोड गरिएका छन्</translation> <translation id="6119360623251949462"><ph name="CHARGING_STATE" />। <ph name="BATTERY_SAVER_STATE" /></translation> <translation id="612734058257491180">Google सहायक अतिथिको सत्रमा उपलब्ध हुँदैन।</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" /> को खाता हटाउने कार्यसम्बन्धी डायलग खोल्नुहोस्</translation> @@ -738,6 +742,7 @@ <translation id="6816797338148849397">तपाईंले चयन गर्नुभएको पाठसँग सम्बन्धित जानकारी उपलब्ध छ। उक्त जानकारी प्राप्त गर्न अप एरो की प्रयोग गर्नुहोस्।</translation> <translation id="6818242057446442178">कर्सरलाई एक शब्द पछाडि लैजानुहोस्</translation> <translation id="6820676911989879663">विश्राम लिनुहोस्!</translation> +<translation id="6836499262298959512">खतरनाक फाइल</translation> <translation id="6837064795450991317">डेस्कबार लुकाइयोस्</translation> <translation id="6850010208275816200">तपाईंले अहिले प्रयोग गरिरहनुभएको एप फुल स्क्रिन मोडमा चलिरहेको छ। तपाईंले यो एपमा पासवर्ड हाल्नु पर्ने भएमा फुल स्क्रिन मोडबाट बाहिरिएपछि मात्र पासवर्ड हाल्नुहोला।</translation> <translation id="6852052252232534364">सक्रिय गर्न क्लिक गर्नुहोस्</translation> @@ -878,6 +883,7 @@ <translation id="7901405293566323524">फोन हब</translation> <translation id="7902625623987030061">फिंगरप्रिन्ट सेन्सरमा छुनुहोस्</translation> <translation id="7904094684485781019">यो खाताको प्रशासकले बहु साइन इनलाई अनुमति दिएको छैन ।</translation> +<translation id="7930731167419639574">बोलिएका कुरा अबदेखि डिभाइसमा नै प्रोसेस गरिन्छ र स्पिच-टु-टेक्स्टले इन्टरनेटविना नै काम गर्छ</translation> <translation id="7933084174919150729">Google सहायक प्राथमिक प्रोफाइलहरूका लागि मात्र उपलब्ध छ।</translation> <translation id="79341161159229895"><ph name="FIRST_PARENT_EMAIL" /> र <ph name="SECOND_PARENT_EMAIL" /> ले व्यवस्थापन गरेको खाता</translation> <translation id="793716872548410480">आफ्नो क्लिपबोर्ड हेर्न <ph name="SHORTCUT_KEY_NAME" /> + V थिच्नुहोस्। तपाईंले कपी गर्नुभएका पछिल्ला ५ वस्तुहरू तपाईंको क्लिपबोर्डमा सुरक्षित गरिन्छन्।</translation> @@ -990,7 +996,6 @@ <translation id="8818320199597151042">प्रोफाइल हटाइँदै छ। केही मिनेट पर्खनुहोस्।</translation> <translation id="8825863694328519386">पछि फर्कन दायाँबाट स्वाइप गर्नुहोस्</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">तपाईं जुनसुकै बेला प्याकेट क्याप्चर गर्ने कार्य बन्द गर्न सक्नुहुन्छ।</translation> <translation id="8841375032071747811">पछाडि नामक बटन</translation> <translation id="8843682306134542540">परिक्रमासम्बन्धी लक टगल गर्नुहोस्। <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb index 8b3502f..86509c26 100644 --- a/ash/strings/ash_strings_nl.xtb +++ b/ash/strings/ash_strings_nl.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Profiel verwijderen. Wacht een paar minuten.</translation> <translation id="8825863694328519386">Swipe vanaf de linkerkant om terug te gaan</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Je kunt het opnemen van packets op elk moment stoppen.</translation> <translation id="8841375032071747811">Knop Terug</translation> <translation id="8843682306134542540">Draaivergrendeling aan- of uitzetten. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Zoeken+Esc</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb index 2d16a375..2689a9ca 100644 --- a/ash/strings/ash_strings_no.xtb +++ b/ash/strings/ash_strings_no.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Fjerner profilen. Vent i noen minutter.</translation> <translation id="8825863694328519386">Sveip fra venstre for å gå tilbake</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Du kan stoppe pakkeregistreringen når som helst.</translation> <translation id="8841375032071747811">Tilbakeknapp</translation> <translation id="8843682306134542540">Slå av/på rotasjonslås. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Søk+Esc</translation>
diff --git a/ash/strings/ash_strings_or.xtb b/ash/strings/ash_strings_or.xtb index 038081ad..5db190b 100644 --- a/ash/strings/ash_strings_or.xtb +++ b/ash/strings/ash_strings_or.xtb
@@ -990,7 +990,6 @@ <translation id="8818320199597151042">ପ୍ରୋଫାଇଲକୁ କାଢ଼ି ଦିଆଯାଉଛି। କିଛି ସମୟ ପାଇଁ ଅପେକ୍ଷା କରନ୍ତୁ।</translation> <translation id="8825863694328519386">ପଛକୁ ଫେରିବା ପାଇଁ ବାମ ପାର୍ଶ୍ୱରୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">ଆପଣ ଯେ କୌଣସି ସମୟରେ ପ୍ୟାକେଟ୍ କ୍ୟାପଚର୍ କରିବା ବନ୍ଦ କରିପାରିବେ।</translation> <translation id="8841375032071747811">ପଛକୁ ଫେରନ୍ତୁ ବଟନ୍</translation> <translation id="8843682306134542540">ଘୂର୍ଣ୍ଣନ ଲକ୍ ଟୋଗଲ୍ କରନ୍ତୁ। <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_pa.xtb b/ash/strings/ash_strings_pa.xtb index 21b2229..8dde580 100644 --- a/ash/strings/ash_strings_pa.xtb +++ b/ash/strings/ash_strings_pa.xtb
@@ -243,6 +243,7 @@ <translation id="2946119680249604491">ਕਨੈਕਸ਼ਨ ਜੋੜੋ</translation> <translation id="2961963223658824723">ਕੋਈ ਗੜਬੜ ਹੋ ਗਈ। ਕੁਝ ਸਕਿੰਟਾਂ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="2963773877003373896">mod3</translation> +<translation id="296762781903199866"><ph name="LANGUAGE" /> ਦੀਆਂ ਬੋਲੀ ਵਾਲੀਆਂ ਫ਼ਾਈਲਾਂ ਨੂੰ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ</translation> <translation id="2970920913501714344">ਐਪਾਂ, ਐਕਸਟੈਂਸ਼ਨਾਂ ਅਤੇ ਥੀਮਾਂ ਨੂੰ ਸਥਾਪਤ ਕਰੋ</translation> <translation id="2977598380246111477">ਅਗਲਾ ਨੰਬਰ</translation> <translation id="2992327365391326550">ਡੀਵਾਈਸ ਦਾ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਬਟਨ ਬੰਦ ਹੈ।</translation> @@ -484,6 +485,7 @@ <translation id="4696813013609194136">ਮਾਂ-ਪਿਓ ਦੇ ਕੋਡ ਨਾਲ ਡੀਵਾਈਸ ਅਣਲਾਕ ਕਰੋ</translation> <translation id="4702647871202761252">ਪਰਦੇਦਾਰੀ ਸਕ੍ਰੀਨ ਬੰਦ ਹੈ</translation> <translation id="4705716602320768426">ਫ਼ਾਈਲ ਬਾਰੇ ਵਿਚਾਰ</translation> +<translation id="4706121060329443414">ਬਾਅਦ ਵਿੱਚ ਡਾਊਨਲੋਡ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਜਾਵੇਗੀ। ਫ਼ਿਲਹਾਲ ਪ੍ਰਕਿਰਿਆ ਕਰਨ ਲਈ ਬੋਲੀ Google ਨੂੰ ਭੇਜੀ ਜਾਵੇਗੀ।</translation> <translation id="4731797938093519117">ਮਾਂ-ਪਿਓ ਲਈ ਪਹੁੰਚ</translation> <translation id="4734965478015604180">ਲੇਟਵਾਂ</translation> <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + ਨੰਬਰ ਕੀ-ਬੋਰਡ ਸ਼ਾਰਟਕੱਟ ਬਦਲ ਗਿਆ ਹੈ। ਫੰਕਸ਼ਨ ਕੁੰਜੀਆਂ ਵਰਤਣ ਲਈ, <ph name="LAUNCHER_KEY_NAME" /> ਕੁੰਜੀ + ਉੱਪਰਲੀ ਕਤਾਰ 'ਤੇ ਦਿੱਤੀ ਕੋਈ ਵੀ ਕੁੰਜੀ ਦਬਾਓ।</translation> @@ -589,6 +591,7 @@ <translation id="5600837773213129531">ਬੋਲੀ ਪ੍ਰਤੀਕਰਮ ਬੰਦ ਕਰਨ ਲਈ Ctrl + Alt + Z ਦਬਾਓ।</translation> <translation id="5601503069213153581">PIN</translation> <translation id="5619862035903135339">ਪ੍ਰਸ਼ਾਸਕ ਨੀਤੀ ਸਕ੍ਰੀਨ ਕੈਪਚਰ ਨੂੰ ਬੰਦ ਕਰਦੀ ਹੈ</translation> +<translation id="5620281292257375798">ਸਿਰਫ਼ ਅੰਦਰੂਨੀ</translation> <translation id="5625955975703555628">LTE+</translation> <translation id="5648021990716966815">ਮਾਈਕ ਜੈਕ</translation> <translation id="5649768706273821470">ਸੁਣਿਆ</translation> @@ -657,6 +660,7 @@ <translation id="6073451960410192870">ਰਿਕਾਰਡਿੰਗ ਬੰਦ ਕਰੋ</translation> <translation id="607652042414456612">ਨੇੜਲੇ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸ ਤੁਹਾਡੇ ਕੰਪਿਊਟਰ ਨੂੰ ਖੋਜ ਸਕਦੇ ਹਨ ਅਤੇ ਇਹ ਪਤੇ <ph name="ADDRESS" /> ਨਾਲ "<ph name="NAME" />" ਦੇ ਤੌਰ 'ਤੇ ਦਿਖਾਈ ਦੇਵੇਗਾ।</translation> <translation id="6094290315941448991">ਗੁਪਤ ਸਮੱਗਰੀ ਦੇ ਦਿਸਣਯੋਗ ਹੋਣ 'ਤੇ ਪ੍ਰਸ਼ਾਸਕ ਨੀਤੀ ਸਕ੍ਰੀਨ ਰਿਕਾਰਡਿੰਗ ਬੰਦ ਕਰ ਦਿੰਦੀ ਹੈ</translation> +<translation id="6114505516289286752"><ph name="LANGUAGE" /> ਦੀਆਂ ਬੋਲੀ ਵਾਲੀਆਂ ਫ਼ਾਈਲਾਂ ਨੂੰ ਡਾਊਨਲੋਡ ਕੀਤਾ ਗਿਆ</translation> <translation id="6119360623251949462"><ph name="CHARGING_STATE" />। <ph name="BATTERY_SAVER_STATE" /></translation> <translation id="612734058257491180">Google Assistant ਮਹਿਮਾਨ ਸੈਸ਼ਨ ਵਿੱਚ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" /> ਲਈ 'ਹਟਾਓ' ਵਿੰਡੋ ਖੋਲ੍ਹੋ</translation> @@ -738,6 +742,7 @@ <translation id="6816797338148849397">ਤੁਹਾਡੀ ਚੋਣ ਨਾਲ ਸੰਬੰਧਿਤ ਜਾਣਕਾਰੀ ਉਪਲਬਧ ਹੈ। ਪਹੁੰਚ ਕਰਨ ਲਈ 'ਉੱਪਰ ਤੀਰ' ਕੁੰਜੀ ਵਰਤੋ।</translation> <translation id="6818242057446442178">ਇੱਕ ਸ਼ਬਦ ਪਿੱਛੇ ਜਾਓ</translation> <translation id="6820676911989879663">ਥੋੜ੍ਹੀ ਦੇਰ ਆਰਾਮ ਕਰੋ!</translation> +<translation id="6836499262298959512">ਖਤਰਨਾਕ ਫ਼ਾਈਲ</translation> <translation id="6837064795450991317">ਡੈਸਕਬਾਰ ਲੁਕਾਓ</translation> <translation id="6850010208275816200">ਤੁਹਾਡੀ ਮੌਜੂਦਾ ਐਪ ਪੂਰੀ ਸਕ੍ਰੀਨ ਮੋਡ ਵਿੱਚ ਹੈ। ਜੇ ਐਪ ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਪੁੱਛਦੀ ਹੈ, ਤਾਂ ਪਹਿਲਾਂ ਪੂਰੀ ਸਕ੍ਰੀਨ ਮੋਡ ਤੋਂ ਬਾਹਰ ਜਾਓ।</translation> <translation id="6852052252232534364">ਕਿਰਿਆਸ਼ੀਲ ਕਰਨ ਲਈ ਕਲਿੱਕ ਕਰੋ</translation> @@ -878,6 +883,7 @@ <translation id="7901405293566323524">ਫ਼ੋਨ ਹੱਬ</translation> <translation id="7902625623987030061">ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਨੂੰ ਸਪਰਸ਼ ਕਰੋ</translation> <translation id="7904094684485781019">ਇਸ ਖਾਤੇ ਦੇ ਪ੍ਰਸ਼ਾਸਕ ਨੇ ਬਹੁ-ਗਿਣਤੀ ਸਾਈਨ-ਇਨ ਨੂੰ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੱਤੀ ਹੈ।</translation> +<translation id="7930731167419639574">ਬੋਲੀ 'ਤੇ ਹੁਣ ਸਥਾਨਕ ਤੌਰ 'ਤੇ ਪ੍ਰਕਿਰਿਆ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਅਤੇ ਡਿਕਟੇਸ਼ਨ ਆਫ਼ਲਾਈਨ ਕੰਮ ਕਰਦੀ ਹੈ</translation> <translation id="7933084174919150729">Google Assistant ਸਿਰਫ਼ ਪ੍ਰਾਇਮਰੀ ਪ੍ਰੋਫਾਈਲ ਲਈ ਹੀ ਉਪਲਬਧ ਹੈ।</translation> <translation id="79341161159229895"><ph name="FIRST_PARENT_EMAIL" /> ਅਤੇ <ph name="SECOND_PARENT_EMAIL" /> ਵੱਲੋਂ ਖਾਤੇ ਦਾ ਪ੍ਰਬੰਧਨ ਕੀਤਾ ਜਾਂਦਾ ਹੈ</translation> <translation id="793716872548410480">ਆਪਣੇ ਕਲਿੱਪਬੋਰਡ ਨੂੰ ਦੇਖਣ ਲਈ <ph name="SHORTCUT_KEY_NAME" /> + V ਨੂੰ ਦਬਾਓ। ਤੁਹਾਡੇ ਵੱਲੋਂ ਕਾਪੀ ਕੀਤੀਆਂ ਗਈਆਂ ਆਖਰੀ 5 ਆਈਟਮਾਂ ਨੂੰ ਤੁਹਾਡੇ ਕਲਿੱਪਬੋਰਡ ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤਾ ਗਿਆ ਹੈ।</translation> @@ -990,7 +996,6 @@ <translation id="8818320199597151042">ਪ੍ਰੋਫਾਈਲ ਨੂੰ ਹਟਾਇਆ ਜਾ ਰਿਹਾ ਹੈ। ਕੁਝ ਮਿੰਟਾਂ ਲਈ ਉਡੀਕ ਕਰੋ।</translation> <translation id="8825863694328519386">ਪਿੱਛੇ ਜਾਣ ਲਈ ਖੱਬੇ ਪਾਸੇ ਤੋਂ ਸਵਾਈਪ ਕਰੋ</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">ਤੁਸੀਂ ਕਿਸੇ ਵੇਲੇ ਵੀ ਪੈਕੇਟ ਕੈਪਚਰ ਨੂੰ ਰੋਕ ਸਕਦੇ ਹੋ।</translation> <translation id="8841375032071747811">'ਪਿੱਛੇ' ਬਟਨ</translation> <translation id="8843682306134542540">ਘੁਮਾਅ ਸੰਬੰਧੀ ਲਾਕ ਨੂੰ ਟੌਗਲ ਕਰੋ। <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb index 49b2c9b..bf6d374 100644 --- a/ash/strings/ash_strings_pl.xtb +++ b/ash/strings/ash_strings_pl.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Usuwam profil. Odczekaj kilka minut.</translation> <translation id="8825863694328519386">Aby wrócić, przesuń palcem od lewej strony</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Przechwytywanie pakietów możesz w dowolnym momencie zatrzymać.</translation> <translation id="8841375032071747811">Przycisk Wstecz</translation> <translation id="8843682306134542540">Włącz lub wyłącz blokadę obracania. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Szukaj+Esc</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb index 1f05dd5..252d7fe8 100644 --- a/ash/strings/ash_strings_pt-BR.xtb +++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Removendo o perfil. Aguarde alguns minutos.</translation> <translation id="8825863694328519386">Deslize da esquerda para voltar</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Você pode interromper a captura de pacote a qualquer momento.</translation> <translation id="8841375032071747811">Botão "Voltar"</translation> <translation id="8843682306134542540">Alternar bloqueio de rotação. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Pesquisa+Esc</translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb index 7d7005b..ae63c39 100644 --- a/ash/strings/ash_strings_pt-PT.xtb +++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">A remover o perfil. Aguarde alguns minutos.</translation> <translation id="8825863694328519386">Deslize rapidamente a partir da esquerda para retroceder.</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Pode parar a captura de pacotes em qualquer altura.</translation> <translation id="8841375032071747811">Botão Anterior</translation> <translation id="8843682306134542540">Ativar/desativar bloqueio de rotação. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Pesquisa+Esc</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb index 308e12d..1f09301 100644 --- a/ash/strings/ash_strings_ro.xtb +++ b/ash/strings/ash_strings_ro.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Se elimină profilul. Așteaptă câteva minute.</translation> <translation id="8825863694328519386">Glisează dinspre stânga pentru a reveni</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Poți opri oricând capturarea pachetelor.</translation> <translation id="8841375032071747811">Butonul Înapoi</translation> <translation id="8843682306134542540">Comută blocarea rotației. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Tasta de căutare + Esc</translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb index a2baf52d..8c75da5 100644 --- a/ash/strings/ash_strings_ru.xtb +++ b/ash/strings/ash_strings_ru.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Профиль удаляется. Подождите несколько минут.</translation> <translation id="8825863694328519386">Чтобы вернуться, проведите по экрану от левого края</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Операцию захвата сетевых пакетов можно прервать в любой момент.</translation> <translation id="8841375032071747811">Назад</translation> <translation id="8843682306134542540">Изменить настройки автоповорота экрана. <ph name="STATE_TEXT" />.</translation> <translation id="8850991929411075241">Клавиша поиска + Esc</translation>
diff --git a/ash/strings/ash_strings_si.xtb b/ash/strings/ash_strings_si.xtb index 489f54c..5d94d02 100644 --- a/ash/strings/ash_strings_si.xtb +++ b/ash/strings/ash_strings_si.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">පැතිකඩ ඉවත් කරමින්. මිනිත්තු කිහිපයක් රැඳී සිටින්න.</translation> <translation id="8825863694328519386">ආපසු යාමට වමින් ස්වයිප් කරන්න</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">ඔබට ඕනෑම වේලාවක පැකට් ග්රහණය නැවැත්විය හැකිය.</translation> <translation id="8841375032071747811">ආපසු බොත්තම</translation> <translation id="8843682306134542540">කරකැවීමේ අගුල මාරු කරන්න. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb index bf92077..c071d66 100644 --- a/ash/strings/ash_strings_sk.xtb +++ b/ash/strings/ash_strings_sk.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Odstraňuje sa profil. Počkajte niekoľko minút.</translation> <translation id="8825863694328519386">Vrátite sa potiahnutím zľava</translation> <translation id="8828714802988429505">90 °</translation> -<translation id="8832757911363938552">Snímanie balíka môžete kedykoľvek zastaviť.</translation> <translation id="8841375032071747811">Tlačidlo Späť</translation> <translation id="8843682306134542540">Prepnúť uzamknutie otočenia. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Hľadať+Esc</translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb index 275a1ef0..f7a8dd0 100644 --- a/ash/strings/ash_strings_sl.xtb +++ b/ash/strings/ash_strings_sl.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Odstranjevanje profila. Počakajte nekaj minut.</translation> <translation id="8825863694328519386">Povlecite z leve, če se želite vrniti</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Zajem omrežnih paketov lahko kadar koli ustavite.</translation> <translation id="8841375032071747811">Gumb za nazaj</translation> <translation id="8843682306134542540">Preklop zaklepanja zasuka. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Iskanje + Esc</translation>
diff --git a/ash/strings/ash_strings_sq.xtb b/ash/strings/ash_strings_sq.xtb index ad67d19..7167ae41 100644 --- a/ash/strings/ash_strings_sq.xtb +++ b/ash/strings/ash_strings_sq.xtb
@@ -990,7 +990,6 @@ <translation id="8818320199597151042">Profili po hiqet. Prit disa minuta.</translation> <translation id="8825863694328519386">Rrëshqit nga e majta për t'u kthyer prapa</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Mund të ndalosh kapjen e paketave në çfarëdo kohe.</translation> <translation id="8841375032071747811">Butoni "Prapa"</translation> <translation id="8843682306134542540">Aktivizo/çaktivizo kyçjen e rrotullimit. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Kërko+Esc</translation>
diff --git a/ash/strings/ash_strings_sr-Latn.xtb b/ash/strings/ash_strings_sr-Latn.xtb index 613d15ef..87c34543 100644 --- a/ash/strings/ash_strings_sr-Latn.xtb +++ b/ash/strings/ash_strings_sr-Latn.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Profil se uklanja. Sačekajte nekoliko minuta.</translation> <translation id="8825863694328519386">Prevucite sa leve strane da biste se vratili</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Snimanje paketa možete da zaustavite u svakom trenutku.</translation> <translation id="8841375032071747811">Dugme Nazad</translation> <translation id="8843682306134542540">Uključite/isključite zaključavanje rotacije. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb index ed00d13..0f508b5 100644 --- a/ash/strings/ash_strings_sr.xtb +++ b/ash/strings/ash_strings_sr.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Профил се уклања. Сачекајте неколико минута.</translation> <translation id="8825863694328519386">Превуците са леве стране да бисте се вратили</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Снимање пакета можете да зауставите у сваком тренутку.</translation> <translation id="8841375032071747811">Дугме Назад</translation> <translation id="8843682306134542540">Укључите/искључите закључавање ротације. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb index d4ebafae..c161f2b 100644 --- a/ash/strings/ash_strings_sv.xtb +++ b/ash/strings/ash_strings_sv.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Tar bort profilen. Vänta några minuter.</translation> <translation id="8825863694328519386">Återgå genom att svepa från vänster</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Du kan avsluta paketanalysen när som helst.</translation> <translation id="8841375032071747811">Bakåtknapp</translation> <translation id="8843682306134542540">Aktivera och inaktivera rotationslås. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Sök+Escape</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb index 7f7ccf1..e74bdea 100644 --- a/ash/strings/ash_strings_sw.xtb +++ b/ash/strings/ash_strings_sw.xtb
@@ -997,7 +997,6 @@ <translation id="8818320199597151042">Inaondoa wasifu. Subiri dakika kadhaa.</translation> <translation id="8825863694328519386">Telezesha kidole kutoka kushoto ili urudi nyuma</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Unaweza kukomesha mchakato wa kunasa kifurushi cha data wakati wowote.</translation> <translation id="8841375032071747811">Kitufe cha Nyuma</translation> <translation id="8843682306134542540">Washa au uzime hali ya kufunga kwa kuzungusha. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb index 94e467d1..4c4a7277 100644 --- a/ash/strings/ash_strings_ta.xtb +++ b/ash/strings/ash_strings_ta.xtb
@@ -990,7 +990,6 @@ <translation id="8818320199597151042">நெட்வொர்க் சுயவிவரத்தை அகற்றுகிறது. சில நிமிடங்கள் காத்திருக்கவும்.</translation> <translation id="8825863694328519386">முந்தையதற்குச் செல்ல இடது பக்கத்திலிருந்து ஸ்வைப் செய்யவும்</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">எப்போது வேண்டுமானாலும் பேக்கெட் கேப்ச்சரை நிறுத்தலாம்.</translation> <translation id="8841375032071747811">முந்தையது பொத்தான்</translation> <translation id="8843682306134542540">சுழற்சிப் பூட்டை நிலைமாற்றும். <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">தேடல்+Esc</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb index 46a1e8a..832af71 100644 --- a/ash/strings/ash_strings_te.xtb +++ b/ash/strings/ash_strings_te.xtb
@@ -991,7 +991,6 @@ <translation id="8818320199597151042">ప్రొఫైల్ను తీసివేస్తోంది. కొన్ని నిమిషాలు వేచి ఉండండి.</translation> <translation id="8825863694328519386">వెనుకకు వెళ్లడానికి ఎడమ వైపు నుండి స్వైప్ చేయండి</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">మీరు ఎప్పుడైనా ప్యాకెట్ క్యాప్చర్ ఆపరేషన్ను ఆపివేయవచ్చు.</translation> <translation id="8841375032071747811">వెనుకకు బటన్</translation> <translation id="8843682306134542540">భ్రమణం లాక్ను టోగుల్ చేయండి. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb index 003b8edb6..5a2cf1b 100644 --- a/ash/strings/ash_strings_th.xtb +++ b/ash/strings/ash_strings_th.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">กำลังนำโปรไฟล์ออก รอสักครู่</translation> <translation id="8825863694328519386">เลื่อนจากด้านซ้ายเพื่อย้อนกลับ</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">คุณหยุดการบันทึกแพ็กเก็ตได้ทุกเมื่อ</translation> <translation id="8841375032071747811">ปุ่มกลับ</translation> <translation id="8843682306134542540">เปิด/ปิดการล็อกการหมุน <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb index 39f1a446..2550b1a 100644 --- a/ash/strings/ash_strings_tr.xtb +++ b/ash/strings/ash_strings_tr.xtb
@@ -997,7 +997,6 @@ <translation id="8818320199597151042">Profil kaldırılıyor. Birkaç dakika bekleyin.</translation> <translation id="8825863694328519386">Geri gitmek için soldan kaydırın</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Paket yakalama işlemini dilediğiniz zaman durdurabilirsiniz.</translation> <translation id="8841375032071747811">Geri düğmesi</translation> <translation id="8843682306134542540">Döndürme kilidini aç/kapat. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Ara+Esc</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb index 134dc77..66348d4 100644 --- a/ash/strings/ash_strings_uk.xtb +++ b/ash/strings/ash_strings_uk.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Видаляється профіль. Зачекайте кілька хвилин.</translation> <translation id="8825863694328519386">Щоб повернутися, проведіть пальцем від лівого краю</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Ви можете будь-коли зупинити захоплення пакетів.</translation> <translation id="8841375032071747811">Кнопка "Назад"</translation> <translation id="8843682306134542540">Заблокувати/розблокувати обертання. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search (Пошук)+Esc</translation>
diff --git a/ash/strings/ash_strings_ur.xtb b/ash/strings/ash_strings_ur.xtb index d6e5f54..6d9f7499 100644 --- a/ash/strings/ash_strings_ur.xtb +++ b/ash/strings/ash_strings_ur.xtb
@@ -243,6 +243,7 @@ <translation id="2946119680249604491">کنکشن شامل کریں</translation> <translation id="2961963223658824723">کچھ غلط ہو گیا۔ چند سیکنڈ میں دوبارہ کوشش کریں۔</translation> <translation id="2963773877003373896">mod3</translation> +<translation id="296762781903199866"><ph name="LANGUAGE" /> کی اسپیچ فائلز ڈاؤن لوڈ نہیں کر سکے</translation> <translation id="2970920913501714344">ایپس، ایکسٹینشنز اور تھیمز انسٹال کریں</translation> <translation id="2977598380246111477">اگلا نمبر</translation> <translation id="2992327365391326550">آلے کا مائیکروفون بٹن آف ہے۔</translation> @@ -484,6 +485,7 @@ <translation id="4696813013609194136">والدین کے کوڈ سے آلہ غیر مقفل کریں</translation> <translation id="4702647871202761252">رازداری کی اسکرین آف ہے</translation> <translation id="4705716602320768426">تاثرات فائل کریں</translation> +<translation id="4706121060329443414">بعد میں ڈاؤن لوڈ کرنے کی کوشش کی جائے گی۔ اسپیچ اب پروسیسنگ کیلئے Google کو بھیجی جائے گی۔</translation> <translation id="4731797938093519117">والدین کی رسائی</translation> <translation id="4734965478015604180">افقی</translation> <translation id="4735498845456076464">Number + <ph name="LAUNCHER_KEY_NAME" /> کی بورڈ شارٹ کٹ تبدیل ہو گیا ہے۔ فنکشن کلیدوں کا استعمال کرنے کے لیے <ph name="LAUNCHER_KEY_NAME" /> کلید + سب سے اوپر کی قطار پر ایک کلید کو دبائیں۔</translation> @@ -589,6 +591,7 @@ <translation id="5600837773213129531">صوتی تاثرات کو غیر فعال کرنے کے لیے Ctrl + Alt + Z دبائیں۔</translation> <translation id="5601503069213153581">PIN</translation> <translation id="5619862035903135339">منتظم پالیسی کی وجہ سے اسکرین کیپچر کی وضع غیر فعال ہو جاتی ہے</translation> +<translation id="5620281292257375798">صرف داخلی</translation> <translation id="5625955975703555628">LTE+</translation> <translation id="5648021990716966815">مائیک جیک</translation> <translation id="5649768706273821470">سنیں</translation> @@ -657,6 +660,7 @@ <translation id="6073451960410192870">ریکارڈنگ روکیں</translation> <translation id="607652042414456612">آپ کا کمپیوٹر قریبی بلوٹوتھ آلات کے ذریعہ قابل دریافت ہے اور "<ph name="NAME" />" کے بطور پتہ <ph name="ADDRESS" /> کے ساتھ ظاہر ہوگا</translation> <translation id="6094290315941448991">منتظم کی پالیسی کے تحت، رازدارانہ مواد کے مرئی ہونے پر اسکرین ریکارڈ کرنے کی سہولت غیر فعال ہو جاتی ہے</translation> +<translation id="6114505516289286752"><ph name="LANGUAGE" /> کی اسپیچ فائلز ڈاؤن لوڈ ہو گئی</translation> <translation id="6119360623251949462"><ph name="CHARGING_STATE" />۔ <ph name="BATTERY_SAVER_STATE" /></translation> <translation id="612734058257491180">Google اسسٹنٹ مہمان سیشن میں دستیاب نہیں ہے۔</translation> <translation id="6137566720514957455"><ph name="USER_EMAIL_ADDRESS" /> کے لئے اکاؤنٹ ہٹائیں کا ڈائیلاگ کھولیں</translation> @@ -738,6 +742,7 @@ <translation id="6816797338148849397">آپ کے انتخاب سے متعلقہ معلومات دستیاب ہے۔ رسائی حاصل کرنے کے لئے اوپر تیر کے نشان کی کلید کا استعمال کریں۔</translation> <translation id="6818242057446442178">ایک لفظ پیچھے جائیں</translation> <translation id="6820676911989879663">تھوڑا وقفہ لیں!</translation> +<translation id="6836499262298959512">خطرناک فائل</translation> <translation id="6837064795450991317">ڈیسک بار چھپائیں</translation> <translation id="6850010208275816200">آپ کی موجودہ ایپ فُل اسکرین وضع میں ہے۔ اگر ایپ آپ کے پاس ورڈ کا مطالبہ کرتی ہے تو پہلے فُل اسکرین وضع سے باہر نکلیں۔</translation> <translation id="6852052252232534364">کلک برائے فعال</translation> @@ -878,6 +883,7 @@ <translation id="7901405293566323524">فون کا ہب</translation> <translation id="7902625623987030061">فنگر پرنٹ سینسر کو ٹچ کریں</translation> <translation id="7904094684485781019">اس اکاؤنٹ کے منتظم نے متعدد سائن ان کی اجازت ختم کر دی ہے۔</translation> +<translation id="7930731167419639574">اسپیچ اب مقامی طور پر پروسیس کی جاتی ہے اور ڈکٹیشن آف لائن کام کرتا ہے</translation> <translation id="7933084174919150729">Google اسسٹنٹ صرف بنیادی پروفائل کے لیے دستیاب ہے۔</translation> <translation id="79341161159229895"><ph name="FIRST_PARENT_EMAIL" /> اور <ph name="SECOND_PARENT_EMAIL" /> کے زیر نظم اکاؤنٹ</translation> <translation id="793716872548410480">اپنا کلپ بورڈ دیکھنے کے لئے <ph name="SHORTCUT_KEY_NAME" /> + V کو دبائیں۔ آپ کے کاپی کردہ آخری 5 آئٹمز کو آپ کے کلپ بورڈ میں محفوظ کیا گیا ہے۔</translation> @@ -990,7 +996,6 @@ <translation id="8818320199597151042">پروفائل ہٹائی جا رہی ہے۔ کچھ منٹ انتظار کریں۔</translation> <translation id="8825863694328519386">پیچھے جانے کیلئے بائیں سے سوائپ کریں</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">آپ کسی بھی وقت پیکٹ کیپچر کو روک سکتے ہیں۔</translation> <translation id="8841375032071747811">'پیچھے' بٹن</translation> <translation id="8843682306134542540">گردش لاک ٹوگل کریں۔ <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_uz.xtb b/ash/strings/ash_strings_uz.xtb index 8ac6207..7525ca4 100644 --- a/ash/strings/ash_strings_uz.xtb +++ b/ash/strings/ash_strings_uz.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Profil olib tashlanmoqda. Bir necha daqiqa kuting.</translation> <translation id="8825863694328519386">Orqaga qaytish uchun chapdan suring</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Tarmoq paketlarini olish jarayonini istalgan vaqtda toʻxtatish mumkin.</translation> <translation id="8841375032071747811">Orqaga tugmasi</translation> <translation id="8843682306134542540">Burishni qulflash/qulfdan chiqarish. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search + Esc</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb index d7dea012..01bbb3b 100644 --- a/ash/strings/ash_strings_vi.xtb +++ b/ash/strings/ash_strings_vi.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Đang xóa hồ sơ. Hãy chờ ít phút.</translation> <translation id="8825863694328519386">Vuốt từ trái sang để quay lại</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Bạn có thể dừng quá trình thu thập gói dữ liệu bất kỳ lúc nào.</translation> <translation id="8841375032071747811">Nút quay lại</translation> <translation id="8843682306134542540">Bật/tắt khóa xoay. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_zh-CN.xtb b/ash/strings/ash_strings_zh-CN.xtb index 3e52128..f57320b 100644 --- a/ash/strings/ash_strings_zh-CN.xtb +++ b/ash/strings/ash_strings_zh-CN.xtb
@@ -990,7 +990,6 @@ <translation id="8818320199597151042">正在移除配置文件。请稍等几分钟。</translation> <translation id="8825863694328519386">从左侧向右滑动手指即可返回</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">您可随时停止捕获数据包。</translation> <translation id="8841375032071747811">“返回”按钮</translation> <translation id="8843682306134542540">切换旋转锁定设置。<ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_zh-HK.xtb b/ash/strings/ash_strings_zh-HK.xtb index 0aa739a1..202f39e 100644 --- a/ash/strings/ash_strings_zh-HK.xtb +++ b/ash/strings/ash_strings_zh-HK.xtb
@@ -485,7 +485,7 @@ <translation id="4696813013609194136">使用家長存取碼解鎖裝置</translation> <translation id="4702647871202761252">已停用私隱保護畫面</translation> <translation id="4705716602320768426">提供意見</translation> -<translation id="4706121060329443414">系統稍後將再次嘗試下載,目前會暫時把語音傳送給 Google 處理。</translation> +<translation id="4706121060329443414">系統稍後將再次嘗試下載,目前會暫時將語音傳送給 Google 處理。</translation> <translation id="4731797938093519117">家長存取</translation> <translation id="4734965478015604180">橫向</translation> <translation id="4735498845456076464">「<ph name="LAUNCHER_KEY_NAME" />鍵 + 數字鍵」的鍵盤快速鍵已變更。如要使用功能鍵,請按下<ph name="LAUNCHER_KEY_NAME" />鍵 + 最上排的任一按鍵。</translation> @@ -590,7 +590,7 @@ <translation id="5600837773213129531">按下 Ctrl + Alt + Z 鍵即可停用朗讀功能。</translation> <translation id="5601503069213153581">PIN</translation> <translation id="5619862035903135339">管理員政策停用擷取螢幕截圖功能</translation> -<translation id="5620281292257375798">僅供內部使用</translation> +<translation id="5620281292257375798">只供內部使用</translation> <translation id="5625955975703555628">LTE+</translation> <translation id="5648021990716966815">麥克風插孔</translation> <translation id="5649768706273821470">收聽</translation> @@ -995,7 +995,6 @@ <translation id="8818320199597151042">正在移除設定檔。請等候幾分鐘。</translation> <translation id="8825863694328519386">從螢幕左側向右滑動即可返回</translation> <translation id="8828714802988429505">90 度</translation> -<translation id="8832757911363938552">您可隨時停止擷取封包。</translation> <translation id="8841375032071747811">[返回] 按鈕</translation> <translation id="8843682306134542540">切換旋轉鎖定。<ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">搜尋鍵 + Esc 鍵</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb index 3f44a98..cdc59493 100644 --- a/ash/strings/ash_strings_zh-TW.xtb +++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">正在移除設定檔,請稍後片刻。</translation> <translation id="8825863694328519386">從螢幕左側向右滑動即可返回</translation> <translation id="8828714802988429505">90 度</translation> -<translation id="8832757911363938552">你隨時可以停止封包擷取作業。</translation> <translation id="8841375032071747811">返回按鈕</translation> <translation id="8843682306134542540">切換旋轉鎖定。<ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">搜尋鍵 + Esc 鍵</translation>
diff --git a/ash/strings/ash_strings_zu.xtb b/ash/strings/ash_strings_zu.xtb index 144e4be0..44be44f6 100644 --- a/ash/strings/ash_strings_zu.xtb +++ b/ash/strings/ash_strings_zu.xtb
@@ -996,7 +996,6 @@ <translation id="8818320199597151042">Isusa iphrofayela. Linda imizuzu embalwa.</translation> <translation id="8825863694328519386">Swayipha kusuka kwesobunxele ukuze ubuyele emuva</translation> <translation id="8828714802988429505">90°</translation> -<translation id="8832757911363938552">Ungavima iphakethe lokuthatha nganoma yisiphi isikhathi.</translation> <translation id="8841375032071747811">Inkinobho yasemuva</translation> <translation id="8843682306134542540">Shintsha ukukhiya kokuphendula. <ph name="STATE_TEXT" /></translation> <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/system/message_center/ash_message_popup_collection_unittest.cc b/ash/system/message_center/ash_message_popup_collection_unittest.cc index 3d91a37e..2d555329 100644 --- a/ash/system/message_center/ash_message_popup_collection_unittest.cc +++ b/ash/system/message_center/ash_message_popup_collection_unittest.cc
@@ -150,7 +150,7 @@ TEST_F(AshMessagePopupCollectionTest, ShelfAlignment) { const gfx::Rect toast_size(0, 0, 10, 10); - UpdateDisplay("600x600"); + UpdateDisplay("601x600"); gfx::Point toast_point; toast_point.set_x(popup_collection()->GetToastOriginX(toast_size)); toast_point.set_y(popup_collection()->GetBaseline()); @@ -194,7 +194,7 @@ TEST_F(AshMessagePopupCollectionTest, AutoHide) { const gfx::Rect toast_size(0, 0, 10, 10); - UpdateDisplay("600x600"); + UpdateDisplay("601x600"); int origin_x = popup_collection()->GetToastOriginX(toast_size); int baseline = popup_collection()->GetBaseline(); @@ -209,28 +209,28 @@ TEST_F(AshMessagePopupCollectionTest, DisplayResize) { const gfx::Rect toast_size(0, 0, 10, 10); - UpdateDisplay("600x600"); + UpdateDisplay("601x600"); int origin_x = popup_collection()->GetToastOriginX(toast_size); int baseline = popup_collection()->GetBaseline(); - UpdateDisplay("800x800"); + UpdateDisplay("801x800"); EXPECT_LT(origin_x, popup_collection()->GetToastOriginX(toast_size)); EXPECT_LT(baseline, popup_collection()->GetBaseline()); - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); EXPECT_GT(origin_x, popup_collection()->GetToastOriginX(toast_size)); EXPECT_GT(baseline, popup_collection()->GetBaseline()); } TEST_F(AshMessagePopupCollectionTest, DockedMode) { const gfx::Rect toast_size(0, 0, 10, 10); - UpdateDisplay("600x600"); + UpdateDisplay("601x600"); int origin_x = popup_collection()->GetToastOriginX(toast_size); int baseline = popup_collection()->GetBaseline(); // Emulate the docked mode; enter to an extended mode, then invoke // OnNativeDisplaysChanged() with the info for the secondary display only. - UpdateDisplay("600x600,800x800"); + UpdateDisplay("601x600,801x800"); std::vector<display::ManagedDisplayInfo> new_info; new_info.push_back(display_manager()->GetDisplayInfo( @@ -243,7 +243,7 @@ TEST_F(AshMessagePopupCollectionTest, TrayHeight) { const gfx::Rect toast_size(0, 0, 10, 10); - UpdateDisplay("600x600"); + UpdateDisplay("601x600"); int origin_x = popup_collection()->GetToastOriginX(toast_size); int baseline = popup_collection()->GetBaseline(); @@ -257,7 +257,7 @@ } TEST_F(AshMessagePopupCollectionTest, Extended) { - UpdateDisplay("600x600,800x800"); + UpdateDisplay("601x600,801x800"); SetPopupCollection( std::make_unique<AshMessagePopupCollection>(GetPrimaryShelf())); @@ -273,7 +273,7 @@ } TEST_F(AshMessagePopupCollectionTest, MixedFullscreenNone) { - UpdateDisplay("600x600,800x800"); + UpdateDisplay("601x600,801x800"); Shelf* shelf1 = GetPrimaryShelf(); TestMessagePopupCollection collection1(shelf1); UpdateWorkArea(&collection1, GetPrimaryDisplay()); @@ -298,7 +298,7 @@ } TEST_F(AshMessagePopupCollectionTest, MixedFullscreenSome) { - UpdateDisplay("600x600,800x800"); + UpdateDisplay("601x600,801x800"); Shelf* shelf1 = GetPrimaryShelf(); TestMessagePopupCollection collection1(shelf1); UpdateWorkArea(&collection1, GetPrimaryDisplay()); @@ -323,7 +323,7 @@ } TEST_F(AshMessagePopupCollectionTest, MixedFullscreenAll) { - UpdateDisplay("600x600,800x800"); + UpdateDisplay("601x600,801x800"); Shelf* shelf1 = GetPrimaryShelf(); TestMessagePopupCollection collection1(shelf1); UpdateWorkArea(&collection1, GetPrimaryDisplay()); @@ -362,7 +362,7 @@ // transition. SetPopupCollection(nullptr); - UpdateDisplay("600x600,800x800"); + UpdateDisplay("601x600,801x800"); SetPopupCollection( std::make_unique<AshMessagePopupCollection>(GetPrimaryShelf())); @@ -376,11 +376,11 @@ ASSERT_TRUE( keyboard::KeyboardUIController::Get()->IsKeyboardOverscrollEnabled()); - UpdateDisplay("600x600"); + UpdateDisplay("601x600"); int baseline = popup_collection()->GetBaseline(); Shelf* shelf = GetPrimaryShelf(); - gfx::Rect keyboard_bounds(0, 300, 600, 300); + gfx::Rect keyboard_bounds(0, 300, 601, 300); shelf->SetVirtualKeyboardBoundsForTesting(keyboard_bounds); int keyboard_baseline = popup_collection()->GetBaseline(); EXPECT_NE(baseline, keyboard_baseline);
diff --git a/ash/system/message_center/stacked_notification_bar.cc b/ash/system/message_center/stacked_notification_bar.cc index 58443271..f14bc9d 100644 --- a/ash/system/message_center/stacked_notification_bar.cc +++ b/ash/system/message_center/stacked_notification_bar.cc
@@ -112,8 +112,9 @@ : public views::ImageView, public ui::LayerAnimationObserver { public: - explicit StackedNotificationBarIcon(const std::string& id) - : views::ImageView(), id_(id) { + StackedNotificationBarIcon(StackedNotificationBar* notification_bar, + const std::string& id) + : views::ImageView(), notification_bar_(notification_bar), id_(id) { SetPaintToLayer(); layer()->SetFillsBoundsOpaquely(false); } @@ -189,13 +190,7 @@ layer()->GetAnimator()->StartAnimation(sequence.release()); } - using AnimationCompleteCallback = base::OnceCallback<void(views::View*)>; - - void AnimateOut(AnimationCompleteCallback animation_complete_callback) { - DCHECK(animation_complete_callback_.is_null()); - - animation_complete_callback_ = std::move(animation_complete_callback); - + void AnimateOut() { layer()->GetAnimator()->StopAnimating(); std::unique_ptr<ui::InterpolatedTransform> scale = @@ -232,7 +227,7 @@ // ui::LayerAnimationObserver: void OnLayerAnimationEnded(ui::LayerAnimationSequence* sequence) override { set_animating_out(false); - std::move(animation_complete_callback_).Run(this); + notification_bar_->OnIconAnimatedOut(this); // Note |this| is deleted after this point. } @@ -246,58 +241,57 @@ void set_animating_out(bool animating_out) { animating_out_ = animating_out; } private: + StackedNotificationBar* notification_bar_; std::string id_; bool animating_out_ = false; - - // Used to notify the parent of animation completion. This is deleted after - // the callback is run. - // Registered in `AnimateOut()`. - AnimationCompleteCallback animation_complete_callback_; }; StackedNotificationBar::StackedNotificationBar( UnifiedMessageCenterView* message_center_view) : message_center_view_(message_center_view), - notification_icons_container_( - AddChildView(std::make_unique<views::View>())), - count_label_(AddChildView(std::make_unique<views::Label>())), - clear_all_button_(AddChildView(std::make_unique<StackingBarLabelButton>( + count_label_(new views::Label), + clear_all_button_(new StackingBarLabelButton( base::BindRepeating(&UnifiedMessageCenterView::ClearAllNotifications, base::Unretained(message_center_view_)), l10n_util::GetStringUTF16( IDS_ASH_MESSAGE_CENTER_CLEAR_ALL_BUTTON_LABEL), - message_center_view))), - expand_all_button_(AddChildView(std::make_unique<StackingBarLabelButton>( + message_center_view)), + expand_all_button_(new StackingBarLabelButton( base::BindRepeating(&UnifiedMessageCenterView::ExpandMessageCenter, base::Unretained(message_center_view_)), l10n_util::GetStringUTF16( IDS_ASH_MESSAGE_CENTER_EXPAND_ALL_NOTIFICATIONS_BUTTON_LABEL), - message_center_view))) { + message_center_view)) { SetVisible(false); auto* layout = SetLayoutManager(std::make_unique<views::BoxLayout>( views::BoxLayout::Orientation::kHorizontal)); layout->set_cross_axis_alignment( views::BoxLayout::CrossAxisAlignment::kStretch); + notification_icons_container_ = new views::View(); notification_icons_container_->SetLayoutManager( std::make_unique<views::BoxLayout>( views::BoxLayout::Orientation::kHorizontal, kStackedNotificationIconsContainerPadding, kStackedNotificationBarIconSpacing)); - + AddChildView(notification_icons_container_); message_center::MessageCenter::Get()->AddObserver(this); count_label_->SetEnabledColor(message_center_style::kCountLabelColor); count_label_->SetFontList(views::Label::GetDefaultFontList().Derive( 1, gfx::Font::NORMAL, gfx::Font::Weight::MEDIUM)); + AddChildView(count_label_); - views::View* spacer = AddChildView(std::make_unique<views::View>()); + views::View* spacer = new views::View; + AddChildView(spacer); layout->SetFlexForView(spacer, 1); clear_all_button_->SetTooltipText(l10n_util::GetStringUTF16( IDS_ASH_MESSAGE_CENTER_CLEAR_ALL_BUTTON_TOOLTIP)); + AddChildView(clear_all_button_); expand_all_button_->SetVisible(false); + AddChildView(expand_all_button_); SetPaintToLayer(); } @@ -357,42 +351,32 @@ void StackedNotificationBar::AddNotificationIcon( message_center::Notification* notification, bool at_front) { + views::ImageView* icon_view = + new StackedNotificationBarIcon(this, notification->id()); if (at_front) - notification_icons_container_->AddChildViewAt( - std::make_unique<StackedNotificationBarIcon>(notification->id()), 0); + notification_icons_container_->AddChildViewAt(icon_view, 0); else - notification_icons_container_->AddChildView( - std::make_unique<StackedNotificationBarIcon>(notification->id())); + notification_icons_container_->AddChildView(icon_view); } -void StackedNotificationBar::OnIconAnimatedOut( - message_center::Notification* notification, - views::View* icon) { +void StackedNotificationBar::OnIconAnimatedOut(views::View* icon) { delete icon; - - // This is only called when icons animate out, so never add icons to the - // front. - if (notification) - AddNotificationIcon(notification, /*at_front=*/false); - Layout(); } StackedNotificationBar::StackedNotificationBarIcon* -StackedNotificationBar::GetFrontIcon(bool animating_out) { +StackedNotificationBar::GetFrontIcon() { const auto i = std::find_if( notification_icons_container_->children().cbegin(), - notification_icons_container_->children().cend(), [&](const auto* v) { - return animating_out == - static_cast<const StackedNotificationBarIcon*>(v) - ->is_animating_out(); + notification_icons_container_->children().cend(), [](const auto* v) { + return !static_cast<const StackedNotificationBarIcon*>(v) + ->is_animating_out(); }); return (i == notification_icons_container_->children().cend() ? nullptr : static_cast<StackedNotificationBarIcon*>(*i)); } - const StackedNotificationBar::StackedNotificationBarIcon* StackedNotificationBar::GetIconFromId(const std::string& id) const { for (auto* v : notification_icons_container_->children()) { @@ -406,57 +390,35 @@ void StackedNotificationBar::ShiftIconsLeft( std::vector<message_center::Notification*> stacked_notifications) { - auto* front_animating_out_icon = GetFrontIcon(/*animating_out=*/true); - bool is_already_animating_a_left_shift = front_animating_out_icon != nullptr; - // If we need to animate a second icon, the scroll is faster than the icon can - // animate out (this is possible with a very fast scroll), so immediately - // finish that animation before starting a new one. - if (is_already_animating_a_left_shift) { - front_animating_out_icon->layer()->GetAnimator()->StopAnimating(); - // `front_animating_out_icon` is now deleted, and StackedNotificationBar has - // been reloaded with another icon in the back. - } - int stacked_notification_count = stacked_notifications.size(); int removed_icons_count = std::min(stacked_notification_count_ - stacked_notification_count, kStackedNotificationBarMaxIcons); - stacked_notification_count_ = stacked_notification_count; - // Remove required number of icons from the front. // Only animate if we're removing one icon. + if (removed_icons_count == 1) { + StackedNotificationBarIcon* icon = GetFrontIcon(); + if (icon) { + icon->AnimateOut(); + } + } else { + for (int i = 0; i < removed_icons_count; i++) { + StackedNotificationBarIcon* icon = GetFrontIcon(); + if (icon) { + delete icon; + } + } + } + // Add icons to the back if there was a backfill. int backfill_start = kStackedNotificationBarMaxIcons - removed_icons_count; int backfill_end = std::min(kStackedNotificationBarMaxIcons, stacked_notification_count); - const bool will_animate = removed_icons_count == 1; - if (will_animate) { - auto* icon = GetFrontIcon(/*animating_out=*/false); - if (icon) { - // If there are notifications to backfill, do not add the - // icon until the animation completes, this avoids a jumping overflow - // label/icons and having more than 3 icons in the stack. - message_center::Notification* notification_icon_to_show_on_completion = - backfill_start < backfill_end ? stacked_notifications[backfill_start] - : nullptr; - icon->AnimateOut( - base::BindOnce(&StackedNotificationBar::OnIconAnimatedOut, - weak_ptr_factory_.GetWeakPtr(), - notification_icon_to_show_on_completion)); - } - return; - } - - // No animation. - for (int i = 0; i < removed_icons_count; i++) { - auto* icon = GetFrontIcon(/*animating_out=*/false); - if (icon) { - delete icon; - } - } - - for (int i = backfill_start; i < backfill_end; i++) + for (int i = backfill_start; i < backfill_end; i++) { AddNotificationIcon(stacked_notifications[i], false /*at_front*/); + } + + stacked_notification_count_ = stacked_notification_count; } void StackedNotificationBar::ShiftIconsRight( @@ -475,9 +437,9 @@ ++stacked_notification_count_; } // Animate in the first stacked notification icon. - auto* icon = GetFrontIcon(/*animating_out=*/false); + StackedNotificationBarIcon* icon = GetFrontIcon(); if (icon) - icon->AnimateIn(); + GetFrontIcon()->AnimateIn(); } void StackedNotificationBar::UpdateStackedNotifications(
diff --git a/ash/system/message_center/stacked_notification_bar.h b/ash/system/message_center/stacked_notification_bar.h index fb17626..c6b1798 100644 --- a/ash/system/message_center/stacked_notification_bar.h +++ b/ash/system/message_center/stacked_notification_bar.h
@@ -9,7 +9,6 @@ #include "ash/system/message_center/message_center_scroll_bar.h" #include "ash/system/message_center/unified_message_center_view.h" #include "ash/system/message_center/unified_message_list_view.h" -#include "base/memory/weak_ptr.h" #include "ui/compositor/layer_animation_observer.h" #include "ui/gfx/animation/animation_delegate.h" #include "ui/message_center/message_center_observer.h" @@ -26,8 +25,8 @@ namespace ash { // The header shown above the notification list displaying the number of hidden -// notifications. Has a dynamic list of icons which hide/show as notifications -// are scrolled. +// notifications. There are currently two UI implementations toggled by the +// NotificationStackedBarRedesign feature flag. class StackedNotificationBar : public views::View, public message_center::MessageCenterObserver { public: @@ -51,6 +50,9 @@ // Set notification bar state to expanded. void SetExpanded(); + // Clean up icon view after it's removal animation is complete. + void OnIconAnimatedOut(views::View* icon); + // views::View: void OnPaint(gfx::Canvas* canvas) override; const char* GetClassName() const override; @@ -64,14 +66,8 @@ class StackedNotificationBarIcon; friend class UnifiedMessageCenterViewTest; - // Clean up icon view after it's removal animation is complete, adds an icon - // for `notification` if needed. Called from a callback registered in - // `ShiftIconsLeft()`. - void OnIconAnimatedOut(message_center::Notification* notification, - views::View* icon); - - // Get the first icon which is `animating_out`. - StackedNotificationBarIcon* GetFrontIcon(bool animating_out); + // Get the first icon which is not animating out. + StackedNotificationBarIcon* GetFrontIcon(); // Search for a icon view in the stacked notification bar based on a provided // notification id. @@ -109,9 +105,6 @@ views::Label* const count_label_; views::Button* const clear_all_button_; views::Button* const expand_all_button_; - - base::WeakPtrFactory<StackedNotificationBar> weak_ptr_factory_{this}; - DISALLOW_COPY_AND_ASSIGN(StackedNotificationBar); };
diff --git a/ash/system/message_center/unified_message_center_view.cc b/ash/system/message_center/unified_message_center_view.cc index a7cb7ca..f9c24100 100644 --- a/ash/system/message_center/unified_message_center_view.cc +++ b/ash/system/message_center/unified_message_center_view.cc
@@ -21,6 +21,7 @@ #include "base/memory/ptr_util.h" #include "base/metrics/user_metrics.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#include "ui/compositor/layer_type.h" #include "ui/gfx/animation/linear_animation.h" #include "ui/message_center/message_center.h" #include "ui/message_center/views/message_view.h" @@ -75,7 +76,8 @@ message_center_bubble_(bubble), notification_bar_(new StackedNotificationBar(this)), scroll_bar_(new MessageCenterScrollBar(this)), - scroller_(new views::ScrollView()), + scroller_( + new views::ScrollView(views::ScrollView::ScrollWithLayers::kEnabled)), message_list_view_(new UnifiedMessageListView(this, model)), last_scroll_position_from_bottom_(0), animation_(std::make_unique<gfx::LinearAnimation>(this)), @@ -86,6 +88,7 @@ // Need to set the transparent background explicitly, since ScrollView has // set the default opaque background color. + scroller_->SetContentsLayerType(ui::LAYER_NOT_DRAWN); scroller_->SetContents( std::make_unique<ScrollerContentsView>(message_list_view_)); scroller_->SetBackgroundColor(absl::nullopt);
diff --git a/ash/system/message_center/unified_message_center_view_unittest.cc b/ash/system/message_center/unified_message_center_view_unittest.cc index f71af6d..06342e1 100644 --- a/ash/system/message_center/unified_message_center_view_unittest.cc +++ b/ash/system/message_center/unified_message_center_view_unittest.cc
@@ -20,8 +20,6 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" #include "components/prefs/pref_service.h" -#include "ui/compositor/layer.h" -#include "ui/compositor/scoped_animation_duration_scale_mode.h" #include "ui/message_center/message_center.h" #include "ui/message_center/views/message_view.h" #include "ui/views/controls/scroll_view.h" @@ -174,11 +172,6 @@ return message_center_view()->notification_bar_; } - views::View* GetNotificationBarIconsContainer() { - return message_center_view() - ->notification_bar_->notification_icons_container_; - } - views::View* GetNotificationBarLabel() { return message_center_view()->notification_bar_->count_label_; } @@ -482,12 +475,12 @@ GetScroller()->GetVisibleRect().bottom()); } -// Tests basic layout of the StackingNotificationBar. -TEST_F(UnifiedMessageCenterViewTest, StackingCounterLabelLayout) { +TEST_F(UnifiedMessageCenterViewTest, StackingCounterLayout) { AddManyNotifications(); // MessageCenterView is maxed out. CreateMessageCenterView(); + EXPECT_TRUE(message_center_view()->GetVisible()); EXPECT_GT(GetMessageListView()->bounds().height(), message_center_view()->bounds().height()); @@ -498,26 +491,32 @@ GetScroller()->bounds().y()); EXPECT_TRUE(GetNotificationBarLabel()->GetVisible()); EXPECT_TRUE(GetNotificationBarClearAllButton()->GetVisible()); -} -// Tests that the NotificationBarLabel is invisible when scrolled to the top. -TEST_F(UnifiedMessageCenterViewTest, StackingCounterLabelInvisible) { - AddManyNotifications(); - CreateMessageCenterView(); - - // Scroll to the top, the counter label should be invisible. + // Scroll to the top, making the counter label invisible. GetScroller()->ScrollToPosition(GetScrollBar(), 0); message_center_view()->OnMessageCenterScrolled(); - + EXPECT_TRUE(GetNotificationBar()->GetVisible()); EXPECT_FALSE(GetNotificationBarLabel()->GetVisible()); - // ClearAll label should always be visible. EXPECT_TRUE(GetNotificationBarClearAllButton()->GetVisible()); } -// Tests that the NotificationBarLabel is visible when scrolling down. -TEST_F(UnifiedMessageCenterViewTest, StackingCounterLabelVisible) { +TEST_F(UnifiedMessageCenterViewTest, StackingCounterMessageListScrolled) { AddManyNotifications(); CreateMessageCenterView(); + EXPECT_TRUE(message_center_view()->GetVisible()); + EXPECT_TRUE(GetNotificationBarLabel()->GetVisible()); + EXPECT_TRUE(GetNotificationBarClearAllButton()->GetVisible()); + + // MessageCenterView is maxed out. + EXPECT_GT(GetMessageListView()->bounds().height(), + message_center_view()->bounds().height()); + + // Scroll to the top, making the counter label invisible. + GetScroller()->ScrollToPosition(GetScrollBar(), 0); + message_center_view()->OnMessageCenterScrolled(); + EXPECT_TRUE(GetNotificationBar()->GetVisible()); + EXPECT_FALSE(GetNotificationBarLabel()->GetVisible()); + EXPECT_TRUE(GetNotificationBarClearAllButton()->GetVisible()); // Scrolling past 5 notifications should make the counter label visible. const int scroll_amount = (GetMessageViewVisibleBounds(0).height() * 5) + 1; @@ -525,72 +524,16 @@ message_center_view()->OnMessageCenterScrolled(); EXPECT_TRUE(GetNotificationBarLabel()->GetVisible()); - // ClearAll label should always be visible. - EXPECT_TRUE(GetNotificationBarClearAllButton()->GetVisible()); -} - -// Tests that the +n notifications label hides after being shown. -TEST_F(UnifiedMessageCenterViewTest, StackingCounterLabelHidesAfterShown) { - AddManyNotifications(); - CreateMessageCenterView(); - - // Scroll to the top, making the counter label invisible. - GetScroller()->ScrollToPosition(GetScrollBar(), 0); - message_center_view()->OnMessageCenterScrolled(); - - // Scrolling past 5 notifications should make the counter label visible. - const int scroll_amount = (GetMessageViewVisibleBounds(0).height() * 5) + 1; - GetScroller()->ScrollToPosition(GetScrollBar(), scroll_amount); - message_center_view()->OnMessageCenterScrolled(); - - ASSERT_TRUE(GetNotificationBarLabel()->GetVisible()); // Scrolling back to the top should make the // counter label invisible again. GetScroller()->ScrollToPosition(GetScrollBar(), 0); message_center_view()->OnMessageCenterScrolled(); - + EXPECT_TRUE(GetNotificationBar()->GetVisible()); EXPECT_FALSE(GetNotificationBarLabel()->GetVisible()); - // ClearAll label should always be visible. EXPECT_TRUE(GetNotificationBarClearAllButton()->GetVisible()); } -// Tests that there are never more than 3 stacked icons in the -// StackedNotificationBar. Also verifies that only one animation happens at a -// time (this prevents the user from over-scrolling and showing multiple -// animations when they scroll very quickly). Before, users could scroll fast -// and have a large amount of icons, instead of keeping it to 3. -TEST_F(UnifiedMessageCenterViewTest, StackingIconsNeverMoreThanThree) { - for (int i = 0; i < 20; ++i) - AddNotification(false); - CreateMessageCenterView(); - - // Force animations to happen, so we can see if multiple animations trigger. - ui::ScopedAnimationDurationScaleMode scoped_duration_modifier( - ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION); - // Scroll past 20 notifications, so we can scroll back up quickly. - for (int i = 20; i >= 0; --i) { - const int scroll_amount = (GetMessageViewVisibleBounds(0).height() * i) + 1; - GetScroller()->ScrollToPosition(GetScrollBar(), scroll_amount); - message_center_view()->OnMessageCenterScrolled(); - - auto icons_container_children = - GetNotificationBarIconsContainer()->children(); - int animating_count = 0; - for (auto* child : icons_container_children) { - // Verify that no more than one icon is animating at any one time. - if (child->layer()->GetAnimator()->is_animating()) - animating_count++; - } - EXPECT_GE(1, animating_count); - // Verify that no more than 3 icons are added to the bar at any one time, - // regardless of how fast the user scrolls. This test scrolls faster than - // the icons can animate away, and animating icons should be removed prior - // to starting a new animation. - EXPECT_GE(3u, icons_container_children.size()); - } -} - // Flaky: crbug.com/1163575 TEST_F(UnifiedMessageCenterViewTest, DISABLED_StackingCounterNotificationRemoval) {
diff --git a/ash/system/overview/overview_button_tray_unittest.cc b/ash/system/overview/overview_button_tray_unittest.cc index cffde86..4fe96489 100644 --- a/ash/system/overview/overview_button_tray_unittest.cc +++ b/ash/system/overview/overview_button_tray_unittest.cc
@@ -258,7 +258,7 @@ // when TabletMode has been enabled, when we are using multiple displays. // By default the DisplayManger is in extended mode. TEST_F(OverviewButtonTrayTest, DisplaysOnBothDisplays) { - UpdateDisplay("400x400,200x200"); + UpdateDisplay("500x400,300x200"); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(GetTray()->GetVisible()); EXPECT_FALSE(GetSecondaryTray()->GetVisible()); @@ -279,7 +279,7 @@ // https://crbug.com/798857. TEST_F(OverviewButtonTrayTest, DISABLED_SecondaryTrayCreatedVisible) { TabletModeControllerTestApi().EnterTabletMode(); - UpdateDisplay("400x400,200x200"); + UpdateDisplay("500x400,300x200"); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(GetSecondaryTray()->GetVisible()); }
diff --git a/ash/system/palette/palette_tray_unittest.cc b/ash/system/palette/palette_tray_unittest.cc index a7d002c..c50c694 100644 --- a/ash/system/palette/palette_tray_unittest.cc +++ b/ash/system/palette/palette_tray_unittest.cc
@@ -801,7 +801,7 @@ }; // Add a external display, then sign in. - UpdateDisplay("200x200,200x200"); + UpdateDisplay("300x200,300x200"); display::test::DisplayManagerTestApi(display_manager()) .SetFirstDisplayAsInternalDisplay(); Shell::RootWindowControllerList controllers = @@ -895,7 +895,7 @@ switches::kAshEnablePaletteOnAllDisplays); // Add a external display, then sign in. - UpdateDisplay("200x200,200x200"); + UpdateDisplay("300x200,300x200"); display::test::DisplayManagerTestApi(display_manager()) .SetFirstDisplayAsInternalDisplay(); Shell::RootWindowControllerList controllers =
diff --git a/ash/system/phonehub/phone_hub_tray.cc b/ash/system/phonehub/phone_hub_tray.cc index 06c3f4d2..f0af4f0 100644 --- a/ash/system/phonehub/phone_hub_tray.cc +++ b/ash/system/phonehub/phone_hub_tray.cc
@@ -239,6 +239,10 @@ if (!bubble_) return; + auto* bubble_view = bubble_->GetBubbleView(); + if (bubble_view) + bubble_view->ResetDelegate(); + DCHECK(content_view_); phone_hub_metrics::LogScreenOnBubbleClose( content_view_->GetScreenForMetrics());
diff --git a/ash/system/power/power_event_observer_unittest.cc b/ash/system/power/power_event_observer_unittest.cc index 63ad869c..44db3138 100644 --- a/ash/system/power/power_event_observer_unittest.cc +++ b/ash/system/power/power_event_observer_unittest.cc
@@ -232,7 +232,7 @@ SetCanLockScreen(true); SetShouldLockScreenAutomatically(true); - UpdateDisplay("100x100,200x200"); + UpdateDisplay("100x100,300x200"); chromeos::FakePowerManagerClient* client = chromeos::FakePowerManagerClient::Get(); @@ -281,7 +281,7 @@ SetCanLockScreen(true); SetShouldLockScreenAutomatically(true); - UpdateDisplay("100x100,200x200"); + UpdateDisplay("100x100,300x200"); chromeos::FakePowerManagerClient* client = chromeos::FakePowerManagerClient::Get(); @@ -569,7 +569,7 @@ SetCanLockScreen(true); SetShouldLockScreenAutomatically(true); - UpdateDisplay("100x100,200x200"); + UpdateDisplay("100x100,300x200"); // Set up animation state so wallpaper widget animations are not ended on // their creation.
diff --git a/ash/system/screen_layout_observer_unittest.cc b/ash/system/screen_layout_observer_unittest.cc index 638701ae0..6981524e 100644 --- a/ash/system/screen_layout_observer_unittest.cc +++ b/ash/system/screen_layout_observer_unittest.cc
@@ -154,12 +154,12 @@ // This test is flaky. crbug.com/1222612 TEST_F(ScreenLayoutObserverTest, DISABLED_DisplayNotifications) { - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); display::Display::SetInternalDisplayId(display_manager()->first_display_id()); EXPECT_TRUE(GetDisplayNotificationText().empty()); // rotation. - UpdateDisplay("400x400/r"); + UpdateDisplay("500x400/r"); EXPECT_EQ(l10n_util::GetStringFUTF16( IDS_ASH_STATUS_TRAY_DISPLAY_ROTATED, GetFirstDisplayName(), l10n_util::GetStringUTF16( @@ -168,7 +168,7 @@ EXPECT_TRUE(GetDisplayNotificationText().empty()); CloseNotification(); - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); EXPECT_EQ(l10n_util::GetStringFUTF16( IDS_ASH_STATUS_TRAY_DISPLAY_ROTATED, GetFirstDisplayName(), l10n_util::GetStringUTF16( @@ -178,12 +178,12 @@ // No-update CloseNotification(); - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); EXPECT_FALSE(IsNotificationShown()); // Extended. CloseNotification(); - UpdateDisplay("400x400,200x200"); + UpdateDisplay("500x400,300x200"); EXPECT_EQ(l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED, GetSecondDisplayName()), GetDisplayNotificationText()); @@ -207,13 +207,13 @@ // user of it. See issue 827406 (https://crbug.com/827406). display::test::DisplayManagerTestApi(Shell::Get()->display_manager()) .set_maximum_display(2u); - UpdateDisplay("400x400,200x200,100x100"); + UpdateDisplay("500x400,300x200,100x100"); EXPECT_TRUE(GetDisplayNotificationText().empty()); EXPECT_EQ(l10n_util::GetStringUTF16( IDS_ASH_STATUS_TRAY_DISPLAY_REMOVED_EXCEEDED_MAXIMUM), GetDisplayNotificationAdditionalText()); EXPECT_TRUE(GetDisplayNotificationText().empty()); - UpdateDisplay("400x400,200x200"); + UpdateDisplay("500x400,300x200"); CloseNotification(); // Start tablet mode and wait until display mode is updated. @@ -231,7 +231,7 @@ // becomes mirror mode from extending mode. Under this circumstance, user is // still notified of connecting more displays than maximum. See issue 827406 // (https://crbug.com/827406). - UpdateDisplay("400x400,200x200,100x100"); + UpdateDisplay("500x400,300x200,100x100"); EXPECT_EQ(l10n_util::GetStringUTF16( IDS_ASH_STATUS_TRAY_DISPLAY_REMOVED_EXCEEDED_MAXIMUM), GetDisplayNotificationAdditionalText()); @@ -279,7 +279,7 @@ EXPECT_TRUE(GetDisplayNotificationAdditionalText().empty()); // Rotate the second. - UpdateDisplay("400x400@1.5,200x200/r"); + UpdateDisplay("500x400@1.5,300x200/r"); EXPECT_EQ(l10n_util::GetStringFUTF16( IDS_ASH_STATUS_TRAY_DISPLAY_ROTATED, GetSecondDisplayName(), l10n_util::GetStringUTF16( @@ -288,12 +288,12 @@ EXPECT_TRUE(GetDisplayNotificationText().empty()); // Enters closed lid mode. - UpdateDisplay("400x400@1.5,200x200"); + UpdateDisplay("500x400@1.5,300x200"); display::Display::SetInternalDisplayId( display::test::DisplayManagerTestApi(display_manager()) .GetSecondaryDisplay() .id()); - UpdateDisplay("400x400@1.5"); + UpdateDisplay("500x400@1.5"); EXPECT_TRUE(GetDisplayNotificationText().empty()); } @@ -302,16 +302,16 @@ scoped_feature_list_.InitAndEnableFeature( features::kReduceDisplayNotifications); - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); display::Display::SetInternalDisplayId(display_manager()->first_display_id()); EXPECT_TRUE(GetDisplayNotificationText().empty()); // Rotation. - UpdateDisplay("400x400/r"); + UpdateDisplay("500x400/r"); EXPECT_FALSE(IsNotificationShown()); // Adding a display. - UpdateDisplay("400x400,200x200"); + UpdateDisplay("500x400,300x200"); EXPECT_FALSE(IsNotificationShown()); const int64_t first_display_id = @@ -332,13 +332,13 @@ // warn user of it. See issue 827406 (https://crbug.com/827406). display::test::DisplayManagerTestApi(Shell::Get()->display_manager()) .set_maximum_display(2u); - UpdateDisplay("400x400,200x200,100x100"); + UpdateDisplay("500x400,300x200,100x100"); EXPECT_TRUE(GetDisplayNotificationText().empty()); EXPECT_EQ(l10n_util::GetStringUTF16( IDS_ASH_STATUS_TRAY_DISPLAY_REMOVED_EXCEEDED_MAXIMUM), GetDisplayNotificationAdditionalText()); EXPECT_TRUE(GetDisplayNotificationText().empty()); - UpdateDisplay("400x400,200x200"); + UpdateDisplay("500x400,300x200"); CloseNotification(); // Start tablet mode and wait until display mode is updated. @@ -354,7 +354,7 @@ // becomes mirror mode from extending mode. Under this circumstance, user is // still notified of connecting more displays than maximum. See issue 827406 // (https://crbug.com/827406). Notification should still be shown. - UpdateDisplay("400x400,200x200,100x100"); + UpdateDisplay("500x400,300x200,100x100"); EXPECT_EQ(l10n_util::GetStringUTF16( IDS_ASH_STATUS_TRAY_DISPLAY_REMOVED_EXCEEDED_MAXIMUM), GetDisplayNotificationAdditionalText()); @@ -368,7 +368,7 @@ // in the UI scales, in which case, we still want to show a notification when // the source of change is not the settings ui. TEST_F(ScreenLayoutObserverTest, ZoomingInUnifiedModeNotification) { - UpdateDisplay("400x400,200x200"); + UpdateDisplay("500x400,300x200"); // Enter unified mode. display_manager()->SetUnifiedDesktopEnabled(true); @@ -380,7 +380,7 @@ EXPECT_TRUE(display_manager()->ZoomDisplay(display_id, false /* up */)); EXPECT_EQ( l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_RESOLUTION_CHANGED, - GetUnifiedDisplayName(), u"400x200"), + GetUnifiedDisplayName(), u"550x200"), GetDisplayNotificationAdditionalText()); EXPECT_EQ(l10n_util::GetStringUTF16( IDS_ASH_STATUS_TRAY_DISPLAY_RESOLUTION_CHANGED_TITLE), @@ -390,7 +390,7 @@ EXPECT_TRUE(display_manager()->ZoomDisplay(display_id, true /* up */)); EXPECT_EQ( l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_RESOLUTION_CHANGED, - GetUnifiedDisplayName(), u"800x400"), + GetUnifiedDisplayName(), u"1100x400"), GetDisplayNotificationAdditionalText()); EXPECT_EQ(l10n_util::GetStringUTF16( IDS_ASH_STATUS_TRAY_DISPLAY_RESOLUTION_CHANGED_TITLE), @@ -410,7 +410,7 @@ // Verify that notification shows up when display is switched from dock mode to // extend mode. TEST_F(ScreenLayoutObserverTest, DisplayConfigurationChangedTwice) { - UpdateDisplay("400x400,200x200"); + UpdateDisplay("500x400,300x200"); EXPECT_EQ(l10n_util::GetStringUTF16( IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED_NO_INTERNAL), GetDisplayNotificationText()); @@ -424,7 +424,7 @@ GetDisplayNotificationText()); // Back to the single display. It should show that a display was removed. - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); EXPECT_TRUE(base::StartsWith( GetDisplayNotificationText(), l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_REMOVED, u""), @@ -434,10 +434,10 @@ // Verify the notification message content when one of the 2 displays that // connected to the device is rotated. TEST_F(ScreenLayoutObserverTest, UpdateAfterSuppressDisplayNotification) { - UpdateDisplay("400x400,200x200"); + UpdateDisplay("500x400,300x200"); // Rotate the second. - UpdateDisplay("400x400,200x200/r"); + UpdateDisplay("500x400,300x200/r"); EXPECT_EQ(l10n_util::GetStringFUTF16( IDS_ASH_STATUS_TRAY_DISPLAY_ROTATED, GetSecondDisplayName(), l10n_util::GetStringUTF16( @@ -447,13 +447,13 @@ // Verify that no notification is shown when overscan of a screen is changed. TEST_F(ScreenLayoutObserverTest, OverscanDisplay) { - UpdateDisplay("400x400, 300x300"); + UpdateDisplay("500x400, 400x300"); // Close the notification that is shown from initially adding a monitor. CloseNotification(); display::Display::SetInternalDisplayId(display_manager()->first_display_id()); // /o creates the default overscan. - UpdateDisplay("400x400, 300x300/o"); + UpdateDisplay("500x400, 400x300/o"); EXPECT_FALSE(IsNotificationShown()); // Reset the overscan. @@ -468,14 +468,14 @@ // Tests that exiting mirror mode by closing the lid shows the correct "exiting // mirror mode" message. TEST_F(ScreenLayoutObserverTest, ExitMirrorModeBecauseOfDockedModeMessage) { - UpdateDisplay("400x400,200x200"); + UpdateDisplay("500x400,300x200"); display::Display::SetInternalDisplayId( display::test::DisplayManagerTestApi(display_manager()) .GetSecondaryDisplay() .id()); // Mirroring. - UpdateDisplay("400x400,200x200"); + UpdateDisplay("500x400,300x200"); display_manager()->SetMirrorMode(display::MirrorMode::kNormal, absl::nullopt); EXPECT_EQ(l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING, GetMirroringDisplayNames()), @@ -484,7 +484,7 @@ // Docked. CloseNotification(); display::Display::SetInternalDisplayId(display_manager()->first_display_id()); - UpdateDisplay("200x200"); + UpdateDisplay("300x200"); EXPECT_EQ(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_MIRROR_EXIT), GetDisplayNotificationText()); } @@ -493,14 +493,14 @@ // correct message. TEST_F(ScreenLayoutObserverTest, ExitMirrorModeNoInternalDisplayBecauseOfDisplayRemovedMessage) { - UpdateDisplay("400x400,200x200"); + UpdateDisplay("500x400,300x200"); display::Display::SetInternalDisplayId( display::test::DisplayManagerTestApi(display_manager()) .GetSecondaryDisplay() .id()); // Mirroring. - UpdateDisplay("400x400,200x200"); + UpdateDisplay("500x400,300x200"); display_manager()->SetMirrorMode(display::MirrorMode::kNormal, absl::nullopt); EXPECT_EQ(l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING, GetMirroringDisplayNames()), @@ -508,7 +508,7 @@ // Removing one of the displays. We show that we exited mirror mode. CloseNotification(); - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); EXPECT_EQ(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_MIRROR_EXIT), GetDisplayNotificationText()); } @@ -516,18 +516,18 @@ // Tests notification messages shown when adding and removing displays in // extended mode. TEST_F(ScreenLayoutObserverTest, AddingRemovingDisplayExtendedModeMessage) { - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); EXPECT_TRUE(GetDisplayNotificationText().empty()); // Adding a display in extended mode. - UpdateDisplay("400x400,200x200"); + UpdateDisplay("500x400,300x200"); EXPECT_EQ(l10n_util::GetStringUTF16( IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED_NO_INTERNAL), GetDisplayNotificationText()); // Removing a display. CloseNotification(); - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); EXPECT_TRUE(base::StartsWith( GetDisplayNotificationText(), l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_REMOVED, u""), @@ -537,11 +537,11 @@ // Tests notification messages shown when entering and exiting unified desktop // mode. TEST_F(ScreenLayoutObserverTest, EnteringExitingUnifiedModeMessage) { - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); EXPECT_TRUE(GetDisplayNotificationText().empty()); // Adding a display in extended mode. - UpdateDisplay("400x400,200x200"); + UpdateDisplay("500x400,300x200"); EXPECT_EQ(l10n_util::GetStringUTF16( IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED_NO_INTERNAL), GetDisplayNotificationText()); @@ -565,7 +565,7 @@ // Close the lid. display::Display::SetInternalDisplayId(display_manager()->first_display_id()); - UpdateDisplay("200x200"); + UpdateDisplay("300x200"); display_manager()->SetUnifiedDesktopEnabled(false); EXPECT_EQ( l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_UNIFIED_EXITING), @@ -575,7 +575,7 @@ // Special case: Tests notification messages shown when entering docked mode // by closing the lid and the internal display is the secondary display. TEST_F(ScreenLayoutObserverTest, DockedModeWithExternalPrimaryDisplayMessage) { - UpdateDisplay("400x400,200x200"); + UpdateDisplay("500x400,300x200"); EXPECT_EQ(l10n_util::GetStringUTF16( IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED_NO_INTERNAL), GetDisplayNotificationText()); @@ -591,14 +591,14 @@ EXPECT_TRUE(GetDisplayNotificationText().empty()); // Close the lid. We go to docked mode, but we show no notifications. - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); EXPECT_FALSE(IsNotificationShown()); } // Tests that rotation notifications are only shown when the rotation source is // a user action. The accelerometer source nevber produces any notifications. TEST_F(ScreenLayoutObserverTest, RotationNotification) { - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); const int64_t primary_id = display_manager()->GetPrimaryDisplayCandidate().id(); @@ -722,7 +722,7 @@ TEST_F(ScreenLayoutObserverTest, ClickNotification) { // Create notification. - UpdateDisplay("400x400/r"); + UpdateDisplay("500x400/r"); EXPECT_FALSE(GetDisplayNotificationAdditionalText().empty()); // Click notification.
diff --git a/ash/system/time/time_tray_item_view_unittest.cc b/ash/system/time/time_tray_item_view_unittest.cc index deab3db..4967a02 100644 --- a/ash/system/time/time_tray_item_view_unittest.cc +++ b/ash/system/time/time_tray_item_view_unittest.cc
@@ -88,7 +88,7 @@ } TEST_P(TimeTrayItemViewTest, DisplayChanged) { - UpdateDisplay("800x800"); + UpdateDisplay("800x700"); EXPECT_FALSE(ShouldShowDateInTimeView()); // Date should be shown in large screen size (when the feature is enabled).
diff --git a/ash/system/tray/tray_bubble_view.cc b/ash/system/tray/tray_bubble_view.cc index fc4f049..c63154d 100644 --- a/ash/system/tray/tray_bubble_view.cc +++ b/ash/system/tray/tray_bubble_view.cc
@@ -241,6 +241,10 @@ owned_bubble_border_(bubble_border_), is_gesture_dragging_(false), mouse_actively_entered_(false) { + // We set the dialog role because views::BubbleDialogDelegate defaults this to + // an alert dialog. This would make screen readers announce the whole of the + // system tray which is undesirable. + SetAccessibleRole(ax::mojom::Role::kDialog); // Bubbles that use transparent colors should not paint their ClientViews to a // layer as doing so could result in visual artifacts. SetPaintClientToLayer(false); @@ -376,13 +380,6 @@ reroute_event_handler_.reset(); } -ax::mojom::Role TrayBubbleView::GetAccessibleWindowRole() { - // We override the role because the base class sets it to alert dialog. - // This would make screen readers announce the whole of the system tray - // which is undesirable. - return ax::mojom::Role::kDialog; -} - void TrayBubbleView::OnBeforeBubbleWidgetInit(Widget::InitParams* params, Widget* bubble_widget) const { if (params_.has_shadow) {
diff --git a/ash/system/tray/tray_bubble_view.h b/ash/system/tray/tray_bubble_view.h index 5690ee8b..a6ecd92 100644 --- a/ash/system/tray/tray_bubble_view.h +++ b/ash/system/tray/tray_bubble_view.h
@@ -193,9 +193,6 @@ void MouseMovedOutOfHost() override; protected: - // views::BubbleDialogDelegateView: - ax::mojom::Role GetAccessibleWindowRole() override; - // views::View: void ChildPreferredSizeChanged(View* child) override;
diff --git a/ash/system/unified/notification_counter_view_unittest.cc b/ash/system/unified/notification_counter_view_unittest.cc index 7deb3c3..ca8a83f 100644 --- a/ash/system/unified/notification_counter_view_unittest.cc +++ b/ash/system/unified/notification_counter_view_unittest.cc
@@ -151,7 +151,7 @@ // In medium size screen, the counter should not be displayed since pinned // notification icon is shown (if the feature is enabled). - UpdateDisplay("800x800"); + UpdateDisplay("800x700"); EXPECT_EQ(IsScalableStatusAreaEnabled(), !notification_counter_view()->GetVisible());
diff --git a/ash/system/unified/notification_icons_controller_unittest.cc b/ash/system/unified/notification_icons_controller_unittest.cc index e11144d..300bb4f 100644 --- a/ash/system/unified/notification_icons_controller_unittest.cc +++ b/ash/system/unified/notification_icons_controller_unittest.cc
@@ -95,7 +95,7 @@ AddNotification(false /* is_pinned */, false /* is_critical_warning */); // Notification icons should be shown in medium screen size. - UpdateDisplay("800x800"); + UpdateDisplay("800x700"); EXPECT_EQ(IsScalableStatusAreaEnabled(), notification_icons_controller_->tray_items().front()->GetVisible()); EXPECT_EQ(IsScalableStatusAreaEnabled(), separator()->GetVisible()); @@ -114,7 +114,7 @@ } TEST_P(NotificationIconsControllerTest, ShowNotificationIcons) { - UpdateDisplay("800x800"); + UpdateDisplay("800x700"); // If there's no notification, no notification icons should be shown. EXPECT_FALSE(notification_icons_controller_->tray_items()[0]->GetVisible()); @@ -162,7 +162,7 @@ } TEST_P(NotificationIconsControllerTest, NotShowNotificationIcons) { - UpdateDisplay("800x800"); + UpdateDisplay("800x700"); EXPECT_FALSE(notification_icons_controller_->tray_items()[0]->GetVisible());
diff --git a/ash/system/unified/unified_system_tray_unittest.cc b/ash/system/unified/unified_system_tray_unittest.cc index e5c4280..c9adaa0 100644 --- a/ash/system/unified/unified_system_tray_unittest.cc +++ b/ash/system/unified/unified_system_tray_unittest.cc
@@ -144,7 +144,7 @@ } TEST_F(UnifiedSystemTrayTest, ShowBubble_MultipleDisplays_OpenedOnSameDisplay) { - // Initialize two displays with 800x800 resolution. + // Initialize two displays with 800x700 resolution. UpdateDisplay("400+400-800x600,1220+400-800x600"); auto* screen = display::Screen::GetScreen(); EXPECT_EQ(2, screen->GetNumDisplays());
diff --git a/ash/webui/common/OWNERS b/ash/webui/common/OWNERS index 834505c7..91196b78 100644 --- a/ash/webui/common/OWNERS +++ b/ash/webui/common/OWNERS
@@ -2,4 +2,3 @@ jimmyxgong@chromium.org zentaro@chromium.org gavinwill@chromium.org -joonbug@chromium.org
diff --git a/ash/webui/diagnostics_ui/OWNERS b/ash/webui/diagnostics_ui/OWNERS index 17b2f60..e0c6feb 100644 --- a/ash/webui/diagnostics_ui/OWNERS +++ b/ash/webui/diagnostics_ui/OWNERS
@@ -1,6 +1,5 @@ # Primary OWNERS jimmyxgong@chromium.org -joonbug@chromium.org # Backup OWNERS zentaro@chromium.org
diff --git a/ash/webui/os_feedback_ui/OWNERS b/ash/webui/os_feedback_ui/OWNERS index 17b2f60..e0c6feb 100644 --- a/ash/webui/os_feedback_ui/OWNERS +++ b/ash/webui/os_feedback_ui/OWNERS
@@ -1,6 +1,5 @@ # Primary OWNERS jimmyxgong@chromium.org -joonbug@chromium.org # Backup OWNERS zentaro@chromium.org
diff --git a/ash/webui/scanning/resources/scanning_app.html b/ash/webui/scanning/resources/scanning_app.html index e4126a39..b255a53 100644 --- a/ash/webui/scanning/resources/scanning_app.html +++ b/ash/webui/scanning/resources/scanning_app.html
@@ -258,7 +258,7 @@ </div> </div> </cr-toast> - <cr-dialog id="scanFailedDialog"> + <cr-dialog id="scanFailedDialog" on-cancel="onScanFailedDialogOkClick_"> <div slot="title"> <iron-icon id="dialogInfoIcon" icon="cr:info-outline" aria-hidden="true"> </iron-icon> @@ -268,11 +268,12 @@ [[i18n(scanFailedDialogTextKey_)]] </div> <div slot="button-container"> - <cr-button class="cancel-button" on-click="onDialogGetHelpClick_"> + <cr-button class="cancel-button" + on-click="onScanFailedDialogGetHelpClick_"> [[i18n('getHelpLinkText')]] </cr-button> <cr-button id="okButton" class="action-button" - on-click="onDialogOkClick_"> + on-click="onScanFailedDialogOkClick_"> [[i18n('okButtonLabel')]] </cr-button> </div>
diff --git a/ash/webui/scanning/resources/scanning_app.js b/ash/webui/scanning/resources/scanning_app.js index b0756ff..a22029c 100644 --- a/ash/webui/scanning/resources/scanning_app.js +++ b/ash/webui/scanning/resources/scanning_app.js
@@ -843,13 +843,13 @@ }, /** @private */ - onDialogOkClick_() { + onScanFailedDialogOkClick_() { this.$.scanFailedDialog.close(); this.setAppState_(AppState.READY); }, /** @private */ - onDialogGetHelpClick_() { + onScanFailedDialogGetHelpClick_() { this.$.scanFailedDialog.close(); this.setAppState_(AppState.READY); window.open(HELP_PAGE_LINK);
diff --git a/ash/wm/desks/desks_unittests.cc b/ash/wm/desks/desks_unittests.cc index b02ea66..7f8a92e4 100644 --- a/ash/wm/desks/desks_unittests.cc +++ b/ash/wm/desks/desks_unittests.cc
@@ -4176,7 +4176,7 @@ // resides on the same DesksBarView as the clicked button should be focused. // See crbug.com/1206013. TEST_F(DesksTest, NameNudgesMultiDisplay) { - UpdateDisplay("800x800,800x800"); + UpdateDisplay("800x700,800x700"); // Start overview. EnterOverview();
diff --git a/ash/wm/full_restore/full_restore_controller_unittest.cc b/ash/wm/full_restore/full_restore_controller_unittest.cc index 13ebd8e..8ea3154 100644 --- a/ash/wm/full_restore/full_restore_controller_unittest.cc +++ b/ash/wm/full_restore/full_restore_controller_unittest.cc
@@ -458,7 +458,7 @@ // Tests that data gets saved when moving a window to another display using the // accelerator. TEST_F(FullRestoreControllerTest, WindowMovedDisplay) { - UpdateDisplay("800x800,801+0-800x800"); + UpdateDisplay("800x700,801+0-800x700"); auto window = CreateAppWindow(gfx::Rect(50, 50, 100, 100), AppType::BROWSER); ResetSaveWindowsCount(); @@ -516,7 +516,7 @@ } TEST_F(FullRestoreControllerTest, DisplayAddRemove) { - UpdateDisplay("800x800,801+0-800x800"); + UpdateDisplay("800x700,801+0-800x700"); auto window = CreateAppWindow(gfx::Rect(800, 0, 400, 400), AppType::BROWSER); ResetSaveWindowsCount(); @@ -621,7 +621,7 @@ // Tests that widgets are restored to their proper stacking order in a // multi-display scenario. TEST_F(FullRestoreControllerTest, StackingMultiDisplay) { - UpdateDisplay("800x800,801+0-800x800,1602+0-800x800"); + UpdateDisplay("800x700,801+0-800x700,1602+0-800x700"); auto root_windows = Shell::GetAllRootWindows(); auto* root_1 = root_windows[0]; @@ -687,7 +687,7 @@ // Tests clamshell snapped window functionality when creating a window from full // restore. TEST_F(FullRestoreControllerTest, ClamshellSnapWindow) { - UpdateDisplay("800x800"); + UpdateDisplay("800x700"); // Add two entries to our fake full restore file, one snapped left and the // other snapped right. @@ -729,7 +729,7 @@ // Tests full restore behavior when a display is disconnected before // restoration. TEST_F(FullRestoreControllerTest, DisconnectedDisplay) { - UpdateDisplay("800x800"); + UpdateDisplay("800x700"); const gfx::Rect display_1_bounds(0, 0, 200, 200); const gfx::Rect display_2_bounds(801, 0, 200, 200); const int64_t primary_id = WindowTreeHostManager::GetPrimaryDisplayId(); @@ -874,7 +874,7 @@ // Tests full restore behavior when a display size changes. TEST_F(FullRestoreControllerTest, DisplaySizeChange) { constexpr int kRestoreId = 1; - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); // Add an entry for a window that is larger than the current display size. // This simulates a user using a larger display than the one they are @@ -887,7 +887,7 @@ auto* restored_window = CreateTestFullRestoredWidgetFromRestoreId(kRestoreId)->GetNativeWindow(); auto restored_bounds = restored_window->GetBoundsInScreen(); - EXPECT_LE(restored_bounds.width(), 400); + EXPECT_LE(restored_bounds.width(), 500); EXPECT_LE(restored_bounds.height(), 400); EXPECT_EQ(gfx::Point(0, 0), restored_bounds.origin()); EXPECT_TRUE(WindowState::Get(restored_window)->IsNormalStateType()); @@ -1086,7 +1086,7 @@ // Tests that parenting ARC windows to hidden container works in the multi // display scenario, including if a display gets disconnected partway through. TEST_F(FullRestoreControllerTest, ArcAppWindowCreatedWithoutTaskMultiDisplay) { - UpdateDisplay("800x800,801+0-800x800"); + UpdateDisplay("800x700,801+0-800x700"); const int64_t primary_id = WindowTreeHostManager::GetPrimaryDisplayId(); const int64_t second_id = display_manager()->GetDisplayAt(1).id(); @@ -1153,7 +1153,7 @@ // Tests that windows that are out-of-bounds of the display they're being // restored to are properly restored. TEST_F(FullRestoreControllerTest, OutOfBoundsWindows) { - UpdateDisplay("800x800"); + UpdateDisplay("800x700"); const gfx::Rect kScreenBounds(0, 0, 800, 800); const gfx::Rect kPartialBounds(-100, 100, 200, 200); const gfx::Rect kFullBounds(801, 801, 400, 200);
diff --git a/ash/wm/native_cursor_manager_ash_unittest.cc b/ash/wm/native_cursor_manager_ash_unittest.cc index 5e2765c..07b21b5 100644 --- a/ash/wm/native_cursor_manager_ash_unittest.cc +++ b/ash/wm/native_cursor_manager_ash_unittest.cc
@@ -57,7 +57,7 @@ cursor_manager->SetCursor(ui::mojom::CursorType::kCopy); EXPECT_EQ(ui::mojom::CursorType::kCopy, test_api.GetCurrentCursor().type()); - UpdateDisplay("800x800*2/r"); + UpdateDisplay("800x700*2/r"); EXPECT_EQ(2.0f, test_api.GetCurrentCursor().image_scale_factor()); EXPECT_EQ(ui::CursorSize::kNormal, test_api.GetCurrentCursorSize()); EXPECT_EQ(display::Display::ROTATE_90, test_api.GetCurrentCursorRotation()); @@ -80,7 +80,7 @@ EXPECT_EQ(ui::mojom::CursorType::kCopy, test_api.GetCurrentCursor().type()); // Device scale factor and rotation do change even while cursor is locked. - UpdateDisplay("800x800/u"); + UpdateDisplay("800x700/u"); EXPECT_EQ(1.0f, test_api.GetCurrentCursor().image_scale_factor()); EXPECT_EQ(display::Display::ROTATE_180, test_api.GetCurrentCursorRotation());
diff --git a/ash/wm/overview/overview_grid_unittest.cc b/ash/wm/overview/overview_grid_unittest.cc index 7165fc23..c5e9b07 100644 --- a/ash/wm/overview/overview_grid_unittest.cc +++ b/ash/wm/overview/overview_grid_unittest.cc
@@ -225,7 +225,7 @@ } TEST_F(OverviewGridTest, PartiallyOffscreenWindow) { - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); auto window1 = CreateTestWindow(gfx::Rect(100, 100)); auto window2 = CreateTestWindow(gfx::Rect(100, 100)); @@ -245,7 +245,7 @@ // Tests that windows whose destination is fully offscreen never animate. TEST_F(OverviewGridTest, FullyOffscreenWindow) { - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); auto window1 = CreateTestWindow(gfx::Rect(100, 100)); auto window2 = CreateTestWindow(gfx::Rect(100, 100));
diff --git a/ash/wm/pip/pip_positioner_unittest.cc b/ash/wm/pip/pip_positioner_unittest.cc index 3658d82c..8f30df3f 100644 --- a/ash/wm/pip/pip_positioner_unittest.cc +++ b/ash/wm/pip/pip_positioner_unittest.cc
@@ -90,6 +90,8 @@ TEST_P(PipPositionerDisplayTest, PipAdjustPositionForDragClampsToMovementArea) { auto display = GetDisplay(); + int right = display.bounds().width(); + int bottom = display.bounds().height(); // Adjust near top edge outside movement area. EXPECT_EQ(ConvertToScreen(gfx::Rect(100, 8, 100, 100)), @@ -97,9 +99,10 @@ display, ConvertToScreen(gfx::Rect(100, -50, 100, 100)))); // Adjust near bottom edge outside movement area. - EXPECT_EQ(ConvertToScreen(gfx::Rect(100, 292, 100, 100)), - PipPositioner::GetBoundsForDrag( - display, ConvertToScreen(gfx::Rect(100, 450, 100, 100)))); + EXPECT_EQ( + ConvertToScreen(gfx::Rect(100, bottom - 108, 100, 100)), + PipPositioner::GetBoundsForDrag( + display, ConvertToScreen(gfx::Rect(100, bottom + 50, 100, 100)))); // Adjust near left edge outside movement area. EXPECT_EQ(ConvertToScreen(gfx::Rect(8, 100, 100, 100)), @@ -107,9 +110,10 @@ display, ConvertToScreen(gfx::Rect(-50, 100, 100, 100)))); // Adjust near right edge outside movement area. - EXPECT_EQ(ConvertToScreen(gfx::Rect(292, 100, 100, 100)), - PipPositioner::GetBoundsForDrag( - display, ConvertToScreen(gfx::Rect(450, 100, 100, 100)))); + EXPECT_EQ( + ConvertToScreen(gfx::Rect(right - 108, 100, 100, 100)), + PipPositioner::GetBoundsForDrag( + display, ConvertToScreen(gfx::Rect(right + 50, 100, 100, 100)))); } TEST_P(PipPositionerDisplayTest, @@ -123,6 +127,8 @@ TEST_P(PipPositionerDisplayTest, PipDismissedPositionChosesClosestEdge) { auto display = GetDisplay(); + int right = display.bounds().width(); + int bottom = display.bounds().height(); // Dismiss near top edge outside movement area towards top. EXPECT_EQ(ConvertToScreen(gfx::Rect(100, -100, 100, 100)), @@ -130,9 +136,10 @@ display, ConvertToScreen(gfx::Rect(100, 50, 100, 100)))); // Dismiss near bottom edge outside movement area towards bottom. - EXPECT_EQ(ConvertToScreen(gfx::Rect(100, 400, 100, 100)), - PipPositioner::GetDismissedPosition( - display, ConvertToScreen(gfx::Rect(100, 250, 100, 100)))); + EXPECT_EQ( + ConvertToScreen(gfx::Rect(100, bottom, 100, 100)), + PipPositioner::GetDismissedPosition( + display, ConvertToScreen(gfx::Rect(100, bottom - 150, 100, 100)))); // Dismiss near left edge outside movement area towards left. EXPECT_EQ(ConvertToScreen(gfx::Rect(-100, 100, 100, 100)), @@ -140,15 +147,18 @@ display, ConvertToScreen(gfx::Rect(50, 100, 100, 100)))); // Dismiss near right edge outside movement area towards right. - EXPECT_EQ(ConvertToScreen(gfx::Rect(400, 100, 100, 100)), - PipPositioner::GetDismissedPosition( - display, ConvertToScreen(gfx::Rect(250, 100, 100, 100)))); + EXPECT_EQ( + ConvertToScreen(gfx::Rect(right, 100, 100, 100)), + PipPositioner::GetDismissedPosition( + display, ConvertToScreen(gfx::Rect(right - 150, 100, 100, 100)))); } // Verify that if two edges are equally close, the PIP window prefers dismissing // out horizontally. TEST_P(PipPositionerDisplayTest, PipDismissedPositionPrefersHorizontal) { auto display = GetDisplay(); + int right = display.bounds().width(); + int bottom = display.bounds().height(); // Top left corner. EXPECT_EQ(ConvertToScreen(gfx::Rect(-150, 0, 100, 100)), @@ -156,30 +166,32 @@ display, ConvertToScreen(gfx::Rect(0, 0, 100, 100)))); // Top right corner. - EXPECT_EQ(ConvertToScreen(gfx::Rect(450, 0, 100, 100)), + EXPECT_EQ(ConvertToScreen(gfx::Rect(right + 50, 0, 100, 100)), PipPositioner::GetDismissedPosition( - display, ConvertToScreen(gfx::Rect(300, 0, 100, 100)))); + display, ConvertToScreen(gfx::Rect(right - 100, 0, 100, 100)))); // Bottom left corner. - EXPECT_EQ(ConvertToScreen(gfx::Rect(-150, 300, 100, 100)), - PipPositioner::GetDismissedPosition( - display, ConvertToScreen(gfx::Rect(0, 300, 100, 100)))); + EXPECT_EQ( + ConvertToScreen(gfx::Rect(-150, bottom - 100, 100, 100)), + PipPositioner::GetDismissedPosition( + display, ConvertToScreen(gfx::Rect(0, bottom - 100, 100, 100)))); // Bottom right corner. - EXPECT_EQ(ConvertToScreen(gfx::Rect(450, 300, 100, 100)), + EXPECT_EQ(ConvertToScreen(gfx::Rect(right + 50, bottom - 100, 100, 100)), PipPositioner::GetDismissedPosition( - display, ConvertToScreen(gfx::Rect(300, 300, 100, 100)))); + display, ConvertToScreen( + gfx::Rect(right - 100, bottom - 100, 100, 100)))); } INSTANTIATE_TEST_SUITE_P( /* no prefix */, PipPositionerDisplayTest, - testing::Values(std::make_tuple("400x400", 0u), - std::make_tuple("400x400/r", 0u), - std::make_tuple("400x400/u", 0u), - std::make_tuple("400x400/l", 0u), - std::make_tuple("800x800*2", 0u), - std::make_tuple("400x400,400x400", 0u), - std::make_tuple("400x400,400x400", 1u))); + testing::Values(std::make_tuple("500x400", 0u), + std::make_tuple("500x400/r", 0u), + std::make_tuple("500x400/u", 0u), + std::make_tuple("500x400/l", 0u), + std::make_tuple("800x700*2", 0u), + std::make_tuple("500x400,500x400", 0u), + std::make_tuple("500x400,500x400", 1u))); } // namespace ash
diff --git a/ash/wm/pip/pip_unittest.cc b/ash/wm/pip/pip_unittest.cc index b9997e8f..ca8b13c5 100644 --- a/ash/wm/pip/pip_unittest.cc +++ b/ash/wm/pip/pip_unittest.cc
@@ -146,7 +146,7 @@ } TEST_F(PipTest, PipInitialPositionAvoidsObstacles) { - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); std::unique_ptr<aura::Window> window( CreateTestWindowInShellWithBounds(gfx::Rect(100, 300, 100, 100))); WindowState* window_state = WindowState::Get(window.get()); @@ -167,7 +167,7 @@ } TEST_F(PipTest, TargetBoundsAffectedByWorkAreaChange) { - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); // Place a keyboard window at the initial position of a PIP window. auto* keyboard_controller = keyboard::KeyboardUIController::Get(); @@ -191,7 +191,7 @@ TEST_F(PipTest, PipRestoresToPreviousBoundsOnMovementAreaChangeIfTheyExist) { ForceHideShelvesForTest(); - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); std::unique_ptr<aura::Window> window( CreateTestWindowInShellWithBounds(gfx::Rect(200, 200, 100, 100))); WindowState* window_state = WindowState::Get(window.get()); @@ -201,7 +201,7 @@ // Position the PIP window on the side of the screen where it will be next // to an edge and therefore in a resting position for the whole test. - const gfx::Rect bounds = gfx::Rect(292, 200, 100, 100); + const gfx::Rect bounds = gfx::Rect(392, 200, 100, 100); // Set restore position to where the window currently is. window->SetBounds(bounds); PipPositioner::SaveSnapFraction(window_state, window->GetBoundsInScreen()); @@ -215,19 +215,19 @@ EXPECT_EQ(gfx::Rect(292, 76, 100, 100), window->GetBoundsInScreen()); // Restore the original work area. - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); ForceHideShelvesForTest(); // Changing the work area with the same PIP size causes snap fraction change, // so PIP doesn't restore to the original position. Instead ensure that the // fraction is calculated correctly. - EXPECT_EQ(gfx::Rect(292, 239, 100, 100), window->GetBoundsInScreen()); + EXPECT_EQ(gfx::Rect(392, 239, 100, 100), window->GetBoundsInScreen()); } TEST_F( PipTest, PipRestoresToPreviousBoundsOnMovementAreaChangeIfTheyExistOnExternalDisplay) { - UpdateDisplay("400x400,400x400"); + UpdateDisplay("500x400,500x400"); ForceHideShelvesForTest(); auto* root_window = Shell::GetAllRootWindows()[1]; @@ -246,25 +246,25 @@ EXPECT_TRUE(PipPositioner::HasSnapFraction(window_state)); // Update the work area so that the PIP window should be pushed upward. - UpdateDisplay("400x400,400x200"); + UpdateDisplay("500x400,400x200"); ForceHideShelvesForTest(); // PIP should move up to accommodate the new work area. - EXPECT_EQ(gfx::Rect(408, 92, 100, 100), window->GetBoundsInScreen()); + EXPECT_EQ(gfx::Rect(508, 92, 100, 100), window->GetBoundsInScreen()); // Restore the original work area. - UpdateDisplay("400x400,400x400"); + UpdateDisplay("500x400,500x400"); ForceHideShelvesForTest(); // Changing the work area with the same PIP size causes snap fraction change, // so PIP doesn't restore to the original position. Instead ensure that the // fraction is calculated correctly. - EXPECT_EQ(gfx::Rect(408, 292, 100, 100), window->GetBoundsInScreen()); + EXPECT_EQ(gfx::Rect(508, 292, 100, 100), window->GetBoundsInScreen()); } TEST_F(PipTest, PipRestoreOnWorkAreaChangeDoesNotChangeWindowSize) { ForceHideShelvesForTest(); - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); std::unique_ptr<aura::Window> window( CreateTestWindowInShellWithBounds(gfx::Rect(200, 200, 100, 100))); WindowState* window_state = WindowState::Get(window.get()); @@ -291,7 +291,7 @@ TEST_F(PipTest, PipSnappedToEdgeWhenSavingSnapFraction) { ForceHideShelvesForTest(); - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); std::unique_ptr<aura::Window> window( CreateTestWindowInShellWithBounds(gfx::Rect(200, 200, 100, 100))); WindowState* window_state = WindowState::Get(window.get());
diff --git a/ash/wm/screen_pinning_controller_unittest.cc b/ash/wm/screen_pinning_controller_unittest.cc index f43bb0b3..8326b67 100644 --- a/ash/wm/screen_pinning_controller_unittest.cc +++ b/ash/wm/screen_pinning_controller_unittest.cc
@@ -181,7 +181,7 @@ TEST_F(ScreenPinningControllerTest, ExitUnifiedDisplay) { display_manager()->SetUnifiedDesktopEnabled(true); - UpdateDisplay("400x300, 400x400"); + UpdateDisplay("400x300, 500x400"); aura::Window* w1 = CreateTestWindowInShellWithId(0); wm::ActivateWindow(w1); @@ -192,7 +192,7 @@ EXPECT_TRUE(window_state->IsPinned()); EXPECT_TRUE(Shell::Get()->screen_pinning_controller()->IsPinned()); - UpdateDisplay("200x200"); + UpdateDisplay("300x200"); EXPECT_TRUE(window_state->IsPinned()); EXPECT_TRUE(Shell::Get()->screen_pinning_controller()->IsPinned());
diff --git a/ash/wm/session_state_animator_impl_unittest.cc b/ash/wm/session_state_animator_impl_unittest.cc index b355ffd..e6434a0 100644 --- a/ash/wm/session_state_animator_impl_unittest.cc +++ b/ash/wm/session_state_animator_impl_unittest.cc
@@ -88,7 +88,7 @@ // containers. See http://crbug.com/712422 for details. TEST_F(SessionStateAnimatiorImplContainersTest, AnimationCallbackOnMultiDisplay) { - UpdateDisplay("200x200,400x400"); + UpdateDisplay("300x200,500x400"); int callback_count = 0; SessionStateAnimatorImpl animator;
diff --git a/ash/wm/tablet_mode/tablet_mode_controller_unittest.cc b/ash/wm/tablet_mode/tablet_mode_controller_unittest.cc index 0c265d4b..8a84559 100644 --- a/ash/wm/tablet_mode/tablet_mode_controller_unittest.cc +++ b/ash/wm/tablet_mode/tablet_mode_controller_unittest.cc
@@ -630,7 +630,7 @@ // Test that the disabling of the internal display exits tablet mode, and that // while disabled we do not re-enter tablet mode. TEST_F(TabletModeControllerTest, NoTabletModeWithDisabledInternalDisplay) { - UpdateDisplay("200x200, 200x200"); + UpdateDisplay("300x200, 300x200"); const int64_t internal_display_id = display::test::DisplayManagerTestApi(display_manager()) .SetFirstDisplayAsInternalDisplay(); @@ -667,7 +667,7 @@ // Tests that is a tablet mode signal is received while docked, that maximize // mode is enabled upon exiting docked mode. TEST_F(TabletModeControllerTest, TabletModeAfterExitingDockedMode) { - UpdateDisplay("200x200, 200x200"); + UpdateDisplay("300x200, 300x200"); const int64_t internal_display_id = display::test::DisplayManagerTestApi(display_manager()) .SetFirstDisplayAsInternalDisplay();
diff --git a/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc b/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc index df4d93d..99da7e0 100644 --- a/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc +++ b/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc
@@ -701,7 +701,7 @@ // Check that resizing the desktop does reposition unmaximizable, unresizable & // managed windows. TEST_F(TabletModeWindowManagerTest, DesktopSizeChangeMovesUnmaximizable) { - UpdateDisplay("400x400"); + UpdateDisplay("500x400"); // This window will move because it does not fit the new bounds. gfx::Rect rect(20, 300, 100, 100); std::unique_ptr<aura::Window> window1(CreateFixedSizeNonMaximizableWindow( @@ -722,7 +722,7 @@ EXPECT_EQ(rect.size().ToString(), moved_bounds.size().ToString()); // Simulating a desktop resize should move the window again. - UpdateDisplay("300x300"); + UpdateDisplay("400x300"); gfx::Rect new_moved_bounds(window1->bounds()); EXPECT_NE(rect.origin().ToString(), new_moved_bounds.origin().ToString()); EXPECT_EQ(rect.size().ToString(), new_moved_bounds.size().ToString());
diff --git a/ash/wm/window_cycle/window_cycle_controller_unittest.cc b/ash/wm/window_cycle/window_cycle_controller_unittest.cc index 737094e9..7ba294a 100644 --- a/ash/wm/window_cycle/window_cycle_controller_unittest.cc +++ b/ash/wm/window_cycle/window_cycle_controller_unittest.cc
@@ -993,7 +993,7 @@ // when there's multiple displays. base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitWithFeatures({features::kWindowsFollowCursor}, {}); - UpdateDisplay("400x400,401+0-800x800"); + UpdateDisplay("500x400,401+0-800x700"); std::unique_ptr<Window> w0 = CreateTestWindow(gfx::Rect(200, 200)); std::unique_ptr<Window> w1 = CreateTestWindow(gfx::Rect(420, 10, 200, 200));
diff --git a/ash/wm/workspace/workspace_event_handler_unittest.cc b/ash/wm/workspace/workspace_event_handler_unittest.cc index 931dd40..38c932c 100644 --- a/ash/wm/workspace/workspace_event_handler_unittest.cc +++ b/ash/wm/workspace/workspace_event_handler_unittest.cc
@@ -160,7 +160,7 @@ EXPECT_EQ(restored_bounds.ToString(), window->GetBoundsInScreen().ToString()); // Verify the double clicking the resize edge works on 2nd display too. - UpdateDisplay("200x200,400x300"); + UpdateDisplay("200x300,400x300"); gfx::Rect work_area2 = GetSecondaryDisplay().work_area(); restored_bounds.SetRect(220, 20, 50, 50); window->SetBoundsInScreen(restored_bounds, GetSecondaryDisplay());
diff --git a/ash/wm/workspace/workspace_window_resizer_unittest.cc b/ash/wm/workspace/workspace_window_resizer_unittest.cc index 570d0c7c..c957f4c4 100644 --- a/ash/wm/workspace/workspace_window_resizer_unittest.cc +++ b/ash/wm/workspace/workspace_window_resizer_unittest.cc
@@ -1978,7 +1978,7 @@ // Tests that windows dragged across multiple displays have their restore bounds // updated. TEST_F(WorkspaceWindowResizerTest, MultiDisplayRestoreBounds) { - UpdateDisplay("800x800,800x800"); + UpdateDisplay("800x700,800x700"); // Create a window and maximize it on the primary display. window_->SetBounds(gfx::Rect(200, 200)); @@ -2059,7 +2059,7 @@ // bounds is on another display. TEST_F(WorkspaceWindowResizerTest, FlingMaximizeRestoreBoundsOnDifferentDisplay) { - UpdateDisplay("800x600,500x500"); + UpdateDisplay("800x600,500x400"); // Prepare `touch_resize_window_` in the 2nd display. gfx::Size window_size(300, 300);
diff --git a/base/allocator/partition_allocator/partition_bucket.cc b/base/allocator/partition_allocator/partition_bucket.cc index 460338ce..d269ad3 100644 --- a/base/allocator/partition_allocator/partition_bucket.cc +++ b/base/allocator/partition_allocator/partition_bucket.cc
@@ -344,9 +344,8 @@ // Note that we didn't check above, because if we cannot even commit a // single page, then this is likely hopeless anyway, and we will crash very // soon. - const bool ok = root->TryRecommitSystemPagesForData( - &page->slot_span_metadata, slot_start, slot_size, - PageUpdatePermissions); + const bool ok = root->TryRecommitSystemPagesForData(slot_start, slot_size, + PageUpdatePermissions); if (!ok) { if (!return_null) { PartitionOutOfMemoryCommitFailure(root, slot_size); @@ -523,12 +522,8 @@ // If lazy commit is enabled, pages will be committed when provisioning slots, // in ProvisionMoreSlotsAndAllocOne(), not here. if (!root->use_lazy_commit) { - PA_DCHECK(slot_span->GetPreviouslyCommittedSize() == 0); - root->RecommitSystemPagesForData(slot_span, slot_span_start, - slot_span_committed_size, + root->RecommitSystemPagesForData(slot_span_start, slot_span_committed_size, PageUpdatePermissions); - PA_DCHECK(slot_span->GetPreviouslyCommittedSize() == - slot_span_committed_size); } // Double check that we had enough space in the super page for the new slot @@ -712,23 +707,9 @@ // knowledge which pages have been committed before (it doesn't matter on // Windows anyway). if (root->use_lazy_commit) { - size_t previously_committed_size = slot_span->GetPreviouslyCommittedSize(); - char* previously_committed_watermark = base + previously_committed_size; - // It shouldn't be possible for watermark to fall in between start and end. - // Obviously, watermark has to be at least as far as start. // TODO(lizeb): Handle commit failure. - PA_DCHECK(previously_committed_watermark == commit_start || - previously_committed_watermark >= commit_end); - root->RecommitSystemPagesForData( - slot_span, commit_start, commit_end - commit_start, - (previously_committed_watermark == commit_start) - ? PageUpdatePermissions - : PageKeepPermissionsIfPossible); - PA_DCHECK( - slot_span->GetPreviouslyCommittedSize() >= - bits::AlignUp( - (get_slots_per_span() - slot_span->num_unprovisioned_slots) * size, - SystemPageSize())); + root->RecommitSystemPagesForData(commit_start, commit_end - commit_start, + PageUpdatePermissions); } // Add all slots that fit within so far committed pages to the free list. @@ -903,38 +884,25 @@ PA_DCHECK(new_slot_span->is_decommitted()); decommitted_slot_spans_head = new_slot_span->next_slot_span; - new_slot_span->Reset(); - // If lazy commit is enabled, pages will be recommitted when provisioning // slots, in ProvisionMoreSlotsAndAllocOne(), not here. if (!root->use_lazy_commit) { - char* addr = reinterpret_cast<char*>( - SlotSpanMetadata<thread_safe>::ToSlotSpanStartPtr(new_slot_span)); - // We have a guarantee that all slot span memory up to - // |GetPreviouslyCommittedSize()| has been previously committed, and - // if decommitted later it was done using PageKeepPermissionsIfPossible, - // so use the same option as an optimization. - size_t previously_committed_size = - new_slot_span->GetPreviouslyCommittedSize(); - PA_DCHECK(previously_committed_size > 0); + void* addr = + SlotSpanMetadata<thread_safe>::ToSlotSpanStartPtr(new_slot_span); + // If lazy commit was never used, we have a guarantee that all slot span + // pages have been previously committed, and then decommitted using + // PageKeepPermissionsIfPossible, so use the same option as an + // optimization. Otherwise fall back to PageUpdatePermissions (slower). + // (Insider knowledge: as of writing this comment, lazy commit is only + // used on Windows and this flag is ignored there, thus no perf impact.) // TODO(lizeb): Handle commit failure. - root->RecommitSystemPagesForData(new_slot_span, addr, - previously_committed_size, - PageKeepPermissionsIfPossible); - size_t reminder_bytes_to_commit = - new_slot_span->bucket->get_bytes_per_span() - - previously_committed_size; - if (reminder_bytes_to_commit > 0) { - // This situation can only happen if lazy commit was used before and - // it was turned off since. - root->RecommitSystemPagesForData( - new_slot_span, addr + previously_committed_size, - reminder_bytes_to_commit, PageUpdatePermissions); - } - PA_DCHECK(new_slot_span->GetPreviouslyCommittedSize() == - new_slot_span->bucket->get_bytes_per_span()); + root->RecommitSystemPagesForData( + addr, new_slot_span->bucket->get_bytes_per_span(), + root->never_used_lazy_commit ? PageKeepPermissionsIfPossible + : PageUpdatePermissions); } + new_slot_span->Reset(); *is_already_zeroed = DecommittedMemoryIsAlwaysZeroed(); } PA_DCHECK(new_slot_span);
diff --git a/base/allocator/partition_allocator/partition_page.cc b/base/allocator/partition_allocator/partition_page.cc index b78a100..898df44 100644 --- a/base/allocator/partition_allocator/partition_page.cc +++ b/base/allocator/partition_allocator/partition_page.cc
@@ -133,10 +133,7 @@ template <bool thread_safe> SlotSpanMetadata<thread_safe>::SlotSpanMetadata( PartitionBucket<thread_safe>* bucket) - : bucket(bucket), - can_store_raw_size(bucket->CanStoreRawSize()), - num_previously_committed_system_pages(0), - unused(0) {} + : bucket(bucket), can_store_raw_size(bucket->CanStoreRawSize()) {} template <bool thread_safe> void SlotSpanMetadata<thread_safe>::FreeSlowPath() {
diff --git a/base/allocator/partition_allocator/partition_page.h b/base/allocator/partition_allocator/partition_page.h index 63171d28..14f6bee 100644 --- a/base/allocator/partition_allocator/partition_page.h +++ b/base/allocator/partition_allocator/partition_page.h
@@ -122,30 +122,8 @@ int8_t empty_cache_index = 0; // -1 if not in the empty cache. // < kMaxFreeableSpans. static_assert(kMaxFreeableSpans < std::numeric_limits<int8_t>::max(), ""); + const bool can_store_raw_size; - constexpr static size_t kSystemPagesInSmallRegularSpanBits = 5; - constexpr static size_t kMaxSystemPagesPerRegularSlotSpan = - kMaxPartitionPagesPerRegularSlotSpan * 4; - static_assert(kMaxSystemPagesPerRegularSlotSpan < - (1 << kSystemPagesInSmallRegularSpanBits), - ""); - uint8_t can_store_raw_size : 1; - - private: - // For small buckets buckets (i.e. when can_store_raw_size is false), stores - // value 0-16, as there may be at most 4 partition pages in a slot span, - // each having 4 system pages. (Note, we might be able to save a bit if - // needed, because 0 occurs only upon slot allocation and can likley be - // special-cased). - // Otherwise, store only 0 or 1, as there can be only one slot in a span and - // it's easy to calculate its size in pages. - // Don't access this field directly, use GetPreviouslyCommittedSize() and - // IncrasePreviouslyCommittedSize() instead. - uint8_t num_previously_committed_system_pages - : kSystemPagesInSmallRegularSpanBits; - uint8_t unused : 2; - - public: explicit SlotSpanMetadata(PartitionBucket<thread_safe>* bucket); // Public API @@ -175,51 +153,6 @@ ALWAYS_INLINE void SetRawSize(size_t raw_size); ALWAYS_INLINE size_t GetRawSize() const; - // The following functions get/set number of system pages that have been - // previously committed by PartitionAlloc, even though not necessarily - // committed now. Since those pages can only be decommitted using - // PageKeepPermissionsIfPossible, the same option can be used to recommit them - // (faster than PageUpdatePermissions). - // - // Do not call for direct map! - ALWAYS_INLINE size_t GetPreviouslyCommittedSize() const { - PA_DCHECK(!bucket->is_direct_mapped()); - // When |can_store_raw_size| is true (ie. single-slot spans, as direct map - // doesn't go through this path), |num_previously_committed_system_pages| - // stores 0 or 1, representing whether the entire slot of size |slot_size| - // was committed. - if (can_store_raw_size) { - PA_DCHECK((bucket->slot_size & SystemPageOffsetMask()) == 0); - return num_previously_committed_system_pages * bucket->slot_size; - } else { - return num_previously_committed_system_pages << SystemPageShift(); - } - } - ALWAYS_INLINE void IncreasePreviouslyCommittedSize(size_t size) { - PA_DCHECK(!bucket->is_direct_mapped()); - PA_DCHECK(size > 0); - PA_DCHECK((size & SystemPageOffsetMask()) == 0); - // When |can_store_raw_size| is true (ie. single-slot spans, as direct map - // doesn't go through this path), |num_previously_committed_system_pages| - // stores 0 or 1, representing whether the entire slot of size |slot_size| - // was committed. - size_t num_pages = num_previously_committed_system_pages; - if (can_store_raw_size) { - PA_DCHECK(size == bucket->slot_size); - // Single-slot spans can only be committed from 0 to its desired size, - // so assert that. (This isn't true for direct map, due realloc, but - // these don't go through this path.) - PA_DCHECK(num_previously_committed_system_pages == 0); - num_pages = 1; - } else { - num_pages += (size >> SystemPageShift()); - } - PA_DCHECK(num_pages <= kMaxSystemPagesPerRegularSlotSpan); - num_previously_committed_system_pages = static_cast<uint8_t>(num_pages); - // Ensure no trimming happened. - PA_DCHECK(num_pages == num_previously_committed_system_pages); - } - ALWAYS_INLINE void SetFreelistHead(PartitionFreelistEntry* new_head); // Returns size of the region used within a slot. The used region comprises @@ -303,10 +236,7 @@ static SlotSpanMetadata sentinel_slot_span_; // For the sentinel. constexpr SlotSpanMetadata() noexcept - : bucket(nullptr), - can_store_raw_size(0), - num_previously_committed_system_pages(0), - unused(0) {} + : bucket(nullptr), can_store_raw_size(false) {} }; static_assert(sizeof(SlotSpanMetadata<ThreadSafe>) <= kPageMetadataSize, "SlotSpanMetadata must fit into a Page Metadata slot.");
diff --git a/base/allocator/partition_allocator/partition_root.cc b/base/allocator/partition_allocator/partition_root.cc index 20aaaa0..64f7d9fb 100644 --- a/base/allocator/partition_allocator/partition_root.cc +++ b/base/allocator/partition_allocator/partition_root.cc
@@ -601,6 +601,7 @@ template <bool thread_safe> void PartitionRoot<thread_safe>::ConfigureLazyCommit() { +#if defined(OS_WIN) bool new_value = base::FeatureList::IsEnabled(features::kPartitionAllocLazyCommit); @@ -610,66 +611,43 @@ PA_DCHECK(use_lazy_commit); use_lazy_commit = new_value; - const bool is_quarantine_allowed = IsQuarantineAllowed(); for (auto* super_page_extent = first_extent; super_page_extent; super_page_extent = super_page_extent->next) { for (char *super_page = SuperPagesBeginFromExtent(super_page_extent), *super_page_end = SuperPagesEndFromExtent(super_page_extent); super_page != super_page_end; super_page += kSuperPageSize) { internal::IterateSlotSpans<thread_safe>( - super_page, is_quarantine_allowed, + super_page, IsQuarantineAllowed(), [this](SlotSpan* slot_span) -> bool { lock_.AssertAcquired(); + size_t provisioned_size = slot_span->GetProvisionedSize(); + size_t size_to_commit = slot_span->bucket->get_bytes_per_span(); if (slot_span->is_decommitted()) { return false; } - size_t size_to_commit = slot_span->bucket->get_bytes_per_span(); - PA_DCHECK(size_to_commit % SystemPageSize() == 0); - size_t provisioned_size = slot_span->GetProvisionedSize(); - size_t currently_committed_size = - bits::AlignUp(provisioned_size, SystemPageSize()); - // Decommitted slot spans are skipped. - PA_DCHECK(currently_committed_size > 0); - // Unlike |currently_committed_size|, |previously_committed_size| - // tracks how many bytes have ever been committed, even if not - // committed at the moment. - size_t previously_committed_size = - slot_span->GetPreviouslyCommittedSize(); - PA_DCHECK(currently_committed_size <= previously_committed_size); if (slot_span->is_full()) { - // Nothing to do for full slot spans, because everything must - // be committed now. - PA_DCHECK(currently_committed_size == size_to_commit); - PA_DCHECK(previously_committed_size == size_to_commit); - // provisioned_size can be less if slots don't fully cover the - // span, but we won't be able to squeeze another slot there. - PA_DCHECK(size_to_commit - provisioned_size < - slot_span->bucket->slot_size); + PA_DCHECK(provisioned_size == size_to_commit); return false; } - if (size_to_commit > currently_committed_size) { + PA_DCHECK(size_to_commit % SystemPageSize() == 0); + size_t already_committed_size = + bits::AlignUp(provisioned_size, SystemPageSize()); + // Free & decommitted slot spans are skipped. + PA_DCHECK(already_committed_size > 0); + if (size_to_commit > already_committed_size) { char* slot_span_start = reinterpret_cast<char*>( SlotSpan::ToSlotSpanStartPtr(slot_span)); - if (currently_committed_size < previously_committed_size) { - RecommitSystemPagesForData( - slot_span, slot_span_start + currently_committed_size, - previously_committed_size - currently_committed_size, - PageKeepPermissionsIfPossible); - } - if (previously_committed_size < size_to_commit) { - RecommitSystemPagesForData( - slot_span, slot_span_start + previously_committed_size, - size_to_commit - previously_committed_size, - PageUpdatePermissions); - } + RecommitSystemPagesForData( + slot_span_start + already_committed_size, + size_to_commit - already_committed_size, + PageUpdatePermissions); } - PA_DCHECK(slot_span->GetPreviouslyCommittedSize() == - size_to_commit); return false; }); } } } +#endif // defined(OS_WIN) } template <bool thread_safe> @@ -743,7 +721,7 @@ // Grow within the actually reserved address space. Just need to make the // pages accessible again. size_t recommit_slot_size_growth = new_slot_size - current_slot_size; - RecommitSystemPagesForData(slot_span, slot_start + current_slot_size, + RecommitSystemPagesForData(slot_start + current_slot_size, recommit_slot_size_growth, PageUpdatePermissions); // The recommited system pages had been already reserved and all the
diff --git a/base/allocator/partition_allocator/partition_root.h b/base/allocator/partition_allocator/partition_root.h index 5911be8..2f756a3 100644 --- a/base/allocator/partition_allocator/partition_root.h +++ b/base/allocator/partition_allocator/partition_root.h
@@ -183,7 +183,16 @@ bool allow_cookies; bool allow_ref_count; + // Lazy commit should only be enabled on Windows, because commit charge is + // only meaningful and limited on Windows. It affects performance on other + // platforms and is simply not needed there due to OS supporting overcommit. +#if defined(OS_WIN) bool use_lazy_commit = true; + static constexpr bool never_used_lazy_commit = false; +#else + static constexpr bool use_lazy_commit = false; + static constexpr bool never_used_lazy_commit = true; +#endif #if !defined(PA_EXTRAS_REQUIRED) // Teach the compiler that code can be optimized in builds that use no extras. @@ -271,28 +280,12 @@ size_t length, PageAccessibilityDisposition accessibility_disposition) EXCLUSIVE_LOCKS_REQUIRED(lock_); - // Commits or recommits pages for user data (i.e. inside of slot spans) and - // updates relevant stats. - // If committing for the first time |accessibility_disposition| must be - // PageUpdatePermissions, otherwise must be PageKeepPermissionsIfPossible. ALWAYS_INLINE void RecommitSystemPagesForData( - internal::SlotSpanMetadata<thread_safe>* slot_span, void* address, size_t length, PageAccessibilityDisposition accessibility_disposition) EXCLUSIVE_LOCKS_REQUIRED(lock_); ALWAYS_INLINE bool TryRecommitSystemPagesForData( - internal::SlotSpanMetadata<thread_safe>* slot_span, - void* address, - size_t length, - PageAccessibilityDisposition accessibility_disposition); - - void UpdateNumPreviouslyCommittedSystemPagesIfNeeded( - internal::SlotSpanMetadata<thread_safe>* slot_span, - size_t length, - PageAccessibilityDisposition accessibility_disposition); - void AssertNumPreviouslyCommittedSystemPages( - internal::SlotSpanMetadata<thread_safe>* slot_span, void* address, size_t length, PageAccessibilityDisposition accessibility_disposition); @@ -1194,81 +1187,24 @@ } template <bool thread_safe> -void PartitionRoot<thread_safe>:: - UpdateNumPreviouslyCommittedSystemPagesIfNeeded( - internal::SlotSpanMetadata<thread_safe>* slot_span, - size_t length, - PageAccessibilityDisposition accessibility_disposition) { - if (accessibility_disposition == PageUpdatePermissions && - !slot_span->bucket->is_direct_mapped()) { - // It is the caller's responsibility to use PageUpdatePermissions only on - // pages that have never been committed in the past. This requirement - // doesn't apply to direct map and single-slot spans. - slot_span->IncreasePreviouslyCommittedSize(length); -#if DCHECK_IS_ON() - size_t num_uncommitted_slots = - use_lazy_commit ? slot_span->num_unprovisioned_slots : 0; - size_t num_committed_slots = - slot_span->bucket->get_slots_per_span() - num_uncommitted_slots; - PA_DCHECK(slot_span->GetPreviouslyCommittedSize() == - bits::AlignUp(num_committed_slots * slot_span->bucket->slot_size, - SystemPageSize())); -#endif - } -} - -template <bool thread_safe> -void PartitionRoot<thread_safe>::AssertNumPreviouslyCommittedSystemPages( - internal::SlotSpanMetadata<thread_safe>* slot_span, - void* address, - size_t length, - PageAccessibilityDisposition accessibility_disposition) { -#if DCHECK_IS_ON() - if (slot_span->bucket->is_direct_mapped()) - return; - - char* base = reinterpret_cast<char*>( - internal::SlotSpanMetadata<thread_safe>::ToSlotSpanStartPtr(slot_span)); - size_t previously_committed_size = slot_span->GetPreviouslyCommittedSize(); - char* previously_committed_watermark = base + previously_committed_size; - if (accessibility_disposition == PageUpdatePermissions) { - PA_DCHECK(address == previously_committed_watermark); - } else { - PA_DCHECK(address <= previously_committed_watermark - length); - } -#endif // DCHECK_IS_ON() -} - -template <bool thread_safe> ALWAYS_INLINE void PartitionRoot<thread_safe>::RecommitSystemPagesForData( - internal::SlotSpanMetadata<thread_safe>* slot_span, void* address, size_t length, PageAccessibilityDisposition accessibility_disposition) { - AssertNumPreviouslyCommittedSystemPages(slot_span, address, length, - accessibility_disposition); RecommitSystemPages(address, length, PageReadWrite, accessibility_disposition); IncreaseCommittedPages(length); - UpdateNumPreviouslyCommittedSystemPagesIfNeeded(slot_span, length, - accessibility_disposition); } template <bool thread_safe> ALWAYS_INLINE bool PartitionRoot<thread_safe>::TryRecommitSystemPagesForData( - internal::SlotSpanMetadata<thread_safe>* slot_span, void* address, size_t length, PageAccessibilityDisposition accessibility_disposition) { - AssertNumPreviouslyCommittedSystemPages(slot_span, address, length, - accessibility_disposition); bool ok = TryRecommitSystemPages(address, length, PageReadWrite, accessibility_disposition); - if (ok) { + if (ok) IncreaseCommittedPages(length); - UpdateNumPreviouslyCommittedSystemPagesIfNeeded(slot_span, length, - accessibility_disposition); - } return ok; }
diff --git a/base/android/proguard/chromium_apk.flags b/base/android/proguard/chromium_apk.flags index 4e7f147..dee87b26 100644 --- a/base/android/proguard/chromium_apk.flags +++ b/base/android/proguard/chromium_apk.flags
@@ -91,6 +91,11 @@ int intValue() return 0; } +# Makes try-with-resources less inefficient. Saved 3.8kb when added. +-assumenosideeffects class java.lang.Throwable { + void addSuppressed(...); +} + # This is to workaround crbug.com/1204690 - an old GMS app version crashes when # ObjectWrapper contains > 1 fields, and this prevents R8 from inserting a # synthetic field.
diff --git a/base/util/BUILD.gn b/base/util/BUILD.gn deleted file mode 100644 index e35cc06..0000000 --- a/base/util/BUILD.gn +++ /dev/null
@@ -1,15 +0,0 @@ -# Copyright (c) 2019 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("//testing/test.gni") - -test("base_util_unittests") { - sources = [ - "dummy_unittest.cc", - ] - deps = [ - "//base/test:run_all_unittests", - "//testing/gtest:gtest", - ] -}
diff --git a/base/util/OWNERS b/base/util/OWNERS deleted file mode 100644 index 0dd8c35..0000000 --- a/base/util/OWNERS +++ /dev/null
@@ -1,2 +0,0 @@ -jdoerrie@chromium.org -wez@chromium.org
diff --git a/base/util/README.md b/base/util/README.md deleted file mode 100644 index bd3f8199..0000000 --- a/base/util/README.md +++ /dev/null
@@ -1,121 +0,0 @@ -# What is this -Contains a written down set of principles and other information on //base/util. -Please add to it! - -## About //base/util: - -This directory is meant to house common utilities that can be shared across the -whole Chromium codebase. //base is similar, but due to the way //base grew over -time, it has not been well organized to allow for fine-grained ownership. Also, -there is a mixture of commonly useful utility code and extremely subtle code -with performance and security implications. The combination of the two lead to -a small number of //base OWNERS enforcing a very high quality bar over a -diverse bag of code. The goal of //base/util is to avoid both these issues. -Over time, functionality in //base proper will sorted into //base/util and -one of two things will occur: - - 1. //base becomes empty and subdirs in //base/util get moved up to //base - 2. A distinct "core" //base module is distilled out. - -We will iterate on this purpose as we add more functionality into this -directory. - -## Structure of //base/util: - - * No files other than README.md, and OWNERS are allowed in the top-level - directory. - * Subdirectories should be named for a class of functionality; it should - be relatively easy to browse the directory and find a utility. - * There is no top-level BUILD.gn. Subdirectories will have their own and - are allowed to reference other subdirectories. - -## Responsibilities of //base/util/OWNERS - - * Creating new categories. - * Helping dedupe and organize code being added. - * Ensuring the directory is somewhat browseable. - -It is specifically NOT the OWNERS job to gatekeep what is a "good pattern" -for Chromium code. Obviously they can still object, but the objection -should be considered similar to any other Chromium dev objection. - -There will be cases when a utility is deemed to be more negative than -positive after it has been landed. The //base/util/OWNERS may aide in -coordinating and tracking removal, but responsibility for actually -deleting the code and its uses falls to the *category* OWNERS. - -## Guidelines for adding code to //base/util/{category} - - * You will be added to an OWNERS file under //base/util/category and be - responsible for maintaining your addition. - * A //base/util/OWNER must approve of the location of your code. - * Code must be needed in at least 2 places in Chrome and have no "higher - layered" directory (eg "//ui/base, //media/base, etc.), that could - facilitate sharing. - * Code must have unittests, and coverage should be > 95%. - * Code must have clear usage documentation for all the APIs. - * Public APIs must be in `::util` namespace. All implementation details - should be in `::util::internal`. Macros, which are not namespaceable, - are permitted but should be used sparingly and cause a small pang of guilt. - * Implementation and expected usage must be understandable by another OWNER - in your subdirectory; if creating a new subdirectory you must find a - co-OWNER. - * New subdirectories should have their own BUILD.gn files. - - -## Why not just put new utilities in //base/FooDir? - -At some point, //base/util directories could get moved back into //base. -Until then, //base/util will - - 1. make a distinct separation between "common useful utility code" from the - "extremely subtle code with performance and security implications" that //base - also houses. - 2. remove //base/OWNERS as a bottleneck. - -The boundary is still a work-in-progress, but should clear itself up with time -after some of the more obviously "utility-esque" classes are moved. - - -## How does this differ from //components -Both //components and //base/util contain subdirectories that are (a) intended -for reuse. In addition, //components imposes no global layering in Chromium, so -a subdirectory placed in //components can be used from most-to-all layers in the -codebase, subject to the dependencies that that subdirectory itself holds. - -In spite of these similarities, there are *conceptual* differences: //components -contains things are closer to full features or subsystems (eg autofill, heap -profiler, cloud devices, visited link tracker) that are not really intended for -large scale reuse. - -There is some overlap and at some point it will become a judgment call, but -in general, //components are a better fit if the code in question is a feature, -module, or subsystem. //base/util is better if it is a more narrow construct -such as a data structure, coding primitive, etc. - - -## Why not the "Rule-of-3?" - -The [Rule-of-3](https://en.wikipedia.org/wiki/Rule_of_three_%28computer_programming%29) -is a simple guidance on when it makes sense to extract common functionality out -versus duplicating it. It has commonly been used in //base as a way of measuring -"how general" is this functionality. - -Unfortunately, there are reasons for wanting to share code beyond just -cleanliness. For example, if you need to guarantee exact behavior across -two modules, duplication is not proper even if there will ever only be 2 -users. - -Furthermore, there is a chicken-and-egg problem that prevents incremental -adoption of a utility. For example, someone introduces ThingerDoer in -//foo/bar. Later, ThingerDoer is wanted in //foo/qux, but this still fails -the rule-of-3 test, MyDoer is created. When //foo/waldo wants it, it's -completely a game of chance whether or not the CL author manages to find -both classes, wants to spend the time to determine if they've diverged, -and then tries to abstract it. - -As such, the rule-of-3 runs contrary to the goal of sharing that -//base/util is designed to facilitate. - -## Tips - * if doing a mass-move of code, look at `//tools/git/mass-rename.py`
diff --git a/base/util/dummy_unittest.cc b/base/util/dummy_unittest.cc deleted file mode 100644 index 5d199ea..0000000 --- a/base/util/dummy_unittest.cc +++ /dev/null
@@ -1,10 +0,0 @@ -#include "testing/gtest/include/gtest/gtest.h" - -namespace { - -TEST(BaseUtilTest, Dummy) { - // Empty test suites break android. Add this here until base_util_unittests - // is removed from the waterfall. -} - -} // namespace
diff --git a/build/android/apk_operations.py b/build/android/apk_operations.py index b5c01cc..3c94907 100755 --- a/build/android/apk_operations.py +++ b/build/android/apk_operations.py
@@ -125,36 +125,9 @@ optimize_for=optimize_for) -def _InstallBundle(devices, apk_helper_instance, package_name, - command_line_flags_file, modules, fake_modules): - # Path Chrome creates after validating fake modules. This needs to be cleared - # for pushed fake modules to be picked up. - SPLITCOMPAT_PATH = '/data/data/' + package_name + '/files/splitcompat' - # Chrome command line flag needed for fake modules to work. - FAKE_FEATURE_MODULE_INSTALL = '--fake-feature-module-install' - - def ShouldWarnFakeFeatureModuleInstallFlag(device): - if command_line_flags_file: - changer = flag_changer.FlagChanger(device, command_line_flags_file) - return FAKE_FEATURE_MODULE_INSTALL not in changer.GetCurrentFlags() - return False - - def ClearFakeModules(device): - if device.PathExists(SPLITCOMPAT_PATH, as_root=True): - device.RemovePath( - SPLITCOMPAT_PATH, force=True, recursive=True, as_root=True) - logging.info('Removed %s', SPLITCOMPAT_PATH) - else: - logging.info('Skipped removing nonexistent %s', SPLITCOMPAT_PATH) +def _InstallBundle(devices, apk_helper_instance, modules, fake_modules): def Install(device): - ClearFakeModules(device) - if fake_modules and ShouldWarnFakeFeatureModuleInstallFlag(device): - # Print warning if command line is not set up for fake modules. - msg = ('Command line has no %s: Fake modules will be ignored.' % - FAKE_FEATURE_MODULE_INSTALL) - print(_Colorize(msg, colorama.Fore.YELLOW + colorama.Style.BRIGHT)) - device.Install( apk_helper_instance, permissions=[], @@ -1341,8 +1314,7 @@ modules = list( set(self.args.module) - set(self.args.no_module) - set(self.args.fake)) - _InstallBundle(self.devices, self.apk_helper, self.args.package_name, - self.args.command_line_flags_file, modules, self.args.fake) + _InstallBundle(self.devices, self.apk_helper, modules, self.args.fake) else: _InstallApk(self.devices, self.apk_helper, self.install_dict)
diff --git a/build/android/gradle/generate_gradle.py b/build/android/gradle/generate_gradle.py index 4a8d6ca..8a5c0ab 100755 --- a/build/android/gradle/generate_gradle.py +++ b/build/android/gradle/generate_gradle.py
@@ -57,6 +57,7 @@ '//chrome/android:chrome_junit_tests', '//chrome/android:chrome_public_apk', '//chrome/android:chrome_public_test_apk', + '//chrome/android:chrome_public_unit_test_apk', '//content/public/android:content_junit_tests', '//content/shell/android:content_shell_apk', # Below must be included even with --all since they are libraries.
diff --git a/build/android/gyp/compile_resources.py b/build/android/gyp/compile_resources.py index 54ca0b3..d08364b 100755 --- a/build/android/gyp/compile_resources.py +++ b/build/android/gyp/compile_resources.py
@@ -381,6 +381,7 @@ Tuple of: * Manifest path within |temp_dir|. * Original package_name. + * Manifest package name. """ def maybe_extract_version(j): try: @@ -432,8 +433,10 @@ manifest_node.set('platformBuildVersionName', version_name) orig_package = manifest_node.get('package') + fixed_package = orig_package if options.arsc_package_name: manifest_node.set('package', options.arsc_package_name) + fixed_package = options.arsc_package_name if options.debuggable: app_node.set('{%s}%s' % (manifest_utils.ANDROID_NAMESPACE, 'debuggable'), @@ -452,7 +455,7 @@ min_sdk_node.set(dist_value, options.min_sdk_version) manifest_utils.SaveManifest(doc, debug_manifest_path) - return debug_manifest_path, orig_package + return debug_manifest_path, orig_package, fixed_package def _CreateKeepPredicate(resource_exclusion_regex, @@ -802,8 +805,8 @@ '--allow-reserved-package-id', ] - fixed_manifest, desired_manifest_package_name = _FixManifest( - options, build.temp_dir) + fixed_manifest, desired_manifest_package_name, fixed_manifest_package = ( + _FixManifest(options, build.temp_dir)) if options.rename_manifest_package: desired_manifest_package_name = options.rename_manifest_package @@ -816,7 +819,7 @@ # Also creates R.txt if options.use_resource_ids_path: _CreateStableIdsFile(options.use_resource_ids_path, build.stable_ids_path, - desired_manifest_package_name) + fixed_manifest_package) link_command += ['--stable-ids', build.stable_ids_path] link_command += partials @@ -915,7 +918,7 @@ def _CreateNormalizedManifestForVerification(options): with build_utils.TempDir() as tempdir: - fixed_manifest, _ = _FixManifest( + fixed_manifest, _, _ = _FixManifest( options, tempdir, extra_manifest=options.extra_verification_manifest) with open(fixed_manifest) as f: return manifest_utils.NormalizeManifest(f.read()) @@ -1011,7 +1014,9 @@ _, package_id = resource_utils.ExtractArscPackage( options.aapt2_path, build.arsc_path if options.arsc_path else build.proto_path) - if package_id != expected_id: + # When there are no resources, ExtractArscPackage returns (None, None), in + # this case there is no need to check for matching package ID. + if package_id is not None and package_id != expected_id: raise Exception( 'Invalid package ID 0x%x (expected 0x%x)' % (package_id, expected_id))
diff --git a/build/android/gyp/util/resource_utils.py b/build/android/gyp/util/resource_utils.py index 263b7c2..639d46c1 100644 --- a/build/android/gyp/util/resource_utils.py +++ b/build/android/gyp/util/resource_utils.py
@@ -711,8 +711,9 @@ } sResourcesDidLoad = true; int packageIdTransform = (packageId ^ 0x7f) << 24; - {% for resource_type in resource_types %} - onResourcesLoaded{{ resource_type|title }}(packageIdTransform); + // These int[] resources need to be transformed first as they may refer + // to other resources by name. This avoids transforming the same value + // twice (https://crbug.com/1237059). {% for e in non_final_resources[resource_type] %} {% if e.java_type == 'int[]' %} for(""" + for_loop_condition + """) { @@ -720,6 +721,8 @@ } {% endif %} {% endfor %} + {% for resource_type in resource_types %} + onResourcesLoaded{{ resource_type|title }}(packageIdTransform); {% endfor %} } {% for res_type in resource_types %} @@ -761,7 +764,14 @@ def ExtractArscPackage(aapt2_path, apk_path): - """Returns (package_name, package_id) of resources.arsc from apk_path.""" + """Returns (package_name, package_id) of resources.arsc from apk_path. + + When the apk does not have any entries in its resources file, in recent aapt2 + versions it will not contain a "Package" line. The package is not even in the + actual resources.arsc/resources.pb file (which itself is mostly empty). Thus + return (None, None) when dump succeeds and there are no errors to indicate + that the package name does not exist in the resources file. + """ proc = subprocess.Popen([aapt2_path, 'dump', 'resources', apk_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE) @@ -777,8 +787,11 @@ # aapt2 currently crashes when dumping webview resources, but not until after # it prints the "Package" line (b/130553900). - sys.stderr.write(proc.stderr.read()) - raise Exception('Failed to find arsc package name') + stderr_output = proc.stderr.read().decode('utf-8') + if stderr_output: + sys.stderr.write(stderr_output) + raise Exception('Failed to find arsc package name') + return None, None def _RenameSubdirsWithPrefix(dir_path, prefix):
diff --git a/build/android/incremental_install/generate_android_manifest.py b/build/android/incremental_install/generate_android_manifest.py index e069dab..c4912837 100755 --- a/build/android/incremental_install/generate_android_manifest.py +++ b/build/android/incremental_install/generate_android_manifest.py
@@ -108,6 +108,7 @@ arsc_package, _ = resource_utils.ExtractArscPackage(options.aapt2_path, options.in_apk) + assert arsc_package is not None, 'The apk does not have a valid package.' # Extract version from the compiled manifest since it might have been set # via aapt, and not exist in the manifest's text form. version_code, version_name, manifest_package = (
diff --git a/build/fuchsia/common_args.py b/build/fuchsia/common_args.py index 70cc70d..691fad6 100644 --- a/build/fuchsia/common_args.py +++ b/build/fuchsia/common_args.py
@@ -113,7 +113,7 @@ help='Sets the number of CPU cores to provide.') emu_args.add_argument('--ram-size-mb', type=int, - default=2048, + default=8192, help='Sets the emulated RAM size (MB).'), emu_args.add_argument('--allow-no-kvm', action='store_false',
diff --git a/build/fuchsia/fvdl_target.py b/build/fuchsia/fvdl_target.py index c030484..e0cb2aa 100644 --- a/build/fuchsia/fvdl_target.py +++ b/build/fuchsia/fvdl_target.py
@@ -15,6 +15,16 @@ _FVDL_PATH = os.path.join(common.SDK_ROOT, 'tools', 'x64', 'fvdl') _SSH_KEY_DIR = os.path.expanduser('~/.ssh') _DEFAULT_SSH_PORT = 22 +_DEVICE_PROTO_TEMPLATE = """ +device_spec: {{ + horizontal_resolution: 1280 + vertical_resolution: 800 + vm_heap: 192 + ram: {ramsize} + cache: 32 + screen_density: 240 +}} +""" def GetTargetType(): @@ -30,12 +40,13 @@ EMULATOR_NAME = 'aemu' def __init__(self, out_dir, target_cpu, system_log_file, require_kvm, - enable_graphics, hardware_gpu, with_network): + enable_graphics, hardware_gpu, with_network, ram_size_mb): super(FvdlTarget, self).__init__(out_dir, target_cpu, system_log_file) self._require_kvm = require_kvm self._enable_graphics = enable_graphics self._hardware_gpu = hardware_gpu self._with_network = with_network + self._ram_size_mb = ram_size_mb self._host = None self._pid = None @@ -43,11 +54,16 @@ # Use a temp file for vdl output. self._vdl_output_file = tempfile.NamedTemporaryFile() + # Use a temp file for the device proto and write the ram size. + self._device_proto_file = tempfile.NamedTemporaryFile() + with open(self._device_proto_file.name, 'w') as file: + file.write(_DEVICE_PROTO_TEMPLATE.format(ramsize=self._ram_size_mb)) + @staticmethod def CreateFromArgs(args): return FvdlTarget(args.out_dir, args.target_cpu, args.system_log_file, args.require_kvm, args.enable_graphics, args.hardware_gpu, - args.with_network) + args.with_network, args.ram_size_mb) @staticmethod def RegisterArgs(arg_parser): @@ -100,7 +116,11 @@ # Use an existing emulator checked out by Chromium. '--aemu-path', - aemu_path + aemu_path, + + # Use this flag and temp file to define ram size. + '--device-proto', + self._device_proto_file.name ] if not self._require_kvm: @@ -111,6 +131,7 @@ emu_command.append('--host-gpu') if self._with_network: emu_command.append('-N') + logging.info('FVDL command: ' + ' '.join(emu_command)) return emu_command @@ -177,6 +198,7 @@ emu_target.LogProcessStatistics('proc_stat_end_log') emu_target.LogSystemStatistics('system_statistics_end_log') self._vdl_output_file.close() + self._device_proto_file.close() def _GetSshConfigPath(self): return boot_data.GetSSHConfigPath(_SSH_KEY_DIR)
diff --git a/build/fuchsia/fvdl_target_test.py b/build/fuchsia/fvdl_target_test.py index f75aa58..0106f30 100755 --- a/build/fuchsia/fvdl_target_test.py +++ b/build/fuchsia/fvdl_target_test.py
@@ -7,6 +7,7 @@ import boot_data import common +import os import unittest import unittest.mock as mock @@ -22,7 +23,8 @@ require_kvm=True, enable_graphics=False, hardware_gpu=False, - with_network=False) + with_network=False, + ram_size_mb=8192) def testBasicEmuCommand(self): with FvdlTarget.CreateFromArgs(self.args) as target: @@ -37,6 +39,15 @@ self.assertIn('--headless', target._BuildCommand()) self.assertNotIn('--host-gpu', target._BuildCommand()) self.assertNotIn('-N', target._BuildCommand()) + self.assertIn('--device-proto', target._BuildCommand()) + self.assertTrue(os.path.exists(target._device_proto_file.name)) + correct_ram_amount = False + with open(target._device_proto_file.name) as file: + for line in file: + if line.strip() == 'ram: 8192': + correct_ram_amount = True + break + self.assertTrue(correct_ram_amount) def testBuildCommandCheckIfNotRequireKVMSetNoAcceleration(self): self.args.require_kvm = False @@ -70,6 +81,22 @@ with mock.patch.object(boot_data, 'ProvisionSSH') as provision_mock: self.assertIn('-N', target._BuildCommand()) + def testBuildCommandCheckRamSizeNot8192SetRamSize(self): + self.args.ram_size_mb = 4096 + with FvdlTarget.CreateFromArgs(self.args) as target: + target.Shutdown = mock.MagicMock() + common.EnsurePathExists = mock.MagicMock(return_value='image') + with mock.patch.object(boot_data, 'ProvisionSSH') as provision_mock: + self.assertIn('--device-proto', target._BuildCommand()) + self.assertTrue(os.path.exists(target._device_proto_file.name)) + correct_ram_amount = False + with open(target._device_proto_file.name) as file: + for line in file: + if line.strip() == 'ram: 4096': + correct_ram_amount = True + break + self.assertTrue(correct_ram_amount) + if __name__ == '__main__': unittest.main()
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index 43dad41f..2d270e9b 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@ -6.20210813.0.1 +6.20210813.3.1
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1 index e32939b..2d270e9b 100644 --- a/build/fuchsia/mac.sdk.sha1 +++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@ -6.20210813.1.1 +6.20210813.3.1
diff --git a/build/fuchsia/start_emulator.py b/build/fuchsia/start_emulator.py index 737235b4..c7edead3 100755 --- a/build/fuchsia/start_emulator.py +++ b/build/fuchsia/start_emulator.py
@@ -74,6 +74,10 @@ dest='with_network', default=True, help='Run emulator without emulated nic via tun/tap.') + fvdl_args.add_argument('--ram-size-mb', + type=int, + default=8192, + help='Set the ram size amount for the emulator.') if __name__ == '__main__':
diff --git a/chrome/VERSION b/chrome/VERSION index b8157ed..a87762a 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=95 MINOR=0 -BUILD=4607 +BUILD=4608 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index c189af1..ed39872 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -1134,6 +1134,25 @@ ] } +# Files used by chrome integration and unit javatests. +android_library("chrome_unit_test_util_java") { + testonly = true + + sources = [ + "javatests/src/org/chromium/chrome/browser/homepage/HomepageTestRule.java", + ] + + deps = [ + "//chrome/browser/preferences:java", + "//components/policy/android:policy_java", + "//components/policy/android:policy_java_test_support", + "//content/public/test/android:content_java_test_support", + "//third_party/android_support_test_runner:runner_java", + "//third_party/androidx:androidx_annotation_annotation_java", + "//third_party/junit:junit", + ] +} + # Files used for both chrome tests and VR/AR and autofill_assistant tests android_library("chrome_test_util_java") { testonly = true @@ -1148,6 +1167,8 @@ "javatests/src/org/chromium/chrome/browser/webapps/WebappActivityTestRule.java", ] + public_deps = [ ":chrome_unit_test_util_java" ] + deps = [ ":browser_java_test_support", "//base:base_java", @@ -1181,6 +1202,32 @@ annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] } +android_library("chrome_unit_test_java") { + testonly = true + resources_package = "org.chromium.chrome.test" + sources = [ + "javatests/src/org/chromium/chrome/browser/toolbar/HomeButtonTest.java", + ] + deps = [ + ":chrome_unit_test_util_java", + "//base:base_java", + "//base:base_java_test_support", + "//chrome/android:chrome_java", + "//chrome/browser/ui/android/toolbar:java", + "//chrome/test/android:chrome_java_test_support", + "//components/browser_ui/settings/android:java", + "//content/public/test/android:content_java_test_support", + "//third_party/android_deps:espresso_java", + "//third_party/android_support_test_runner:runner_java", + "//third_party/androidx:androidx_annotation_annotation_java", + "//third_party/androidx:androidx_test_runner_java", + "//third_party/junit", + "//third_party/mockito:mockito_java", + "//ui/android:ui_full_java", + "//ui/android:ui_java_test_support", + ] +} + android_library("chrome_test_java") { testonly = true resources_package = "org.chromium.chrome.test" @@ -2712,6 +2759,8 @@ sources = [ "trichrome/res_dummy/values/strings.xml" ] } +chrome_public_unit_test_apk_manifest = + "$root_gen_dir/chrome_public_unit_test_apk_manifest/AndroidManifest.xml" chrome_public_test_apk_manifest = "$root_gen_dir/chrome_public_test_apk_manifest/AndroidManifest.xml" chrome_public_test_vr_apk_manifest = @@ -2719,6 +2768,18 @@ monochrome_public_test_ar_apk_manifest = "$root_gen_dir/monochrome_public_test_ar_apk_manifest/AndroidManifest.xml" +jinja_template("chrome_public_unit_test_apk_manifest") { + input = "javatests/AndroidManifest.xml" + includes = [ "java/AndroidManifest.xml" ] + output = chrome_public_unit_test_apk_manifest + variables = default_chrome_public_jinja_variables + variables += [ + "manifest_package=$chrome_public_test_manifest_package", + "min_sdk_version=21", + "target_sdk_version=$android_sdk_version", + ] +} + jinja_template("chrome_public_test_apk_manifest") { input = "javatests/AndroidManifest.xml" includes = [ "java/AndroidManifest.xml" ] @@ -2878,6 +2939,22 @@ } } +# As compared to chrome_public_test_apk, this target contains only unit tests +# that require on device capabilities. These tests are smaller, more tightly +# scoped, and do not leave lingering state after execution. +# TODO(crbug.com/1238057): Set clear rules for what tests can be added here. +chrome_test_apk_tmpl("chrome_public_unit_test_apk") { + apk_name = "ChromePublicUnitTest" + android_manifest = chrome_public_unit_test_apk_manifest + android_manifest_dep = ":chrome_public_unit_test_apk_manifest" + shared_libraries = [ ":libchromefortest" ] + deps = [ + ":chrome_unit_test_java", + "//chrome/browser/video_tutorials/internal:javatests", + ] +} + +# TODO(crbug.com/1238057): Rename to chrome_public_integration_test_apk chrome_test_apk_tmpl("chrome_public_test_apk") { # TODO(wnwen): Re-enable when new lint failures are disabled for test targets. #enable_lint = true @@ -2905,7 +2982,6 @@ "//chrome/browser/ui/android/webid/internal:javatests", "//chrome/browser/ui/messages/android:javatests", "//chrome/browser/util:javatests", - "//chrome/browser/video_tutorials/internal:javatests", ] data_deps = [ "//testing/buildbot/filters:chrome_public_test_apk_filters" ] @@ -3095,10 +3171,8 @@ extra_args = _bundle_smoke_test_extra_args } +# These are in addition to the ones listed in _bundle_smoke_test_extra_args. _bundle_fake_modules_smoke_test_extra_args = [ - # These are in addition to the ones listed in _bundle_smoke_test_extra_args. - "--fake-feature-module-install", - # The fake modules' apks are stored in the apk_under_test's data directory. # This flag tells test_runner.py to skip the "pm clear" step so that the apk # files (along with other app data) are not removed before tests are run.
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni index bda001f..25583fe 100644 --- a/chrome/android/chrome_test_java_sources.gni +++ b/chrome/android/chrome_test_java_sources.gni
@@ -229,7 +229,6 @@ "javatests/src/org/chromium/chrome/browser/history/HistoryActivityTest.java", "javatests/src/org/chromium/chrome/browser/history/HistoryTest.java", "javatests/src/org/chromium/chrome/browser/homepage/HomepagePolicyIntegrationTest.java", - "javatests/src/org/chromium/chrome/browser/homepage/HomepageTestRule.java", "javatests/src/org/chromium/chrome/browser/homepage/settings/HomepageSettingsFragmentTest.java", "javatests/src/org/chromium/chrome/browser/identity_disc/IdentityDiscControllerTest.java", "javatests/src/org/chromium/chrome/browser/incognito/IncognitoCookieLeakageTest.java", @@ -585,7 +584,6 @@ "javatests/src/org/chromium/chrome/browser/tasks/ReturnToChromeTest.java", "javatests/src/org/chromium/chrome/browser/test/CommandLineInitRule.java", "javatests/src/org/chromium/chrome/browser/test/ScreenShooter.java", - "javatests/src/org/chromium/chrome/browser/toolbar/HomeButtonTest.java", "javatests/src/org/chromium/chrome/browser/toolbar/LocationBarModelTest.java", "javatests/src/org/chromium/chrome/browser/toolbar/ToolbarDataProviderTest.java", "javatests/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarIntegrationTest.java",
diff --git a/chrome/android/expectations/monochrome_public_bundle.proguard_flags.expected b/chrome/android/expectations/monochrome_public_bundle.proguard_flags.expected index 0a141039..fa0ab7f 100644 --- a/chrome/android/expectations/monochrome_public_bundle.proguard_flags.expected +++ b/chrome/android/expectations/monochrome_public_bundle.proguard_flags.expected
@@ -120,6 +120,11 @@ int intValue() return 0; } +# Makes try-with-resources less inefficient. Saved 3.8kb when added. +-assumenosideeffects class java.lang.Throwable { + void addSuppressed(...); +} + # This is to workaround crbug.com/1204690 - an old GMS app version crashes when # ObjectWrapper contains > 1 fields, and this prevents R8 from inserting a # synthetic field.
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mr.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mr.xtb index 1030a41..4f5a1c6 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mr.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mr.xtb
@@ -41,7 +41,7 @@ <translation id="5082793167783849073">गट बनवून त्वरित पेजशी तुलना करा. सुरू करण्यासाठी, लिंकला स्पर्श करा आणि धरून ठेवा.</translation> <translation id="5490235265819901748">टॅब गटाचा विस्तार केला आहे</translation> <translation id="5533021382642990449">नंतर दाखवा</translation> -<translation id="5556417849629758491">स्टोअरची माहिती पाहा, पर्याय स्क्रीनच्या सर्वात वर उपलब्ध आहे</translation> +<translation id="5556417849629758491">स्टोअरची माहिती पहा, पर्याय स्क्रीनच्या सर्वात वर उपलब्ध आहे</translation> <translation id="5558362125926932819"><ph name="NUMBER_OF_TABS" /> टॅब असलेला टॅब गट बंद करा</translation> <translation id="5580090775658607195"><ph name="TAB_COUNT" /> टॅबची गटामध्ये विभागणी केली आहे</translation> <translation id="575494663145460764">किंमत कमी झाल्याच्या सूचना मिळवायच्या आहेत का?</translation> @@ -57,7 +57,7 @@ <translation id="6856809498882026482">एकाहून अधिक निवड मोड लपवा</translation> <translation id="7151209024774799310">गटामधून टॅब काढून टाका</translation> <translation id="7204204600596740190">एकाहून अधिक निवड मोड</translation> -<translation id="7352298686197644113">तुमच्या उघड्या असलेल्या टॅबमध्ये कोणत्या आयटमची किंमत आणखी कमी आहे ते पाहा</translation> +<translation id="7352298686197644113">तुमच्या उघड्या असलेल्या टॅबमध्ये कोणत्या आयटमची किंमत आणखी कमी आहे ते पहा</translation> <translation id="753732157349120914">टॅब स्विचर</translation> <translation id="7559245342362162951">फुलस्क्रीन ग्रिडमध्ये गटाचे टॅब दाखवा</translation> <translation id="7792771145871471484">सूचनांचे पुनरावलोकन करा.</translation> @@ -65,7 +65,7 @@ <translation id="7854360405711302755">{REVIEWS,plural, =1{ <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> रेटिंग, <ph name="REVIEWS_COUNT_ONE" /> परीक्षण}other{<ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> रेटिंग, <ph name="REVIEWS_COUNT_MANY" /> परीक्षणे}}</translation> <translation id="7885132941432959125">टॅब उजवीकडे हलवा</translation> <translation id="7966321538264951561">सूचना डिसमिस करा.</translation> -<translation id="814503310257431685">सर्व पाहा</translation> +<translation id="814503310257431685">सर्व पहा</translation> <translation id="8205266828577616993">टॅब वर हलवा</translation> <translation id="8304833501377495048">टॅब स्ट्रिप पुन्हा दाखवायची नाही का?</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{निवडलेला <ph name="TABS_COUNT_ONE" /> टॅब बंद करा}other{निवडलेले <ph name="TABS_COUNT_MANY" /> टॅब बंद करा}}</translation> @@ -73,7 +73,7 @@ <translation id="860282621117673749">किमतीमध्ये घट झाल्याच्या सूचना</translation> <translation id="8714939927607906138">आणखी कमी किंमत</translation> <translation id="8749939518995770034">बंद केलेली टॅब स्ट्रिप</translation> -<translation id="8820741577754260431">तुमच्या टॅबवर कमी झालेली किंमत पाहा</translation> +<translation id="8820741577754260431">तुमच्या टॅबवर कमी झालेली किंमत पहा</translation> <translation id="9150694013019234766">स्क्रीनच्या तळाजवळ तुमच्या टॅब गटातील टॅब दरम्यान स्विच करा</translation> <translation id="9169594135889675189">गटामध्ये नवीन टॅब जोडा</translation> <translation id="959682366969460160">व्यवस्थापित करा</translation>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActionModeHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActionModeHandler.java index 79bc528..ced10dc 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActionModeHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActionModeHandler.java
@@ -218,8 +218,9 @@ .build(), new ChromeShareExtras.Builder() .setSaveLastUsed(true) - .setIsUserHighlightedText(true) .setRenderFrameHost(mHelper.getRenderFrameHost()) + .setDetailedContentType( + ChromeShareExtras.DetailedContentType.HIGHLIGHTED_TEXT) .build(), ShareOrigin.MOBILE_ACTION_MODE); } else {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java index 6fb72f37..cbbf2c1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java
@@ -852,12 +852,13 @@ mShareDelegateSupplier.get().share(linkShareParams, new ChromeShareExtras.Builder() .setSaveLastUsed(true) - .setIsUserHighlightedText(true) .setIsReshareHighlightedText(true) .setRenderFrameHost(ChromeFeatureList.isEnabled( ChromeFeatureList.SHARED_HIGHLIGHTING_AMP) ? mNativeDelegate.getRenderFrameHost() : null) + .setDetailedContentType( + ChromeShareExtras.DetailedContentType.HIGHLIGHTED_TEXT) .build(), ShareOrigin.MOBILE_ACTION_MODE); } @@ -884,17 +885,25 @@ } ContentResolver contentResolver = ContextUtils.getApplicationContext().getContentResolver(); + String mimeType = contentResolver.getType(imageUri); ShareParams imageShareParams = new ShareParams .Builder(getWindow(), ContextMenuUtils.getTitle(mParams), /*url=*/"") .setFileUris(new ArrayList<>(Collections.singletonList(imageUri))) - .setFileContentType(contentResolver.getType(imageUri)) + .setFileContentType(mimeType) .build(); + int detailedContentType; + if (mimeType.equals("image/gif")) { + detailedContentType = ChromeShareExtras.DetailedContentType.GIF; + } else { + detailedContentType = ChromeShareExtras.DetailedContentType.IMAGE; + } mShareDelegateSupplier.get().share(imageShareParams, new ChromeShareExtras.Builder() .setSaveLastUsed(true) .setImageSrcUrl(mParams.getSrcUrl()) .setContentUrl(mParams.getSrcUrl()) + .setDetailedContentType(detailedContentType) .build(), ShareOrigin.CONTEXT_MENU); });
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java index 0904564..12071c1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java
@@ -120,6 +120,9 @@ /** Whether the selection handles are currently showing. */ private boolean mAreSelectionHandlesShown; + /** Whether a drag of the selection handles is in progress. */ + private boolean mAreSelectionHandlesBeingDragged; + private class ContextualSearchGestureStateListener implements GestureStateListener { @Override public void onScrollStarted(int scrollOffsetY, int scrollExtentY) { @@ -340,6 +343,7 @@ switch (eventType) { case SelectionEventType.SELECTION_HANDLES_SHOWN: mAreSelectionHandlesShown = true; + mAreSelectionHandlesBeingDragged = false; mWasTapGestureDetected = false; mSelectionType = mPolicy.canResolveLongpress() ? SelectionType.RESOLVING_LONG_PRESS : SelectionType.LONG_PRESS; @@ -352,10 +356,27 @@ case SelectionEventType.SELECTION_HANDLES_CLEARED: // Selection handles have been hidden, but there may still be a selection. mAreSelectionHandlesShown = false; + mAreSelectionHandlesBeingDragged = false; mHandler.handleSelectionDismissal(); resetAllStates(); break; + case SelectionEventType.SELECTION_HANDLE_DRAG_STARTED: + mAreSelectionHandlesBeingDragged = true; + break; + case SelectionEventType.SELECTION_HANDLES_MOVED: + // If we're in the middle of a drag operation then we can wait for the drag to end, + // otherwise we need to process this right away. + if (mAreSelectionHandlesBeingDragged) break; + // Smart text selection generates MOVED without STARTED and since that's not a user + // gesture we should not consider it an adjusted selection requiring an exact + // search. + shouldHandleSelection = true; + if (getSelectionPopupController() != null) { + mSelectedText = getSelectionPopupController().getSelectedText(); + } + break; case SelectionEventType.SELECTION_HANDLE_DRAG_STOPPED: + mAreSelectionHandlesBeingDragged = false; shouldHandleSelection = true; mIsAdjustedSelection = true; ContextualSearchUma.logSelectionAdjusted(mSelectedText); @@ -407,6 +428,7 @@ mWasTapGestureDetected = false; mIsAdjustedSelection = false; mAreSelectionHandlesShown = false; + mAreSelectionHandlesBeingDragged = false; } /**
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 d5e2797..873f499b 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
@@ -135,6 +135,10 @@ // is not the default behavior for embedded web views. WebContentsAccessibility.fromWebContents(webContents).setShouldFocusOnPageLoad(true); + // Enable image descriptions feature normally, but not for Chrome Custom Tabs. + WebContentsAccessibility.fromWebContents(webContents) + .setAllowImageDescriptions(!mTab.isCustomTab()); + for (Callback<WebContents> callback : mInitObservers) callback.onResult(webContents); }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionControllerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionControllerTest.java index f0e2dc3..39f2b32 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionControllerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionControllerTest.java
@@ -7,18 +7,169 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.when; +import android.app.Activity; + +import org.junit.Assert; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.BlockJUnit4ClassRunner; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.Robolectric; +import org.robolectric.annotation.Config; +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; +import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.util.Feature; +import org.chromium.content_public.browser.SelectionPopupController; +import org.chromium.ui.touch_selection.SelectionEventType; /** - * Tests the ContextualSearchSelectionController#isSelectionPartOfUrl() method. + * Tests a few methods of the ContextualSearchSelectionController. <ul> + * <li>That the ContextualSearchSelectionController#handleSelectionmethod supports usages + * from Smart Text Selection and from normal user driven selection.</li> + * <li>That the ContextualSearchSelectionController#isSelectionPartOfUrl handles all the different + * URL cases.</li> + * </ul> */ -@RunWith(BlockJUnit4ClassRunner.class) -public class ContextualSearchSelectionControllerTest { +@RunWith(BaseRobolectricTestRunner.class) +@Config(shadows = {ContextualSearchSelectionControllerTest.ShadowContextualSearchFieldTrial.class, + ContextualSearchSelectionControllerTest.ShadowContextualSearchSelectionController + .class}) +public final class ContextualSearchSelectionControllerTest { + private static final String USER_SELECTION = "user selection"; + private static final String POPUP_CONTROLLER_SELECTION = "popup controller selection"; + + /** A SelectionPopupController that always returns POPUP_CONTROLLER_SELECTION. */ + @Mock + private static SelectionPopupController sMockSelectionPopupController; + + /** Stores the selection set by ContextualSearchSelectionController#handleSelection. */ + private static String sSelectionSetByHandleSelection; + + /** The instance under test, which is also shadowed. */ + private ContextualSearchSelectionController mSelectionControllerUnderTest; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + when(sMockSelectionPopupController.getSelectedText()) + .thenReturn(POPUP_CONTROLLER_SELECTION); + Activity activity = Robolectric.buildActivity(Activity.class).setup().get(); + mSelectionControllerUnderTest = + new ContextualSearchSelectionController(activity, null, null, null); + mSelectionControllerUnderTest.setSelectedText(USER_SELECTION); + sSelectionSetByHandleSelection = null; + } + + /** + * Shadows the ContextualSearchFieldTrial class. + * The values returned are not important for this test, they just fulfill the stubbing. + */ + @Implements(ContextualSearchFieldTrial.class) + static class ShadowContextualSearchFieldTrial { + @Implementation + protected static boolean getSwitch( + @ContextualSearchFieldTrial.ContextualSearchSwitch int value) { + return false; + } + + @Implementation + protected static int getValue(int someValue) { + return someValue; + } + } + + /** + * Shadows the class that we are testing: ContextualSearchSelectionController. + * This allows us to stub out some methods without needing to make mocks or stubs for the things + * those methods call. + */ + @Implements(ContextualSearchSelectionController.class) + public static class ShadowContextualSearchSelectionController { + public ShadowContextualSearchSelectionController() {} + + /** + * Implements #handleSelection by remembering the selection param, which can later be + * retrieved by calling #getSelectionSetByHandleSelection + * @param selection The text that was selected. + * @param type The type of selection made by the user. + */ + @Implementation + protected void handleSelection( + String selection, @ContextualSearchSelectionController.SelectionType int type) { + sSelectionSetByHandleSelection = selection; + } + + /** + * Returns the mock popup controller, which always returns a fixed string from + * #getSelectedText. + */ + @Implementation + protected SelectionPopupController getSelectionPopupController() { + return sMockSelectionPopupController; + } + + /** Returns the selection that was set by the call to #handleSelection. */ + static String getSelectionSetByHandleSelection() { + return sSelectionSetByHandleSelection; + } + } + + /** + * Returns the string that the selection controller has sent to the Contextual Search Manager + * in #handleSelection. + */ + private String getSelectionSetByHandleSelection() { + return ShadowContextualSearchSelectionController.getSelectionSetByHandleSelection(); + } + + //============================================================================================ + // Selection manipulation with and without Smart Text Selection + //============================================================================================ + + @Test + @Feature({"ContextualSearchSelectionController"}) + public void testUserDrivenSelectionSequence() { + mSelectionControllerUnderTest.handleSelectionEvent( + SelectionEventType.SELECTION_HANDLE_DRAG_STARTED, 0f, 0f); + final String unexpectedSelectionSent = + "User flow for ContextualSearchSelectionController#handleSelectionEvent sent a " + + "selection to the Manager that was unexpected."; + Assert.assertNull(unexpectedSelectionSent, getSelectionSetByHandleSelection()); + mSelectionControllerUnderTest.handleSelectionEvent( + SelectionEventType.SELECTION_HANDLES_MOVED, 0f, 0f); + Assert.assertNull(unexpectedSelectionSent, getSelectionSetByHandleSelection()); + mSelectionControllerUnderTest.handleSelectionEvent( + SelectionEventType.SELECTION_HANDLE_DRAG_STOPPED, 0f, 0f); + Assert.assertEquals( + "User flow for ContextualSearchSelectionController#handleSelectionEvent " + + "sent an unexpected selection to the Manager. Maybe something broke " + + "longpress selection modification for Contextual Search.", + USER_SELECTION, getSelectionSetByHandleSelection()); + } + + @Test + @Feature({"ContextualSearchSelectionController"}) + public void testSmartTextSelectionIntegration() { + // When Smart Text Selection is active a SELECTION_HANDLES_MOVED event is sent without a + // SELECTION_HANDLE_DRAG_STARTED event. + mSelectionControllerUnderTest.handleSelectionEvent( + SelectionEventType.SELECTION_HANDLES_MOVED, 0f, 0f); + // Make sure we grabbed the selection from the SelectionPopupController. + Assert.assertEquals("Smart Text Selection interaction with Contextual Search " + + "through the ContextualSearchSelectionController#handleSelectionEvent " + + "sent a selection to the Manager that was unexpected. Smart Text " + + "Selection with the intelligent Long-press gesture may be broken.", + POPUP_CONTROLLER_SELECTION, getSelectionSetByHandleSelection()); + } + + //============================================================================================ + // isSelectionPartOfUrl test cases + //============================================================================================ @Test @Feature({"ContextualSearchSelectionController"})
diff --git a/chrome/app/os_settings_strings.grdp b/chrome/app/os_settings_strings.grdp index 9f437d0a..2c82ae33 100644 --- a/chrome/app/os_settings_strings.grdp +++ b/chrome/app/os_settings_strings.grdp
@@ -1989,6 +1989,21 @@ <message name="IDS_SETTINGS_BLUETOOTH_DISCONNECT" desc="Bluetooth pairing dialog: dropdown meny item to disconnect from a device."> Disconnect </message> + <message name="IDS_SETTINGS_BLUETOOTH_DEVICE_DETAIL_CONNECTED" desc="Bluetooth device details page: Text informing user the device is currently connected."> + Connected + </message> + <message name="IDS_SETTINGS_BLUETOOTH_DEVICE_DETAIL_DISCONNECTED" desc="Bluetooth device details page: Text informing user the device is currently disconnected."> + Disconnected + </message> + <message name="IDS_SETTINGS_BLUETOOTH_DEVICE_DETAIL_FORGET" desc="Bluetooth device details page: button label for button that forgets the Bluetooth device when clicked."> + Forget + </message> + <message name="IDS_SETTINGS_BLUETOOTH_DEVICE_DETAIL_NAME" desc="Bluetooth device details page: label informing user the text below is the device name."> + Device name + </message> + <message name="IDS_SETTINGS_BLUETOOTH_DEVICE_DETAIL_CHANGE_DEVICE_NAME" desc="Bluetooth device details page: button label for button that prompts user to change the Bluetooth device's name when clicked."> + Change device name + </message> <message name="IDS_SETTINGS_BLUETOOTH_TOGGLE_ACCESSIBILITY_LABEL" desc="Accessibility only label for Bluetooth enable/disable toggle."> Bluetooth enable </message> @@ -2031,6 +2046,9 @@ <message name="IDS_SETTINGS_BLUETOOTH_SUMMARY_PAGE_ON" desc="Label for Bluetooth summary page, when Bluetooth is on but no devices are connected."> On </message> + <message name="IDS_SETTINGS_BLUETOOTH_PAIRED_DEVICE_ITEM_BATTERY_PERCENTAGE" desc="Label for a paired Bluetooth device in a list that indicates the battery level of the device."> + <ph name="BATTERY_PERCENTAGE">$1<ex>32</ex></ph>% + </message> <message name="IDS_SETTINGS_BLUETOOTH_DEVICE_DETAILS" desc="Name of the settings page which displays Bluetooth device details."> Bluetooth device details </message>
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_BLUETOOTH_DEVICE_DETAIL_CHANGE_DEVICE_NAME.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_BLUETOOTH_DEVICE_DETAIL_CHANGE_DEVICE_NAME.png.sha1 new file mode 100644 index 0000000..a5df80f3 --- /dev/null +++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_BLUETOOTH_DEVICE_DETAIL_CHANGE_DEVICE_NAME.png.sha1
@@ -0,0 +1 @@ +d5774d35b7ecf9afca35867cfa0ccc474927679a \ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_BLUETOOTH_DEVICE_DETAIL_CONNECTED.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_BLUETOOTH_DEVICE_DETAIL_CONNECTED.png.sha1 new file mode 100644 index 0000000..9d2a7bb --- /dev/null +++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_BLUETOOTH_DEVICE_DETAIL_CONNECTED.png.sha1
@@ -0,0 +1 @@ +3e1d49df606ad39a31776da80cadd96adeddab07 \ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_BLUETOOTH_DEVICE_DETAIL_DISCONNECTED.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_BLUETOOTH_DEVICE_DETAIL_DISCONNECTED.png.sha1 new file mode 100644 index 0000000..6e04267 --- /dev/null +++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_BLUETOOTH_DEVICE_DETAIL_DISCONNECTED.png.sha1
@@ -0,0 +1 @@ +3d4009ad38d38fb238e128524022f9e4ee9cfe8d \ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_BLUETOOTH_DEVICE_DETAIL_FORGET.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_BLUETOOTH_DEVICE_DETAIL_FORGET.png.sha1 new file mode 100644 index 0000000..3ae0e58 --- /dev/null +++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_BLUETOOTH_DEVICE_DETAIL_FORGET.png.sha1
@@ -0,0 +1 @@ +66be4a4f526d170d939aca3eab1f7d308148b3a7 \ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_BLUETOOTH_DEVICE_DETAIL_NAME.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_BLUETOOTH_DEVICE_DETAIL_NAME.png.sha1 new file mode 100644 index 0000000..a5df80f3 --- /dev/null +++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_BLUETOOTH_DEVICE_DETAIL_NAME.png.sha1
@@ -0,0 +1 @@ +d5774d35b7ecf9afca35867cfa0ccc474927679a \ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_BLUETOOTH_PAIRED_DEVICE_ITEM_BATTERY_PERCENTAGE.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_BLUETOOTH_PAIRED_DEVICE_ITEM_BATTERY_PERCENTAGE.png.sha1 new file mode 100644 index 0000000..d9a6ad2f --- /dev/null +++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_BLUETOOTH_PAIRED_DEVICE_ITEM_BATTERY_PERCENTAGE.png.sha1
@@ -0,0 +1 @@ +05873ccf865c3136b23451541bd3e5d4a479910e \ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_az.xtb b/chrome/app/resources/chromium_strings_az.xtb index 1b98d88..135bd68e 100644 --- a/chrome/app/resources/chromium_strings_az.xtb +++ b/chrome/app/resources/chromium_strings_az.xtb
@@ -253,6 +253,7 @@ <translation id="7937630085815544518">Chromium'a <ph name="USER_EMAIL_ADDRESS" /> kimi daxil olmuşdunuz. Lütfən, yenidən daxil olmaq üçün eyni hesabdan istifadə edin.</translation> <translation id="7975919845073681630">Bu Chromium'un ikinci quraşdırmasıdır və defolt brauzer kimi ayarlana bilmir.</translation> <translation id="8013436988911883588">Chromium'un giriş imkanı olduqda veb saytlar giriş üçün Sizdən icazə istəyəcək.</translation> +<translation id="8045118833343856403">Aşağıdakı hesablar heç bir Chromium profilinə daxil olmayıb. Başqa bir profildə hesab istifadə etmək istəyirsinizsə, əvvəlcə həmin profili silin.</translation> <translation id="81770708095080097">Bu fayl təklükəlidir, bu səbəbdən Chromium onu blok etdi.</translation> <translation id="8248265253516264921">Şəklin təsviri faydalı deyilsə, Chromium Sizin üçün təsviri təmin etməyə çalışacaq. Təsvir yaratmaq üçün şəkillər Google'a göndərilir. Bunu istənilən vaxt ayarlardan deaktiv edə bilərsiniz.</translation> <translation id="8266560134891435528">Hesaba daxil olmadığınız üçün Chromium parollarınızı yoxlaya bilmir</translation>
diff --git a/chrome/app/resources/chromium_strings_gl.xtb b/chrome/app/resources/chromium_strings_gl.xtb index 9ce97f5..991b529 100644 --- a/chrome/app/resources/chromium_strings_gl.xtb +++ b/chrome/app/resources/chromium_strings_gl.xtb
@@ -257,6 +257,7 @@ <translation id="7937630085815544518">Iniciaches sesión en Chromium como <ph name="USER_EMAIL_ADDRESS" />. Utiliza a mesma conta para iniciar sesión de novo.</translation> <translation id="7975919845073681630">Esta é unha instalación secundaria de Chromium e non se pode converter no teu navegador predeterminado.</translation> <translation id="8013436988911883588">Unha vez que Chromium teña acceso, os sitios web poderán solicitalo tamén.</translation> +<translation id="8045118833343856403">As seguintes contas non teñen a sesión iniciada en ningún perfil de Chromium. Se queres usar unha conta noutro perfil, primeiro elimina ese perfil.</translation> <translation id="81770708095080097">Este ficheiro é perigoso, así que Chromium bloqueouno.</translation> <translation id="8248265253516264921">Se unha imaxe non ten unha descrición útil, Chromium tentará proporcionarche unha. Para crear descricións, envíanse imaxes a Google. Podes desactivar esta función na configuración cando queiras.</translation> <translation id="8266560134891435528">Chromium non puido comprobar os teus contrasinais porque non iniciaches sesión</translation>
diff --git a/chrome/app/resources/chromium_strings_ml.xtb b/chrome/app/resources/chromium_strings_ml.xtb index a0e5d9d..23c78ba 100644 --- a/chrome/app/resources/chromium_strings_ml.xtb +++ b/chrome/app/resources/chromium_strings_ml.xtb
@@ -258,6 +258,7 @@ <translation id="7937630085815544518">Chromium-ൽ നിങ്ങൾ <ph name="USER_EMAIL_ADDRESS" /> എന്നായി സൈൻ ഇൻ ചെയ്തു. വീണ്ടും സൈൻ ഇൻ ചെയ്യുന്നതിന് സമാന അക്കൗണ്ട് ഉപയോഗിക്കുക.</translation> <translation id="7975919845073681630">ഇത് Chromium-ത്തിന്റെ ദ്വിതീയ ഇൻസ്റ്റലേഷനായതിനാൽ, നിങ്ങളുടെ ഡിഫോൾട്ട് ബ്രൗസറാക്കാൻ കഴിയില്ല.</translation> <translation id="8013436988911883588">Chromium-ത്തിന് ആക്സസ് ലഭിച്ചുകഴിഞ്ഞാൽ, വെബ്സൈറ്റുകൾക്ക് നിങ്ങളോട് ആക്സസ് ചോദിക്കാനാകും.</translation> +<translation id="8045118833343856403">ഇനിപ്പറയുന്ന അക്കൗണ്ടുകൾ ഏതെങ്കിലും Chromium പ്രൊഫൈലുകളിലേക്ക് സൈൻ ഇൻ ചെയ്തിട്ടില്ല. നിങ്ങൾക്ക് മറ്റൊരു പ്രൊഫൈലിൽ അക്കൗണ്ട് ഉപയോഗിക്കാൻ താൽപ്പര്യമുണ്ടെങ്കിൽ, ആദ്യം ആ പ്രൊഫൈൽ നീക്കം ചെയ്യുക.</translation> <translation id="81770708095080097">ഈ ഫയൽ അപകടകരമായതിനാൽ Chromium ഇതിനെ ബ്ലോക്കുചെയ്തു.</translation> <translation id="8248265253516264921">ചിത്രത്തിൽ ഉപകാരപ്രദമായ വിവരണമില്ലെങ്കിൽ നിങ്ങൾക്കായി ഒരു വിവരണം നൽകാൻ Chromium ശ്രമിക്കും. വിവരണങ്ങൾ സൃഷ്ടിക്കാൻ, ചിത്രങ്ങൾ Google-ലേക്ക് അയയ്ക്കുന്നു. ഏതുസമയത്തും ക്രമീകരണത്തിൽ നിങ്ങൾക്കിത് ഓഫാക്കാം.</translation> <translation id="8266560134891435528">നിങ്ങൾ സൈൻ ഇൻ ചെയ്തിട്ടില്ലാത്തതിനാൽ Chromium-ന് നിങ്ങളുടെ പാസ്വേഡുകൾ പരിശോധിക്കാനാവില്ല</translation>
diff --git a/chrome/app/resources/chromium_strings_mr.xtb b/chrome/app/resources/chromium_strings_mr.xtb index 21c3a18..9c8417e 100644 --- a/chrome/app/resources/chromium_strings_mr.xtb +++ b/chrome/app/resources/chromium_strings_mr.xtb
@@ -173,7 +173,7 @@ <ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />एक शेवटचा रिमाइंडर: इंस्टॉलेशन तुमची संपूर्ण हार्ड ड्राइव्ह मिटवेल. कृपया तुमच्यासाठी महत्त्वाच्या असलेल्या डेटाचा तुम्ही बॅकअप घेतला असल्याची खात्री करा.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />इंस्टॉलेशन सुरू झाल्यावर ते रद्द करता येऊ शकत नाही.<ph name="END_PARAGRAPH3" /></translation> -<translation id="6183079672144801177">तुम्ही तुमच्या <ph name="TARGET_DEVICE_NAME" /> वर Chromium मध्ये साइन इन केले असल्याची खात्री करा आणि त्यानंतर पुन्हा पाठवून पाहा.</translation> +<translation id="6183079672144801177">तुम्ही तुमच्या <ph name="TARGET_DEVICE_NAME" /> वर Chromium मध्ये साइन इन केले असल्याची खात्री करा आणि त्यानंतर पुन्हा पाठवून पहा.</translation> <translation id="6212496753309875659">या कॉंप्युटरवर आधीपासून Chromium ची अगदी अलीकडील आवृत्ती आहे. सॉफ्टवेअर काम करत नसल्यास, कृपया Chromium अनइंस्टॉल करा आणि पुन्हा प्रयत्न करा.</translation> <translation id="6219195342503754812">{0,plural, =0{Chromium आता पुन्हा लाँच होईल}=1{Chromium एका सेकंदामध्ये पुन्हा लाँच होईल}other{Chromium # सेकंदांमध्ये पुन्हा लाँच होईल}}</translation> <translation id="6248213926982192922">Chromium ला डीफॉल्ट ब्राउझर बनवा</translation> @@ -237,7 +237,7 @@ <translation id="7549178288319965365">Chromium OS बद्दल</translation> <translation id="7561906087460245826">तसेच Chromium (<ph name="URL" />) वरील डेटा साफ करा</translation> <translation id="7585853947355360626">या पेजवर सेटिंग दिसत नसल्यास, तुमच्या <ph name="LINK_BEGIN" /> - Chromium OS सेटिंग्ज<ph name="LINK_END" /> मध्ये पाहा</translation> + Chromium OS सेटिंग्ज<ph name="LINK_END" /> मध्ये पहा</translation> <translation id="761356813943268536">Chromium तुमचा कॅमेरा आणि मायक्रोफोन वापरत आहे.</translation> <translation id="7617377681829253106">Chromium आता उत्कृष्ट झाले आहे</translation> <translation id="7627575518938382525"><ph name="BEGIN_PARAGRAPH1" />आम्ही सुरुवात करण्यापूर्वी, कृपया तुमच्याकडे तुमच्या डेटाचा अप टू डेट बॅकअप असल्याची खात्री करा. Chromium OS इंस्टॉल केल्याने, तुमच्या हार्ड ड्राइव्हवरील सर्व डेटा ओव्हरराइट केला जाईल.<ph name="END_PARAGRAPH1" /> @@ -257,6 +257,7 @@ <translation id="7937630085815544518">तुम्ही <ph name="USER_EMAIL_ADDRESS" /> या रुपात Chromium मध्ये साइन इन केले होते. कृपया पुन्हा साइन इन करण्यासाठी समान खाते वापरा.</translation> <translation id="7975919845073681630">ही Chromium ची दुय्यम स्थापना असून त्यास तुमचा डीफॉल्ट ब्राउझर बनवू शकत नाही.</translation> <translation id="8013436988911883588">एकदा का Chromium ला ॲक्सेस मिळाला की, वेबसाइट तुम्हाला ॲक्सेससाठी विचारू शकतील.</translation> +<translation id="8045118833343856403">पुढील खात्यांनी कोणत्याही Chromium प्रोफाइलमध्ये साइन इन केलेले नाही. तुम्हाला दुसऱ्या प्रोफाइलमध्ये एखादे खाते वापरायचे असल्यास, सर्वप्रथम ती प्रोफाइल काढून टाका.</translation> <translation id="81770708095080097">ही फाईल धोकादायक आहे, त्यामुळे Chromium ने अवरोधित केली आहे.</translation> <translation id="8248265253516264921">इमेजचे उपयोगी वर्णन नसल्यास, Chromium तुमच्यासाठी ते देण्याचा प्रयत्न करेल. वर्णने तयार करण्यासाठी, इमेज Google ला पाठवल्या जातात. तुम्ही हे सेटिंग्जमध्ये कधीही बंद करू शकता.</translation> <translation id="8266560134891435528">तुम्ही साइन इन केलेले नसल्यामुळे Chromium तुमचे पासवर्ड तपासू शकत नाही</translation>
diff --git a/chrome/app/resources/chromium_strings_ne.xtb b/chrome/app/resources/chromium_strings_ne.xtb index e8df7fb..bf5325be 100644 --- a/chrome/app/resources/chromium_strings_ne.xtb +++ b/chrome/app/resources/chromium_strings_ne.xtb
@@ -256,6 +256,7 @@ <translation id="7937630085815544518">तपाईंलाई Chromium मा <ph name="USER_EMAIL_ADDRESS" /> को रूपमा साइन इन गरिएको थियो। कृपया फेरि साइन इन गर्न यही खाता प्रयोग गर्नुहोस्।</translation> <translation id="7975919845073681630">यो Chromium को एउटा सहायक स्थापना हो र यसलाई तपाईँको डिफल्ट ब्राउजर बनाउन सकिँदैन।</translation> <translation id="8013436988911883588">Chromium ले पहुँच प्राप्त गरेपछि, वेबसाइटहरू तपाईंसँग पहुँच माग्न सक्ने छन्।</translation> +<translation id="8045118833343856403">निम्न खाताहरू कुनै पनि Chromium प्रोफाइलमा साइन इन गरिएका छैनन्। तपाईं कुनै खाता अर्को कुनै प्रोफाइलमा प्रयोग गर्न चाहनुहुन्छ भने पहिले उक्त प्रोफाइल हटाउनुहोस्।</translation> <translation id="81770708095080097">यो फाइल खतरनाक छ, त्यसैले Chromium ले यसमाथि रोक लगाएको छ।</translation> <translation id="8248265253516264921">कुनै छविमा उपयोगी विवरण नभएका खण्डमा Chromium ले तपाईंलाई एउटा विवरण उपलब्ध गराउने प्रयास गर्ने छ। विवरणहरू सिर्जना गर्न फोटो Google मा पठाइन्छ। तपाईं सेटिङहरूमा गई जुनसुकै बेला यसलाई निष्क्रिय पार्न सक्नुहुन्छ।</translation> <translation id="8266560134891435528">तपाईं साइन इन नहुनुभएकाले Chromium ले तपाईंका पासवर्डहरूको जाँच गर्न सकेन</translation>
diff --git a/chrome/app/resources/chromium_strings_pa.xtb b/chrome/app/resources/chromium_strings_pa.xtb index 60e509d..fa2a648 100644 --- a/chrome/app/resources/chromium_strings_pa.xtb +++ b/chrome/app/resources/chromium_strings_pa.xtb
@@ -258,6 +258,7 @@ <translation id="7937630085815544518">ਤੁਸੀਂ <ph name="USER_EMAIL_ADDRESS" /> ਵਜੋਂ Chromium 'ਤੇ ਸਾਈਨ-ਇਨ ਕੀਤਾ ਸੀ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਸਾਈਨ-ਇਨ ਕਰਨ ਲਈ ਓਹੀ ਖਾਤਾ ਵਰਤੋ।</translation> <translation id="7975919845073681630">ਇਹ Chromium ਦੀ ਇੱਕ ਸੈਕੰਡਰੀ ਸਥਾਪਨਾ ਹੈ, ਅਤੇ ਇਸਨੂੰ ਤੁਹਾਡਾ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਬ੍ਰਾਊਜ਼ਰ ਨਹੀਂ ਬਣਾਇਆ ਜਾ ਸਕਦਾ ਹੈ।</translation> <translation id="8013436988911883588">Chromium ਤੱਕ ਪਹੁੰਚ ਹੋਣ 'ਤੇ, ਵੈੱਬਸਾਈਟਾਂ ਤੁਹਾਨੂੰ ਪਹੁੰਚ ਲਈ ਪੁੱਛ ਸਕਣਗੀਆਂ।</translation> +<translation id="8045118833343856403">ਅੱਗੇ ਦਿੱਤੇ ਖਾਤਿਆਂ ਨੇ ਕਿਸੇ ਵੀ Chromium ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ ਸਾਈਨ-ਇਨ ਨਹੀਂ ਕੀਤਾ ਹੋਇਆ। ਜੇ ਤੁਸੀਂ ਕਿਸੇ ਹੋਰ ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ ਖਾਤਾ ਵਰਤਣਾ ਚਾਹੁੰਦੇ ਹੋ, ਤਾਂ ਪਹਿਲਾਂ ਉਸ ਪ੍ਰੋਫਾਈਲ ਨੂੰ ਹਟਾਓ।</translation> <translation id="81770708095080097">ਇਹ ਫ਼ਾਈਲ ਖਤਰਨਾਕ ਹੈ, ਇਸ ਲਈ Chromium ਨੇ ਇਸਨੂੰ ਬਲੌਕ ਕਰ ਦਿੱਤਾ ਹੈ।</translation> <translation id="8248265253516264921">ਜੇ ਕਿਸੇ ਚਿੱਤਰ ਦਾ ਲਾਭਕਾਰੀ ਵਰਣਨ ਨਹੀਂ ਹੈ, ਤਾਂ Chromium ਤੁਹਾਡੇ ਲਈ ਇੱਕ ਵਰਣਨ ਮੁਹੱਈਆ ਕਰਵਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੇਗਾ। ਵਰਣਨ ਬਣਾਉਣ ਲਈ, ਚਿੱਤਰ Google ਨੂੰ ਭੇਜੇ ਜਾਂਦੇ ਹਨ। ਤੁਸੀਂ ਕਿਸੇ ਵੇਲੇ ਵੀ ਇਸਨੂੰ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਬੰਦ ਕਰ ਸਕਦੇ ਹੋ।</translation> <translation id="8266560134891435528">Chromium ਤੁਹਾਡੇ ਪਾਸਵਰਡਾਂ ਦੀ ਜਾਂਚ ਨਹੀਂ ਕਰ ਸਕਦਾ ਕਿਉਂਕਿ ਤੁਸੀਂ ਸਾਈਨ-ਇਨ ਨਹੀਂ ਕੀਤਾ ਹੈ</translation>
diff --git a/chrome/app/resources/chromium_strings_ur.xtb b/chrome/app/resources/chromium_strings_ur.xtb index 9b4e27f8..75f1953 100644 --- a/chrome/app/resources/chromium_strings_ur.xtb +++ b/chrome/app/resources/chromium_strings_ur.xtb
@@ -257,6 +257,7 @@ <translation id="7937630085815544518">آپ Chromium میں بطور <ph name="USER_EMAIL_ADDRESS" /> سائن ان تھے۔ براہ کرم دوبارہ سائن ان کرنے کیلئے وہی اکاؤنٹ استعمال کریں۔</translation> <translation id="7975919845073681630">یہ Chromium کا ثانوی انسٹالیشن ہے اور اسے آپ کا ڈیفالٹ براؤزر نہیں بنایا جا سکتا ہے۔</translation> <translation id="8013436988911883588">Chromium کو رسائی مل جانے کے بعد، ویب سائٹس آپ سے رسائی طلب کر سکیں گی۔</translation> +<translation id="8045118833343856403">درج ذیل اکاؤنٹس کسی Chromium پروفائل میں سائن ان نہیں ہیں۔ اگر آپ کسی دوسری پروفائل میں اکاؤنٹ استعمال کرنا چاہتے ہیں تو پہلے اس پروفائل کو ہٹا دیں۔</translation> <translation id="81770708095080097">یہ فائل خطرناک ہے، اس لیے Chromium نے اسے مسدود کر دیا ہے۔</translation> <translation id="8248265253516264921">اگر کسی تصویر میں مفید تفصیل موجود نہیں ہے تو Chromium آپ کے لیے تفصیل فراہم کرنے کی کوشش کرے گا۔ تفصیلات تخلیق کرنے کے لیے، تصاویر Google کو بھیجی جاتی ہیں۔ آپ اسے ترتیبات میں کسی بھی وقت آف کر سکتے ہیں۔</translation> <translation id="8266560134891435528">Chromium آپ کے پاس ورڈز چیک نہیں کر سکتا کیونکہ آپ سائن ان نہیں ہیں</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-HK.xtb b/chrome/app/resources/chromium_strings_zh-HK.xtb index 180480e..ba27409 100644 --- a/chrome/app/resources/chromium_strings_zh-HK.xtb +++ b/chrome/app/resources/chromium_strings_zh-HK.xtb
@@ -256,7 +256,7 @@ <translation id="7937630085815544518">您使用了 <ph name="USER_EMAIL_ADDRESS" /> 的身分登入 Chromium,請使用相同帳戶重新登入。</translation> <translation id="7975919845073681630">這是以並行形式安裝的第二個 Chromium,因此無法設定為您的預設瀏覽器。</translation> <translation id="8013436988911883588">Chromium 獲得存取權後,網站便可向您要求存取權。</translation> -<translation id="8045118833343856403">下列帳戶未登入任何 Chromium 設定檔。如要將帳戶用於其他設定檔,請先移除該設定檔。</translation> +<translation id="8045118833343856403">以下帳戶並登入任何 Chromium 設定檔。如要將帳戶用於其他設定檔,請先移除該設定檔。</translation> <translation id="81770708095080097">此檔案不安全,因此 Chromium 已封鎖此檔案。</translation> <translation id="8248265253516264921">如果圖片並無有用的說明,Chromium 會嘗試為您提供說明。因此,圖片將傳送至 Google 以建立說明。您可以隨時在設定中關閉此功能。</translation> <translation id="8266560134891435528">由於您尚未登入帳戶,因此 Chromium 無法檢查密碼</translation>
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb index c6e8b2c..6b73542 100644 --- a/chrome/app/resources/generated_resources_af.xtb +++ b/chrome/app/resources/generated_resources_af.xtb
@@ -2325,6 +2325,7 @@ <translation id="3432227430032737297">Verwyder alles wat gewys word</translation> <translation id="3432762828853624962">Gedeelde werkers</translation> <translation id="3433621910545056227">Oeps! Die stelsel kon nie die toestel se kenmerkeslot by installering vasmaak nie.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">As die bykomende Web- en Programaktiwiteit-instelling vir jou kind aangeskakel is, kan hierdie data in hul Google-rekening gestoor word. Kom by families.google.com meer te wete oor hierdie instellings en hoe om hulle te verstel.</translation> <translation id="3435541101098866721">Voeg nuwe foon by</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" versoek tans jou <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 61b2951..ec20610 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -2319,6 +2319,7 @@ <translation id="3432227430032737297">ሁሉም የታዩትን አስወግድ</translation> <translation id="3432762828853624962">የተጋሩ ሠራተኞች</translation> <translation id="3433621910545056227">ውይ! ስርዓቱ የመሣሪያ ጭነት-ሰዓት አይነታዎች ቁልፉን መመስረት አልተሳካለትም።</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">የተጨማሪ የድር እና መተግበሪያ እንቅስቃሴ ቅንብር ለልጅዎ በርቶ ከሆነ ይህ ውሂብ ወደ የGoogle መለያቸው ሊቀመጥ ይችላል። families.google.com ላይ ስለእነዚህ ቅንብሮች እና እንዴት እነሱን ማስተካከል እንደሚችሉ የበለጠ ይረዱ።</translation> <translation id="3435541101098866721">አዲሰ ስልክ ያክሉ</translation> <translation id="3435688026795609344">«<ph name="EXTENSION_NAME" />» የእርስዎን <ph name="CODE_TYPE" /> እየጠየቀ ነው</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index 192b8c1af..2f7377c 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -2316,6 +2316,7 @@ <translation id="3432227430032737297">إزالة كل العناصر المعروضة</translation> <translation id="3432762828853624962">العمال المشتركون</translation> <translation id="3433621910545056227">عفوًا! تعذّر النظام في إنشاء قفل سمات وقت التثبيت بالجهاز.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">في حال تفعيل إعداد "النشاط الإضافي على الويب وفي التطبيقات" لحسابك الفرعي، قد يتم حفظ هذه البيانات في حسابك على Google. تعرّف على المزيد حول هذه الإعدادات وطريقة ضبطها من خلال families.google.com.</translation> <translation id="3435541101098866721">إضافة هاتف جديد</translation> <translation id="3435688026795609344">تطلب الإضافة "<ph name="EXTENSION_NAME" />" الرمز <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb index 3982de6..7ffcb97 100644 --- a/chrome/app/resources/generated_resources_as.xtb +++ b/chrome/app/resources/generated_resources_as.xtb
@@ -2319,6 +2319,7 @@ <translation id="3432227430032737297">দেখুওৱা সকলো আঁতৰাওক</translation> <translation id="3432762828853624962">শ্বেয়াৰ কৰা ৱৰ্কাৰ</translation> <translation id="3433621910545056227">আমি দুঃখিত! ছিষ্টেমটোৱে ডিভাইচটোৰ ইনষ্টলেশ্বনৰ সময়ৰ এট্রিবিউট লক স্থাপন কৰিব নোৱাৰিলে।</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">যদি আপোনাৰ শিশুৰ বাবে অতিৰিক্ত ৱেব আৰু এপৰ কার্যকলাপ অন কৰা হয়, তেন্তে এই ডেটা তেওঁৰ Google একাউণ্টত ছেভ কৰা হ’ব পাৰে। এই ছেটিংসমূহৰ বিষয়ে আৰু সেইবোৰ কেনেদৰে মিলাব পাৰি সেই বিষয়ে জানিবলৈ families.google.comলৈ যাওক।</translation> <translation id="3435541101098866721">নতুন ফ’ন যোগ দিয়ক</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />"এ আপোনাৰ <ph name="CODE_TYPE" />ৰ বাবে অনুৰোধ কৰিছে</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index a17e3c58..b73bc0b 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -157,6 +157,7 @@ <translation id="1165039591588034296">Xəta</translation> <translation id="1166212789817575481">Sağ panelləri bağlayın</translation> <translation id="1166583374608765787">Ad güncəlləməsini nəzərdən keçirin</translation> +<translation id="1166596238782048887"><ph name="TAB_TITLE" /> <ph name="DESK_TITLE" /> masasına aiddir</translation> <translation id="1168020859489941584"><ph name="TIME_REMAINING" /> ərzində açılır...</translation> <translation id="1170288591054440704">Sayt cihazınızda quraşdırılmış şriftləri istifadə etmək istədikdə soruşun</translation> <translation id="1171135284592304528">Dəyişiklik olduqda, klaviatura fokusu ilə obyekti vurğulayın</translation> @@ -613,6 +614,7 @@ <translation id="1640235262200048077"><ph name="IME_NAME" /> hələ Linux tətbiqlərində işləmir</translation> <translation id="1640283014264083726">PKCS #1 MD4 RSA Şifrələmə ilə</translation> <translation id="1641113438599504367">Təhlükəsiz Axtarış</translation> +<translation id="1642492862748815878"><ph name="DEVICE" /> və digər <ph name="NUMBER_OF_DEVICES" /> Bluetooth cihazına qoşulub</translation> <translation id="1642494467033190216">Digər debaq funksiyalarını aktiv etmədən öncə kök qorunmasının silinməsi və yenidən başlanma tələb olunur.</translation> <translation id="1643072738649235303">X9.62 ECDSA SHA-1 ilə imza</translation> <translation id="1643921258693943800">Yaxınlıqda Paylaşımdan istifadə etmək üçün Bluetooth və Wi-Fi'ın aktiv edin</translation> @@ -1818,6 +1820,7 @@ <translation id="2885378588091291677">Tapşırıq Meneceri</translation> <translation id="2885729872133513017">Server cavabının şifrəsi açılarkən xəta baş verdi.</translation> <translation id="2886771036282400576">• <ph name="PERMISSION" /></translation> +<translation id="288734198558082692"><ph name="DEVICE" /> və digər <ph name="NUMBER_OF_DEVICES" /> cihaz</translation> <translation id="2889064240420137087">Linki bununla açın:</translation> <translation id="2891922230654533301"><ph name="APP_NAME" /> tətbiqinə daxil olmaq üçün cihazınız istifadə edilsin?</translation> <translation id="2893168226686371498">Defolt brauzer</translation> @@ -2305,6 +2308,7 @@ <translation id="3432227430032737297">Bütün Göstərilənləri Silin</translation> <translation id="3432762828853624962">Birgə İşləyənlər</translation> <translation id="3433621910545056227">Sistem cihaz quraşdırma vaxtının atribut kilidini yarada bilmədi.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Uşağınız üçün əlavə Veb və Tətbiq Fəaliyyəti ayarı aktiv edilərsə, bu data onun Google Hesabında yadda saxlanıla bilər. families.google.com ünvanında bu ayarlar və onları tənzimləmək haqqında ətraflı məlumat əldə edin.</translation> <translation id="3435541101098866721">Yeni telefon əlavə edin</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" <ph name="CODE_TYPE" /> tələb edir</translation> @@ -2752,6 +2756,7 @@ <translation id="3884152383786131369">Bir neçə dildə əlçatan veb məzmun siyahıdakı ilk dəstəklənən dili istifadə edəcək. Bu tərcihlər brauzer ayarlarınızla sinxronlaşdırılır. <ph name="BEGIN_LINK_LEARN_MORE" />Ətraflı məlumat<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3885112598747515383">Güncəlləmələr administratorunuz tərəfindən idarə edilir</translation> <translation id="3886446263141354045">Bu sayta giriş sorğunuz <ph name="NAME" /> ünvanına göndərilib</translation> +<translation id="3887022758415973389">Cihaz siyahısını göstərin</translation> <translation id="3888053818972567950"><ph name="WEB_DRIVE" /> Bağlantısı</translation> <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> ilə qeyd götürmə</translation> <translation id="3888586133700543064">Bu məlumat Assistent ilə bağlı problemləri daha yaxşı anlamağımıza kömək edir. Bu, 90 günə qədər saxlanılır. Müvafiq texniki və rəy komandaları üçün giriş məhduddur.</translation> @@ -3460,6 +3465,7 @@ <translation id="4662373422909645029">Ləqəbdə rəqəm olmamalıdır</translation> <translation id="4662788913887017617">Bu əlfəcini iPhone ilə paylaşın</translation> <translation id="4663373278480897665">Kameraya icazə verildi</translation> +<translation id="4664289193573249666">Chrome OS ayarlarında güvənli DNS'i idarə edin</translation> <translation id="4664482161435122549">PKCS #12 Eksport Xətası</translation> <translation id="4665014895760275686">İstehsalçı</translation> <translation id="4665446389743427678"><ph name="SITE" /> tərəfindən saxlanılan bütün data silinəcək.</translation> @@ -5990,6 +5996,7 @@ <translation id="7478623944308207463">Tətbiqlər və ayarlarınız Google hesabınız ilə daxil olduğunuz bütün Chrome ƏS cihazlarında sinxronlaşdırılacaq. Brauzerin sinxronlaşdırma seçimləri üçün <ph name="LINK_BEGIN" />Chrome ayarları<ph name="LINK_END" /> bölməsinə keçin.</translation> <translation id="7478658909253570368">Saytlara ardıcıl portlara qoşulmaq icazəsi verməyin</translation> <translation id="7479221278376295180">Yaddaş İstifadəsi İcmalı</translation> +<translation id="747981547666531654"><ph name="FIRST_DEVICE" /> və <ph name="SECOND_DEVICE" /> adlı Bluetooth cihazlarına qoşulub</translation> <translation id="7481312909269577407">İrəli</translation> <translation id="7481358317100446445">Hazırdır</translation> <translation id="748138892655239008">Sertifikat əsas maneələr</translation> @@ -6042,6 +6049,7 @@ <translation id="7531771599742723865">İstifadədə olan cihaz</translation> <translation id="7531779363494549572">Ayarlar > Tətbiq və bildirişlər > Bildirişlər ünvanına daxil olun.</translation> <translation id="7532009420053991888"><ph name="LINUX_APP_NAME" /> cavab vermir. Tətbiqi bağlamaq üçün "Məcbur bağlayın" seçin.</translation> +<translation id="7535730537657706072">Cihazınızdan Anonim brauzer tarixçəsini təmizləmək üçün bütün Anonim tabları bağlayın</translation> <translation id="7535791657097741517">İşıqlı temanı aktiv edin</translation> <translation id="7537451260744431038">Saytlar baxış təcrübənizi yaxşılaşdırmaq üçün, məsələn, sizi daxil olmuş vəziyyətdə saxlamaq və ya alış-veriş səbətindəki elementləri yadda saxlamaq üçün kukilərdən istifadə edə bilmir</translation> <translation id="753769905878158714">Ünvan panelinə axtarmaq istədiyiniz veb saytın açar sözünü daxil edin. Sonra davam etmək üçün bir klaviatura qısayolundan istifadə edin.</translation> @@ -6657,6 +6665,7 @@ <translation id="8138217203226449454">Axtarış təminatçınızın dəyişməsini nəzərdə tuturdunuz?</translation> <translation id="8138997515734480534"><ph name="VM_NAME" /> statusu</translation> <translation id="8139447493436036221">Google Disk faylları</translation> +<translation id="8140070492745508800"><ph name="FIRST_DEVICE" />, <ph name="SECOND_DEVICE" /></translation> <translation id="8141584439523427891">İndi alternativ brauzerdə açılır</translation> <translation id="8141725884565838206">Parollarınızı idarə edin</translation> <translation id="814204052173971714">{COUNT,plural, =1{video}other{# video}}</translation> @@ -7369,6 +7378,7 @@ <translation id="8909782404367982052">Google Linza ilə şəkillər axtarmaq üçün sürüşdürün</translation> <translation id="8909833622202089127">Sayt məkanınızı izləyir</translation> <translation id="8910222113987937043">Əlfəcin, tarixçə, parol və digər ayarlarınızdakı dəyişikliklər artıq Google Hesabınıza sinxronizasiya olunmayacaq. Buna baxmayaraq, mövcud datanız Google hesabınızın yaddaşında qalacaq və <ph name="BEGIN_LINK" />Google İdarə Paneli<ph name="END_LINK" /> tərəfindən idarə oluna biləcək.</translation> +<translation id="8910987510378294980">Cihaz siyahısını gizlədin</translation> <translation id="8912362522468806198">Google Hesabı</translation> <translation id="8912793549644936705">Dartın</translation> <translation id="8912810933860534797">Avtomatik skanı aktiv edin</translation> @@ -7486,6 +7496,7 @@ <translation id="9033765790910064284">Yenə də davam edin</translation> <translation id="9033857511263905942">&Yerləşdirin</translation> <translation id="903480517321259405">PİN kodu yenidən yazın</translation> +<translation id="9037054491984310631"><ph name="DEVICE" /> adlı Bluetooth cihazına qoşulub</translation> <translation id="9037640663275993951">Cihaza icazə verilmir</translation> <translation id="9037818663270399707">Bağlantınız bütün şəbəkə trafiki üçün məxfi deyil</translation> <translation id="9037965129289936994">Orijinalı Göstərin</translation> @@ -7566,6 +7577,7 @@ <translation id="9112786533191410418"><ph name="FILE_NAME" /> təhlükəli ola bilər. Skanlamaq üçün Google'a göndərilsin?</translation> <translation id="9112987648460918699">Axtarın...</translation> <translation id="9113240369465613386">Yalnız tək səhifələr</translation> +<translation id="9113469270512809735">Son Bağlanan Elementləri Keçirin</translation> <translation id="9114663181201435112">Asanlıqla daxil olun</translation> <translation id="9115675100829699941">Əlfəcinlər</translation> <translation id="9116465289595958864">Son redaktə</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb index d84d0fe..ef78e47 100644 --- a/chrome/app/resources/generated_resources_be.xtb +++ b/chrome/app/resources/generated_resources_be.xtb
@@ -2312,6 +2312,7 @@ <translation id="3432227430032737297">Выдаліць усе паказаныя</translation> <translation id="3432762828853624962">Сумесныя рабочыя працэсы</translation> <translation id="3433621910545056227">Памылка. Сістэме не ўдалося заблакіраваць атрыбуты часу ўсталявання на прыладзе.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" /> %</translation> <translation id="3434272557872943250">Калі для вашага дзіцяці ўключана налада "Дадатковыя дзеянні ў інтэрнэце і праграмах", то адпаведныя даныя могуць захоўвацца ў яго Уліковым запісе Google. Даведацца больш пра гэтыя налады і іх рэгуліроўку можна на сайце families.google.com.</translation> <translation id="3435541101098866721">Дадаванне новага тэлефона</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" запытвае ў вас <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index 2a947847..5116342d 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -2321,6 +2321,7 @@ <translation id="3432227430032737297">Премахване на всички показани</translation> <translation id="3432762828853624962">Споделени изпълнители</translation> <translation id="3433621910545056227">Ами сега! Системата не успя да заключи атрибутите за времето за инсталиране за устройството.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Ако настройката „Допълнителна активност в мрежата и приложенията“ е включена за детето ви, тези данни може да се запазват в профила му в Google. На адрес families.google.com можете да научите повече за тези настройки и как да ги коригирате.</translation> <translation id="3435541101098866721">Добавяне на нов телефон</translation> <translation id="3435688026795609344"><ph name="EXTENSION_NAME" /> изисква вашия <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index 6de9e148..a0912eab 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -2322,6 +2322,7 @@ <translation id="3432227430032737297">দেখানো সবগুলি সরান</translation> <translation id="3432762828853624962">শেয়ার্ড ওয়ার্কার</translation> <translation id="3433621910545056227">ওহো! সিস্টেমটি ডিভাইস ইনস্টলেশন-সময় অ্যাট্রিবিউটস লক স্থাপন করতে ব্যর্থ হয়েছে৷</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">অতিরিক্ত 'ওয়েব ও অ্যাপ অ্যাক্টিভিটি' সেটিং আপনার সন্তানের ডিভাইসের জন্য চালু করা থাকলে, এই ডেটা তাদের Google অ্যাকাউন্টে সেভ করা হতে পারে। এই সেটিং এবং এটি কীভাবে অ্যাডজাস্ট করবেন সেই সম্পর্কে families.google.com লিঙ্কে গিয়ে আরও জানুন।</translation> <translation id="3435541101098866721">নতুন ফোন যুক্ত করুন </translation> <translation id="3435688026795609344">আপনার "<ph name="EXTENSION_NAME" />" <ph name="CODE_TYPE" /> এর অনুরোধ করছে</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index 0b834075..cd86676 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -2323,6 +2323,7 @@ <translation id="3432227430032737297">Ukloni sve prikazano</translation> <translation id="3432762828853624962">Dijeljeni radnici</translation> <translation id="3433621910545056227">Ups! Sistem nije uspio uspostaviti zaključavanje atributa za vrijeme instalacije na uređaju.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Ako je za vaše dijete uključena postavka za dodatnu Aktivnost na webu i u aplikacijama, ovi podaci mogu biti sačuvani na Google računu djeteta. Na stranici families.google.com saznajte više o ovim postavkama i kako ih prilagoditi.</translation> <translation id="3435541101098866721">Dodaj novi telefon</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" traži vaš <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index fb645fab..9286f0aa 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -2309,6 +2309,7 @@ <translation id="3432227430032737297">Suprimeix totes les que es mostren</translation> <translation id="3432762828853624962">Treballadors compartits</translation> <translation id="3433621910545056227">El sistema no ha pogut establir el bloqueig dels atributs del temps d'instal·lació del dispositiu.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Si l'opció Activitat al web i en aplicacions addicional està activada per al teu fill, és possible que aquestes dades es desin al seu Compte de Google. Per obtenir més informació sobre aquestes opcions de configuració i sobre com pots modificar-les, ves a families.google.com.</translation> <translation id="3435541101098866721">Afegeix un telèfon nou</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" sol·licita el teu codi <ph name="CODE_TYPE" /></translation> @@ -5385,7 +5386,7 @@ <translation id="6809470175540814047">Obre en una finestra d'incògnit</translation> <translation id="6809656734323672573">Si ho acceptes, l'Assistent de Google es quedarà en mode d'espera per detectar "Hey Google" i pot reconèixer la teva veu amb Voice Match. <ph name="BR" /> - Voice Match permet a l'Assistent identificar-te i distingir-te d'altres persones. L'Assistent grava fragments de la teva veu per crear un model de veu únic, que només s'emmagatzema al teu dispositiu. És possible que el teu model de veu s'enviï a Google temporalment per poder identificar millor la teva veu. + Voice Match permet a l'Assistent identificar-te i distingir-te d'altres persones. L'Assistent utilitza clips de la teva veu per crear un model de veu únic, que només s'emmagatzema al teu dispositiu. És possible que el teu model de veu s'enviï a Google temporalment per poder identificar millor la teva veu. <ph name="BR" /> Si més tard decideixes que no t'agrada Voice Match, pots suprimir-lo a la configuració de l'Assistent. Per veure o suprimir els clips d'àudio que graves durant la configuració de Voice Match, ves a <ph name="VOICE_MATCH_SETTINGS_URL" />. <ph name="BR" />
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index 59228d40..a9b1938 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -2310,6 +2310,7 @@ <translation id="3432227430032737297">Odstranit všechny zobrazené</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">Jejda! Systému se nepodařilo nastavit zámek atributů installation-time zařízení.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" /> %</translation> <translation id="3434272557872943250">Pokud má dítě zapnuté dodatečné nastavení Aktivita na webu a v aplikacích, mohou se tato data ukládat do jeho účtu Google. Další informace o těchto nastaveních a o tom, jak je upravit, naleznete na stránce families.google.com.</translation> <translation id="3435541101098866721">Přidat nový telefon</translation> <translation id="3435688026795609344">Rozšíření <ph name="EXTENSION_NAME" /> požaduje váš kód <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index 24351947c..d381d43 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -2326,6 +2326,7 @@ <translation id="3432227430032737297">Fjern alle viste</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">Ups! Systemet kunne ikke fastslå indstallationstidspunktet for enhedens attributlås.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" /> %</translation> <translation id="3434272557872943250">Hvis indstillingen for yderligere web- og appaktivitet er aktiveret for dit barn, gemmes disse data muligvis på barnets Google-konto. Få flere oplysninger om disse indstillinger og om, hvordan du ændrer dem, ved at gå til families.google.com.</translation> <translation id="3435541101098866721">Tilføj ny telefon</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" anmoder om <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index 813d745..06d7b0b8 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -2304,6 +2304,7 @@ <translation id="3432227430032737297">Alle angezeigten Cookies entfernen</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">Hoppla! Das System konnte die Attributsperre für die Installationszeit des Geräts nicht einrichten.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" /> %</translation> <translation id="3434272557872943250">Wenn die Einstellung "Zusätzliche Web- & App-Aktivitäten" für Ihr Kind aktiviert ist, werden diese Daten möglicherweise in seinem Google-Konto gespeichert. Unter families.google.com finden Sie weitere Informationen zu dieser Einstellung. Dort erfahren Sie auch, wie Sie sie ändern können.</translation> <translation id="3435541101098866721">Neue Telefonnummer hinzufügen</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" fordert Ihren <ph name="CODE_TYPE" /> an.</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index a8040c9e..e62c971 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -2325,6 +2325,7 @@ <translation id="3432227430032737297">Κατάργηση όλων όσων εμφανίζονται</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">Ωχ! Το σύστημα απέτυχε να εφαρμόσει το κλείδωμα χρόνου εγκατάστασης χαρακτηριστικών.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Εάν είναι ενεργή η ρύθμιση της πρόσθετης Δραστηριότητας ιστού και εφαρμογών για το παιδί σας, αυτά τα δεδομένα μπορεί να αποθηκευτούν στον Λογαριασμό του Google. Μάθετε περισσότερα σχετικά με αυτές τις ρυθμίσεις και τον τρόπο με τον οποίο μπορείτε να τις προσαρμόσετε στη διεύθυνση families.google.com.</translation> <translation id="3435541101098866721">Προσθήκη νέου τηλεφώνου</translation> <translation id="3435688026795609344">Η επέκταση "<ph name="EXTENSION_NAME" />" ζητά το <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index 3165113..0391dabf 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -2325,6 +2325,7 @@ <translation id="3432227430032737297">Remove all shown</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">Oops! The system failed to establish the device installation-time attributes lock.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">If additional Web & App Activity setting is turned on for your child, this data may be saved to their Google Account. Find out more about these settings and how to adjust them at families.google.com.</translation> <translation id="3435541101098866721">Add new phone</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" is requesting your <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index f3a8177..ddf078b 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -2307,6 +2307,7 @@ <translation id="3432227430032737297">Quitar todo lo que se muestra</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">El sistema no pudo establecer el bloqueo de atributos del tiempo de instalación del dispositivo.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Si habilitaste la Actividad de web y de aplicaciones adicional en la Cuenta de Google de tu hijo, es posible que se almacenen estos datos en esa cuenta. Para obtener más información sobre esta configuración y cómo ajustarla, accede a families.google.com.</translation> <translation id="3435541101098866721">Agregar nuevo teléfono</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" solicita tu <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index dac679d..1b9b0dd 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -2310,6 +2310,7 @@ <translation id="3432227430032737297">Quitar todas las que se muestran</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">¡Vaya! El sistema no ha podido establecer el bloqueo de atributos del tiempo de instalación del dispositivo.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Si la opción Actividad en la Web y en Aplicaciones Adicional está activada, es posible que estos datos se guarden en la cuenta de Google de tu hijo. Consulta más información sobre estos ajustes y cómo configurarlos en families.google.com.</translation> <translation id="3435541101098866721">Añadir nuevo teléfono</translation> <translation id="3435688026795609344"><ph name="EXTENSION_NAME" /> está solicitando tu <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 699f1e04..e7f6efc 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -2316,6 +2316,7 @@ <translation id="3432227430032737297">Eemalda kõik kuvatud</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">Vabandust! Süsteemil ei õnnestunud määrata seadme installiaegsete atribuutide lukustust.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Kui täiendavad veebi- ja rakendustegevused on teie lapse jaoks sisse lülitatud, võidakse need andmed salvestada tema Google'i kontole. Seadete ja nende kohandamise kohta leiate lisateavet saidilt families.google.com.</translation> <translation id="3435541101098866721">Lisa uus telefon</translation> <translation id="3435688026795609344">„<ph name="EXTENSION_NAME" />” taotleb koodi <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb index 1881640..df54085b 100644 --- a/chrome/app/resources/generated_resources_eu.xtb +++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -2309,6 +2309,7 @@ <translation id="3432227430032737297">Kendu erakutsitako guztiak</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">Sistemak ezin izan du ezarri gailuaren instalazio-atributuen blokeoa.</translation> +<translation id="3434107140712555581">% <ph name="BATTERY_PERCENTAGE" /></translation> <translation id="3434272557872943250">Haurraren kontuko Sareko eta aplikazioetako jarduera gehigarriak ezarpena aktibatuta badago, baliteke datu horiek haren Google-ko kontuan gordetzea. Lortu ezarpen horiei buruzko informazio gehiago eta ikasi haiek doitzen families.google.com helbidean.</translation> <translation id="3435541101098866721">Gehitu telefono bat</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" luzapenak <ph name="CODE_TYPE" /> kodea eskatu du</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index 53886dc9..015e9ca5 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -2322,6 +2322,7 @@ <translation id="3432227430032737297">حذف همه موارد نشان دادهشده</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">اوه! این سیستم نتوانست قفل ویژگیهای زمان نصب دستگاه را ایجاد کند.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />٪</translation> <translation id="3434272557872943250">اگر تنظیم «فعالیت وب و برنامه» تکمیلی برای فرزندتان روشن باشد، ممکن است این دادهها در «حساب Google» او ذخیره شود. در families.google.com، درباره این تنظیمات و نحوه تغییر آنها بیشتر بدانید.</translation> <translation id="3435541101098866721">افزودن تلفن جدید</translation> <translation id="3435688026795609344">«<ph name="EXTENSION_NAME" />» <ph name="CODE_TYPE" /> شما را درخواست میکند</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index d9f8d31..389fb3c 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -2324,6 +2324,7 @@ <translation id="3432227430032737297">Poista kaikki näytetyt</translation> <translation id="3432762828853624962">SharedWorkerit</translation> <translation id="3433621910545056227">Hups! Järjestelmä ei voi lukita laitteen asennuksen aikaisia attribuutteja.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" /> %</translation> <translation id="3434272557872943250">Jos muun verkko- ja sovellustoiminnan asetus on lapsella päällä, tätä dataa voidaan tallentaa hänen Google-tililleen. Lue lisää näistä asetuksista ja niiden muokkaamisesta osoitteesta families.google.com.</translation> <translation id="3435541101098866721">Lisää uusi puhelin</translation> <translation id="3435688026795609344"><ph name="EXTENSION_NAME" /> pyytää kohdetta <ph name="CODE_TYPE" />.</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index eea639e..894ec79 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -2326,6 +2326,7 @@ <translation id="3432227430032737297">Alisin ang Lahat ng Ipinapakita</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">Naku! Nabigo ang system na itatag ang lock sa mga katangian sa oras ng pag-install.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Kung naka-on ang karagdagang setting ng Aktibidad sa Web at App para sa iyong anak, posibleng ma-save ang data na ito sa kanyang Google Account. Matuto pa tungkol sa mga setting na ito at kung paano isaayos ang mga ito sa families.google.com.</translation> <translation id="3435541101098866721">Magdagdag ng bagong telepono</translation> <translation id="3435688026795609344">Hinihiling ng "<ph name="EXTENSION_NAME" />" ang iyong <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb index f188a8d..432c65f 100644 --- a/chrome/app/resources/generated_resources_fr-CA.xtb +++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -2309,6 +2309,7 @@ <translation id="3432227430032737297">Supprimer tous les éléments affichés</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">Oups… Le système n'a pas réussi à établir le verrouillage des attributs du temps d'installation de l'appareil.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" /> %</translation> <translation id="3434272557872943250">Si le paramètre relatif aux autres activités sur le Web et dans les applications est activé pour votre enfant, ces données peuvent être enregistrées dans son compte Google. Pour en savoir plus sur ces paramètres ou pour découvrir comment les ajuster, rendez-vous sur families.google.com.</translation> <translation id="3435541101098866721">Ajouter un téléphone</translation> <translation id="3435688026795609344">« <ph name="EXTENSION_NAME" /> » demande votre <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index 2b1c8a9..48ac4ec 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -2311,6 +2311,7 @@ <translation id="3432227430032737297">Supprimer tous les cookies affichés</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">Petit problème… Le système n'a pas réussi à établir le verrouillage des attributs du temps d'installation de l'appareil.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" /> %</translation> <translation id="3434272557872943250">Si vous avez activé le paramètre "Activité supplémentaire sur le Web et les applications" pour votre enfant, ces données peuvent être enregistrées dans son compte Google. Découvrez plus en détail ces paramètres et comment les ajuster sur le site families.google.com.</translation> <translation id="3435541101098866721">Ajouter un nouveau téléphone</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" demande votre <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb index 28b68fc..799a9a1 100644 --- a/chrome/app/resources/generated_resources_gl.xtb +++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -159,6 +159,7 @@ <translation id="1165039591588034296">Erro</translation> <translation id="1166212789817575481">Pechar as pestanas situadas á dereita</translation> <translation id="1166583374608765787">Revisa o cambio do nome</translation> +<translation id="1166596238782048887"><ph name="TAB_TITLE" /> é do escritorio <ph name="DESK_TITLE" /></translation> <translation id="1168020859489941584">O ficheiro abrirase en <ph name="TIME_REMAINING" />...</translation> <translation id="1170288591054440704">Preguntar cando un sitio queira usar os tipos de letra que tes instalados no dispositivo</translation> <translation id="1171135284592304528">Destacar obxecto co enfoque do teclado cando cambie</translation> @@ -616,6 +617,7 @@ <translation id="1640235262200048077">Aínda non é compatible con aplicacións de Linux: <ph name="IME_NAME" /></translation> <translation id="1640283014264083726">PKCS #1 MD4 con cifrado RSA</translation> <translation id="1641113438599504367">Navegación segura</translation> +<translation id="1642492862748815878">Conexión establecida cos seguintes dispositivos Bluetooth: <ph name="DEVICE" /> e <ph name="NUMBER_OF_DEVICES" /> máis</translation> <translation id="1642494467033190216">Necesítase a eliminación e o reinicio da protección rootfs antes de activar outras funcións de depuración.</translation> <translation id="1643072738649235303">Sinatura X9.62 ECDSA con SHA-1</translation> <translation id="1643921258693943800">Para utilizar Compartir por Nearby, activa o Bluetooth e a wifi</translation> @@ -1818,6 +1820,7 @@ <translation id="2885378588091291677">Xestor de tarefas</translation> <translation id="2885729872133513017">Produciuse un problema ao descodificar a resposta do servidor.</translation> <translation id="2886771036282400576">• <ph name="PERMISSION" /></translation> +<translation id="288734198558082692"><ph name="DEVICE" /> e <ph name="NUMBER_OF_DEVICES" /> máis</translation> <translation id="2889064240420137087">Abrir ligazón con...</translation> <translation id="2891922230654533301">Queres utilizar o teu dispositivo para iniciar sesión en <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Navegador predeterminado</translation> @@ -2305,6 +2308,7 @@ <translation id="3432227430032737297">Eliminar todos os sitios mostrados</translation> <translation id="3432762828853624962">Traballadores compartidos</translation> <translation id="3433621910545056227">O sistema non puido establecer o bloqueo de atributos do tempo de instalación do dispositivo.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" /> %</translation> <translation id="3434272557872943250">Se está activada a opción de configuración Actividade web e das aplicacións adicional para o teu fillo, estes datos pódense gardar na súa Conta de Google Obtén máis información acerca desta opción de configuración e sobre como axustala en families.google.com.</translation> <translation id="3435541101098866721">Engadir un teléfono novo</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" solicita o teu <ph name="CODE_TYPE" /></translation> @@ -2752,6 +2756,7 @@ <translation id="3884152383786131369">No contido web que estean dispoñibles varios idiomas usarase o primeiro admitido da lista. Estas preferencias sincronízanse coa configuración do teu navegador. <ph name="BEGIN_LINK_LEARN_MORE" />Máis información<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3885112598747515383">O teu administrador xestiona as actualizacións</translation> <translation id="3886446263141354045">Enviouse a túa solicitude para acceder a este sitio a <ph name="NAME" /></translation> +<translation id="3887022758415973389">Mostrar lista de dispositivos</translation> <translation id="3888053818972567950">Conexión con <ph name="WEB_DRIVE" /></translation> <translation id="3888550877729210209">Tomar notas con <ph name="LOCK_SCREEN_APP_NAME" /></translation> <translation id="3888586133700543064">Esta información permítenos comprender mellor o problema do teu Asistente. Almacénase durante un máximo de 90 días e só poden acceder a ela os equipos adecuados de enxeñaría e de xestión de comentarios.</translation> @@ -3462,6 +3467,7 @@ <translation id="4662373422909645029">O alcume non pode ter números</translation> <translation id="4662788913887017617">Comparte este marcador co iPhone</translation> <translation id="4663373278480897665">Permítese a cámara</translation> +<translation id="4664289193573249666">Xestionar DNS seguro na configuración de Chrome OS</translation> <translation id="4664482161435122549">Erro de exportación de PKCS #12</translation> <translation id="4665014895760275686">Fabricante</translation> <translation id="4665446389743427678">Eliminaranse todos os datos almacenados por <ph name="SITE" />.</translation> @@ -5994,6 +6000,7 @@ <translation id="7478623944308207463">As túas aplicacións e opcións de configuración sincronizaranse en todos os dispositivos Chrome OS nos que teñas a sesión iniciada na túa Conta de Google. Para ver as opción de sincronización do navegador, accede á <ph name="LINK_BEGIN" />configuración de Chrome<ph name="LINK_END" />.</translation> <translation id="7478658909253570368">Non permitir que os sitios se conecten a portos en serie</translation> <translation id="7479221278376295180">Visión xeral do uso do almacenamento</translation> +<translation id="747981547666531654">Conexión establecida cos dispositivos Bluetooth chamados "<ph name="FIRST_DEVICE" />" e "<ph name="SECOND_DEVICE" />"</translation> <translation id="7481312909269577407">Adiante</translation> <translation id="7481358317100446445">Listo</translation> <translation id="748138892655239008">Restricións básicas do certificado</translation> @@ -6046,6 +6053,7 @@ <translation id="7531771599742723865">O dispositivo está en uso</translation> <translation id="7531779363494549572">Accede a Configuración > Aplicacións e notificacións > Notificacións.</translation> <translation id="7532009420053991888">A aplicación <ph name="LINUX_APP_NAME" /> non responde. Para pechala, selecciona Forzar peche.</translation> +<translation id="7535730537657706072">Para borrar o historial de navegación do modo de incógnito do dispositivo, pecha todas as pestanas que teñas abertas nese modo</translation> <translation id="7535791657097741517">Poñer tema claro</translation> <translation id="7537451260744431038">Os sitios non poden utilizar cookies para mellorar a túa experiencia de navegación a través de funcións como manter a sesión iniciada ou lembrar artigos da túa cesta da compra</translation> <translation id="753769905878158714">Na barra de enderezos, escribe a palabra clave do sitio web que queres buscar. Logo, utiliza un atallo de teclado para continuar.</translation> @@ -6661,6 +6669,7 @@ <translation id="8138217203226449454">Querías cambiar o provedor de busca?</translation> <translation id="8138997515734480534">Estado de <ph name="VM_NAME" /></translation> <translation id="8139447493436036221">Ficheiros de Google Drive</translation> +<translation id="8140070492745508800"><ph name="FIRST_DEVICE" /> e <ph name="SECOND_DEVICE" /></translation> <translation id="8141584439523427891">Abrindo nun navegador alternativo</translation> <translation id="8141725884565838206">Xestionar os teus contrasinais</translation> <translation id="814204052173971714">{COUNT,plural, =1{1 vídeo}other{# vídeos}}</translation> @@ -7375,6 +7384,7 @@ <translation id="8909782404367982052">Arrastrar para buscar imaxes con Google Lens</translation> <translation id="8909833622202089127">O sitio está facendo un seguimento da túa localización</translation> <translation id="8910222113987937043">Os cambios nos marcadores, no historial, nos contrasinais e noutras opcións de configuración deixarán de sincronizarse coa túa conta de Google. Non obstante, os teus datos actuais permanecerán almacenados na túa conta de Google e poden xestionarse a través do <ph name="BEGIN_LINK" />Panel de control de Google<ph name="END_LINK" />.</translation> +<translation id="8910987510378294980">Ocultar lista de dispositivos</translation> <translation id="8912362522468806198">Conta de Google</translation> <translation id="8912793549644936705">Estricar</translation> <translation id="8912810933860534797">Activar a exploración automática</translation> @@ -7492,6 +7502,7 @@ <translation id="9033765790910064284">Continuar igualmente</translation> <translation id="9033857511263905942">&Pegar</translation> <translation id="903480517321259405">Volve escribir o PIN</translation> +<translation id="9037054491984310631">Conexión establecida co dispositivo Bluetooth chamado "<ph name="DEVICE" />"</translation> <translation id="9037640663275993951">O dispositivo non está permitido</translation> <translation id="9037818663270399707">A túa conexión non é privada para todo o tráfico de rede</translation> <translation id="9037965129289936994">Mostrar orixinal</translation> @@ -7572,6 +7583,7 @@ <translation id="9112786533191410418">O ficheiro <ph name="FILE_NAME" /> pode ser perigoso. Queres enviarllo a Google para que o analice?</translation> <translation id="9112987648460918699">Buscar...</translation> <translation id="9113240369465613386">Só páxinas impares</translation> +<translation id="9113469270512809735">Ocultar ou mostrar elementos pechados recentemente</translation> <translation id="9114663181201435112">Iniciar sesión facilmente</translation> <translation id="9115675100829699941">&Marcadores</translation> <translation id="9116465289595958864">Última modificación</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 6621c4b..121944e 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -2305,6 +2305,7 @@ <translation id="3432227430032737297">બતાવેલ તમામ દૂર કરો</translation> <translation id="3432762828853624962">શેર કરેલા કારીગરો</translation> <translation id="3433621910545056227">અરે! સિસ્ટમ ઉપકરણ ઇન્સ્ટોલેશન-સમય લક્ષણોનું લૉક સ્થાપિત કરવામાં નિષ્ફળ ગયું.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">જો તમારા બાળક માટે વધારાનું વેબ અને ઍપ પ્રવૃત્તિ સેટિંગ ચાલુ હોય, તો આ ડેટા તેમના Google એકાઉન્ટમાં સાચવવામાં આવી શકે છે. આ સેટિંગ વિશે અને તેમની ગોઠવણ કેવી રીતે કરવી તે વિશે families.google.com પર વધુ જાણો.</translation> <translation id="3435541101098866721">નવો ફોન ઉમેરો</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />", તમારા <ph name="CODE_TYPE" /> ની વિનંતી કરી રહ્યું છે</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index a065b06..abeb1cc 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -2325,6 +2325,7 @@ <translation id="3432227430032737297">दिखाई गईं सभी कुकी निकालें</translation> <translation id="3432762828853624962">शेयर किए गए वर्कर</translation> <translation id="3433621910545056227">ओह! सिस्टम डिवाइस इंस्टॉलेशन-समय विशेषता लॉक स्थापित नहीं कर पाया.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">अगर आपके बच्चे के लिए 'अन्य वेब और ऐप्लिकेशन गतिविधि' सेटिंग चालू है, तो यह डेटा उसके Google खाते में सेव किया जा सकता है. इन सेटिंग के बारे में ज़्यादा जानें. साथ ही, जानें कि families.google.com पर इन्हें कैसे नियंत्रित करें.</translation> <translation id="3435541101098866721">नया फ़ोन जोड़ें</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" आपके <ph name="CODE_TYPE" /> का अनुरोध कर रहा है</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index 11c8834..c1b6a49 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -2312,6 +2312,7 @@ <translation id="3432227430032737297">Ukloni sve prikazano</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">Ups! Sustav nije uspješno uspostavio zaključavanje atributa vremena instalacije uređaja.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Ako je za vaše dijete uključena dodatna aktivnost na webu i u aplikacijama, ti se podaci mogu spremati na djetetov Google račun. Više o tim postavkama i načinu na koji ih možete prilagoditi saznajte na families.google.com.</translation> <translation id="3435541101098866721">Dodaj novi telefon</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" zahtijeva vaš <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index 461a1991..3e8ea65 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -2323,6 +2323,7 @@ <translation id="3432227430032737297">Az összes megjelenített eltávolítása</translation> <translation id="3432762828853624962">Shared workers</translation> <translation id="3433621910545056227">Hoppá! A rendszer nem tudta létrehozni az eszköz telepítésiidő-attribútumainak zárolását.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Ha az Internetes és alkalmazástevékenységek beállítás is be van kapcsolva a gyermekénél, akkor a rendszer ezeket az adatokat mentheti a gyermek Google-fiókjába. Ezekről a funkciókról és beállításuk módjáról a families.google.com oldalon találhat további információt.</translation> <translation id="3435541101098866721">Új telefonszám hozzáadása</translation> <translation id="3435688026795609344">A(z) „<ph name="EXTENSION_NAME" />” bővítmény kéri a <ph name="CODE_TYPE" />-kódját</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index 7212361..4cdee82 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -2311,6 +2311,7 @@ <translation id="3432227430032737297">Հեռացնել բոլոր ցուցադրվածները</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">Համակարգին չհաջողվեց կողպել սարքի հատկությունները՝ տեղադրման ժամանակ:</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Եթե Վեբ որոնման և հավելվածների լրացուցիչ պատմությունը միացված է, այս տվյալները կպահվեն երեխայի Google հաշվում։ Այս կարգավորումների մասին ավելին իմանալու և դրանք ըստ ձեր հայեցողության փոփոխելու համար անցեք families.google.com էջ։</translation> <translation id="3435541101098866721">Նոր հեռախոս ավելացրեք</translation> <translation id="3435688026795609344">«<ph name="EXTENSION_NAME" />» ընդլայնումը պահանջում է ձեր <ph name="CODE_TYPE" /> կոդը</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index ab91147c..17acd5e0 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -2325,6 +2325,7 @@ <translation id="3432227430032737297">Buang Semua Yang Ditampilkan</translation> <translation id="3432762828853624962">Pekerja Bersama</translation> <translation id="3433621910545056227">Ups! Sistem gagal membuat kunci atribut waktu pemasangan perangkat.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Jika setelan Aktivitas Web & Aplikasi tambahan diaktifkan untuk anak Anda, data ini mungkin akan disimpan ke Akun Google miliknya. Pelajari setelan ini dan cara menyesuaikannya lebih lanjut di families.google.com.</translation> <translation id="3435541101098866721">Tambahkan nomor telepon baru</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" meminta <ph name="CODE_TYPE" /> Anda</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb index 3a7ec29..9149e69 100644 --- a/chrome/app/resources/generated_resources_is.xtb +++ b/chrome/app/resources/generated_resources_is.xtb
@@ -2325,6 +2325,7 @@ <translation id="3432227430032737297">Fjarlægja öll sem birtast</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">Úbbs! Kerfinu mistókst að koma á eigindalás við uppsetningu tækisins.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Ef kveikt er á ítarlegri vef- og forritavirkni fyrir barnið geta þessi gögn verið vistuð á Google reikningi barnsins. Fáðu frekari upplýsingar um þessar stillingar og hvernig þær eru stilltar á families.google.com.</translation> <translation id="3435541101098866721">Bæta við nýjum síma</translation> <translation id="3435688026795609344">„<ph name="EXTENSION_NAME" />“ biður um <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index 3bf40708d..2a87e5a 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -2310,6 +2310,7 @@ <translation id="3432227430032737297">Rimuovi tutti i cookie visualizzati</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">Spiacenti. Il sistema non è riuscito a stabilire il blocco degli attributi del tempo di installazione del dispositivo.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Se l'impostazione Attività web e app aggiuntiva è attiva per tuo figlio, questi dati potrebbero essere salvati nel suo Account Google. Ulteriori informazioni su queste impostazioni e su come configurarle sono disponibili all'indirizzo families.google.com.</translation> <translation id="3435541101098866721">Aggiungi nuovo numero di telefono</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" richiede il tuo codice <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index 1e71ae9..e12cba3 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -2322,6 +2322,7 @@ <translation id="3432227430032737297">הסרת כל קובצי ה-cookie המוצגים</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">אופס! המערכת לא הצליחה ליצור את נעילת התכונות של המכשיר המתרחשת בזמן ההתקנה.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">אם ההגדרה 'פעילות באתרי אינטרנט ובאפליקציות נוספים' הופעלה עבור הילד/ה שלך, ייתכן שהנתונים יישמרו בחשבון Google שלהם. למידע נוסף על ההגדרות האלה ואיך ניתן לשנות אותן, יש לעבור לכתובת families.google.com.</translation> <translation id="3435541101098866721">הוספת טלפון חדש</translation> <translation id="3435688026795609344">התוסף "<ph name="EXTENSION_NAME" />" מבקש את ה-<ph name="CODE_TYPE" /> שלך</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index 4f222d51..fef743d 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -2309,6 +2309,7 @@ <translation id="3432227430032737297">表示中のサイトをすべて削除</translation> <translation id="3432762828853624962">共有ワーカー</translation> <translation id="3433621910545056227">デバイス インストール時の属性のロックを確立できませんでした。</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">お子様の [その他のウェブとアプリのアクティビティ] の設定がオンになっている場合、このデータはお子様の Google アカウントに保存されます。これらの設定の詳細と変更方法については、families.google.com をご覧ください。</translation> <translation id="3435541101098866721">新しい電話番号を追加</translation> <translation id="3435688026795609344">「<ph name="EXTENSION_NAME" />」が <ph name="CODE_TYPE" /> をリクエストしています</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index f860328..d1de73e 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -2310,6 +2310,7 @@ <translation id="3432227430032737297">ყველა ნაჩვენების ამოშლა</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">უი! სისტემამ ვერ დააყენა მოწყობილობის ინსტალაციის დროის ატრიბუტების ბლოკი.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">თუ თქვენი შვილისთვის ჩართულია ვებსა და აპებში დამატებითი აქტივობის პარამეტრი, აღნიშნული მონაცემები შესაძლოა შეინახოს მის Google ანგარიშში. ამ პარამეტრების და მათი დარეგულირების შესახებ დამატებითი ინფორმაცია ხელმისაწვდომია შემდეგ მისამართზე: families.google.com.</translation> <translation id="3435541101098866721">დაამატეთ ახალი ტელეფონი</translation> <translation id="3435688026795609344">„<ph name="EXTENSION_NAME" />“-ს თქვენი <ph name="CODE_TYPE" /> სჭირდება</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index 013f71a..733bd2e1 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -2306,6 +2306,7 @@ <translation id="3432227430032737297">Барлық көрсетілгендерді өшіру</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">Жүйенің құрылғы орнату уақытының атрибуттары құлпын орнатуы сәтсіз аяқталды.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Егер "Интернет пен қолданбаларды пайдаланудың қосымша тарихы" параметрі қосулы болса, бұл деректер балаңыздың Google есептік жазбасына сақталуы мүмкін. Бұл параметрлер және оларды қалай реттеу керектігі туралы ақпаратты families.google.com сайтынан біле аласыз.</translation> <translation id="3435541101098866721">Жаңа телефон қосу</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" кеңейтімі <ph name="CODE_TYPE" /> кодын сұрауда</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb index 4524821..5d2b95ee 100644 --- a/chrome/app/resources/generated_resources_km.xtb +++ b/chrome/app/resources/generated_resources_km.xtb
@@ -2325,6 +2325,7 @@ <translation id="3432227430032737297">លុបអ្វីដែលបានបង្ហាញចេញទាំងអស់</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">អូ! ប្រព័ន្ធបានបរាជ័យក្នុងការបង្កើតសោគុណលក្ខណៈរយៈពេលតំឡើងឧបករណ៍។</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">ប្រសិនបើការកំណត់សកម្មភាពកម្មវិធី និងគេហទំព័របន្ថែមត្រូវបានបើកសម្រាប់កូនរបស់អ្នក នោះទិន្នន័យនេះអាចត្រូវបានរក្សាទុកទៅក្នុងគណនី Google របស់គាត់។ ស្វែងយល់បន្ថែមអំពីការកំណត់ទាំងនេះ និងរបៀបកែតម្រូវវាតាមរយៈ families.google.com។</translation> <translation id="3435541101098866721">បញ្ចូលទូរសព្ទថ្មី</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" កំពុងស្នើសុំ <ph name="CODE_TYPE" /> របស់អ្នក</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 1eb4dc4..6e41038 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -2314,6 +2314,7 @@ <translation id="3432227430032737297">ತೋರಿಸಿರುವ ಎಲ್ಲವನ್ನೂ ತೆಗೆದುಹಾಕು</translation> <translation id="3432762828853624962">ಹಂಚಿಕೊಳ್ಳಲಾದ ಕೆಲಸಗಾರರು</translation> <translation id="3433621910545056227">ಓಹ್! ಸಾಧನ ಇನ್ಸ್ಟಾಲೇಶನ್-ಸಮಯದ ಲಕ್ಷಣಗಳ ಲಾಕ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಸಿಸ್ಟಂ ವಿಫಲವಾಗಿದೆ.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">ನಿಮ್ಮ ಮಗುವಿಗಾಗಿ, ಹೆಚ್ಚುವರಿ ವೆಬ್ ಮತ್ತು ಆ್ಯಪ್ ಚಟುವಟಿಕೆಯನ್ನು ಆನ್ ಮಾಡಿದ್ದರೆ, ಈ ಡೇಟಾವನ್ನು ಅವರ Google ಖಾತೆಯಲ್ಲಿ ಉಳಿಸಬಹುದು. ಈ ಸೆಟ್ಟಿಂಗ್ಗಳ ಕುರಿತು ಮತ್ತು ಇವುಗಳನ್ನು ಹೇಗೆ ಹೊಂದಿಸುವುದು ಎಂಬ ಕುರಿತು families.google.com ನಲ್ಲಿ ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ.</translation> <translation id="3435541101098866721">ಹೊಸ ಫೋನ್ ಸೇರಿಸಿ</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" ನಿಮ್ಮ <ph name="CODE_TYPE" /> ಅನ್ನು ವಿನಂತಿಸುತ್ತಿದೆ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index a13e738f..a4f8c43 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -2325,6 +2325,7 @@ <translation id="3432227430032737297">표시된 항목 모두 삭제</translation> <translation id="3432762828853624962">공유 작업자</translation> <translation id="3433621910545056227">시스템이 기기 설치 시간 속성 잠금을 설정하는 데 실패했습니다.</translation> +<translation id="3434107140712555581">배터리 <ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">자녀의 추가 웹 및 앱 활동이 사용 설정되어 있다면 이 데이터가 자녀의 Google 계정에 저장될 수 있습니다. families.google.com에서 이러한 설정 및 설정 조정 방법을 자세히 알아보세요.</translation> <translation id="3435541101098866721">새 전화 추가</translation> <translation id="3435688026795609344">'<ph name="EXTENSION_NAME" />'이(가) <ph name="CODE_TYPE" />을(를) 요청하고 있습니다.</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index 70883aef..95a33a7f 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -2325,6 +2325,7 @@ <translation id="3432227430032737297">Көрсөтүлгөндөрдүн баары алынсын</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">Ой! Тутум түзмөктү орнотуу убакытынын аттрибуттарынын кулпусу негизделбей калды.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Эгер кошумча Колдонмолор жана Интернеттеги аракеттер таржымалы балаңыз үчүн күйгүзүлгөн болсо, бул маалымат анын Google аккаунтуна сакталышы мүмкүн. Төмөнкү шилтеме менен өтүп, бул жөндөөлөр жана аларды кантип тууралоо керек экендиги жөнүндө кеңири маалымат алыңыз: families.google.com.</translation> <translation id="3435541101098866721">Жаңы телефонду кошуу</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" сиздин <ph name="CODE_TYPE" /> кодуңузду сурап жатат</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb index c3ee0898..c516313 100644 --- a/chrome/app/resources/generated_resources_lo.xtb +++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -2322,6 +2322,7 @@ <translation id="3432227430032737297">ລຶບທຸກອັນທີ່ປາກົດ</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">ອຸ້ຍ! ລະບົບຕັ້ງລັອກລັກສະນະການຕິດຕັ້ງເວລາອຸປະກອນບໍ່ໄດ້.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">ຖ້າເປີດການຕັ້ງຄ່າການເຄື່ອນໄຫວເວັບ ແລະ ແອັບເພີ່ມເຕີມສໍາລັບລູກຂອງທ່ານ, ລະບົບອາດຈະບັນທຶກຂໍ້ມູນນີ້ໄວ້ໃນບັນຊີ Google ຂອງເຂົາເຈົ້າ. ສຶກສາເພີ່ມເຕີມກ່ຽວກັບການຕັ້ງຄ່າເຫຼົ່ານີ້ ແລະ ວິທີປັບການຕັ້ງຄ່າໄດ້ທີ່ families.google.com.</translation> <translation id="3435541101098866721">ເພີ່ມໂທລະສັບໃໝ່</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" ກຳລັງຮ້ອງຂໍ <ph name="CODE_TYPE" /> ຂອງທ່ານ</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index 33669a4..0571c62 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -2328,6 +2328,7 @@ <translation id="3432227430032737297">Pašalinti visus rodomus</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">Deja, sistemai vykdant įrenginio diegimo laiko atributų fiksavimą įvyko klaida.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" /> proc.</translation> <translation id="3434272557872943250">Jei papildomas Žiniatinklio ir programų veiklos nustatymas įjungtas vaiko įrenginyje, šie duomenys gali būti išsaugoti vaiko „Google“ paskyroje. Sužinokite daugiau apie šiuos nustatymus ir kaip juos koreguoti, adresu families.google.com.</translation> <translation id="3435541101098866721">Pridėti naują telefono nr.</translation> <translation id="3435688026795609344">„<ph name="EXTENSION_NAME" />“ prašo pateikti <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index 4c5e800..c027e340 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -2312,6 +2312,7 @@ <translation id="3432227430032737297">Noņemt visu parādīto</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">Hmm... Sistēma nevarēja iestatīt ierīces instalēšanas laika atribūta bloķēšanu.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Ja jūsu bērnam ir ieslēgts iestatījums “papildu darbības tīmeklī un lietotnēs”, šie dati var tikt saglabāti bērna Google kontā. Plašāku informāciju par šiem iestatījumiem un to pielāgošanu skatiet vietnē families.google.com.</translation> <translation id="3435541101098866721">Pievienot jaunu telefonu</translation> <translation id="3435688026795609344">Paplašinājumā <ph name="EXTENSION_NAME" /> tiek pieprasīts jūsu <ph name="CODE_TYPE" />.</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb index 28d9a90..e6cf5cc4 100644 --- a/chrome/app/resources/generated_resources_mk.xtb +++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -2323,6 +2323,7 @@ <translation id="3432227430032737297">Отстрани ги сите прикажани</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">Уф! Системот не успеа да воспостави заклучување на уредот за атрибути за време на инсталацијата.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Ако сте ја вклучиле дополнителната поставка „Активност на интернет и апликации“ за вашето дете, овие податоци може да се зачувуваат во сметката на Google на детето. Дознајте повеќе за поставкиве и за тоа како да ги приспособите на families.google.com.</translation> <translation id="3435541101098866721">Додајте нов телефон</translation> <translation id="3435688026795609344">„<ph name="EXTENSION_NAME" />“ го бара вашиот <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index c878966..ec0e644 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -161,6 +161,7 @@ <translation id="1165039591588034296">പിശക്</translation> <translation id="1166212789817575481">ടാബുകള് വലത്തേയ്ക്ക് അടയ്ക്കുക</translation> <translation id="1166583374608765787">പേര് അപ്ഡേറ്റ് ചെയ്തത് അവലോകനം ചെയ്യുക</translation> +<translation id="1166596238782048887"><ph name="TAB_TITLE" />, <ph name="DESK_TITLE" /> എന്ന ഡെസ്കിൽ ഉൾപ്പെടുന്നു</translation> <translation id="1168020859489941584"><ph name="TIME_REMAINING" /> ല് തുറക്കുന്നു...</translation> <translation id="1170288591054440704">ഒരു സൈറ്റിന് നിങ്ങളുടെ ഉപകരണത്തിൽ ഇൻസ്റ്റാൾ ചെയ്തിട്ടുള്ള ഫോണ്ടുകൾ ഉപയോഗിക്കണമെന്നുള്ളപ്പോൾ ചോദിക്കുക</translation> <translation id="1171135284592304528">ഒബ്ജക്റ്റ് മാറുമ്പോൾ അതിനെ കീബോർഡ് ഫോക്കസ് ഉപയോഗിച്ച് ഹൈലൈറ്റ് ചെയ്യുക</translation> @@ -616,6 +617,7 @@ <translation id="1640235262200048077">Linux ആപ്പുകളിൽ ഇപ്പോഴും <ph name="IME_NAME" /> പ്രവർത്തിക്കില്ല</translation> <translation id="1640283014264083726">RSA എന്ക്രിപ്ഷനോടുകൂടിയ PKCS #1 MD4</translation> <translation id="1641113438599504367">സുരക്ഷിത ബ്രൗസിംഗ്</translation> +<translation id="1642492862748815878"><ph name="DEVICE" />-ലേക്കും മറ്റ് <ph name="NUMBER_OF_DEVICES" /> Bluetooth ഉപകരണങ്ങളിലേക്കും കണക്റ്റ് ചെയ്തിരിക്കുന്നു</translation> <translation id="1642494467033190216">മറ്റ് ഡീബഗ്ഗിംഗ് ഫീച്ചറുകൾ പ്രവർത്തനക്ഷമമാക്കുന്നതിനുമുമ്പ് റൂട്സ് പരിരക്ഷയുടെ നീക്കംചെയ്യലും പുനഃരാരംഭിക്കലും ആവശ്യമാണ്.</translation> <translation id="1643072738649235303">SHA-1 ഉള്ള X9.62 ECDSA സിഗ്നേച്ചർ</translation> <translation id="1643921258693943800">സമീപമുള്ള പങ്കിടൽ ഉപയോഗിക്കാൻ Bluetooth-ഉം വൈഫൈയും ഓണാക്കുക</translation> @@ -1819,6 +1821,7 @@ <translation id="2885378588091291677">ടാസ്ക് മാനേജര്</translation> <translation id="2885729872133513017">സെർവറിന്റെ പ്രതികരണം ഡീകോഡ് ചെയ്യുമ്പോൾ ഒരു പ്രശ്നമുണ്ടായി.</translation> <translation id="2886771036282400576">• <ph name="PERMISSION" /></translation> +<translation id="288734198558082692"><ph name="DEVICE" /> എന്നതും മറ്റ് <ph name="NUMBER_OF_DEVICES" /> എണ്ണവും</translation> <translation id="2889064240420137087">ഇനിപ്പറയുന്നതിൽ ലിങ്ക് തുറക്കുക...</translation> <translation id="2891922230654533301"><ph name="APP_NAME" /> ആപ്പിൽ സൈൻ ചെയ്യാൻ നിങ്ങളുടെ ഉപകരണം ഉപയോഗിക്കണോ?</translation> <translation id="2893168226686371498">ഡിഫോൾട്ട് ബ്രൗസര്</translation> @@ -2306,6 +2309,7 @@ <translation id="3432227430032737297">ദൃശ്യമാക്കിയിരിക്കുന്നതെല്ലാം നീക്കംചെയ്യുക</translation> <translation id="3432762828853624962">പങ്കിട്ട വർക്കർമാർ</translation> <translation id="3433621910545056227">ക്ഷമിക്കണം! ഉപകരണ ഇൻസ്റ്റലേഷൻ-സമയ ആട്രിബ്യൂട്ട് ലോക്ക് സ്ഥാപിക്കുന്നതിൽ സിസ്റ്റം പരാജയപ്പെട്ടു.</translation> +<translation id="3434107140712555581">ബാറ്ററി: <ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">നിങ്ങളുടെ കുട്ടിയുടെ അധിക വെബ്, ആപ്പ് പ്രവർത്തന ക്രമീകരണം ഓണാക്കിയിട്ടുണ്ടെങ്കിൽ, ഈ ഡാറ്റ അവരുടെ Google അക്കൗണ്ടിൽ സംരക്ഷിക്കപ്പെട്ടേക്കാം. ഈ ക്രമീകരണത്തെ കുറിച്ചും അതെങ്ങനെയാണ് ക്രമപ്പെടുത്തുന്നത് എന്നതിനെ കുറിച്ചും families.google.com എന്നതിൽ കൂടുതലറിയുക.</translation> <translation id="3435541101098866721">പുതിയ ഫോണ് ചേര്ക്കുക</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" നിങ്ങളുടെ <ph name="CODE_TYPE" /> അഭ്യർത്ഥിക്കുന്നു</translation> @@ -2753,6 +2757,7 @@ <translation id="3884152383786131369">ഒന്നിലധികം ഭാഷകളിൽ ലഭ്യമായ വെബ് ഉള്ളടക്കം, ഈ ലിസ്റ്റിലുള്ള പിന്തുണയ്ക്കുന്ന ആദ്യത്തെ ഭാഷ ഉപയോഗിക്കും. ഈ മുൻഗണനകൾ നിങ്ങളുടെ ബ്രൗസർ ക്രമീകരണവുമായി സമന്വയിപ്പിക്കുന്നു. <ph name="BEGIN_LINK_LEARN_MORE" />കൂടുതലറിയുക<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3885112598747515383">അപ്ഡേറ്റുകൾ മാനേജ് ചെയ്യുന്നത് നിങ്ങളുടെ അഡ്മിനാണ്</translation> <translation id="3886446263141354045"><ph name="NAME" /> എന്നയാൾക്ക് ഈ സൈറ്റ് ആക്സസ് ചെയ്യാനുള്ള നിങ്ങളുടെ അഭ്യർത്ഥന അയച്ചു</translation> +<translation id="3887022758415973389">ഉപകരണ ലിസ്റ്റ് കാണിക്കുക</translation> <translation id="3888053818972567950"><ph name="WEB_DRIVE" /> കണക്ഷൻ</translation> <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> ഉപയോഗിച്ച് കുറിപ്പുകൾ എടുക്കുന്നു</translation> <translation id="3888586133700543064">Assistant-മായി ബന്ധപ്പെട്ട നിങ്ങളുടെ പ്രശ്നങ്ങൾ കൂടുതൽ മനസ്സിലാക്കാൻ ഈ വിവരങ്ങൾ ഞങ്ങളെ സഹായിക്കുന്നു. ഇത് 90 ദിവസം വരെ സംഭരിക്കുന്നു, ഇതിലേക്കുള്ള ആക്സസ് അനുയോജ്യമായ എഞ്ചിനീയറിംഗ്, ഫീഡ്ബാക്ക് ടീമുകൾക്ക് മാത്രമായി പരിമിതപ്പെടുത്തിയിരിക്കുന്നു.</translation> @@ -3462,6 +3467,7 @@ <translation id="4662373422909645029">വിളിപ്പേരിൽ അക്കങ്ങൾ പാടില്ല</translation> <translation id="4662788913887017617">നിങ്ങളുടെ iPhone ഉപയോഗിച്ച് ഈ ബുക്ക്മാർക്ക് പങ്കിടുക</translation> <translation id="4663373278480897665">ക്യാമറ അനുവദനീയം</translation> +<translation id="4664289193573249666">Chrome OS ക്രമീകരണത്തിൽ സുരക്ഷിത DNS മാനേജ് ചെയ്യുക</translation> <translation id="4664482161435122549">PKCS #12 കയറ്റുമതി പിശക്</translation> <translation id="4665014895760275686">നിര്മ്മാതാവ്</translation> <translation id="4665446389743427678"><ph name="SITE" /> സംഭരിച്ച മുഴുവൻ ഡാറ്റയും ഇല്ലാതാക്കപ്പെടും.</translation> @@ -5996,6 +6002,7 @@ <translation id="7478623944308207463">നിങ്ങളുടെ Google അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്തിട്ടുള്ള എല്ലാ Chrome OS ഉപകരണങ്ങളിലുമുടനീളം നിങ്ങളുടെ ആപ്പുകളും ക്രമീകരണവും സമന്വയിപ്പിക്കും. ബ്രൗസർ സമന്വയിപ്പിക്കൽ ഓപ്ഷനുകൾക്ക് <ph name="LINK_BEGIN" />Chrome ക്രമീകരണത്തിലേക്ക്<ph name="LINK_END" /> പോകുക.</translation> <translation id="7478658909253570368">സീരിയൽ പോർട്ടുകളിലേക്ക് കണക്റ്റ് ചെയ്യാൻ സൈറ്റുകളെ അനുവദിക്കരുത്</translation> <translation id="7479221278376295180">സ്റ്റോറേജ് ഉപയോഗ അവലോകനം</translation> +<translation id="747981547666531654"><ph name="FIRST_DEVICE" />, <ph name="SECOND_DEVICE" /> എന്ന് പേരുകളുള്ള Bluetooth ഉപകരണങ്ങളിലേക്ക് കണക്റ്റ് ചെയ്തിരിക്കുന്നു</translation> <translation id="7481312909269577407">മുന്നോട്ട്</translation> <translation id="7481358317100446445">തയ്യാര്</translation> <translation id="748138892655239008">സര്ട്ടിഫിക്കറ്റ് ബേസിക് നിയന്ത്രണങ്ങള്</translation> @@ -6048,6 +6055,7 @@ <translation id="7531771599742723865">ഉപകരണം ഉപയോഗത്തിലാണ്</translation> <translation id="7531779363494549572">ക്രമീകരണം > ആപ്പുകളും അറിയിപ്പുകളും > അറിയിപ്പുകൾ എന്നതിലേക്ക് പോവുക.</translation> <translation id="7532009420053991888"><ph name="LINUX_APP_NAME" /> പ്രതികരിക്കുന്നില്ല. ആപ്പ് അടയ്ക്കാൻ, "നിർബന്ധിതമായി അടയ്ക്കുക" തിരഞ്ഞെടുക്കുക.</translation> +<translation id="7535730537657706072">നിങ്ങളുടെ ഉപകരണത്തിൽ നിന്ന് അദൃശ്യ മോഡിന്റെ ബ്രൗസിംഗ് ചരിത്രം മായ്ക്കാൻ എല്ലാ അദൃശ്യ ടാബുകളും അടയ്ക്കുക</translation> <translation id="7535791657097741517">ലൈറ്റ് തീം ഓണാക്കുക</translation> <translation id="7537451260744431038">നിങ്ങളുടെ ബ്രൗസിംഗ് അനുഭവം മെച്ചപ്പെടുത്താൻ സൈറ്റുകൾക്ക് കുക്കികൾ ഉപയോഗിക്കാനാവില്ല, ഉദാഹരണത്തിന്, സൈൻ ഇൻ ചെയ്ത നിലയിൽ തുടരാനോ ഷോപ്പിംഗ് കാർട്ടിലെ ഇനങ്ങൾ ഓർമ്മിക്കാനോ</translation> <translation id="753769905878158714">വിലാസ ബാറിൽ നിങ്ങൾക്ക് തിരയേണ്ട വെബ്സൈറ്റിനുള്ള കീവേഡ് നൽകുക. തുടർന്ന്, തുടരാൻ കീബോഡ് കുറുക്കുവഴി ഉപയോഗിക്കുക.</translation> @@ -6664,6 +6672,7 @@ <translation id="8138217203226449454">നിങ്ങളുടെ തിരയൽ ദാതാവിനെ മാറ്റാനാണോ നിങ്ങൾ ഉദ്ദേശിച്ചത്?</translation> <translation id="8138997515734480534"><ph name="VM_NAME" /> നില</translation> <translation id="8139447493436036221">Google Drive ഫയലുകൾ</translation> +<translation id="8140070492745508800"><ph name="FIRST_DEVICE" />, <ph name="SECOND_DEVICE" /></translation> <translation id="8141584439523427891">ഇപ്പോൾ മറ്റൊരു ബ്രൗസറിൽ തുറക്കുന്നു</translation> <translation id="8141725884565838206">നിങ്ങളുടെ പാസ്വേഡുകൾ നിയന്ത്രിക്കുക</translation> <translation id="814204052173971714">{COUNT,plural, =1{ഒരു വീഡിയോ}other{# വീഡിയോകൾ}}</translation> @@ -7377,6 +7386,7 @@ <translation id="8909782404367982052">Google Lens ഉപയോഗിച്ച് ചിത്രങ്ങൾ തിരയാൻ വലിച്ചിടുക</translation> <translation id="8909833622202089127">സൈറ്റ് നിങ്ങളുടെ ലൊക്കേഷൻ ട്രാക്ക് ചെയ്യുന്നു</translation> <translation id="8910222113987937043">ബുക്ക്മാർക്കുകൾ, ചരിത്രം, പാസ്വേഡുകൾ, മറ്റ് ക്രമീകരണം എന്നിവയിലുള്ള മാറ്റങ്ങളെ ഇനി നിങ്ങളുടെ Google അക്കൗണ്ടിലേക്ക് സമന്വയിപ്പിക്കില്ല. എന്നിരുന്നാലും, നിലവിലുള്ള വിവരങ്ങളെ Google അക്കൗണ്ടിൽ തുടർന്നും സൂക്ഷിക്കും, അവ <ph name="BEGIN_LINK" />Google ഡാഷ്ബോർഡിൽ<ph name="END_LINK" /> മാനേജ് ചെയ്യാം.</translation> +<translation id="8910987510378294980">ഉപകരണ ലിസ്റ്റ് മറയ്ക്കുക</translation> <translation id="8912362522468806198">Google അക്കൗണ്ട്</translation> <translation id="8912793549644936705">വലിച്ചുനീട്ടുക</translation> <translation id="8912810933860534797">സ്വയമേവയുള്ള സ്കാൻ പ്രവർത്തനക്ഷമമാക്കുക</translation> @@ -7494,6 +7504,7 @@ <translation id="9033765790910064284">എന്തായാലും തുടരുക</translation> <translation id="9033857511263905942">&ഒട്ടിക്കുക</translation> <translation id="903480517321259405">പിൻ വീണ്ടും ടൈപ്പ് ചെയ്യുക</translation> +<translation id="9037054491984310631"><ph name="DEVICE" /> എന്ന് പേരുള്ള Bluetooth ഉപകരണത്തിലേക്ക് കണക്റ്റ് ചെയ്തിരിക്കുന്നു</translation> <translation id="9037640663275993951">ഉപകരണത്തെ അനുവദിക്കുന്നില്ല</translation> <translation id="9037818663270399707">എല്ലാ നെറ്റ്വർക്ക് ട്രാഫിക്കിനും നിങ്ങളുടെ കണക്ഷൻ സ്വകാര്യമല്ല</translation> <translation id="9037965129289936994">യഥാര്ത്ഥമായത് കാണിക്കുക</translation> @@ -7574,6 +7585,7 @@ <translation id="9112786533191410418"><ph name="FILE_NAME" /> അപകടകരമായേക്കാം. സ്കാൻ ചെയ്യാൻ Google-ലേക്ക് അയയ്ക്കണോ?</translation> <translation id="9112987648460918699">കണ്ടെത്തുക...</translation> <translation id="9113240369465613386">ഒറ്റ സംഖ്യാ പേജുകൾ മാത്രം</translation> +<translation id="9113469270512809735">അടുത്തിടെ അടച്ച ഇനങ്ങൾ മാറ്റുക</translation> <translation id="9114663181201435112">എളുപ്പത്തിൽ സൈൻ ഇൻ ചെയ്യുക</translation> <translation id="9115675100829699941">&ബുക്ക്മാര്ക്കുകള്</translation> <translation id="9116465289595958864">അവസാനം പരിഷ്ക്കരിച്ചവ</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb index 1b6c0a2..41f462a1 100644 --- a/chrome/app/resources/generated_resources_mn.xtb +++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -2321,6 +2321,7 @@ <translation id="3432227430032737297">Харуулсан бүх зүйлийг устгах</translation> <translation id="3432762828853624962">Хуваалцсан ажилчид</translation> <translation id="3433621910545056227">Анхаарна уу! Систем төхөөрөмжийг суурьлуулж чадахгүй байна.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Хэрэв таны хүүхдийн Веб, аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг түүний Google Бүртгэлд хадгалж болзошгүй. Эдгээр тохиргооны талаар болон тэднийг хэрхэн тохируулах тухай нэмэлт мэдээллийг families.google.com дээрээс авна уу.</translation> <translation id="3435541101098866721">Шинэ утас нэмэх</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" таны <ph name="CODE_TYPE" />-г хүсэж байна</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 470bd7d..497daf0 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -161,6 +161,7 @@ <translation id="1165039591588034296">एरर</translation> <translation id="1166212789817575481">उजवीकडील टॅब बंद करा</translation> <translation id="1166583374608765787">अपडेट केलेल्या नावाचे पुनरावलोकन करा</translation> +<translation id="1166596238782048887"><ph name="TAB_TITLE" /> हा <ph name="DESK_TITLE" /> डेस्कशी कनेक्ट केलेला आहे</translation> <translation id="1168020859489941584"><ph name="TIME_REMAINING" /> मध्ये उघडत आहे...</translation> <translation id="1170288591054440704">एखाद्या साइटला तुमच्या डिव्हाइसमध्ये इंस्टॉल केलेले फाँट वापरायचे असतील तेव्हा विचारा</translation> <translation id="1171135284592304528">ऑब्जेक्ट बदलते तेव्हा ते कीबोर्ड फोकससह हायलाइट करा</translation> @@ -299,7 +300,7 @@ <translation id="1316495628809031177">सिंक थांबवले आहे</translation> <translation id="1317637799698924700">तुमचे डॉकिंग स्टेशन हे USB केबल कंपॅटिबिल मोडमध्ये काम करेल.</translation> <translation id="1319983966058170660"><ph name="SUBPAGE_TITLE" /> सबपेजचे मागे जा बटण</translation> -<translation id="1322046419516468189">सेव्ह केलेले पासवर्ड तुमच्या <ph name="SAVED_PASSWORDS_STORE" /> मध्ये पाहा आणि व्यवस्थापित करा</translation> +<translation id="1322046419516468189">सेव्ह केलेले पासवर्ड तुमच्या <ph name="SAVED_PASSWORDS_STORE" /> मध्ये पहा आणि व्यवस्थापित करा</translation> <translation id="1324106254079708331">लक्ष्यित हल्ल्यांचा धोका असलेल्या कोणाच्याही वैयक्तिक Google खात्यांचे संरक्षण करते</translation> <translation id="1326317727527857210">आपल्या इतर डिव्हाइसेसवरील तुमचे टॅब प्राप्त करण्यासाठी, Chrome मध्ये साइन इन करा.</translation> <translation id="1327272175893960498">Kerberos तिकिटे</translation> @@ -529,7 +530,7 @@ <translation id="1562119309884184621">हा संपर्क जोडल्याने पुढील वेळी त्यांनी काही शेअर केल्यास, लक्षात ठेवले जाईल</translation> <translation id="1563702743503072935">तुमच्या Google खाते मधील तुमचे पासवर्ड तुम्ही साइन इन केलेले असताना या डिव्हाइसवरदेखील उपलब्ध असतील</translation> <translation id="1566049601598938765">वेबसाइट</translation> -<translation id="15662109988763471">निवडलेला प्रिंटर उपलब्ध नाही किंवा योग्यरीत्या इंस्टॉल केलेला नाही. तुमचा प्रिंटर तपासा किंवा दुसरा प्रिंटर निवडून पाहा.</translation> +<translation id="15662109988763471">निवडलेला प्रिंटर उपलब्ध नाही किंवा योग्यरीत्या इंस्टॉल केलेला नाही. तुमचा प्रिंटर तपासा किंवा दुसरा प्रिंटर निवडून पहा.</translation> <translation id="1567135437923613642">वैशिष्ट्यीकृत प्रयोग सुरू करा</translation> <translation id="1567387640189251553">तुम्ही शेवटचा पासवर्ड टाकल्या नंतर वेगळा कीबोर्ड कनेक्ट करण्यात आला आहे. तो कदाचित तुमचे कीस्ट्रोक चोरण्याचा प्रयत्न करत असेल.</translation> <translation id="156793199942386351">'<ph name="CURRENTKEY" />' ही आधीपासून '<ph name="ACTION" />' या कृतीसाठी असाइन केलेली आहे. <ph name="RESPONSE" /> साठी कोणतीही की दाबा.</translation> @@ -619,6 +620,7 @@ <translation id="1640235262200048077"><ph name="IME_NAME" /> सध्या Linux ॲप्समध्ये काम करत नाही</translation> <translation id="1640283014264083726">PKCS #1 RSA एंक्रिप्शनसह MD4</translation> <translation id="1641113438599504367">सुरक्षित ब्राउझिंग</translation> +<translation id="1642492862748815878"><ph name="DEVICE" /> आणि इतर <ph name="NUMBER_OF_DEVICES" /> ब्लूटूथ डिव्हाइसशी कनेक्ट केले आहे</translation> <translation id="1642494467033190216">इतर डीबगिंग वैशिष्ट्ये सक्षम करण्यापूर्वी rootfs संरक्षण काढणे आणि रीस्टार्ट करणे आवश्यक आहे.</translation> <translation id="1643072738649235303">SHA-1 सह X9.62 ECDSA स्वाक्षरी</translation> <translation id="1643921258693943800">Nearby सह शेअरिंग वापरण्यासाठी, ब्लूटूथ आणि वाय-फाय सुरू करा</translation> @@ -929,7 +931,7 @@ <translation id="1942600407708803723">कव्हर बंद केल्यावर शट डाउन करा</translation> <translation id="1944528062465413897">ब्लूटूथ पेअरिंग कोड:</translation> <translation id="1944921356641260203">अपडेट आढळले</translation> -<translation id="1946577776959096882">खाती पाहा</translation> +<translation id="1946577776959096882">खाती पहा</translation> <translation id="1949584741547056205">झटपट उत्तरे</translation> <translation id="1951012854035635156">Assistant</translation> <translation id="1954597385941141174">साइट USB डिव्हाइसशी कनेक्ट करण्यासाठी विचारू शकतात</translation> @@ -1380,7 +1382,7 @@ <translation id="2412593942846481727">अपडेट उपलब्ध आहे</translation> <translation id="2412753904894530585">Kerberos</translation> <translation id="2416435988630956212">कीबोर्ड कार्य की</translation> -<translation id="2419131370336513030">इंस्टॉल केलेली अॅप्स पाहा</translation> +<translation id="2419131370336513030">इंस्टॉल केलेली अॅप्स पहा</translation> <translation id="2419706071571366386">सुरक्षिततेसाठी, तुमचा काँप्युटर वापरला जात नसताना साइन आउट करा.</translation> <translation id="2422125132043002186">Linux रिस्टोअर रद्द केले</translation> <translation id="2423578206845792524">म्हणून इमेज ज&तन करा...</translation> @@ -1399,7 +1401,7 @@ <translation id="2435248616906486374">नेटवर्क डिस्कनेक्ट झाले</translation> <translation id="2435457462613246316">पासवर्ड दर्शवा</translation> <translation id="2436186046335138073"><ph name="HANDLER_HOSTNAME" /> ला सर्व <ph name="PROTOCOL" /> लिंक उघडण्याची अनुमती द्यायची?</translation> -<translation id="2440604414813129000">स्त्रो&त पाहा</translation> +<translation id="2440604414813129000">स्त्रो&त पहा</translation> <translation id="244231003699905658">चुकीचा ॲड्रेस. कृपया ॲड्रेस तपासा आणि पुन्हा प्रयत्न करा.</translation> <translation id="2442916515643169563">मजकुराची शॅडो</translation> <translation id="2443487764245141020">आयडेंटिफायर वापरून साइटनी तुमचे डिव्हाइस ओळखणे आवश्यक आहे</translation> @@ -1768,7 +1770,7 @@ <translation id="2813094189969465044">पालक नियंत्रणे</translation> <translation id="281390819046738856">विनंतीवर साइन करता आले नाही.</translation> <translation id="2814489978934728345">हे पृष्ठ लोड करणे थांबवा</translation> -<translation id="281504910091592009">तुमच्या <ph name="BEGIN_LINK" />Google खात्यामध्ये<ph name="END_LINK" /> सेव्ह केलेले पासवर्ड पाहा आणि व्यवस्थापित करा</translation> +<translation id="281504910091592009">तुमच्या <ph name="BEGIN_LINK" />Google खात्यामध्ये<ph name="END_LINK" /> सेव्ह केलेले पासवर्ड पहा आणि व्यवस्थापित करा</translation> <translation id="2815693974042551705">बुकमार्क फोल्डर</translation> <translation id="2816319641769218778">तुमच्या Google खाते मध्ये पासवर्ड सेव्ह करण्यासाठी सिंक सुरू करा.</translation> <translation id="2816628817680324566">या साइटला तुमची सिक्युरिटी की ओळखण्याची अनुमती द्यायची का?</translation> @@ -1834,6 +1836,7 @@ <translation id="2885378588091291677">टास्क मॅनेजर</translation> <translation id="2885729872133513017">सर्व्हर प्रतिसाद डीकोड करताना समस्या आली.</translation> <translation id="2886771036282400576">• <ph name="PERMISSION" /></translation> +<translation id="288734198558082692"><ph name="DEVICE" /> आणि इतर <ph name="NUMBER_OF_DEVICES" /></translation> <translation id="2889064240420137087">यासह लिंक उघडा...</translation> <translation id="2891922230654533301"><ph name="APP_NAME" /> वर साइन इन करण्यासाठी तुमचे डिव्हाइस वापरायचे आहे का?</translation> <translation id="2893168226686371498">डीफॉल्ट ब्राउझर</translation> @@ -1885,7 +1888,7 @@ <translation id="2935654492420446828">शाळेचे खाते नंतर जोडा</translation> <translation id="2936851848721175671">बॅकअप घ्या आणि रिस्टोअर करा</translation> <translation id="2938225289965773019"><ph name="PROTOCOL" /> लिंक उघडा</translation> -<translation id="2938845886082362843">तुमच्या सिक्युरिटी कीमध्ये स्टोअर केलेला साइन इन डेटा पाहा आणि हटवा</translation> +<translation id="2938845886082362843">तुमच्या सिक्युरिटी कीमध्ये स्टोअर केलेला साइन इन डेटा पहा आणि हटवा</translation> <translation id="2939938020978911855">उपलब्ध असलेले ब्लूटूथ डिव्हाइस दर्शवा</translation> <translation id="2941112035454246133">निम्न</translation> <translation id="2942279350258725020">Android Messages</translation> @@ -2278,7 +2281,7 @@ <translation id="3390741581549395454">Linux अॅप्स आणि फाइलचा यशस्वीरीत्या बॅकअप घेतला. अपग्रेड लवकरच सुरू होईल.</translation> <translation id="3391482648489541560">फाइलचे संपादन</translation> <translation id="3391512812407811893">प्रायव्हसी सॅंडबॉक्स चाचण्या</translation> -<translation id="339178315942519818">तुमच्या चॅट ॲप्सवरील सूचना तुमच्या <ph name="DEVICE_TYPE" /> वर पाहा</translation> +<translation id="339178315942519818">तुमच्या चॅट ॲप्सवरील सूचना तुमच्या <ph name="DEVICE_TYPE" /> वर पहा</translation> <translation id="3394850431319394743">संरक्षित आशय प्ले करण्यासाठी आयडेंटिफायर वापरण्याची अनुमती आहे</translation> <translation id="3396800784455899911">"स्वीकारा आणि सुरू ठेवा" या बटणावर क्लिक करून तुम्ही या Google सेवांसाठी वर वर्णन केलेल्या प्रक्रियांना सहमती दर्शवता.</translation> <translation id="339722927132407568">थांबतो</translation> @@ -2321,6 +2324,7 @@ <translation id="3432227430032737297">सर्व दाखवलेले काढून टाका</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">अरेरे! सिस्टम डिव्हाइस स्थापना-वेळ विशेषता लॉक इंस्टॉल करण्यात अयशस्वी.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">तुमच्या मुलासाठी अतिरिक्त वेब आणि अॅप अॅक्टिव्हिटी सेटिंग सुरू केलेले असल्यास, हा डेटा त्यांच्या Google खात्यामध्ये स्टोअर केला जाऊ शकतो. ही सेटिंग्ज आणि ती अॅडजस्ट कशी करायची याबद्दल families.google.com येथे अधिक जाणून घ्या.</translation> <translation id="3435541101098866721">नवीन फोन जोडा</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" आपल्या <ph name="CODE_TYPE" /> ची विनंती करीत आहे</translation> @@ -2452,7 +2456,7 @@ <translation id="3559533181353831840">सुमारे <ph name="TIME_LEFT" /> शिल्लक</translation> <translation id="3560034655160545939">&स्पेल चेक</translation> <translation id="3562423906127931518">या प्रक्रियेला काही मिनिटे लागू शकतात. Linux कंटेनर सेट करत आहे.</translation> -<translation id="3562655211539199254">तुमच्या फोनमधील अलीकडील Chrome टॅब पाहा</translation> +<translation id="3562655211539199254">तुमच्या फोनमधील अलीकडील Chrome टॅब पहा</translation> <translation id="3563432852173030730">कियोस्क ॲप्लिकेशन डाउनलोड केले जाऊ शकले नाही.</translation> <translation id="3564334271939054422">तुम्ही वापरत असलेल्या (<ph name="NETWORK_ID" />) वाय-फाय नेटवर्कला तुम्ही त्याच्या लॉग इन पेजला भेट देणे आवश्यक असू शकते.</translation> <translation id="3564848315152754834">USB सिक्युरिटी की</translation> @@ -2768,6 +2772,7 @@ <translation id="3884152383786131369">एकाहून अधिक भाषांमध्ये उपलब्ध असणारा वेब आशय सूचीमधील सपोर्ट असलेली पहिली भाषा वापरेल. ही प्राधान्ये तुमच्या ब्राउझर सेटिंग्जसह सिंक केली आहेत. <ph name="BEGIN_LINK_LEARN_MORE" />अधिक जाणून घ्या<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3885112598747515383">अपडेट तुमच्या अॅडमिनिस्ट्रेटरद्वारे व्यवस्थापित केली जातात</translation> <translation id="3886446263141354045">या साइट ॲक्सेस करण्याची तुमची विनंती <ph name="NAME" /> कडे पाठवली गेली आहे</translation> +<translation id="3887022758415973389">डिव्हाइसची सूची दाखवा</translation> <translation id="3888053818972567950"><ph name="WEB_DRIVE" /> कनेक्शन</translation> <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> सोबत टिपा घेणे</translation> <translation id="3888586133700543064">Assistant शी संबंधित तुमच्या समस्या आणखी चांगल्या प्रकारे समजून घेण्यात ही माहिती आम्हाला मदत करते. ती ९० दिवसांपर्यंत स्टोअर केली जाते आणि तिचा अॅक्सेस योग्य इंजिनीयरिंग आणि फीडबॅक टीमपुरता मर्यादित असतो.</translation> @@ -3299,7 +3304,7 @@ <translation id="4488502501195719518">सर्व डेटा साफ करायचा?</translation> <translation id="449126573531210296">तुमचे Google खाते वापरून सिंक केलेले पासवर्ड एंक्रिप्ट करा</translation> <translation id="449232563137139956">ऑनलाइन स्टोअर किंवा बातमीपर लेख यांसाठी फोटोसारखी इलस्ट्रेशन पुरवण्याकरिता साइट सामान्यपणे इमेज दाखवतात</translation> -<translation id="4492698018379445570">तुम्ही शॉपिंग कार्टमध्ये काय जोडले आहे ते पाहा आणि तुम्ही तयार असाल तेव्हा चेक आउट करा</translation> +<translation id="4492698018379445570">तुम्ही शॉपिंग कार्टमध्ये काय जोडले आहे ते पहा आणि तुम्ही तयार असाल तेव्हा चेक आउट करा</translation> <translation id="4493468155686877504">शिफारस केलेले (<ph name="INSTALL_SIZE" />)</translation> <translation id="4495419450179050807">या पेजवर दर्शवू नका</translation> <translation id="4497145443434063861">PC आणि Chromecast वेगवेगळ्या वाय-फाय नेटवर्कशी कनेक्ट केले आहेत (उदा. २.४ GHz @@ -3313,7 +3318,7 @@ <translation id="4504940961672722399">या आयकनवर क्लिक करुन किंवा <ph name="EXTENSION_SHORTCUT" /> दाबून हे एक्स्टेंशन वापरा.</translation> <translation id="450552327874992444">शब्द आधीच जोडला आहे</translation> <translation id="4507128560633489176">डेटा साफ केला.</translation> -<translation id="4508765956121923607">स्त्रो&त पाहा</translation> +<translation id="4508765956121923607">स्त्रो&त पहा</translation> <translation id="4510195992002502722">फीडबॅक पाठवता आला नाही. पुन्हा प्रयत्न करत आहे...</translation> <translation id="4510479820467554003">पालक खाते सूची</translation> <translation id="4510614391273086606">Linux फाइल आणि ॲप्स या गोष्टी बॅकअप घेतला होता त्या स्थितीमध्ये रीस्टोअर केल्या जात आहेत.</translation> @@ -3477,10 +3482,11 @@ <translation id="4662373422909645029">टोपणनावामध्ये अंकांचा समावेश असू शकत नाही</translation> <translation id="4662788913887017617">हा बुकमार्क आपल्या iPhone सह शेअर करा</translation> <translation id="4663373278480897665">कॅमेऱ्याला अनुमती आहे</translation> +<translation id="4664289193573249666">Chrome OS सेटिंग्जमध्ये सुरक्षित DNS व्यवस्थापित करा</translation> <translation id="4664482161435122549">PKCS #12 निर्यात एरर</translation> <translation id="4665014895760275686">निर्माता</translation> <translation id="4665446389743427678"><ph name="SITE" /> द्वारे स्टोअर केलेला डेटा हटवला जाईल.</translation> -<translation id="4666472247053585787">तुमच्या फोनवरील सूचना तुमच्या <ph name="DEVICE_TYPE" /> वर पाहा</translation> +<translation id="4666472247053585787">तुमच्या फोनवरील सूचना तुमच्या <ph name="DEVICE_TYPE" /> वर पहा</translation> <translation id="4666911709726371538">आणखी अॅप्स</translation> <translation id="4668721319092543482"><ph name="PLUGIN_NAME" /> सुरू करण्यासाठीवर क्लिक करा</translation> <translation id="4670064810192446073">आभासी वास्तविकता</translation> @@ -3875,7 +3881,7 @@ <translation id="5121130586824819730">तुमची हार्ड डिस्क पूर्ण भरली आहे. कृपया दुसर्या स्थानावर सेव्ह करा किंवा हार्ड डिस्कवर अधिक जागा तयार करा.</translation> <translation id="5123433949759960244">बास्केटबॉल</translation> <translation id="5125751979347152379">चुकीची URL.</translation> -<translation id="5126611267288187364">बदल पाहा</translation> +<translation id="5126611267288187364">बदल पहा</translation> <translation id="5127620150973591153">सुरक्षित कनेक्शन आयडी: <ph name="TOKEN" /></translation> <translation id="5127805178023152808">सिंक बंद आहे</translation> <translation id="5127881134400491887">नेटवर्क कनेक्शन व्यवस्थापित करा</translation> @@ -4030,7 +4036,7 @@ <translation id="529296195492126134">क्षणिक मोडला सपोर्ट नाही. कृपया तुमच्या अॅडमिनिस्ट्रेटरशी संपर्क साधा</translation> <translation id="5293170712604732402">सेटिंग्ज त्यांच्या मूळ डीफॉल्टवर रिस्टोअर करा</translation> <translation id="5294097441441645251">लोअरकेस वर्ण किंवा अंडरस्कोअरने सुरू होणे आवश्यक आहे</translation> -<translation id="5297082477358294722">पासवर्ड सेव्ह केलेले आहेत. तुमच्या <ph name="SAVED_PASSWORDS_STORE" /> मध्ये सेव्ह केलेले पासवर्ड पाहा आणि व्यवस्थापित करा.</translation> +<translation id="5297082477358294722">पासवर्ड सेव्ह केलेले आहेत. तुमच्या <ph name="SAVED_PASSWORDS_STORE" /> मध्ये सेव्ह केलेले पासवर्ड पहा आणि व्यवस्थापित करा.</translation> <translation id="5298219193514155779">द्वारा निर्मित थीम</translation> <translation id="5299109548848736476">Do Not Track</translation> <translation id="5299558715747014286">तुमचे टॅब गट पहा आणि व्यवस्थापित करा</translation> @@ -4141,7 +4147,7 @@ <translation id="5427278936122846523">नेहमी भाषांतर करा</translation> <translation id="5427459444770871191">&घड्याळाच्या दिशेने फिरवा</translation> <translation id="5428850089342283580"><ph name="ACCNAME_APP" /> (अपडेट उपलब्ध आहे)</translation> -<translation id="542948651837270806">विश्वासू प्लॅटफॉर्म मॉड्युल फर्मवेयरचा एखादा अपडेट इंस्टॉल करणे आवश्यक आहे. <ph name="TPM_FIRMWARE_UPDATE_LINK" /> पाहा</translation> +<translation id="542948651837270806">विश्वासू प्लॅटफॉर्म मॉड्युल फर्मवेयरचा एखादा अपडेट इंस्टॉल करणे आवश्यक आहे. <ph name="TPM_FIRMWARE_UPDATE_LINK" /> पहा</translation> <translation id="5430931332414098647">झटपट टेदरिंग</translation> <translation id="5431318178759467895">रंग</translation> <translation id="543338862236136125">पासवर्ड संपादित करा</translation> @@ -5906,7 +5912,7 @@ <translation id="7376553024552204454">माउस कर्सर हलताना हायलाइट करा</translation> <translation id="737728204345822099">तुम्ही या साइटला भेट दिल्याचे रेकॉर्ड कदाचित तुमच्या सिक्युरिटी कीमध्ये समाविष्ट केले जाईल.</translation> <translation id="7377451353532943397">सेन्सर ॲक्सेस ब्लॉक करणे सुरू ठेवा</translation> -<translation id="7378611153938412599">कमकुवत पासवर्ड ओळखणे सोपे असते. तुम्ही क्लिष्ट पासवर्ड तयार करत असल्याची खात्री करा. <ph name="BEGIN_LINK" />आणखी सुरक्षा टिपा पाहा.<ph name="END_LINK" /></translation> +<translation id="7378611153938412599">कमकुवत पासवर्ड ओळखणे सोपे असते. तुम्ही क्लिष्ट पासवर्ड तयार करत असल्याची खात्री करा. <ph name="BEGIN_LINK" />आणखी सुरक्षा टिपा पहा.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Chrome वेब स्टोअर उघडा</translation> <translation id="7380622428988553498">डिव्हाइसच्या नावामध्ये चुकीच्या वर्णांचा समावेश आहे</translation> <translation id="7380768571499464492"><ph name="PRINTER_NAME" /> अपडेट केला</translation> @@ -6005,11 +6011,12 @@ <translation id="7476454130948140105">अपडेटसाठी बॅटरी खूप कमी (<ph name="BATTERY_PERCENT" />%) आहे</translation> <translation id="7476989672001283112">आपोआप ब्लॉक केलेले <ph name="PERMISSION" /> आणि आणखी <ph name="COUNT" /></translation> <translation id="7477748600276493962">या पेजसाठी QR कोड तयार करा</translation> -<translation id="7477793887173910789">व्हिडिओ पाहा आणि बरेच काही नियंत्रित करा</translation> +<translation id="7477793887173910789">व्हिडिओ पहा आणि बरेच काही नियंत्रित करा</translation> <translation id="7478485216301680444">कियोस्क ॲप्लिकेशन इंस्टॉल केले जाऊ शकले नाही.</translation> <translation id="7478623944308207463">तुम्ही तुमचे Google खाते वापरून साइन इन केले आहे त्या सर्व Chrome OS डिव्हाइसवर तुमची अॅप्स आणि सेटिंग्ज सिंक होतील. ब्राउझर सिंक पर्यायांसाठी, <ph name="LINK_BEGIN" />Chrome सेटिंग्ज<ph name="LINK_END" /> वर जा.</translation> <translation id="7478658909253570368">साइटना सिरीअल पोर्टशी कनेक्ट करण्याची अनुमती देऊ नका</translation> <translation id="7479221278376295180">स्टोरेज वापराचे अवलोकन</translation> +<translation id="747981547666531654"><ph name="FIRST_DEVICE" /> आणि <ph name="SECOND_DEVICE" /> नावाच्या ब्लूटूथ डिव्हाइसशी कनेक्ट केले आहे</translation> <translation id="7481312909269577407">पुढील</translation> <translation id="7481358317100446445">तयार</translation> <translation id="748138892655239008">सर्टिफिकेट मूळ प्रतिबंध</translation> @@ -6062,6 +6069,7 @@ <translation id="7531771599742723865">डिव्हाइस वापरात आहे</translation> <translation id="7531779363494549572">सेटिंग्ज > ॲप्स आणि सूचना > सूचना वर जा.</translation> <translation id="7532009420053991888"><ph name="LINUX_APP_NAME" /> प्रतिसाद देत नाही. अॅप बंद करण्यासाठी "सक्तीने बंद करा" निवडा.</translation> +<translation id="7535730537657706072">तुमच्या डिव्हाइसवरून गुप्त मोडमधील ब्राउझिंग इतिहास साफ करण्यासाठी सर्व गुप्त टॅब बंद करा</translation> <translation id="7535791657097741517">फिकट थीम सुरू करा</translation> <translation id="7537451260744431038">तुमच्या ब्राउझिंग अनुभवात सुधारणा करण्यासाठी, उदाहरणार्थ, तुम्हाला साइन इन केलेले ठेवण्यासाठी किंवा तुमच्या शॉपिंग कार्टमधील आयटम लक्षात ठेवण्यासाठी साइट कुकी वापरू शकत नाहीत</translation> <translation id="753769905878158714">अॅड्रेस बारमध्ये, तुम्हाला शोधायच्या असलेल्या वेबसाइटचा कीवर्ड एंटर करा. त्यानंतर, पुढे सुरू ठेवण्यासाठी कीबोर्ड शॉर्टकट वापरा.</translation> @@ -6377,7 +6385,7 @@ <translation id="783229689197954457">Google ला सवलत आढळल्यास, तुम्हाला ती या पेजवर दिसेल</translation> <translation id="7833720883933317473">सेव्ह केलेले कस्टम शब्द येथे दिसून येतील</translation> <translation id="7835178595033117206">बुकमार्क काढून टाकले</translation> -<translation id="7836850009646241041">तुमच्या सिक्युरिटी कीला पुन्हा स्पर्श करून पाहा</translation> +<translation id="7836850009646241041">तुमच्या सिक्युरिटी कीला पुन्हा स्पर्श करून पहा</translation> <translation id="7837776265184002579">तुमचे होम पेज <ph name="URL" /> मध्ये बदलले.</translation> <translation id="7838971600045234625">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> वर <ph name="ATTACHMENTS" /> पाठवली}other{<ph name="DEVICE_NAME" /> वर <ph name="ATTACHMENTS" /> पाठवल्या}}</translation> <translation id="7839051173341654115">पहा/बॅकअप घ्या मीडिया</translation> @@ -6502,7 +6510,7 @@ <translation id="7961015016161918242">कधीही नाही</translation> <translation id="7963001036288347286">टचपॅड अॅक्सिलरेशन</translation> <translation id="7963608432878156675">हे नाव इतर डिव्हाइसच्या ब्लूटूथ आणि नेटवर्क कनेक्शनसाठी दृश्यमान आहे</translation> -<translation id="7963826112438303517">तुमचे व्हॉइस मॉडेल तयार करण्यासाठी आणि अपडेट करण्यासाठी तुमचे असिस्टंट ही रेकॉर्डिंग आणि तुमच्या बोललेल्या विनंत्या वापरते, जे फक्त तुम्ही Voice Match सुरू केलेल्या डिव्हाइसवर स्टोअर केले जाते. असिस्टंट सेटिंग्जमध्ये व्हॉइस अॅक्टिव्हिटी पाहा किंवा पुन्हा शिका.</translation> +<translation id="7963826112438303517">तुमचे व्हॉइस मॉडेल तयार करण्यासाठी आणि अपडेट करण्यासाठी तुमचे असिस्टंट ही रेकॉर्डिंग आणि तुमच्या बोललेल्या विनंत्या वापरते, जे फक्त तुम्ही Voice Match सुरू केलेल्या डिव्हाइसवर स्टोअर केले जाते. असिस्टंट सेटिंग्जमध्ये व्हॉइस अॅक्टिव्हिटी पहा किंवा पुन्हा शिका.</translation> <translation id="7966241909927244760">इमेज पत्ता कॉपी करा</translation> <translation id="7966571622054096916">{COUNT,plural, =1{बुकमार्क सूचीमध्ये एक आयटम}other{बुकमार्क सूचीमध्ये {COUNT} आयटम}}</translation> <translation id="7968072247663421402">पुरवठादार पर्याय</translation> @@ -6677,6 +6685,7 @@ <translation id="8138217203226449454">तुम्हाला तुमचा शोध पुरवठादार बदलायचा आहे का?</translation> <translation id="8138997515734480534"><ph name="VM_NAME" /> स्टेटस</translation> <translation id="8139447493436036221">Google Drive फाइल</translation> +<translation id="8140070492745508800"><ph name="FIRST_DEVICE" />, <ph name="SECOND_DEVICE" /></translation> <translation id="8141584439523427891">आता पर्यायी ब्राउझरमध्ये उघडत आहे</translation> <translation id="8141725884565838206">तुमचे पासवर्ड व्यवस्थापित करा</translation> <translation id="814204052173971714">{COUNT,plural, =1{व्हिडिओ}other{# व्हिडिओ}}</translation> @@ -7001,7 +7010,7 @@ <translation id="8512476990829870887">प्रक्रिया समाप्त करा</translation> <translation id="851263357009351303"> <ph name="HOST" /> ना इमेज दर्शविण्यासाठी नेहमी परवानगी द्या </translation> <translation id="8513108775083588393">ऑटो-रोटेट</translation> -<translation id="8514746246728959655">वेगळी सिक्युरिटी की वापरून पाहा</translation> +<translation id="8514746246728959655">वेगळी सिक्युरिटी की वापरून पहा</translation> <translation id="8523493869875972733">बदल राहू द्या</translation> <translation id="8523849605371521713">धोरणाने जोडले</translation> <translation id="8524783101666974011">तुमच्या Google खात्यात कार्डे सेव्ह करा</translation> @@ -7222,7 +7231,7 @@ <translation id="8749863574775030885">अज्ञात विक्रेत्याकडील USB डिव्हाइस ॲक्सेस करा</translation> <translation id="8750155211039279868"><ph name="ORIGIN" /> ला सिरीअल पोर्टशी कनेक्ट करायचे आहे</translation> <translation id="8750346984209549530">मोबाइल APN</translation> -<translation id="8753868764580670305">या डिव्हाइसवर सेव्ह केलेले पासवर्ड पाहा आणि व्यवस्थापित करा</translation> +<translation id="8753868764580670305">या डिव्हाइसवर सेव्ह केलेले पासवर्ड पहा आणि व्यवस्थापित करा</translation> <translation id="8754200782896249056"><p>सपोर्टेड डेस्कटॉप परिस्थिती अंतर्गत <ph name="PRODUCT_NAME" /> चालविताना, सिस्टम प्रॉक्सी सेटिंग्ज वापरल्या जातील. तथापि, एकतर तुमची सिस्टमला सपोर्ट नाही नसते किंवा तुमचे सिस्टम कॉंफिगरेशन लाँच करताना समस्या आली.</p> </p>परंतु तुम्ही अद्याप कमांड लाइन कॉंफिगर करू शकता. कृपया फ्लॅग आणि परिस्थिती व्हेरिएबलांवरील अधिक माहितीसाठी <code>man <ph name="PRODUCT_BINARY_NAME" /></code> पहा.</p></translation> @@ -7286,7 +7295,7 @@ <translation id="8814190375133053267">वाय-फाय</translation> <translation id="8814319344131658221">स्पेल चेकच्या भाषा तुमच्या भाषा प्राधान्यावर आधारित आहेत</translation> <translation id="8814644416678422095">हार्ड ड्राइव्ह</translation> -<translation id="8814687660896548945">कृपया वाट पाहा, संग्रहण स्कॅन केले जात आहे...</translation> +<translation id="8814687660896548945">कृपया वाट पहा, संग्रहण स्कॅन केले जात आहे...</translation> <translation id="881782782501875829">पोर्ट क्रमांक जोडा</translation> <translation id="881799181680267069">अन्य लपवा</translation> <translation id="8818152010000655963">वॉलपेपर</translation> @@ -7317,7 +7326,7 @@ <translation id="8838601485495657486">अपारदर्शक</translation> <translation id="8838770651474809439">हॅमबर्गर</translation> <translation id="883911313571074303">इमेजवर भाष्य करा</translation> -<translation id="8841843049738266382">अनुमती दिलेल्या सूची मधील वापरकर्ते पाहा आणि बदला</translation> +<translation id="8841843049738266382">अनुमती दिलेल्या सूची मधील वापरकर्ते पहा आणि बदला</translation> <translation id="8842594465773264717">हे फिंगरप्रिंट हटवा</translation> <translation id="8845001906332463065">मदत मिळवा</translation> <translation id="8846132060409673887">या कॉंप्युटरची उत्पादक आणि मॉडेल माहिती वाचा</translation> @@ -7392,6 +7401,7 @@ <translation id="8909782404367982052">Google Lens वापरून इमेजमधील गोष्टी शोधण्यासाठी ड्रॅग करा</translation> <translation id="8909833622202089127">साइट तुमचे स्थान ट्रॅक करत आहे</translation> <translation id="8910222113987937043">आपल्या बुकमार्क, इतिहास आणि अन्य सेटिंग्जसाठी बदल यापुढे आपल्या Google खात्यासह संकालित केले जाणार नाहीत. तथापि, तुमचा विद्यमान डेटा आपल्या Google खात्यामध्ये संग्रहित केलेला असेल आणि <ph name="BEGIN_LINK" />Google डॅशबोर्ड<ph name="END_LINK" /> वर व्यवस्थापित केला जाऊ शकतो.</translation> +<translation id="8910987510378294980">डिव्हाइसची सूची लपवा</translation> <translation id="8912362522468806198">Google खाते</translation> <translation id="8912793549644936705">पसरवा</translation> <translation id="8912810933860534797">ऑटो- स्कॅन सुरू करा</translation> @@ -7509,6 +7519,7 @@ <translation id="9033765790910064284">तरीही सुरू ठेवा</translation> <translation id="9033857511263905942">&पेस्ट करा</translation> <translation id="903480517321259405">पिन पुन्हा टाइप करा</translation> +<translation id="9037054491984310631"><ph name="DEVICE" /> नावाच्या ब्लूटूथ डिव्हाइसशी कनेक्ट केले आहे</translation> <translation id="9037640663275993951">डिव्हाइसला अनुमती नाही</translation> <translation id="9037818663270399707">तुमचे कनेक्शन सर्व नेटवर्क ट्रॅफिकसाठी खाजगी नाही</translation> <translation id="9037965129289936994">मूळ दर्शवा</translation> @@ -7589,6 +7600,7 @@ <translation id="9112786533191410418"><ph name="FILE_NAME" /> धोकादायक असू शकते. स्कॅन करण्यासाठी Google ला पाठवायची आहे का?</translation> <translation id="9112987648460918699">शोधा...</translation> <translation id="9113240369465613386">फक्त विषम संख्या असलेली पेज</translation> +<translation id="9113469270512809735">अलीकडे बंद केलेले आयटम टॉगल करा</translation> <translation id="9114663181201435112">सहजपणे साइन इन करा</translation> <translation id="9115675100829699941">&बुकमार्क</translation> <translation id="9116465289595958864">अखेरचे सुधारित केले</translation> @@ -7629,7 +7641,7 @@ <translation id="9157697743260533322">सर्व वापरकर्त्यांसाठी ऑटोमॅटिक अपडेट सेट करण्यात अयशस्वी झाले (प्रीफ्लाइट लाँच एरर: <ph name="ERROR_NUMBER" />)</translation> <translation id="9157915340203975005">प्रिंटरचे झाकण उघडे आहे</translation> <translation id="9158715103698450907">अरेरे! ऑथेंटिकेशनदरम्यान एक नेटवर्क संवाद समस्या आली. कृपया तुमचे नेटवर्क कनेक्शन तपासा आणि पुन्हा प्रयत्न करा.</translation> -<translation id="9159643062839240276">हे करून पाहा: +<translation id="9159643062839240276">हे करून पहा: <ph name="BEGIN_LIST" /> <ph name="LIST_ITEM" />नेटवर्क केबल, मोडेम आणि राउटर तपासणे <ph name="LIST_ITEM" />वाय-फाय पुन्हा कनेक्ट करणे
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index c416227..135e7ab1 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -2325,6 +2325,7 @@ <translation id="3432227430032737297">Alih Keluar Semua Yang Ditunjukkan</translation> <translation id="3432762828853624962">Pekerja Kongsi</translation> <translation id="3433621910545056227">Op! Sistem gagal mewujudkan kunci atribut masa pemasangan peranti.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Jika tetapan Aktiviti Web & Apl tambahan dihidupkan untuk anak anda, data ini mungkin disimpan pada Akaun Googlenya. Ketahui lebih lanjut tentang tetapan ini dan cara melaraskan tetapan ini melalui families.google.com.</translation> <translation id="3435541101098866721">Tambah telefon baharu</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" meminta <ph name="CODE_TYPE" /> anda</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index b93fce7..92fb313 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -2323,6 +2323,7 @@ <translation id="3432227430032737297">ပြသထားသည်များအားလုံးကို ဖယ်ရှားရန်</translation> <translation id="3432762828853624962">မျှဝေထားသော လုပ်သားများ</translation> <translation id="3433621910545056227">အို၊ သော့ချရန် လိုအပ်သည့် စက်ပစ္စည်းတပ်ဆင်ချိန်အား စနစ်မှ မစတင်နိုင်ပါ။</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">သင့်ကလေးအတွက် ထပ်တိုး 'ဝဘ်နှင့် အက်ပ်လုပ်ဆောင်ချက်' ကို ဖွင့်ထားသည့်အခါ ဤဒေတာကို သူ၏ Google အကောင့်သို့ သိမ်းသွားပါမည်။ ဤဆက်တင်များနှင့် ၎င်းတို့အား ချိန်ညှိနည်းကို families.google.com တွင် ပိုမိုလေ့လာပါ။</translation> <translation id="3435541101098866721">ဖုန်းအသစ်ထည့်ပါ</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" သည် သင့် <ph name="CODE_TYPE" /> ကို တောင်းဆိုနေသည်</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb index c1006bd..ae58d02f 100644 --- a/chrome/app/resources/generated_resources_ne.xtb +++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -157,6 +157,7 @@ <translation id="1165039591588034296">त्रुटि</translation> <translation id="1166212789817575481">दायाँ तिरका ट्याबहरू बन्द गर्नुहोस्</translation> <translation id="1166583374608765787">परिवर्तन गरिएको नामको समीक्षा गर्नुहोस्</translation> +<translation id="1166596238782048887"><ph name="TAB_TITLE" /> ट्याब <ph name="DESK_TITLE" /> डेस्कअन्तर्गत पर्छ</translation> <translation id="1168020859489941584"><ph name="TIME_REMAINING" /> मा खुल्दै...</translation> <translation id="1170288591054440704">कुनै साइटले मेरो यन्त्रमा इन्स्टल गरिएका फन्ट प्रयोग गर्न खोज्दा त्यसो गर्न दिने कि नदिने भनी सोधियोस्</translation> <translation id="1171135284592304528">वस्तु परिवर्तन हुँदा किबोर्डको फोकस मार्फत त्यस वस्तुलाई हाइलाइट गर्नुहोस्</translation> @@ -614,6 +615,7 @@ <translation id="1640235262200048077"><ph name="IME_NAME" /> ले Linux का एपहरूमा अझै काम गर्दैन</translation> <translation id="1640283014264083726">RSA इन्क्रिप्शनको साथमा PKCS #1 MD4</translation> <translation id="1641113438599504367">सुरक्षित ब्राउजिङ</translation> +<translation id="1642492862748815878"><ph name="DEVICE" /> र अन्य <ph name="NUMBER_OF_DEVICES" /> वटा ब्लुटुथ डिभाइसमा कनेक्ट गरिएको छ</translation> <translation id="1642494467033190216">अन्य डिबगिङ सुविधाहरू सक्षम गर्नुअघि rootfs संरक्षण हटाउनु र रिस्टार्ट गर्नु आवश्यक छ।</translation> <translation id="1643072738649235303">SHA-1 सहितको X9.62 ECDSA हस्ताक्षर</translation> <translation id="1643921258693943800">नजिकैका डिभाइससँग सेयर गर्ने सुविधा प्रयोग गर्न ब्लुटुथ र Wi-Fi अन गर्नुहोस्</translation> @@ -1817,6 +1819,7 @@ <translation id="2885378588091291677">कार्य व्यवस्थापक</translation> <translation id="2885729872133513017">सर्भरको जवाफ डिकोडिङ गर्ने क्रममा कुनै समस्या भयो।</translation> <translation id="2886771036282400576">• <ph name="PERMISSION" /></translation> +<translation id="288734198558082692"><ph name="DEVICE" /> र अन्य <ph name="NUMBER_OF_DEVICES" /> वटा डिभाइस</translation> <translation id="2889064240420137087">कृपया लिङ्क खोल्नुहोस्...</translation> <translation id="2891922230654533301"><ph name="APP_NAME" /> मा साइन इन गर्न तपाईंको यन्त्र प्रयोग गर्ने हो?</translation> <translation id="2893168226686371498">डिफल्ट ब्राउजर</translation> @@ -2305,6 +2308,7 @@ <translation id="3432227430032737297">देखाइएका सबै कुराहरू हटाउनुहोस्</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">ओहो! प्रणालीले यन्त्र स्थापना-समय विशेषण लक स्थापना गर्न असफल भयो।</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">तपाईंका बच्चाका खातामा वेब तथा एपसम्बन्धी अतिरिक्त गतिविधिको सेटिङ सक्रिय गरिएको छ भने यो डेटा उनको Google खातामा सुरक्षित गरिन सक्छ। families.google.com मा गएर यी सेटिङहरू र यिनलाई मिलाउने तरिकाबारे थप जान्नुहोस्।</translation> <translation id="3435541101098866721">नयाँ फोन थप्नुहोस्</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" ले तपाईंको <ph name="CODE_TYPE" /> को अनुरोध गर्दैछ</translation> @@ -2752,6 +2756,7 @@ <translation id="3884152383786131369">एकभन्दा बढी भाषामा उपलब्ध वेब सामग्री यो सूचीको प्रयोग गर्न मिल्ने पहिलो भाषामा देखाइने छ। यी प्राथमिकताहरू तपाईंको ब्राउजरका सेटिङसँग सिंक गरिन्छन्। <ph name="BEGIN_LINK_LEARN_MORE" />थप जान्नुहोस्<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3885112598747515383">तपाईंका एड्मिनले अपडेटसम्बन्धी काम गर्नुहुन्छ</translation> <translation id="3886446263141354045">यो साइटमाथि पहुँच राख्ने तपाईंको अनुरोध <ph name="NAME" /> लाई पठाइएको छ</translation> +<translation id="3887022758415973389">डिभाइसको सूची देखाइयोस्</translation> <translation id="3888053818972567950"><ph name="WEB_DRIVE" /> कनेक्सन</translation> <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> मार्फत टिपोट लिँदै</translation> <translation id="3888586133700543064">यो जानकारीले हामीलाई तपाईंका सहायकसम्बन्धी समस्याहरू अझ राम्ररी बुझ्न मद्दत गर्छ। यो जानकारी ९० दिनसम्म भण्डारण गरिन्छ र अनुमति प्राप्त इन्जिनियरिङ तथा प्रतिक्रिया टोलीका सदस्यले मात्र यो जानकारी हेर्न तथा प्रयोग गर्न पाउँछन्।</translation> @@ -3461,6 +3466,7 @@ <translation id="4662373422909645029">उपनाममा अङ्क प्रयोग गर्न पाइँदैन</translation> <translation id="4662788913887017617">यो बुकमार्कलाई आफ्नो iPhone सँग सेयर गर्नुहोस्</translation> <translation id="4663373278480897665">क्यामेरा प्रयोग गर्ने अनुमति छ</translation> +<translation id="4664289193573249666">Chrome OS का सेटिङमा गई Secure DNS व्यवस्थापन गर्नुहोस्</translation> <translation id="4664482161435122549">PKCS #12 निर्यात त्रुटि</translation> <translation id="4665014895760275686">निर्माता</translation> <translation id="4665446389743427678"><ph name="SITE" /> ले भण्डारण गरेको सबै डेटा मेटाइने छ।</translation> @@ -5992,6 +5998,7 @@ <translation id="7478623944308207463">तपाईंले आफ्नो Google खातामार्फत साइन इन गर्नुभएका Chrome OS चल्ने यन्त्रहरूमा तपाईंका एप तथा सेटिङ सिंक हुने छन्। ब्राउजरका सिंकसम्बन्धी विकल्पहरू हेर्न <ph name="LINK_BEGIN" />Chrome का सेटिङ<ph name="LINK_END" />मा जानुहोस्।</translation> <translation id="7478658909253570368">साइटहरूलाई सिरियल पोर्टमा कनेक्ट गर्ने अनुमति नदिइयोस्</translation> <translation id="7479221278376295180">भण्डारणको प्रयोगसम्बन्धी संक्षिप्त विवरण</translation> +<translation id="747981547666531654"><ph name="FIRST_DEVICE" /> र <ph name="SECOND_DEVICE" /> नामक ब्लुटुथ डिभाइसमा कनेक्ट गरिएको छ</translation> <translation id="7481312909269577407">अगाडि</translation> <translation id="7481358317100446445">तयार छ</translation> <translation id="748138892655239008">प्रमाणपत्र आधारभूत अवरोधहरू</translation> @@ -6044,6 +6051,7 @@ <translation id="7531771599742723865">यो डिभाइस प्रयोग भइरहेको छ</translation> <translation id="7531779363494549572">सेटिङहरू > एप तथा सूचनाहरू > सूचनाहरू नामक विकल्पमा जानुहोस्।</translation> <translation id="7532009420053991888"><ph name="LINUX_APP_NAME" /> ले प्रतिक्रिया जनाइरहेको छैन। एप बन्द गर्न "बलपूर्वक बन्द गर्नुहोस्" चयन गर्नुहोस्।</translation> +<translation id="7535730537657706072">तपाईंले आफ्नो डिभाइसमा इन्कोग्निटो मोडमा ब्राउजर चलाउँदा खोलिएका वेबसाइट तथा वेबपेजहरूको विवरण मेटाउन सबै इन्कोग्निटो ट्याब बन्द गर्नुहोस्</translation> <translation id="7535791657097741517">उज्यालो थिम अन गर्नुहोस्</translation> <translation id="7537451260744431038">साइटहरूले तपाईंलाई राम्रो ब्राउजिङ अनुभव दिन कुकीहरूको प्रयोग गर्न सक्दैनन्। उदाहरणको लागि साइटहरूले कुकीहरूको प्रयोग गरी तपाईंलाई साइन इन अवस्थामै राख्न वा तपाईंको किनमेलको कार्टमा भएका वस्तुहरू सम्झन सक्दैनन्।</translation> <translation id="753769905878158714">एड्रेस बारमा आफूले खोज्न चाहेको वेबसाइटको किवर्ड हाल्नुहोस्। त्यसपछि जारी राख्न किबोर्डका सर्टकट प्रयोग गर्नुहोस्।</translation> @@ -6660,6 +6668,7 @@ <translation id="8138217203226449454">तपाईंले आफ्नो खोज प्रदायक परिवर्तन गर्न खोज्नुभएको हो?</translation> <translation id="8138997515734480534"><ph name="VM_NAME" /> को स्थिति</translation> <translation id="8139447493436036221">Google Drive मा भएका फाइलहरू</translation> +<translation id="8140070492745508800"><ph name="FIRST_DEVICE" />, <ph name="SECOND_DEVICE" /></translation> <translation id="8141584439523427891">अहिले वैकल्पिक ब्राउजरमा खोल्दै</translation> <translation id="8141725884565838206">तपाइँका पासवर्डहरू व्यवस्थापित गर्नुहोस्</translation> <translation id="814204052173971714">{COUNT,plural, =1{एउटा भिडियो}other{# वटा भिडियो}}</translation> @@ -7374,6 +7383,7 @@ <translation id="8909782404367982052">Google लेन्समार्फत फोटोहरू खोज्न ड्र्याग गर्नुहोस्</translation> <translation id="8909833622202089127">साइटले तपाईंको स्थान ट्र्याक गर्दैछ</translation> <translation id="8910222113987937043">तपाईंका पुस्तक चिन्ह, इतिहास, पासवर्ड र अन्य सेटिङहरूका परिवर्तनहरू अब उप्रान्त तपाईंको Google खातामा सिंक हुने छैनन्। तैपनि तपाईंको विद्यमान डेटा तपाईंको Google खातामा भण्डारण गरिएको अवस्थामा रहिरहनेछ र <ph name="BEGIN_LINK" />Google ड्यासबोर्ड<ph name="END_LINK" /> मा गई व्यवस्थित गर्न सकिन्छ।</translation> +<translation id="8910987510378294980">डिभाइसको सूची लुकाइयोस्</translation> <translation id="8912362522468806198">Google खाता</translation> <translation id="8912793549644936705">तन्काउनुहोस्</translation> <translation id="8912810933860534797">स्वतः स्क्यान गर्ने सुविधा सक्षम पार्नुहोस्</translation> @@ -7491,6 +7501,7 @@ <translation id="9033765790910064284">जे भए पनि जारी राख्नुहोस्</translation> <translation id="9033857511263905942">&टाँस्नुहोस्</translation> <translation id="903480517321259405">PIN फेरि टाइप गर्नुहोस्</translation> +<translation id="9037054491984310631"><ph name="DEVICE" /> नामक ब्लुटुथ डिभाइसमा कनेक्ट गरिएको छ</translation> <translation id="9037640663275993951">यो डिभाइस प्रयोग गर्ने अनुमति दिइएको छैन</translation> <translation id="9037818663270399707">तपाईंको कनेक्सन सबै नेटवर्क ट्राफिकका लागि निजी हुँदैन</translation> <translation id="9037965129289936994">मूल पाठ देखाउनुहोस्</translation> @@ -7571,6 +7582,7 @@ <translation id="9112786533191410418"><ph name="FILE_NAME" /> हानिकारक हुन सक्छ। यो फाइल सुरक्षित छ कि छैन भनी स्क्यान गर्न यसलाई Google मा पठाउने हो?</translation> <translation id="9112987648460918699">फेला पार्नुहोस्...</translation> <translation id="9113240369465613386">बिजोर नम्बर भएका पेजहरू मात्र</translation> +<translation id="9113469270512809735">हालसालै बन्द गरिएका वस्तुहरू टगल गरिऊन्</translation> <translation id="9114663181201435112">सजिलो तरिकाले साइन इन गर्नुहोस्</translation> <translation id="9115675100829699941">&बुकमार्कहरू</translation> <translation id="9116465289595958864">पछिल्लो पटक परिमार्जन गरिएको</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index 2c5a594..470df39 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -2309,6 +2309,7 @@ <translation id="3432227430032737297">Getoonde verwijderen</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">Het systeem kan de vergrendeling van de instellingen ten tijde van de apparaatinstallatie niet uitvoeren.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Als je de instelling voor aanvullende Web- en app-activiteit hebt aangezet voor je kind, kunnen deze gegevens worden opgeslagen in het Google-account van je kind. Meer informatie over deze instellingen en hoe je deze kunt aanpassen vind je op families.google.com.</translation> <translation id="3435541101098866721">Telefoonnummer toevoegen</translation> <translation id="3435688026795609344"><ph name="EXTENSION_NAME" /> vraagt om je <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index da33b2e..cd7ae16 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -2319,6 +2319,7 @@ <translation id="3432227430032737297">Fjern alle som vises</translation> <translation id="3432762828853624962">Delte arbeidere (SharedWorker)</translation> <translation id="3433621910545056227">Beklager. Systemet kunne ikke oppdage enhetens attributtlås for installasjonstid.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" /> %</translation> <translation id="3434272557872943250">Hvis du har slått på innstillingen for annen nett- og appaktivitet for barnet ditt, kan disse dataene bli lagret i barnets Google-konto. Finn ut mer om disse innstillingene og hvordan du justerer dem, på families.google.com.</translation> <translation id="3435541101098866721">Legg til ny telefon</translation> <translation id="3435688026795609344">«<ph name="EXTENSION_NAME" />» ber om <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb index b1759e7..3e339b97 100644 --- a/chrome/app/resources/generated_resources_or.xtb +++ b/chrome/app/resources/generated_resources_or.xtb
@@ -2305,6 +2305,7 @@ <translation id="3432227430032737297">ସମସ୍ତ ପ୍ରଦର୍ଶନକୁ କାଢ଼ି ଦିଅନ୍ତୁ</translation> <translation id="3432762828853624962">ସେୟାର୍ କରାଯାଇଥିବା କର୍ମୀ</translation> <translation id="3433621910545056227">ଓହୋ! ସିଷ୍ଟମ୍, ଡିଭାଇସ୍ ଇନ୍ଷ୍ଟଲେସନ୍-ସମୟ ବୈଶିଷ୍ଟ୍ୟ ଲକ୍ ସ୍ଥାପନା କରିବାରେ ବିଫଳ ହୋଇଛି।</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">ଯଦି ଆପଣଙ୍କ ପିଲା ପାଇଁ ଅତିରିକ୍ତ ୱେବ୍ ଏବଂ ଆପ୍ କାର୍ଯ୍ୟକଳାପ ସେଟିଂସ୍ ଚାଲୁ ଥାଏ, ତେବେ ଏହି ଡାଟା ତା'ର Google ଆକାଉଣ୍ଟରେ ସେଭ୍ ହୋଇପାରେ। ଏହି ସେଟିଂସ୍ ଏବଂ ସେଗୁଡ଼ିକୁ କିପରି ଆଡଜଷ୍ଟ କରାଯାଏ, ସେ ବିଷୟରେ families.google.comରେ ଅଧିକ ଜାଣନ୍ତୁ।</translation> <translation id="3435541101098866721">ନୂଆ ଫୋନ୍ ଯୋଗ କରନ୍ତୁ</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" ଆପଣଙ୍କ <ph name="CODE_TYPE" />ର ଅନୁରୋଧ କରୁଛି</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index 74d3f31..784f9598 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -161,6 +161,7 @@ <translation id="1165039591588034296">ਗੜਬੜ</translation> <translation id="1166212789817575481">ਟੈਬਸ ਨੂੰ ਸੱਜੇ ਪਾਸੇ ਬੰਦ ਕਰੋ</translation> <translation id="1166583374608765787">ਨਾਮ ਸੰਬੰਧੀ ਅੱਪਡੇਟ ਦੀ ਸਮੀਖਿਆ ਕਰੋ</translation> +<translation id="1166596238782048887"><ph name="TAB_TITLE" /> ਡੈਸਕ <ph name="DESK_TITLE" /> ਨਾਲ ਸੰਬੰਧਿਤ ਹੈ</translation> <translation id="1168020859489941584"><ph name="TIME_REMAINING" /> ਵਿੱਚ ਖੋਲ੍ਹ ਰਿਹਾ ਹੈ...</translation> <translation id="1170288591054440704">ਜਦੋਂ ਕੋਈ ਸਾਈਟ ਤੁਹਾਡੇ ਡੀਵਾਈਸ 'ਤੇ ਸਥਾਪਤ ਫ਼ੌਂਟਾਂ ਨੂੰ ਵਰਤਣਾ ਚਾਹੁੰਦੀ ਹੈ ਤਾਂ ਪੁੱਛੋ</translation> <translation id="1171135284592304528">ਔਬਜੈਕਟ ਦੇ ਬਦਲਣ 'ਤੇ ਉਸ ਨੂੰ ਕੀ-ਬੋਰਡ ਫੋਕਸ ਨਾਲ ਉਜਾਗਰ ਕਰੋ।</translation> @@ -621,6 +622,7 @@ <translation id="1640235262200048077"><ph name="IME_NAME" /> ਅਜੇ Linux ਐਪਾਂ ਵਿੱਚ ਕੰਮ ਨਹੀਂ ਕਰਦਾ</translation> <translation id="1640283014264083726">RSA ਐਨਕ੍ਰਿਪਸ਼ਨ ਨਾਲ PKCS #1 MD4</translation> <translation id="1641113438599504367">ਸੁਰੱਖਿਅਤ ਬ੍ਰਾਊਜ਼ਿੰਗ</translation> +<translation id="1642492862748815878"><ph name="DEVICE" /> ਅਤੇ <ph name="NUMBER_OF_DEVICES" /> ਹੋਰ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸਾਂ ਨਾਲ ਕਨੈਕਟ ਹੈ</translation> <translation id="1642494467033190216">ਦੂਜੀਆਂ ਡੀਬੱਗਿੰਗ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਸਮਰੱਥ ਬਣਾਉਣ ਤੋਂ ਪਹਿਲਾਂ rootfs ਸੁਰੱਖਿਆ ਨੂੰ ਹਟਾਉਣਾ ਅਤੇ ਮੁੜ-ਸ਼ੁਰੂ ਕਰਨਾ ਲੋੜੀਂਦਾ ਹੈ।</translation> <translation id="1643072738649235303">SHA-1 ਨਾਲ X9.62 ECDSA ਹਸਤਾਖਰ</translation> <translation id="1643921258693943800">ਨਜ਼ਦੀਕੀ ਸਾਂਝ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ, ਬਲੂਟੁੱਥ ਅਤੇ ਵਾਈ-ਫਾਈ ਨੂੰ ਚਾਲੂ ਕਰੋ</translation> @@ -1836,6 +1838,7 @@ <translation id="2885378588091291677">ਕੰਮ ਪ੍ਰਬੰਧਕ</translation> <translation id="2885729872133513017">ਸਰਵਰ ਦੇ ਜਵਾਬ ਨੂੰ ਡੀਕੋਡ ਕਰਨ ਵੇਲੇ ਕੋਈ ਸਮੱਸਿਆ ਆਈ।</translation> <translation id="2886771036282400576">• <ph name="PERMISSION" /></translation> +<translation id="288734198558082692"><ph name="DEVICE" /> ਅਤੇ <ph name="NUMBER_OF_DEVICES" /> ਹੋਰ</translation> <translation id="2889064240420137087">ਇਸ ਨਾਲ ਲਿੰਕ ਖੋਲ੍ਹੇੋ...</translation> <translation id="2891922230654533301">ਕੀ <ph name="APP_NAME" /> 'ਤੇ ਸਾਈਨ-ਇਨ ਕਰਨ ਲਈ ਆਪਣੇ ਡੀਵਾਈਸ ਨੂੰ ਵਰਤਣਾ ਹੈ?</translation> <translation id="2893168226686371498">ਪੂਰਵ-ਨਿਰਧਾਰਤ ਬ੍ਰਾਊਜ਼ਰ</translation> @@ -2322,6 +2325,7 @@ <translation id="3432227430032737297">ਸਾਰੇ ਵਿਖਾਏ ਗਏ ਹਟਾਓ</translation> <translation id="3432762828853624962">ਸਾਂਝੇ ਕੀਤੇ ਗਏ ਵਰਕਰ</translation> <translation id="3433621910545056227">ਓਹੋ! ਸਿਸਟਮ ਡੀਵਾਈਸ ਸਥਾਪਨਾ-ਸਮਾਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਲਾਕ ਨੂੰ ਸਥਾਪਤ ਕਰਨ ਵਿੱਚ ਅਸਫਲ ਰਿਹਾ।</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">ਜੇ ਤੁਹਾਡੇ ਬੱਚੇ ਲਈ ਵਧੀਕ 'ਵੈੱਬ ਅਤੇ ਐਪ ਸਰਗਰਮੀ' ਸੈਟਿੰਗ ਚਾਲੂ ਹੋਵੇ, ਤਾਂ ਇਹ ਡਾਟਾ ਉਹਨਾਂ ਦੇ Google ਖਾਤੇ ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ। families.google.com 'ਤੇ ਇਹਨਾਂ ਸੈਟਿੰਗਾਂ ਅਤੇ ਉਹਨਾਂ ਨੂੰ ਵਿਵਸਥਿਤ ਕਰਨ ਦੇ ਤਰੀਕੇ ਬਾਰੇ ਹੋਰ ਜਾਣੋ।</translation> <translation id="3435541101098866721">ਨਵਾਂ ਫ਼ੋਨ ਸ਼ਾਮਲ ਕਰੋ</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" ਵੱਲੋਂ ਤੁਹਾਡੇ <ph name="CODE_TYPE" /> ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ</translation> @@ -2769,6 +2773,7 @@ <translation id="3884152383786131369">ਕਈ ਭਾਸ਼ਾਵਾਂ ਵਿੱਚ ਉਪਲਬਧ ਵੈੱਬ ਸਮੱਗਰੀ ਇਸ ਸੂਚੀ ਤੋਂ ਪਹਿਲੀ ਸਮਰਥਿਤ ਭਾਸ਼ਾ ਦੀ ਵਰਤੋਂ ਕਰੇਗੀ। ਇਹ ਤਰਜੀਹਾਂ ਤੁਹਾਡੀਆਂ ਬ੍ਰਾਊਜ਼ਰ ਸੈਟਿੰਗਾਂ ਨਾਲ ਸਮਕਾਲੀਕਿਰਤ ਕੀਤੀਆਂ ਜਾਂਦੀਆਂ ਹਨ। <ph name="BEGIN_LINK_LEARN_MORE" />ਹੋਰ ਜਾਣੋ<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3885112598747515383">ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਅੱਪਡੇਟਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕੀਤਾ ਜਾਂਦਾ ਹੈ</translation> <translation id="3886446263141354045">ਇਸ ਸਾਈਟ 'ਤੇ ਪਹੁੰਚ ਦੀ ਤੁਹਾਡੀ ਬੇਨਤੀ <ph name="NAME" /> ਨੂੰ ਭੇਜੀ ਗਈ ਹੈ</translation> +<translation id="3887022758415973389">ਡੀਵਾਈਸ ਸੂਚੀ ਦਿਖਾਓ</translation> <translation id="3888053818972567950"><ph name="WEB_DRIVE" /> ਕਨੈਕਸ਼ਨ</translation> <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> ਨਾਲ ਨੋਟ-ਕਥਨ ਲਏ ਜਾ ਰਹੇ ਹਨ</translation> <translation id="3888586133700543064">ਇਹ ਜਾਣਕਾਰੀ ਤੁਹਾਡੀ Assistant ਸੰਬੰਧੀ ਸਮੱਸਿਆ ਨੂੰ ਬਿਹਤਰ ਤਰੀਕੇ ਨਾਲ ਸਮਝਣ ਵਿੱਚ ਸਾਡੀ ਮਦਦ ਕਰਦੀ ਹੈ। ਇਹ 90 ਦਿਨਾਂ ਤੱਕ ਸਟੋਰ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਅਤੇ ਇਸ 'ਤੇ ਪਹੁੰਚ ਢੁਕਵੀਆਂ ਇੰਜੀਨੀਅਰਿੰਗ ਅਤੇ ਵਿਚਾਰ ਟੀਮਾਂ ਤੱਕ ਸੀਮਤ ਹੁੰਦੀ ਹੈ।</translation> @@ -3480,6 +3485,7 @@ <translation id="4662373422909645029">ਉਪਨਾਮ 'ਚ ਅੰਕ ਨਹੀਂ ਹੋ ਸਕਦੇ</translation> <translation id="4662788913887017617">ਆਪਣੇ iPhone ਨਾਲ ਇਸ ਬੁੱਕਮਾਰਕ ਨੂੰ ਸਾਂਝਾ ਕਰੋ</translation> <translation id="4663373278480897665">ਕੈਮਰੇ ਦੀ ਇਜਾਜ਼ਤ ਦਿੱਤੀ ਗਈ</translation> +<translation id="4664289193573249666">Chrome OS ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਸੁਰੱਖਿਅਤ DNS ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ</translation> <translation id="4664482161435122549">PKCS #12 ਨਿਰਯਾਤ ਗੜਬੜ</translation> <translation id="4665014895760275686">ਨਿਰਮਾਤਾ</translation> <translation id="4665446389743427678"><ph name="SITE" /> ਵੱਲੋਂ ਸਟੋਰ ਕੀਤਾ ਸਾਰਾ ਡਾਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।</translation> @@ -6013,6 +6019,7 @@ <translation id="7478623944308207463">ਤੁਹਾਡੀਆਂ ਐਪਾਂ ਅਤੇ ਸੈਟਿੰਗਾਂ ਦਾ ਉਹਨਾਂ ਸਾਰੇ Chrome OS ਡੀਵਾਈਸਾਂ ਨਾਲ ਸਮਕਾਲੀਕਰਨ ਕੀਤਾ ਜਾਵੇਗਾ, ਜਿੱਥੇ ਤੁਸੀਂ ਆਪਣੇ Google ਖਾਤੇ ਨਾਲ ਸਾਈਨ-ਇਨ ਹੋ। ਬ੍ਰਾਊਜ਼ਰ ਸਮਕਾਲੀਕਰਨ ਵਿਕਲਪਾਂ ਲਈ, <ph name="LINK_BEGIN" />Chrome ਸੈਟਿੰਗਾਂ<ph name="LINK_END" /> 'ਤੇ ਜਾਓ।</translation> <translation id="7478658909253570368">ਸਾਈਟਾਂ ਨੂੰ ਸੀਰੀਅਲ ਪੋਰਟਾਂ ਨਾਲ ਕਨੈਕਟ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਾ ਦਿਓ</translation> <translation id="7479221278376295180">ਸਟੋਰੇਜ ਵਰਤੋਂ ਦੀ ਰੂਪ-ਰੇਖਾ</translation> +<translation id="747981547666531654"><ph name="FIRST_DEVICE" /> ਅਤੇ <ph name="SECOND_DEVICE" /> ਨਾਮ ਦੇ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸਾਂ ਨਾਲ ਕਨੈਕਟ ਹੈ</translation> <translation id="7481312909269577407">ਅੱਗੇ ਭੇਜੋ</translation> <translation id="7481358317100446445">ਤਿਆਰ ਹੈ</translation> <translation id="748138892655239008">ਪ੍ਰਮਾਣ-ਪੱਤਰ ਮੂਲ ਪਾਬੰਦੀਆਂ</translation> @@ -6065,6 +6072,7 @@ <translation id="7531771599742723865">ਵਰਤੋਂ ਅਧੀਨ ਡੀਵਾਈਸ</translation> <translation id="7531779363494549572">ਸੈਟਿੰਗਾਂ > ਐਪਾਂ ਅਤੇ ਸੂਚਨਾਵਾਂ > ਸੂਚਨਾਵਾਂ 'ਤੇ ਜਾਓ।</translation> <translation id="7532009420053991888"><ph name="LINUX_APP_NAME" /> ਐਪ ਪ੍ਰਤੀਕਿਰਿਆ ਨਹੀਂ ਦੇ ਰਹੀ ਹੈ। ਐਪ ਬੰਦ ਕਰਨ ਲਈ "ਜ਼ਬਰਦਸਤੀ ਬੰਦ ਕਰੋ" ਨੂੰ ਚੁਣੋ।</translation> +<translation id="7535730537657706072">ਆਪਣੇ ਡੀਵਾਈਸ ਤੋਂ ਇਨਕੋਗਨਿਟੋ ਬ੍ਰਾਊਜ਼ਿੰਗ ਇਤਿਹਾਸ ਨੂੰ ਕਲੀਅਰ ਕਰਨ ਲਈ, ਸਾਰੀਆਂ ਇਨਕੋਗਨਿਟੋ ਟੈਬਾਂ ਬੰਦ ਕਰੋ</translation> <translation id="7535791657097741517">ਹਲਕਾ ਥੀਮ ਚਾਲੂ ਕਰੋ</translation> <translation id="7537451260744431038">ਸਾਈਟਾਂ ਤੁਹਾਡੇ ਬ੍ਰਾਊਜ਼ਿੰਗ ਅਨੁਭਵ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ ਕੁਕੀਜ਼ ਨੂੰ ਨਹੀਂ ਵਰਤ ਸਕਦੀਆਂ, ਉਦਾਹਰਨ ਲਈ, ਤੁਹਾਨੂੰ ਸਾਈਨ-ਇਨ ਜਾਂ ਤੁਹਾਡੇ ਖਰੀਦਦਾਰੀ ਕਾਰਟ ਵਿਚਲੀਆਂ ਆਈਟਮਾਂ ਨੂੰ ਯਾਦ ਰੱਖਣ ਲਈ</translation> <translation id="753769905878158714">ਪਤਾ ਬਾਰ ਵਿੱਚ, ਉਸ ਵੈੱਬਸਾਈਟ ਲਈ ਪ੍ਰਮੁੱਖ-ਸ਼ਬਦ ਦਾਖਲ ਕਰੋ ਜਿਸਨੂੰ ਤੁਸੀਂ ਖੋਜਣਾ ਚਾਹੁੰਦੇ ਹੋ। ਫਿਰ, ਜਾਰੀ ਰੱਖਣ ਲਈ ਕੀ-ਬੋਰਡ ਸ਼ਾਰਟਕੱਟ ਵਰਤੋ।</translation> @@ -6680,6 +6688,7 @@ <translation id="8138217203226449454">ਕੀ ਤੁਸੀਂ ਆਪਣਾ ਖੋਜ ਪ੍ਰਦਾਨਕ ਬਦਲਣਾ ਸੀ?</translation> <translation id="8138997515734480534"><ph name="VM_NAME" /> ਸਥਿਤੀ</translation> <translation id="8139447493436036221">Google Drive ਫ਼ਾਈਲਾਂ</translation> +<translation id="8140070492745508800"><ph name="FIRST_DEVICE" />, <ph name="SECOND_DEVICE" /></translation> <translation id="8141584439523427891">ਹੁਣ ਵਿਕਲਪਿਕ ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਖੋਲ੍ਹਿਆ ਜਾ ਰਿਹਾ ਹੈ</translation> <translation id="8141725884565838206">ਆਪਣੇ ਪਾਸਵਰਡ ਵਿਵਸਥਿਤ ਕਰੋ</translation> <translation id="814204052173971714">{COUNT,plural, =1{ਇੱਕ ਵੀਡੀਓ}one{# ਵੀਡੀਓ}other{# ਵੀਡੀਓ}}</translation> @@ -7198,7 +7207,7 @@ <translation id="8725066075913043281">ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ</translation> <translation id="8725178340343806893">ਮਨਪਸੰਦ/ਬੁੱਕਮਾਰਕ</translation> <translation id="8726206820263995930">ਸਰਵਰ ਤੋਂ ਨੀਤੀ ਸੈਟਿੰਗਾਂ ਪ੍ਰਾਪਤ ਕਰਦੇ ਸਮੇਂ ਗੜਬੜ: <ph name="CLIENT_ERROR" />।</translation> -<translation id="8727154974495727220">ਤੁਹਾਡਾ <ph name="DEVICE_TYPE" /> ਸੈੱਟਅੱਪ ਹੋ ਜਾਣ 'ਤੇ ਕਿਸੇ ਵੇਲੇ ਵੀ ਮਦਦ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ 'Assistant' ਬਟਨ ਨੂੰ ਦਬਾਓ ਜਾਂ "OK Google" ਕਹੋ। ਤਬਦੀਲੀਆਂ ਕਰਨ ਲਈ 'Assistant' ਸੈਟਿੰਗਾਂ 'ਤੇ ਜਾਓ।</translation> +<translation id="8727154974495727220">ਤੁਹਾਡਾ <ph name="DEVICE_TYPE" /> ਸੈੱਟਅੱਪ ਹੋ ਜਾਣ 'ਤੇ ਕਿਸੇ ਵੇਲੇ ਵੀ ਮਦਦ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ Assistant ਬਟਨ ਨੂੰ ਦਬਾਓ ਜਾਂ "OK Google" ਕਹੋ। ਤਬਦੀਲੀਆਂ ਕਰਨ ਲਈ Assistant ਸੈਟਿੰਗਾਂ 'ਤੇ ਜਾਓ।</translation> <translation id="8729133765463465108">QR ਕੋਡ ਸਕੈਨ ਕਰਨ ਲਈ ਕੈਮਰਾ ਵਰਤੋ</translation> <translation id="8730621377337864115">ਹੋ ਗਿਆ</translation> <translation id="8731629443331803108"><ph name="SITE_NAME" /> ਇਹ ਕਰਨਾ ਚਾਹੁੰਦੀ ਹੈ: <ph name="PERMISSION" /></translation> @@ -7395,6 +7404,7 @@ <translation id="8909782404367982052">Google Lens ਨਾਲ ਚਿੱਤਰ ਖੋਜਣ ਲਈ ਘਸੀਟੋ</translation> <translation id="8909833622202089127">ਸਾਈਟ ਤੁਹਾਡੇ ਟਿਕਾਣੇ ਨੂੰ ਟਰੈਕ ਕਰ ਰਹੀ ਹੈ</translation> <translation id="8910222113987937043">ਤੁਹਾਡੇ ਬੁੱਕਮਾਰਕਾਂ, ਇਤਿਹਾਸ, ਪਾਸਵਰਡਾਂ, ਅਤੇ ਹੋਰ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਕੀਤੀਆਂ ਤਬਦੀਲੀਆਂ ਹੁਣ ਤੁਹਾਡੇ Google ਖਾਤੇ 'ਤੇ ਸਮਕਾਲੀਕਰਨ ਨਹੀਂ ਕੀਤੀਆਂ ਜਾਣਗੀਆਂ। ਹਾਲਾਂਕਿ, ਤੁਹਾਡਾ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਡਾਟਾ ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਸਟੋਰ ਕੀਤਾ ਰਹੇਗਾ ਅਤੇ ਇਸ ਨੂੰ <ph name="BEGIN_LINK" />Google ਡੈਸ਼ਬੋਰਡ<ph name="END_LINK" /> 'ਤੇ ਪ੍ਰਬੰਧਿਤ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।</translation> +<translation id="8910987510378294980">ਡੀਵਾਈਸ ਸੂਚੀ ਲੁਕਾਓ</translation> <translation id="8912362522468806198">Google ਖਾਤਾ</translation> <translation id="8912793549644936705">ਸਟ੍ਰੈਚ ਕਰੋ</translation> <translation id="8912810933860534797">ਸਵੈਚਲਿਤ ਸਕੈਨ ਚਾਲੂ ਕਰੋ</translation> @@ -7512,6 +7522,7 @@ <translation id="9033765790910064284">ਫਿਰ ਵੀ ਜਾਰੀ ਰੱਖੋ</translation> <translation id="9033857511263905942">&ਪੇਸਟ ਕਰੋ</translation> <translation id="903480517321259405">ਪਿੰਨ ਦੁਬਾਰਾ ਟਾਈਪ ਕਰੋ</translation> +<translation id="9037054491984310631"><ph name="DEVICE" /> ਨਾਮ ਦੇ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸ ਨਾਲ ਕਨੈਕਟ ਹੈ</translation> <translation id="9037640663275993951">ਡੀਵਾਈਸ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ</translation> <translation id="9037818663270399707">ਤੁਹਾਡਾ ਕਨੈਕਸ਼ਨ ਸਾਰੇ ਨੈੱਟਵਰਕ ਟਰੈਫ਼ਿਕ ਲਈ ਨਿੱਜੀ ਨਹੀਂ ਹੈ</translation> <translation id="9037965129289936994">ਮੂਲ ਦਿਖਾਓ </translation> @@ -7592,6 +7603,7 @@ <translation id="9112786533191410418"><ph name="FILE_NAME" /> ਖਤਰਨਾਕ ਹੋ ਸਕਦੀ ਹੈ। ਕੀ ਸਕੈਨ ਕਰਨ ਲਈ Google ਨੂੰ ਭੇਜਣਾ ਹੈ?</translation> <translation id="9112987648460918699">ਲੱਭੋ...</translation> <translation id="9113240369465613386">ਸਿਰਫ਼ ਟਾਂਕ ਪੰਨੇ</translation> +<translation id="9113469270512809735">ਹਾਲ ਹੀ ਵਿੱਚ ਬੰਦ ਕੀਤੀਆਂ ਆਈਟਮਾਂ ਨੂੰ ਟੌਗਲ ਕਰੋ</translation> <translation id="9114663181201435112">ਆਸਾਨੀ ਨਾਲ ਸਾਈਨ-ਇਨ ਕਰੋ</translation> <translation id="9115675100829699941">&ਬੁੱਕਮਾਰਕਸ</translation> <translation id="9116465289595958864">ਪਿਛਲੀ ਵਾਰ ਸੰਸ਼ੋਧਿਤ</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index 7c68cea..c657514 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -2307,6 +2307,7 @@ <translation id="3432227430032737297">Usuń wszystkie wyświetlone</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">Ups! System nie mógł ustanowić blokady atrybutów urządzenia na czas instalacji.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Jeśli na koncie Google dziecka włączysz ustawienie Dodatkowa aktywność w internecie i aplikacjach, te dane mogą być zapisywane na jego koncie. Więcej informacji o tych ustawieniach i sposobie ich zmiany znajdziesz na families.google.com.</translation> <translation id="3435541101098866721">Dodaj nowy telefon</translation> <translation id="3435688026795609344"><ph name="EXTENSION_NAME" /> żąda kodu <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index aeaed1943..4168090 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -2327,6 +2327,7 @@ <translation id="3432227430032737297">Remover todos os cookies mostrados</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">Ops! O sistema falhou ao estabelecer o bloqueio de atributos da hora de instalação do dispositivo.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Se a configuração "Atividade na Web e de apps adicional" estiver ativada para a criança, esses dados poderão ser salvos na Conta do Google dela. Saiba mais sobre essas configurações e como ajustá-las em families.google.com.</translation> <translation id="3435541101098866721">Adicionar novo telefone</translation> <translation id="3435688026795609344">A extensão "<ph name="EXTENSION_NAME" />" está solicitando seu <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index ae035dff..1430e581 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -1746,7 +1746,7 @@ <translation id="2805760958323556153">O valor da política de ExtensionInstallForcelist é inválido. Contacte o seu administrador.</translation> <translation id="2805770823691782631">Detalhes adicionais</translation> <translation id="2806372837663997957">O dispositivo com o qual está a tentar efetuar a partilha não aceitou.</translation> -<translation id="2806840421670364300">AFC</translation> +<translation id="2806840421670364300">APC</translation> <translation id="2806891468525657116">O atalho já existe.</translation> <translation id="2807517655263062534">Os ficheiros que transferir são apresentados aqui</translation> <translation id="2809586584051668049">e mais <ph name="NUMBER_ADDITIONAL_DISABLED" /></translation> @@ -2311,6 +2311,7 @@ <translation id="3432227430032737297">Remover tudo o que é mostrado</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">Ups! Falha do sistema ao estabelecer o bloqueio dos atributos de hora-instalação do dispositivo.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Se a definição Atividade da Web e de apps adicional estiver ativada para a criança, estes dados podem ser guardados na respetiva Conta Google. Saiba mais acerca destas definições e como as pode ajustar em families.google.com.</translation> <translation id="3435541101098866721">Adicionar novo telefone</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" está a solicitar o seu <ph name="CODE_TYPE" /></translation> @@ -2323,7 +2324,7 @@ <translation id="3440663250074896476">Mais ações para <ph name="BOOKMARK_NAME" /></translation> <translation id="3441653493275994384">Ecrã</translation> <translation id="3441663102605358937">Inicie sessão na sua conta <ph name="ACCOUNT" /> novamente para validar esta conta.</translation> -<translation id="3444641828375597683">Os anunciantes e os publicadores podem utilizar a AFC, descrita mais adiante nesta página.</translation> +<translation id="3444641828375597683">Os anunciantes e os publicadores podem utilizar a APC, descrita mais adiante nesta página.</translation> <translation id="3444726579402183581"><ph name="ORIGIN" /> poderá ver <ph name="FILENAME" /></translation> <translation id="3445047461171030979">Respostas rápidas do Assistente Google</translation> <translation id="3445288400492335833"><ph name="MINUTES" /> min</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 47e1e99..c9ba5d13 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -2311,6 +2311,7 @@ <translation id="3432227430032737297">Elimină-le pe cele afișate</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">Hopa! Sistemul nu a reușit să blocheze atributele la instalarea pe gadget.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Dacă ai activat setarea Activitatea suplimentară de pe web și din aplicații pentru copilul tău, aceste date pot fi salvate în Contul său Google. Află mai multe despre aceste setări și cum să le modifici la families.google.com.</translation> <translation id="3435541101098866721">Adăugați un telefon nou</translation> <translation id="3435688026795609344">„<ph name="EXTENSION_NAME" />” solicită <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 654d2f4..446b3cb 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -2311,6 +2311,7 @@ <translation id="3432227430032737297">Удалить все показанные файлы cookie</translation> <translation id="3432762828853624962">Разделяемые объекты worker</translation> <translation id="3433621910545056227">Системе не удалось заблокировать атрибуты устройства на время установки.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Если у ребенка включена запись дополнительной истории приложений и веб-поиска, эта информация может сохраняться в его аккаунте. Узнать больше об этой функции и о том, как изменить ее настройки, можно на странице families.google.com.</translation> <translation id="3435541101098866721">Добавить новый телефон</translation> <translation id="3435688026795609344">Расширение "<ph name="EXTENSION_NAME" />" запрашивает <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb index 57375fb2..a4a7dfb36 100644 --- a/chrome/app/resources/generated_resources_si.xtb +++ b/chrome/app/resources/generated_resources_si.xtb
@@ -2313,6 +2313,7 @@ <translation id="3432227430032737297">පෙන්වන සියල්ල ඉවත් කරන්න</translation> <translation id="3432762828853624962">හවුල් වැඩකරුවන්</translation> <translation id="3433621910545056227">අපොයි! පද්ධතිය උපාංගයේ ස්ථාපන-කාල උපලක්ෂණ අගුල පිහිටුවීමට අසමත් විය.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">ඔබේ දරුවා සඳහා අමතර වෙබ් සහ යෙදුම් ක්රියාකාරකම් සැකසීම සක්රීය කර තිබේ නම්, මෙම දත්ත ඔවුන්ගේ Google ගිණුමට සුරැකිය හැක. මෙම සැකසීම් සහ ඒවා සීරුමාරු කරන ආකාරය ගැන families.google.com හි තවත් දැන ගන්න.</translation> <translation id="3435541101098866721">නව දුරකථනයක් එක් කරන්න</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" ඔබේ <ph name="CODE_TYPE" /> ඉල්ලමින්</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index e5defe4..51d99fc 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -2312,6 +2312,7 @@ <translation id="3432227430032737297">Odstrániť všetky zobrazené</translation> <translation id="3432762828853624962">Zdieľaní pracovníci</translation> <translation id="3433621910545056227">Ojoj! Systému sa nepodarilo nastaviť zámku pre inštaláciu atribútov v zariadení.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" /> %</translation> <translation id="3434272557872943250">Ak pre dieťa zapnete nastavenie ďalšej aktivity na internete a v aplikáciách, tieto údaje sa môžu uložiť do jeho účtu Google. Viac o týchto nastaveniach a o tom, ako ich upraviť, sa dozviete na families.google.com.</translation> <translation id="3435541101098866721">Pridať nový telefón</translation> <translation id="3435688026795609344">Rozšírenie <ph name="EXTENSION_NAME" /> požaduje <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index 66c098c7..fde9467 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -2328,6 +2328,7 @@ <translation id="3432227430032737297">Odstrani vse prikazane</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">Ojej! Sistemu ni uspelo zakleniti atributov časa namestitve naprave.</translation> +<translation id="3434107140712555581">Akumulator: <ph name="BATTERY_PERCENTAGE" /> %</translation> <translation id="3434272557872943250">Če ste za otroka vklopili dodatno beleženje dejavnosti v spletu in aplikacijah, bodo ti podatki morda shranjeni v njegovem računu Google. Preberite več o teh nastavitvah in njihovem prilagajanju na families.google.com.</translation> <translation id="3435541101098866721">Dodaj nov telefon</translation> <translation id="3435688026795609344">Razširitev »<ph name="EXTENSION_NAME" />« zahteva to: <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb index c33c252..4247c873 100644 --- a/chrome/app/resources/generated_resources_sq.xtb +++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -2304,6 +2304,7 @@ <translation id="3432227430032737297">Hiqi të gjitha të shfaqurat</translation> <translation id="3432762828853624962">Punëtorët e përbashkët</translation> <translation id="3433621910545056227">Gabim! Sistemi dështoi në vendosjen e kyçjes së cilësive të instalimit në kohë të pajisjes.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Nëse cilësimi i "Aktivitetit shtesë të uebit dhe të aplikacioneve" është i aktivizuar për fëmijën tënd, këto të dhëna mund të ruhen në "Llogarinë e Google" të fëmijës. Mëso më shumë për këto cilësime dhe se si t'i rregullosh ato te families.google.com.</translation> <translation id="3435541101098866721">Shto telefon të ri</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" po kërkon kodin tënd <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index 3379c54..2760f08 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -2309,6 +2309,7 @@ <translation id="3432227430032737297">Ukloni sve prikazano</translation> <translation id="3432762828853624962">Deljeni resursi</translation> <translation id="3433621910545056227">Ups! Sistem nije uspeo da odredi zaključavanje atributa za vreme instalacije uređaja.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Ako za dete uključite podešavanje dodatne aktivnosti na vebu i u aplikacijama, ti podaci će se možda čuvati na Google nalogu deteta. Saznajte više o ovim podešavanjima i o tome kako da ih prilagodite na families.google.com</translation> <translation id="3435541101098866721">Dodaj novi telefon</translation> <translation id="3435688026795609344">„<ph name="EXTENSION_NAME" />“ zahteva <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index 0c88028..37683a0 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -2309,6 +2309,7 @@ <translation id="3432227430032737297">Уклони све приказано</translation> <translation id="3432762828853624962">Дељени ресурси</translation> <translation id="3433621910545056227">Упс! Систем није успео да одреди закључавање атрибута за време инсталације уређаја.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Ако за дете укључите подешавање додатне активности на вебу и у апликацијама, ти подаци ће се можда чувати на Google налогу детета. Сазнајте више о овим подешавањима и о томе како да их прилагодите на families.google.com</translation> <translation id="3435541101098866721">Додај нови телефон</translation> <translation id="3435688026795609344">„<ph name="EXTENSION_NAME" />“ захтева <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index 43e9cbaa..91bbcd9 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -2325,6 +2325,7 @@ <translation id="3432227430032737297">Ta bort alla som visas</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">Hoppsan! Det gick inte att fastställa enhetens attributlås för installationstid.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" /> %</translation> <translation id="3434272557872943250">Om ytterligare webb- och appaktivitet har aktiverats för ditt barn kan denna data sparas i Google-kontot. Läs mer om inställningarna och hur du ändrar dem på families.google.com.</translation> <translation id="3435541101098866721">Lägg till ny telefon</translation> <translation id="3435688026795609344"><ph name="EXTENSION_NAME" /> vill att du anger din <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index e70f0f6..0de671b5 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -2321,6 +2321,7 @@ <translation id="3432227430032737297">Futa Vidakuzi Vyote Vilivyoonyeshwa</translation> <translation id="3432762828853624962">Wafanyakazi wa Pamoja</translation> <translation id="3433621910545056227">Lo! Mfumo umeshindwa kuanzisha kufungwa kwa sifa za muda wa usakinishaji wa kifaa.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Ikiwa umewasha mipangilio ya historia ya Shughuli za ziada kwenye Wavuti na Programu ya mtoto wako, data hii inaweza kuhifadhiwa kwenye Akaunti yake ya Google. Pata maelezo zaidi kuhusu mipangilio hii na jinsi ya kuirekebisha katika families.google.com.</translation> <translation id="3435541101098866721">Weka simu mpya</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" kinaomba <ph name="CODE_TYPE" /> yako</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index ddebffa..b466585 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -2322,6 +2322,7 @@ <translation id="3432227430032737297">காட்டப்படும் அனைத்தையும் அகற்று</translation> <translation id="3432762828853624962">ஷேர்டு வொர்க்கர்ஸ்</translation> <translation id="3433621910545056227">அச்சச்சோ! சாதன நிறுவல்-நேர பண்புக்கூறுகளைப் பூட்டுவதில் முறைமை தோல்வியடைந்தது.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">உங்கள் பிள்ளையின் கணக்கில் கூடுதல் ’இணையம் & ஆப்ஸ் செயல்பாடு’ அமைப்பு இயக்கப்பட்டிருந்தால், இந்தத் தரவு அவரது Google கணக்கில் சேமிக்கப்படக்கூடும். இந்த அமைப்புகள் குறித்தும் அவற்றை எவ்வாறு மாற்றி அமைக்கலாம் என்பது குறித்தும் families.google.comமில் மேலும் தெரிந்துகொள்ளவும்.</translation> <translation id="3435541101098866721">புதிய தொலைபேசியைச் சேர்</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" உங்கள் <ph name="CODE_TYPE" />ஐக் கோருகிறது</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index a0b39cf..fd84cd6 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -2321,6 +2321,7 @@ <translation id="3432227430032737297">చూపుతున్నవన్నీ తీసివేయి</translation> <translation id="3432762828853624962">షేర్డ్ వర్కర్స్</translation> <translation id="3433621910545056227">అయ్యో! పరికరం ఇన్స్టాలేషన్-సమయ లక్షణాల లాక్ను ఏర్పాటు చేయడంలో సిస్టమ్ విఫలమైంది.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">మీ చిన్నారి కోసం అదనపు వెబ్ & యాప్ కార్యకలాపం సెట్టింగ్ను ఆన్ చేసినట్లయితే, ఈ డేటా వారి Google ఖాతాలో సేవ్ చేయబడవచ్చు. ఈ సెట్టింగ్ల గురించి, వాటిని ఎలా సర్దుబాటు చేయాలనే దాని గురించి families.google.comలో మరింత తెలుసుకోండి.</translation> <translation id="3435541101098866721">క్రొత్త ఫోన్ని జోడించండి</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" మీ <ph name="CODE_TYPE" />ని అభ్యర్థిస్తోంది</translation> @@ -4890,7 +4891,7 @@ <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation> <translation id="6247802389331535091">సిస్టమ్: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="624789221780392884">అప్డేట్ సిద్ధంగా ఉంది</translation> -<translation id="6248988683584659830">సెట్టింగ్లను వెతకండి</translation> +<translation id="6248988683584659830">సెట్టింగ్లను సెర్చ్ చేయండి</translation> <translation id="6249200942125593849">a11yను మేనేజ్ చేయండి</translation> <translation id="6251870443722440887">GDI నిర్వహించేవి</translation> <translation id="625369703868467034">నెట్వర్క్ హెల్త్</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 1b11599..07902a2 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -2309,6 +2309,7 @@ <translation id="3432227430032737297">นำรายการที่แสดงทั้งหมดออก</translation> <translation id="3432762828853624962">คนทำงานที่แชร์</translation> <translation id="3433621910545056227">อ๊ะ! ระบบไม่สามารถสร้างการล็อกแอตทริบิวต์เวลาการติดตั้งของอุปกรณ์ได้</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">หากเปิดการตั้งค่ากิจกรรมเพิ่มเติมบนเว็บและแอปสำหรับบุตรหลาน ระบบอาจบันทึกข้อมูลนี้ไว้ในบัญชี Google ของบุตรหลาน ดูข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่าเหล่านี้และวิธีปรับเปลี่ยนที่ families.google.com</translation> <translation id="3435541101098866721">เพิ่มโทรศัพท์ใหม่</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" ขอ <ph name="CODE_TYPE" /> ของคุณ</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index e7817b6..6388d44 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -2308,6 +2308,7 @@ <translation id="3432227430032737297">Tüm Gösterilenleri Kaldır</translation> <translation id="3432762828853624962">Ortak Çalışanlar</translation> <translation id="3433621910545056227">Hata! Sistem, cihaz yükleme zamanı özellikleri kilidini oluşturamadı.</translation> +<translation id="3434107140712555581">%<ph name="BATTERY_PERCENTAGE" /></translation> <translation id="3434272557872943250">Çocuğunuz için ek Web ve Uygulama Etkinliği açıksa bu veriler çocuğunuzun Google Hesabına kaydedilebilir. Bu ayarlar hakkında daha fazla bilgiyi ve nasıl düzenleneceklerini families.google.com sayfasında bulabilirsiniz.</translation> <translation id="3435541101098866721">Yeni telefon ekle</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" uzantısı sizden <ph name="CODE_TYPE" /> istiyor.</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 037decf..6d267e7 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -2328,6 +2328,7 @@ <translation id="3432227430032737297">Вилучити всі показані</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">На жаль, системі не вдалося заблокувати атрибути часу встановлення на пристрої.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Якщо ввімкнено також запис Історії додатків і веб-пошуку, ці дані зберігаються в обліковому записі Google дитини. Докладніше про це налаштування читайте на сторінці families.google.com.</translation> <translation id="3435541101098866721">Додати новий телефон</translation> <translation id="3435688026795609344">Розширення "<ph name="EXTENSION_NAME" />" просить надати ваш <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb index 9afa487..21d45de 100644 --- a/chrome/app/resources/generated_resources_ur.xtb +++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -159,6 +159,7 @@ <translation id="1165039591588034296">خرابی</translation> <translation id="1166212789817575481">دائیں جانب ٹیبز بند کریں</translation> <translation id="1166583374608765787">نام میں ہوئی اپ ڈیٹ کا جائزہ لیں</translation> +<translation id="1166596238782048887"><ph name="TAB_TITLE" /> <ph name="DESK_TITLE" /> ڈیسک سے تعلق رکھتی ہے</translation> <translation id="1168020859489941584"><ph name="TIME_REMAINING" /> میں کھولا جا رہا ہے…</translation> <translation id="1170288591054440704">جب کوئی سائٹ آپ کے آلے پر انسٹال کردہ فونٹس استعمال کرنا چاہے تو پوچھیں</translation> <translation id="1171135284592304528">کی بورڈ فوکس کے ساتھ آبجیکٹ تبدیل ہونے پر اسے ہائی لائٹ کریں</translation> @@ -617,6 +618,7 @@ <translation id="1640235262200048077"><ph name="IME_NAME" /> Linux ایپس پر ابھی کام نہیں کرتا ہے</translation> <translation id="1640283014264083726">PKCS #1 MD4 مع RSA مرموز کاری</translation> <translation id="1641113438599504367">محفوظ براؤزنگ</translation> +<translation id="1642492862748815878"><ph name="DEVICE" /> اور <ph name="NUMBER_OF_DEVICES" /> دیگر بلوٹوتھ آلات سے منسلک کیا گیا</translation> <translation id="1642494467033190216">ڈیبگ کی دیگر خصوصیات فعال کرنے سے پہلے rootfs کا تحفظ ہٹائے جانے اور دوبارہ شروع کرنے کی ضرورت ہے۔</translation> <translation id="1643072738649235303">X9.62 ECDSA SHA-1 والا دستخط</translation> <translation id="1643921258693943800">قریبی آلات کے ساتھ اشتراک کا استعمال کرنے کیلئے بلوٹوتھ اور Wi-Fi آن کریں</translation> @@ -1819,6 +1821,7 @@ <translation id="2885378588091291677">ٹاسک مینیجر</translation> <translation id="2885729872133513017">سرور کے جواب کو ڈیکوڈ کرنے میں ایک مسئلہ پیش آگیا۔</translation> <translation id="2886771036282400576">• <ph name="PERMISSION" /></translation> +<translation id="288734198558082692"><ph name="DEVICE" /> اور <ph name="NUMBER_OF_DEVICES" /> دیگر</translation> <translation id="2889064240420137087">اس کے ساتھ لنک کھولیں…</translation> <translation id="2891922230654533301"><ph name="APP_NAME" /> میں سائن ان کرنے کیلئے آپ کے آلے کا استعمال کریں؟</translation> <translation id="2893168226686371498">ڈیفالٹ براؤزر</translation> @@ -2306,6 +2309,7 @@ <translation id="3432227430032737297">سبھی دکھائے گئے کو ہٹائیں</translation> <translation id="3432762828853624962">اشتراک کردہ ورکرز</translation> <translation id="3433621910545056227">افوہ! سسٹم آلے کے انسٹالیشن کے وقت کے انتسابات کا لاک تشکیل دینے میں ناکام ہوگیا۔</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">اگر آپ کے بچے کیلئے ویب اور ایپ کی اضافی سرگرمی کی ترتیب آن ہے تو اس ڈیٹا کو اس کے Google اکاؤنٹ میں محفوظ کیا جا سکتا ہے۔ families.google.com پر ان ترتیبات اور ان کو ایڈجسٹ کرنے کے طریقے کے بارے میں مزید جانيں۔</translation> <translation id="3435541101098866721">نیا فون شامل کریں</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" آپ کے <ph name="CODE_TYPE" /> کی درخواست کر رہا ہے</translation> @@ -2753,6 +2757,7 @@ <translation id="3884152383786131369">متعدد زبانوں میں دستیاب ویب مواد اس فہرست سے پہلی سپورٹ کی جانے والی زبان استعمال کرے گا۔ یہ ترجیحات آپ کے براؤزر کی ترتیبات کے ساتھ مطابقت پذیر ہیں۔ <ph name="BEGIN_LINK_LEARN_MORE" />مزید جانیں<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3885112598747515383">اپ ڈیٹس آپ کے منتظم کے زیر انتظام ہیں</translation> <translation id="3886446263141354045">اس سائٹ تک رسائی حاصل کرنے کی آپ کی درخواست <ph name="NAME" /> کو بھیج دی گئی ہے</translation> +<translation id="3887022758415973389">آلے کی فہرست دکھائیں</translation> <translation id="3888053818972567950"><ph name="WEB_DRIVE" /> کنکشن</translation> <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> کے ساتھ نوٹس لیے جا رہے ہیں</translation> <translation id="3888586133700543064">اس معلومات سے آپ کی اسسٹنٹ سے متعلق مسئلے کو بہتر طریقے سے سمجھنے میں ہمیں مدد ملتی ہے۔ اسے 90 دنوں تک کیلئے اسٹور کیا جاتا ہے اور اس تک رسائی انجینیئرنگ اور تاثرات کی مناسب ٹیموں تک محدود ہوتی ہے۔</translation> @@ -3463,6 +3468,7 @@ <translation id="4662373422909645029">عرفی نام میں نمبرز شامل نہیں ہو سکتے</translation> <translation id="4662788913887017617">اپنے iPhone کے ساتھ اس بُک مارک کا اشتراک کریں</translation> <translation id="4663373278480897665">کیمرا اجازت یافتہ ہے</translation> +<translation id="4664289193573249666">Chrome OS ترتیبات میں محفوظ DNS کا نظم کریں</translation> <translation id="4664482161435122549">PKCS #12 برآمد کرنے میں خرابی</translation> <translation id="4665014895760275686">مینوفیکچرر</translation> <translation id="4665446389743427678"><ph name="SITE" /> کا اسٹور کردہ تمام ڈیٹا حذف ہو جائے گا۔</translation> @@ -5995,6 +6001,7 @@ <translation id="7478623944308207463">آپ کی ایپس اور ترتیبات ان تمام Chrome OS آلات میں مطابقت پذیر ہوں گی جہاں آپ اپنے Google اکاؤنٹ سے سائن ان ہیں۔ براؤزر کی مطابقت پذیری کے اختیارات کے ليے <ph name="LINK_BEGIN" />Chrome کی ترتیبات<ph name="LINK_END" /> پر جائیں۔</translation> <translation id="7478658909253570368">سائٹس کو سیریل پورٹس سے منسلک ہونے کی اجازت نہ دیں</translation> <translation id="7479221278376295180">اسٹوریج کے استعمال کا مجموعی جائزہ</translation> +<translation id="747981547666531654"><ph name="FIRST_DEVICE" /> اور <ph name="SECOND_DEVICE" /> نام والے بلوٹوتھ آلات سے منسلک کیا گیا</translation> <translation id="7481312909269577407">فارورڈ کریں</translation> <translation id="7481358317100446445">تیار ہے</translation> <translation id="748138892655239008">سرٹیفکیٹ کی بنیادی پابندیاں</translation> @@ -6047,6 +6054,7 @@ <translation id="7531771599742723865">زیر استعمال آلہ</translation> <translation id="7531779363494549572">ترتیبات > ایپس اور اطلاعات > اطلاعات پر جائیں۔</translation> <translation id="7532009420053991888"><ph name="LINUX_APP_NAME" /> جواب نہیں دے رہی ہے۔ ایپ بند کرنے کیلئے، "زبردستی بند کریں" منتخب کریں۔</translation> +<translation id="7535730537657706072">اپنے آلے سے پوشیدگی براؤزنگ کی سرگزشت کو صاف کرنے کیلئے تمام پوشیدگی ٹیبز کو بند کریں</translation> <translation id="7535791657097741517">ہلکی تھیم آن کریں</translation> <translation id="7537451260744431038">سائٹس آپ کے براؤزنگ کے تجربہ کو، مثال کے طور پر، آپ کو سائن ان رکھنے یا آپ کی شاپنگ کارٹ میں آئٹمز کو یاد رکھنے کے لیے، بہتر بنانے کے لیے کوکیز کا استعمال نہیں کر سکتی ہیں</translation> <translation id="753769905878158714">ایڈریس بار میں، جس ویب سائٹ کو آپ تلاش کرنا چاہتے ہیں اس کیلئے کلیدی لفظ درج کریں۔ پھر جاری رکھنے کیلئے کی بورڈ شارٹ کٹ استعمال کریں۔</translation> @@ -6663,6 +6671,7 @@ <translation id="8138217203226449454">کیا آپ کا مطلب اپنے تلاش فراہم کنندہ کو تبدیل کرنا ہے؟</translation> <translation id="8138997515734480534"><ph name="VM_NAME" /> کا اسٹیٹس</translation> <translation id="8139447493436036221">Google Drive فائلز</translation> +<translation id="8140070492745508800"><ph name="FIRST_DEVICE" />، <ph name="SECOND_DEVICE" /></translation> <translation id="8141584439523427891">اب متبادل براؤزر میں کھل رہا ہے</translation> <translation id="8141725884565838206">اپنے پاس ورڈز کا نظم کریں</translation> <translation id="814204052173971714">{COUNT,plural, =1{ایک ویڈیو}other{# ویڈیوز}}</translation> @@ -7376,6 +7385,7 @@ <translation id="8909782404367982052">Google لینز کے ساتھ تصاویر تلاش کرنے کیلئے گھسیٹیں</translation> <translation id="8909833622202089127">سائٹ آپ کا مقام ٹریک کر رہی ہے</translation> <translation id="8910222113987937043">آپ کے بُک مارکس، سرگزشت، پاس ورڈز اور دیگر ترتیبات کی تبدیلیوں کی مزید آپ کے Google اکاؤنٹ کے ساتھ مطابقت پذیری نہیں کی جائے گی۔ البتہ آپ کا موجودہ ڈیٹا آپ کے Google اکاؤنٹ میں اسٹور رہے گا اور اس کا <ph name="BEGIN_LINK" />Google ڈیش بورڈ<ph name="END_LINK" /> پر نظم کیا جا سکتا ہے۔</translation> +<translation id="8910987510378294980">آلے کی فہرست چھپائیں</translation> <translation id="8912362522468806198">Google اکاؤنٹ</translation> <translation id="8912793549644936705">پهیلائیں</translation> <translation id="8912810933860534797">خودکار اسکین فعال کریں</translation> @@ -7493,6 +7503,7 @@ <translation id="9033765790910064284">بہرصورت جاری رکھیں</translation> <translation id="9033857511263905942">&پیسٹ کریں</translation> <translation id="903480517321259405">PIN دوبارہ ٹائپ کریں</translation> +<translation id="9037054491984310631"><ph name="DEVICE" /> نام والے بلوٹوتھ آلے سے منسلک کیا گیا</translation> <translation id="9037640663275993951">اس آلے پر VM چلانے کی اجازت نہیں ہے</translation> <translation id="9037818663270399707">آپ کا کنکشن تمام نیٹ ورک ٹریفک کیلئے نجی نہیں ہے</translation> <translation id="9037965129289936994">اصل دکھائیں</translation> @@ -7572,6 +7583,7 @@ <translation id="9112786533191410418"><ph name="FILE_NAME" /> خطرناک ہو سکتا ہے۔ اسکین کرنے کے لیے Google کو بھیجیں؟</translation> <translation id="9112987648460918699">تلاش کریں…</translation> <translation id="9113240369465613386">صرف طاق صفحات</translation> +<translation id="9113469270512809735">حال ہی میں بند کیے گئے آئٹمز کو ٹوگل کریں</translation> <translation id="9114663181201435112">آسانی سے سائن ان کریں</translation> <translation id="9115675100829699941">&بُک مارکس</translation> <translation id="9116465289595958864">آخری ترمیم</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index 76882dd1..a00643e 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -2312,6 +2312,7 @@ <translation id="3432227430032737297">Barcha ko‘rsatilganlarni o‘chirish</translation> <translation id="3432762828853624962">Worker’ning ajratiladigan obyektlari</translation> <translation id="3433621910545056227">Ana xolos! Tizim qurilma atributlarini o‘rnatish vaqtida qulflay olmadi.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Agar farzandingiz uchun Veb va ilovalardagi kengaytirilgan faoliyat tarixi yoqilgan boʻlsa, bu maʼlumotlar uning Google hisobiga saqlanadi. Bu parametr va uni sozlash haqidagi batafsil axborotni families.google.com sahifasidan olish mumkin.</translation> <translation id="3435541101098866721">Yangi telefon kiritish</translation> <translation id="3435688026795609344">“<ph name="EXTENSION_NAME" />” kengaytmasi <ph name="CODE_TYPE" /> kod turini so‘rayapti</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 433e14ba..6320252 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -2325,6 +2325,7 @@ <translation id="3432227430032737297">Xóa tất cả cookie hiển thị</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">Rất tiếc! Hệ thống không thể thiết lập khóa thuộc tính thời gian cài đặt thiết bị.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Nếu bạn bật tùy chọn cài đặt Hoạt động bổ sung trên web và ứng dụng cho con mình, thì dữ liệu này có thể được lưu vào Tài khoản Google của con. Hãy tìm hiểu thêm về các tùy chọn cài đặt này và cách điều chỉnh tại families.google.com.</translation> <translation id="3435541101098866721">Thêm điện thoại mới</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" đang yêu cầu <ph name="CODE_TYPE" /> của bạn</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 6cf87d0..b05f619 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -2303,6 +2303,7 @@ <translation id="3432227430032737297">移除显示的所有 Cookie</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">糟糕!系统无法建立设备安装时间属性锁定。</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">如果您已为孩子开启“其他网络与应用活动记录”设置,这些数据可能会被保存到其 Google 帐号中。您可在 families.google.com 上详细了解这些设置以及如何调整它们。</translation> <translation id="3435541101098866721">添加新的电话号码</translation> <translation id="3435688026795609344">“<ph name="EXTENSION_NAME" />”正在请求您提供 <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index 3f94a3c5..0c2bb32c 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -2324,6 +2324,7 @@ <translation id="3432227430032737297">移除所有顯示項目</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">糟糕!系統無法鎖定裝置安裝時的屬性。</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">如果您為子女開啟其他「網絡及應用程式活動記錄」設定,此資料可能會儲存在他們的 Google 帳戶中。您可以前往 families.google.com 詳細瞭解這些設定及其調整方式</translation> <translation id="3435541101098866721">新增電話</translation> <translation id="3435688026795609344">「<ph name="EXTENSION_NAME" />」正在要求取得您的 <ph name="CODE_TYPE" /></translation> @@ -3483,7 +3484,7 @@ <translation id="4662373422909645029">暱稱不可包含數字</translation> <translation id="4662788913887017617">透過您的 iPhone 分享此書籤</translation> <translation id="4663373278480897665">已允許使用相機</translation> -<translation id="4664289193573249666">在 Chrome OS 設定中管理安全 DNS</translation> +<translation id="4664289193573249666">在 Chrome 作業系統設定中管理安全 DNS</translation> <translation id="4664482161435122549">PKCS #12 匯出錯誤</translation> <translation id="4665014895760275686">製造商</translation> <translation id="4665446389743427678"><ph name="SITE" /> 儲存的所有資料都會被刪除。</translation> @@ -6016,7 +6017,7 @@ <translation id="7478623944308207463">您的應用程式和設定將會同步至所有您使用 Google 帳戶登入的 Chrome 作業系統裝置。如要瞭解瀏覽器同步選項,請前往 <ph name="LINK_BEGIN" />Chrome 設定<ph name="LINK_END" />。</translation> <translation id="7478658909253570368">不允許網站連接至序列連接埠</translation> <translation id="7479221278376295180">儲存空間用量概覽</translation> -<translation id="747981547666531654">已連線至名為「<ph name="FIRST_DEVICE" />」和「<ph name="SECOND_DEVICE" />」的藍牙裝置</translation> +<translation id="747981547666531654">已連線至藍牙裝置,裝置名稱:「<ph name="FIRST_DEVICE" />」和「<ph name="SECOND_DEVICE" />」</translation> <translation id="7481312909269577407">向前</translation> <translation id="7481358317100446445">準備就緒</translation> <translation id="748138892655239008">憑證基本限制</translation> @@ -6069,7 +6070,7 @@ <translation id="7531771599742723865">裝置使用中</translation> <translation id="7531779363494549572">前往 [設定] > [應用程式和通知] > [通知]。</translation> <translation id="7532009420053991888"><ph name="LINUX_APP_NAME" /> 沒有回應。選取「強制關閉」即可關閉應用程式。</translation> -<translation id="7535730537657706072">如要清除裝置上的無痕模式瀏覽記錄,請關閉所有無痕分頁</translation> +<translation id="7535730537657706072">如要清除裝置上的無痕瀏覽記錄,請關閉所有無痕式分頁</translation> <translation id="7535791657097741517">開啟淺色主題背景</translation> <translation id="7537451260744431038">網站不可使用 Cookie 來改善瀏覽體驗,例如讓您保持登入狀態或記住購物車中的商品</translation> <translation id="753769905878158714">在網址列輸入您想搜尋網站的關鍵字。然後使用鍵盤快速鍵繼續操作。</translation> @@ -6687,7 +6688,7 @@ <translation id="8138217203226449454">您要變更搜尋服務供應商嗎?</translation> <translation id="8138997515734480534"><ph name="VM_NAME" /> 狀態</translation> <translation id="8139447493436036221">「Google 雲端硬碟」檔案</translation> -<translation id="8140070492745508800">「<ph name="FIRST_DEVICE" />」、「<ph name="SECOND_DEVICE" />」</translation> +<translation id="8140070492745508800"><ph name="FIRST_DEVICE" />、<ph name="SECOND_DEVICE" /></translation> <translation id="8141584439523427891">正在替代瀏覽器中開啟</translation> <translation id="8141725884565838206">管理您的密碼</translation> <translation id="814204052173971714">{COUNT,plural, =1{1 部影片}other{# 部影片}}</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index 17b6206..b3bd4e9 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -2310,6 +2310,7 @@ <translation id="3432227430032737297">將顯示的項目全部移除</translation> <translation id="3432762828853624962">Shared Workers</translation> <translation id="3433621910545056227">糟糕!系統無法鎖定裝置安裝時的屬性。</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">如果貴子女的「其他網路和應用程式活動」設定為開啟,這些資料可能會儲存在他們的 Google 帳戶中。如要進一步瞭解這些設定及其調整方式,請前往 families.google.com。</translation> <translation id="3435541101098866721">新增電話</translation> <translation id="3435688026795609344">「<ph name="EXTENSION_NAME" />」要求你提供 <ph name="CODE_TYPE" /></translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb index f72c478..7791ac7f 100644 --- a/chrome/app/resources/generated_resources_zu.xtb +++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -2324,6 +2324,7 @@ <translation id="3432227430032737297">Susa konke okunonisiwe</translation> <translation id="3432762828853624962">Abasebenzisi ababiwe</translation> <translation id="3433621910545056227">Eshu! Isistimu ihlulekile ukusungula ukukhiya kwesichasiso kwesikhathi sokufaka sedivayisi.</translation> +<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3434272557872943250">Uma isilungiselelo esingeziwe sewebhu nesohlelo lokusebenza sivulelwe ingane yakho, le datha ingalondolozwa ku-akhawunti yakhe ye-Google. Funda kabanzi ngalezi zilungiselelo nendlela yokuzilungisa kwethi families.google.com.</translation> <translation id="3435541101098866721">Engeza ifoni entsha</translation> <translation id="3435688026795609344">I-"<ph name="EXTENSION_NAME" />" icela i-<ph name="CODE_TYPE" /> yakho</translation>
diff --git a/chrome/app/resources/google_chrome_strings_az.xtb b/chrome/app/resources/google_chrome_strings_az.xtb index 5c892f2..56b264095 100644 --- a/chrome/app/resources/google_chrome_strings_az.xtb +++ b/chrome/app/resources/google_chrome_strings_az.xtb
@@ -273,6 +273,7 @@ <translation id="8008534537613507642">Chrome'u yenidən quraşdırın</translation> <translation id="8013993649590906847">Şəklin təsviri faydalı deyilsə, Chrome Sizin üçün təsviri təmin etməyə çalışacaq. Təsvir yaratmaq üçün şəkillər Google'a göndərilir.</translation> <translation id="8129812357326543296">Google Chrome haqqında</translation> +<translation id="822971176939352383">Aşağıdakı hesablar heç bir Chrome profilinə daxil olmayıb. Başqa bir profildə hesab istifadə etmək istəyirsinizsə, əvvəlcə həmin profili silin.</translation> <translation id="8255190535488645436">Google Chrome kameranızı və mikrofonunuzu işlədir.</translation> <translation id="8286862437124483331">Google Chrome parolları göstərməyə cəhd edir. Buna icazə vermək üçün Windows parolunuzu yazın.</translation> <translation id="828798499196665338">Valideyniniz Chrome üçün "Saytlar, tətbiqlər və artırmalar üçün icazələri" deaktiv edib. Bu <ph name="EXTENSION_TYPE_PARAMETER" /> artırmasının aktiv edilməsinə icazə verilmir.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_gl.xtb b/chrome/app/resources/google_chrome_strings_gl.xtb index 2894593..9088105 100644 --- a/chrome/app/resources/google_chrome_strings_gl.xtb +++ b/chrome/app/resources/google_chrome_strings_gl.xtb
@@ -277,6 +277,7 @@ <translation id="8008534537613507642">Reinstalar Chrome</translation> <translation id="8013993649590906847">Se unha imaxe non ten unha descrición útil, Chrome tentará proporcionarche unha. Para crear descricións, envíanse imaxes a Google.</translation> <translation id="8129812357326543296">Acerca de &Google Chrome</translation> +<translation id="822971176939352383">As seguintes contas non teñen a sesión iniciada en ningún perfil de Chrome. Se queres usar unha conta noutro perfil, primeiro elimina ese perfil.</translation> <translation id="8255190535488645436">Google Chrome está utilizando a túa cámara e micrófono.</translation> <translation id="8286862437124483331">Google Chrome está tentando mostrar contrasinais. Escribe o teu contrasinal de Windows para permitir esta acción.</translation> <translation id="828798499196665338">O teu pai ou nai desactivou esta opción en Chrome: Permisos para sitios, aplicacións e extensións. Non está permitido activar esta <ph name="EXTENSION_TYPE_PARAMETER" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ml.xtb b/chrome/app/resources/google_chrome_strings_ml.xtb index a3b1a9c..029781a 100644 --- a/chrome/app/resources/google_chrome_strings_ml.xtb +++ b/chrome/app/resources/google_chrome_strings_ml.xtb
@@ -278,6 +278,7 @@ <translation id="8008534537613507642">Chrome വീണ്ടും ഇൻസ്റ്റാളുചെയ്യുക</translation> <translation id="8013993649590906847">ചിത്രത്തിൽ ഉപകാരപ്രദമായ വിവരണമില്ലെങ്കിൽ നിങ്ങൾക്കായി ഒരു വിവരണം നൽകാൻ Chrome ശ്രമിക്കും. വിവരണങ്ങൾ സൃഷ്ടിക്കാൻ, ചിത്രങ്ങൾ Google-ലേക്ക് അയയ്ക്കുന്നു.</translation> <translation id="8129812357326543296">&Google Chrome-നെക്കുറിച്ച്</translation> +<translation id="822971176939352383">ഇനിപ്പറയുന്ന അക്കൗണ്ടുകൾ ഏതെങ്കിലും Chrome പ്രൊഫൈലുകളിലേക്ക് സൈൻ ഇൻ ചെയ്തിട്ടില്ല. നിങ്ങൾക്ക് മറ്റൊരു പ്രൊഫൈലിൽ അക്കൗണ്ട് ഉപയോഗിക്കാൻ താൽപ്പര്യമുണ്ടെങ്കിൽ, ആദ്യം ആ പ്രൊഫൈൽ നീക്കം ചെയ്യുക.</translation> <translation id="8255190535488645436">Google Chrome നിങ്ങളുടെ ക്യാമറയും മൈക്രോഫോണും ഉപയോഗിക്കുന്നു.</translation> <translation id="8286862437124483331">Google Chrome പാസ്വേഡുകൾ ദൃശ്യമാക്കാൻ ശ്രമിക്കുന്നു. ഇത് അനുവദിക്കാൻ നിങ്ങളുടെ Windows പാസ്വേഡ് നൽകുക.</translation> <translation id="828798499196665338">നിങ്ങളുടെ രക്ഷിതാവ് Chrome-നുള്ള "സൈറ്റുകൾക്കും ആപ്പുകൾക്കും വിപുലീകരണങ്ങൾക്കുമുള്ള അനുമതികൾ" ഓഫാക്കി. ഈ <ph name="EXTENSION_TYPE_PARAMETER" /> പ്രവർത്തനക്ഷമമാക്കുന്നത് അനുവദനീയമല്ല.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mr.xtb b/chrome/app/resources/google_chrome_strings_mr.xtb index 16f5e1fd..bd55766 100644 --- a/chrome/app/resources/google_chrome_strings_mr.xtb +++ b/chrome/app/resources/google_chrome_strings_mr.xtb
@@ -37,7 +37,7 @@ <translation id="1734234790201236882">Chrome हा पासवर्ड तुमच्या Google खात्यामध्ये सेव्ह करेल. तुम्हाला लक्षात ठेवावा लागणार नाही.</translation> <translation id="174539241580958092">साइन इन करण्यात एरर आल्यामुळे Google Chrome तुमचा डेटा सिंक करू शकले नाही.</translation> <translation id="1759842336958782510">Chrome</translation> -<translation id="1786003790898721085">तुम्ही तुमच्या <ph name="TARGET_DEVICE_NAME" /> वर Chrome मध्ये साइन इन केले असल्याची खात्री करा आणि त्यानंतर पुन्हा पाठवून पाहा.</translation> +<translation id="1786003790898721085">तुम्ही तुमच्या <ph name="TARGET_DEVICE_NAME" /> वर Chrome मध्ये साइन इन केले असल्याची खात्री करा आणि त्यानंतर पुन्हा पाठवून पहा.</translation> <translation id="1810203443153428607">Chrome OS इंस्टॉल केल्याने, तुमच्या डिव्हाइसवरील सर्व डेटा ओव्हरराइट केला जाईल.</translation> <translation id="1812689907177901597">हे बंद करून, तुम्ही Chrome वर साइन इन न करता Gmail सारख्या Google साइटवर साइन इन करू शकता</translation> <translation id="1860536484129686729">या साइटसाठी Chrome ला तुमचा कॅमेरा ॲक्सेस करण्याची परवानगी हवी आहे</translation> @@ -192,7 +192,7 @@ <translation id="556024056938947818">Google Chrome पासवर्ड दर्शवण्याचा प्रयत्न करत आहे.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-मध्ये)</translation> <translation id="5657226924540934362">या पेजवर सेटिंग दिसत नसल्यास, तुमच्या <ph name="LINK_BEGIN" /> - Chrome OS सेटिंग्ज<ph name="LINK_END" /> मध्ये पाहा</translation> + Chrome OS सेटिंग्ज<ph name="LINK_END" /> मध्ये पहा</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> धोकादायक असू शकते, त्यामुळे Chrom ने ते अवरोधित केले आहे.</translation> <translation id="5678190148303298925">{COUNT,plural, =0{तुमच्या ॲडमिनिस्ट्रेटरने तुम्हाला हे अपडेट लागू करण्यासाठी Chrome पुन्हा लाँच करण्यास सांगितले आहे}=1{तुमच्या ॲडमिनिस्ट्रेटरने हे अपडेट लागू करण्यासाठी तुम्हाला Chrome पुन्हा लाँच करण्यास सांगितले आहे. तुमची गुप्त विंडो पुन्हा उघडणार नाही.}other{तुमच्या ॲडमिनिस्ट्रेटरने हे अपडेट लागू करण्यासाठी तुम्हाला Chrome पुन्हा लाँच करण्यास सांगितले आहे. तुमच्या # गुप्त विंडो पुन्हा उघडणार नाहीत.}}</translation> <translation id="5686916850681061684">Google Chrome कस्टमाइझ करा आणि नियंत्रित करा. एका गोष्टीवर तुम्ही लक्ष द्यायला हवे - तपशिलांसाठी क्लिक करा.</translation> @@ -276,6 +276,7 @@ <translation id="8008534537613507642">Chrome पुनर्स्थापित करा</translation> <translation id="8013993649590906847">इमेजचे उपयोगी वर्णन नसल्यास, Chrome तुमच्यासाठी ते देण्याचा प्रयत्न करेल. वर्णने तयार करण्यासाठी, इमेज Google ला पाठवल्या जातात.</translation> <translation id="8129812357326543296">&Google Chrome विषयी</translation> +<translation id="822971176939352383">पुढील खात्यांनी कोणत्याही Chrome प्रोफाइलमध्ये साइन इन केलेले नाही. तुम्हाला दुसऱ्या प्रोफाइलमध्ये एखादे खाते वापरायचे असल्यास, सर्वप्रथम ती प्रोफाइल काढून टाका.</translation> <translation id="8255190535488645436">Google Chrome तुमचा कॅमेरा आणि मायक्रोफोन वापरत आहे.</translation> <translation id="8286862437124483331">Google Chrome पासवर्ड दर्शविण्याचा प्रयत्न करत आहे. यास अनुमती देण्यासाठी तुमचा Windows पासवर्ड टाइप करा.</translation> <translation id="828798499196665338">तुमच्या पालकांनी Chrome साठी "साइट, अॅप्स आणि एक्स्टेंशनकरिता परवानग्या" सुरू केल्या आहेत. हे <ph name="EXTENSION_TYPE_PARAMETER" /> सुरू करण्यास अनुमती नाही.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ne.xtb b/chrome/app/resources/google_chrome_strings_ne.xtb index 6b5ba2e..7fb31bf7 100644 --- a/chrome/app/resources/google_chrome_strings_ne.xtb +++ b/chrome/app/resources/google_chrome_strings_ne.xtb
@@ -274,6 +274,7 @@ <translation id="8008534537613507642">Chrome लाई पुन: स्थापना गर्नुहोस्</translation> <translation id="8013993649590906847">कुनै छविमा उपयोगी विवरण नभएका खण्डमा Chrome ले तपाईंलाई एउटा विवरण उपलब्ध गराउने प्रयास गर्ने छ। विवरणहरू सिर्जना गर्न फोटो Google मा पठाइन्छ।</translation> <translation id="8129812357326543296">&Google Chrome बारे</translation> +<translation id="822971176939352383">निम्न खाताहरू कुनै पनि Chrome प्रोफाइलमा साइन इन गरिएका छैनन्। तपाईं कुनै खाता अर्को कुनै प्रोफाइलमा प्रयोग गर्न चाहनुहुन्छ भने पहिले उक्त प्रोफाइल हटाउनुहोस्।</translation> <translation id="8255190535488645436">Google Chrome ले तपाइँको क्यामेरा र माइक्रोफोन प्रयोग गर्दैछ।</translation> <translation id="8286862437124483331">Google Chrome ले पासवर्डहरू देखाउन प्रयास गर्दैछ। यसलाई अनुमति दिन तपाइँको विन्डोस पासवर्ड टाइप गर्नुहोस्।</translation> <translation id="828798499196665338">तपाईंका अभिभावकले Chrome का हकमा "साइट, एप तथा एक्सटेन्सनसम्बन्धी अनुमति" निष्क्रिय पार्नुभएको छ। तपाईंसँग यो <ph name="EXTENSION_TYPE_PARAMETER" /> सक्षम पार्ने अनुमति छैन।</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pa.xtb b/chrome/app/resources/google_chrome_strings_pa.xtb index 2b260c3..273bc210 100644 --- a/chrome/app/resources/google_chrome_strings_pa.xtb +++ b/chrome/app/resources/google_chrome_strings_pa.xtb
@@ -278,6 +278,7 @@ <translation id="8008534537613507642">Chrome ਨੂੰ ਮੁੜ-ਸਥਾਪਤ ਕਰੋ</translation> <translation id="8013993649590906847">ਜੇ ਕਿਸੇ ਚਿੱਤਰ ਦਾ ਲਾਭਕਾਰੀ ਵਰਣਨ ਨਹੀਂ ਹੈ, ਤਾਂ Chrome ਤੁਹਾਡੇ ਲਈ ਇੱਕ ਵਰਣਨ ਮੁਹੱਈਆ ਕਰਵਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੇਗਾ। ਵਰਣਨ ਬਣਾਉਣ ਲਈ, ਚਿੱਤਰ Google ਨੂੰ ਭੇਜੇ ਜਾਂਦੇ ਹਨ।</translation> <translation id="8129812357326543296">&Google Chrome ਬਾਰੇ</translation> +<translation id="822971176939352383">ਅੱਗੇ ਦਿੱਤੇ ਖਾਤਿਆਂ ਨੇ ਕਿਸੇ ਵੀ Chrome ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ ਸਾਈਨ-ਇਨ ਨਹੀਂ ਕੀਤਾ ਹੋਇਆ। ਜੇ ਤੁਸੀਂ ਕਿਸੇ ਹੋਰ ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ ਖਾਤਾ ਵਰਤਣਾ ਚਾਹੁੰਦੇ ਹੋ, ਤਾਂ ਪਹਿਲਾਂ ਉਸ ਪ੍ਰੋਫਾਈਲ ਨੂੰ ਹਟਾਓ।</translation> <translation id="8255190535488645436">Google Chrome ਤੁਹਾਡਾ ਕੈਮਰਾ ਅਤੇ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਵਰਤ ਰਿਹਾ ਹੈ।</translation> <translation id="8286862437124483331">Google Chrome ਪਾਸਵਰਡ ਦਿਖਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਰਿਹਾ ਹੈ। ਇਸਦੀ ਆਗਿਆ ਦੇਣ ਲਈ ਆਪਣਾ Windows ਪਾਸਵਰਡ ਟਾਈਪ ਕਰੋ।</translation> <translation id="828798499196665338">ਤੁਹਾਡੇ ਮਾਂ-ਪਿਓ ਨੇ Chrome ਲਈ "ਸਾਈਟਾਂ, ਐਪਾਂ ਅਤੇ ਐਕਸਟੈਂਸ਼ਨਾਂ ਲਈ ਇਜਾਜ਼ਤਾਂ" ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਹੈ। ਇਸ <ph name="EXTENSION_TYPE_PARAMETER" /> ਨੂੰ ਚਾਲੂ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ru.xtb b/chrome/app/resources/google_chrome_strings_ru.xtb index ed0c274..95fa6a1 100644 --- a/chrome/app/resources/google_chrome_strings_ru.xtb +++ b/chrome/app/resources/google_chrome_strings_ru.xtb
@@ -304,7 +304,7 @@ <translation id="911206726377975832">Также удалить данные о работе в браузере?</translation> <translation id="9138603949443464873">Чтобы изменения вступили в силу, перезапустите Chrome.</translation> <translation id="919706545465235479">Чтобы начать синхронизацию, обновите Chrome</translation> -<translation id="922152298093051471">Настроить</translation> +<translation id="922152298093051471">Настроить Chrome</translation> <translation id="940313311831216333">Чтобы получить доступ к данным в Chrome на всех своих устройствах, войдите в аккаунт и включите синхронизацию.</translation> <translation id="989369509083708165">Google Chrome используется как браузер по умолчанию</translation> <translation id="989816563149873169">Переключиться на другой профиль Chrome можно с помощью сочетания клавиш <ph name="SHORTCUT" /></translation>
diff --git a/chrome/app/resources/google_chrome_strings_ur.xtb b/chrome/app/resources/google_chrome_strings_ur.xtb index c04f171..4d4fe2a5f 100644 --- a/chrome/app/resources/google_chrome_strings_ur.xtb +++ b/chrome/app/resources/google_chrome_strings_ur.xtb
@@ -277,6 +277,7 @@ <translation id="8008534537613507642">Chrome کو دوبارہ انسٹال کریں</translation> <translation id="8013993649590906847">اگر کسی تصویر میں مفید تفصیل موجود نہیں ہے تو Chrome آپ کے لیے تفصیل فراہم کرنے کی کوشش کرے گا۔ تفصیلات تخلیق کرنے کے لیے، تصاویر Google کو بھیجی جاتی ہیں۔</translation> <translation id="8129812357326543296">&Google Chrome کے بارے میں</translation> +<translation id="822971176939352383">درج ذیل اکاؤنٹس کسی Chrome پروفائل میں سائن ان نہیں ہیں۔ اگر آپ کسی دوسری پروفائل میں اکاؤنٹ استعمال کرنا چاہتے ہیں تو پہلے اس پروفائل کو ہٹا دیں۔</translation> <translation id="8255190535488645436">Google Chrome آپ کا کیمرا اور مائیکروفون استعمال کر رہا ہے۔</translation> <translation id="8286862437124483331">Google Chrome پاس ورڈز دکھانے کی کوشش کر رہا ہے۔ اس کی اجازت دینے کیلئے اپنا Windows پاس ورڈ ٹائپ کریں۔</translation> <translation id="828798499196665338">آپ کے والدین نے "Chrome کی خاطر سائٹس، ایپس اور ایکسٹینشنز کے لیے اجازتوں" کو آف کر دیا ہے۔ اس <ph name="EXTENSION_TYPE_PARAMETER" /> کو فعال کرنے کی اجازت نہیں ہے۔</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-HK.xtb b/chrome/app/resources/google_chrome_strings_zh-HK.xtb index 32e42fb..129ec8c 100644 --- a/chrome/app/resources/google_chrome_strings_zh-HK.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-HK.xtb
@@ -276,7 +276,7 @@ <translation id="8008534537613507642">重新安裝 Chrome</translation> <translation id="8013993649590906847">如果圖片並無有用的說明,Chrome 會嘗試為您提供說明。因此,圖片將傳送至 Google 以建立說明。</translation> <translation id="8129812357326543296">關於 Google Chrome(&G)</translation> -<translation id="822971176939352383">下列帳戶未登入任何 Chrome 設定檔。如要將帳戶用於其他設定檔,請先移除該設定檔。</translation> +<translation id="822971176939352383">以下帳戶未登入任何 Chrome 設定檔。如要將帳戶用於其他設定檔,請先移除該設定檔。</translation> <translation id="8255190535488645436">Google Chrome 正在使用您的相機和麥克風。</translation> <translation id="8286862437124483331">Google Chrome 正在嘗試顯示密碼。如果您同意,請輸入您的 Windows 密碼。</translation> <translation id="828798499196665338">您的家長已停用 Chrome 的「網站、應用程式和擴充程式權限」設定,因此您無法啟用此<ph name="EXTENSION_TYPE_PARAMETER" />。</translation>
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index d05d1baf..b73a23d 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -4306,9 +4306,6 @@ flag_descriptions::kOmniboxTabSwitchSuggestionsName, flag_descriptions::kOmniboxTabSwitchSuggestionsDescription, kOsDesktop, FEATURE_VALUE_TYPE(omnibox::kOmniboxTabSwitchSuggestions)}, - {"omnibox-pedals-batch2", flag_descriptions::kOmniboxPedalsBatch2Name, - flag_descriptions::kOmniboxPedalsBatch2Description, kOsDesktop, - FEATURE_VALUE_TYPE(omnibox::kOmniboxPedalsBatch2)}, {"omnibox-pedals-batch2-nonenglish", flag_descriptions::kOmniboxPedalsBatch2NonEnglishName, flag_descriptions::kOmniboxPedalsBatch2NonEnglishDescription, kOsDesktop, @@ -4316,10 +4313,6 @@ {"omnibox-pedals-batch3", flag_descriptions::kOmniboxPedalsBatch3Name, flag_descriptions::kOmniboxPedalsBatch3Description, kOsDesktop, FEATURE_VALUE_TYPE(omnibox::kOmniboxPedalsBatch3)}, - {"omnibox-pedals-default-icon-colored", - flag_descriptions::kOmniboxPedalsDefaultIconColoredName, - flag_descriptions::kOmniboxPedalsDefaultIconColoredDescription, kOsDesktop, - FEATURE_VALUE_TYPE(omnibox::kOmniboxPedalsDefaultIconColored)}, {"omnibox-pedals-translation-console", flag_descriptions::kOmniboxPedalsTranslationConsoleName, flag_descriptions::kOmniboxPedalsTranslationConsoleDescription, kOsDesktop, @@ -7501,6 +7494,11 @@ FEATURE_VALUE_TYPE(ash::features::kTrafficCountersSettingsUi)}, #endif // BUILDFLAG(IS_CHROMEOS_ASH) + {"extensions-menu-access-control", + flag_descriptions::kExtensionsMenuAccessControlName, + flag_descriptions::kExtensionsMenuAccessControlDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kExtensionsMenuAccessControl)}, + // NOTE: Adding a new flag requires adding a corresponding entry to enum // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag // Histograms" in tools/metrics/histograms/README.md (run the
diff --git a/chrome/browser/accessibility/live_caption_controller.cc b/chrome/browser/accessibility/live_caption_controller.cc index 8779a62..0285ecc 100644 --- a/chrome/browser/accessibility/live_caption_controller.cc +++ b/chrome/browser/accessibility/live_caption_controller.cc
@@ -170,10 +170,6 @@ if (is_ui_constructed_) return; - DCHECK(!base::FeatureList::IsEnabled(media::kUseSodaForLiveCaption) || - speech::SodaInstaller::GetInstance()->IsSodaInstalled( - speech::GetLanguageCode( - profile_prefs_->GetString(prefs::kLiveCaptionLanguageCode)))); is_ui_constructed_ = true; caption_bubble_controller_ = CaptionBubbleController::Create();
diff --git a/chrome/browser/android/metrics/uma_session_stats.cc b/chrome/browser/android/metrics/uma_session_stats.cc index 96095f2..fd892c3 100644 --- a/chrome/browser/android/metrics/uma_session_stats.cc +++ b/chrome/browser/android/metrics/uma_session_stats.cc
@@ -8,6 +8,7 @@ #include "base/android/jni_string.h" #include "base/bind.h" #include "base/command_line.h" +#include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/metrics/user_metrics.h" #include "base/no_destructor.h" @@ -185,6 +186,8 @@ } void UmaSessionStats::ProvideCurrentSessionData() { + base::UmaHistogramBoolean("Session.IsActive", active_session_count_ != 0); + // We record Session.Background.TotalDuration here to ensure each UMA log // containing a background session contains this histogram. session_time_tracker_.AccumulateBackgroundSessionTime();
diff --git a/chrome/browser/ash/crosapi/browser_manager.cc b/chrome/browser/ash/crosapi/browser_manager.cc index 33e80ab..7f85e8dd2 100644 --- a/chrome/browser/ash/crosapi/browser_manager.cc +++ b/chrome/browser/ash/crosapi/browser_manager.cc
@@ -268,7 +268,7 @@ if (!socket_path.empty()) { test_mojo_connection_manager_ = std::make_unique<crosapi::TestMojoConnectionManager>( - base::FilePath(socket_path)); + base::FilePath(socket_path), environment_provider_.get()); } }
diff --git a/chrome/browser/ash/crosapi/test_mojo_connection_manager.cc b/chrome/browser/ash/crosapi/test_mojo_connection_manager.cc index bf2700d3..7713dc1 100644 --- a/chrome/browser/ash/crosapi/test_mojo_connection_manager.cc +++ b/chrome/browser/ash/crosapi/test_mojo_connection_manager.cc
@@ -47,8 +47,9 @@ } // namespace TestMojoConnectionManager::TestMojoConnectionManager( - const base::FilePath& socket_path) - : environment_provider_(std::make_unique<EnvironmentProvider>()) { + const base::FilePath& socket_path, + EnvironmentProvider* environment_provider) + : environment_provider_(environment_provider) { base::ThreadPool::PostTaskAndReplyWithResult( FROM_HERE, {base::MayBlock()}, base::BindOnce(&CreateSocketForTesting, socket_path), @@ -86,7 +87,7 @@ })); base::ScopedFD startup_fd = browser_util::CreateStartupData( - environment_provider_.get(), + environment_provider_, mojom::InitialBrowserAction::kUseStartupPreference); if (!startup_fd.is_valid()) { LOG(ERROR) << "Failed to create startup data";
diff --git a/chrome/browser/ash/crosapi/test_mojo_connection_manager.h b/chrome/browser/ash/crosapi/test_mojo_connection_manager.h index 97cdb726..3b984179 100644 --- a/chrome/browser/ash/crosapi/test_mojo_connection_manager.h +++ b/chrome/browser/ash/crosapi/test_mojo_connection_manager.h
@@ -33,7 +33,8 @@ // when launching it inside gdb. class TestMojoConnectionManager { public: - explicit TestMojoConnectionManager(const base::FilePath& socket_path); + explicit TestMojoConnectionManager(const base::FilePath& socket_path, + EnvironmentProvider* environment_provider); TestMojoConnectionManager(const TestMojoConnectionManager&) = delete; TestMojoConnectionManager& operator=(const TestMojoConnectionManager&) = @@ -49,7 +50,7 @@ void OnTestingSocketAvailable(); // Used to pass ash-chrome specific flags/configurations to lacros-chrome. - std::unique_ptr<EnvironmentProvider> environment_provider_; + EnvironmentProvider* environment_provider_; // A socket for a client, such as a test launcher, to connect to. base::ScopedFD testing_socket_;
diff --git a/chrome/browser/ash/crosapi/test_mojo_connection_manager_unittest.cc b/chrome/browser/ash/crosapi/test_mojo_connection_manager_unittest.cc index dcd60b6..e3e52b6 100644 --- a/chrome/browser/ash/crosapi/test_mojo_connection_manager_unittest.cc +++ b/chrome/browser/ash/crosapi/test_mojo_connection_manager_unittest.cc
@@ -29,6 +29,7 @@ #include "chrome/browser/ash/crosapi/browser_service_host_observer.h" #include "chrome/browser/ash/crosapi/crosapi_ash.h" #include "chrome/browser/ash/crosapi/crosapi_manager.h" +#include "chrome/browser/ash/crosapi/environment_provider.h" #include "chrome/browser/ash/crosapi/idle_service_ash.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/test/base/scoped_testing_local_state.h" @@ -206,8 +207,10 @@ EXPECT_FALSE(error); run_loop1.Quit(); }))); + std::unique_ptr<EnvironmentProvider> environment_provider = + std::make_unique<EnvironmentProvider>(); TestMojoConnectionManager test_mojo_connection_manager{ - base::FilePath(socket_path)}; + base::FilePath(socket_path), environment_provider.get()}; run_loop1.Run(); // Test connects with ash-chrome via the socket.
diff --git a/chrome/browser/ash/hats/OWNERS b/chrome/browser/ash/hats/OWNERS index 7506399..602d941 100644 --- a/chrome/browser/ash/hats/OWNERS +++ b/chrome/browser/ash/hats/OWNERS
@@ -1 +1,3 @@ gabrielsz@google.com +mutexlox@chromium.org +iby@chromium.org
diff --git a/chrome/browser/ash/scanning/lorgnette_scanner_manager.cc b/chrome/browser/ash/scanning/lorgnette_scanner_manager.cc index 7aedff4..f81cc7b 100644 --- a/chrome/browser/ash/scanning/lorgnette_scanner_manager.cc +++ b/chrome/browser/ash/scanning/lorgnette_scanner_manager.cc
@@ -16,6 +16,7 @@ #include "base/logging.h" #include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" +#include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "chrome/browser/ash/scanning/lorgnette_scanner_manager_util.h" #include "chrome/browser/ash/scanning/zeroconf_scanner_detector.h" @@ -23,6 +24,7 @@ #include "chromeos/dbus/lorgnette/lorgnette_service.pb.h" #include "chromeos/dbus/lorgnette_manager/lorgnette_manager_client.h" #include "chromeos/scanning/scanner.h" +#include "components/device_event_log/device_event_log.h" #include "net/base/ip_address.h" #include "third_party/re2/src/re2/re2.h" @@ -111,6 +113,36 @@ is_usb_scanner ? " (USB)" : ""); } +std::string ScannerCapabilitiesToString( + const lorgnette::ScannerCapabilities& capabilities) { + std::vector<std::string> sources; + sources.reserve(capabilities.sources_size()); + for (const lorgnette::DocumentSource& source : capabilities.sources()) { + std::vector<std::string> resolutions; + resolutions.reserve(source.resolutions_size()); + for (const uint32_t resolution : source.resolutions()) { + resolutions.emplace_back(base::StringPrintf("%d", resolution)); + } + + std::vector<std::string> color_modes; + color_modes.reserve(source.color_modes_size()); + for (int i = 0; i < source.color_modes_size(); i++) { + // Loop manually because `color_modes()` returns a RepeatedField<int> + // instead of ColorMode. + color_modes.emplace_back( + lorgnette::ColorMode_Name(source.color_modes(i))); + } + + sources.emplace_back(base::StringPrintf( + "{ %s (%s) area=%0.1fx%0.1f resolutions=%s color_modes=%s }", + lorgnette::SourceType_Name(source.type()).c_str(), + source.name().c_str(), source.area().width(), source.area().height(), + base::JoinString(resolutions, ",").c_str(), + base::JoinString(color_modes, ",").c_str())); + } + return base::JoinString(sources, ", "); +} + class LorgnetteScannerManagerImpl final : public LorgnetteScannerManager { public: LorgnetteScannerManagerImpl( @@ -243,6 +275,10 @@ return; } + PRINTER_LOG(DEBUG) << "Scanner capabilities for " << scanner_name << " at " + << device_name << " => " + << ScannerCapabilitiesToString(capabilities.value()); + std::move(callback).Run(capabilities); }
diff --git a/chrome/browser/capability_delegation_browsertest.cc b/chrome/browser/capability_delegation_browsertest.cc index cca974c3..c75a7b3 100644 --- a/chrome/browser/capability_delegation_browsertest.cc +++ b/chrome/browser/capability_delegation_browsertest.cc
@@ -76,20 +76,20 @@ // Without either user activation or payment request token, PaymentRequest // dialog is not allowed. - EXPECT_EQ("NotAllowedError", + EXPECT_EQ("SecurityError", content::EvalJs(active_web_contents, "sendRequestToSubframe(false)", content::EXECUTE_SCRIPT_NO_USER_GESTURE)); // Without user activation but with the delegation option, PaymentRequest // dialog is not allowed. - EXPECT_EQ("NotAllowedError", + EXPECT_EQ("SecurityError", content::EvalJs(active_web_contents, "sendRequestToSubframe(true)", content::EXECUTE_SCRIPT_NO_USER_GESTURE)); // With user activation but without the delegation option, PaymentRequest // dialog is not allowed. - EXPECT_EQ("NotAllowedError", content::EvalJs(active_web_contents, - "sendRequestToSubframe(false)")); + EXPECT_EQ("SecurityError", content::EvalJs(active_web_contents, + "sendRequestToSubframe(false)")); // With both user activation and the delegation option, PaymentRequest dialog // is shown and then successfully aborted by the script.
diff --git a/chrome/browser/content_creation/notes/internal/android/java/src/org/chromium/chrome/browser/content_creation/notes/NoteCreationCoordinatorImpl.java b/chrome/browser/content_creation/notes/internal/android/java/src/org/chromium/chrome/browser/content_creation/notes/NoteCreationCoordinatorImpl.java index 099e222..20f30e38 100644 --- a/chrome/browser/content_creation/notes/internal/android/java/src/org/chromium/chrome/browser/content_creation/notes/NoteCreationCoordinatorImpl.java +++ b/chrome/browser/content_creation/notes/internal/android/java/src/org/chromium/chrome/browser/content_creation/notes/NoteCreationCoordinatorImpl.java
@@ -20,6 +20,7 @@ import org.chromium.chrome.browser.content_creation.notes.top_bar.TopBarDelegate; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.share.ChromeShareExtras; +import org.chromium.chrome.browser.share.ChromeShareExtras.DetailedContentType; import org.chromium.chrome.browser.share.share_sheet.ChromeOptionShareCallback; import org.chromium.chrome.browser.tab.Tab; import org.chromium.components.browser_ui.share.ShareImageFileUtils; @@ -156,10 +157,12 @@ .build(); long shareStartTime = System.currentTimeMillis(); - ChromeShareExtras extras = new ChromeShareExtras.Builder() - .setSkipPageSharingActions(true) - .setContentUrl(new GURL(mShareUrl)) - .build(); + ChromeShareExtras extras = + new ChromeShareExtras.Builder() + .setSkipPageSharingActions(true) + .setContentUrl(new GURL(mShareUrl)) + .setDetailedContentType(DetailedContentType.WEB_NOTES) + .build(); // Dismiss current dialog before showing the share sheet. this.dismiss(); @@ -227,7 +230,8 @@ long shareStartTime = System.currentTimeMillis(); ChromeShareExtras extras = new ChromeShareExtras.Builder() .setSkipPageSharingActions(true) - .setContentUrl(new GURL(mShareUrl)) + .setContentUrl(new GURL(noteUrl)) + .setDetailedContentType(DetailedContentType.WEB_NOTES) .build(); // Dismiss current dialog before showing the share sheet.
diff --git a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/dialogs/DangerousDownloadDialog.java b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/dialogs/DangerousDownloadDialog.java index 4c700a3..3ffbcb9 100644 --- a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/dialogs/DangerousDownloadDialog.java +++ b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/dialogs/DangerousDownloadDialog.java
@@ -6,9 +6,11 @@ import android.content.Context; +import androidx.annotation.IntDef; import androidx.core.content.res.ResourcesCompat; import org.chromium.base.Callback; +import org.chromium.base.metrics.RecordHistogram; import org.chromium.chrome.browser.download.R; import org.chromium.components.browser_ui.util.DownloadUtils; import org.chromium.ui.modaldialog.DialogDismissalCause; @@ -21,6 +23,24 @@ * from ModalDialogManager. */ public class DangerousDownloadDialog { + /** + * Events related to the dangerous download dialog, used for UMA reporting. + * These values are persisted to logs. Entries should not be renumbered and + * numeric values should never be reused. + */ + @IntDef({DangerousDownloadDialogEvent.DANGEROUS_DOWNLOAD_DIALOG_SHOW, + DangerousDownloadDialogEvent.DANGEROUS_DOWNLOAD_DIALOG_CONFIRM, + DangerousDownloadDialogEvent.DANGEROUS_DOWNLOAD_DIALOG_CANCEL, + DangerousDownloadDialogEvent.DANGEROUS_DOWNLOAD_DIALOG_DISMISS}) + private @interface DangerousDownloadDialogEvent { + int DANGEROUS_DOWNLOAD_DIALOG_SHOW = 0; + int DANGEROUS_DOWNLOAD_DIALOG_CONFIRM = 1; + int DANGEROUS_DOWNLOAD_DIALOG_CANCEL = 2; + int DANGEROUS_DOWNLOAD_DIALOG_DISMISS = 3; + + int COUNT = 4; + } + public DangerousDownloadDialog() {} /** @@ -47,30 +67,35 @@ new ModalDialogProperties.Controller() { @Override public void onClick(PropertyModel model, int buttonType) { + boolean isConfirm = buttonType + == ModalDialogProperties.ButtonType.POSITIVE; if (callback != null) { - callback.onResult(buttonType - == ModalDialogProperties.ButtonType.POSITIVE); + callback.onResult(isConfirm); } modalDialogManager.dismissDialog(model, - buttonType - == DialogDismissalCause - .POSITIVE_BUTTON_CLICKED - ? DialogDismissalCause - .POSITIVE_BUTTON_CLICKED - : DialogDismissalCause - .NEGATIVE_BUTTON_CLICKED); + isConfirm ? DialogDismissalCause + .POSITIVE_BUTTON_CLICKED + : DialogDismissalCause + .NEGATIVE_BUTTON_CLICKED); + recordDangerousDownloadDialogEvent(isConfirm + ? DangerousDownloadDialogEvent + .DANGEROUS_DOWNLOAD_DIALOG_CONFIRM + : DangerousDownloadDialogEvent + .DANGEROUS_DOWNLOAD_DIALOG_CANCEL); } @Override public void onDismiss(PropertyModel model, int dismissalCause) { - if (callback != null - && dismissalCause + if (dismissalCause != DialogDismissalCause .POSITIVE_BUTTON_CLICKED && dismissalCause != DialogDismissalCause .NEGATIVE_BUTTON_CLICKED) { - callback.onResult(false); + if (callback != null) callback.onResult(false); + recordDangerousDownloadDialogEvent( + DangerousDownloadDialogEvent + .DANGEROUS_DOWNLOAD_DIALOG_DISMISS); } } }) @@ -89,5 +114,17 @@ .build(); modalDialogManager.showDialog(propertyModel, ModalDialogManager.ModalDialogType.APP); + recordDangerousDownloadDialogEvent( + DangerousDownloadDialogEvent.DANGEROUS_DOWNLOAD_DIALOG_SHOW); + } + + /** + * Collects dangerous download dialog UI event metrics. + * @param event The UI event to collect. + */ + private static void recordDangerousDownloadDialogEvent( + @DangerousDownloadDialogEvent int event) { + RecordHistogram.recordEnumeratedHistogram( + "Download.DangerousDialog.Events", event, DangerousDownloadDialogEvent.COUNT); } }
diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrome/browser/download/chrome_download_manager_delegate.cc index 4bc9e01..43e39ac6 100644 --- a/chrome/browser/download/chrome_download_manager_delegate.cc +++ b/chrome/browser/download/chrome_download_manager_delegate.cc
@@ -120,7 +120,6 @@ #endif #if defined(OS_WIN) -#include "chrome/browser/service_sandbox_type.h" #include "components/services/quarantine/public/cpp/quarantine_features_win.h" #endif
diff --git a/chrome/browser/download/download_target_determiner.cc b/chrome/browser/download/download_target_determiner.cc index 1891a95..2e0bcdd 100644 --- a/chrome/browser/download/download_target_determiner.cc +++ b/chrome/browser/download/download_target_determiner.cc
@@ -28,6 +28,7 @@ #include "components/download/public/common/download_interrupt_reasons.h" #include "components/history/core/browser/history_service.h" #include "components/prefs/pref_service.h" +#include "components/safe_browsing/content/browser/download/download_stats.h" #include "components/safe_browsing/content/common/file_type_policies.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_task_traits.h" @@ -873,6 +874,10 @@ bool visited_referrer_before) { DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_EQ(STATE_DETERMINE_INTERMEDIATE_PATH, next_state_); + safe_browsing::RecordDownloadFileTypeAttributes( + safe_browsing::FileTypePolicies::GetInstance()->GetFileDangerLevel( + virtual_path_.BaseName()), + download_->HasUserGesture(), visited_referrer_before); danger_level_ = GetDangerLevel( visited_referrer_before ? VISITED_REFERRER : NO_VISITS_TO_REFERRER); if (danger_level_ != DownloadFileType::NOT_DANGEROUS &&
diff --git a/chrome/browser/enterprise/connectors/file_system/signin_confirmation_modal.cc b/chrome/browser/enterprise/connectors/file_system/signin_confirmation_modal.cc index 6770ccd..a0cc9c0 100644 --- a/chrome/browser/enterprise/connectors/file_system/signin_confirmation_modal.cc +++ b/chrome/browser/enterprise/connectors/file_system/signin_confirmation_modal.cc
@@ -7,6 +7,7 @@ #include "chrome/browser/enterprise/connectors/file_system/signin_experience.h" #include "components/constrained_window/constrained_window_views.h" #include "components/vector_icons/vector_icons.h" +#include "ui/accessibility/ax_enums.mojom.h" #include "ui/base/models/image_model.h" #include "ui/gfx/color_palette.h" #include "ui/gfx/paint_vector_icon.h" @@ -65,6 +66,17 @@ SetAcceptCallback(base::BindOnce(&FileSystemConfirmationModal::OnConfirmation, weak_factory_.GetWeakPtr())); SetButtonLabel(ui::DialogButton::DIALOG_BUTTON_OK, accept_button); + // Set the message to be shown. + std::unique_ptr<views::Label> view = std::make_unique<views::Label>(message_); + view->SetBorder( + views::CreateEmptyBorder(kMessageMarginHorizontal, kMessageMarginLeft, + kMessageMarginHorizontal, kMessageMarginRight)); + view->SetMultiLine(true); + view->SizeToFit(kModalWidth); + view->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_TO_HEAD); + SetContentsView(std::move(view)); + // For accessiblity features. This role will read title + message on pop up. + SetAccessibleRole(ax::mojom::Role::kAlertDialog); } FileSystemConfirmationModal::~FileSystemConfirmationModal() = default; @@ -80,17 +92,6 @@ gfx::kGoogleBlue500))); } -views::View* FileSystemConfirmationModal::GetContentsView() { - auto* view = new views::Label(message_); - view->SetBorder( - views::CreateEmptyBorder(kMessageMarginHorizontal, kMessageMarginLeft, - kMessageMarginHorizontal, kMessageMarginRight)); - view->SetMultiLine(true); - view->SizeToFit(kModalWidth); - view->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_TO_HEAD); - return view; -} - ui::ModalType FileSystemConfirmationModal::GetModalType() const { return ui::MODAL_TYPE_WINDOW; }
diff --git a/chrome/browser/enterprise/connectors/file_system/signin_confirmation_modal.h b/chrome/browser/enterprise/connectors/file_system/signin_confirmation_modal.h index e73b10d9..b177f85 100644 --- a/chrome/browser/enterprise/connectors/file_system/signin_confirmation_modal.h +++ b/chrome/browser/enterprise/connectors/file_system/signin_confirmation_modal.h
@@ -5,6 +5,7 @@ #ifndef CHROME_BROWSER_ENTERPRISE_CONNECTORS_FILE_SYSTEM_SIGNIN_CONFIRMATION_MODAL_H_ #define CHROME_BROWSER_ENTERPRISE_CONNECTORS_FILE_SYSTEM_SIGNIN_CONFIRMATION_MODAL_H_ +#include "ui/accessibility/ax_enums.mojom-forward.h" #include "ui/views/window/dialog_delegate.h" namespace enterprise_connectors { @@ -23,6 +24,12 @@ Callback callback, SigninExperienceTestObserver* observer = nullptr); + // WidgetDelegate: + ui::ModalType GetModalType() const override; + // Title and icon. + std::u16string GetWindowTitle() const override; + ui::ImageModel GetWindowIcon() override; + private: FileSystemConfirmationModal(const std::u16string& title, const std::u16string& message, @@ -30,20 +37,14 @@ const std::u16string& accept_button, Callback callback); - // WidgetDelegate: - ui::ModalType GetModalType() const override; - // Title and icon. - std::u16string GetWindowTitle() const override; - ui::ImageModel GetWindowIcon() override; - // Create the views::Label for the confirmation message to be displayed. - views::View* GetContentsView() override; - void OnCancellation() { std::move(callback_).Run(false); } void OnConfirmation() { std::move(callback_).Run(true); } const std::u16string title_, message_; Callback callback_; base::WeakPtrFactory<FileSystemConfirmationModal> weak_factory_{this}; + + friend class FileSystemConfirmationModalTest; }; } // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/file_system/signin_confirmation_unittest.cc b/chrome/browser/enterprise/connectors/file_system/signin_confirmation_unittest.cc new file mode 100644 index 0000000..fc22e049 --- /dev/null +++ b/chrome/browser/enterprise/connectors/file_system/signin_confirmation_unittest.cc
@@ -0,0 +1,82 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/enterprise/connectors/file_system/signin_confirmation_modal.h" + +#include "base/strings/utf_string_conversions.h" +#include "base/test/bind.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/base/models/image_model.h" +#include "ui/views/controls/label.h" +#include "ui/views/test/test_layout_provider.h" + +using testing::_; +using testing::Invoke; +using testing::Return; + +namespace enterprise_connectors { + +const std::u16string kTestTitle = base::UTF8ToUTF16(std::string("title")); +const std::u16string kTestMessage = base::UTF8ToUTF16(std::string("message")); +const std::u16string kTestCancel = base::UTF8ToUTF16(std::string("cancel")); +const std::u16string kTestAccept = base::UTF8ToUTF16(std::string("accept")); + +class FileSystemConfirmationModalTest : public testing::Test { + public: + void SetUp() override { + modal = std::unique_ptr<FileSystemConfirmationModal>( + new FileSystemConfirmationModal( + kTestTitle, kTestMessage, kTestCancel, kTestAccept, + base::BindOnce(&FileSystemConfirmationModalTest::OnUserClick, + base::Unretained(this)))); + } + + std::unique_ptr<FileSystemConfirmationModal> modal; + bool callback_ran = false; + bool callback_user_accepted = false; + + private: + void OnUserClick(bool user_accepted) { + callback_ran = true; + callback_user_accepted = user_accepted; + } + + // For GetContentsView() which needs views::layout::GetFont(). + views::test::TestLayoutProvider layout_provider; +}; + +TEST_F(FileSystemConfirmationModalTest, GetUIProperties) { + ASSERT_TRUE(modal->ShouldShowWindowTitle()); + ASSERT_TRUE(modal->ShouldShowWindowIcon()); + ASSERT_FALSE(modal->ShouldShowCloseButton()); + + ASSERT_EQ(modal->GetWindowTitle(), kTestTitle); + ASSERT_EQ(modal->GetAccessibleWindowTitle(), kTestTitle); + ASSERT_EQ(modal->GetModalType(), ui::MODAL_TYPE_WINDOW); + + auto icon = modal->GetWindowIcon(); + ASSERT_FALSE(icon.IsEmpty()); + ASSERT_TRUE(icon.IsImage()); + + views::View* message_view = modal->GetContentsView(); + ASSERT_NE(message_view, nullptr); + // Check on the message text. + views::Label* message_label = static_cast<views::Label*>(message_view); + ASSERT_EQ(message_label->GetText(), kTestMessage); +} + +TEST_F(FileSystemConfirmationModalTest, ClickAccept) { + modal->Accept(); + ASSERT_TRUE(callback_ran); + ASSERT_TRUE(callback_user_accepted); +} + +TEST_F(FileSystemConfirmationModalTest, ClickCancel) { + modal->Cancel(); + ASSERT_TRUE(callback_ran); + ASSERT_FALSE(callback_user_accepted); +} + +} // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/signals/context_info_fetcher.cc b/chrome/browser/enterprise/signals/context_info_fetcher.cc index 17ee8f9..f5e92dd 100644 --- a/chrome/browser/enterprise/signals/context_info_fetcher.cc +++ b/chrome/browser/enterprise/signals/context_info_fetcher.cc
@@ -25,6 +25,10 @@ #include "content/public/browser/site_isolation_policy.h" #include "device_management_backend.pb.h" +#if defined(OS_LINUX) +#include "net/dns/public/resolv_reader.h" +#endif + #if defined(OS_WIN) #include <netfw.h> #include <windows.h> @@ -159,6 +163,7 @@ ContextInfo ContextInfoFetcher::FetchAsyncSignals(ContextInfo info) { // Add other async signals here + info.system_dns_servers = GetDnsServers(); info.os_firewall = GetOSFirewall(); return info; } @@ -316,4 +321,28 @@ } #endif // defined(OS_LINUX) +std::vector<std::string> ContextInfoFetcher::GetDnsServers() { + std::vector<std::string> dns_addresses; +#if defined(OS_LINUX) + std::vector<net::IPEndPoint> nameservers; + std::unique_ptr<net::ResolvReader> resolv_reader = + std::make_unique<net::ResolvReader>(); + + std::unique_ptr<struct __res_state> res = resolv_reader->GetResState(); + if (res) { + if (net::GetNameservers(*res.get()).has_value()) + nameservers = net::GetNameservers(*res.get()).value(); + resolv_reader->CloseResState(res.get()); + // If any name server is 0.0.0.0, assume the configuration is invalid. + for (const net::IPEndPoint& nameserver : nameservers) { + if (nameserver.address().IsZero()) + return std::vector<std::string>(); + else + dns_addresses.push_back(nameserver.ToString()); + } + } +#endif + return dns_addresses; +} + } // namespace enterprise_signals
diff --git a/chrome/browser/enterprise/signals/context_info_fetcher.h b/chrome/browser/enterprise/signals/context_info_fetcher.h index 3850e4929..8032330b 100644 --- a/chrome/browser/enterprise/signals/context_info_fetcher.h +++ b/chrome/browser/enterprise/signals/context_info_fetcher.h
@@ -48,6 +48,7 @@ bool chrome_remote_desktop_app_blocked; absl::optional<bool> third_party_blocking_enabled; SettingValue os_firewall; + std::vector<std::string> system_dns_servers; }; // Interface used by the chrome.enterprise.reportingPrivate.getContextInfo() @@ -108,6 +109,8 @@ ContextInfo FetchAsyncSignals(ContextInfo info); + std::vector<std::string> GetDnsServers(); + content::BrowserContext* browser_context_; // |connectors_service| is used to obtain the value of each Connector policy.
diff --git a/chrome/browser/enterprise/signals/device_info_fetcher.cc b/chrome/browser/enterprise/signals/device_info_fetcher.cc index 9bf2e3a..cdeeb11 100644 --- a/chrome/browser/enterprise/signals/device_info_fetcher.cc +++ b/chrome/browser/enterprise/signals/device_info_fetcher.cc
@@ -37,6 +37,8 @@ device_info.screen_lock_secured = SettingValue::ENABLED; device_info.disk_encrypted = SettingValue::DISABLED; device_info.mac_addresses.push_back("00:00:00:00:00:00"); + device_info.windows_machine_domain = "MACHINE_DOMAIN"; + device_info.windows_user_domain = "USER_DOMAIN"; return device_info; } };
diff --git a/chrome/browser/enterprise/signals/device_info_fetcher.h b/chrome/browser/enterprise/signals/device_info_fetcher.h index af55368..0ff5c9ca 100644 --- a/chrome/browser/enterprise/signals/device_info_fetcher.h +++ b/chrome/browser/enterprise/signals/device_info_fetcher.h
@@ -10,6 +10,7 @@ #include <vector> #include "chrome/browser/enterprise/signals/signals_common.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace enterprise_signals { @@ -28,6 +29,8 @@ SettingValue disk_encrypted; std::vector<std::string> mac_addresses; + absl::optional<std::string> windows_machine_domain; + absl::optional<std::string> windows_user_domain; }; // Interface used by the chrome.enterprise.reportingPrivate.getDeviceInfo()
diff --git a/chrome/browser/enterprise/signals/device_info_fetcher_win.cc b/chrome/browser/enterprise/signals/device_info_fetcher_win.cc index 38f5bef..043f579 100644 --- a/chrome/browser/enterprise/signals/device_info_fetcher_win.cc +++ b/chrome/browser/enterprise/signals/device_info_fetcher_win.cc
@@ -4,18 +4,28 @@ #include "chrome/browser/enterprise/signals/device_info_fetcher_win.h" +#include <Windows.h> +// SECURITY_WIN32 must be defined in order to get +// EXTENDED_NAME_FORMAT enumeration. +#define SECURITY_WIN32 1 +#include <security.h> +#undef SECURITY_WIN32 +#include <wincred.h> + #include "base/files/file_path.h" #include "base/path_service.h" +#include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/system/sys_info.h" +#include "base/win/win_util.h" #include "base/win/windows_types.h" #include "base/win/wmi.h" #include "chrome/browser/enterprise/signals/signals_common.h" #include "net/base/network_interfaces.h" -#include "third_party/abseil-cpp/absl/types/optional.h" // Those headers need defines from windows_types.h, thus have to come after it. +#include <DSRole.h> // NOLINT(build/include_order) #include <iphlpapi.h> // NOLINT(build/include_order) #include <powersetting.h> // NOLINT(build/include_order) #include <propsys.h> // NOLINT(build/include_order) @@ -261,6 +271,39 @@ return mac_addresses; } +absl::optional<std::string> GetWindowsMachineDomain() { + if (!base::win::IsEnrolledToDomain()) + return absl::nullopt; + std::string domain; + ::DSROLE_PRIMARY_DOMAIN_INFO_BASIC* info = nullptr; + if (::DsRoleGetPrimaryDomainInformation(nullptr, + ::DsRolePrimaryDomainInfoBasic, + (PBYTE*)&info) == ERROR_SUCCESS) { + if (info->DomainNameFlat) + domain = base::WideToUTF8(info->DomainNameFlat); + ::DsRoleFreeMemory(info); + } + return domain.empty() ? absl::nullopt : absl::make_optional(domain); +} + +absl::optional<std::string> GetWindowsUserDomain() { + WCHAR username[CREDUI_MAX_USERNAME_LENGTH + 1] = {}; + DWORD username_length = sizeof(username); + if (!::GetUserNameExW(::NameSamCompatible, username, &username_length) || + username_length <= 0) { + return absl::nullopt; + } + // The string corresponds to DOMAIN\USERNAME. If there isn't a domain, the + // domain name is replaced by the name of the machine, so the function + // returns nothing in that case. + std::string username_str = base::WideToUTF8(username); + std::string domain = username_str.substr(0, username_str.find("\\")); + + return domain == base::ToUpperASCII(GetComputerNameW()) + ? absl::nullopt + : absl::make_optional(domain); +} + } // namespace DeviceInfoFetcherWin::DeviceInfoFetcherWin() = default; @@ -277,6 +320,9 @@ device_info.screen_lock_secured = GetScreenlockSecured(); device_info.disk_encrypted = GetDiskEncrypted(); device_info.mac_addresses = GetMacAddresses(); + device_info.windows_machine_domain = GetWindowsMachineDomain(); + device_info.windows_user_domain = GetWindowsUserDomain(); + return device_info; }
diff --git a/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api.cc b/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api.cc index 4190dc3..8c88909 100644 --- a/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api.cc +++ b/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api.cc
@@ -23,6 +23,7 @@ #include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_contents.h" #include "crypto/sha2.h" +#include "device/fido/features.h" #include "device/fido/filter.h" #include "extensions/browser/extension_api_frame_id_map.h" #include "extensions/common/error_utils.h" @@ -264,6 +265,51 @@ Respond(OneArgument(base::Value(result))); } +CryptotokenPrivateCanMakeU2fApiRequestFunction:: + CryptotokenPrivateCanMakeU2fApiRequestFunction() = default; + +ExtensionFunction::ResponseAction +CryptotokenPrivateCanMakeU2fApiRequestFunction::Run() { + auto params = + cryptotoken_private::CanMakeU2fApiRequest::Params::Create(*args_); + EXTENSION_FUNCTION_VALIDATE(params); + if (!base::FeatureList::IsEnabled(device::kU2fPermissionPrompt)) { + return RespondNow(OneArgument(base::Value(true))); + } + + content::WebContents* web_contents = nullptr; + if (!ExtensionTabUtil::GetTabById(params->options.tab_id, browser_context(), + true /* include incognito windows */, + &web_contents)) { + return RespondNow(Error("cannot find specified tab")); + } + + permissions::PermissionRequestManager* permission_request_manager = + permissions::PermissionRequestManager::FromWebContents(web_contents); + if (!permission_request_manager) { + return RespondNow(Error("no PermissionRequestManager")); + } + + const GURL origin_url(params->options.origin); + if (!origin_url.is_valid()) { + return RespondNow(Error(extensions::ErrorUtils::FormatErrorMessage( + "invalid origin", params->options.origin))); + } + + permission_request_manager->AddRequest( + web_contents->GetMainFrame(), + NewU2fApiPermissionRequest( + url::Origin::Create(origin_url), + base::BindOnce( + &CryptotokenPrivateCanMakeU2fApiRequestFunction::Complete, + this))); + return RespondLater(); +} + +void CryptotokenPrivateCanMakeU2fApiRequestFunction::Complete(bool result) { + Respond(OneArgument(base::Value(result))); +} + ExtensionFunction::ResponseAction CryptotokenPrivateRecordRegisterRequestFunction::Run() { auto params =
diff --git a/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api.h b/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api.h index eae0cfa..6cebc13 100644 --- a/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api.h +++ b/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api.h
@@ -28,7 +28,7 @@ DECLARE_EXTENSION_FUNCTION("cryptotokenPrivate.canOriginAssertAppId", CRYPTOTOKENPRIVATE_CANORIGINASSERTAPPID) protected: - ~CryptotokenPrivateCanOriginAssertAppIdFunction() override {} + ~CryptotokenPrivateCanOriginAssertAppIdFunction() override = default; ResponseAction Run() override; }; @@ -41,7 +41,8 @@ CRYPTOTOKENPRIVATE_ISAPPIDHASHINENTERPRISECONTEXT) protected: - ~CryptotokenPrivateIsAppIdHashInEnterpriseContextFunction() override {} + ~CryptotokenPrivateIsAppIdHashInEnterpriseContextFunction() override = + default; ResponseAction Run() override; }; @@ -53,7 +54,20 @@ CRYPTOTOKENPRIVATE_CANAPPIDGETATTESTATION) protected: - ~CryptotokenPrivateCanAppIdGetAttestationFunction() override {} + ~CryptotokenPrivateCanAppIdGetAttestationFunction() override = default; + ResponseAction Run() override; + void Complete(bool result); +}; + +class CryptotokenPrivateCanMakeU2fApiRequestFunction + : public ExtensionFunction { + public: + CryptotokenPrivateCanMakeU2fApiRequestFunction(); + DECLARE_EXTENSION_FUNCTION("cryptotokenPrivate.canMakeU2fApiRequest", + CRYPTOTOKENPRIVATE_CANMAKEU2FAPIREQUEST) + + protected: + ~CryptotokenPrivateCanMakeU2fApiRequestFunction() override = default; ResponseAction Run() override; void Complete(bool result); };
diff --git a/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api_unittest.cc b/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api_unittest.cc index f5da7d5..6829ac2 100644 --- a/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api_unittest.cc +++ b/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api_unittest.cc
@@ -21,6 +21,7 @@ #include "components/permissions/test/mock_permission_prompt_factory.h" #include "components/sessions/content/session_tab_helper.h" #include "crypto/sha2.h" +#include "device/fido/features.h" #include "extensions/browser/api_test_utils.h" #include "extensions/browser/extension_function_dispatcher.h" #include "testing/gtest/include/gtest/gtest.h" @@ -219,9 +220,6 @@ ~CryptoTokenPermissionTest() override = default; void SetUp() override { - feature_list_.InitWithFeatures({features::kSecurityKeyAttestationPrompt}, - {}); - ExtensionApiUnittest::SetUp(); const GURL url("http://example.com"); AddTab(browser(), url); @@ -276,15 +274,50 @@ return GetSingleBooleanResult(function.get(), out_result); } - private: + // CanMakeU2fApiRequest calls the cryptotoken private API of the same name + // for |origin| and sets |*out_result| to the result. If |bubble_action| is + // not |NONE| then it waits for the permissions prompt to be shown and + // performs the given action. Otherwise, the call is expected to be + // synchronous. + bool CanMakeU2fApiRequest( + const std::string& origin, + permissions::PermissionRequestManager::AutoResponseType bubble_action, + bool* out_result) { + if (bubble_action != permissions::PermissionRequestManager::NONE) { + prompt_factory_->set_response_type(bubble_action); + auto* web_contents = browser()->tab_strip_model()->GetWebContentsAt(0); + prompt_factory_->DocumentOnLoadCompletedInMainFrame( + web_contents->GetMainFrame()); + } + + auto function = base::MakeRefCounted< + api::CryptotokenPrivateCanMakeU2fApiRequestFunction>(); + function->set_has_callback(true); + + base::Value::DictStorage dict; + dict.emplace("appId", origin); + dict.emplace("tabId", tab_id_); + dict.emplace("origin", origin); + auto args = std::make_unique<base::Value>(base::Value::Type::LIST); + args->Append(base::Value(std::move(dict))); + auto args_list = base::ListValue::From(std::move(args)); + + extension_function_test_utils::RunFunction( + function.get(), std::move(args_list), browser(), api_test_utils::NONE); + + return GetSingleBooleanResult(function.get(), out_result); + } + base::test::ScopedFeatureList feature_list_; + + private: int tab_id_ = -1; std::unique_ptr<permissions::MockPermissionPromptFactory> prompt_factory_; DISALLOW_COPY_AND_ASSIGN(CryptoTokenPermissionTest); }; -TEST_F(CryptoTokenPermissionTest, Prompt) { +TEST_F(CryptoTokenPermissionTest, AttestationPrompt) { #if defined(OS_WIN) // TODO(crbug.com/1225335) This test is failing on WIN10_20H2. if (base::win::OSInfo::GetInstance()->version() >= @@ -311,7 +344,7 @@ } } -TEST_F(CryptoTokenPermissionTest, PolicyOverridesPrompt) { +TEST_F(CryptoTokenPermissionTest, PolicyOverridesAttestationPrompt) { const std::string example_com("https://example.com"); base::Value::ListStorage permitted_list; permitted_list.emplace_back(example_com); @@ -326,4 +359,36 @@ EXPECT_TRUE(result); } +TEST_F(CryptoTokenPermissionTest, RequestPrompt) { + const std::vector<permissions::PermissionRequestManager::AutoResponseType> + actions = { + permissions::PermissionRequestManager::ACCEPT_ALL, + permissions::PermissionRequestManager::DENY_ALL, + permissions::PermissionRequestManager::DISMISS, + }; + + for (const auto& action : actions) { + SCOPED_TRACE(action); + + bool result = false; + ASSERT_TRUE(CanMakeU2fApiRequest("https://test.com", action, &result)); + // The result should only be positive if the user accepted the permissions + // prompt. + EXPECT_EQ(action == permissions::PermissionRequestManager::ACCEPT_ALL, + result); + } +} + +TEST_F(CryptoTokenPermissionTest, FeatureFlagOverridesRequestPrompt) { + feature_list_.InitAndDisableFeature(device::kU2fPermissionPrompt); + bool result = false; + + ASSERT_TRUE(CanMakeU2fApiRequest("https://test.com", + permissions::PermissionRequestManager::NONE, + &result)); + // The result should only be positive if the user accepted the permissions + // prompt. + EXPECT_TRUE(result); +} + } // namespace extensions
diff --git a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.cc b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.cc index b18ebc1..72c32c5 100644 --- a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.cc +++ b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.cc
@@ -71,6 +71,7 @@ ? std::make_unique<bool>(signals.third_party_blocking_enabled.value()) : nullptr; info.os_firewall = ToInfoSettingValue(signals.os_firewall); + info.system_dns_servers = std::move(signals.system_dns_servers); switch (signals.realtime_url_check_mode) { case safe_browsing::REAL_TIME_CHECK_DISABLED: info.realtime_url_check_mode = extensions::api:: @@ -332,6 +333,18 @@ device_info.disk_encrypted = ToInfoSettingValue(device_signals.disk_encrypted); device_info.mac_addresses = std::move(device_signals.mac_addresses); + if (device_signals.windows_machine_domain.has_value()) { + device_info.windows_machine_domain = std::make_unique<std::string>( + device_signals.windows_machine_domain.value()); + } else { + device_info.windows_machine_domain = nullptr; + } + if (device_signals.windows_user_domain.has_value()) { + device_info.windows_user_domain = std::make_unique<std::string>( + device_signals.windows_user_domain.value()); + } else { + device_info.windows_user_domain = nullptr; + } return device_info; }
diff --git a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc index 3fb2480..9aac061 100644 --- a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc +++ b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc
@@ -214,7 +214,46 @@ constexpr char kOSName[] = "linux"; #endif -#if defined(OS_WIN) || defined(OS_MAC) || defined(OS_LINUX) +#if defined(OS_WIN) + // The added conditions for windows are related to the fact that we don't know + // if the machine running the test is managed or not + constexpr char kTest[] = R"( + chrome.test.assertEq( + 'function', + typeof chrome.enterprise.reportingPrivate.getDeviceInfo); + + chrome.enterprise.reportingPrivate.getDeviceInfo((deviceInfo) => { + chrome.test.assertNoLastError(); + let count = 8; + if(deviceInfo.windowsUserDomain){ + count++; + chrome.test.assertEq(typeof deviceInfo.windowsUserDomain, "string"); + } else { + chrome.test.assertEq(typeof deviceInfo.windowsUserDomain, "undefined"); + } + + if(deviceInfo.windowsMachineDomain){ + count++; + chrome.test.assertEq(typeof deviceInfo.windowsMachineDomain, "string"); + } else { + chrome.test.assertEq( + typeof deviceInfo.windowsMachineDomain, + "undefined"); + } + chrome.test.assertEq(count, Object.keys(deviceInfo).length); + chrome.test.assertEq('%s', deviceInfo.osName); + chrome.test.assertEq(typeof deviceInfo.osVersion, 'string'); + chrome.test.assertEq(typeof deviceInfo.deviceHostName, 'string'); + chrome.test.assertEq(typeof deviceInfo.deviceModel, 'string'); + chrome.test.assertEq(typeof deviceInfo.serialNumber, 'string'); + chrome.test.assertEq(typeof deviceInfo.screenLockSecured, 'string'); + chrome.test.assertEq(typeof deviceInfo.diskEncrypted, 'string'); + chrome.test.assertTrue(deviceInfo.macAddresses instanceof Array); + + chrome.test.notifyPass(); + });)"; + RunTest(base::StringPrintf(kTest, kOSName)); +#elif defined(OS_MAC) || defined(OS_LINUX) constexpr char kTest[] = R"( chrome.test.assertEq( 'function', @@ -232,6 +271,8 @@ chrome.test.assertEq(typeof deviceInfo.screenLockSecured, 'string'); chrome.test.assertEq(typeof deviceInfo.diskEncrypted, 'string'); chrome.test.assertTrue(deviceInfo.macAddresses instanceof Array); + chrome.test.assertEq(typeof deviceInfo.windowsMachineDomain, "undefined"); + chrome.test.assertEq(typeof deviceInfo.windowsUserDomain, "undefined"); chrome.test.notifyPass(); });)"; @@ -255,15 +296,15 @@ constexpr char kChromeCleanupEnabledType[] = "boolean"; #if BUILDFLAG(GOOGLE_CHROME_BRANDING) constexpr char kThirdPartyBlockingEnabledType[] = "boolean"; - constexpr char kCount[] = "16"; + constexpr char kCount[] = "17"; #else constexpr char kThirdPartyBlockingEnabledType[] = "undefined"; - constexpr char kCount[] = "15"; + constexpr char kCount[] = "16"; #endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) #else constexpr char kChromeCleanupEnabledType[] = "undefined"; constexpr char kThirdPartyBlockingEnabledType[] = "undefined"; - constexpr char kCount[] = "14"; + constexpr char kCount[] = "15"; #endif // defined(OS_WIN) constexpr char kTest[] = R"( @@ -291,7 +332,8 @@ chrome.test.assertEq (typeof info.chromeRemoteDesktopAppBlocked, 'boolean'); chrome.test.assertEq(typeof info.thirdPartyBlockingEnabled,'%s'); - chrome.test.assertEq(typeof info.osFirewall, 'string'); + chrome.test.assertEq(typeof info.osFirewall,'string'); + chrome.test.assertTrue(info.systemDnsServers instanceof Array); chrome.test.notifyPass(); });)";
diff --git a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_unittest.cc b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_unittest.cc index 3702a59..f2e66664 100644 --- a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_unittest.cc +++ b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_unittest.cc
@@ -313,11 +313,9 @@ std::unique_ptr<base::Value> device_info_value = RunFunctionAndReturnValue(function.get(), "[]"); ASSERT_TRUE(device_info_value.get()); - enterprise_reporting_private::DeviceInfo info; ASSERT_TRUE(enterprise_reporting_private::DeviceInfo::Populate( *device_info_value, &info)); - #if defined(OS_MAC) EXPECT_EQ("macOS", info.os_name); #elif defined(OS_WIN) @@ -340,6 +338,8 @@ info.disk_encrypted); ASSERT_EQ(1u, info.mac_addresses.size()); EXPECT_EQ("00:00:00:00:00:00", info.mac_addresses[0]); + EXPECT_EQ(*info.windows_machine_domain, "MACHINE_DOMAIN"); + EXPECT_EQ(*info.windows_user_domain, "USER_DOMAIN"); #endif } @@ -363,6 +363,8 @@ info.disk_encrypted); ASSERT_EQ(1u, info.mac_addresses.size()); EXPECT_EQ("00:00:00:00:00:00", info.mac_addresses[0]); + EXPECT_EQ(*info.windows_machine_domain, "MACHINE_DOMAIN"); + EXPECT_EQ(*info.windows_user_domain, "USER_DOMAIN"); } #endif // !defined(OS_CHROMEOS)
diff --git a/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.cc b/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.cc index 5f17e5c..0606da4d 100644 --- a/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.cc +++ b/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.cc
@@ -10,8 +10,8 @@ #include "base/files/file_path.h" #include "base/location.h" #include "build/build_config.h" -#include "chrome/browser/service_sandbox_type.h" #include "chrome/grit/generated_resources.h" +#include "chrome/services/removable_storage_writer/public/mojom/removable_storage_writer.mojom.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/service_process_host.h" #include "mojo/public/cpp/bindings/receiver.h"
diff --git a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc index 34e78ca..aec3db0 100644 --- a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc +++ b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc
@@ -166,6 +166,9 @@ const char SafeBrowsingPrivateEventRouter::kKeyEvidenceLockerFilePath[] = "evidenceLockerFilepath"; const char SafeBrowsingPrivateEventRouter::kKeyScanId[] = "scanId"; +const char SafeBrowsingPrivateEventRouter::kKeyIsFederated[] = "isFederated"; +const char SafeBrowsingPrivateEventRouter::kKeyFederatedOrigin[] = + "federatedOrigin"; // All new event names should be added to the kAllEvents array below! const char SafeBrowsingPrivateEventRouter::kKeyPasswordReuseEvent[] = @@ -180,14 +183,16 @@ "sensitiveDataEvent"; const char SafeBrowsingPrivateEventRouter::kKeyUnscannedFileEvent[] = "unscannedFileEvent"; +const char SafeBrowsingPrivateEventRouter::kKeyLoginEvent[] = "loginEvent"; // All new event names should be added to this array! -const char* SafeBrowsingPrivateEventRouter::kAllEvents[6] = { +const char* SafeBrowsingPrivateEventRouter::kAllEvents[7] = { SafeBrowsingPrivateEventRouter::kKeyPasswordReuseEvent, SafeBrowsingPrivateEventRouter::kKeyPasswordChangedEvent, SafeBrowsingPrivateEventRouter::kKeyDangerousDownloadEvent, SafeBrowsingPrivateEventRouter::kKeyInterstitialEvent, SafeBrowsingPrivateEventRouter::kKeySensitiveDataEvent, SafeBrowsingPrivateEventRouter::kKeyUnscannedFileEvent, + SafeBrowsingPrivateEventRouter::kKeyLoginEvent, }; const char SafeBrowsingPrivateEventRouter::kKeyUnscannedReason[] = @@ -736,6 +741,26 @@ std::move(event)); } +void SafeBrowsingPrivateEventRouter::OnLoginEvent( + const GURL& url, + bool is_federated, + const GURL& federated_origin) { + auto settings = GetReportingSettings(); + if (!settings.has_value() || + settings->enabled_event_names.count(kKeyLoginEvent) == 0) { + return; + } + + base::Value event(base::Value::Type::DICTIONARY); + event.SetStringKey(kKeyUrl, url.spec()); + event.SetBoolKey(kKeyIsFederated, is_federated); + event.SetStringKey(kKeyFederatedOrigin, federated_origin.spec()); + event.SetStringKey(kKeyProfileUserName, GetProfileUserName()); + + ReportRealtimeEvent(kKeyLoginEvent, std::move(settings.value()), + std::move(event)); +} + // static bool SafeBrowsingPrivateEventRouter::ShouldInitRealtimeReportingClient() { if (!base::FeatureList::IsEnabled(kRealtimeReportingFeature) &&
diff --git a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h index 2939379..6b6f648 100644 --- a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h +++ b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h
@@ -86,6 +86,8 @@ static const char kKeyMalwareCategory[]; static const char kKeyEvidenceLockerFilePath[]; static const char kKeyScanId[]; + static const char kKeyIsFederated[]; + static const char kKeyFederatedOrigin[]; static const char kKeyPasswordReuseEvent[]; static const char kKeyPasswordChangedEvent[]; @@ -93,7 +95,8 @@ static const char kKeyInterstitialEvent[]; static const char kKeySensitiveDataEvent[]; static const char kKeyUnscannedFileEvent[]; - static const char* kAllEvents[6]; + static const char kKeyLoginEvent[]; + static const char* kAllEvents[7]; static const char kKeyUnscannedReason[]; @@ -215,6 +218,10 @@ const std::string& scan_id, const int64_t content_size); + void OnLoginEvent(const GURL& url, + bool is_federated, + const GURL& federated_origin); + // Returns true if enterprise real-time reporting should be initialized, // checking both the feature flag. This function is public so that it can // called in tests.
diff --git a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc index 98ea93aa..94f95397 100644 --- a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc +++ b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc
@@ -207,6 +207,15 @@ "filePasswordProtected", 12345, result); } + void TriggerOnLoginEvent( + const GURL& url, + absl::optional<GURL> federated_origin = absl::nullopt) { + SafeBrowsingPrivateEventRouterFactory::GetForProfile(profile_) + ->OnLoginEvent( + url, federated_origin.has_value(), + federated_origin.has_value() ? federated_origin.value() : GURL()); + } + void SetReportingPolicy(bool enabled, bool authorized = true, const std::set<std::string>& enabled_event_names = @@ -720,6 +729,42 @@ EXPECT_EQ(base::Value::Type::NONE, report.type()); } +TEST_F(SafeBrowsingPrivateEventRouterTest, TestOnLoginEvent) { + SetUpRouters(); + + signin::IdentityTestEnvironment identity_test_environment; + SafeBrowsingPrivateEventRouterFactory::GetForProfile(profile_) + ->SetIdentityManagerForTesting( + identity_test_environment.identity_manager()); + identity_test_environment.MakePrimaryAccountAvailable( + profile_->GetProfileUserName(), signin::ConsentLevel::kSignin); + + safe_browsing::EventReportValidator validator(client_.get()); + validator.ExpectLoginEvent("https://www.example.com/", false, "", + profile_->GetProfileUserName()); + + TriggerOnLoginEvent(GURL("https://www.example.com/")); +} + +TEST_F(SafeBrowsingPrivateEventRouterTest, TestOnLoginEventFederated) { + SetUpRouters(); + + signin::IdentityTestEnvironment identity_test_environment; + SafeBrowsingPrivateEventRouterFactory::GetForProfile(profile_) + ->SetIdentityManagerForTesting( + identity_test_environment.identity_manager()); + identity_test_environment.MakePrimaryAccountAvailable( + profile_->GetProfileUserName(), signin::ConsentLevel::kSignin); + + safe_browsing::EventReportValidator validator(client_.get()); + validator.ExpectLoginEvent("https://www.example.com/", true, + "https://www.google.com/", + profile_->GetProfileUserName()); + + TriggerOnLoginEvent(GURL("https://www.example.com/"), + GURL("https://www.google.com/")); +} + TEST_F(SafeBrowsingPrivateEventRouterTest, TestOnSensitiveDataEvent_Allowed) { SetUpRouters(/*authorized=*/true);
diff --git a/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc b/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc index 94bb67c..baa3f00 100644 --- a/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc +++ b/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc
@@ -84,7 +84,8 @@ // Tests API behaviors, including info queries, and constraints violations. IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, ApiTests) { AddExtensionToCommandLineAllowlist(); - ASSERT_TRUE(RunExtensionTest("tab_capture", {.page_url = "api_tests.html"})) + ASSERT_TRUE( + RunExtensionTest("tab_capture/api_tests", {.page_url = "api_tests.html"})) << message_; } @@ -102,7 +103,7 @@ // and color values can be off by a lot. That said, color accuracy is being // tested by a suite of content_browsertests. ASSERT_TRUE(RunExtensionTest( - "tab_capture", + "tab_capture/end_to_end", {.page_url = "end_to_end.html?method=local&colorDeviation=50"})) << message_; } @@ -121,7 +122,7 @@ // See note in EndToEndWithoutRemoting test about why |colorDeviation| is // being set so high. ASSERT_TRUE(RunExtensionTest( - "tab_capture", + "tab_capture/end_to_end", {.page_url = "end_to_end.html?method=webrtc&colorDeviation=50"})) << message_; } @@ -130,8 +131,8 @@ IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, GetUserMediaTest) { ExtensionTestMessageListener listener("ready", true); - ASSERT_TRUE( - RunExtensionTest("tab_capture", {.page_url = "get_user_media_test.html"})) + ASSERT_TRUE(RunExtensionTest("tab_capture/get_user_media_test", + {.page_url = "get_user_media_test.html"})) << message_; EXPECT_TRUE(listener.WaitUntilSatisfied()); @@ -160,7 +161,7 @@ ExtensionTestMessageListener before_open_new_tab("ready3", true); ExtensionTestMessageListener before_allowlist_extension("ready4", true); - ASSERT_TRUE(RunExtensionTest("tab_capture", + ASSERT_TRUE(RunExtensionTest("tab_capture/active_tab_permission_test", {.page_url = "active_tab_permission_test.html"})) << message_; @@ -207,8 +208,8 @@ ExtensionTestMessageListener capture_started("tab_capture_started", false); ExtensionTestMessageListener entered_fullscreen("entered_fullscreen", false); - ASSERT_TRUE( - RunExtensionTest("tab_capture", {.page_url = "fullscreen_test.html"})) + ASSERT_TRUE(RunExtensionTest("tab_capture/fullscreen_test", + {.page_url = "fullscreen_test.html"})) << message_; EXPECT_TRUE(capture_started.WaitUntilSatisfied()); @@ -235,7 +236,7 @@ #endif IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, MAYBE_GrantForChromePages) { ExtensionTestMessageListener before_open_tab("ready1", true); - ASSERT_TRUE(RunExtensionTest("tab_capture", + ASSERT_TRUE(RunExtensionTest("tab_capture/active_tab_chrome_pages", {.page_url = "active_tab_chrome_pages.html"})) << message_; EXPECT_TRUE(before_open_tab.WaitUntilSatisfied()); @@ -261,7 +262,7 @@ IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, CaptureInSplitIncognitoMode) { AddExtensionToCommandLineAllowlist(); ASSERT_TRUE(RunExtensionTest( - "tab_capture", + "tab_capture/start_tab_capture", {.page_url = "start_tab_capture.html", .open_in_incognito = true}, {.allow_in_incognito = true})) << message_; @@ -271,7 +272,8 @@ // do not. IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, Constraints) { AddExtensionToCommandLineAllowlist(); - ASSERT_TRUE(RunExtensionTest("tab_capture", {.page_url = "constraints.html"})) + ASSERT_TRUE(RunExtensionTest("tab_capture/constraints", + {.page_url = "constraints.html"})) << message_; } @@ -313,8 +315,8 @@ // Run an extension test that just turns on tab capture, which should cause // the indicator to turn on. AddExtensionToCommandLineAllowlist(); - ASSERT_TRUE( - RunExtensionTest("tab_capture", {.page_url = "start_tab_capture.html"})) + ASSERT_TRUE(RunExtensionTest("tab_capture/start_tab_capture", + {.page_url = "start_tab_capture.html"})) << message_; // Run the browser until the indicator turns on.
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 1dbeaed..0b64b20e6 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -344,8 +344,8 @@ }, { "name": "autofill-enable-offer-notification", - "owners": [ "siyua", "manasverma@google.com" ], - "expiry_milestone": 95 + "owners": [ "siyua", "jsaul@google.com" ], + "expiry_milestone": 97 }, { "name": "autofill-enable-offer-notification-cross-tab-tracking", @@ -1417,8 +1417,8 @@ }, { "name": "enable-autofill-credit-card-authentication", - "owners": [ "jsaul@google.com", "manasverma@google.com" ], - "expiry_milestone": 94 + "owners": [ "jsaul@google.com", "siyua" ], + "expiry_milestone": 97 }, { "name": "enable-autofill-credit-card-upload", @@ -2977,6 +2977,11 @@ "expiry_milestone": 100 }, { + "name": "extensions-menu-access-control", + "owners": [ "emiliapaz" ], + "expiry_milestone": 100 + }, + { "name": "extensions-on-chrome-urls", "owners": [ "//extensions/OWNERS" ], // This enables the use of extensions on chrome:// URLs. This is useful for @@ -4142,11 +4147,6 @@ "expiry_milestone": 97 }, { - "name": "omnibox-pedals-batch2", - "owners": [ "orinj", "chrome-omnibox-team@google.com" ], - "expiry_milestone": 95 - }, - { "name": "omnibox-pedals-batch2-nonenglish", "owners": [ "orinj", "chrome-omnibox-team@google.com" ], "expiry_milestone": 97 @@ -4157,11 +4157,6 @@ "expiry_milestone": 98 }, { - "name": "omnibox-pedals-default-icon-colored", - "owners": [ "orinj", "chrome-omnibox-team@google.com" ], - "expiry_milestone": 95 - }, - { "name": "omnibox-pedals-translation-console", "owners": [ "orinj", "chrome-omnibox-team@google.com" ], "expiry_milestone": 98 @@ -5048,7 +5043,7 @@ }, { "name": "shimless-rma-flow", - "owners": [ "joonbug", "cros-peripherals@google.com" ], + "owners": [ "zentaro", "cros-peripherals@google.com" ], "expiry_milestone": 98 }, {
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index f831a68..c37e875b 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -1231,6 +1231,12 @@ const char kExtensionContentVerificationEnforceStrict[] = "Enforce strict (hard fail if we can't get hashes)"; +const char kExtensionsMenuAccessControlName[] = + "Extensions Menu Access Control"; +const char kExtensionsMenuAccessControlDescription[] = + "Enables a redesigned extensions menu that allows the user to control " + "extensions site access."; + const char kExtensionsOnChromeUrlsName[] = "Extensions on chrome:// URLs"; const char kExtensionsOnChromeUrlsDescription[] = "Enables running extensions on chrome:// URLs, where extensions explicitly " @@ -3666,10 +3672,6 @@ "Enables various experimental features related to keyword mode, its " "suggestions and layout."; -const char kOmniboxPedalsBatch2Name[] = "Omnibox Pedals batch 2"; -const char kOmniboxPedalsBatch2Description[] = - "Enable the second batch of Omnibox Pedals (Safety Check, etc.)."; - const char kOmniboxPedalsBatch2NonEnglishName[] = "Omnibox Pedals batch 2 for non-English locales"; const char kOmniboxPedalsBatch2NonEnglishDescription[] = @@ -3681,12 +3683,6 @@ const char kOmniboxPedalsBatch3Description[] = "Enable the third batch of Omnibox Pedals."; -const char kOmniboxPedalsDefaultIconColoredName[] = - "Omnibox Pedals Default Icon Colored"; -const char kOmniboxPedalsDefaultIconColoredDescription[] = - "Enable a color version of the default icon shown on the button for most " - "omnibox Pedals (aka Chrome Actions)."; - const char kOmniboxPedalsTranslationConsoleName[] = "Omnibox Pedals Translation Console"; const char kOmniboxPedalsTranslationConsoleDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 72d7c51..2734a6c2 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -706,6 +706,9 @@ extern const char kExtensionContentVerificationEnforce[]; extern const char kExtensionContentVerificationEnforceStrict[]; +extern const char kExtensionsMenuAccessControlName[]; +extern const char kExtensionsMenuAccessControlDescription[]; + extern const char kExtensionsOnChromeUrlsName[]; extern const char kExtensionsOnChromeUrlsDescription[]; @@ -2095,18 +2098,12 @@ extern const char kOmniboxExperimentalKeywordModeName[]; extern const char kOmniboxExperimentalKeywordModeDescription[]; -extern const char kOmniboxPedalsBatch2Name[]; -extern const char kOmniboxPedalsBatch2Description[]; - extern const char kOmniboxPedalsBatch2NonEnglishName[]; extern const char kOmniboxPedalsBatch2NonEnglishDescription[]; extern const char kOmniboxPedalsBatch3Name[]; extern const char kOmniboxPedalsBatch3Description[]; -extern const char kOmniboxPedalsDefaultIconColoredName[]; -extern const char kOmniboxPedalsDefaultIconColoredDescription[]; - extern const char kOmniboxPedalsTranslationConsoleName[]; extern const char kOmniboxPedalsTranslationConsoleDescription[];
diff --git a/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc b/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc index 4ee0be0f..84d6971 100644 --- a/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc +++ b/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc
@@ -4,25 +4,16 @@ #include <string> -#include "base/path_service.h" #include "base/strings/stringprintf.h" -#include "base/strings/utf_string_conversions.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" -#include "chrome/browser/apps/platform_apps/app_browsertest_util.h" #include "chrome/browser/media/webrtc/webrtc_browsertest_base.h" -#include "chrome/browser/ui/browser_tabstrip.h" -#include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" -#include "chrome/common/pref_names.h" -#include "chrome/test/base/ui_test_utils.h" -#include "components/prefs/pref_service.h" #include "content/public/browser/web_contents.h" #include "content/public/common/content_switches.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" #include "media/base/media_switches.h" -#include "net/base/filename_util.h" #include "third_party/blink/public/common/features.h" #if defined(OS_MAC) @@ -37,8 +28,6 @@ namespace { static const char kMainHtmlPage[] = "/webrtc/webrtc_getdisplaymedia_test.html"; -static const char kMainHtmlFileName[] = "webrtc_getdisplaymedia_test.html"; -static const char kSameOriginRenamedTitle[] = "Renamed Same Origin Tab"; enum class GetDisplayMediaVariant : int { kStandard = 0, @@ -59,46 +48,6 @@ const char* display_surface; }; -constexpr char kAppWindowTitle[] = "AppWindow Display Capture Test"; - -void RunGetDisplayMedia(content::WebContents* tab, - const std::string& constraints, - bool is_fake_ui, - bool expect_success) { - std::string result; - EXPECT_TRUE(content::ExecuteScriptAndExtractString( - tab->GetMainFrame(), - base::StringPrintf("runGetDisplayMedia(%s, \"top-level-document\");", - constraints.c_str()), - &result)); - -#if defined(OS_MAC) - // Starting from macOS 10.15, screen capture requires system permissions - // that are disabled by default. The permission is reported as granted - // if the fake UI is used. - expect_success = base::mac::IsAtMostOS10_14() || is_fake_ui; -#endif - - EXPECT_EQ(result, expect_success ? "capture-success" : "capture-failure"); -} - -void UpdateWebContentsTitle(content::WebContents* contents, - const std::u16string& title) { - content::NavigationEntry* entry = - contents->GetController().GetLastCommittedEntry(); - ASSERT_TRUE(entry); - contents->UpdateTitleForEntry(entry, title); -} - -GURL GetFileURL(const char* filename) { - base::ScopedAllowBlockingForTesting allow_blocking; - base::FilePath path; - base::PathService::Get(chrome::DIR_TEST_DATA, &path); - path = path.AppendASCII("webrtc").AppendASCII(filename); - CHECK(base::PathExists(path)); - return net::FilePathToFileURL(path); -} - } // namespace // Base class for top level tests for getDisplayMedia(). @@ -110,6 +59,29 @@ DetectErrorsInJavaScript(); } + void RunGetDisplayMedia(content::WebContents* tab, + const std::string& constraints, + bool is_fake_ui, + bool expect_success) { + std::string result; + EXPECT_TRUE(content::ExecuteScriptAndExtractString( + tab->GetMainFrame(), + base::StringPrintf("runGetDisplayMedia(%s, \"top-level-document\");", + constraints.c_str()), + &result)); + +#if defined(OS_MAC) + // Starting from macOS 10.15, screen capture requires system permissions + // that are disabled by default. The permission is reported as granted + // if the fake UI is used. + EXPECT_EQ(result, base::mac::IsAtMostOS10_14() || is_fake_ui + ? "capture-success" + : "capture-failure"); +#else + EXPECT_EQ(result, expect_success ? "capture-success" : "capture-failure"); +#endif + } + virtual bool PreferCurrentTab() const = 0; std::string GetConstraints(bool video, bool audio) const { @@ -344,7 +316,7 @@ TestConfigForFakeUI{/*should_prefer_current_tab_=*/true, /*display_surface=*/"browser"})); -// TODO(https://crbug.com/1215089): Enable this test suite on Lacros. +// TODO(crbug.com/1215089): Enable this test suite on Lacros. #if !BUILDFLAG(IS_CHROMEOS_LACROS) class WebRtcScreenCapturePermissionPolicyBrowserTest : public WebRtcScreenCaptureBrowserTest, @@ -406,181 +378,3 @@ : "embedded-capture-failure"); } #endif - -// Test class used to test WebRTC with App Windows. Unfortunately, due to -// creating a diamond pattern of inheritance, we can only inherit from one of -// the PlatformAppBrowserTest and WebRtcBrowserTestBase (or it's children). -// We need a lot more heavy lifting on creating the AppWindow than we would get -// from WebRtcBrowserTestBase; so we inherit from PlatformAppBrowserTest to -// minimize the code duplication. -class WebRtcAppWindowCaptureBrowserTestWithPicker - : public extensions::PlatformAppBrowserTest { - public: - WebRtcAppWindowCaptureBrowserTestWithPicker() = default; - - void SetUpCommandLine(base::CommandLine* command_line) override { - PlatformAppBrowserTest::SetUpCommandLine(command_line); - command_line->AppendSwitch( - switches::kEnableExperimentalWebPlatformFeatures); - command_line->AppendSwitchASCII( - switches::kAutoSelectTabCaptureSourceByTitle, kAppWindowTitle); - } - - void SetUpOnMainThread() override { - extensions::PlatformAppBrowserTest::SetUpOnMainThread(); - ASSERT_TRUE(StartEmbeddedTestServer()); - - // We will restrict all pages to "Tab Capture" only. This should force App - // Windows to show up in the tabs list, and thus make it selectable. - base::Value matchlist(base::Value::Type::LIST); - matchlist.Append("*"); - browser()->profile()->GetPrefs()->Set(prefs::kTabCaptureAllowedByOrigins, - matchlist); - } - - void TearDownOnMainThread() override { - extensions::PlatformAppBrowserTest::TearDownOnMainThread(); - browser()->profile()->GetPrefs()->Set(prefs::kTabCaptureAllowedByOrigins, - base::Value(base::Value::Type::LIST)); - } - - extensions::AppWindow* CreateAppWindowWithTitle(const std::u16string& title) { - extensions::AppWindow* app_window = CreateTestAppWindow("{}"); - EXPECT_TRUE(app_window); - UpdateWebContentsTitle(app_window->web_contents(), title); - - return app_window; - } - - // This is mostly lifted from WebRtcBrowserTestBase, with the exception that - // because we know we're setting the auto-accept switches, we don't need to - // set the PermissionsManager auto accept. - content::WebContents* OpenTestPageInNewTab(const std::string& test_url) { - chrome::AddTabAt(browser(), GURL(url::kAboutBlankURL), -1, true); - GURL url = embedded_test_server()->GetURL(test_url); - ui_test_utils::NavigateToURL(browser(), url); - return browser()->tab_strip_model()->GetActiveWebContents(); - } -}; - -IN_PROC_BROWSER_TEST_F(WebRtcAppWindowCaptureBrowserTestWithPicker, - CaptureAppWindow) { - extensions::AppWindow* app_window = - CreateAppWindowWithTitle(base::UTF8ToUTF16(std::string(kAppWindowTitle))); - content::WebContents* capturing_tab = OpenTestPageInNewTab(kMainHtmlPage); - - RunGetDisplayMedia(capturing_tab, "{video: true}", /*is_fake_ui=*/false, - /*expect_success=*/true); - CloseAppWindow(app_window); -} - -// Base class for running tests with a SameOrigin policy applied. -class WebRtcSameOriginPolicyBrowserTest - : public WebRtcScreenCaptureBrowserTest { - public: - ~WebRtcSameOriginPolicyBrowserTest() override = default; - - bool PreferCurrentTab() const override { return false; } - - void SetUpCommandLine(base::CommandLine* command_line) override { - WebRtcScreenCaptureBrowserTest::SetUpCommandLine(command_line); - command_line->AppendSwitch( - switches::kEnableExperimentalWebPlatformFeatures); - command_line->AppendSwitchASCII( - switches::kAutoSelectTabCaptureSourceByTitle, kSameOriginRenamedTitle); - } - - void SetUpOnMainThread() override { - WebRtcScreenCaptureBrowserTest::SetUpOnMainThread(); - ASSERT_TRUE(embedded_test_server()->Start()); - - // Restrict all origins to SameOrigin tab capture only. - base::Value matchlist(base::Value::Type::LIST); - matchlist.Append("*"); - browser()->profile()->GetPrefs()->Set( - prefs::kSameOriginTabCaptureAllowedByOrigins, matchlist); - } - - void TearDownOnMainThread() override { - WebRtcScreenCaptureBrowserTest::TearDownOnMainThread(); - browser()->profile()->GetPrefs()->Set( - prefs::kSameOriginTabCaptureAllowedByOrigins, - base::Value(base::Value::Type::LIST)); - } -}; - -IN_PROC_BROWSER_TEST_F(WebRtcSameOriginPolicyBrowserTest, - TerminateOnNavigationAwayFromSameOrigin) { - // Open two pages, one to be captured, and one to do the capturing. Note that - // we open the capturing page second so that is focused to allow the - // getDisplayMedia request to succeed. - content::WebContents* target_tab = OpenTestPageInNewTab(kMainHtmlPage); - content::WebContents* capturing_tab = OpenTestPageInNewTab(kMainHtmlPage); - - // Update the target tab to a unique title, so that we can ensure that it is - // the one that gets captured via the autoselection. - UpdateWebContentsTitle( - target_tab, base::UTF8ToUTF16(std::string(kSameOriginRenamedTitle))); - RunGetDisplayMedia(capturing_tab, - GetConstraints(/*video=*/true, /*audio=*/true), - /*is_fake_ui=*/true, /*expect_success=*/true); - - // Though the target tab should've been focused as a result of starting the - // capture, we don't want to take a dependency on that behavior. Ensure that - // the target tab is focused, so that we can navigate it easily. If it is - // already focused, this will just no-op. - int target_index = - browser()->tab_strip_model()->GetIndexOfWebContents(target_tab); - browser()->tab_strip_model()->ActivateTabAt( - target_index, {TabStripModel::GestureType::kOther}); - ASSERT_EQ(target_tab, browser()->tab_strip_model()->GetActiveWebContents()); - - // We navigate to a FileURL so that the origin will change, which should - // trigger the capture to end. - ui_test_utils::NavigateToURL(browser(), GetFileURL(kMainHtmlFileName)); - - // Verify that the video stream has ended. - std::string result; - EXPECT_TRUE(content::ExecuteScriptAndExtractString( - capturing_tab->GetMainFrame(), "waitVideoEnded();", &result)); - EXPECT_EQ(result, "ended"); -} - -IN_PROC_BROWSER_TEST_F(WebRtcSameOriginPolicyBrowserTest, - ContinueCapturingForSameOriginNavigation) { - // Open two pages, one to be captured, and one to do the capturing. Note that - // we open the capturing page second so that is focused to allow the - // getDisplayMedia request to succeed. - content::WebContents* target_tab = OpenTestPageInNewTab(kMainHtmlPage); - content::WebContents* capturing_tab = OpenTestPageInNewTab(kMainHtmlPage); - - // Update the target tab to a unique title, so that we can ensure that it is - // the one that gets captured via the autoselection. - UpdateWebContentsTitle( - target_tab, base::UTF8ToUTF16(std::string(kSameOriginRenamedTitle))); - RunGetDisplayMedia(capturing_tab, - GetConstraints(/*video=*/true, /*audio=*/true), - /*is_fake_ui=*/true, /*expect_success=*/true); - - // Though the target tab should've been focused as a result of starting the - // capture, we don't want to take a dependency on that behavior. Ensure that - // the target tab is focused, so that we can navigate it easily. If it is - // already focused, this will just no-op. - int target_index = - browser()->tab_strip_model()->GetIndexOfWebContents(target_tab); - browser()->tab_strip_model()->ActivateTabAt( - target_index, {TabStripModel::GestureType::kOther}); - ASSERT_EQ(target_tab, browser()->tab_strip_model()->GetActiveWebContents()); - - // We navigate using the test server so that the origin doesn't change. - ui_test_utils::NavigateToURL( - browser(), - embedded_test_server()->GetURL("/webrtc/captured_page_main.html")); - - // Verify that the video hasn't been ended. - std::string result; - EXPECT_TRUE(content::ExecuteScriptAndExtractString( - capturing_tab->GetMainFrame(), "returnToTest(video_track.readyState);", - &result)); - EXPECT_EQ(result, "live"); -}
diff --git a/chrome/browser/password_check/android/internal/java/strings/translations/android_password_check_strings_mr.xtb b/chrome/browser/password_check/android/internal/java/strings/translations/android_password_check_strings_mr.xtb index 2625c9f..57953f32 100644 --- a/chrome/browser/password_check/android/internal/java/strings/translations/android_password_check_strings_mr.xtb +++ b/chrome/browser/password_check/android/internal/java/strings/translations/android_password_check_strings_mr.xtb
@@ -24,7 +24,7 @@ <translation id="7693089333295158718">Chrome तुमचे पासवर्ड तपासू शकत नाही. पुन्हा प्रयत्न करा.</translation> <translation id="7744192722284567281">डेटा भंग करत असल्याचे आढळले</translation> <translation id="808894953321890993">पासवर्ड बदला</translation> -<translation id="8399282673057829204">पासवर्ड पाहा</translation> +<translation id="8399282673057829204">पासवर्ड पहा</translation> <translation id="8603820497269504141">तुम्ही तुमचे Google खाते वापरून साइन इन करता तेव्हा, Chrome तुमचे पासवर्ड तपासू शकते.</translation> <translation id="8798925345090498040">Chrome ला सर्व पासवर्ड तपासता आले नाहीत. उद्या पुन्हा प्रयत्न करा.</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/permissions/attestation_permission_request.cc b/chrome/browser/permissions/attestation_permission_request.cc index c4120f2b..d3be74b 100644 --- a/chrome/browser/permissions/attestation_permission_request.cc +++ b/chrome/browser/permissions/attestation_permission_request.cc
@@ -12,7 +12,7 @@ #include "ui/base/l10n/l10n_util.h" #include "url/origin.h" -// AttestationPermissionRequest is a delegate class that provides information +// U2fApiPermissionRequest is a delegate class that provides information // and callbacks to the PermissionRequestManager. // // PermissionRequestManager has a reference to this object and so this object @@ -20,21 +20,21 @@ // PermissionRequestManager guarantees that `PermissionRequest::RequestFinished` // will always, eventually, be called. This object uses that fact to delete // itself during `DeleteRequest` and thus owns itself. -class AttestationPermissionRequest : public permissions::PermissionRequest { +class U2fApiPermissionRequest : public permissions::PermissionRequest { public: - AttestationPermissionRequest(const url::Origin& requesting_origin, - base::OnceCallback<void(bool)> callback) + U2fApiPermissionRequest(permissions::RequestType type, + const url::Origin& requesting_origin, + base::OnceCallback<void(bool)> callback) : PermissionRequest( requesting_origin.GetURL(), - permissions::RequestType::kSecurityAttestation, + type, /*has_gesture=*/false, - base::BindOnce(&AttestationPermissionRequest::PermissionDecided, + base::BindOnce(&U2fApiPermissionRequest::PermissionDecided, base::Unretained(this)), - base::BindOnce(&AttestationPermissionRequest::DeleteRequest, + base::BindOnce(&U2fApiPermissionRequest::DeleteRequest, base::Unretained(this))), callback_(std::move(callback)) {} - - ~AttestationPermissionRequest() override = default; + ~U2fApiPermissionRequest() override = default; void PermissionDecided(ContentSetting result, bool is_one_time) { DCHECK(!is_one_time); @@ -51,12 +51,19 @@ private: base::OnceCallback<void(bool)> callback_; - - DISALLOW_COPY_AND_ASSIGN(AttestationPermissionRequest); }; permissions::PermissionRequest* NewAttestationPermissionRequest( const url::Origin& origin, base::OnceCallback<void(bool)> callback) { - return new AttestationPermissionRequest(origin, std::move(callback)); + return new U2fApiPermissionRequest( + permissions::RequestType::kSecurityAttestation, origin, + std::move(callback)); +} + +permissions::PermissionRequest* NewU2fApiPermissionRequest( + const url::Origin& origin, + base::OnceCallback<void(bool)> callback) { + return new U2fApiPermissionRequest(permissions::RequestType::kU2fApiRequest, + origin, std::move(callback)); }
diff --git a/chrome/browser/permissions/attestation_permission_request.h b/chrome/browser/permissions/attestation_permission_request.h index 9254be5..369e5a7 100644 --- a/chrome/browser/permissions/attestation_permission_request.h +++ b/chrome/browser/permissions/attestation_permission_request.h
@@ -18,11 +18,19 @@ // Returns a |permissions::PermissionRequest| that asks the user to consent to // sending identifying information about their security key. The |origin| // argument is used to identify the origin that is requesting the permission, -// and only the authority part of the URL is used. The caller takes ownership of -// the returned object because the standard pattern for PermissionRequests is -// that they delete themselves once complete. +// and only the authority part of the URL is used. The caller doesn't take +// ownership of the returned object because the standard pattern for +// PermissionRequests is that they delete themselves once complete. permissions::PermissionRequest* NewAttestationPermissionRequest( const url::Origin& origin, base::OnceCallback<void(bool)> callback); +// Returns a |permissions::PermissionRequest| that asks the user to consent to +// |origin| making a U2F API request. The caller doesn't take ownership of the +// returned object because the standard pattern for PermissionRequests is that +// they delete themselves once complete. +permissions::PermissionRequest* NewU2fApiPermissionRequest( + const url::Origin& origin, + base::OnceCallback<void(bool)> callback); + #endif // CHROME_BROWSER_PERMISSIONS_ATTESTATION_PERMISSION_REQUEST_H_
diff --git a/chrome/browser/policy/messaging_layer/public/report_client.cc b/chrome/browser/policy/messaging_layer/public/report_client.cc index dbf12a6..0a8a818 100644 --- a/chrome/browser/policy/messaging_layer/public/report_client.cc +++ b/chrome/browser/policy/messaging_layer/public/report_client.cc
@@ -55,15 +55,15 @@ } // namespace ReportingClient::AsyncStartUploaderRequest::AsyncStartUploaderRequest( - bool need_encryption_key, + UploaderInterface::UploadReason reason, UploaderInterface::UploaderInterfaceResultCb start_uploader_cb) - : need_encryption_key_(need_encryption_key), - start_uploader_cb_(std::move(start_uploader_cb)) {} + : reason_(reason), start_uploader_cb_(std::move(start_uploader_cb)) {} ReportingClient::AsyncStartUploaderRequest::~AsyncStartUploaderRequest() = default; -bool ReportingClient::AsyncStartUploaderRequest::need_encryption_key() const { - return need_encryption_key_; +UploaderInterface::UploadReason +ReportingClient::AsyncStartUploaderRequest::reason() const { + return reason_; } UploaderInterface::UploaderInterfaceResultCb& ReportingClient::AsyncStartUploaderRequest::start_uploader_cb() { @@ -392,40 +392,37 @@ // static void ReportingClient::AsyncStartUploader( - bool need_encryption_key, + UploaderInterface::UploadReason reason, UploaderInterface::UploaderInterfaceResultCb start_uploader_cb) { ReportingClient* const instance = static_cast<ReportingClient*>(GetInstance()); - instance->DeliverAsyncStartUploader(need_encryption_key, - std::move(start_uploader_cb)); + instance->DeliverAsyncStartUploader(reason, std::move(start_uploader_cb)); } void ReportingClient::DeliverAsyncStartUploader( - bool need_encryption_key, + UploaderInterface::UploadReason reason, UploaderInterface::UploaderInterfaceResultCb start_uploader_cb) { uploaders_queue_task_runner_->PostTask( FROM_HERE, base::BindOnce( - [](bool need_encryption_key, + [](UploaderInterface::UploadReason reason, UploaderInterface::UploaderInterfaceResultCb start_uploader_cb, ReportingClient* instance) { DCHECK_CALLED_ON_VALID_SEQUENCE( instance->uploaders_queue_sequence_checker_); if (instance->upload_client_) { auto uploader = Uploader::Create( - need_encryption_key, - base::BindOnce( - &UploadClient::EnqueueUpload, - base::Unretained(instance->upload_client_.get()))); + reason, base::BindOnce(&UploadClient::EnqueueUpload, + base::Unretained( + instance->upload_client_.get()))); std::move(start_uploader_cb).Run(std::move(uploader)); return; } // Not set yet. Enqueue it. instance->async_start_uploaders_queue_.emplace( - need_encryption_key, std::move(start_uploader_cb)); + reason, std::move(start_uploader_cb)); }, - need_encryption_key, std::move(start_uploader_cb), - base::Unretained(this))); + reason, std::move(start_uploader_cb), base::Unretained(this))); } void ReportingClient::FlushAsyncStartUploaderQueue() { @@ -434,7 +431,7 @@ while (!async_start_uploaders_queue_.empty()) { auto& request = async_start_uploaders_queue_.front(); auto uploader = Uploader::Create( - request.need_encryption_key(), + request.reason(), base::BindOnce(&UploadClient::EnqueueUpload, base::Unretained(upload_client_.get()))); std::move(request.start_uploader_cb()).Run(std::move(uploader));
diff --git a/chrome/browser/policy/messaging_layer/public/report_client.h b/chrome/browser/policy/messaging_layer/public/report_client.h index 2849a4c1..eec4d06 100644 --- a/chrome/browser/policy/messaging_layer/public/report_client.h +++ b/chrome/browser/policy/messaging_layer/public/report_client.h
@@ -118,18 +118,18 @@ class AsyncStartUploaderRequest { public: AsyncStartUploaderRequest( - bool need_encryption_key, + UploaderInterface::UploadReason reason, UploaderInterface::UploaderInterfaceResultCb start_uploader_cb); AsyncStartUploaderRequest(const AsyncStartUploaderRequest& other) = delete; AsyncStartUploaderRequest& operator=( const AsyncStartUploaderRequest& other) = delete; ~AsyncStartUploaderRequest(); - bool need_encryption_key() const; + UploaderInterface::UploadReason reason() const; UploaderInterface::UploaderInterfaceResultCb& start_uploader_cb(); private: - const bool need_encryption_key_; + const UploaderInterface::UploadReason reason_; UploaderInterface::UploaderInterfaceResultCb start_uploader_cb_; }; @@ -150,11 +150,11 @@ void OnInitializationComplete(Status init_status); static void AsyncStartUploader( - bool need_encryption_key, + UploaderInterface::UploadReason reason, UploaderInterface::UploaderInterfaceResultCb start_uploader_cb); void DeliverAsyncStartUploader( - bool need_encryption_key, + UploaderInterface::UploadReason reason, UploaderInterface::UploaderInterfaceResultCb start_uploader_cb); void FlushAsyncStartUploaderQueue();
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_mr.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_mr.xtb index 83746ef5..19d16038 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_mr.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_mr.xtb
@@ -44,7 +44,7 @@ <translation id="1225969361094801578">गडद राखाडी</translation> <translation id="1230503547248836149">निवडीची सुरुवात</translation> <translation id="1236794971743289975">तळटीप</translation> -<translation id="1237797094773582699">त्याचप्रमाणे, उजवीकडून डावीकडे चार बोटांनी स्वाइप करणे हे यापूर्वीच्या विभागावर जाण्यासाठी वापरले जाऊ शकते. हे आता करून पाहा!</translation> +<translation id="1237797094773582699">त्याचप्रमाणे, उजवीकडून डावीकडे चार बोटांनी स्वाइप करणे हे यापूर्वीच्या विभागावर जाण्यासाठी वापरले जाऊ शकते. हे आता करून पहा!</translation> <translation id="1237866625126425153">rdgrp</translation> <translation id="1243477406442346359">हलका निळा</translation> <translation id="1246424317317450637">ठळक</translation> @@ -228,7 +228,7 @@ <translation id="2598495320872286378">व्याकरण एरर</translation> <translation id="2603828437139726540">एक वर्ण वर जा</translation> <translation id="2619052155095999743">समाविष्ट करा</translation> -<translation id="2619344480613750862">तुम्ही स्क्रीनच्या विभागांदरम्यानदेखील हलवू शकता. उदाहरणार्थ, तुम्ही लाँंचर, शेल्फ आणि तुमच्या Chrome टॅबदरम्यान हलवू शकता. पुढील विभागावर जाण्यासाठी, चार बोटांनी डावीकडून उजवीकडे स्वाइप करा. पुढे सुरू ठेवण्यासाठी, आता वापरून पाहा.</translation> +<translation id="2619344480613750862">तुम्ही स्क्रीनच्या विभागांदरम्यानदेखील हलवू शकता. उदाहरणार्थ, तुम्ही लाँंचर, शेल्फ आणि तुमच्या Chrome टॅबदरम्यान हलवू शकता. पुढील विभागावर जाण्यासाठी, चार बोटांनी डावीकडून उजवीकडे स्वाइप करा. पुढे सुरू ठेवण्यासाठी, आता वापरून पहा.</translation> <translation id="2624431853467395961">जाणून घ्या मोड उघडा</translation> <translation id="2626530649491650971">क्लिक करण्यायोग्य</translation> <translation id="2637227747952042642">गणित</translation> @@ -259,7 +259,7 @@ <translation id="2756452585631602151">कस्टम लेबल एंटर करा</translation> <translation id="2766299274563946262">डावीकडे सेल नाही</translation> <translation id="2783001728278437613">{COUNT,plural, =1{आणखी #}other{आणखी #}}</translation> -<translation id="2792200646155001340">मागील आयटमवर जाण्यासाठी तुम्ही एका बोटाने उजवीकडून डावीकडेदेखील स्वाइप करू शकता. आता करून पाहा.</translation> +<translation id="2792200646155001340">मागील आयटमवर जाण्यासाठी तुम्ही एका बोटाने उजवीकडून डावीकडेदेखील स्वाइप करू शकता. आता करून पहा.</translation> <translation id="280499067616661124">पृष्ठामध्ये ChromeVox शोधा</translation> <translation id="2811019999044652585">टूलबार किंवा सिस्टम ट्रे सारख्या स्क्रीनच्या अन्य भागांवर जाण्यासाठी, Control+पुढे जा की, दाबा. Chromebook वर, पुढे जा की, अंक 2 की, च्या वर असते.</translation> <translation id="2811204574343810641">पंक्ती</translation> @@ -288,7 +288,7 @@ <translation id="2968634799764242930">निळसर हिरवा</translation> <translation id="296951647852255825">{COUNT,plural, =1{1 टॅब}other{# टॅब}}</translation> <translation id="2972205263822847197">टूल टीप</translation> -<translation id="2976476721782829799">तुम्ही एका बोटाने ड्रॅग करून स्क्रीनभोवती हलवू शकता. याला स्पर्शाने एक्सप्लोर करा असे म्हणतात. या धड्याचा राहिलेला भाग वाचण्यासाठी, तुमचे बोट त्याभोवती ड्रॅग करून पाहा.</translation> +<translation id="2976476721782829799">तुम्ही एका बोटाने ड्रॅग करून स्क्रीनभोवती हलवू शकता. याला स्पर्शाने एक्सप्लोर करा असे म्हणतात. या धड्याचा राहिलेला भाग वाचण्यासाठी, तुमचे बोट त्याभोवती ड्रॅग करून पहा.</translation> <translation id="297825089465017871">दोन बोटांनी डावीकडे स्वाइप करा</translation> <translation id="2988364959384217951">सूचना: तुम्हाला या ट्युटोरियलमधून बाहेर पडायचे असल्यास, दोन बोटांनी उजवीकडून डावीकडे स्वाइप करा.</translation> <translation id="2998131015536248178">मागील वर्ण</translation> @@ -593,7 +593,7 @@ <translation id="5087864757604726239">मागे</translation> <translation id="5102981729317424850">टूलबार</translation> <translation id="5105050547967751155">rq</translation> -<translation id="5106547198195128110">नवीन रिलीजमध्ये आम्ही काही आकर्षक बदल केले आहेत; नवीन काय आहे ते पाहा:</translation> +<translation id="5106547198195128110">नवीन रिलीजमध्ये आम्ही काही आकर्षक बदल केले आहेत; नवीन काय आहे ते पहा:</translation> <translation id="5111640677200759579">स्तंभ शीर्षलेख</translation> <translation id="5115892389597951922">ChromeVox लॉग</translation> <translation id="5119330972669454698">हलका तपकिरी</translation> @@ -792,7 +792,7 @@ <translation id="6561818612645211875">वर्तमान पंक्तीच्या सुरुवातीस जा</translation> <translation id="6579990219486187401">फिकट गुलाबी</translation> <translation id="6583174818554398774">ग्रॅन्युलॅरिटीवर पुढीलवर हलवा</translation> -<translation id="6584162722998608255">पुढे, तुम्ही स्क्रीनभोवती कसे हलवावे याविषयी जाणून घ्याल. पुढील आयटमवर जाण्यासाठी तुम्ही एका बोटाने डावीकडून उजवीकडे स्वाइप करू शकता. पुढील पायरीवर जाण्यासाठी ते आता वापरून पाहा.</translation> +<translation id="6584162722998608255">पुढे, तुम्ही स्क्रीनभोवती कसे हलवावे याविषयी जाणून घ्याल. पुढील आयटमवर जाण्यासाठी तुम्ही एका बोटाने डावीकडून उजवीकडे स्वाइप करू शकता. पुढील पायरीवर जाण्यासाठी ते आता वापरून पहा.</translation> <translation id="6609828810966525877">जाणून घ्या मोड आणि Chromebook मदत केंद्रामधील आणखी जेश्चर एक्सप्लोर करा</translation> <translation id="6628427060004938651">भाग</translation> <translation id="6637586476836377253">लॉग</translation> @@ -815,7 +815,7 @@ <translation id="67862343314499040">जांभळा</translation> <translation id="6786800275320335305">लेख</translation> <translation id="6790428901817661496">प्ले करा</translation> -<translation id="6790781785997195160">तुम्ही काही सराव केल्यानंतर, पुढील धडा बटण पाहा. त्यानंतर पुढे सुरू ठेवण्यासाठी दोनदा टॅप करा.</translation> +<translation id="6790781785997195160">तुम्ही काही सराव केल्यानंतर, पुढील धडा बटण पहा. त्यानंतर पुढे सुरू ठेवण्यासाठी दोनदा टॅप करा.</translation> <translation id="6793101435925451627">lstbx</translation> <translation id="6815255864998354418">लिंबासारखा पिवळा</translation> <translation id="6816066673340002913">फिकट सोनेरी</translation>
diff --git a/chrome/browser/resources/cryptotoken/enroller.js b/chrome/browser/resources/cryptotoken/enroller.js index cf1986a2..2cd41ac0 100644 --- a/chrome/browser/resources/cryptotoken/enroller.js +++ b/chrome/browser/resources/cryptotoken/enroller.js
@@ -869,13 +869,6 @@ Enroller.prototype.doRegisterWebAuthn_ = function(appId, challenge, request) { const encodedChallenge = challenge['challenge']; - if (appId == googleCorpAppId) { - this.doRegisterWebAuthnContinue_( - appId, encodedChallenge, request, - WebAuthnAttestationConveyancePreference.ENTERPRISE); - return; - } - if (!chrome.cryptotokenPrivate) { this.doRegisterWebAuthnContinue_( appId, encodedChallenge, request, @@ -883,10 +876,17 @@ return; } + if (appId == googleCorpAppId) { + this.checkU2fApiPermission_( + appId, encodedChallenge, request, + WebAuthnAttestationConveyancePreference.ENTERPRISE); + return; + } + chrome.cryptotokenPrivate.isAppIdHashInEnterpriseContext( decodeWebSafeBase64ToArray(B64_encode(sha256HashOfString(appId))), (enterprise_context) => { - this.doRegisterWebAuthnContinue_( + this.checkU2fApiPermission_( appId, encodedChallenge, request, enterprise_context ? WebAuthnAttestationConveyancePreference.ENTERPRISE : @@ -894,6 +894,23 @@ }); }; +Enroller.prototype.checkU2fApiPermission_ = function( + appId, challenge, request, attestationMode) { + chrome.cryptotokenPrivate.canMakeU2fApiRequest( + {tabId: this.sender_.tabId, origin: this.sender_.origin, appId: appId}, + (result) => { + if (!result) { + this.notifyError_({ + errorCode: ErrorCodes.BAD_REQUEST, + errorMessage: 'The operation was not allowed', + }); + return; + } + this.doRegisterWebAuthnContinue_( + appId, challenge, request, attestationMode); + }); +}; + Enroller.prototype.doRegisterWebAuthnContinue_ = function( appId, challenge, request, attestationMode) { // Set a random ID.
diff --git a/chrome/browser/resources/cryptotoken/signer.js b/chrome/browser/resources/cryptotoken/signer.js index 725e8ee..692a8aac 100644 --- a/chrome/browser/resources/cryptotoken/signer.js +++ b/chrome/browser/resources/cryptotoken/signer.js
@@ -506,6 +506,28 @@ this.signChallenges_[0]['appId'] : this.appId_; + if (!chrome.cryptotokenPrivate) { + this.doSignWebAuthnContinue_(decodedChallenge, credentialList, appid); + } else { + chrome.cryptotokenPrivate.canMakeU2fApiRequest( + {tabId: this.sender_.tabId, origin: this.sender_.origin, appId: appid}, + (result) => { + if (!result) { + this.notifyError_({ + errorCode: ErrorCodes.DEVICE_INELIGIBLE, + errorMessage: 'The operation was not allowed', + }); + return; + } + this.doSignWebAuthnContinue_(decodedChallenge, credentialList, appid); + }); + } + + return true; +}; + +Signer.prototype.doSignWebAuthnContinue_ = function( + decodedChallenge, credentialList, appid) { const request = { publicKey: { challenge: new Uint8Array(decodedChallenge).buffer, @@ -525,8 +547,6 @@ .catch(exception => { this.handleWebAuthnError_(exception); }); - - return true; }; /**
diff --git a/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.html b/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.html index dcde68c..99e36bc 100644 --- a/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.html +++ b/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.html
@@ -45,7 +45,7 @@ #deviceNameHelp { bottom: 8px; - color: var(--google-grey-700); + color: var(--cr-secondary-text-color); font-size: 10px; line-height: 10px; margin-inline-start: 8px;
diff --git a/chrome/browser/resources/new_tab_page/modules/modules.js b/chrome/browser/resources/new_tab_page/modules/modules.js index 75b7d5bc..6e143c7 100644 --- a/chrome/browser/resources/new_tab_page/modules/modules.js +++ b/chrome/browser/resources/new_tab_page/modules/modules.js
@@ -397,7 +397,7 @@ dragElement.style.removeProperty('left'); dragElement.style.removeProperty('top'); - const lastRect = dragElement.parentElement.getBoundingClientRect(); + const lastRect = dragElement.getBoundingClientRect(); const invertX = firstRect.left - lastRect.left; const invertY = firstRect.top - lastRect.top;
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/BUILD.gn index 0634f1b4..a99c608 100644 --- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/BUILD.gn
@@ -62,12 +62,18 @@ js_library("os_paired_bluetooth_list_item") { deps = [ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", + "//ui/webui/resources/cr_components/chromeos/bluetooth:bluetooth_utils", + "//ui/webui/resources/js:i18n_behavior.m", ] } js_library("os_bluetooth_device_detail_subpage") { deps = [ + "..:os_route.m", + "../..:router", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", + "//ui/webui/resources/cr_components/chromeos/bluetooth:bluetooth_utils", + "//ui/webui/resources/js:i18n_behavior.m", ] }
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.html b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.html index d4c84997..02f5cda 100644 --- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.html +++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.html
@@ -1,5 +1,50 @@ <style include="settings-shared"> + :host([is-device-connected_]) #bluetoothStateText { + color: var(--google-green-500); + } + + #bluetoothDeviceName { + padding-inline-start: 0; + } + + .cancel-button { + margin-inline-end: 0; + } </style> <div id="container"> - <!-- TODO(crbug.com/1010321): Add bluetooth device detail --> + <div id="deviceStateSettings" class="settings-box two-line first"> + <iron-icon id="statusIcon" + icon="[[getBluetoothStateIcon_(device_.*)]]"> + </iron-icon> + <div id="bluetoothStateText" + class="middle settings-box-text" + aria-hidden="true"> + [[getBluetoothStateTextLabel_(device_.*)]] + </div> + <div id="buttonContainer" class="layout end"> + <cr-button id="forgetBtn" class="cancel-button"> + $i18n{bluetoothDeviceDetailForget} + </cr-button> + <template is="dom-if" if="[[shouldShowStateBtn_(device_.*)]]" restamp> + <cr-button id="stateBtn" class="action-button"> + [[getBluetoothStateBtnLabel_(device_.*)]] + </cr-button> + </template> + </div> + </div> + <div id="deviceNameSettings" class="settings-box "> + <div id="bluetoothDeviceName" class="middle settings-box-text no-padding" + aria-hidden="true"> + $i18n{bluetoothDeviceDetailName} + <div class="secondary" id="bluetoothDeviceNameLabel"> + [[getDeviceName_(device_.*)]] + </div> + </div> + <cr-button id="changeNameBtn" class="layout end cancel-button"> + $i18n{bluetoothDeviceDetailChangeDeviceName} + </cr-button> + </div> + <div id="changeDeviceSettings" class="settings-box" aria-hidden="true"> + <!-- TODO(crbug.com/1010321): Add device settings string --> + </div> </div> \ No newline at end of file
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.js index 76ef6ed..ec1fdb4 100644 --- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.js +++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.js
@@ -4,15 +4,35 @@ /** * @fileoverview - * Settings subpage for managing Bluetooth device detail. + * Settings subpage for managing Bluetooth device detail. This Element should + * only be called when a device exist. */ import '../../settings_shared_css.js'; +import '//resources/cr_elements/cr_icon_button/cr_icon_button.m.js'; -import {html, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {I18nBehavior, I18nBehaviorInterface} from '//resources/js/i18n_behavior.m.js'; +import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {getDeviceName} from 'chrome://resources/cr_components/chromeos/bluetooth/bluetooth_utils.js'; + +import {loadTimeData} from '../../i18n_setup.js'; +import {Route, RouteObserverBehavior, RouteObserverBehaviorInterface, Router} from '../../router.js'; +import {routes} from '../os_route.m.js'; + +const mojom = chromeos.bluetoothConfig.mojom; + +/** + * @constructor + * @extends {PolymerElement} + * @implements {RouteObserverBehaviorInterface} + * @implements {I18nBehaviorInterface} + */ +const SettingsBluetoothDeviceDetailSubpageElementBase = + mixinBehaviors([RouteObserverBehavior, I18nBehavior], PolymerElement); /** @polymer */ -class SettingsBluetoothDeviceDetailSubpageElement extends PolymerElement { +class SettingsBluetoothDeviceDetailSubpageElement extends + SettingsBluetoothDeviceDetailSubpageElementBase { static get is() { return 'os-settings-bluetooth-device-detail-subpage'; } @@ -20,8 +40,150 @@ static get template() { return html`{__html_template__}`; } + + static get properties() { + return { + /** + * @type {!chromeos.bluetoothConfig.mojom.BluetoothSystemProperties} + */ + systemProperties: { + type: Object, + }, + + /** + * @private {?chromeos.bluetoothConfig.mojom.PairedBluetoothDeviceProperties} + */ + device_: { + type: Object, + observer: 'onDeviceChanged_', + }, + + /** + * Id of the currently paired device. This is set from the route query + * parameters. + * @private + */ + deviceId_: { + type: String, + value: '', + }, + + /** @private */ + isDeviceConnected_: { + reflectToAttribute: true, + type: Boolean, + computed: 'computeIsDeviceConnected_(device_.*)', + }, + }; + } + + static get observers() { + return [ + 'onSystemPropertiesOrDeviceIdChanged_(systemProperties.*, deviceId_)', + ]; + } + + /** + * RouteObserverBehaviorInterface override + * @param {!Route} route + */ + currentRouteChanged(route) { + if (route !== routes.BLUETOOTH_DEVICE_DETAIL) { + return; + } + + const queryParams = Router.getInstance().getQueryParameters(); + const deviceId = queryParams.get('id') || ''; + if (!deviceId) { + console.error('No id specified for page:' + route); + return; + } + this.deviceId_ = decodeURIComponent(deviceId); + } + + /** @private */ + onSystemPropertiesOrDeviceIdChanged_() { + if (!this.systemProperties || !this.deviceId_) { + return; + } + + const device = this.systemProperties.pairedDevices.find( + (device) => device.deviceProperties.id === this.deviceId_); + + // Special case where the device was turned off or becomes unavailable + // while user is vewing the page, return back to previous page. + if (!device) { + this.deviceId_ = ''; + Router.getInstance().navigateToPreviousRoute(); + return; + } + + this.device_ = device; + } + + /** + * @return {string} + * @private + */ + getBluetoothStateIcon_() { + return this.isDeviceConnected_ ? 'os-settings:bluetooth-connected' : + 'os-settings:bluetooth-disabled'; + } + + /** + * @return {boolean} + * @private + */ + computeIsDeviceConnected_() { + return this.device_.deviceProperties.connectionState === + mojom.DeviceConnectionState.kConnected; + } + + /** + * @return {string} + * @private + */ + getBluetoothStateBtnLabel_() { + return this.isDeviceConnected_ ? this.i18n('bluetoothDisconnect') : + this.i18n('bluetoothConnect'); + } + + /** + * @return {string} + * @private + */ + getBluetoothStateTextLabel_() { + return this.isDeviceConnected_ ? + this.i18n('bluetoothDeviceDetailConnected') : + this.i18n('bluetoothDeviceDetailDisconnected'); + } + + /** + * @return {string} + * @private + */ + getDeviceName_() { + return getDeviceName(this.device_); + } + + /** + * @return {boolean} + * @private + */ + shouldShowStateBtn_() { + return this.device_.deviceProperties.audioCapability === + mojom.AudioOutputCapability.kCapableOfAudioOutput; + } + + /** @private */ + onDeviceChanged_() { + if (!this.device_) { + return; + } + this.parentNode.pageTitle = getDeviceName(this.device_); + } } customElements.define( SettingsBluetoothDeviceDetailSubpageElement.is, - SettingsBluetoothDeviceDetailSubpageElement); \ No newline at end of file + SettingsBluetoothDeviceDetailSubpageElement);
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_page.html b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_page.html index 771b5b7..fb6268b 100644 --- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_page.html +++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_page.html
@@ -14,7 +14,8 @@ </template> <template is="dom-if" route-path="/bluetoothDeviceDetail"> <settings-subpage> - <os-settings-bluetooth-device-detail-subpage> + <os-settings-bluetooth-device-detail-subpage + system-properties="[[systemProperties_]]"> </os-settings-bluetooth-device-detail-subpage> </settings-subpage> </template>
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list.html b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list.html index 374815b..e83e7e5 100644 --- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list.html +++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list.html
@@ -1,15 +1,19 @@ <style include="settings-shared"> + :host { + --settings-row-min-height: 64px; + } + iron-list > *:not(:first-of-type) { border-top: var(--cr-separator-line); } </style> -<!-- TODO(crbug.com/1010321): Populate with real data. --> <div id="container" class="layout vertical flex" scrollable no-bottom-scroll-border> <iron-list items="[[devices]]" scroll-target="container" preserve-focus> <template> <!-- TODO(crbug.com/1010321): Fix focus behavior. --> <os-settings-paired-bluetooth-list-item + device="[[item]]" tabindex="[[tabIndex]]"> </os-settings-paired-bluetooth-list-item> </template>
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list_item.html b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list_item.html index 22d9b88..66d3444 100644 --- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list_item.html +++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list_item.html
@@ -1,10 +1,26 @@ <style include="settings-shared"> - .battery { - color: var(--google-green-500); + .secondary { + padding-top: 3px; + } + + :host([is-low-battery_]) .secondary { + --iron-icon-fill-color: var(--google-red-600); + color: var(--google-red-600); + } + + :host(:not([is-low-battery_])) .secondary { + --iron-icon-fill-color: var(--google-grey-600); + color: var(--google-grey-700); + } + + #batteryIcon { + --iron-icon-height: 16px; + --iron-icon-width: 16px; + margin-inline-end: -2px; + padding-bottom: 2px; } </style> <div focus-row-container> - <!-- TODO(crbug.com/1010321): Populate with dynamic data. --> <!-- TODO(crbug.com/1010321): Add a11y label. --> <div class="list-item" focus-row-control @@ -15,13 +31,17 @@ <iron-icon icon="os-settings:headset"> </iron-icon> <div class="middle" aria-hidden="true"> - <div> - Device Name - </div> - <!-- TODO(crbug.com/1010321): Add battery icon. --> - <div class="battery secondary"> - 96% - </div> + <div id="deviceName">[[getDeviceName_(device)]]</div> + <template is="dom-if" + if="[[isBatteryPercentageAvailable_]]" restamp> + <div id="batteryContainer" class="secondary"> + <iron-icon id="batteryIcon" icon="[[getBatteryIcon_(device)]]"> + </iron-icon> + <span id="batteryPercentage"> + [[getBatteryPercentageString_(device)]] + </span> + </div> + </template> </div> <div> <!-- TODO(crbug.com/1010321): Add click listener. -->
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list_item.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list_item.js index 82f5df18..c1fe3dd 100644 --- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list_item.js +++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list_item.js
@@ -12,10 +12,40 @@ import '//resources/cr_elements/cr_icon_button/cr_icon_button.m.js'; import '../os_icons.m.js'; -import {html, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {I18nBehavior, I18nBehaviorInterface} from '//resources/js/i18n_behavior.m.js'; +import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {getDeviceName} from 'chrome://resources/cr_components/chromeos/bluetooth/bluetooth_utils.js'; +import {assert} from 'chrome://resources/js/assert.m.js'; + +/** + * The threshold percentage where any battery percentage lower is considered + * 'low battery'. + * @type {number} + */ +const LOW_BATTERY_THRESHOLD_PERCENTAGE = 25; + +/** + * Ranges for each battery icon, where the value of the first index is the + * minimum battery percentage in the range (inclusive), and the second index is + * the maximum battery percentage in the range (inclusive). + * @type {Array<Array<number>>} + */ +const batteryIconsRanges = [ + [0, 7], [8, 14], [15, 21], [22, 28], [29, 35], [36, 42], [43, 49], [50, 56], + [57, 63], [64, 70], [71, 77], [78, 85], [86, 92], [93, 100] +]; + +/** + * @constructor + * @extends {PolymerElement} + * @implements {I18nBehaviorInterface} + */ +const SettingsPairedBluetoothListItemElementBase = + mixinBehaviors([I18nBehavior], PolymerElement); /** @polymer */ -class SettingsPairedBluetoothListItemElement extends PolymerElement { +class SettingsPairedBluetoothListItemElement extends + SettingsPairedBluetoothListItemElementBase { static get is() { return 'os-settings-paired-bluetooth-list-item'; } @@ -23,6 +53,132 @@ static get template() { return html`{__html_template__}`; } + + static get properties() { + return { + /** + * @private {!chromeos.bluetoothConfig.mojom.PairedBluetoothDeviceProperties} + */ + device: { + type: Object, + }, + + /** @private {boolean} */ + isBatteryPercentageAvailable_: { + type: Boolean, + computed: 'computeIsBatteryPercentageAvailable_(device)', + }, + + /** @private {boolean} */ + isLowBattery_: { + reflectToAttribute: true, + type: Boolean, + computed: 'computeIsLowBattery_(device)', + } + }; + } + + /** + * @param {!chromeos.bluetoothConfig.mojom.PairedBluetoothDeviceProperties} + * device + * @return {string} + * @private + */ + getDeviceName_(device) { + return getDeviceName(device); + } + + /** + * Returns the battery percentage of device, or undefined if device does + * not exist or it has no battery information. Clients that call this method + * should explicitly check if the return value is undefined to differentiate + * it from a return value of 0. + * @param {!chromeos.bluetoothConfig.mojom.PairedBluetoothDeviceProperties} + * device + * @return {number|undefined} + * @private + */ + getBatteryPercentage_(device) { + if (!device) { + return undefined; + } + + const batteryInfo = device.deviceProperties.batteryInfo; + if (!batteryInfo || !batteryInfo.defaultProperties) { + return undefined; + } + + return batteryInfo.defaultProperties.batteryPercentage; + } + + /** + * @param {!chromeos.bluetoothConfig.mojom.PairedBluetoothDeviceProperties} + * device + * @return {boolean} + * @private + */ + computeIsBatteryPercentageAvailable_(device) { + const batteryPercentage = this.getBatteryPercentage_(device); + if (batteryPercentage === undefined) { + return false; + } + return batteryPercentage >= 0 && batteryPercentage <= 100; + } + + /** + * @param {!chromeos.bluetoothConfig.mojom.PairedBluetoothDeviceProperties} + * device + * @return {boolean} + * @private + */ + computeIsLowBattery_(device) { + if (!this.isBatteryPercentageAvailable_) { + return false; + } + const batteryPercentage = this.getBatteryPercentage_(device); + return batteryPercentage < LOW_BATTERY_THRESHOLD_PERCENTAGE; + } + + /** + * @param {!chromeos.bluetoothConfig.mojom.PairedBluetoothDeviceProperties} + * device + * @return {string} + * @private + */ + getBatteryPercentageString_(device) { + if (!this.isBatteryPercentageAvailable_) { + return ''; + } + const batteryPercentage = this.getBatteryPercentage_(device); + + // Required for closure compiler not to complain about the line below. + assert(batteryPercentage !== undefined); + return this.i18n( + 'bluetoothPairedDeviceItemBatteryPercentage', batteryPercentage); + } + + /** + * @param {!chromeos.bluetoothConfig.mojom.PairedBluetoothDeviceProperties} + * device + * @return {string} + * @private + */ + getBatteryIcon_(device) { + if (!this.isBatteryPercentageAvailable_) { + return ''; + } + const batteryPercentage = this.getBatteryPercentage_(device); + + // Range should always find a value because isBatteryPercentageAvailable_ + // ensures batteryPercentage is within bounds. + const range = batteryIconsRanges.find(range => { + return range[0] <= batteryPercentage && batteryPercentage <= range[1]; + }); + assert( + !!range && range.length === 2, 'Battery percentage range is invalid'); + + return 'os-settings:battery-' + range[0] + '-' + range[1]; + } } customElements.define(
diff --git a/chrome/browser/resources/settings/chromeos/os_icons.html b/chrome/browser/resources/settings/chromeos/os_icons.html index 601d022..efaefa6 100644 --- a/chrome/browser/resources/settings/chromeos/os_icons.html +++ b/chrome/browser/resources/settings/chromeos/os_icons.html
@@ -115,6 +115,22 @@ <g id="startup" viewBox="0 0 24 24"><path d="M13 3h-2v10h2V3zm4.83 2.17l-1.42 1.42C17.99 7.86 19 9.81 19 12c0 3.87-3.13 7-7 7s-7-3.13-7-7c0-2.19 1.01-4.14 2.58-5.42L6.17 5.17C4.23 6.82 3 9.26 3 12c0 4.97 4.03 9 9 9s9-4.03 9-9c0-2.74-1.23-5.18-3.17-6.83z"></path></g> <g id="tablet" viewBox="0 0 24 24"><path d="M21 4H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h18c1.1 0 1.99-.9 1.99-2L23 6c0-1.1-.9-2-2-2zm-2 14H5V6h14v12z"></path></g> <!-- Keep alphabetized. --> + + <!-- Bluetooth Settings UI --> + <g id="battery-0-7"><path d="M14 13.5H6V16H14V13.5Z"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M12.5 6H7.5V15H12.5V6ZM13 4.5H12V3H8V4.5H7C6.5 4.5 6 5 6 5.5V16C6 16.5 6.5 17 7 17H13C13.5 17 14 16.5 14 16V5.5C14 5 13.5 4.5 13 4.5Z"></path></g> + <g id="battery-8-14"><path d="M14 12.5H6V16H14V12.5Z"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M12.5 6H7.5V15H12.5V6ZM13 4.5H12V3H8V4.5H7C6.5 4.5 6 5 6 5.5L6 16C6 16.5 6.5 17 7 17H13C13.5 17 14 16.5 14 16V5.5C14 5 13.5 4.5 13 4.5Z"></path></g> + <g id="battery-15-21"><path d="M14 12H6V16H14V12Z"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M12.5 6H7.5V15H12.5V6ZM13 4.5H12V3H8V4.5H7C6.5 4.5 6 5 6 5.5V16C6 16.5 6.5 17 7 17H13C13.5 17 14 16.5 14 16V5.5C14 5 13.5 4.5 13 4.5Z"></path></g> + <g id="battery-22-28"><path d="M14 11.5H6L6 16H14V11.5Z"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M12.5 6H7.5V15H12.5V6ZM13 4.5H12V3H8V4.5H7C6.5 4.5 6 5 6 5.5L6 16C6 16.5 6.5 17 7 17H13C13.5 17 14 16.5 14 16V5.5C14 5 13.5 4.5 13 4.5Z"></path></g> + <g id="battery-29-35"><path d="M14 11H6V16H14V11Z"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M12.5 6H7.5V15H12.5V6ZM13 4.5H12V3H8V4.5H7C6.5 4.5 6 5 6 5.5V16C6 16.5 6.5 17 7 17H13C13.5 17 14 16.5 14 16V5.5C14 5 13.5 4.5 13 4.5Z"></path></g> + <g id="battery-36-42"><path d="M14 10.5H6V16H14V10.5Z"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M12.5 6H7.5V15H12.5V6ZM13 4.5H12V3H8V4.5H7C6.5 4.5 6 5 6 5.5V16C6 16.5 6.5 17 7 17H13C13.5 17 14 16.5 14 16V5.5C14 5 13.5 4.5 13 4.5Z"></path></g> + <g id="battery-43-49"><path d="M14 10H6V16H14V10Z"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M12.5 6H7.5V15H12.5V6ZM13 4.5H12V3H8V4.5H7C6.5 4.5 6 5 6 5.5V16C6 16.5 6.5 17 7 17H13C13.5 17 14 16.5 14 16V5.5C14 5 13.5 4.5 13 4.5Z"></path></g> + <g id="battery-50-56"><path d="M14 9.5H6V16H14V9.5Z"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M12.5 6H7.5V15H12.5V6ZM13 4.5H12V3H8V4.5H7C6.5 4.5 6 5 6 5.5V16C6 16.5 6.5 17 7 17H13C13.5 17 14 16.5 14 16V5.5C14 5 13.5 4.5 13 4.5Z"></path></g> + <g id="battery-57-63"><path d="M14 9H6V16H14V9Z"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M12.5 6H7.5V15H12.5V6ZM13 4.5H12V3H8V4.5H7C6.5 4.5 6 5 6 5.5V16C6 16.5 6.5 17 7 17H13C13.5 17 14 16.5 14 16V5.5C14 5 13.5 4.5 13 4.5Z"></path></g> + <g id="battery-64-70"><path d="M14 8.5H6V16H14V8.5Z"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M12.5 6H7.5V15H12.5V6ZM13 4.5H12V3H8V4.5H7C6.5 4.5 6 5 6 5.5V16C6 16.5 6.5 17 7 17H13C13.5 17 14 16.5 14 16V5.5C14 5 13.5 4.5 13 4.5Z"></path></g> + <g id="battery-71-77"><path d="M14 8H6V16H14V8Z"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M12.5 6H7.5V15H12.5V6ZM13 4.5H12V3H8V4.5H7C6.5 4.5 6 5 6 5.5V16C6 16.5 6.5 17 7 17H13C13.5 17 14 16.5 14 16V5.5C14 5 13.5 4.5 13 4.5Z"></path></g> + <g id="battery-78-85"><path d="M14 7.5H6L6 16H14V7.5Z"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M12.5 6H7.5V15H12.5V6ZM13 4.5H12V3H8V4.5H7C6.5 4.5 6 5 6 5.5L6 16C6 16.5 6.5 17 7 17H13C13.5 17 14 16.5 14 16V5.5C14 5 13.5 4.5 13 4.5Z"></path></g> + <g id="battery-86-92"><path d="M14 7H6V16H14V7Z"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M12.5 6H7.5V16H12.5V6ZM13 4.5H12V3H8V4.5H7C6.5 4.5 6 5 6 5.5V16C6 16.5 6.5 17 7 17H13C13.5 17 14 16.5 14 16V5.5C14 5 13.5 4.5 13 4.5Z"></path></g> + <g id="battery-93-100"><path d="M12 4.5H13C13.5 4.5 14 5 14 5.5V16C14 16.5 13.5 17 13 17H7C6.5 17 6 16.5 6 16V5.5C6 5 6.5 4.5 7 4.5H8V3H12V4.5Z"></path></g> </defs> </svg> </iron-iconset-svg>
diff --git a/chrome/browser/resources/settings/route.js b/chrome/browser/resources/settings/route.js index 23c75e8b..c0b0b02 100644 --- a/chrome/browser/resources/settings/route.js +++ b/chrome/browser/resources/settings/route.js
@@ -162,7 +162,6 @@ if (visibility.onStartup !== false) { r.ON_STARTUP = r.BASIC.createSection('/onStartup', 'onStartup'); - r.STARTUP_PAGES = r.ON_STARTUP.createChild('/startupPages'); } // Advanced Routes @@ -185,7 +184,7 @@ r.ACCESSIBILITY = r.ADVANCED.createSection('/accessibility', 'a11y'); - // <if expr="chromeos or is_linux"> + // <if expr="is_linux"> r.CAPTIONS = r.ACCESSIBILITY.createChild('/captions'); // </if>
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service.cc b/chrome/browser/safe_browsing/chrome_password_protection_service.cc index 951aab8..74e187b 100644 --- a/chrome/browser/safe_browsing/chrome_password_protection_service.cc +++ b/chrome/browser/safe_browsing/chrome_password_protection_service.cc
@@ -1514,12 +1514,16 @@ return extended_reporting_enabled; } -// TODO(rsamp) Expand GAIA password pings from extended reporting to the general -// Safe Browsing population. - -// Only saved password reuse warnings are shown on Android, so other types of -// password reuse events should be gated by extended reporting. +// Only saved password and GAIA password reuse warnings are shown to users on +// Android, so other types of password reuse events should be gated by Safe +// Browsing extended reporting. #if defined(OS_ANDROID) + if (password_type.account_type() == + ReusedPasswordAccountType::SAVED_PASSWORD || + IsSyncingGMAILPasswordWithSignedInProtectionEnabled(password_type)) { + return true; + } + return extended_reporting_enabled; #else return true;
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service_browsertest.cc b/chrome/browser/safe_browsing/chrome_password_protection_service_browsertest.cc index 07cf10b..9db7ff4 100644 --- a/chrome/browser/safe_browsing/chrome_password_protection_service_browsertest.cc +++ b/chrome/browser/safe_browsing/chrome_password_protection_service_browsertest.cc
@@ -312,8 +312,7 @@ #if BUILDFLAG(FULL_SAFE_BROWSING) // Disabled due to flakiness on Linux Asan/Msan https://crbug.com/1229592 -#if defined(OS_LINUX) && \ - (defined(ADDRESS_SANITIZER) || defined(MEMORY_SANITIZER)) +#if defined(ADDRESS_SANITIZER) || defined(MEMORY_SANITIZER) #define MAYBE_SavedPassword DISABLED_SavedPassword #else #define MAYBE_SavedPassword SavedPassword
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc b/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc index 081947f..e23ec6f9 100644 --- a/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc +++ b/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc
@@ -506,67 +506,84 @@ reused_password_type.set_account_type(ReusedPasswordAccountType::GMAIL); reused_password_type.set_is_account_syncing(true); - // Sync password entry pinging is enabled by default. - service_->ConfigService(false /*incognito*/, false /*SBER*/); -// Sync password pings are gated by SBER on Android, because warnings are -// disabled. + { + // Enable kPasswordProtectionForSignedInUsers. + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitWithFeatures( + {safe_browsing::kPasswordProtectionForSignedInUsers}, {}); + + // Sync password entry pinging is enabled by default. + service_->ConfigService(false /*incognito*/, false /*SBER*/); + // Sync password pings are now gated by Safe Browsing, not Safe Browsing + // Enhanced Reporting (SBER), on Android, because warnings are now enabled + // with kPasswordProtectionForSignedInUsers. + EXPECT_TRUE(service_->IsPingingEnabled( + LoginReputationClientRequest::PASSWORD_REUSE_EVENT, + reused_password_type)); + + service_->ConfigService(false /*incognito*/, true /*SBER*/); + EXPECT_TRUE(service_->IsPingingEnabled( + LoginReputationClientRequest::PASSWORD_REUSE_EVENT, + reused_password_type)); + + service_->ConfigService(true /*incognito*/, false /*SBER*/); + // Sync password pings are now gated by Safe Browsing, not Safe Browsing + // Enhanced Reporting (SBER), on Android, because warnings are now enabled + // with kPasswordProtectionForSignedInUsers. + EXPECT_TRUE(service_->IsPingingEnabled( + LoginReputationClientRequest::PASSWORD_REUSE_EVENT, + reused_password_type)); + + // Even if sync password entry pinging is disabled by policy, + // |IsPingingEnabled(..)| should still default to true if the + // the password reuse type is syncing Gmail account. + service_->ConfigService(true /*incognito*/, true /*SBER*/); + service_->SetIsNoHostedDomainFound(true); + EXPECT_TRUE(service_->IsPingingEnabled( + LoginReputationClientRequest::PASSWORD_REUSE_EVENT, + reused_password_type)); + + profile()->GetPrefs()->SetInteger(prefs::kPasswordProtectionWarningTrigger, + PASSWORD_PROTECTION_OFF); + service_->ConfigService(false /*incognito*/, false /*SBER*/); + // Sync password pings are now gated by Safe Browsing, not Safe Browsing + // Enhanced Reporting (SBER), on Android, because warnings are now enabled + // with kPasswordProtectionForSignedInUsers. + EXPECT_TRUE(service_->IsPingingEnabled( + LoginReputationClientRequest::PASSWORD_REUSE_EVENT, + reused_password_type)); + + profile()->GetPrefs()->SetInteger(prefs::kPasswordProtectionWarningTrigger, + PASSWORD_REUSE); + // Sync password pings are now gated by Safe Browsing, not Safe Browsing + // Enhanced Reporting (SBER), on Android, because warnings are now enabled. + EXPECT_TRUE(service_->IsPingingEnabled( + LoginReputationClientRequest::PASSWORD_REUSE_EVENT, + reused_password_type)); + } + #if defined(OS_ANDROID) - EXPECT_FALSE(service_->IsPingingEnabled( -#else - EXPECT_TRUE(service_->IsPingingEnabled( + { + // Disable kPasswordProtectionForSignedInUsers. + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitWithFeatures( + {}, {safe_browsing::kPasswordProtectionForSignedInUsers}); + + service_->ConfigService(false /*incognito*/, false /*SBER*/); + // Sync password pings are now gated by Safe Browsing Enhanced Reporting, + // because the flag is disabled. + EXPECT_FALSE(service_->IsPingingEnabled( + LoginReputationClientRequest::PASSWORD_REUSE_EVENT, + reused_password_type)); + + // Sync password pings are now gated by Safe Browsing Enhanced Reporting, + // because the flag is disabled. + service_->ConfigService(false /*incognito*/, true /*SBER*/); + EXPECT_TRUE(service_->IsPingingEnabled( + LoginReputationClientRequest::PASSWORD_REUSE_EVENT, + reused_password_type)); + } #endif - LoginReputationClientRequest::PASSWORD_REUSE_EVENT, - reused_password_type)); - - service_->ConfigService(false /*incognito*/, true /*SBER*/); - EXPECT_TRUE(service_->IsPingingEnabled( - LoginReputationClientRequest::PASSWORD_REUSE_EVENT, - reused_password_type)); - - service_->ConfigService(true /*incognito*/, false /*SBER*/); -// Sync password pings are gated by SBER on Android, because warnings are -// disabled. -#if defined(OS_ANDROID) - EXPECT_FALSE(service_->IsPingingEnabled( -#else - EXPECT_TRUE(service_->IsPingingEnabled( -#endif - LoginReputationClientRequest::PASSWORD_REUSE_EVENT, - reused_password_type)); - - // Even if sync password entry pinging is disabled by policy, - // |IsPingingEnabled(..)| should still default to true if the - // the password reuse type is syncing Gmail account. - service_->ConfigService(true /*incognito*/, true /*SBER*/); - service_->SetIsNoHostedDomainFound(true); - EXPECT_TRUE(service_->IsPingingEnabled( - LoginReputationClientRequest::PASSWORD_REUSE_EVENT, - reused_password_type)); - - profile()->GetPrefs()->SetInteger(prefs::kPasswordProtectionWarningTrigger, - PASSWORD_PROTECTION_OFF); - service_->ConfigService(false /*incognito*/, false /*SBER*/); -// Sync password pings are gated by SBER on Android, because warnings are -// disabled. -#if defined(OS_ANDROID) - EXPECT_FALSE(service_->IsPingingEnabled( -#else - EXPECT_TRUE(service_->IsPingingEnabled( -#endif - LoginReputationClientRequest::PASSWORD_REUSE_EVENT, - reused_password_type)); - - profile()->GetPrefs()->SetInteger(prefs::kPasswordProtectionWarningTrigger, - PASSWORD_REUSE); -// Sync password pings are gated by SBER on Android, because warnings are -// disabled. -#if defined(OS_ANDROID) - EXPECT_FALSE(service_->IsPingingEnabled( -#else - EXPECT_TRUE(service_->IsPingingEnabled( -#endif - LoginReputationClientRequest::PASSWORD_REUSE_EVENT, - reused_password_type)); } TEST_F(ChromePasswordProtectionServiceTest,
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.cc b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.cc index 9590ca49..4560a71 100644 --- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.cc +++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.cc
@@ -279,6 +279,26 @@ }); } +void EventReportValidator::ExpectLoginEvent( + const std::string& expected_url, + const bool expected_is_federated, + const std::string& expected_federated_origin, + const std::string& expected_username) { + event_key_ = SafeBrowsingPrivateEventRouter::kKeyLoginEvent; + url_ = expected_url; + is_federated_ = expected_is_federated; + federated_origin_ = expected_federated_origin; + username_ = expected_username; + EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) + .WillOnce([this](content::BrowserContext* context, + bool include_device_info, base::Value& report, + base::OnceCallback<void(bool)>& callback) { + ValidateReport(&report); + if (!done_closure_.is_null()) + done_closure_.Run(); + }); +} + void EventReportValidator::ValidateReport(base::Value* report) { DCHECK(report); @@ -312,6 +332,10 @@ ValidateField(event, SafeBrowsingPrivateEventRouter::kKeyProfileUserName, username_); ValidateField(event, SafeBrowsingPrivateEventRouter::kKeyScanId, scan_id_); + ValidateField(event, SafeBrowsingPrivateEventRouter::kKeyIsFederated, + is_federated_); + ValidateField(event, SafeBrowsingPrivateEventRouter::kKeyFederatedOrigin, + federated_origin_); ValidateMimeType(event); ValidateDlpVerdict(event); } @@ -354,13 +378,18 @@ } void EventReportValidator::ValidateFilenameAndHash(base::Value* value) { - const std::string* filename = - value->FindStringKey(SafeBrowsingPrivateEventRouter::kKeyFileName); - ASSERT_TRUE(filename); - ASSERT_TRUE(filenames_and_hashes_.count(*filename)) - << "Mismatch in field " << SafeBrowsingPrivateEventRouter::kKeyFileName; - ValidateField(value, SafeBrowsingPrivateEventRouter::kKeyDownloadDigestSha256, - filenames_and_hashes_[*filename]); + if (filenames_and_hashes_.empty()) { + ASSERT_FALSE(value->FindKey(SafeBrowsingPrivateEventRouter::kKeyFileName)); + } else { + const std::string* filename = + value->FindStringKey(SafeBrowsingPrivateEventRouter::kKeyFileName); + ASSERT_TRUE(filename); + ASSERT_TRUE(filenames_and_hashes_.count(*filename)) + << "Mismatch in field " << SafeBrowsingPrivateEventRouter::kKeyFileName; + ValidateField(value, + SafeBrowsingPrivateEventRouter::kKeyDownloadDigestSha256, + filenames_and_hashes_[*filename]); + } } void EventReportValidator::ValidateField(
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h index 4369333..d8c1125 100644 --- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h +++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h
@@ -121,6 +121,11 @@ const std::string& expected_username, const absl::optional<std::string>& expected_scan_id); + void ExpectLoginEvent(const std::string& expected_url, + bool expected_is_federated, + const std::string& expected_federated_origin, + const std::string& expected_username); + void ExpectNoReport(); // Closure to run once all expected events are validated. @@ -148,7 +153,7 @@ std::string event_key_; std::string url_; - std::string trigger_; + absl::optional<std::string> trigger_ = absl::nullopt; absl::optional<enterprise_connectors::ContentAnalysisResponse::Result> dlp_verdict_ = absl::nullopt; absl::optional<std::string> threat_type_ = absl::nullopt; @@ -158,6 +163,8 @@ absl::optional<std::string> result_ = absl::nullopt; std::string username_; absl::optional<std::string> scan_id_ = absl::nullopt; + absl::optional<bool> is_federated_ = absl::nullopt; + absl::optional<std::string> federated_origin_ = absl::nullopt; // When multiple files generate events, we don't necessarily know in which // order they will be reported. As such, we use a map to ensure all of them
diff --git a/chrome/browser/service_sandbox_type.h b/chrome/browser/service_sandbox_type.h index 6627a1d..1165e32 100644 --- a/chrome/browser/service_sandbox_type.h +++ b/chrome/browser/service_sandbox_type.h
@@ -20,23 +20,6 @@ // This file maps service classes to sandbox types. See // ServiceProcessHost::Launch() for how these templates are consumed. -// chrome::mojom::RemovableStorageWriter -namespace chrome { -namespace mojom { -class RemovableStorageWriter; -} // namespace mojom -} // namespace chrome - -template <> -inline sandbox::policy::SandboxType -content::GetServiceSandboxType<chrome::mojom::RemovableStorageWriter>() { -#if defined(OS_WIN) - return sandbox::policy::SandboxType::kNoSandboxAndElevatedPrivileges; -#else - return sandbox::policy::SandboxType::kNoSandbox; -#endif // !defined(OS_WIN) -} - // chrome::mojom::UtilReadIcon #if defined(OS_WIN) namespace chrome { @@ -201,19 +184,4 @@ } #endif // !defined(OS_ANDROID) -// quarantine::mojom::Quarantine -#if defined(OS_WIN) -namespace quarantine { -namespace mojom { -class Quarantine; -} -} // namespace quarantine - -template <> -inline sandbox::policy::SandboxType -content::GetServiceSandboxType<quarantine::mojom::Quarantine>() { - return sandbox::policy::SandboxType::kNoSandbox; -} -#endif // defined(OS_WIN) - #endif // CHROME_BROWSER_SERVICE_SANDBOX_TYPE_H_
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/ChromeShareExtras.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/ChromeShareExtras.java index a8f9419..70f43b3 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/ChromeShareExtras.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/ChromeShareExtras.java
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser.share; +import androidx.annotation.IntDef; + import org.chromium.components.browser_ui.share.ShareParams; import org.chromium.content_public.browser.RenderFrameHost; import org.chromium.url.GURL; @@ -17,6 +19,18 @@ * used in more than one part of the Chromium codebase. */ public class ChromeShareExtras { + @IntDef({DetailedContentType.NOT_SPECIFIED, DetailedContentType.IMAGE, DetailedContentType.GIF, + DetailedContentType.HIGHLIGHTED_TEXT, DetailedContentType.SCREENSHOT, + DetailedContentType.WEB_NOTES}) + public @interface DetailedContentType { + int NOT_SPECIFIED = 0; + int IMAGE = 1; + int GIF = 2; + int HIGHLIGHTED_TEXT = 3; + int SCREENSHOT = 4; + int WEB_NOTES = 5; + } + /** * Whether to save the chosen activity for future direct sharing. */ @@ -41,9 +55,6 @@ /** Url of the content being shared. */ private final GURL mContentUrl; - /** Indicates if text property is highlighted by user. */ - private final boolean mIsUserHighlightedText; - /** Whether it is sharing a tab group. */ private final boolean mSharingTabGroup; @@ -56,21 +67,24 @@ private final RenderFrameHost mRenderFrameHost; + /** The detailed content type that is being shared. */ + @DetailedContentType + private final int mDetailedContentType; + private ChromeShareExtras(boolean saveLastUsed, boolean shareDirectly, - boolean isUrlOfVisiblePage, GURL imageSrcUrl, GURL contentUrl, - boolean isUserHighlightedText, boolean sharingTabGroup, + boolean isUrlOfVisiblePage, GURL imageSrcUrl, GURL contentUrl, boolean sharingTabGroup, boolean isReshareHighlightedText, boolean skipPageSharingActions, - RenderFrameHost renderFrameHost) { + RenderFrameHost renderFrameHost, @DetailedContentType int detailedContentType) { mSaveLastUsed = saveLastUsed; mShareDirectly = shareDirectly; mIsUrlOfVisiblePage = isUrlOfVisiblePage; mImageSrcUrl = imageSrcUrl == null ? GURL.emptyGURL() : imageSrcUrl; mContentUrl = contentUrl == null ? GURL.emptyGURL() : contentUrl; - mIsUserHighlightedText = isUserHighlightedText; mSharingTabGroup = sharingTabGroup; mIsReshareHighlightedText = isReshareHighlightedText; mSkipPageSharingActions = skipPageSharingActions; mRenderFrameHost = renderFrameHost; + mDetailedContentType = detailedContentType; } /** @@ -110,13 +124,6 @@ } /** - * @return Whether the URL is of the current visible page. - */ - public boolean isUserHighlightedText() { - return mIsUserHighlightedText; - } - - /** * @return Whether it is sharing a tab group. */ public boolean sharingTabGroup() { @@ -143,6 +150,13 @@ } /** + * @return The {@link DetailedContentType} of the content that is being shared. + */ + public int getDetailedContentType() { + return mDetailedContentType; + } + + /** * The builder for {@link ChromeShareExtras} objects. */ public static class Builder { @@ -151,11 +165,12 @@ private boolean mIsUrlOfVisiblePage; private GURL mImageSrcUrl; private GURL mContentUrl; - private boolean mIsUserHighlightedText; private boolean mSharingTabGroup; private boolean mIsReshareHighlightedText; private boolean mSkipPageSharingActions; private RenderFrameHost mRenderFrameHost; + @DetailedContentType + private int mDetailedContentType; /** * Sets whether to save the chosen activity for future direct sharing. @@ -207,14 +222,6 @@ } /** - * Sets whether text property is highlighted by user. - */ - public Builder setIsUserHighlightedText(boolean isUserHighlightedText) { - mIsUserHighlightedText = isUserHighlightedText; - return this; - } - - /** * Sets whether it is sharing a tab group. */ public Builder setSharingTabGroup(boolean sharingTabGroup) { @@ -232,10 +239,18 @@ return this; } + /** + * Sets the {@link DetailedContentType} of the content that is being shared. + */ + public Builder setDetailedContentType(@DetailedContentType int detailedContentType) { + mDetailedContentType = detailedContentType; + return this; + } + public ChromeShareExtras build() { return new ChromeShareExtras(mSaveLastUsed, mShareDirectly, mIsUrlOfVisiblePage, - mImageSrcUrl, mContentUrl, mIsUserHighlightedText, mSharingTabGroup, - mIsReshareHighlightedText, mSkipPageSharingActions, mRenderFrameHost); + mImageSrcUrl, mContentUrl, mSharingTabGroup, mIsReshareHighlightedText, + mSkipPageSharingActions, mRenderFrameHost, mDetailedContentType); } } }
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/link_to_text/LinkToTextCoordinator.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/link_to_text/LinkToTextCoordinator.java index 5f6feb4..d142d69 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/link_to_text/LinkToTextCoordinator.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/link_to_text/LinkToTextCoordinator.java
@@ -103,7 +103,7 @@ } public ShareParams getShareParams(@LinkToggleState int linkToggleState) { - if (linkToggleState == LinkToggleState.LINK) { + if (linkToggleState == LinkToggleState.LINK && mShareLinkParams != null) { return mShareLinkParams; } return mShareTextParams; @@ -134,7 +134,10 @@ .build(); mChromeOptionShareCallback.showThirdPartyShareSheet(params, - new ChromeShareExtras.Builder().setIsUserHighlightedText(true).build(), + new ChromeShareExtras.Builder() + .setDetailedContentType( + ChromeShareExtras.DetailedContentType.HIGHLIGHTED_TEXT) + .build(), System.currentTimeMillis()); if (selector.isEmpty()) {
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetMediator.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetMediator.java index 73d85b2f..8d74201 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetMediator.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetMediator.java
@@ -119,7 +119,11 @@ .build(); mChromeOptionShareCallback.showThirdPartyShareSheet(params, - new ChromeShareExtras.Builder().setContentUrl(new GURL(mShareUrl)).build(), + new ChromeShareExtras.Builder() + .setContentUrl(new GURL(mShareUrl)) + .setDetailedContentType( + ChromeShareExtras.DetailedContentType.SCREENSHOT) + .build(), System.currentTimeMillis()); };
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetBottomSheetContent.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetBottomSheetContent.java index 16e22d4..4522eec 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetBottomSheetContent.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetBottomSheetContent.java
@@ -32,7 +32,6 @@ import org.chromium.base.ContextUtils; import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.R; -import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.share.link_to_text.LinkToTextCoordinator.LinkGeneration; import org.chromium.chrome.browser.share.share_sheet.ShareSheetLinkToggleCoordinator.LinkToggleState; import org.chromium.chrome.browser.share.share_sheet.ShareSheetPropertyModelBuilder.ContentType; @@ -68,7 +67,7 @@ private ShareParams mParams; private ScrollView mContentScrollableView; private @LinkGeneration int mLinkGenerationState; - private @LinkToggleState int mLinkToggleState; + private @LinkToggleState Integer mLinkToggleState; private Toast mToast; /** @@ -91,8 +90,6 @@ // be set only for link to text. if (mParams.getLinkToTextSuccessful() == null) { mLinkGenerationState = LinkGeneration.MAX; - // TODO(crbug.com/1227203): change default enabled/disabled state - mLinkToggleState = LinkToggleState.LINK; } else { if (mParams.getLinkToTextSuccessful()) { mLinkGenerationState = LinkGeneration.LINK; @@ -119,11 +116,13 @@ * @param thirdPartyModels The PropertyModels used to build the bottom row. * @param contentTypes The {@link Set} of {@link ContentType}s to build the preview. * @param fileContentType The MIME type of the file(s) being shared. + * @param shareSheetLinkToggleCoordinator The {@link ShareSheetLinkToggleCoordinator} for + * whether to show the toggle and the default enabled status. */ void createRecyclerViews(List<PropertyModel> firstPartyModels, - List<PropertyModel> thirdPartyModels, Set<Integer> contentTypes, - String fileContentType) { - createPreview(contentTypes, fileContentType); + List<PropertyModel> thirdPartyModels, Set<Integer> contentTypes, String fileContentType, + ShareSheetLinkToggleCoordinator shareSheetLinkToggleCoordinator) { + createPreview(contentTypes, fileContentType, shareSheetLinkToggleCoordinator); createFirstPartyRecyclerViews(firstPartyModels); RecyclerView thirdParty = this.getContentView().findViewById(R.id.share_sheet_other_apps); @@ -211,7 +210,8 @@ } } - private void createPreview(Set<Integer> contentTypes, String fileContentType) { + private void createPreview(Set<Integer> contentTypes, String fileContentType, + ShareSheetLinkToggleCoordinator shareSheetLinkToggleCoordinator) { // Default preview is to show title + url. String title = mParams.getTitle(); String subtitle = @@ -241,7 +241,11 @@ fetchFavicon(mParams.getUrl()); } - if (shouldShowLinkToggle(contentTypes)) { + if (shareSheetLinkToggleCoordinator.shouldShowToggle()) { + if (mLinkToggleState == null) { + setDefaultToggleStatus( + shareSheetLinkToggleCoordinator.shouldEnableToggleByDefault()); + } setLinkToggleForPreview(contentTypes.contains(ContentType.HIGHLIGHTED_TEXT)); } @@ -353,15 +357,8 @@ mShareSheetCoordinator.updateShareSheetForLinkToggle(mLinkToggleState); } - private boolean shouldShowLinkToggle(Set<Integer> contentTypes) { - if (ChromeFeatureList.isEnabled(ChromeFeatureList.PREEMPTIVE_LINK_TO_TEXT_GENERATION) - && contentTypes.contains(ContentType.HIGHLIGHTED_TEXT)) { - return true; - } else if (ChromeFeatureList.isEnabled(ChromeFeatureList.SHARING_HUB_LINK_TOGGLE)) { - // TODO(crbug.com/1227203): don't show toggle for link shares - return true; - } - return false; + private void setDefaultToggleStatus(boolean enableToggleByDefault) { + mLinkToggleState = enableToggleByDefault ? LinkToggleState.LINK : LinkToggleState.NO_LINK; } private void setLinkToggleForPreview(boolean isHighlightedText) {
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java index ca205fae..5eef17a 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java
@@ -28,6 +28,7 @@ import org.chromium.chrome.browser.lifecycle.ConfigurationChangedObserver; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.share.ChromeShareExtras; +import org.chromium.chrome.browser.share.ChromeShareExtras.DetailedContentType; import org.chromium.chrome.browser.share.ShareHelper; import org.chromium.chrome.browser.share.ShareRankingBridge; import org.chromium.chrome.browser.share.link_to_text.LinkToTextCoordinator; @@ -166,12 +167,12 @@ mShareParams = params; mChromeShareExtras = chromeShareExtras; mActivity = params.getWindow().getActivity().get(); - // Update ShareSheetLinkToggleCoordinator if not a shared highlight. - if (mShareSheetLinkToggleCoordinator != null - && mShareParams.getLinkToTextSuccessful() == null) { + if (mShareSheetLinkToggleCoordinator != null) { mShareSheetLinkToggleCoordinator.setShareParamsAndExtras(params, chromeShareExtras); - // TODO(crbug.com/1227203): set default enabled/disabled status depending on share type - mShareParams = mShareSheetLinkToggleCoordinator.getShareParams(LinkToggleState.LINK); + int linkToggleState = mShareSheetLinkToggleCoordinator.shouldEnableToggleByDefault() + ? LinkToggleState.LINK + : LinkToggleState.NO_LINK; + mShareParams = mShareSheetLinkToggleCoordinator.getShareParams(linkToggleState); } if (mActivity == null) return; @@ -227,8 +228,8 @@ private void finishUpdateShareSheet(List<PropertyModel> firstPartyApps, List<PropertyModel> thirdPartyApps, @Nullable Runnable onUpdateFinished) { - mBottomSheet.createRecyclerViews( - firstPartyApps, thirdPartyApps, mContentTypes, mShareParams.getFileContentType()); + mBottomSheet.createRecyclerViews(firstPartyApps, thirdPartyApps, mContentTypes, + mShareParams.getFileContentType(), mShareSheetLinkToggleCoordinator); if (onUpdateFinished != null) { onUpdateFinished.run(); } @@ -255,7 +256,8 @@ public void showInitialShareSheet( ShareParams params, ChromeShareExtras chromeShareExtras, long shareStartTime) { if (ChromeFeatureList.isEnabled(ChromeFeatureList.PREEMPTIVE_LINK_TO_TEXT_GENERATION) - && chromeShareExtras.isUserHighlightedText()) { + && chromeShareExtras.getDetailedContentType() + == DetailedContentType.HIGHLIGHTED_TEXT) { if (!chromeShareExtras.isReshareHighlightedText()) { LinkToTextMetricsHelper.recordLinkToTextDiagnoseStatus( LinkToTextMetricsHelper.LinkToTextDiagnoseStatus
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetLinkToggleCoordinator.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetLinkToggleCoordinator.java index e5e1378..44c0a72 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetLinkToggleCoordinator.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetLinkToggleCoordinator.java
@@ -4,12 +4,11 @@ package org.chromium.chrome.browser.share.share_sheet; -import android.text.TextUtils; - import androidx.annotation.IntDef; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.share.ChromeShareExtras; +import org.chromium.chrome.browser.share.ChromeShareExtras.DetailedContentType; import org.chromium.chrome.browser.share.link_to_text.LinkToTextCoordinator; import org.chromium.components.browser_ui.share.ShareParams; import org.chromium.url.GURL; @@ -66,10 +65,13 @@ mShouldEnableLinkToTextToggle = (ChromeFeatureList.isEnabled(ChromeFeatureList.PREEMPTIVE_LINK_TO_TEXT_GENERATION) || ChromeFeatureList.isEnabled(ChromeFeatureList.SHARING_HUB_LINK_TOGGLE)) - && mLinkToTextCoordinator != null && chromeShareExtras.isUserHighlightedText(); + && mLinkToTextCoordinator != null + && chromeShareExtras.getDetailedContentType() + == DetailedContentType.HIGHLIGHTED_TEXT; mShouldEnableGenericToggle = ChromeFeatureList.isEnabled(ChromeFeatureList.SHARING_HUB_LINK_TOGGLE) - && TextUtils.isEmpty(shareParams.getUrl()) && mUrl != null && !mUrl.isEmpty(); + && mChromeShareExtras.getDetailedContentType() != DetailedContentType.NOT_SPECIFIED + && mUrl != null && !mUrl.isEmpty(); } /** @@ -89,12 +91,30 @@ return mShareParams; } + boolean shouldShowToggle() { + return mShouldEnableLinkToTextToggle || mShouldEnableGenericToggle; + } + + boolean shouldEnableToggleByDefault() { + boolean enableToggleByDefault = false; + switch (mChromeShareExtras.getDetailedContentType()) { + case DetailedContentType.IMAGE: + case DetailedContentType.HIGHLIGHTED_TEXT: + case DetailedContentType.SCREENSHOT: + case DetailedContentType.WEB_NOTES: + enableToggleByDefault = true; + break; + case DetailedContentType.NOT_SPECIFIED: + case DetailedContentType.GIF: + enableToggleByDefault = false; + break; + } + return enableToggleByDefault; + } + private void showShareSheet() { if (mShouldEnableLinkToTextToggle) { mLinkToTextCoordinator.shareLinkToText(); - } else if (mShouldEnableGenericToggle) { - mChromeOptionShareCallback.showShareSheet( - getShareParams(LinkToggleState.LINK), mChromeShareExtras, mShareStartTime); } else { mChromeOptionShareCallback.showShareSheet( mShareParams, mChromeShareExtras, mShareStartTime);
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetPropertyModelBuilder.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetPropertyModelBuilder.java index c56cfd10..0a7d38e 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetPropertyModelBuilder.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetPropertyModelBuilder.java
@@ -20,6 +20,7 @@ import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.share.ChromeShareExtras; +import org.chromium.chrome.browser.share.ChromeShareExtras.DetailedContentType; import org.chromium.chrome.browser.share.ShareHelper; import org.chromium.chrome.browser.share.link_to_text.LinkToTextCoordinator.LinkGeneration; import org.chromium.chrome.browser.share.link_to_text.LinkToTextMetricsHelper; @@ -125,7 +126,8 @@ } } if (!TextUtils.isEmpty(params.getText())) { - if (chromeShareExtras.isUserHighlightedText()) { + if (chromeShareExtras.getDetailedContentType() + == DetailedContentType.HIGHLIGHTED_TEXT) { contentTypes.add(ContentType.HIGHLIGHTED_TEXT); } else { contentTypes.add(ContentType.TEXT);
diff --git a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetBottomSheetContentTest.java b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetBottomSheetContentTest.java index 3466d5d..a71149a 100644 --- a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetBottomSheetContentTest.java +++ b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetBottomSheetContentTest.java
@@ -24,6 +24,8 @@ import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import org.chromium.chrome.R; import org.chromium.chrome.browser.share.share_sheet.ShareSheetPropertyModelBuilder.ContentType; @@ -52,6 +54,9 @@ new ThemedDummyUiActivityTestRule<>( DummyUiActivity.class, R.style.ColorOverlay_ChromiumAndroid); + @Mock + private ShareSheetLinkToggleCoordinator mShareSheetLinkToggleCoordinator; + private static final Bitmap.Config sConfig = Bitmap.Config.ALPHA_8; private static final Uri sImageUri = Uri.parse("content://testImage.png"); private static final String sText = "Text"; @@ -65,6 +70,7 @@ @Before public void setUp() { + MockitoAnnotations.initMocks(this); mActivityTestRule.launchActivity(null); mActivity = mActivityTestRule.getActivity(); mPreviewUrl = UrlFormatter.formatUrlForDisplayOmitSchemeOmitTrivialSubdomains(sUrl); @@ -90,7 +96,8 @@ .build()); shareSheetBottomSheetContent.createRecyclerViews(ImmutableList.of(), ImmutableList.of(), - ImmutableSet.of(ContentType.IMAGE), fileContentType); + ImmutableSet.of(ContentType.IMAGE), fileContentType, + mShareSheetLinkToggleCoordinator); TextView titleView = shareSheetBottomSheetContent.getContentView().findViewById(R.id.title_preview); @@ -113,7 +120,8 @@ .build()); shareSheetBottomSheetContent.createRecyclerViews(ImmutableList.of(), ImmutableList.of(), - ImmutableSet.of(ContentType.IMAGE), fileContentType); + ImmutableSet.of(ContentType.IMAGE), fileContentType, + mShareSheetLinkToggleCoordinator); TextView titleView = shareSheetBottomSheetContent.getContentView().findViewById(R.id.title_preview); @@ -127,7 +135,8 @@ @MediumTest public void createRecyclerViews_highlightedTextShare() { mShareSheetBottomSheetContent.createRecyclerViews(ImmutableList.of(), ImmutableList.of(), - ImmutableSet.of(ContentType.HIGHLIGHTED_TEXT), ""); + ImmutableSet.of(ContentType.HIGHLIGHTED_TEXT), "", + mShareSheetLinkToggleCoordinator); TextView titleView = mShareSheetBottomSheetContent.getContentView().findViewById(R.id.title_preview); @@ -140,8 +149,8 @@ @Test @MediumTest public void createRecyclerViews_textOnlyShare() { - mShareSheetBottomSheetContent.createRecyclerViews( - ImmutableList.of(), ImmutableList.of(), ImmutableSet.of(ContentType.TEXT), ""); + mShareSheetBottomSheetContent.createRecyclerViews(ImmutableList.of(), ImmutableList.of(), + ImmutableSet.of(ContentType.TEXT), "", mShareSheetLinkToggleCoordinator); TextView titleView = mShareSheetBottomSheetContent.getContentView().findViewById(R.id.title_preview); @@ -155,7 +164,8 @@ @MediumTest public void createRecyclerViews_producesCorrectFavicon() { mShareSheetBottomSheetContent.createRecyclerViews(ImmutableList.of(), ImmutableList.of(), - ImmutableSet.of(ContentType.LINK_PAGE_VISIBLE), ""); + ImmutableSet.of(ContentType.LINK_PAGE_VISIBLE), "", + mShareSheetLinkToggleCoordinator); ImageView imageView = mShareSheetBottomSheetContent.getContentView().findViewById(R.id.image_preview); @@ -172,7 +182,8 @@ @MediumTest public void createRecyclerViews_tabShare() { mShareSheetBottomSheetContent.createRecyclerViews(ImmutableList.of(), ImmutableList.of(), - ImmutableSet.of(ContentType.LINK_PAGE_VISIBLE), ""); + ImmutableSet.of(ContentType.LINK_PAGE_VISIBLE), "", + mShareSheetLinkToggleCoordinator); TextView titleView = mShareSheetBottomSheetContent.getContentView().findViewById(R.id.title_preview); @@ -189,7 +200,8 @@ @MediumTest public void createRecyclerViews_webShareTextAndUrl() { mShareSheetBottomSheetContent.createRecyclerViews(ImmutableList.of(), ImmutableList.of(), - ImmutableSet.of(ContentType.LINK_PAGE_NOT_VISIBLE, ContentType.TEXT), ""); + ImmutableSet.of(ContentType.LINK_PAGE_NOT_VISIBLE, ContentType.TEXT), "", + mShareSheetLinkToggleCoordinator); TextView titleView = mShareSheetBottomSheetContent.getContentView().findViewById(R.id.title_preview); @@ -210,7 +222,8 @@ new ShareParams.Builder(/*window=*/null, /*title=*/"", sUrl).build()); shareSheetBottomSheetContent.createRecyclerViews(ImmutableList.of(), ImmutableList.of(), - ImmutableSet.of(ContentType.LINK_PAGE_NOT_VISIBLE), ""); + ImmutableSet.of(ContentType.LINK_PAGE_NOT_VISIBLE), "", + mShareSheetLinkToggleCoordinator); TextView titleView = shareSheetBottomSheetContent.getContentView().findViewById(R.id.title_preview);
diff --git a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetLinkToggleCoordinatorTest.java b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetLinkToggleCoordinatorTest.java index 3e3070fb7..a7bfb1c 100644 --- a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetLinkToggleCoordinatorTest.java +++ b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetLinkToggleCoordinatorTest.java
@@ -5,6 +5,7 @@ package org.chromium.chrome.browser.share.share_sheet; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; @@ -23,6 +24,7 @@ import org.chromium.base.test.util.JniMocker; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.share.ChromeShareExtras; +import org.chromium.chrome.browser.share.ChromeShareExtras.DetailedContentType; import org.chromium.chrome.browser.share.link_to_text.LinkToTextCoordinator; import org.chromium.chrome.browser.share.share_sheet.ShareSheetLinkToggleCoordinator.LinkToggleState; import org.chromium.chrome.test.util.browser.Features; @@ -91,6 +93,7 @@ new ShareParams.Builder(/*window=*/null, /*title=*/"", "").build(); ChromeShareExtras chromeShareExtras = new ChromeShareExtras.Builder() + .setDetailedContentType(DetailedContentType.IMAGE) .setContentUrl(JUnitTestGURLs.getGURL(JUnitTestGURLs.EXAMPLE_URL)) .build(); ShareSheetLinkToggleCoordinator shareSheetLinkToggleCoordinator = @@ -110,6 +113,7 @@ ChromeShareExtras chromeShareExtras = new ChromeShareExtras.Builder() .setContentUrl(JUnitTestGURLs.getGURL(JUnitTestGURLs.EXAMPLE_URL)) + .setDetailedContentType(DetailedContentType.IMAGE) .build(); ShareSheetLinkToggleCoordinator shareSheetLinkToggleCoordinator = new ShareSheetLinkToggleCoordinator(shareParams, chromeShareExtras, /*startTime=*/ @@ -139,7 +143,9 @@ ShareParams shareParams = new ShareParams.Builder(/*window=*/null, /*title=*/"", "").setText("text").build(); ChromeShareExtras chromeShareExtras = - new ChromeShareExtras.Builder().setIsUserHighlightedText(true).build(); + new ChromeShareExtras.Builder() + .setDetailedContentType(DetailedContentType.HIGHLIGHTED_TEXT) + .build(); ShareSheetLinkToggleCoordinator shareSheetLinkToggleCoordinator = new ShareSheetLinkToggleCoordinator(shareParams, chromeShareExtras, /*startTime=*/ 0, mLinkToTextCoordinator, mShareCallback); @@ -147,4 +153,123 @@ assertEquals("ShareParams should include the link.", JUnitTestGURLs.EXAMPLE_URL, shareSheetLinkToggleCoordinator.getShareParams(LinkToggleState.LINK).getUrl()); } + + @Test + public void shouldShowToggle_noDetailedContentType_returnsFalse() { + ShareParams shareParams = + new ShareParams.Builder(/*window=*/null, /*title=*/"", JUnitTestGURLs.EXAMPLE_URL) + .build(); + ChromeShareExtras chromeShareExtras = + new ChromeShareExtras.Builder() + .setContentUrl(JUnitTestGURLs.getGURL(JUnitTestGURLs.EXAMPLE_URL)) + .build(); + ShareSheetLinkToggleCoordinator shareSheetLinkToggleCoordinator = + new ShareSheetLinkToggleCoordinator(shareParams, chromeShareExtras, /*startTime=*/ + 0, /*linkToTextCoordinator=*/null, mShareCallback); + + assertFalse("Should not show toggle.", shareSheetLinkToggleCoordinator.shouldShowToggle()); + } + + @Test + public void shouldShowToggle_noContentUrl_returnsFalse() { + ShareParams shareParams = + new ShareParams.Builder(/*window=*/null, /*title=*/"", /*url=*/"").build(); + ChromeShareExtras chromeShareExtras = + new ChromeShareExtras.Builder() + .setDetailedContentType(DetailedContentType.IMAGE) + .build(); + ShareSheetLinkToggleCoordinator shareSheetLinkToggleCoordinator = + new ShareSheetLinkToggleCoordinator(shareParams, chromeShareExtras, /*startTime=*/ + 0, /*linkToTextCoordinator=*/null, mShareCallback); + + assertFalse("Should not show toggle.", shareSheetLinkToggleCoordinator.shouldShowToggle()); + } + + @Test + public void shouldShowToggle_contentUrlAndDetailedContentType_returnsTrue() { + ShareParams shareParams = + new ShareParams.Builder(/*window=*/null, /*title=*/"", /*url=*/"").build(); + ChromeShareExtras chromeShareExtras = + new ChromeShareExtras.Builder() + .setDetailedContentType(DetailedContentType.IMAGE) + .setContentUrl(JUnitTestGURLs.getGURL(JUnitTestGURLs.EXAMPLE_URL)) + .build(); + ShareSheetLinkToggleCoordinator shareSheetLinkToggleCoordinator = + new ShareSheetLinkToggleCoordinator(shareParams, chromeShareExtras, /*startTime=*/ + 0, /*linkToTextCoordinator=*/null, mShareCallback); + + assertTrue("Should show toggle.", shareSheetLinkToggleCoordinator.shouldShowToggle()); + } + + @Test + public void shouldShowToggle_linkToText_returnsTrue() { + ShareParams shareParams = + new ShareParams.Builder(/*window=*/null, /*title=*/"", /*url=*/"").build(); + ChromeShareExtras chromeShareExtras = + new ChromeShareExtras.Builder() + .setDetailedContentType(DetailedContentType.HIGHLIGHTED_TEXT) + .build(); + ShareSheetLinkToggleCoordinator shareSheetLinkToggleCoordinator = + new ShareSheetLinkToggleCoordinator(shareParams, chromeShareExtras, /*startTime=*/ + 0, mLinkToTextCoordinator, mShareCallback); + + assertTrue("Should show toggle.", shareSheetLinkToggleCoordinator.shouldShowToggle()); + } + + @Test + public void shouldEnableToggleByDefault_false() { + ShareParams shareParams = + new ShareParams.Builder(/*window=*/null, /*title=*/"", /*url=*/"").build(); + ChromeShareExtras chromeShareExtras = new ChromeShareExtras.Builder().build(); + ShareSheetLinkToggleCoordinator shareSheetLinkToggleCoordinator = + new ShareSheetLinkToggleCoordinator(shareParams, chromeShareExtras, /*startTime=*/ + 0, mLinkToTextCoordinator, mShareCallback); + + assertFalse("Should not enable toggle by default.", + shareSheetLinkToggleCoordinator.shouldEnableToggleByDefault()); + + shareSheetLinkToggleCoordinator.setShareParamsAndExtras(shareParams, + new ChromeShareExtras.Builder() + .setDetailedContentType(DetailedContentType.GIF) + .build()); + assertFalse("Should not enable toggle by default.", + shareSheetLinkToggleCoordinator.shouldEnableToggleByDefault()); + } + + @Test + public void shouldEnableToggleByDefault_true() { + ShareParams shareParams = + new ShareParams.Builder(/*window=*/null, /*title=*/"", /*url=*/"").build(); + ChromeShareExtras chromeShareExtras = + new ChromeShareExtras.Builder() + .setDetailedContentType(DetailedContentType.IMAGE) + .build(); + ShareSheetLinkToggleCoordinator shareSheetLinkToggleCoordinator = + new ShareSheetLinkToggleCoordinator(shareParams, chromeShareExtras, /*startTime=*/ + 0, mLinkToTextCoordinator, mShareCallback); + + assertTrue("Should enable toggle by default.", + shareSheetLinkToggleCoordinator.shouldEnableToggleByDefault()); + + shareSheetLinkToggleCoordinator.setShareParamsAndExtras(shareParams, + new ChromeShareExtras.Builder() + .setDetailedContentType(DetailedContentType.HIGHLIGHTED_TEXT) + .build()); + assertTrue("Should enable toggle by default.", + shareSheetLinkToggleCoordinator.shouldEnableToggleByDefault()); + + shareSheetLinkToggleCoordinator.setShareParamsAndExtras(shareParams, + new ChromeShareExtras.Builder() + .setDetailedContentType(DetailedContentType.SCREENSHOT) + .build()); + assertTrue("Should enable toggle by default.", + shareSheetLinkToggleCoordinator.shouldEnableToggleByDefault()); + + shareSheetLinkToggleCoordinator.setShareParamsAndExtras(shareParams, + new ChromeShareExtras.Builder() + .setDetailedContentType(DetailedContentType.WEB_NOTES) + .build()); + assertTrue("Should enable toggle by default.", + shareSheetLinkToggleCoordinator.shouldEnableToggleByDefault()); + } }
diff --git a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetPropertyModelBuilderTest.java b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetPropertyModelBuilderTest.java index 2d0dfe2..b0ef163 100644 --- a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetPropertyModelBuilderTest.java +++ b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetPropertyModelBuilderTest.java
@@ -35,6 +35,7 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.share.ChromeShareExtras; +import org.chromium.chrome.browser.share.ChromeShareExtras.DetailedContentType; import org.chromium.chrome.browser.share.link_to_text.LinkToTextCoordinator.LinkGeneration; import org.chromium.chrome.browser.share.share_sheet.ShareSheetPropertyModelBuilder.ContentType; import org.chromium.chrome.test.ChromeBrowserTestRule; @@ -70,14 +71,10 @@ @Mock private Profile mProfile; @Mock - private ShareParams mParams; - @Mock private ResolveInfo mTextResolveInfo1; @Mock private ResolveInfo mTextResolveInfo2; @Mock - private ResolveInfo mTextResolveInfo3; - @Mock private ResolveInfo mImageResolveInfo1; @Mock private ResolveInfo mImageResolveInfo2; @@ -171,7 +168,9 @@ public void getContentTypes_UrlDifferentFromText_hasHighlightedTextContentType() { ShareParams shareParams = new ShareParams.Builder(null, "", "").setText("testText").build(); ChromeShareExtras shareExtras = - new ChromeShareExtras.Builder().setIsUserHighlightedText(true).build(); + new ChromeShareExtras.Builder() + .setDetailedContentType(DetailedContentType.HIGHLIGHTED_TEXT) + .build(); assertEquals("Should contain HIGHLIGHTED_TEXT.", ImmutableSet.of(ContentType.HIGHLIGHTED_TEXT),
diff --git a/chrome/browser/share/core/resources/share_targets.asciipb b/chrome/browser/share/core/resources/share_targets.asciipb index 8343a23..f0c7a850 100644 --- a/chrome/browser/share/core/resources/share_targets.asciipb +++ b/chrome/browser/share/core/resources/share_targets.asciipb
@@ -5,7 +5,7 @@ ## ## Top level settings ## -version_id: 5 +version_id: 6 ## ## Share Targets @@ -361,7 +361,7 @@ targets { nickname: "LinkedIn" - url: "http://www.linkedi n.com/shareArticle?url=%(escaped_url)&title=%(escaped_title)" + url: "http://www.linkedin.com/shareArticle?url=%(escaped_url)&title=%(escaped_title)" icon: "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAA" "AERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKAC"
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java index 879327f..2190ab4 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java
@@ -125,6 +125,10 @@ mProfileSupplier.removeObserver(mProfileChangeCallback); mQueryTileCoordinator.destroy(); mMediator.destroy(); + if (mDropdown != null) { + mDropdown.destroy(); + mDropdown = null; + } } private ViewProvider<SuggestionListViewHolder> createViewProvider(
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java index 449e4ca..2c50f9b 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java
@@ -166,6 +166,19 @@ return this; } + /** Clean up resources and remove observers installed by this class. */ + public void destroy() { + getRecycledViewPool().clear(); + mObserver = null; + + mAnchorView.getViewTreeObserver().removeOnGlobalLayoutListener(mAnchorViewLayoutListener); + if (mAlignmentView != null) { + mAlignmentView.removeOnLayoutChangeListener(mAlignmentViewLayoutListener); + } + mAlignmentView = null; + mAlignmentViewLayoutListener = null; + } + /** * Sets the observer of suggestion list. * @param observer an observer of this list.
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd index 6e44b34..e626b2b442 100644 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -1220,8 +1220,8 @@ <message name="IDS_APP_LANGUAGE_TITLE" desc="Title of Language settings section to change Chrome’s user interface language. [CHAR_LIMIT=32]"> <ph name="APP_NAME">%1$s<ex>Chrome</ex></ph>’s language </message> - <message name="IDS_DEFAULT_LANG_SUBTITLE" desc="Subtite to use for the device’s default language. [CHAR_LIMIT=42]"> - Default device language + <message name="IDS_DEFAULT_LANG_SUBTITLE" desc="Subtitle to use for the device’s current language. [CHAR_LIMIT=42]"> + Current device language </message> <message name="IDS_ADD_LANGUAGE" desc="Title for the screen that allows users to add languages to their preferred language list. [CHAR_LIMIT=32]"> Add language @@ -1235,7 +1235,7 @@ <message name="IDS_LANGUAGES_SELECT_SUGGESTED" desc="Title appearing above list of languages ordered based on what users in that country might select. [CHAR_LIMIT=32]"> Suggested languages </message> - <message name="IDS_LANGUAGES_SELECT_OTHER" desc="Subtite appearing above list of all languages not likely to be selected by users in that country. [CHAR_LIMIT=32]"> + <message name="IDS_LANGUAGES_SELECT_OTHER" desc="Subtitle appearing above list of all languages not likely to be selected by users in that country. [CHAR_LIMIT=32]"> Other languages </message> <message name="IDS_LANGUAGES_CONTENT_TITLE" desc="Title of Language settings section to add or remove preferred content languages. Content languages are selected by the user and tell Chrome what language the user prefers webpage content in. [CHAR_LIMIT=32]">
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DEFAULT_LANG_SUBTITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DEFAULT_LANG_SUBTITLE.png.sha1 index 77e1f64..c67f56cd 100644 --- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DEFAULT_LANG_SUBTITLE.png.sha1 +++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DEFAULT_LANG_SUBTITLE.png.sha1
@@ -1 +1 @@ -63fc1342c2c5fca453bab2fda7a228f3157a1024 \ No newline at end of file +cfab78e2181b7fb3be9efd72cfda886deb7d552c \ No newline at end of file
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 0aa70b18..21aee59 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Bekyk</translation> <translation id="4860895144060829044">Bel</translation> <translation id="4864369630010738180">Meld tans aan …</translation> -<translation id="4865987431642283918">Verstektoesteltaal</translation> <translation id="4866368707455379617">Kan nie <ph name="MODULE" /> vir Chrome installeer nie</translation> <translation id="4875775213178255010">Inhoudvoorstelle</translation> <translation id="4877678010818027629">Gebruik Incognitomodus</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 59b622b..2b710d6 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">አሳይ</translation> <translation id="4860895144060829044">ደውል</translation> <translation id="4864369630010738180">በመግባት ላይ...</translation> -<translation id="4865987431642283918">ነባሪ የመሣሪያ ቋንቋ</translation> <translation id="4866368707455379617"><ph name="MODULE" /> ን ለChrome ለመጫን አልተቻለም</translation> <translation id="4875775213178255010">የይዘት አስተያየት ጥቆማዎች</translation> <translation id="4877678010818027629">ማንነት የማያሳውቅ ሁነታ ውስጥ ይግቡ</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 d2ef728..9f3f45b9 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">عرض</translation> <translation id="4860895144060829044">اتصال</translation> <translation id="4864369630010738180">جارٍ تسجيل الدخول...</translation> -<translation id="4865987431642283918">لغة الجهاز التلقائية</translation> <translation id="4866368707455379617">تعذر تثبيت <ph name="MODULE" /> لمتصفِّح Chrome</translation> <translation id="4875775213178255010">اقتراحات المحتوى</translation> <translation id="4877678010818027629">الدخول إلى وضع التصفُّح المتخفي</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 0c7f74d..06e635b 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
@@ -605,7 +605,6 @@ <translation id="4850886885716139402">চাওক</translation> <translation id="4860895144060829044">কল কৰক</translation> <translation id="4864369630010738180">ছাইন ইন কৰি থকা হৈছে…</translation> -<translation id="4865987431642283918">ডিভাইচৰ ডিফ’ল্ট ভাষা</translation> <translation id="4866368707455379617">Chromeৰ কাৰণে <ph name="MODULE" /> ইনষ্টল কৰিব পৰা নগ’ল</translation> <translation id="4875775213178255010">সমলৰ পৰামৰ্শ</translation> <translation id="4877678010818027629">ইনক’গনিট’ ম’ডলৈ যাওক</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 8f0c32b..d6f56283 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
@@ -181,6 +181,7 @@ <translation id="2158408438301413340">Chrome bütün parolları yoxlaya bilmədi</translation> <translation id="2169830938017475061">İndi</translation> <translation id="2172688499998841696">Şəkil təsvirləri deaktivdir</translation> +<translation id="2172905120685242547">Pəncərə bağlansın?</translation> <translation id="2175927920773552910">QR Kod</translation> <translation id="218608176142494674">Paylaşım</translation> <translation id="2195339740518523951">Chrome’un ən güclü təhlükəsizlik səviyyəsini əldə edin</translation> @@ -280,6 +281,7 @@ <translation id="2779651927720337254">alınmadı</translation> <translation id="2781151931089541271">1 saniyə qaldı</translation> <translation id="2788468313014644040">Qrup nömrəsi</translation> +<translation id="2800066122460699237"><ph name="TAB_TITLE" /> tabı bağlanacaq</translation> <translation id="2801022321632964776">Chrome'un ən son versiyasında öz dilinizdən istifadə etmək üçün güncəlləyin</translation> <translation id="2805756323405976993">Tətbiq</translation> <translation id="2806840421670364300">FLoC</translation> @@ -288,6 +290,7 @@ <translation id="2827278682606527653">Təchizat kartı menyusu yarı hündürlükdədir</translation> <translation id="2830783625999891985">Mübadilə buferindəki kontent gizlədilib</translation> <translation id="2839327205551510876"><ph name="SITE_NAME" /> izləmədən çıxarıldı</translation> +<translation id="2840810876587895427">{TAB_COUNT,plural, =1{<ph name="TAB_COUNT_ONE" /> anonim tab bağlanacaq}other{<ph name="TAB_COUNT_MANY" /> anonim tab bağlanacaq}}</translation> <translation id="2841216154655874070">{NUM_DAYS,plural, =1{1 gün əvvəl yoxlanılıb}other{# gün əvvəl yoxlanılıb}}</translation> <translation id="2842985007712546952">Ana qovluq</translation> <translation id="2856503607207334158">Daxil olmaq alınmadı</translation> @@ -605,7 +608,6 @@ <translation id="4850886885716139402">Görünüş</translation> <translation id="4860895144060829044">Zəng</translation> <translation id="4864369630010738180">Daxil olunur...</translation> -<translation id="4865987431642283918">Defolt cihaz dili</translation> <translation id="4866368707455379617">Chrome üçün <ph name="MODULE" /> quraşdırmaq mümkün deyil</translation> <translation id="4875775213178255010">Kontent Təklifləri</translation> <translation id="4877678010818027629">Anonim rejimə daxil olun</translation> @@ -673,6 +675,7 @@ <translation id="5222676887888702881">Hesabdan çıxın</translation> <translation id="5227554086496586518">Axtarış nəticələrini görmək üçün toxunun</translation> <translation id="5233638681132016545">Yeni panel</translation> +<translation id="5235196193381275927">Giriş zamanı xəta baş verdi</translation> <translation id="5246093389635966745">Alətlər panelinin redaktəsi qısayolu</translation> <translation id="5250483651202458397">Skrinşot. Bağlamaq üçün toxunun.</translation> <translation id="5262378156578470238">Bu endirmə <ph name="DATE" /> tarixində başlayanda bildiriş görəcəksiniz.</translation> @@ -894,6 +897,7 @@ <translation id="6541983376925655882">{NUM_HOURS,plural, =1{1 saat əvvəl yoxlanılıb}other{# saat əvvəl yoxlanılıb}}</translation> <translation id="6545017243486555795">Bütün Datanı Silin</translation> <translation id="6546511553472444032">Fayl zərərli ola bilər</translation> +<translation id="6556542240154580383">{TAB_COUNT,plural, =1{<ph name="TAB_TITLE" /> və digər <ph name="TAB_COUNT_ONE" /> tab bağlanacaq}other{<ph name="TAB_TITLE" /> və digər <ph name="TAB_COUNT_MANY" /> tab bağlanacaq}}</translation> <translation id="6560414384669816528">Sogou ilə axtarış</translation> <translation id="656065428026159829">Daha çoxuna baxın</translation> <translation id="6565959834589222080">Wi-Fi əlçatan olduqda istifadə edilir</translation> @@ -934,6 +938,7 @@ <translation id="6767294960381293877">Yarı hündürlükdə açılan tabı paylaşa biləcəyiniz cihazların siyahısı.</translation> <translation id="6783942555455976443">Bu səhifəyə daha sonra baxmaq üçün yadda saxlayın və xatırladıcı qəbul edin</translation> <translation id="6795633245022906657">Cəld yeni tab açın. Bu qısayolu redaktə etmək üçün Ayarlara keçin.</translation> +<translation id="6802555630140434547">Bu pəncərə bağlanacaq</translation> <translation id="6811034713472274749">Səhifəyə baxa bilərsiniz</translation> <translation id="6813446258015311409">Chrome'a giriş açılıb.</translation> <translation id="6817747507826986771">Bu səhifəni cəld paylaşın. Bu qısayolu redaktə etmək üçün toxunub saxlayın.</translation> @@ -1161,6 +1166,7 @@ <translation id="8109613176066109935">Bütün cihazlarınızda əlfəcinləri əldə etmək üçün sinxronizasiyanı aktiv edin</translation> <translation id="8110087112193408731">Digital Sağlamlıqda Chrome fəaliyyəti göstərilsin?</translation> <translation id="8127542551745560481">Əsas səhifəni redaktə edin</translation> +<translation id="8130309322784422030">Saxladığınız giriş məlumatları köhnəlmiş ola bilər</translation> <translation id="813082847718468539">Sayt məlumatına baxın</translation> <translation id="8137558756159375272">"Axtarmaq üçün Toxunun" funksiyası seçilmiş sözü və cari səhifəni Google Axtarışa göndərir. <ph name="BEGIN_LINK" />Ayarlarda<ph name="END_LINK" /> onu deaktiv edə bilərsiniz.</translation> <translation id="8153351135626613369">Assistent dəstəklənən veb saytlarda sizə kömək edə biləcəyini aşkarladıqda görünəcək</translation> @@ -1291,6 +1297,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> - Bu dili endirmək mümkün olmadı. Sonra cəhd edin.</translation> <translation id="8951232171465285730">Chrome <ph name="MEGABYTES" /> MB qədər yaddaşa qənaət etdi</translation> <translation id="8965591936373831584">gözlənilir</translation> +<translation id="8968085728801125376">{TAB_COUNT,plural, =1{<ph name="INCOGNITO_TAB_COUNT" /> anonim və digər <ph name="TAB_COUNT_ONE" /> tab bağlanacaq}other{<ph name="INCOGNITO_TAB_COUNT" /> anonim və digər <ph name="TAB_COUNT_MANY" /> tab bağlanacaq}}</translation> <translation id="8970887620466824814">Xəta baş verdi.</translation> <translation id="8972098258593396643">Defolt qovluğa endirilsin?</translation> <translation id="8987641763863173640">Video Önizləmə Ayarlarını İdarə Edin</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 f2b6542..c719d513 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Праглядзець</translation> <translation id="4860895144060829044">Выклік</translation> <translation id="4864369630010738180">Уваход...</translation> -<translation id="4865987431642283918">Стандартная мова прылады</translation> <translation id="4866368707455379617">Не ўдалося ўсталяваць модуль "<ph name="MODULE" />" для Chrome</translation> <translation id="4875775213178255010">Рэкамендацыі змесціва</translation> <translation id="4877678010818027629">Увайсці ў рэжым інкогніта</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 a2d4f49..1658d70 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Изглед</translation> <translation id="4860895144060829044">Обаждане</translation> <translation id="4864369630010738180">Извършва се влизане...</translation> -<translation id="4865987431642283918">Основният език на устройството</translation> <translation id="4866368707455379617">Модулът „<ph name="MODULE" />“ за Chrome не може да се инсталира</translation> <translation id="4875775213178255010">Предложения за съдържание</translation> <translation id="4877678010818027629">Влизане в режим „инкогнито“</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 6f472f5..4878e6b 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
@@ -607,7 +607,6 @@ <translation id="4850886885716139402">দেখুন</translation> <translation id="4860895144060829044">কল করুন</translation> <translation id="4864369630010738180">প্রবেশ করা হচ্ছে...</translation> -<translation id="4865987431642283918">ডিভাইসের ডিফল্ট ভাষা</translation> <translation id="4866368707455379617">Chrome-এর জন্য <ph name="MODULE" /> ইনস্টল করা যাচ্ছে না</translation> <translation id="4875775213178255010">কন্টেন্টের প্রস্তাবনা</translation> <translation id="4877678010818027629">ছদ্মবেশী মোড চালু করুন</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 52fff8e..31d49e8 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Prikaz</translation> <translation id="4860895144060829044">Pozovi</translation> <translation id="4864369630010738180">Prijavljivanje…</translation> -<translation id="4865987431642283918">Zadani jezik uređaja</translation> <translation id="4866368707455379617">Nije moguće instalirati modul <ph name="MODULE" /> za Chrome</translation> <translation id="4875775213178255010">Prijedlozi za sadržaj</translation> <translation id="4877678010818027629">Uđite u anonimni način rada</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 3f0abf5..af0ee1ba 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Mostra</translation> <translation id="4860895144060829044">Truca</translation> <translation id="4864369630010738180">S'està iniciant la sessió...</translation> -<translation id="4865987431642283918">Idioma predeterminat del dispositiu</translation> <translation id="4866368707455379617">No es pot instal·lar <ph name="MODULE" /> per a Chrome</translation> <translation id="4875775213178255010">Suggeriments de contingut</translation> <translation id="4877678010818027629">Entra al mode d'incògnit</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 e5384d7..f1aaebb 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Zobrazit</translation> <translation id="4860895144060829044">Volat</translation> <translation id="4864369630010738180">Přihlašování...</translation> -<translation id="4865987431642283918">Výchozí jazyk zařízení</translation> <translation id="4866368707455379617">Modul <ph name="MODULE" /> pro Chrome se nepodařilo nainstalovat</translation> <translation id="4875775213178255010">Návrhy obsahu</translation> <translation id="4877678010818027629">Přejít do anonymního režimu</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 3e6e9a2..21075e0 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Vis</translation> <translation id="4860895144060829044">Ring op</translation> <translation id="4864369630010738180">Logger ind...</translation> -<translation id="4865987431642283918">Standardsprog på enheden</translation> <translation id="4866368707455379617"><ph name="MODULE" /> kunne ikke installeres til Chrome</translation> <translation id="4875775213178255010">Indholdsforslag</translation> <translation id="4877678010818027629">Slå inkognitotilstand til</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 c72e3403..a7453ff4 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
@@ -605,7 +605,6 @@ <translation id="4850886885716139402">Anzeigen</translation> <translation id="4860895144060829044">Anrufen</translation> <translation id="4864369630010738180">Anmeldung erfolgt...</translation> -<translation id="4865987431642283918">Standardmäßige Gerätesprache</translation> <translation id="4866368707455379617"><ph name="MODULE" /> kann nicht für Chrome installiert werden</translation> <translation id="4875775213178255010">Inhaltsvorschläge</translation> <translation id="4877678010818027629">Inkognitomodus aktivieren</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 fd2580f..0423ffb 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Προβολή</translation> <translation id="4860895144060829044">Κλήση</translation> <translation id="4864369630010738180">Σύνδεση…</translation> -<translation id="4865987431642283918">Προεπιλεγμένη γλώσσα συσκευής</translation> <translation id="4866368707455379617">Δεν είναι δυνατή η εγκατάσταση του <ph name="MODULE" /> για το Chrome</translation> <translation id="4875775213178255010">Προτάσεις περιεχομένου</translation> <translation id="4877678010818027629">Είσοδος σε κατάσταση ανώνυμης περιήγησης</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 b96d7de..9264657 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">View</translation> <translation id="4860895144060829044">Call</translation> <translation id="4864369630010738180">Signing in...</translation> -<translation id="4865987431642283918">Default device language</translation> <translation id="4866368707455379617">Unable to install <ph name="MODULE" /> for Chrome</translation> <translation id="4875775213178255010">Content Suggestions</translation> <translation id="4877678010818027629">Enter Incognito mode</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 cf1e15e..fe841bd 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Ver</translation> <translation id="4860895144060829044">Llamar</translation> <translation id="4864369630010738180">Accediendo</translation> -<translation id="4865987431642283918">Idioma predeterminado del dispositivo</translation> <translation id="4866368707455379617">No es posible instalar <ph name="MODULE" /> para Chrome</translation> <translation id="4875775213178255010">Sugerencias de contenido</translation> <translation id="4877678010818027629">Acceder al modo Incógnito</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 ff4c589..a40f411 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Ver</translation> <translation id="4860895144060829044">Llamar</translation> <translation id="4864369630010738180">Iniciando sesión...</translation> -<translation id="4865987431642283918">Idioma predeterminado del dispositivo</translation> <translation id="4866368707455379617">No se puede instalar <ph name="MODULE" /> para Chrome</translation> <translation id="4875775213178255010">Sugerencias de contenido</translation> <translation id="4877678010818027629">Navegar en modo de incógnito</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 362b6862..ebfe3a1 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Kuva</translation> <translation id="4860895144060829044">Helistage</translation> <translation id="4864369630010738180">Sisselogimine ...</translation> -<translation id="4865987431642283918">Seadme vaikekeel</translation> <translation id="4866368707455379617">Moodulit <ph name="MODULE" /> ei saa Chrome'i jaoks installida</translation> <translation id="4875775213178255010">Sisu soovitused</translation> <translation id="4877678010818027629">Sisenemine inkognito režiimi</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 eb01105e..34768e0 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Ikusi</translation> <translation id="4860895144060829044">Deitu</translation> <translation id="4864369630010738180">Saioa hasten…</translation> -<translation id="4865987431642283918">Gailuaren hizkuntza lehenetsia</translation> <translation id="4866368707455379617">Ezin da instalatu <ph name="MODULE" /> Chrome-rako</translation> <translation id="4875775213178255010">Iradokitako edukiak</translation> <translation id="4877678010818027629">Sartu ezkutuko moduan</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 e6e28e5..dec90d4 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">نما</translation> <translation id="4860895144060829044">تماس</translation> <translation id="4864369630010738180">در حال ورود به سیستم...</translation> -<translation id="4865987431642283918">زبان پیشفرض دستگاه</translation> <translation id="4866368707455379617"><ph name="MODULE" /> برای Chrome نصب نشد</translation> <translation id="4875775213178255010">محتواهای پیشنهادی</translation> <translation id="4877678010818027629">ورود به «حالت ناشناس»</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 41a9833a..6f023d8 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Näytä</translation> <translation id="4860895144060829044">Soita</translation> <translation id="4864369630010738180">Kirjaudutaan...</translation> -<translation id="4865987431642283918">Laitteen oletuskieli</translation> <translation id="4866368707455379617">Kohteen <ph name="MODULE" /> asennus Chromeen epäonnistui</translation> <translation id="4875775213178255010">Sisältöehdotukset</translation> <translation id="4877678010818027629">Siirry incognito-tilaan</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 d446937a..e702611c 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">View</translation> <translation id="4860895144060829044">Tawagan</translation> <translation id="4864369630010738180">Nagsa-sign in...</translation> -<translation id="4865987431642283918">Default na wika ng device</translation> <translation id="4866368707455379617">Hindi ma-install ang <ph name="MODULE" /> para sa Chrome</translation> <translation id="4875775213178255010">Mga Iminumungkahing Content</translation> <translation id="4877678010818027629">Pumasok sa Incognito mode</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 90174a9..0723c06 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
@@ -605,7 +605,6 @@ <translation id="4850886885716139402">Affichage</translation> <translation id="4860895144060829044">Appeler</translation> <translation id="4864369630010738180">Connexion en cours…</translation> -<translation id="4865987431642283918">Langue par défaut de l'appareil</translation> <translation id="4866368707455379617">Impossible d'installer <ph name="MODULE" /> dans Chrome</translation> <translation id="4875775213178255010">Suggestions de contenu</translation> <translation id="4877678010818027629">Activer le mode de navigation privée</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 4734524..10b7f641 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Afficher</translation> <translation id="4860895144060829044">Appeler</translation> <translation id="4864369630010738180">Connexion...</translation> -<translation id="4865987431642283918">Langue par défaut de l'appareil</translation> <translation id="4866368707455379617">Impossible d'installer le module <ph name="MODULE" /> pour Chrome</translation> <translation id="4875775213178255010">Recommandations de contenus</translation> <translation id="4877678010818027629">Entrer en mode navigation privée</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 fbef79e..c2be344 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
@@ -181,6 +181,7 @@ <translation id="2158408438301413340">Chrome non puido comprobar todos os contrasinais</translation> <translation id="2169830938017475061">Agora</translation> <translation id="2172688499998841696">As descricións das imaxes están desactivadas</translation> +<translation id="2172905120685242547">Queres pechar a ventá?</translation> <translation id="2175927920773552910">Código QR</translation> <translation id="218608176142494674">Uso compartido</translation> <translation id="2195339740518523951">Goza da máxima seguranza de Chrome</translation> @@ -280,6 +281,7 @@ <translation id="2779651927720337254">produciuse un erro</translation> <translation id="2781151931089541271">Queda 1 segundo</translation> <translation id="2788468313014644040">Número do grupo</translation> +<translation id="2800066122460699237">Pecharase a pestana <ph name="TAB_TITLE" /></translation> <translation id="2801022321632964776">Descarga a última versión de Chrome para poder navegar no teu idioma</translation> <translation id="2805756323405976993">Aplicacións</translation> <translation id="2806840421670364300">FLoC</translation> @@ -288,6 +290,7 @@ <translation id="2827278682606527653">O menú da tarxeta do feed ocupa a metade inferior da pantalla</translation> <translation id="2830783625999891985">Os contidos do portapapeis están ocultos</translation> <translation id="2839327205551510876">Deixaches de seguir este feed: <ph name="SITE_NAME" /></translation> +<translation id="2840810876587895427">{TAB_COUNT,plural, =1{Pecharase <ph name="TAB_COUNT_ONE" /> pestana do modo de incógnito}other{Pecharanse <ph name="TAB_COUNT_MANY" /> pestanas do modo de incógnito}}</translation> <translation id="2841216154655874070">{NUM_DAYS,plural, =1{A comprobación realizouse hai 1 día}other{A comprobación realizouse hai # días}}</translation> <translation id="2842985007712546952">Cartafol principal</translation> <translation id="2856503607207334158">Produciuse un erro ao iniciar sesión</translation> @@ -605,7 +608,6 @@ <translation id="4850886885716139402">Vista</translation> <translation id="4860895144060829044">Chamar</translation> <translation id="4864369630010738180">Iniciando sesión...</translation> -<translation id="4865987431642283918">Idioma predeterminado do dispositivo</translation> <translation id="4866368707455379617">Non se puido instalar o módulo <ph name="MODULE" /> para Chrome</translation> <translation id="4875775213178255010">Suxestións de contido</translation> <translation id="4877678010818027629">Entrar no modo de incógnito</translation> @@ -673,6 +675,7 @@ <translation id="5222676887888702881">Pechar sesión</translation> <translation id="5227554086496586518">Toca para ver os resultados da busca</translation> <translation id="5233638681132016545">Nova pestana</translation> +<translation id="5235196193381275927">Produciuse un erro ao iniciar sesión</translation> <translation id="5246093389635966745">Editar atallo da barra de ferramentas</translation> <translation id="5250483651202458397">Captura de pantalla. Toca para pechala.</translation> <translation id="5262378156578470238">Recibirás unha notificación cando se inicie esta descarga o <ph name="DATE" />.</translation> @@ -896,6 +899,7 @@ <translation id="6541983376925655882">{NUM_HOURS,plural, =1{A comprobación realizouse hai 1 hora}other{A comprobación realizouse hai # horas}}</translation> <translation id="6545017243486555795">Borrar todos os datos</translation> <translation id="6546511553472444032">Pode que o ficheiro sexa daniño</translation> +<translation id="6556542240154580383">{TAB_COUNT,plural, =1{Pecharase <ph name="TAB_TITLE" /> e <ph name="TAB_COUNT_ONE" /> pestana máis}other{Pecharase <ph name="TAB_TITLE" /> e <ph name="TAB_COUNT_MANY" /> pestanas máis}}</translation> <translation id="6560414384669816528">Buscar con Sogou</translation> <translation id="656065428026159829">Ver máis</translation> <translation id="6565959834589222080">Úsase a conexión wifi cando está dispoñible</translation> @@ -936,6 +940,7 @@ <translation id="6767294960381293877">A lista de dispositivos cos que compartir unha pestana está aberta a media pantalla.</translation> <translation id="6783942555455976443">Garda esta páxina para acceder a ela máis tarde e recibe un recordatorio</translation> <translation id="6795633245022906657">Abre rapidamente unha pestana nova. Para editar este atallo, vai a Configuración.</translation> +<translation id="6802555630140434547">Pecharase a ventá</translation> <translation id="6811034713472274749">A páxina está lista para vela</translation> <translation id="6813446258015311409">Panel Iniciar sesión en Chrome (aberto).</translation> <translation id="6817747507826986771">Compartir rapidamente esta páxina. Para editar este atallo, mantén premido o botón.</translation> @@ -1163,6 +1168,7 @@ <translation id="8109613176066109935">Activa a sincronización para ter os marcadores en todos os teus dispositivos</translation> <translation id="8110087112193408731">Queres mostrar a túa actividade de Chrome en Benestar dixital?</translation> <translation id="8127542551745560481">Editar páxina de inicio</translation> +<translation id="8130309322784422030">A información de inicio de sesión que gardaches podería estar desactualizada</translation> <translation id="813082847718468539">Consulta a información do sitio</translation> <translation id="8137558756159375272">A función Tocar para buscar envía a palabra seleccionada e a páxina actual como contexto para a busca de Google. Podes desactivar esta opción na <ph name="BEGIN_LINK" />Configuración<ph name="END_LINK" />.</translation> <translation id="8153351135626613369">O Asistente aparecerá cando detecte que pode axudarche nos sitios web compatibles con esta función</translation> @@ -1293,6 +1299,7 @@ <translation id="8945143127965743188"><ph name="LANG" />: non se puido descargar este idioma. Téntao de novo máis tarde.</translation> <translation id="8951232171465285730">Chrome permitiuche aforrar <ph name="MEGABYTES" /> MB</translation> <translation id="8965591936373831584">pendente</translation> +<translation id="8968085728801125376">{TAB_COUNT,plural, =1{Pecharanse <ph name="INCOGNITO_TAB_COUNT" /> pestanas de incógnito e <ph name="TAB_COUNT_ONE" /> pestana máis}other{Pecharanse <ph name="INCOGNITO_TAB_COUNT" /> pestanas de incógnito e <ph name="TAB_COUNT_MANY" /> pestanas máis}}</translation> <translation id="8970887620466824814">Produciuse un erro.</translation> <translation id="8972098258593396643">Queres gardar a descarga no cartafol predeterminado?</translation> <translation id="8987641763863173640">Xestionar configuración da vista previa dos vídeos</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 9dbb439..00ae532 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
@@ -605,7 +605,6 @@ <translation id="4850886885716139402">જુઓ</translation> <translation id="4860895144060829044">કૉલ કરો</translation> <translation id="4864369630010738180">સાઇન ઇન થઈ રહ્યું છે...</translation> -<translation id="4865987431642283918">ડિવાઇસની ડિફૉલ્ટ ભાષા</translation> <translation id="4866368707455379617">Chrome માટે <ph name="MODULE" /> ઇન્સ્ટૉલ કરવામાં અસમર્થ</translation> <translation id="4875775213178255010">કન્ટેન્ટ માટે સૂચનો</translation> <translation id="4877678010818027629">છૂપો મોડમાં દાખલ થાઓ</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 c998959..5ab64cd 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">देखें</translation> <translation id="4860895144060829044">कॉल करें</translation> <translation id="4864369630010738180">प्रवेश कर रहा है...</translation> -<translation id="4865987431642283918">डिवाइस की डिफ़ॉल्ट भाषा</translation> <translation id="4866368707455379617">Chrome के लिए <ph name="MODULE" /> इंस्टॉल नहीं किया जा सका</translation> <translation id="4875775213178255010">सामग्री के सुझाव</translation> <translation id="4877678010818027629">गुप्त मोड में जाएं</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 f6df199..4aaee63 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
@@ -607,7 +607,6 @@ <translation id="4850886885716139402">Prikaz</translation> <translation id="4860895144060829044">Poziv</translation> <translation id="4864369630010738180">Prijavljivanje...</translation> -<translation id="4865987431642283918">Zadani jezik uređaja</translation> <translation id="4866368707455379617">Instaliranje modula <ph name="MODULE" /> za Chrome nije uspjelo</translation> <translation id="4875775213178255010">Prijedlozi sadržaja</translation> <translation id="4877678010818027629">Otvori anonimni način</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 7b178c6..6585d1d8 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Nézet</translation> <translation id="4860895144060829044">Hívás</translation> <translation id="4864369630010738180">Bejelentkezés...</translation> -<translation id="4865987431642283918">Eszköz alapértelmezett nyelve</translation> <translation id="4866368707455379617">Nem lehetséges a(z) <ph name="MODULE" /> telepítése a Chrome-hoz</translation> <translation id="4875775213178255010">Javasolt tartalmak</translation> <translation id="4877678010818027629">Belépés inkognitó módba</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 582e578..bc210ac 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Տեսք</translation> <translation id="4860895144060829044">Զանգեք</translation> <translation id="4864369630010738180">Մուտք...</translation> -<translation id="4865987431642283918">Սարքի կանխադրված լեզուն</translation> <translation id="4866368707455379617">Չհաջողվեց տեղադրել «<ph name="MODULE" />» բաղադրիչը Chrome-ի համար</translation> <translation id="4875775213178255010">Բովանդակության առաջարկներ</translation> <translation id="4877678010818027629">Մտնել ինկոգնիտո ռեժիմ</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 2b87ed4..6928c32 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Lihat</translation> <translation id="4860895144060829044">Telepon</translation> <translation id="4864369630010738180">Login...</translation> -<translation id="4865987431642283918">Bahasa default perangkat</translation> <translation id="4866368707455379617">Tidak dapat menginstal <ph name="MODULE" /> untuk Chrome</translation> <translation id="4875775213178255010">Saran Konten</translation> <translation id="4877678010818027629">Masuk mode Samaran</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 96b2e57..5d832cb 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Yfirlit</translation> <translation id="4860895144060829044">Hringja</translation> <translation id="4864369630010738180">Skráir inn...</translation> -<translation id="4865987431642283918">Sjálfgefið tungumál tækis</translation> <translation id="4866368707455379617">Ekki tókst að setja upp <ph name="MODULE" /> fyrir Chrome</translation> <translation id="4875775213178255010">Tillögur að efni</translation> <translation id="4877678010818027629">Kveikja á huliðsstillingu</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 0c362bd..8c5fe37 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Visualizza</translation> <translation id="4860895144060829044">Chiama</translation> <translation id="4864369630010738180">Accesso in corso...</translation> -<translation id="4865987431642283918">Lingua dispositivo predefinita</translation> <translation id="4866368707455379617">Impossibile installare <ph name="MODULE" /> per Chrome</translation> <translation id="4875775213178255010">Contenuti suggeriti</translation> <translation id="4877678010818027629">Attiva la modalità di navigazione in incognito</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 3c55a132..10ea58d 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
@@ -605,7 +605,6 @@ <translation id="4850886885716139402">הצגה</translation> <translation id="4860895144060829044">תרימו טלפון</translation> <translation id="4864369630010738180">מתבצעת כניסה...</translation> -<translation id="4865987431642283918">ברירת המחדל לשפת המכשיר</translation> <translation id="4866368707455379617">לא ניתן להתקין את <ph name="MODULE" /> ל-Chrome</translation> <translation id="4875775213178255010">תוכן מוצע</translation> <translation id="4877678010818027629">מעבר למצב אנונימי</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 5a3a6c6..61b0a50e 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">表示</translation> <translation id="4860895144060829044">通話</translation> <translation id="4864369630010738180">ログインしています...</translation> -<translation id="4865987431642283918">デフォルトのデバイスの言語</translation> <translation id="4866368707455379617">Chrome 用の <ph name="MODULE" /> をインストールできません</translation> <translation id="4875775213178255010">おすすめのコンテンツ</translation> <translation id="4877678010818027629">シークレット モードを開始</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 33ba0f7..e83b479 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">გადახედვა</translation> <translation id="4860895144060829044">დარეკვა</translation> <translation id="4864369630010738180">მიმდინარეობს შესვლა…</translation> -<translation id="4865987431642283918">მოწყობილობის ნაგულისხმევი ენა</translation> <translation id="4866368707455379617"><ph name="MODULE" /> ვერ დაინსტალირდა Chrome-ისთვის</translation> <translation id="4875775213178255010">კონტენტის შემოთავაზება</translation> <translation id="4877678010818027629">ინკოგნიტო რეჟიმზე გადასვლა</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 c8175b6..01042d5 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Көрініс</translation> <translation id="4860895144060829044">Қоңырау шалу</translation> <translation id="4864369630010738180">Жүйеге кіруде…</translation> -<translation id="4865987431642283918">Құрылғының әдепкі тілі</translation> <translation id="4866368707455379617">Chrome браузеріне арналған <ph name="MODULE" /> орнату мүмкін болмады.</translation> <translation id="4875775213178255010">Мазмұн ұсыныстары</translation> <translation id="4877678010818027629">Инкогнито режиміне өту</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 24237fa..e3990be 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">មើល</translation> <translation id="4860895144060829044">ហៅ</translation> <translation id="4864369630010738180">កំពុងចូល...</translation> -<translation id="4865987431642283918">ភាសាលំនាំដើមរបស់ឧបករណ៍</translation> <translation id="4866368707455379617">មិនអាចដំឡើង <ph name="MODULE" /> សម្រាប់ Chrome បានទេ</translation> <translation id="4875775213178255010">ការណែនាំអំពីខ្លឹមសារ</translation> <translation id="4877678010818027629">ចូលមុខងារឯកជន</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 8312899f..535d355 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
@@ -604,7 +604,6 @@ <translation id="4850886885716139402">ವೀಕ್ಷಣೆ</translation> <translation id="4860895144060829044">ಕರೆ</translation> <translation id="4864369630010738180">ಸೈನ್ ಇನ್ ಮಾಡಲಾಗುತ್ತಿದೆ...</translation> -<translation id="4865987431642283918">ಡೀಫಾಲ್ಟ್ ಸಾಧನದ ಭಾಷೆ</translation> <translation id="4866368707455379617">Chrome ಗಾಗಿ <ph name="MODULE" /> ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ</translation> <translation id="4875775213178255010">ವಿಷಯದ ಸಲಹೆಗಳು</translation> <translation id="4877678010818027629">ಅಜ್ಞಾತ ಮೋಡ್ ನಮೂದಿಸಿ</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 f3ab685..7716d90 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">보기</translation> <translation id="4860895144060829044">전화걸기</translation> <translation id="4864369630010738180">로그인 중...</translation> -<translation id="4865987431642283918">기본 기기 언어</translation> <translation id="4866368707455379617">Chrome에 <ph name="MODULE" />을(를) 설치할 수 없습니다.</translation> <translation id="4875775213178255010">콘텐츠 추천</translation> <translation id="4877678010818027629">시크릿 모드 시작</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 1398cff..8d9d1cf 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Көрүнүш</translation> <translation id="4860895144060829044">Чалуу</translation> <translation id="4864369630010738180">Кирүүдө…</translation> -<translation id="4865987431642283918">Түзмөктүн демейки тили</translation> <translation id="4866368707455379617">Chrome үчүн <ph name="MODULE" /> орнотулган жок</translation> <translation id="4875775213178255010">Мазмун сунуштары</translation> <translation id="4877678010818027629">Жашыруун режимге кирүү</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 4977eea..149e75ab 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">ເບິ່ງ</translation> <translation id="4860895144060829044">ໂທ</translation> <translation id="4864369630010738180">ກຳລັງເຂົ້າສູ່ລະບົບ...</translation> -<translation id="4865987431642283918">ພາສາອຸປະກອນເລີ່ມຕົ້ນ</translation> <translation id="4866368707455379617">ບໍ່ສາມາດຕິດຕັ້ງ <ph name="MODULE" /> ສໍາລັບ Chrome ໄດ້</translation> <translation id="4875775213178255010">ການແນະນຳເນື້ອຫາ</translation> <translation id="4877678010818027629">ເຂົ້າໂໝດບໍ່ເປີດເຜີຍຕົວຕົນ</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 e7a9cb5d..5182eee 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Žiūrėti</translation> <translation id="4860895144060829044">Skambinti</translation> <translation id="4864369630010738180">Prisijungiama...</translation> -<translation id="4865987431642283918">Numatytoji įrenginio kalba</translation> <translation id="4866368707455379617">Nepavyko įdiegti „Chrome“ skirto modulio „<ph name="MODULE" />“</translation> <translation id="4875775213178255010">Turinio pasiūlymai</translation> <translation id="4877678010818027629">Įjungti inkognito režimą</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 06c588c..f46d67c 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Skatīt</translation> <translation id="4860895144060829044">Zvanīt</translation> <translation id="4864369630010738180">Pierakstīšanās...</translation> -<translation id="4865987431642283918">Ierīces noklusējuma valoda</translation> <translation id="4866368707455379617">Nevar instalēt moduli <ph name="MODULE" /> pārlūkprogrammai Chrome.</translation> <translation id="4875775213178255010">Satura ieteikumi</translation> <translation id="4877678010818027629">Atvērt inkognito režīmā</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 c370070..5b0443f 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
@@ -605,7 +605,6 @@ <translation id="4850886885716139402">Приказ</translation> <translation id="4860895144060829044">Повикајте</translation> <translation id="4864369630010738180">Се најавува…</translation> -<translation id="4865987431642283918">Стандарден јазик на уредот</translation> <translation id="4866368707455379617">Не може да се инсталира <ph name="MODULE" /> за Chrome</translation> <translation id="4875775213178255010">Предлози за содржина</translation> <translation id="4877678010818027629">Влезете во режим „Инкогнито“</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 f05b73b..3124f780f 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
@@ -181,6 +181,7 @@ <translation id="2158408438301413340">Chrome-ന് എല്ലാ പാസ്വേഡുകളും പരിശോധിക്കാനായില്ല</translation> <translation id="2169830938017475061">ഇപ്പോൾ</translation> <translation id="2172688499998841696">ചിത്രത്തിന്റെ വിവരണങ്ങൾ ഓഫാണ്</translation> +<translation id="2172905120685242547">വിൻഡോ അടയ്ക്കണോ?</translation> <translation id="2175927920773552910">QR കോഡ്</translation> <translation id="218608176142494674">പങ്കിടൽ</translation> <translation id="2195339740518523951">Chrome-ന്റെ ഏറ്റവും ശക്തമായ സുരക്ഷ നേടുക</translation> @@ -280,6 +281,7 @@ <translation id="2779651927720337254">പരാജയപ്പെട്ടു</translation> <translation id="2781151931089541271">ഒരു സെക്കൻഡ് ശേഷിക്കുന്നു</translation> <translation id="2788468313014644040">ഗ്രൂപ്പ് നമ്പർ</translation> +<translation id="2800066122460699237"><ph name="TAB_TITLE" /> എന്ന ടാബ് അടയ്ക്കും</translation> <translation id="2801022321632964776">Chrome-ൻ്റെ ഏറ്റവും പുതിയ പതിപ്പിൽ നിങ്ങളുടെ ഭാഷ ലഭ്യമാക്കാൻ അപ്ഡേറ്റ് ചെയ്യൂ</translation> <translation id="2805756323405976993">ആപ്സ്</translation> <translation id="2806840421670364300">FLoC</translation> @@ -288,6 +290,7 @@ <translation id="2827278682606527653">പകുതി ഉയരത്തിലുള്ള ഫീഡ് കാർഡ് മെനു</translation> <translation id="2830783625999891985">ക്ലിപ്പ്ബോർഡ് ഉള്ളടക്കം മറച്ചിരിക്കുന്നു</translation> <translation id="2839327205551510876"><ph name="SITE_NAME" /> പിന്തുടരുന്നത് ഒഴിവാക്കി</translation> +<translation id="2840810876587895427">{TAB_COUNT,plural, =1{<ph name="TAB_COUNT_ONE" /> അദൃശ്യ ടാബ് അടയ്ക്കും}other{<ph name="TAB_COUNT_MANY" /> അദൃശ്യ ടാബുകൾ അടയ്ക്കും}}</translation> <translation id="2841216154655874070">{NUM_DAYS,plural, =1{ഒരു ദിവസം മുമ്പ് പരിശോധിച്ചു}other{# ദിവസം മുമ്പ് പരിശോധിച്ചു}}</translation> <translation id="2842985007712546952">പാരന്റ് ഫോൾഡർ</translation> <translation id="2856503607207334158">സൈൻ ഇൻ ചെയ്യാനായില്ല</translation> @@ -605,7 +608,6 @@ <translation id="4850886885716139402">കാണുക</translation> <translation id="4860895144060829044">വിളിക്കുക</translation> <translation id="4864369630010738180">സൈൻ ഇൻ ചെയ്യുന്നു...</translation> -<translation id="4865987431642283918">ഡിഫോൾട്ട് ഉപകരണ ഭാഷ</translation> <translation id="4866368707455379617">Chrome-നായി <ph name="MODULE" /> ഇൻസ്റ്റാൾ ചെയ്യാനായില്ല</translation> <translation id="4875775213178255010">ഉള്ളടക്ക നിർദ്ദേശങ്ങൾ</translation> <translation id="4877678010818027629">അദൃശ്യ മോഡിലേക്ക് പോകുക</translation> @@ -673,6 +675,7 @@ <translation id="5222676887888702881">സൈൻ ഔട്ട് ചെയ്യുക</translation> <translation id="5227554086496586518">തിരയൽ ഫലങ്ങൾ കാണാൻ ടാപ്പ് ചെയ്യുക</translation> <translation id="5233638681132016545">പുതിയ ടാബ്</translation> +<translation id="5235196193381275927">സൈൻ ഇൻ ചെയ്യുമ്പോൾ എന്തോ കുഴപ്പമുണ്ടായി</translation> <translation id="5246093389635966745">ടൂൾബാർ കുറുക്കുവഴി എഡിറ്റ് ചെയ്യുക</translation> <translation id="5250483651202458397">സ്ക്രീൻഷോട്ട്. അടയ്ക്കാൻ ടാപ്പ് ചെയ്യുക.</translation> <translation id="5262378156578470238"><ph name="DATE" />-ന് ഈ ഡൗൺലോഡ് ആരംഭിക്കുമ്പോൾ നിങ്ങൾ ഒരു അറിയിപ്പ് കാണും.</translation> @@ -896,6 +899,7 @@ <translation id="6541983376925655882">{NUM_HOURS,plural, =1{ഒരു മണിക്കൂർ മുമ്പ് പരിശോധിച്ചു}other{# മണിക്കൂർ മുമ്പ് പരിശോധിച്ചു}}</translation> <translation id="6545017243486555795">എല്ലാ വിവരങ്ങളും മായ്ക്കുക</translation> <translation id="6546511553472444032">ഫയൽ ദോഷകരമായേക്കാം</translation> +<translation id="6556542240154580383">{TAB_COUNT,plural, =1{<ph name="TAB_TITLE" /> എന്നതും മറ്റ് <ph name="TAB_COUNT_ONE" /> ടാബും കൂടി അടയ്ക്കും}other{<ph name="TAB_TITLE" /> എന്നതും മറ്റ് <ph name="TAB_COUNT_MANY" /> ടാബുകളും കൂടി അടയ്ക്കും}}</translation> <translation id="6560414384669816528">Sogou ഉപയോഗിച്ച് തിരയുക</translation> <translation id="656065428026159829">കൂടുതൽ കാണുക</translation> <translation id="6565959834589222080">ലഭ്യമാകുമ്പോൾ വൈഫൈ ഉപയോഗിക്കും</translation> @@ -936,6 +940,7 @@ <translation id="6767294960381293877">പകുതി ഉയരത്തിൽ ടാബ് പങ്കിടാനാകുന്ന ഉപകരണങ്ങളുടെ ലിസ്റ്റ്.</translation> <translation id="6783942555455976443">പിന്നീട് വായിക്കുന്നതിന് ഈ പേജ് സംരക്ഷിച്ച് റിമൈൻഡർ നേടുക</translation> <translation id="6795633245022906657">പുതിയ ടാബ് വേഗത്തിൽ തുറക്കുക. ഈ കുറുക്കുവഴി എഡിറ്റ് ചെയ്യാൻ ക്രമീകരണത്തിലേക്ക് പോകുക.</translation> +<translation id="6802555630140434547">വിൻഡോ അടയ്ക്കും</translation> <translation id="6811034713472274749">പേജ്, കാണാൻ തയ്യാറാണ്</translation> <translation id="6813446258015311409">Chrome-ലേക്ക് സെെൻ ഇൻ ചെയ്യുക, തുറന്നു.</translation> <translation id="6817747507826986771">ഈ പേജ് വേഗത്തിൽ പങ്കിടുക. ഈ കുറുക്കുവഴി എഡിറ്റ് ചെയ്യാൻ, സ്പർശിച്ചുപിടിക്കുക.</translation> @@ -1163,6 +1168,7 @@ <translation id="8109613176066109935">നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും ബുക്ക്മാർക്കുകൾ ലഭിക്കാൻ, സമന്വയിപ്പിക്കൽ ഓണാക്കുക</translation> <translation id="8110087112193408731">ഡിജിറ്റൽ ആരോഗ്യത്തിൽ നിങ്ങളുടെ Chrome ആക്റ്റിവിറ്റി കാണിക്കണോ?</translation> <translation id="8127542551745560481">ഹോംപേജ് എഡിറ്റ് ചെയ്യുക</translation> +<translation id="8130309322784422030">സംഭരിച്ചിരിക്കുന്ന സൈൻ ഇൻ വിവരങ്ങൾ കാലഹരണപ്പെട്ടതാകാം</translation> <translation id="813082847718468539">സൈറ്റ് വിവരങ്ങള് കാണുക</translation> <translation id="8137558756159375272">Google തിരയലിന് സന്ദർഭം വ്യക്തമാക്കാൻ തിരഞ്ഞെടുത്ത വാക്കും നിലവിലെ പേജും, തിരയുന്നതിനായി സ്പർശിക്കുക അയയ്ക്കും. <ph name="BEGIN_LINK" />ക്രമീകരണത്തിൽ<ph name="END_LINK" /> നിന്ന് നിങ്ങൾക്കിത് ഓഫാക്കാം.</translation> <translation id="8153351135626613369">പിന്തുണയ്ക്കുന്ന വെബ്സൈറ്റുകളിൽ നിങ്ങളെ സഹായിക്കാനാകുമെന്ന് കണ്ടെത്തുമ്പോൾ Assistant ദൃശ്യമാകും</translation> @@ -1293,6 +1299,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> - ഈ ഭാഷ ഡൗൺലോഡ് ചെയ്യാനായില്ല. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="8951232171465285730">Chrome നിങ്ങളുടെ <ph name="MEGABYTES" /> MB ലാഭിച്ചു</translation> <translation id="8965591936373831584">തീർച്ചപ്പെടുത്താത്തവ</translation> +<translation id="8968085728801125376">{TAB_COUNT,plural, =1{<ph name="INCOGNITO_TAB_COUNT" /> അദൃശ്യ ടാബും മറ്റ് <ph name="TAB_COUNT_ONE" /> ടാബും കൂടി അടയ്ക്കും}other{<ph name="INCOGNITO_TAB_COUNT" /> അദൃശ്യ ടാബും മറ്റ് <ph name="TAB_COUNT_MANY" /> ടാബുകളും കൂടി അടയ്ക്കും}}</translation> <translation id="8970887620466824814">എന്തോ കുഴപ്പമുണ്ടായി.</translation> <translation id="8972098258593396643">ഡിഫോൾട്ട് ഫോൾഡറിലേക്ക് ഡൗൺലോഡ് ചെയ്യണോ?</translation> <translation id="8987641763863173640">വീഡിയോ പ്രിവ്യു ക്രമീകരണം മാനേജ് ചെയ്യുക</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 c33e8022..f18648e 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
@@ -607,7 +607,6 @@ <translation id="4850886885716139402">Харах</translation> <translation id="4860895144060829044">Дуудлага</translation> <translation id="4864369630010738180">Нэвтэрч байна…</translation> -<translation id="4865987431642283918">Өгөгдмөл төхөөрөмжийн хэл</translation> <translation id="4866368707455379617"><ph name="MODULE" />-г Chrome-д суулгах боломжгүй байна</translation> <translation id="4875775213178255010">Агуулгын зөвлөмж</translation> <translation id="4877678010818027629">Нууцлалтай горимд нэвтрэх</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 99dcfa6..b525721 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
@@ -28,7 +28,7 @@ <translation id="1146678959555564648">VR एंटर करा</translation> <translation id="1154704303112745282">पेज ऑफलाइन उपलब्ध नाही: <ph name="VIOLATED_URL" /></translation> <translation id="116280672541001035">वापरला</translation> -<translation id="1171770572613082465">"टॉप साइट" बटणावर टॅप करून लोकप्रिय वेबसाइट पाहा</translation> +<translation id="1171770572613082465">"टॉप साइट" बटणावर टॅप करून लोकप्रिय वेबसाइट पहा</translation> <translation id="1173894706177603556">नाव बदला</translation> <translation id="1177863135347784049">कस्टम</translation> <translation id="1197267115302279827">बुकर्माक हलवा</translation> @@ -79,7 +79,7 @@ <translation id="1430915738399379752">प्रिंट</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> शेअर करू शकत नाही</translation> <translation id="1466383950273130737">Chrome ची भाषा निवडा</translation> -<translation id="147113415845704694">“आजचे हवामान कसे आहे?” असे म्हणून पाहा</translation> +<translation id="147113415845704694">“आजचे हवामान कसे आहे?” असे म्हणून पहा</translation> <translation id="1477626028522505441">सर्व्हर समस्यांमुळे <ph name="FILE_NAME" /> डाउनलोड अयशस्वी झाले.</translation> <translation id="1492417797159476138">तुम्ही या साइटसाठी आधीच वापरकर्ता नाव सेव्ह केले आहे</translation> <translation id="1493287004536771723">तुम्ही <ph name="SITE_NAME" /> ला फॉलो करत आहात</translation> @@ -103,7 +103,7 @@ <translation id="1671236975893690980">डाउनलोड प्रलंबित आहे</translation> <translation id="1672586136351118594">पुन्हा दाखवू नका</translation> <translation id="1680919990519905526">Google Lens ने इमेज खरेदी करा <ph name="BEGIN_NEW" />नवीन<ph name="END_NEW" /></translation> -<translation id="1682195225331129001">आता करून पाहा</translation> +<translation id="1682195225331129001">आता करून पहा</translation> <translation id="1697284962337958118">यामध्ये जोडा</translation> <translation id="1718835860248848330">शेवटच्या तासामधील</translation> <translation id="1724977129262658800">तुमचा पासवर्ड संपादित करण्यासाठी अनलॉक करा</translation> @@ -157,12 +157,12 @@ <translation id="2056878612599315956">साइट थांबवली</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{एक डाउनलोड करता आले नाही}other{# डाउनलोड करता आले नाहीत}}</translation> <translation id="2067805253194386918">मजकूर</translation> -<translation id="2068748236079642969">पुढील व्हिडिओ पाहा</translation> +<translation id="2068748236079642969">पुढील व्हिडिओ पहा</translation> <translation id="2074143993849053708">Assistant च्या व्हॉइस शोध संमतीशी संबंधित UI बंद केले</translation> <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> पैकी <ph name="RESULT_NUMBER" /> परिणाम</translation> <translation id="2096012225669085171">डिव्हाइसवर सिंक आणि पर्सनलाइझ करा</translation> <translation id="2100273922101894616">ऑटो साइन इन करा</translation> -<translation id="2100314319871056947">मजकूर लहान भागांमध्ये शेअर करून पाहा</translation> +<translation id="2100314319871056947">मजकूर लहान भागांमध्ये शेअर करून पहा</translation> <translation id="2109711654079915747">पेज न सोडता वेबसाइटवरील विषयांबद्दल जाणून घ्या. शोधण्यासाठी स्पर्श करा हे शब्द आणि त्याच्या आसपासचा संदर्भ Google Search ला पाठवते आणि व्याख्या, पिक्चर, शोध परिणाम आणि इतर तपशील मिळवते. शोधण्यासाठी कोणत्याही शब्दावर टॅप करा. तुमचा शोध रिफाइन करण्यासाठी, जास्त किंवा कमी शब्द निवडण्यासाठी स्पर्श करा आणि धरून ठेवा. तुमचा शोध संपादित करण्यासाठी, पॅनल उघडा, नवीन टॅबमध्ये उघडण्यासाठी आयकनवर टॅप करा आणि सर्च बॉक्समध्ये तुमचे बदल करा.</translation> @@ -181,6 +181,7 @@ <translation id="2158408438301413340">Chrome ला सर्व पासवर्ड तपासता आले नाहीत</translation> <translation id="2169830938017475061">Now</translation> <translation id="2172688499998841696">इमेजची वर्णने बंद आहेत</translation> +<translation id="2172905120685242547">विंडो बंद करायची आहे का?</translation> <translation id="2175927920773552910">QR कोड</translation> <translation id="218608176142494674">शेअर करत आहे</translation> <translation id="2195339740518523951">Chrome ची सर्वोत्तम सुरक्षितता मिळवा</translation> @@ -237,7 +238,7 @@ <translation id="2497852260688568942">तुमच्या ॲडमिनिस्ट्रेटरने सिंक अक्षम केले आहे</translation> <translation id="250020030759455918">तुम्हाला Chrome मध्ये तुमची <ph name="SITE_NAME" /> साइन-इन स्थिती, ब्राउझिंग डेटा आणि साइट डेटा दिसेल</translation> <translation id="2512164632052122970">आशयाच्या भाषा</translation> -<translation id="2513403576141822879">गोपनीयता, सुरक्षितता आणि डेटा संकलनाशी संबंधित अधिक सेटिंग्जसाठी, <ph name="BEGIN_LINK" />सिंक आणि Google सेवा<ph name="END_LINK" /> पाहा</translation> +<translation id="2513403576141822879">गोपनीयता, सुरक्षितता आणि डेटा संकलनाशी संबंधित अधिक सेटिंग्जसाठी, <ph name="BEGIN_LINK" />सिंक आणि Google सेवा<ph name="END_LINK" /> पहा</translation> <translation id="2517472476991765520">स्कॅन करा</translation> <translation id="2518590038762162553">लाइट मोडमध्ये, Chrome पेज आणखी जलद लोड करते आणि ६० टक्के कमी डेटा वापरते. तुम्ही भेट दिलेली पेज ऑप्टिमाइझ करण्यासाठी, Chrome तुमचे वेब ट्रॅफिक Google ला पाठवते. <ph name="BEGIN_LINK" />अधिक जाणून घ्या<ph name="END_LINK" /></translation> <translation id="2523184218357549926">तुम्ही भेट दिलेल्या पेजच्या URL Google ला पाठवते</translation> @@ -275,19 +276,21 @@ <translation id="2760989362628427051">तुमच्या डिव्हाइसची गडद थीम किंवा बॅटरी सेव्हर सुरू असताना गडद थीम सुरू करा</translation> <translation id="2762000892062317888">आत्ताच</translation> <translation id="276969039800130567"><ph name="USER_EMAIL_ADDRESS" /> म्हणून साइन इन केले</translation> -<translation id="2776236159752647997">गोपनीयता, सुरक्षा आणि डेटा संग्रह यांच्याशी संबंधित आणखी सेटिंग्जसाठी, <ph name="BEGIN_LINK" />Google सेवा<ph name="END_LINK" /> पाहा</translation> +<translation id="2776236159752647997">गोपनीयता, सुरक्षा आणि डेटा संग्रह यांच्याशी संबंधित आणखी सेटिंग्जसाठी, <ph name="BEGIN_LINK" />Google सेवा<ph name="END_LINK" /> पहा</translation> <translation id="2777555524387840389"><ph name="SECONDS" /> सेकंद शिल्लक</translation> <translation id="2779651927720337254">अयशस्वी झाले</translation> <translation id="2781151931089541271">1 सेकंद शिल्लक</translation> <translation id="2788468313014644040">गटाचा नंबर</translation> +<translation id="2800066122460699237"><ph name="TAB_TITLE" /> टॅब बंद केला जाईल</translation> <translation id="2801022321632964776">Chrome च्या नवीनतम आवृत्तीमध्ये तुमची भाषा मिळवण्यासाठी अपडेट करा</translation> <translation id="2805756323405976993">ॲप्लिकेशन</translation> <translation id="2806840421670364300">FLoC</translation> -<translation id="281504910091592009">तुमच्या <ph name="BEGIN_LINK" />Google खात्यामध्ये<ph name="END_LINK" /> सेव्ह केलेले पासवर्ड पाहा आणि व्यवस्थापित करा</translation> +<translation id="281504910091592009">तुमच्या <ph name="BEGIN_LINK" />Google खात्यामध्ये<ph name="END_LINK" /> सेव्ह केलेले पासवर्ड पहा आणि व्यवस्थापित करा</translation> <translation id="2818669890320396765">तुमच्या सर्व डिव्हाइसवर तुमचे बुकमार्क मिळवण्यासाठी, साइन इन करा आणि सिंक सुरू करा</translation> <translation id="2827278682606527653">फीड कार्ड मेनू अर्ध्या उंचीवर आहे</translation> <translation id="2830783625999891985">क्लिपबोर्डचा आशय लपवला</translation> <translation id="2839327205551510876"><ph name="SITE_NAME" /> ला अनफॉलो करा</translation> +<translation id="2840810876587895427">{TAB_COUNT,plural, =1{<ph name="TAB_COUNT_ONE" /> गुप्त टॅब बंद केला जाईल}other{<ph name="TAB_COUNT_MANY" /> गुप्त टॅब बंद केले जातील}}</translation> <translation id="2841216154655874070">{NUM_DAYS,plural, =1{एका दिवसापूर्वी तपासले}other{# दिवसांपूर्वी तपासले}}</translation> <translation id="2842985007712546952">मुख्य फोल्डर</translation> <translation id="2856503607207334158">साइन इन करता आले नाही</translation> @@ -559,7 +562,7 @@ <translation id="4561979708150884304">कनेक्शन नाही</translation> <translation id="4565377596337484307">पासवर्ड लपवा</translation> <translation id="4572422548854449519">व्यवस्थापित केलेल्या खात्यामध्ये साइन इन करा</translation> -<translation id="4576892426230499203">पडताळणी करण्याचा दुसरा पर्याय वापरून पाहा</translation> +<translation id="4576892426230499203">पडताळणी करण्याचा दुसरा पर्याय वापरून पहा</translation> <translation id="4583164079174244168">{MINUTES,plural, =1{# मिनिटापूर्वी}other{# मिनिटांपूर्वी}}</translation> <translation id="4587589328781138893">Sites</translation> <translation id="4594952190837476234">हे <ph name="CREATION_TIME" /> पासूनचे ऑफलाइन पेज आहे आणि ऑनलाइन आवृत्तीपेक्षा वेगळे असू शकते.</translation> @@ -605,7 +608,6 @@ <translation id="4850886885716139402">पहा</translation> <translation id="4860895144060829044">कॉल करा</translation> <translation id="4864369630010738180">साइन इन करत आहे...</translation> -<translation id="4865987431642283918">डिव्हाइसची डीफॉल्ट भाषा</translation> <translation id="4866368707455379617">Chrome साठी <ph name="MODULE" /> इंस्टॉल करू शकत नाही</translation> <translation id="4875775213178255010">आशय सूचना</translation> <translation id="4877678010818027629">गुप्त मोडमध्ये प्रवेश करा</translation> @@ -673,6 +675,7 @@ <translation id="5222676887888702881">साइन आउट करा</translation> <translation id="5227554086496586518">शोध परिणाम पाहाण्यासाठी टॅप करा</translation> <translation id="5233638681132016545">नवीन टॅब</translation> +<translation id="5235196193381275927">साइन-इन करताना काहीतरी चूक झाली</translation> <translation id="5246093389635966745">टूलबार शॉर्टकट संपादित करा</translation> <translation id="5250483651202458397">स्क्रीनशॉट. बंद करण्यासाठी टॅप करा.</translation> <translation id="5262378156578470238">हा डाउनलोड <ph name="DATE" /> रोजी सुरू होईल तेव्हा तुम्हाला सूचना दिसेल.</translation> @@ -866,7 +869,7 @@ <translation id="6402652558933147609"><ph name="VIOLATED_URL" /> वरील <ph name="ERROR_CODE" /></translation> <translation id="6404511346730675251">बुकमार्क संपादित करा</translation> <translation id="6406506848690869874">Sync</translation> -<translation id="6407224748847589805">तुमच्या कॉंप्युटरशी कनेक्ट करू शकत नाही. पडताळणी करण्याचा दुसरा पर्याय वापरून पाहा</translation> +<translation id="6407224748847589805">तुमच्या कॉंप्युटरशी कनेक्ट करू शकत नाही. पडताळणी करण्याचा दुसरा पर्याय वापरून पहा</translation> <translation id="6410404864818553978">साधारण वापर डेटा</translation> <translation id="6410883413783534063">एकाच वेळी वेगवेगळ्या पेजना भेट देण्यासाठी टॅब उघडा</translation> <translation id="6411219469806822692">यापेक्षा वर जाऊ शकत नाही. पेजच्या आणखी वरून सुरुवात करून पहा.</translation> @@ -896,8 +899,9 @@ <translation id="6541983376925655882">{NUM_HOURS,plural, =1{एका तासापूर्वी तपासले}other{# तासांपूर्वी तपासले}}</translation> <translation id="6545017243486555795">सर्व डेटा साफ करा</translation> <translation id="6546511553472444032">फाइल हानिकारक असू शकते</translation> +<translation id="6556542240154580383">{TAB_COUNT,plural, =1{<ph name="TAB_TITLE" /> आणि आणखी <ph name="TAB_COUNT_ONE" /> टॅब बंद केला जाईल}other{<ph name="TAB_TITLE" /> आणि आणखी <ph name="TAB_COUNT_MANY" /> टॅब बंद केले जातील}}</translation> <translation id="6560414384669816528">Sogou सह शोध करा</translation> -<translation id="656065428026159829">आणखी पाहा</translation> +<translation id="656065428026159829">आणखी पहा</translation> <translation id="6565959834589222080">उपलब्ध असेल तेव्हा वाय-फाय वापरला जातो</translation> <translation id="6566259936974865419">Chrome ने तुमच्यासाठी <ph name="GIGABYTES" /> GB सेव्ह केले आहे</translation> <translation id="6569373978618239158">आता, तुम्ही नवीन टॅब उघडल्यानंतर तुम्हाला <ph name="SITE_NAME" /> वरील स्टोरी दिसतील. तुम्ही फॉलो करता त्या साइट तुमच्या Google खात्यामध्ये सेव्ह केल्या जातात. तुम्ही त्या Discover सेटिंग्जमध्ये व्यवस्थापित करू शकता.</translation> @@ -913,7 +917,7 @@ <translation id="661266467055912436">तुमच्यासाठी आणि वेबवरील प्रत्येकजणासाठी सुरक्षिततेत सुधारणा करते.</translation> <translation id="6618554661997243500">तुमच्यासाठी टॉप साइट आणि स्टोरी पाहण्यासाठी, होम बटणावर टॅप करा</translation> <translation id="6627583120233659107">फोल्डर संपादित करा</translation> -<translation id="663674369910034433">गोपनीयता, सुरक्षा आणि डेटा संग्रह यांच्याशी संबंधित आणखी सेटिंग्जसाठी, <ph name="BEGIN_LINK1" />सिंक<ph name="END_LINK1" /> आणि <ph name="BEGIN_LINK2" />Google सेवा<ph name="END_LINK2" /> पाहा</translation> +<translation id="663674369910034433">गोपनीयता, सुरक्षा आणि डेटा संग्रह यांच्याशी संबंधित आणखी सेटिंग्जसाठी, <ph name="BEGIN_LINK1" />सिंक<ph name="END_LINK1" /> आणि <ph name="BEGIN_LINK2" />Google सेवा<ph name="END_LINK2" /> पहा</translation> <translation id="6643016212128521049">साफ करा</translation> <translation id="6643649862576733715">वाचवलेल्या डेटानुसार क्रमाने लावा</translation> <translation id="6648977384226967773">{CONTACT,plural, =1{<ph name="CONTACT_PREVIEW" />\u2026 आणि <ph name="NUMBER_OF_ADDITIONAL_CONTACTS" /> अधिक}other{<ph name="CONTACT_PREVIEW" />\u2026 आणि <ph name="NUMBER_OF_ADDITIONAL_CONTACTS" /> अधिक}}</translation> @@ -936,6 +940,7 @@ <translation id="6767294960381293877">अर्ध्या उंचीवर उघडलेल्या टॅबसह शेअर करण्यासाठी डिव्हाइसची सूची.</translation> <translation id="6783942555455976443">हे पेज नंतर वाचण्यासाठी सेव्ह करा आणि रिमाइंडर मिळवा</translation> <translation id="6795633245022906657">झटपट नवीन टॅब उघडा. हा शॉर्टकट संपादित करण्यासाठी, सेटिंग्ज वर जा.</translation> +<translation id="6802555630140434547">विंडो बंद केली जाईल</translation> <translation id="6811034713472274749">पेज पाहाण्यासाठी तयार आहे</translation> <translation id="6813446258015311409">Chrome मध्ये साइन इन करा, उघडले.</translation> <translation id="6817747507826986771">हे पेज झटपट शेअर करा. हा शॉर्टकट संपादित करण्यासाठी, स्पर्श करा आणि धरून ठेवा.</translation> @@ -1163,6 +1168,7 @@ <translation id="8109613176066109935">तुमच्या सर्व डिव्हाइसवरील तुमचे बुकमार्क मिळवण्यासाठी, सिंक सुरू करा</translation> <translation id="8110087112193408731">Digital wellbeing मध्ये तुमची Chrome ॲक्टिव्हिटी दाखवायची का?</translation> <translation id="8127542551745560481">होमपेज संपादित करा</translation> +<translation id="8130309322784422030">तुमची स्टोअर केलेली साइन-इनशी संबंधित माहिती कदाचित कालबाह्य झाली आहे</translation> <translation id="813082847718468539">साइटची माहिती पहा</translation> <translation id="8137558756159375272">शोधण्यासाठी स्पर्श करा हे Google Search कडे संदर्भ म्हणून निवडलेला शब्द आणि वर्तमान पृष्ठ पाठविते. तुम्ही हे <ph name="BEGIN_LINK" />सेटिंग्ज<ph name="END_LINK" /> मध्ये बंद करू शकता.</translation> <translation id="8153351135626613369">सपोर्ट असलेल्या वेबसाइटवर तुमची मदत करू शकेल असे Assistant ने डिटेक्ट केल्यास ते दिसेल</translation> @@ -1183,7 +1189,7 @@ <translation id="8260126382462817229">पुन्हा साइन इन करण्याचा प्रयत्न करा</translation> <translation id="8261506727792406068">हटवा</translation> <translation id="8266862848225348053">डाउनलोड करण्याचे स्थान</translation> -<translation id="8274165955039650276">डाउनलोड पाहा</translation> +<translation id="8274165955039650276">डाउनलोड पहा</translation> <translation id="8281886186245836920">वगळा</translation> <translation id="8284326494547611709">मथळे</translation> <translation id="829672787777123339">तुमच्या डिव्हाइसशी कनेक्ट करत आहे…</translation> @@ -1194,7 +1200,7 @@ <translation id="8349013245300336738">वापरलेल्या डेटानुसार क्रमाने लावा</translation> <translation id="8354977102499939946">तुमचा आवाज वापरून झटपट शोधा. हा शॉर्टकट संपादित करण्यासाठी, सेटिंग्ज वर जा.</translation> <translation id="835847953965672673"><ph name="NUMBER_OF_DOWNLOADS" /> डाउनलोड रिस्टोअर केले</translation> -<translation id="8364299278605033898">लोकप्रिय वेबसाइट पाहा</translation> +<translation id="8364299278605033898">लोकप्रिय वेबसाइट पहा</translation> <translation id="8387617938027387193">हे तुम्हीच आहात याची पडताळणी करा</translation> <translation id="8393700583063109961">संदेश पाठवा</translation> <translation id="8410695015584479363">किमती ट्रॅक करा</translation> @@ -1293,6 +1299,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> - ही भाषा डाउनलोड करता आली नाही. नंतर पुन्हा प्रयत्न करा.</translation> <translation id="8951232171465285730">Chrome ने तुमच्यासाठी <ph name="MEGABYTES" /> MB सेव्ह केले</translation> <translation id="8965591936373831584">प्रलंबित</translation> +<translation id="8968085728801125376">{TAB_COUNT,plural, =1{<ph name="INCOGNITO_TAB_COUNT" /> गुप्त आणि आणखी <ph name="TAB_COUNT_ONE" /> टॅब बंद केला जाईल}other{<ph name="INCOGNITO_TAB_COUNT" /> गुप्त आणि आणखी <ph name="TAB_COUNT_MANY" /> टॅब बंद केले जातील}}</translation> <translation id="8970887620466824814">काहीतरी चूक झाली.</translation> <translation id="8972098258593396643">डीफॉल्ट फोल्डरमध्ये डाउनलोड करायचे?</translation> <translation id="8987641763863173640">व्हिडिओ पूर्वावलोकन सेटिंग्ज व्यवस्थापित करा</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 959acf9..95ae6c4e 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Lihat</translation> <translation id="4860895144060829044">Hubungi</translation> <translation id="4864369630010738180">Sedang log masuk...</translation> -<translation id="4865987431642283918">Bahasa lalai peranti</translation> <translation id="4866368707455379617">Tidak dapat memasang <ph name="MODULE" /> untuk Chrome</translation> <translation id="4875775213178255010">Cadangan Kandungan</translation> <translation id="4877678010818027629">Masuk ke mod Inkognito</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 761528a..a629c35 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">မြင်ကွင်း</translation> <translation id="4860895144060829044">ဖုန်းခေါ်ရန်</translation> <translation id="4864369630010738180">လက်မှတ်ထိုးဝင်နေသည်...</translation> -<translation id="4865987431642283918">စက်၏ မူရင်းဘာသာစကား</translation> <translation id="4866368707455379617">Chrome အတွက် <ph name="MODULE" /> ကို စနစ်ထည့်သွင်း၍ မရပါ</translation> <translation id="4875775213178255010">အကြောင်းအရာ အကြံပြုချက်များ</translation> <translation id="4877678010818027629">ရုပ်ဖျက်မုဒ်သို့ ဝင်ရန်</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 79346b5..9474c5e 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
@@ -181,6 +181,7 @@ <translation id="2158408438301413340">Chrome ले सबै पासवर्डहरू जाँच्न सकेन</translation> <translation id="2169830938017475061">अहिले</translation> <translation id="2172688499998841696">'फोटोको वर्णन' सुविधा अफ छ</translation> +<translation id="2172905120685242547">विन्डो बन्द गर्ने हो?</translation> <translation id="2175927920773552910">QR कोड</translation> <translation id="218608176142494674">आदान प्रदान गर्दै</translation> <translation id="2195339740518523951">Chrome को सबैभन्दा बलियो सुरक्षा विकल्प चयन गर्नुहोस्</translation> @@ -280,6 +281,7 @@ <translation id="2779651927720337254">डाउनलोड गर्न सकिएन</translation> <translation id="2781151931089541271">१ सेकेन्ड बाँकी छ</translation> <translation id="2788468313014644040">समूह नम्बर</translation> +<translation id="2800066122460699237"><ph name="TAB_TITLE" /> ट्याब बन्द गरिने छ</translation> <translation id="2801022321632964776">Chrome को नवीनतम संस्करणमा आफ्नो भाषा प्राप्त गर्न अपडेट गर्नुहोस्</translation> <translation id="2805756323405976993">एप्स</translation> <translation id="2806840421670364300">FLoC</translation> @@ -288,6 +290,7 @@ <translation id="2827278682606527653">फिड कार्ड मेनु आधा उचाइमा खुला छ</translation> <translation id="2830783625999891985">क्लिपबोर्डमा भएका सामग्री लुकाइए</translation> <translation id="2839327205551510876"><ph name="SITE_NAME" /> अनफलो गरियो</translation> +<translation id="2840810876587895427">{TAB_COUNT,plural, =1{<ph name="TAB_COUNT_ONE" /> इन्कोग्निटो ट्याब बन्द गरिने छ}other{<ph name="TAB_COUNT_MANY" /> वटा इन्कोग्निटो ट्याब बन्द गरिने छन्}}</translation> <translation id="2841216154655874070">{NUM_DAYS,plural, =1{१ दिनअघि जाँच गरिएको}other{# दिनअघि जाँच गरिएको}}</translation> <translation id="2842985007712546952">अभिभावक फोल्डर</translation> <translation id="2856503607207334158">साइन इन गर्न सकिएन</translation> @@ -604,7 +607,6 @@ <translation id="4850886885716139402">हेर्नुहोस्</translation> <translation id="4860895144060829044">कल गर्नुहोस्</translation> <translation id="4864369630010738180">साइन इन गरिँदै...</translation> -<translation id="4865987431642283918">यन्त्रको डिफल्ट भाषा</translation> <translation id="4866368707455379617">Chrome को <ph name="MODULE" /> स्थापना गर्न सकिएन</translation> <translation id="4875775213178255010">सामग्रीसम्बन्धी सुझावहरू</translation> <translation id="4877678010818027629">इन्कोग्निटो मोडमा जानुहोस्</translation> @@ -672,6 +674,7 @@ <translation id="5222676887888702881">साइन आउट गर्नुहोस्</translation> <translation id="5227554086496586518">खोज परिणामहरू हेर्न ट्याप गर्नुहोस्</translation> <translation id="5233638681132016545">नयाँ ट्याब</translation> +<translation id="5235196193381275927">साइन इन गर्ने क्रममा केही चिज गडबड भयो</translation> <translation id="5246093389635966745">टुलबारको सर्टकट सम्पादन गर्नुहोस्</translation> <translation id="5250483651202458397">स्क्रिनसट। बन्द गर्न ट्याप गर्नुहोस्।</translation> <translation id="5262378156578470238"><ph name="DATE" /> मा यो डाउनलोड सुरु हुँदा तपाईं एउटा सूचना देख्नु हुने छ।</translation> @@ -895,6 +898,7 @@ <translation id="6541983376925655882">{NUM_HOURS,plural, =1{१ घन्टाअघि जाँच गरिएको}other{# घन्टाअघि जाँच गरिएको}}</translation> <translation id="6545017243486555795">सबै डेटा मेटाउनुहोस्</translation> <translation id="6546511553472444032">यो फाइल हानिकारक हुन सक्छ</translation> +<translation id="6556542240154580383">{TAB_COUNT,plural, =1{<ph name="TAB_TITLE" /> र अर्को <ph name="TAB_COUNT_ONE" /> ट्याब बन्द गरिने छन्}other{<ph name="TAB_TITLE" /> र अरू <ph name="TAB_COUNT_MANY" /> वटा ट्याब बन्द गरिने छन्}}</translation> <translation id="6560414384669816528">Sogou मार्फत खोजी गर्नुहोस्</translation> <translation id="656065428026159829">थप हेर्नुहोस्</translation> <translation id="6565959834589222080">Wi-Fi उपलब्ध हुँदा मोबाइल डेटा प्रयोग गरिँदैन</translation> @@ -935,6 +939,7 @@ <translation id="6767294960381293877">ट्याब आदान प्रदान गरिनु पर्ने डिभाइसहरूको सूची आधा उचाइमा खोलिएको छ।</translation> <translation id="6783942555455976443">यो पृष्ठ पछि पढ्ने प्रयोजनका लागि सेभ गर्नुहोस् र रिमाइन्डर प्राप्त गर्नुहोस्</translation> <translation id="6795633245022906657">तुरुन्तै नयाँ ट्याब खोल्नुहोस्। यो सर्टकट परिवर्तन गर्न सेटिङमा जानुहोस्।</translation> +<translation id="6802555630140434547">यो विन्डो बन्द गरिने छ</translation> <translation id="6811034713472274749">पृष्ठ हेर्नका लागि तयार छ</translation> <translation id="6813446258015311409">Chrome मा साइन इन गर्ने पेज खोलियो।</translation> <translation id="6817747507826986771">यो पेज छिटोछरितो रूपमा सेयर गर्नुहोस्। यो सर्टकट सम्पादन गर्न टच एण्ड होल्ड गर्नुहोस्।</translation> @@ -1162,6 +1167,7 @@ <translation id="8109613176066109935">आफ्ना सबै डिभाइसमा पुस्तक चिन्हहरू प्राप्त गर्न सिंक गर्ने सुविधा सक्रिय गर्नुहोस्</translation> <translation id="8110087112193408731">तपाईंले Chrome मा गर्नुभएका क्रियाकलाप डिजिटल वेलबिइङमा देखाउने हो?</translation> <translation id="8127542551745560481">गृहपृष्ठ सम्पदान गर्नुहोस्</translation> +<translation id="8130309322784422030">तपाईंले भण्डारण गर्नुभएको युजरनेम र पासवर्ड पुरानो हुन सक्छ</translation> <translation id="813082847718468539">साइट जानकारी हेर्नुहोस्</translation> <translation id="8137558756159375272">खोजी गर्न छुनुहोस् कार्यले चयन गरेको शब्द र सोही पृष्ठलाई सन्दर्भको रूपमा Google खोजीमा पठाउँछ। तपाईं यसलाई <ph name="BEGIN_LINK" /> सेटिङ <ph name="END_LINK" /> मा बन्द गर्न सक्नुहुन्छ।</translation> <translation id="8153351135626613369">सहायकले केही वेबसाइटहरूमा तपाईंको मद्दत गर्न सक्ने कुरा पहिचान गरेपछि उक्त वेबसाइटहरूमा सहायक देखा पर्ने छ</translation> @@ -1292,6 +1298,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> - यो भाषा डाउनलोड गर्न सकिएन। पछि फेरि प्रयास गर्नुहोस्।</translation> <translation id="8951232171465285730">Chrome ले तपाईंको <ph name="MEGABYTES" /> एम.बि. बचाएको छ</translation> <translation id="8965591936373831584">विचाराधीन</translation> +<translation id="8968085728801125376">{TAB_COUNT,plural, =1{<ph name="INCOGNITO_TAB_COUNT" /> वटा इन्कोग्निटो ट्याबका साथै अर्को <ph name="TAB_COUNT_ONE" /> ट्याब बन्द गरिने छन्}other{<ph name="INCOGNITO_TAB_COUNT" /> वटा इन्कोग्निटो ट्याबका साथै अरू <ph name="TAB_COUNT_MANY" /> वटा ट्याब बन्द गरिने छन्}}</translation> <translation id="8970887620466824814">केही चिज गडबड भयो।</translation> <translation id="8972098258593396643">डिफल्ट फोल्डरमा डाउनलोड गर्ने हो?</translation> <translation id="8987641763863173640">भिडियोको प्रिभ्यू हेर्ने सुविधासम्बन्धी सेटिङ मिलाउनुहोस्</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 8c98e9d..27404b1 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Weergave</translation> <translation id="4860895144060829044">Bellen</translation> <translation id="4864369630010738180">Inloggen...</translation> -<translation id="4865987431642283918">Standaardtaal van apparaat</translation> <translation id="4866368707455379617">Kan <ph name="MODULE" /> niet installeren voor Chrome</translation> <translation id="4875775213178255010">Contentsuggesties</translation> <translation id="4877678010818027629">Incognitomodus starten</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 6d0aadf..dd4a5cf 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Visning</translation> <translation id="4860895144060829044">Ring</translation> <translation id="4864369630010738180">Logger på ...</translation> -<translation id="4865987431642283918">Standard enhetsspråk</translation> <translation id="4866368707455379617">Kan ikke installere <ph name="MODULE" /> for Chrome</translation> <translation id="4875775213178255010">Innholdsforslag</translation> <translation id="4877678010818027629">Slå på Inkognitomodus</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 54f7b12..f1846e8 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
@@ -605,7 +605,6 @@ <translation id="4850886885716139402">ଦେଖନ୍ତୁ</translation> <translation id="4860895144060829044">କଲ୍ କରନ୍ତୁ</translation> <translation id="4864369630010738180">ସାଇନ୍ ଇନ୍ ହେଉଛି…</translation> -<translation id="4865987431642283918">ଡିଭାଇସର ଡିଫଲ୍ଟ ଭାଷା</translation> <translation id="4866368707455379617">Chrome ପାଇଁ <ph name="MODULE" /> ଇନ୍ଷ୍ଟଲ୍ କରିବାରେ ଅକ୍ଷମ</translation> <translation id="4875775213178255010">ବିଷୟବସ୍ତୁ ପରାମର୍ଶ</translation> <translation id="4877678010818027629">ଇନକଗ୍ନିଟୋ ମୋଡକୁ ଯାଆନ୍ତୁ</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 a993a4d..66e59f4 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
@@ -181,6 +181,7 @@ <translation id="2158408438301413340">Chrome ਸਾਰੇ ਪਾਸਵਰਡਾਂ ਦੀ ਜਾਂਚ ਨਹੀਂ ਕਰ ਸਕਿਆ</translation> <translation id="2169830938017475061">ਹੁਣੇ</translation> <translation id="2172688499998841696">ਚਿੱਤਰ ਦੇ ਵਰਣਨ ਬੰਦ ਹਨ</translation> +<translation id="2172905120685242547">ਕੀ ਵਿੰਡੋ ਨੂੰ ਬੰਦ ਕਰਨਾ ਹੈ?</translation> <translation id="2175927920773552910">QR ਕੋਡ</translation> <translation id="218608176142494674">ਸਾਂਝਾਕਰਨ</translation> <translation id="2195339740518523951">Chrome ਦੀ ਸਭ ਤੋਂ ਮਜਬੂਤ ਸੁਰੱਖਿਆ ਪ੍ਰਾਪਤ ਕਰੋ</translation> @@ -280,6 +281,7 @@ <translation id="2779651927720337254">ਅਸਫਲ</translation> <translation id="2781151931089541271">1 ਸਕਿੰਟ ਬਾਕੀ</translation> <translation id="2788468313014644040">ਗਰੁੱਪ ਨੰਬਰ</translation> +<translation id="2800066122460699237">ਟੈਬ <ph name="TAB_TITLE" /> ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਜਾਵੇਗਾ</translation> <translation id="2801022321632964776">Chrome ਦੇ ਨਵੀਨਤਮ ਵਰਜਨ ਵਿੱਚ ਆਪਣੀ ਭਾਸ਼ਾ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਅੱਪਡੇਟ ਕਰੋ</translation> <translation id="2805756323405976993">ਐਪਸ</translation> <translation id="2806840421670364300">FLoC</translation> @@ -288,6 +290,7 @@ <translation id="2827278682606527653">ਫ਼ੀਡ ਕਾਰਡ ਮੀਨੂ ਅੱਧਾ ਖੁੱਲ੍ਹਾ ਹੈ</translation> <translation id="2830783625999891985">ਕਲਿੱਪਬੋਰਡ ਦੀਆਂ ਸਮੱਗਰੀਆਂ ਲੁਕਾਈਆਂ ਗਈਆਂ</translation> <translation id="2839327205551510876"><ph name="SITE_NAME" /> ਦਾ ਅਨੁਸਰਣ ਬੰਦ ਕੀਤਾ ਗਿਆ</translation> +<translation id="2840810876587895427">{TAB_COUNT,plural, =1{<ph name="TAB_COUNT_ONE" /> ਇਨਕੋਗਨਿਟੋ ਟੈਬ ਨੂੰ ਬੰਦ ਕੀਤਾ ਜਾਵੇਗਾ}one{<ph name="TAB_COUNT_MANY" /> ਇਨਕੋਗਨਿਟੋ ਟੈਬ ਨੂੰ ਬੰਦ ਕੀਤਾ ਜਾਵੇਗਾ}other{<ph name="TAB_COUNT_MANY" /> ਇਨਕੋਗਨਿਟੋ ਟੈਬਾਂ ਨੂੰ ਬੰਦ ਕੀਤਾ ਜਾਵੇਗਾ}}</translation> <translation id="2841216154655874070">{NUM_DAYS,plural, =1{1 ਦਿਨ ਪਹਿਲਾਂ ਜਾਂਚ ਕੀਤੀ ਗਈ}one{# ਦਿਨ ਪਹਿਲਾਂ ਜਾਂਚ ਕੀਤੀ ਗਈ}other{# ਦਿਨ ਪਹਿਲਾਂ ਜਾਂਚ ਕੀਤੀ ਗਈ}}</translation> <translation id="2842985007712546952">ਪੇਰੈਂਟ ਫੋਲਡਰ</translation> <translation id="2856503607207334158">ਸਾਈਨ-ਇਨ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ</translation> @@ -605,7 +608,6 @@ <translation id="4850886885716139402">ਦੇਖੋ</translation> <translation id="4860895144060829044">ਕਾਲ ਕਰੋ</translation> <translation id="4864369630010738180">ਸਾਈਨ ਇਨ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...</translation> -<translation id="4865987431642283918">ਪੂਰਵ-ਨਿਰਧਾਰਤ ਡੀਵਾਈਸ ਭਾਸ਼ਾ</translation> <translation id="4866368707455379617">Chrome ਲਈ <ph name="MODULE" /> ਨੂੰ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ</translation> <translation id="4875775213178255010">ਸਮੱਗਰੀ ਦੇ ਸੁਝਾਅ</translation> <translation id="4877678010818027629">ਇਨਕੋਗਨਿਟੋ ਮੋਡ ਵਿੱਚ ਦਾਖਲ ਹੋਵੋ</translation> @@ -673,6 +675,7 @@ <translation id="5222676887888702881">ਸਾਈਨ-ਆਊਟ ਕਰੋ</translation> <translation id="5227554086496586518">ਖੋਜ ਨਤੀਜੇ ਦੇਖਣ ਲਈ ਟੈਪ ਕਰੋ</translation> <translation id="5233638681132016545">ਨਵੀਂ ਟੈਬ</translation> +<translation id="5235196193381275927">ਸਾਈਨ-ਇਨ ਦੌਰਾਨ ਕੋਈ ਗੜਬੜ ਹੋ ਗਈ</translation> <translation id="5246093389635966745">ਟੂਲਬਾਰ ਸ਼ਾਰਟਕੱਟ ਦਾ ਸੰਪਾਦਨ ਕਰੋ</translation> <translation id="5250483651202458397">ਸਕ੍ਰੀਨਸ਼ਾਟ। ਬੰਦ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।</translation> <translation id="5262378156578470238"><ph name="DATE" /> ਨੂੰ ਇਸ ਡਾਊਨਲੋਡ ਦੇ ਸ਼ੁਰੂ ਹੋਣ 'ਤੇ ਤੁਹਾਨੂੰ ਸੂਚਨਾ ਦਿਸੇਗੀ।</translation> @@ -896,6 +899,7 @@ <translation id="6541983376925655882">{NUM_HOURS,plural, =1{1 ਘੰਟਾ ਪਹਿਲਾਂ ਜਾਂਚ ਕੀਤੀ ਗਈ}one{# ਘੰਟਾ ਪਹਿਲਾਂ ਜਾਂਚ ਕੀਤੀ ਗਈ}other{# ਘੰਟੇ ਪਹਿਲਾਂ ਜਾਂਚ ਕੀਤੀ ਗਈ}}</translation> <translation id="6545017243486555795">ਸਾਰਾ ਡਾਟਾ ਕਲੀਅਰ ਕਰੋ</translation> <translation id="6546511553472444032">ਫ਼ਾਈਲ ਹਾਨੀਕਾਰਕ ਹੋ ਸਕਦੀ ਹੈ</translation> +<translation id="6556542240154580383">{TAB_COUNT,plural, =1{<ph name="TAB_TITLE" /> ਅਤੇ <ph name="TAB_COUNT_ONE" /> ਹੋਰ ਟੈਬ ਨੂੰ ਬੰਦ ਕੀਤਾ ਜਾਵੇਗਾ}one{<ph name="TAB_TITLE" /> ਅਤੇ <ph name="TAB_COUNT_MANY" /> ਹੋਰ ਟੈਬ ਨੂੰ ਬੰਦ ਕੀਤਾ ਜਾਵੇਗਾ}other{<ph name="TAB_TITLE" /> ਅਤੇ <ph name="TAB_COUNT_MANY" /> ਹੋਰ ਟੈਬਾਂ ਨੂੰ ਬੰਦ ਕੀਤਾ ਜਾਵੇਗਾ}}</translation> <translation id="6560414384669816528">Sogou ਨਾਲ ਖੋਜੋ</translation> <translation id="656065428026159829">ਹੋਰ ਦੇਖੋ</translation> <translation id="6565959834589222080">ਉਪਲਬਧ ਹੋਣ 'ਤੇ ਵਾਈ-ਫਾਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ</translation> @@ -936,6 +940,7 @@ <translation id="6767294960381293877">ਟੈਬ ਨੂੰ ਸਾਂਝਾ ਕਰਨ ਵਾਲੇ ਡੀਵਾਈਸਾਂ ਦੀ ਸੂਚੀ ਅੱਧੀ ਉਚਾਈ 'ਤੇ ਖੁੱਲ੍ਹੀ ਹੋਈ ਹੈ।</translation> <translation id="6783942555455976443">ਇਸ ਪੰਨੇ ਨੂੰ ਬਾਅਦ ਵਿੱਚ ਪੜ੍ਹਣ ਲਈ ਰੱਖਿਅਤ ਕਰੋ ਅਤੇ ਇਸ ਲਈ ਇੱਕ ਯਾਦ-ਸੂਚਨਾ ਪ੍ਰਾਪਤ ਕਰੋ</translation> <translation id="6795633245022906657">ਤੁਰੰਤ ਨਵੀਂ ਟੈਬ ਖੋਲ੍ਹੋ। ਇਸ ਸ਼ਾਰਟਕੱਟ ਦਾ ਸੰਪਾਦਨ ਕਰਨ ਲਈ, ਸੈਟਿੰਗਾਂ 'ਤੇ ਜਾਓ।</translation> +<translation id="6802555630140434547">ਵਿੰਡੋ ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਜਾਵੇਗਾ</translation> <translation id="6811034713472274749">ਦੇਖਣ ਲਈ ਪੰਨਾ ਤਿਆਰ ਹੈ</translation> <translation id="6813446258015311409">Chrome ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰੋ, ਖੋਲ੍ਹਿਆ ਗਿਆ।</translation> <translation id="6817747507826986771">ਇਸ ਪੰਨੇ ਨੂੰ ਤੁਰੰਤ ਸਾਂਝਾ ਕਰੋ। ਇਸ ਸ਼ਾਰਟਕੱਟ ਦਾ ਸੰਪਾਦਨ ਕਰਨ ਲਈ, ਸਪਰਸ਼ ਕਰਕੇ ਰੱਖੋ।</translation> @@ -1163,6 +1168,7 @@ <translation id="8109613176066109935">ਆਪਣੇ ਸਾਰੇ ਡੀਵਾਈਸਾਂ 'ਤੇ ਆਪਣੇ ਬੁੱਕਮਾਰਕ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ, ਸਮਕਾਲੀਕਰਨ ਚਾਲੂ ਕਰੋ</translation> <translation id="8110087112193408731">ਕੀ ਤੁਸੀਂ ਡਿਜੀਟਲ ਜੀਵਨਸ਼ੈਲੀ ਵਿੱਚ ਆਪਣੀ Chrome ਸਰਗਰਮੀ ਦਿਖਾਉਣੀ ਹੈ?</translation> <translation id="8127542551745560481">ਹੋਮਪੇਜ ਦਾ ਸੰਪਾਦਨ ਕਰੋ</translation> +<translation id="8130309322784422030">ਤੁਹਾਡੇ ਵੱਲੋਂ ਸਟੋਰ ਕੀਤੀ ਸਾਈਨ-ਇਨ ਜਾਣਕਾਰੀ ਸ਼ਾਇਦ ਪੁਰਾਣੀ ਹੋਵੇ</translation> <translation id="813082847718468539">ਸਾਈਟ ਜਾਣਕਾਰੀ ਦੇਖੋ</translation> <translation id="8137558756159375272">'ਖੋਜਣ ਲਈ ਸਪਰਸ਼ ਕਰੋ' ਵਿਸ਼ੇਸ਼ਤਾ ਚੁਣੇ ਹੋਏ ਸ਼ਬਦ ਅਤੇ ਵਰਤਮਾਨ ਪੰਨੇ ਨੂੰ ਸੰਦਰਭ ਵਜੋਂ 'Google ਖੋਜ' 'ਤੇ ਭੇਜਦੀ ਹੈ। ਤੁਸੀਂ ਇਸਨੂੰ <ph name="BEGIN_LINK" />ਸੈਟਿੰਗਾਂ<ph name="END_LINK" /> ਵਿੱਚ ਬੰਦ ਕਰ ਸਕਦੇ ਹੋ।</translation> <translation id="8153351135626613369">ਜਦੋਂ Assistant ਨੂੰ ਸਮਰਥਿਤ ਵੈੱਬਸਾਈਟਾਂ 'ਤੇ ਤੁਹਾਡੀ ਮਦਦ ਕਰ ਸਕਣ ਬਾਰੇ ਪਤਾ ਲੱਗਦਾ ਹੈ, ਤਾਂ ਉਹ ਦਿਖਾਈ ਦੇਵੇਗੀ</translation> @@ -1293,6 +1299,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> - ਇਹ ਭਾਸ਼ਾ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ। ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="8951232171465285730">Chrome ਨੇ ਤੁਹਾਡੀ <ph name="MEGABYTES" /> MB ਦੀ ਬਚਤ ਕੀਤੀ ਹੈ</translation> <translation id="8965591936373831584">ਵਿਚਾਰ-ਅਧੀਨ</translation> +<translation id="8968085728801125376">{TAB_COUNT,plural, =1{<ph name="INCOGNITO_TAB_COUNT" /> ਇਨਕੋਗਨਿਟੋ ਅਤੇ <ph name="TAB_COUNT_ONE" /> ਹੋਰ ਟੈਬ ਨੂੰ ਬੰਦ ਕੀਤਾ ਜਾਵੇਗਾ}one{<ph name="INCOGNITO_TAB_COUNT" /> ਇਨਕੋਗਨਿਟੋ ਅਤੇ <ph name="TAB_COUNT_MANY" /> ਹੋਰ ਟੈਬ ਨੂੰ ਬੰਦ ਕੀਤਾ ਜਾਵੇਗਾ}other{<ph name="INCOGNITO_TAB_COUNT" /> ਇਨਕੋਗਨਿਟੋ ਅਤੇ <ph name="TAB_COUNT_MANY" /> ਹੋਰ ਟੈਬਾਂ ਨੂੰ ਬੰਦ ਕੀਤਾ ਜਾਵੇਗਾ}}</translation> <translation id="8970887620466824814">ਕੋਈ ਗੜਬੜ ਹੋ ਗਈ।</translation> <translation id="8972098258593396643">ਕੀ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਫੋਲਡਰ ਵਿੱਚ ਡਾਊਨਲੋਡ ਕਰਨਾ ਹੈ?</translation> <translation id="8987641763863173640">ਵੀਡੀਓ ਪੂਰਵ-ਝਲਕ ਸੈਟਿੰਗਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ</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 30abff9..ccc7f6a 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Widok</translation> <translation id="4860895144060829044">Zadzwoń</translation> <translation id="4864369630010738180">Loguję...</translation> -<translation id="4865987431642283918">Domyślny język urządzenia</translation> <translation id="4866368707455379617">Nie można zainstalować modułu <ph name="MODULE" /> do Chrome</translation> <translation id="4875775213178255010">Polecane treści</translation> <translation id="4877678010818027629">Włącz tryb incognito</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 930465d3..3332852 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
@@ -609,7 +609,6 @@ <translation id="4850886885716139402">Visualizar</translation> <translation id="4860895144060829044">Ligar</translation> <translation id="4864369630010738180">Fazendo login...</translation> -<translation id="4865987431642283918">Idioma padrão do dispositivo</translation> <translation id="4866368707455379617">Não é possível instalar <ph name="MODULE" /> para o Chrome</translation> <translation id="4875775213178255010">Sugestões de conteúdo</translation> <translation id="4877678010818027629">Entrar no modo de navegação anônima</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 7c103a2..63fdef9 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
@@ -284,7 +284,7 @@ <translation id="2800066122460699237">O separador <ph name="TAB_TITLE" /> será fechado</translation> <translation id="2801022321632964776">Atualize o Chrome para a versão mais recente de modo a obter o seu idioma.</translation> <translation id="2805756323405976993">Apps</translation> -<translation id="2806840421670364300">AFC</translation> +<translation id="2806840421670364300">APC</translation> <translation id="281504910091592009">Veja e faça a gestão das palavras-passe guardadas na sua <ph name="BEGIN_LINK" />Conta Google<ph name="END_LINK" />.</translation> <translation id="2818669890320396765">Para obter os seus marcadores em todos os dispositivos, inicie sessão e ative a sincronização.</translation> <translation id="2827278682606527653">O menu do cartão do feed a meia altura.</translation> @@ -608,7 +608,6 @@ <translation id="4850886885716139402">Ver</translation> <translation id="4860895144060829044">Telefonar</translation> <translation id="4864369630010738180">A iniciar sessão...</translation> -<translation id="4865987431642283918">Idioma do dispositivo predefinido</translation> <translation id="4866368707455379617">Não é possível instalar o módulo <ph name="MODULE" /> para o Chrome.</translation> <translation id="4875775213178255010">Sugestões de conteúdo</translation> <translation id="4877678010818027629">Entre no Modo de navegação anónima</translation> @@ -1220,7 +1219,7 @@ <translation id="8473863474539038330">Endereços e mais</translation> <translation id="8481921391193215807">Quando esta opção está ativada, os sites podem utilizar as técnicas de preservação da privacidade mostradas aqui para fornecer o respetivo conteúdo e serviços. Estas incluem alternativas para a monitorização entre sites. Ao longo do tempo, podem ser adicionadas mais avaliações. -<ph name="BEGIN_LIST_ITEM1" />Os anunciantes e os publicadores podem utilizar a AFC.<ph name="END_LIST_ITEM1" /> +<ph name="BEGIN_LIST_ITEM1" />Os anunciantes e os publicadores podem utilizar a APC.<ph name="END_LIST_ITEM1" /> <ph name="BEGIN_LIST_ITEM2" />Os anunciantes e os publicadores podem estudar a eficácia dos anúncios sem monitorizar a sua navegação em sites.<ph name="END_LIST_ITEM2" /></translation> <translation id="8481980314595922412">As funcionalidades de avaliação estão ativadas</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 9fa6851..727e16d 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Afișează</translation> <translation id="4860895144060829044">Apelează</translation> <translation id="4864369630010738180">Se conectează...</translation> -<translation id="4865987431642283918">Limba prestabilită a dispozitivului</translation> <translation id="4866368707455379617">Nu se poate instala <ph name="MODULE" /> pentru Chrome</translation> <translation id="4875775213178255010">Sugestii de conținut</translation> <translation id="4877678010818027629">Intră în modul incognito</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 3fd3e99..a07ab29 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Посмотреть</translation> <translation id="4860895144060829044">Позвонить</translation> <translation id="4864369630010738180">Вход в систему...</translation> -<translation id="4865987431642283918">Язык устройства по умолчанию</translation> <translation id="4866368707455379617">Не удается установить модуль "<ph name="MODULE" />" для Chrome</translation> <translation id="4875775213178255010">Предлагаемый контент</translation> <translation id="4877678010818027629">Включить режим инкогнито</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 854bbed..4e6cd31 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">දසුන</translation> <translation id="4860895144060829044">අමතන්න</translation> <translation id="4864369630010738180">පුරමින්...</translation> -<translation id="4865987431642283918">පෙරනිමි උපාංග භාෂාව</translation> <translation id="4866368707455379617">Chrome සඳහා <ph name="MODULE" /> ස්ථාපන කළ නොහැක</translation> <translation id="4875775213178255010">අන්තර්ගත යෝජනා</translation> <translation id="4877678010818027629">අප්රසිද්ධ ප්රකාරයට ඇතුළු වන්න</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 49330ce..50da7e18 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Zobraziť</translation> <translation id="4860895144060829044">Volajte</translation> <translation id="4864369630010738180">Prebieha prihlasovanie...</translation> -<translation id="4865987431642283918">Predvolený jazyk zariadenia</translation> <translation id="4866368707455379617">Modul <ph name="MODULE" /> pre Chrome sa nepodarilo nainštalovať</translation> <translation id="4875775213178255010">Návrhy obsahu</translation> <translation id="4877678010818027629">Spustiť režim inkognito</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 9da171f..c9cada4 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Pogled</translation> <translation id="4860895144060829044">Pokličite</translation> <translation id="4864369630010738180">Prijavljanje ...</translation> -<translation id="4865987431642283918">Privzeti jezik v napravi</translation> <translation id="4866368707455379617">Modula <ph name="MODULE" /> za Chrome ni mogoče namestiti</translation> <translation id="4875775213178255010">Predlogi za vsebino</translation> <translation id="4877678010818027629">Vklop anonimnega načina</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 df7503e..509608c 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
@@ -605,7 +605,6 @@ <translation id="4850886885716139402">Pamja</translation> <translation id="4860895144060829044">Telefono</translation> <translation id="4864369630010738180">Po identifikohet...</translation> -<translation id="4865987431642283918">Gjuha e parazgjedhur e pajisjes</translation> <translation id="4866368707455379617"><ph name="MODULE" /> nuk mund të instalohet për Chrome</translation> <translation id="4875775213178255010">Sugjerimet e përmbajtjes</translation> <translation id="4877678010818027629">Hyr në modalitetin "e fshehtë"</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 83d8344..47a81a01 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Prikaz</translation> <translation id="4860895144060829044">Pozovite</translation> <translation id="4864369630010738180">Prijavljivanje...</translation> -<translation id="4865987431642283918">Podrazumevani jezik uređaja</translation> <translation id="4866368707455379617">Instaliranje modula <ph name="MODULE" /> za Chrome nije uspelo</translation> <translation id="4875775213178255010">Predlozi za sadržaj</translation> <translation id="4877678010818027629">Otvori režim bez arhiviranja</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 b4626175..491e60e9 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Приказ</translation> <translation id="4860895144060829044">Позовите</translation> <translation id="4864369630010738180">Пријављивање...</translation> -<translation id="4865987431642283918">Подразумевани језик уређаја</translation> <translation id="4866368707455379617">Инсталирање модула <ph name="MODULE" /> за Chrome није успело</translation> <translation id="4875775213178255010">Предлози за садржај</translation> <translation id="4877678010818027629">Отвори режим без архивирања</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 d00c9cf..e232cccf 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
@@ -451,7 +451,8 @@ <translation id="3810838688059735925">Video</translation> <translation id="3810973564298564668">Hantera</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> nedladdningar har raderats</translation> -<translation id="3845098929839618392">Öppna på inkognitoflik</translation> +<translation id="3845098929839618392">Öppna i inkognitoflik +</translation> <translation id="3856096718352044181">Verifiera att detta är en giltig leverantör eller försök igen senare</translation> <translation id="3858860766373142691">Namn</translation> <translation id="3861633093716975811">Populära videor</translation> @@ -608,7 +609,6 @@ <translation id="4850886885716139402">Visa</translation> <translation id="4860895144060829044">Ring</translation> <translation id="4864369630010738180">Loggar in ...</translation> -<translation id="4865987431642283918">Enhetens standardspråk</translation> <translation id="4866368707455379617">Det gick inte att installera <ph name="MODULE" /> i Chrome</translation> <translation id="4875775213178255010">Förslag på innehåll</translation> <translation id="4877678010818027629">Starta inkognitoläget</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 3b54ba49..b70c937 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Mwonekano</translation> <translation id="4860895144060829044">Piga simu</translation> <translation id="4864369630010738180">Unaingia katika akaunti...</translation> -<translation id="4865987431642283918">Lugha chaguomsingi ya kifaa</translation> <translation id="4866368707455379617">Imeshindwa kusakinisha <ph name="MODULE" /> kwenye Chrome</translation> <translation id="4875775213178255010">Mapendekezo ya Maudhui</translation> <translation id="4877678010818027629">Ingia katika hali fiche</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 5ccc476..7dfdc25 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
@@ -605,7 +605,6 @@ <translation id="4850886885716139402">காட்சி</translation> <translation id="4860895144060829044">அழை</translation> <translation id="4864369630010738180">உள்நுழைகிறீர்கள்...</translation> -<translation id="4865987431642283918">சாதனத்தின் இயல்பு மொழி</translation> <translation id="4866368707455379617">Chromeமுக்கான <ph name="MODULE" />ஐ நிறுவ முடியவில்லை</translation> <translation id="4875775213178255010">உள்ளடக்கப் பரிந்துரைகள்</translation> <translation id="4877678010818027629">மறைநிலையில் திறக்கும்</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 970e3d4e..7cee2c7 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
@@ -605,7 +605,6 @@ <translation id="4850886885716139402">వీక్షణ</translation> <translation id="4860895144060829044">కాల్ చేయండి</translation> <translation id="4864369630010738180">సైన్ ఇన్ అవుతోంది...</translation> -<translation id="4865987431642283918">ఆటోమేటిక్ పరికర భాష</translation> <translation id="4866368707455379617">Chromeలో <ph name="MODULE" />ని ఇన్స్టాల్ చేయడం సాధ్యపడలేదు</translation> <translation id="4875775213178255010">కంటెంట్ సూచనలు</translation> <translation id="4877678010818027629">అజ్ఞాత మోడ్లోకి ఎంటర్ అవ్వండి</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 04104a0..b8827fc 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">มุมมอง</translation> <translation id="4860895144060829044">โทร</translation> <translation id="4864369630010738180">กำลังลงชื่อเข้าใช้...</translation> -<translation id="4865987431642283918">ภาษาเริ่มต้นของอุปกรณ์</translation> <translation id="4866368707455379617">ติดตั้ง <ph name="MODULE" /> สำหรับ Chrome ไม่ได้</translation> <translation id="4875775213178255010">การแนะนำเนื้อหา</translation> <translation id="4877678010818027629">เข้าสู่โหมดไม่ระบุตัวตน</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 e499a36..5e0cb14d 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Görüntüle</translation> <translation id="4860895144060829044">Telefon et</translation> <translation id="4864369630010738180">Oturum açılıyor...</translation> -<translation id="4865987431642283918">Varsayılan cihaz dili</translation> <translation id="4866368707455379617">Chrome için <ph name="MODULE" /> yüklenemiyor</translation> <translation id="4875775213178255010">İçerik Önerileri</translation> <translation id="4877678010818027629">Gizli moda geç</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 155a941..672a461 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Перегляд</translation> <translation id="4860895144060829044">Зателефонувати</translation> <translation id="4864369630010738180">Вхід…</translation> -<translation id="4865987431642283918">Мова пристрою за умовчанням</translation> <translation id="4866368707455379617">Не вдалося встановити модуль <ph name="MODULE" /> для Chrome</translation> <translation id="4875775213178255010">Пропозиції вмісту</translation> <translation id="4877678010818027629">Увімкнути режим анонімного перегляду</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 2495aaa7..a308656 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
@@ -181,6 +181,7 @@ <translation id="2158408438301413340">Chrome سبھی پاس ورڈز چیک نہیں کر سکا</translation> <translation id="2169830938017475061">ابھی</translation> <translation id="2172688499998841696">تصویر کی تفصیلات آف ہیں</translation> +<translation id="2172905120685242547">ونڈو کو بند کر دیں؟</translation> <translation id="2175927920773552910">QR کوڈ</translation> <translation id="218608176142494674">اشتراک</translation> <translation id="2195339740518523951">Chrome کی مضبوط ترین سیکیورٹی حاصل کریں</translation> @@ -280,6 +281,7 @@ <translation id="2779651927720337254">ناکام ہو گیا</translation> <translation id="2781151931089541271">1 سیکنڈ باقی</translation> <translation id="2788468313014644040">گروپ نمبر</translation> +<translation id="2800066122460699237"><ph name="TAB_TITLE" /> ٹیب کو بند کر دیا جائے گا</translation> <translation id="2801022321632964776">Chrome کے تازہ ترین ورژن میں اپنی زبان حاصل کرنے کے لیے اپ ڈیٹ کریں</translation> <translation id="2805756323405976993">اطلاقات</translation> <translation id="2806840421670364300">FLoC</translation> @@ -288,6 +290,7 @@ <translation id="2827278682606527653">نصف اونچائی پر فیڈ کارڈ مینو</translation> <translation id="2830783625999891985">کلپ بورڈ کے مواد پوشیدہ ہو گئے</translation> <translation id="2839327205551510876"><ph name="SITE_NAME" /> کی پیروی ختم کی گئی</translation> +<translation id="2840810876587895427">{TAB_COUNT,plural, =1{<ph name="TAB_COUNT_ONE" /> پوشیدگی ٹیب کو بند کر دیا جائے گا}other{<ph name="TAB_COUNT_MANY" /> پوشیدگی ٹیبز کو بند کر دیا جائے گا}}</translation> <translation id="2841216154655874070">{NUM_DAYS,plural, =1{1 دن پہلے چیک کیا گیا}other{# دن پہلے چیک کیا گیا}}</translation> <translation id="2842985007712546952">پیرینٹ فولڈر</translation> <translation id="2856503607207334158">سائن ان کرنا ناکام ہو گیا</translation> @@ -605,7 +608,6 @@ <translation id="4850886885716139402">دیکھیں</translation> <translation id="4860895144060829044">کال کریں</translation> <translation id="4864369630010738180">سائن ان کر رہا ہے…</translation> -<translation id="4865987431642283918">آلے کی ڈیفالٹ زبان</translation> <translation id="4866368707455379617">Chrome کیلئے <ph name="MODULE" /> انسٹال کرنے سے قاصر</translation> <translation id="4875775213178255010">مواد کی تجاویز</translation> <translation id="4877678010818027629">پوشیدگی وضع میں داخل ہوں</translation> @@ -673,6 +675,7 @@ <translation id="5222676887888702881">سائن آؤٹ</translation> <translation id="5227554086496586518">تلاش کے نتائج دیکھنے کیلئے تھپتھپائیں</translation> <translation id="5233638681132016545">نیا ٹیب</translation> +<translation id="5235196193381275927">سائن ان کرنے کے دوران کچھ غلط ہو گیا</translation> <translation id="5246093389635966745">ٹول بار شارٹ کٹ میں ترمیم کریں</translation> <translation id="5250483651202458397">اسکرین شاٹ۔ بند کرنے کے لئے تھپتھپائیں۔</translation> <translation id="5262378156578470238"><ph name="DATE" /> کو جب یہ ڈاؤن لوڈ شروع ہوگا تو آپ کو ایک اطلاع دکھائی دے گی۔</translation> @@ -896,6 +899,7 @@ <translation id="6541983376925655882">{NUM_HOURS,plural, =1{1 گھنٹہ پہلے چیک کیا گیا}other{# گھنٹے پہلے چیک کیا گیا}}</translation> <translation id="6545017243486555795">سبھی ڈیٹا صاف کریں</translation> <translation id="6546511553472444032">فائل نقصان دہ ہو سکتی ہے</translation> +<translation id="6556542240154580383">{TAB_COUNT,plural, =1{<ph name="TAB_TITLE" /> اور <ph name="TAB_COUNT_ONE" /> مزید ٹیب کو بند کر دیا جائے گا}other{<ph name="TAB_TITLE" /> اور <ph name="TAB_COUNT_MANY" /> مزید ٹیبز کو بند کر دیا جائے گا}}</translation> <translation id="6560414384669816528">Sogou کے ساتھ تلاش کریں</translation> <translation id="656065428026159829">مزید دیکھیں</translation> <translation id="6565959834589222080">دستیاب ہونے پر Wi-Fi کا استعمال کیا جاتا ہے</translation> @@ -936,6 +940,7 @@ <translation id="6767294960381293877">ان آلات کی فہرست جن کے ساتھ ٹیب کا اشتراک کرنا ہے نصف اونچائی پر کھلی ہوئی ہے۔</translation> <translation id="6783942555455976443">یہ صفحہ بعد کے لیے محفوظ کریں اور یاد دہانی حاصل کریں</translation> <translation id="6795633245022906657">فوری طور پر ایک نیا ٹیب کھولیں۔ اس شارٹ کٹ میں ترمیم کرنے کے لیے، ترتیبات پر جائیں۔</translation> +<translation id="6802555630140434547">ونڈو بند کر دی جائے گی</translation> <translation id="6811034713472274749">صفحہ دیکھے جانے کیلئے تیار ہے</translation> <translation id="6813446258015311409">کھولے گئے Chrome میں سائن ان کریں۔</translation> <translation id="6817747507826986771">فوری طور پر اس صفحے کا اشتراک کریں۔ اس شارٹ کٹ میں ترمیم کرنے کے لیے، ٹچ کریں اور دبائے رکھیں۔</translation> @@ -1163,6 +1168,7 @@ <translation id="8109613176066109935">اپنے سبھی آلات پر اپنے بُک مارکس حاصل کرنے کیلئے، سِنک کو آن کریں</translation> <translation id="8110087112193408731">ڈیجیٹل فلاح و بہبود میں آپ کی Chrome سرگرمی دکھائیں؟</translation> <translation id="8127542551745560481">ہوم صفحہ میں ترمیم کریں</translation> +<translation id="8130309322784422030">آپ کی اسٹور کردہ سائن ان کی معلومات پرانی ہو سکتی ہے</translation> <translation id="813082847718468539">سائٹ کی معلومات دیکھیں</translation> <translation id="8137558756159375272">تلاش کریں کو ٹچ کرنا منتخب کردہ لفظ اور سیاق و سباق کے بطور حالیہ صفحہ Google تلاش کو بھیج دیتا ہے۔ آپ اسے <ph name="BEGIN_LINK" />ترتیبات<ph name="END_LINK" /> میں آف کر سکتے ہیں۔</translation> <translation id="8153351135626613369">اسسٹنٹ ظاہر ہوگی جب اس کو پتہ چلے گا کہ یہ تعاون یافتہ ویب سائٹس پر آپ کی مدد کر سکتی ہے</translation> @@ -1293,6 +1299,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> - اس زبان کو ڈاؤن لوڈ نہیں کیا جا سکا۔ بعد میں دوبارہ کوشش کریں۔</translation> <translation id="8951232171465285730">Chrome نے آپ کا <ph name="MEGABYTES" /> MB بچایا ہے</translation> <translation id="8965591936373831584">زیر التوا</translation> +<translation id="8968085728801125376">{TAB_COUNT,plural, =1{<ph name="INCOGNITO_TAB_COUNT" /> پوشیدگی اور <ph name="TAB_COUNT_ONE" /> مزید ٹیب کو بند کر دیا جائے گا}other{<ph name="INCOGNITO_TAB_COUNT" /> پوشیدگی اور <ph name="TAB_COUNT_MANY" /> مزید ٹیبز کو بند کر دیا جائے گا}}</translation> <translation id="8970887620466824814">کچھ غلط ہو گیا۔</translation> <translation id="8972098258593396643">ڈیفالٹ فولڈر میں ڈاؤن لوڈ کریں؟</translation> <translation id="8987641763863173640">ویڈیو کے پیش منظر کی ترتیبات کا نظم کریں</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 4e6b50a5..525d58d 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Ko‘rish</translation> <translation id="4860895144060829044">Chaqiruv</translation> <translation id="4864369630010738180">Kirilmoqda…</translation> -<translation id="4865987431642283918">Qurilmadagi asosiy til</translation> <translation id="4866368707455379617">Chrome uchun <ph name="MODULE" /> oʻrnatilmadi</translation> <translation id="4875775213178255010">Kontent takliflari</translation> <translation id="4877678010818027629">Inkognito rejimiga kirish</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 548b172..f0ecec0 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Xem</translation> <translation id="4860895144060829044">Gọi</translation> <translation id="4864369630010738180">Đang đăng nhập...</translation> -<translation id="4865987431642283918">Ngôn ngữ mặc định của thiết bị</translation> <translation id="4866368707455379617">Không thể cài đặt <ph name="MODULE" /> cho Chrome</translation> <translation id="4875775213178255010">Đề xuất nội dung</translation> <translation id="4877678010818027629">Chuyển sang chế độ Ẩn danh</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 352848c..8142390 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
@@ -605,7 +605,6 @@ <translation id="4850886885716139402">视图</translation> <translation id="4860895144060829044">拨打</translation> <translation id="4864369630010738180">正在登录…</translation> -<translation id="4865987431642283918">默认设备语言</translation> <translation id="4866368707455379617">无法为 Chrome 安装<ph name="MODULE" /></translation> <translation id="4875775213178255010">内容建议</translation> <translation id="4877678010818027629">进入无痕模式</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 e2a782a..fb4994e 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
@@ -281,7 +281,7 @@ <translation id="2779651927720337254">失敗</translation> <translation id="2781151931089541271">尚餘 1 秒</translation> <translation id="2788468313014644040">群組號碼</translation> -<translation id="2800066122460699237">即將關閉「<ph name="TAB_TITLE" />」分頁</translation> +<translation id="2800066122460699237">即將關閉 <ph name="TAB_TITLE" /> 分頁</translation> <translation id="2801022321632964776">更新後即可在 Chrome 最新版本中使用您的語言。</translation> <translation id="2805756323405976993">應用程式</translation> <translation id="2806840421670364300">群組聯合學習 : FLoC</translation> @@ -290,7 +290,7 @@ <translation id="2827278682606527653">Feed card menu half height</translation> <translation id="2830783625999891985">隱藏咗剪貼簿嘅內容</translation> <translation id="2839327205551510876">已取消追蹤 <ph name="SITE_NAME" /></translation> -<translation id="2840810876587895427">{TAB_COUNT,plural, =1{即將關閉 <ph name="TAB_COUNT_ONE" /> 個無痕分頁}other{即將關閉 <ph name="TAB_COUNT_MANY" /> 個無痕分頁}}</translation> +<translation id="2840810876587895427">{TAB_COUNT,plural, =1{即將關閉 <ph name="TAB_COUNT_ONE" /> 個無痕式分頁}other{即將關閉 <ph name="TAB_COUNT_MANY" /> 個無痕式分頁}}</translation> <translation id="2841216154655874070">{NUM_DAYS,plural, =1{曾在 1 天前檢查}other{曾在 # 天前檢查}}</translation> <translation id="2842985007712546952">上層資料夾</translation> <translation id="2856503607207334158">登入失敗</translation> @@ -608,7 +608,6 @@ <translation id="4850886885716139402">檢視</translation> <translation id="4860895144060829044">撥號</translation> <translation id="4864369630010738180">正在登入…</translation> -<translation id="4865987431642283918">預設裝置語言</translation> <translation id="4866368707455379617">無法為 Chrome 安裝 <ph name="MODULE" /></translation> <translation id="4875775213178255010">內容建議</translation> <translation id="4877678010818027629">進入無痕模式</translation> @@ -900,7 +899,7 @@ <translation id="6541983376925655882">{NUM_HOURS,plural, =1{曾在 1 小時前檢查}other{曾在 # 小時前檢查}}</translation> <translation id="6545017243486555795">清除所有資料</translation> <translation id="6546511553472444032">檔案可能有害</translation> -<translation id="6556542240154580383">{TAB_COUNT,plural, =1{即將關閉「<ph name="TAB_TITLE" />」和另外 <ph name="TAB_COUNT_ONE" /> 個分頁}other{即將關閉「<ph name="TAB_TITLE" />」和另外 <ph name="TAB_COUNT_MANY" /> 個分頁}}</translation> +<translation id="6556542240154580383">{TAB_COUNT,plural, =1{即將關閉 <ph name="TAB_TITLE" /> 和另外 <ph name="TAB_COUNT_ONE" /> 個分頁}other{即將關閉 <ph name="TAB_TITLE" /> 和另外 <ph name="TAB_COUNT_MANY" /> 個分頁}}</translation> <translation id="6560414384669816528">使用「搜狗」搜尋內容</translation> <translation id="656065428026159829">查看更多</translation> <translation id="6565959834589222080">有可用的 Wi-Fi 時使用 Wi-Fi</translation> @@ -1169,7 +1168,7 @@ <translation id="8109613176066109935">如要將書籤同步到所有裝置,請開啟同步處理功能</translation> <translation id="8110087112193408731">要在「健康數碼生活」中顯示您的 Chrome 活動記錄嗎?</translation> <translation id="8127542551745560481">編輯首頁</translation> -<translation id="8130309322784422030">你儲存的登入資訊可能已過時</translation> +<translation id="8130309322784422030">您儲存的登入資料可能已過期</translation> <translation id="813082847718468539">檢視網站資料</translation> <translation id="8137558756159375272">「輕觸搜尋」會將所選字詞和目前網頁以內容的形式傳送至 Google 搜尋。您可以在「<ph name="BEGIN_LINK" />設定<ph name="END_LINK" />」中停用這項功能。</translation> <translation id="8153351135626613369">「Google 助理」偵測到可在支援的網站上提供協助時就會顯示</translation> @@ -1300,7 +1299,7 @@ <translation id="8945143127965743188"><ph name="LANG" /> - 無法下載此語言套件,請稍後再試。</translation> <translation id="8951232171465285730">Chrome 已為您節省 <ph name="MEGABYTES" /> MB</translation> <translation id="8965591936373831584">正在等待下載</translation> -<translation id="8968085728801125376">{TAB_COUNT,plural, =1{即將關閉 <ph name="INCOGNITO_TAB_COUNT" /> 個無痕分頁和另外 <ph name="TAB_COUNT_ONE" /> 個分頁}other{即將關閉 <ph name="INCOGNITO_TAB_COUNT" /> 個無痕分頁和另外 <ph name="TAB_COUNT_MANY" /> 個分頁}}</translation> +<translation id="8968085728801125376">{TAB_COUNT,plural, =1{即將關閉 <ph name="INCOGNITO_TAB_COUNT" /> 個無痕式分頁和另外 <ph name="TAB_COUNT_ONE" /> 個分頁}other{即將關閉 <ph name="INCOGNITO_TAB_COUNT" /> 個無痕式分頁和另外 <ph name="TAB_COUNT_MANY" /> 個分頁}}</translation> <translation id="8970887620466824814">發生錯誤。</translation> <translation id="8972098258593396643">要下載至預設資料夾嗎?</translation> <translation id="8987641763863173640">管理影片預覽設定</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 cad67348..3ed8b2a4 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">檢視</translation> <translation id="4860895144060829044">撥號</translation> <translation id="4864369630010738180">登入中...</translation> -<translation id="4865987431642283918">預設的裝置語言</translation> <translation id="4866368707455379617">無法為 Chrome 安裝 <ph name="MODULE" /></translation> <translation id="4875775213178255010">內容建議</translation> <translation id="4877678010818027629">進入無痕模式</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 47e6832..e44d977 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
@@ -608,7 +608,6 @@ <translation id="4850886885716139402">Buka</translation> <translation id="4860895144060829044">Shaya</translation> <translation id="4864369630010738180">Iyangena ngemvume...</translation> -<translation id="4865987431642283918">Ulimi lwedivayisi oluzenzakalelayo</translation> <translation id="4866368707455379617">Ayikwazi ukufaka i-<ph name="MODULE" /> ye-Chrome</translation> <translation id="4875775213178255010">Iziphakamiso zokuqukethwe</translation> <translation id="4877678010818027629">Ngena kumodi ye-incognito</translation>
diff --git a/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view.cc b/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view.cc index 4a0e00c..e4d1243 100644 --- a/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view.cc +++ b/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view.cc
@@ -154,6 +154,10 @@ gfx::NativeWindow native_window, ::sharesheet::SharesheetServiceDelegate* delegate) : delegate_(delegate) { + // We set the dialog role because views::BubbleDialogDelegate defaults this to + // an alert dialog. This would make screen readers announce all of this dialog + // which is undesirable. + SetAccessibleRole(ax::mojom::Role::kDialog); set_parent_window(native_window); parent_widget_observer_ = std::make_unique<SharesheetParentWidgetObserver>( this, views::Widget::GetWidgetForNativeWindow(native_window)); @@ -522,13 +526,6 @@ return true; } -ax::mojom::Role SharesheetBubbleView::GetAccessibleWindowRole() { - // We override the role because the base class sets it to alert dialog. - // This would make screen readers repeatedly announce the whole of the - // |sharesheet_bubble_view| which is undesirable. - return ax::mojom::Role::kDialog; -} - std::unique_ptr<views::NonClientFrameView> SharesheetBubbleView::CreateNonClientFrameView(views::Widget* widget) { // TODO(crbug.com/1097623) Replace this with layer->SetRoundedCornerRadius.
diff --git a/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view.h b/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view.h index 089b050a..20e898d 100644 --- a/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view.h +++ b/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view.h
@@ -64,7 +64,6 @@ bool OnKeyPressed(const ui::KeyEvent& event) override; // views::WidgetDelegate: - ax::mojom::Role GetAccessibleWindowRole() override; std::unique_ptr<views::NonClientFrameView> CreateNonClientFrameView( views::Widget* widget) override;
diff --git a/chrome/browser/ui/hats/mock_hats_service.cc b/chrome/browser/ui/hats/mock_hats_service.cc index d1e7fb1..4d7c2309 100644 --- a/chrome/browser/ui/hats/mock_hats_service.cc +++ b/chrome/browser/ui/hats/mock_hats_service.cc
@@ -10,11 +10,14 @@ #include "components/keyed_service/core/keyed_service.h" #include "content/public/browser/browser_context.h" +using ::testing::NiceMock; + MockHatsService::MockHatsService(Profile* profile) : HatsService(profile) {} MockHatsService::~MockHatsService() = default; std::unique_ptr<KeyedService> BuildMockHatsService( content::BrowserContext* context) { - return std::make_unique<MockHatsService>(static_cast<Profile*>(context)); + return std::make_unique<NiceMock<MockHatsService>>( + static_cast<Profile*>(context)); }
diff --git a/chrome/browser/ui/hats/mock_trust_safety_sentiment_service.cc b/chrome/browser/ui/hats/mock_trust_safety_sentiment_service.cc index 6c0199a..19b6d629 100644 --- a/chrome/browser/ui/hats/mock_trust_safety_sentiment_service.cc +++ b/chrome/browser/ui/hats/mock_trust_safety_sentiment_service.cc
@@ -10,6 +10,8 @@ #include "components/keyed_service/core/keyed_service.h" #include "content/public/browser/browser_context.h" +using ::testing::NiceMock; + MockTrustSafetySentimentService::MockTrustSafetySentimentService( Profile* profile) : TrustSafetySentimentService(profile) {} @@ -18,6 +20,6 @@ std::unique_ptr<KeyedService> BuildMockTrustSafetySentimentService( content::BrowserContext* context) { - return std::make_unique<MockTrustSafetySentimentService>( + return std::make_unique<NiceMock<MockTrustSafetySentimentService>>( static_cast<Profile*>(context)); }
diff --git a/chrome/browser/ui/omnibox/omnibox_pedals_unittest.cc b/chrome/browser/ui/omnibox/omnibox_pedals_unittest.cc index 7cfb373..f2a57e3e 100644 --- a/chrome/browser/ui/omnibox/omnibox_pedals_unittest.cc +++ b/chrome/browser/ui/omnibox/omnibox_pedals_unittest.cc
@@ -24,7 +24,6 @@ MockAutocompleteProviderClient client; base::test::ScopedFeatureList feature_list; std::vector<base::Feature> features = { - omnibox::kOmniboxPedalsBatch2, omnibox::kOmniboxPedalsBatch2NonEnglish, omnibox::kOmniboxPedalsBatch3, };
diff --git a/chrome/browser/ui/ui_features.cc b/chrome/browser/ui/ui_features.cc index 42f4068..361f083 100644 --- a/chrome/browser/ui/ui_features.cc +++ b/chrome/browser/ui/ui_features.cc
@@ -6,6 +6,7 @@ #include "base/feature_list.h" #include "build/chromeos_buildflags.h" +#include "ui_features.h" namespace features { @@ -46,6 +47,11 @@ const base::Feature kEvDetailsInPageInfo{"EvDetailsInPageInfo", base::FEATURE_ENABLED_BY_DEFAULT}; +// Enables showing the new extensions menu and toolbar that allows the user to +// access control permissions. +const base::Feature kExtensionsMenuAccessControl{ + "ExtensionsMenuAccessControl", base::FEATURE_DISABLED_BY_DEFAULT}; + // Enables the hosting of an extension in the left aligned side panel of the // browser window. Currently used for a hosted extension experiment. const base::Feature kExtensionsSidePanel{"ExtensionsSidePanel",
diff --git a/chrome/browser/ui/ui_features.h b/chrome/browser/ui/ui_features.h index 643028af..3379c4b 100644 --- a/chrome/browser/ui/ui_features.h +++ b/chrome/browser/ui/ui_features.h
@@ -42,6 +42,8 @@ extern const base::Feature kEvDetailsInPageInfo; +extern const base::Feature kExtensionsMenuAccessControl; + extern const base::Feature kExtensionsSidePanel; // The extension id of the extension hosted in the left aligned side panel.
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc index 42294a9f..3d027e6 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
@@ -40,6 +40,8 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/chrome_pages.h" #include "chrome/browser/ui/layout_constants.h" +#include "chrome/browser/ui/tabs/tab_group_model.h" +#include "chrome/browser/ui/tabs/tab_group_theme.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/view_ids.h" #include "chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h" @@ -107,6 +109,7 @@ #include "ui/views/animation/ink_drop_highlight.h" #include "ui/views/animation/ink_drop_impl.h" #include "ui/views/animation/ink_drop_mask.h" +#include "ui/views/background.h" #include "ui/views/border.h" #include "ui/views/button_drag_utils.h" #include "ui/views/cascading_property.h" @@ -130,6 +133,8 @@ using ::bookmarks::BookmarkModel; using ::bookmarks::BookmarkNode; using ::ui::mojom::DragOperation; +using ::views::Background; +using ::views::Border; using ::views::LabelButtonBorder; using ::views::MenuButton; @@ -357,6 +362,75 @@ BEGIN_METADATA(BookmarkFolderButton, BookmarkMenuButtonBase) END_METADATA +// BookmarkTabGroupButton +// ------------------------------------------------------- + +// Buttons used for tab groups on the bookmark bar +class BookmarkTabGroupButton : public BookmarkMenuButtonBase { + public: + METADATA_HEADER(BookmarkTabGroupButton); + explicit BookmarkTabGroupButton( + PressedCallback callback, + const std::u16string& title = std::u16string()) + : BookmarkMenuButtonBase(std::move(callback), title) { + show_animation_ = std::make_unique<gfx::SlideAnimation>(this); + if (!animations_enabled) { + // For some reason during testing the events generated by animating + // throw off the test. So, don't animate while testing. + show_animation_->Reset(1); + } else { + show_animation_->Show(); + } + + // ui::EF_MIDDLE_MOUSE_BUTTON opens all bookmarked links in separate tabs. + // SetTriggerableEventFlags(ui::EF_LEFT_MOUSE_BUTTON | + // ui::EF_MIDDLE_MOUSE_BUTTON); + } + BookmarkTabGroupButton(const BookmarkTabGroupButton&) = delete; + BookmarkTabGroupButton& operator=(const BookmarkTabGroupButton&) = delete; + + std::u16string GetTooltipText(const gfx::Point& p) const override { + return label()->GetPreferredSize().width() > label()->size().width() + ? GetText() + : std::u16string(); + } + + bool OnMousePressed(const ui::MouseEvent& event) override { return true; } + + void OnMouseEntered(const ui::MouseEvent& event) override { + SkColor color = + GetThemeProvider()->GetColor(GetTabGroupDialogColorId(tab_group_id_)); + SetBorder( + views::CreatePaddedBorder(views::CreateRoundedRectBorder( + border_thickness_, border_radius_, color), + gfx::Insets(0, 4))); + } + + void OnMouseExited(const ui::MouseEvent& event) override { + SetBorder(views::CreatePaddedBorder( + views::CreateRoundedRectBorder(border_thickness_, border_radius_, + SK_ColorTRANSPARENT), + gfx::Insets(0, 4))); + } + + void GetAccessibleNodeData(ui::AXNodeData* node_data) override { + BookmarkMenuButtonBase::GetAccessibleNodeData(node_data); + node_data->AddStringAttribute( + ax::mojom::StringAttribute::kRoleDescription, + l10n_util::GetStringUTF8( + IDS_ACCNAME_BOOKMARK_FOLDER_BUTTON_ROLE_DESCRIPTION)); + } + + private: + std::unique_ptr<gfx::SlideAnimation> show_animation_; + tab_groups::TabGroupColorId tab_group_id_ = tab_groups::TabGroupColorId::kRed; + float border_thickness_ = 2.0; + float border_radius_ = 4.5; +}; + +BEGIN_METADATA(BookmarkTabGroupButton, BookmarkMenuButtonBase) +END_METADATA + // OverflowButton (chevron) -------------------------------------------------- class OverflowButton : public BookmarkMenuButtonBase { @@ -576,6 +650,9 @@ return managed_->managed_node(); } + // TODO: add logic to get saved groups node(crbug.com/1223929 and + // crbug.com/1223919) + // Then check the bookmark buttons. for (size_t i = 0; i < bookmark_buttons_.size(); ++i) { views::View* child = bookmark_buttons_[i]; @@ -608,6 +685,8 @@ return other_bookmarks_button_; if (node == model_->bookmark_bar_node()) return overflow_button_; + // TODO: add logic to handle saved groups node(crbug.com/1223929 and + // crbug.com/1223919) int index = model_->bookmark_bar_node()->GetIndexOf(node); if (index == -1 || !node->is_folder()) return nullptr; @@ -828,6 +907,9 @@ button_count = bookmark_buttons_.size(); } views::View* child = bookmark_buttons_[i]; + + // customize child appearance?? + gfx::Size pref = child->GetPreferredSize(); int next_x = x + pref.width() + bookmark_bar_button_padding; last_visible = next_x < max_x; @@ -1201,7 +1283,6 @@ size_t index) { // See comment in BookmarkNodeMoved() for details on this. InvalidateDrop(); - if (BookmarkNodeAddedImpl(model, parent, index)) LayoutAndPaint(); @@ -1377,14 +1458,46 @@ chrome::OpenAllIfAllowed(browser_, GetPageNavigatorGetter(), {node}, ui::DispositionFromEventFlags(event.flags())); } else { - RecordBookmarkFolderOpen(BOOKMARK_LAUNCH_LOCATION_ATTACHED_BAR); - const size_t start_index = - (node == model_->bookmark_bar_node()) ? GetFirstHiddenNodeIndex() : 0; - bookmark_menu_ = - new BookmarkMenuController(browser_, GetPageNavigatorGetter(), - GetWidget(), node, start_index, false); - bookmark_menu_->set_observer(this); - bookmark_menu_->RunMenuAt(this); + // saved tab groups flag + if (base::FeatureList::IsEnabled(features::kTabGroupsSave)) { + // Record as bookmark folder launch in dev when rendering tab groups from + // folder data. + RecordBookmarkFolderLaunch(BOOKMARK_LAUNCH_LOCATION_ATTACHED_BAR); + // TODO: Handle click if group has already been opened (crbug.com/1238539) + // left click on a saved tab group opens all links in new group + std::vector<const bookmarks::BookmarkNode*> selection_ = {node}; + DCHECK(chrome::HasBookmarkURLs(selection_)); + chrome::OpenAllIfAllowed(browser_, GetPageNavigatorGetter(), selection_, + WindowOpenDisposition::NEW_BACKGROUND_TAB); + // add to a new tab group + TabStripModel* model = browser_->tab_strip_model(); + int count = + chrome::OpenCount(browser_->window()->GetNativeWindow(), selection_); + std::vector<int> tab_indicies(count); + for (auto i = 0; i < count; i++) + tab_indicies[i] = model->count() - count + i; + tab_groups::TabGroupId newGroupId = model->AddToNewGroup(tab_indicies); + + // use the saved group's title as the group's title + // use the saved group's color as the group's color + std::u16string folderTitle = selection_[0]->GetTitledUrlNodeTitle(); + TabGroup* group = model->group_model()->GetTabGroup(newGroupId); + const tab_groups::TabGroupVisualData* current_visual_data = + group->visual_data(); + tab_groups::TabGroupVisualData new_visual_data( + folderTitle, tab_groups::TabGroupColorId::kRed, + current_visual_data->is_collapsed()); + group->SetVisualData(new_visual_data); + } else { + RecordBookmarkFolderOpen(BOOKMARK_LAUNCH_LOCATION_ATTACHED_BAR); + const size_t start_index = + (node == model_->bookmark_bar_node()) ? GetFirstHiddenNodeIndex() : 0; + bookmark_menu_ = + new BookmarkMenuController(browser_, GetPageNavigatorGetter(), + GetWidget(), node, start_index, false); + bookmark_menu_->set_observer(this); + bookmark_menu_->RunMenuAt(this); + } } } @@ -1420,6 +1533,19 @@ model_->bookmark_bar_node()->children()[bookmark_button_index].get(); nodes.push_back(node); parent = node->parent(); + // saved tab groups feature flag. + if (base::FeatureList::IsEnabled(features::kTabGroupsSave) && + !node->is_url()) { + RecordBookmarkFolderOpen(BOOKMARK_LAUNCH_LOCATION_ATTACHED_BAR); + const size_t start_index = + (node == model_->bookmark_bar_node()) ? GetFirstHiddenNodeIndex() : 0; + bookmark_menu_ = + new BookmarkMenuController(browser_, GetPageNavigatorGetter(), + GetWidget(), node, start_index, false); + bookmark_menu_->set_observer(this); + bookmark_menu_->RunMenuAt(this); + return; + } } else { parent = model_->bookmark_bar_node(); nodes.push_back(parent); @@ -1576,11 +1702,19 @@ node->url(), url_formatter::kFormatUrlOmitDefaults, net::UnescapeRule::SPACES, nullptr, nullptr, nullptr)); } else { - button = std::make_unique<BookmarkFolderButton>( - base::BindRepeating(&BookmarkBarView::OnMenuButtonPressed, - base::Unretained(this), node), - node->GetTitle()); - button->GetViewAccessibility().OverrideDescription(""); + // saved tab groups feature flag. + if (base::FeatureList::IsEnabled(features::kTabGroupsSave)) { + button = std::make_unique<BookmarkTabGroupButton>( + base::BindRepeating(&BookmarkBarView::OnMenuButtonPressed, + base::Unretained(this), node), + node->GetTitle()); + button->GetViewAccessibility().OverrideDescription(""); + } else { + button = std::make_unique<BookmarkFolderButton>( + base::BindRepeating(&BookmarkBarView::OnMenuButtonPressed, + base::Unretained(this), node), + node->GetTitle()); + } } ConfigureButton(node, button.get()); bookmark_buttons_.insert(bookmark_buttons_.cbegin() + index, button.get()); @@ -1615,17 +1749,55 @@ text_color = tp->GetColor(ThemeProperties::COLOR_BOOKMARK_TEXT); button->SetEnabledTextColors(text_color); if (node->is_folder()) { - if (tp->HasCustomColor(ThemeProperties::COLOR_BOOKMARK_TEXT)) { - button->SetImageModel( - views::Button::STATE_NORMAL, - chrome::GetBookmarkFolderIcon( - chrome::BookmarkFolderIconType::kNormal, - color_utils::DeriveDefaultIconColor(text_color))); + // saved tab groups feature flag + if (base::FeatureList::IsEnabled(features::kTabGroupsSave)) { + // COPIED FROM PRIVATE SECTION OF TABGROUPBUTTON + tab_groups::TabGroupColorId tab_group_id_ = + tab_groups::TabGroupColorId::kRed; + float button_radius_ = 5.0; + + // Get tabgroup color. + SkColor color = GetThemeProvider()->GetColor( + GetTabGroupTabStripColorId(tab_group_id_, false)); + SkColor background_color; + + if (color_utils::IsDark(text_color)) { + // Dynamically lighten background if in light mode/light theme + // (placeholder for official UX lightmode colors) + // TODO: use official colors (crbug.com/1239428) + SkScalar hsv[3]; + SkColorToHSV(color, hsv); + hsv[1] = hsv[1] / 4; + hsv[2] = hsv[2] + 10 > 100 ? 100 : hsv[2] + 10; + background_color = SkHSVToColor(255, hsv); + } else { + // Dynamically darken background if in dark mode/theme + // (placeholder for official UX darkmode colors) + // TODO: use official colors (crbug.com/1239428) + SkScalar hsv[3]; + SkColorToHSV(color, hsv); + hsv[1] = hsv[1] * 2.5; + hsv[2] = hsv[2] / 3; + background_color = SkHSVToColor(255, hsv); + } + + // Set background color. + button->SetBackground(views::CreateRoundedRectBackground( + background_color, button_radius_)); } else { - button->SetImageModel(views::Button::STATE_NORMAL, - chrome::GetBookmarkFolderIcon( - chrome::BookmarkFolderIconType::kNormal, - ui::NativeTheme::kColorId_DefaultIconColor)); + if (tp->HasCustomColor(ThemeProperties::COLOR_BOOKMARK_TEXT)) { + button->SetImageModel( + views::Button::STATE_NORMAL, + chrome::GetBookmarkFolderIcon( + chrome::BookmarkFolderIconType::kNormal, + color_utils::DeriveDefaultIconColor(text_color))); + } else { + button->SetImageModel( + views::Button::STATE_NORMAL, + chrome::GetBookmarkFolderIcon( + chrome::BookmarkFolderIconType::kNormal, + ui::NativeTheme::kColorId_DefaultIconColor)); + } } } } @@ -2101,9 +2273,15 @@ DCHECK_EQ(*i++, managed_bookmarks_button_); const auto is_bookmark_button = [this](const auto* v) { const char* class_name = v->GetClassName(); - return (class_name == BookmarkButton::kViewClassName || - class_name == BookmarkFolderButton::kViewClassName) && - v != overflow_button_ && v != other_bookmarks_button_; + if (base::FeatureList::IsEnabled(features::kTabGroupsSave)) + return (class_name == BookmarkButton::kViewClassName || + class_name == BookmarkFolderButton::kViewClassName || + class_name == BookmarkTabGroupButton::kViewClassName) && + v != overflow_button_ && v != other_bookmarks_button_; + else + return (class_name == BookmarkButton::kViewClassName || + class_name == BookmarkFolderButton::kViewClassName) && + v != overflow_button_ && v != other_bookmarks_button_; }; i = std::find_if_not(i, children().cend(), is_bookmark_button); DCHECK_EQ(*i++, overflow_button_);
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.h b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.h index bb3b34d..0571a78 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.h +++ b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.h
@@ -15,6 +15,7 @@ #include "chrome/browser/ui/bookmarks/bookmark_bar.h" #include "chrome/browser/ui/bookmarks/bookmark_bubble_observer.h" #include "chrome/browser/ui/bookmarks/bookmark_stats.h" +#include "chrome/browser/ui/tabs/tab_group_theme.h" #include "chrome/browser/ui/views/bookmarks/bookmark_menu_controller_observer.h" #include "components/bookmarks/browser/bookmark_model_observer.h" #include "components/bookmarks/browser/bookmark_node_data.h" @@ -440,6 +441,9 @@ // The individual bookmark buttons. std::vector<views::LabelButton*> bookmark_buttons_; + // The individual TAB GROUP bookmark buttons. + std::vector<views::LabelButton*> tab_group_buttons_; + ButtonSeparatorView* bookmarks_separator_view_ = nullptr; ReadLaterButton* read_later_button_ = nullptr;
diff --git a/chrome/browser/ui/views/find_bar_host.cc b/chrome/browser/ui/views/find_bar_host.cc index e853cee..4c30b9b 100644 --- a/chrome/browser/ui/views/find_bar_host.cc +++ b/chrome/browser/ui/views/find_bar_host.cc
@@ -114,6 +114,7 @@ DropdownBarHostDelegate* find_bar_delegate = find_bar_view.get(); Init(browser_view->find_bar_host_view(), std::move(find_bar_view), find_bar_delegate); + SetAccessibleRole(ax::mojom::Role::kDialog); } FindBarHost::~FindBarHost() { @@ -437,10 +438,6 @@ browser_view()->browser()->OnFindBarVisibilityChanged(); } -ax::mojom::Role FindBarHost::GetAccessibleWindowRole() { - return ax::mojom::Role::kDialog; -} - std::u16string FindBarHost::GetAccessibleWindowTitle() const { // This can be called in tests by AccessibilityChecker before the controller // is registered with this object. So to handle that case, we need to bail out
diff --git a/chrome/browser/ui/views/find_bar_host.h b/chrome/browser/ui/views/find_bar_host.h index 20a62a0e..ab1a168 100644 --- a/chrome/browser/ui/views/find_bar_host.h +++ b/chrome/browser/ui/views/find_bar_host.h
@@ -126,7 +126,6 @@ void OnVisibilityChanged() override; // views::WidgetDelegate: - ax::mojom::Role GetAccessibleWindowRole() override; std::u16string GetAccessibleWindowTitle() const override; private:
diff --git a/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.cc b/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.cc index b6accc8..ba7f4f5 100644 --- a/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.cc +++ b/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.cc
@@ -69,6 +69,10 @@ browser_frame->set_frame_type(browser_frame->UseCustomFrame() ? views::Widget::FrameType::kForceCustom : views::Widget::FrameType::kForceNative); + + theme_observation_.Observe(ui::NativeTheme::GetInstanceForNativeUi()); + if (auto* linux_ui = views::LinuxUI::instance()) + scale_observation_.Observe(linux_ui); } BrowserDesktopWindowTreeHostLinux::~BrowserDesktopWindowTreeHostLinux() = @@ -222,6 +226,8 @@ window->SetOpaqueRegion({gfx::ToEnclosedRect(opaque_bounds)}); } } + + SizeConstraintsChanged(); #endif } @@ -288,6 +294,15 @@ UpdateFrameHints(); } +void BrowserDesktopWindowTreeHostLinux::OnNativeThemeUpdated( + ui::NativeTheme* observed_theme) { + UpdateFrameHints(); +} + +void BrowserDesktopWindowTreeHostLinux::OnDeviceScaleFactorChanged() { + UpdateFrameHints(); +} + //////////////////////////////////////////////////////////////////////////////// // BrowserDesktopWindowTreeHost, public:
diff --git a/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.h b/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.h index 4b503dea..8dd21c1c 100644 --- a/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.h +++ b/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.h
@@ -8,6 +8,8 @@ #include "base/macros.h" #include "build/build_config.h" #include "chrome/browser/ui/views/frame/browser_desktop_window_tree_host.h" +#include "ui/views/linux_ui/device_scale_factor_observer.h" +#include "ui/views/linux_ui/linux_ui.h" #include "ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h" // nogncheck #if defined(USE_DBUS_MENU) @@ -26,7 +28,9 @@ class BrowserDesktopWindowTreeHostLinux : public BrowserDesktopWindowTreeHost, - public views::DesktopWindowTreeHostLinux { + public views::DesktopWindowTreeHostLinux, + ui::NativeThemeObserver, + views::DeviceScaleFactorObserver { public: BrowserDesktopWindowTreeHostLinux( views::internal::NativeWidgetDelegate* native_widget_delegate, @@ -69,6 +73,12 @@ void OnWindowStateChanged(ui::PlatformWindowState old_state, ui::PlatformWindowState new_state) override; + // ui::NativeThemeObserver: + void OnNativeThemeUpdated(ui::NativeTheme* observed_theme) override; + + // views::OnDeviceScaleFactorChanged: + void OnDeviceScaleFactorChanged() override; + BrowserView* browser_view_ = nullptr; BrowserFrame* browser_frame_ = nullptr; @@ -90,6 +100,14 @@ std::unique_ptr<DbusAppmenu> dbus_appmenu_; #endif + base::ScopedObservation<ui::NativeTheme, ui::NativeThemeObserver> + theme_observation_{this}; + base::ScopedObservation<views::LinuxUI, + views::DeviceScaleFactorObserver, + &views::LinuxUI::AddDeviceScaleFactorObserver, + &views::LinuxUI::RemoveDeviceScaleFactorObserver> + scale_observation_{this}; + DISALLOW_COPY_AND_ASSIGN(BrowserDesktopWindowTreeHostLinux); };
diff --git a/chrome/browser/ui/views/frame/browser_frame_view_layout_linux_native.cc b/chrome/browser/ui/views/frame/browser_frame_view_layout_linux_native.cc index 905b5b9..4d6edf2 100644 --- a/chrome/browser/ui/views/frame/browser_frame_view_layout_linux_native.cc +++ b/chrome/browser/ui/views/frame/browser_frame_view_layout_linux_native.cc
@@ -7,8 +7,10 @@ #include "ui/views/linux_ui/nav_button_provider.h" BrowserFrameViewLayoutLinuxNative::BrowserFrameViewLayoutLinuxNative( - views::NavButtonProvider* nav_button_provider) - : nav_button_provider_(nav_button_provider) {} + views::NavButtonProvider* nav_button_provider, + views::WindowFrameProvider* window_frame_provider) + : nav_button_provider_(nav_button_provider), + window_frame_provider_(window_frame_provider) {} BrowserFrameViewLayoutLinuxNative::~BrowserFrameViewLayoutLinuxNative() = default; @@ -21,6 +23,11 @@ return insets.top() + FrameEdgeInsets(false).top(); } +gfx::Insets BrowserFrameViewLayoutLinuxNative::RestoredFrameBorderInsets() + const { + return window_frame_provider_->GetFrameThickness(); +} + OpaqueBrowserFrameViewLayout::TopAreaPadding BrowserFrameViewLayoutLinuxNative::GetTopAreaPadding( bool has_leading_buttons,
diff --git a/chrome/browser/ui/views/frame/browser_frame_view_layout_linux_native.h b/chrome/browser/ui/views/frame/browser_frame_view_layout_linux_native.h index 8f3eda7c..0f7b250 100644 --- a/chrome/browser/ui/views/frame/browser_frame_view_layout_linux_native.h +++ b/chrome/browser/ui/views/frame/browser_frame_view_layout_linux_native.h
@@ -7,13 +7,15 @@ #include "chrome/browser/ui/views/frame/browser_frame_view_layout_linux.h" #include "ui/views/linux_ui/nav_button_provider.h" +#include "ui/views/linux_ui/window_frame_provider.h" // A specialization of BrowserFrameViewLayoutLinux that is also able // to layout frame buttons that were rendered by the native toolkit. class BrowserFrameViewLayoutLinuxNative : public BrowserFrameViewLayoutLinux { public: explicit BrowserFrameViewLayoutLinuxNative( - views::NavButtonProvider* nav_button_provider); + views::NavButtonProvider* nav_button_provider, + views::WindowFrameProvider* window_frame_provider); BrowserFrameViewLayoutLinuxNative(const BrowserFrameViewLayoutLinuxNative&) = delete; @@ -26,6 +28,7 @@ // OpaqueBrowserFrameViewLayout: int CaptionButtonY(views::FrameButton button_id, bool restored) const override; + gfx::Insets RestoredFrameBorderInsets() const override; TopAreaPadding GetTopAreaPadding(bool has_leading_buttons, bool has_trailing_buttons) const override; int GetWindowCaptionSpacing(views::FrameButton button_id, @@ -38,7 +41,9 @@ views::NavButtonProvider::FrameButtonDisplayType GetButtonDisplayType( views::FrameButton button_id) const; - views::NavButtonProvider* nav_button_provider_; + // Owned by BrowserFrameViewLinuxNative. + views::NavButtonProvider* const nav_button_provider_; + views::WindowFrameProvider* const window_frame_provider_; }; #endif // CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_FRAME_VIEW_LAYOUT_LINUX_NATIVE_H_
diff --git a/chrome/browser/ui/views/frame/browser_frame_view_layout_linux_native_unittest.cc b/chrome/browser/ui/views/frame/browser_frame_view_layout_linux_native_unittest.cc index fd6c6c43..769d9998 100644 --- a/chrome/browser/ui/views/frame/browser_frame_view_layout_linux_native_unittest.cc +++ b/chrome/browser/ui/views/frame/browser_frame_view_layout_linux_native_unittest.cc
@@ -12,6 +12,7 @@ #include "ui/views/background.h" #include "ui/views/controls/button/image_button.h" #include "ui/views/linux_ui/nav_button_provider.h" +#include "ui/views/linux_ui/window_frame_provider.h" namespace { @@ -122,6 +123,21 @@ } }; +class TestFrameProvider : public views::WindowFrameProvider { + public: + TestFrameProvider() = default; + + ~TestFrameProvider() override = default; + + // views::WindowFrameProvider: + int GetTopCornerRadius() override { return 0; } + gfx::Insets GetFrameThickness() override { return {}; } + void PaintWindowFrame(gfx::Canvas* canvas, + const gfx::Rect& rect, + int top_area_height, + bool focused) override {} +}; + } // namespace class BrowserFrameViewLayoutLinuxNativeTest : public ChromeViewsTestBase { @@ -140,8 +156,9 @@ delegate_ = std::make_unique<TestLayoutDelegate>(); nav_button_provider_ = std::make_unique<::TestNavButtonProvider>(); + frame_provider_ = std::make_unique<::TestFrameProvider>(); auto layout = std::make_unique<BrowserFrameViewLayoutLinuxNative>( - nav_button_provider_.get()); + nav_button_provider_.get(), frame_provider_.get()); layout->set_delegate(delegate_.get()); layout->set_forced_window_caption_spacing_for_test(0); widget_ = CreateTestWidget(); @@ -195,6 +212,7 @@ BrowserFrameViewLayoutLinuxNative* layout_manager_ = nullptr; std::unique_ptr<TestLayoutDelegate> delegate_; std::unique_ptr<views::NavButtonProvider> nav_button_provider_; + std::unique_ptr<views::WindowFrameProvider> frame_provider_; // Widgets: views::ImageButton* minimize_button_ = nullptr;
diff --git a/chrome/browser/ui/views/frame/browser_frame_view_linux.h b/chrome/browser/ui/views/frame/browser_frame_view_linux.h index ff6f1c5..1071b5d 100644 --- a/chrome/browser/ui/views/frame/browser_frame_view_linux.h +++ b/chrome/browser/ui/views/frame/browser_frame_view_linux.h
@@ -49,12 +49,12 @@ // OpaqueBrowserFrameViewLayoutDelegate: bool ShouldDrawRestoredFrameShadow() const override; - private: // Gets the radius of the top corners when the window is restored. The // returned value is in DIPs. The result will be 0 if rounded corners are // disabled (eg. if the compositor doesn't support translucency.) - float GetRestoredCornerRadius() const; + virtual float GetRestoredCornerRadius() const; + private: BrowserFrameViewLayoutLinux* const layout_; };
diff --git a/chrome/browser/ui/views/frame/browser_frame_view_linux_native.cc b/chrome/browser/ui/views/frame/browser_frame_view_linux_native.cc index f47a9ef63..f66d846 100644 --- a/chrome/browser/ui/views/frame/browser_frame_view_linux_native.cc +++ b/chrome/browser/ui/views/frame/browser_frame_view_linux_native.cc
@@ -6,6 +6,7 @@ #include "chrome/browser/ui/views/frame/browser_frame_view_layout_linux_native.h" #include "ui/views/controls/button/image_button.h" +#include "ui/views/linux_ui/linux_ui.h" #include "ui/views/window/frame_background.h" bool BrowserFrameViewLinuxNative::DrawFrameButtonParams::operator==( @@ -18,12 +19,18 @@ BrowserFrame* frame, BrowserView* browser_view, BrowserFrameViewLayoutLinux* layout, - std::unique_ptr<views::NavButtonProvider> nav_button_provider) + std::unique_ptr<views::NavButtonProvider> nav_button_provider, + views::WindowFrameProvider* window_frame_provider) : BrowserFrameViewLinux(frame, browser_view, layout), - nav_button_provider_(std::move(nav_button_provider)) {} + nav_button_provider_(std::move(nav_button_provider)), + window_frame_provider_(window_frame_provider) {} BrowserFrameViewLinuxNative::~BrowserFrameViewLinuxNative() = default; +float BrowserFrameViewLinuxNative::GetRestoredCornerRadius() const { + return window_frame_provider_->GetTopCornerRadius(); +} + void BrowserFrameViewLinuxNative::Layout() { // Calling MaybeUpdateCachedFrameButtonImages() from Layout() is sufficient to // catch all cases that could update the appearance, since @@ -38,6 +45,12 @@ return FrameButtonStyle::kImageButton; } +void BrowserFrameViewLinuxNative::PaintRestoredFrameBorder( + gfx::Canvas* canvas) const { + window_frame_provider_->PaintWindowFrame( + canvas, GetLocalBounds(), GetTopAreaHeight(), ShouldPaintAsActive()); +} + void BrowserFrameViewLinuxNative::MaybeUpdateCachedFrameButtonImages() { DrawFrameButtonParams params{ GetTopAreaHeight() - layout()->FrameEdgeInsets(!IsMaximized()).top(),
diff --git a/chrome/browser/ui/views/frame/browser_frame_view_linux_native.h b/chrome/browser/ui/views/frame/browser_frame_view_linux_native.h index 37fded53..f21c05a 100644 --- a/chrome/browser/ui/views/frame/browser_frame_view_linux_native.h +++ b/chrome/browser/ui/views/frame/browser_frame_view_linux_native.h
@@ -7,6 +7,7 @@ #include "chrome/browser/ui/views/frame/browser_frame_view_linux.h" #include "ui/views/linux_ui/nav_button_provider.h" +#include "ui/views/linux_ui/window_frame_provider.h" // A specialization of BrowserFrameViewLinux that is also able to // render frame buttons using the native toolkit. @@ -16,7 +17,8 @@ BrowserFrame* frame, BrowserView* browser_view, BrowserFrameViewLayoutLinux* layout, - std::unique_ptr<views::NavButtonProvider> nav_button_provider); + std::unique_ptr<views::NavButtonProvider> nav_button_provider, + views::WindowFrameProvider* window_frame_provider); BrowserFrameViewLinuxNative(const BrowserFrameViewLinuxNative&) = delete; BrowserFrameViewLinuxNative& operator=(const BrowserFrameViewLinuxNative&) = @@ -25,10 +27,16 @@ ~BrowserFrameViewLinuxNative() override; protected: + // BrowserFrameViewLinux: + float GetRestoredCornerRadius() const override; + // OpaqueBrowserFrameView: void Layout() override; FrameButtonStyle GetFrameButtonStyle() const override; + // views::View: + void PaintRestoredFrameBorder(gfx::Canvas* canvas) const override; + private: struct DrawFrameButtonParams { bool operator==(const DrawFrameButtonParams& other) const; @@ -49,6 +57,8 @@ std::unique_ptr<views::NavButtonProvider> nav_button_provider_; + views::WindowFrameProvider* const window_frame_provider_; + DrawFrameButtonParams cache_{0, false, false}; };
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_factory_views.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_factory_views.cc index 655edd7..c6a9253 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_factory_views.cc +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_factory_views.cc
@@ -20,6 +20,7 @@ #include "chrome/browser/ui/views/frame/browser_frame_view_layout_linux_native.h" #include "chrome/browser/ui/views/frame/browser_frame_view_linux.h" #include "chrome/browser/ui/views/frame/browser_frame_view_linux_native.h" +#include "chrome/browser/ui/views/frame/desktop_browser_frame_aura_linux.h" #include "chrome/browser/ui/web_applications/app_browser_controller.h" #include "ui/views/linux_ui/linux_ui.h" #include "ui/views/linux_ui/nav_button_provider.h" @@ -45,10 +46,17 @@ !(app_controller && app_controller->AppUsesWindowControlsOverlay())) { auto nav_button_provider = linux_ui->CreateNavButtonProvider(); if (nav_button_provider) { + bool solid_frame = !static_cast<DesktopBrowserFrameAuraLinux*>( + frame->native_browser_frame()) + ->ShouldDrawRestoredFrameShadow(); + auto* window_frame_provider = + linux_ui->GetWindowFrameProvider(solid_frame); + DCHECK(window_frame_provider); + auto* layout = new BrowserFrameViewLayoutLinuxNative( + nav_button_provider.get(), window_frame_provider); return std::make_unique<BrowserFrameViewLinuxNative>( - frame, browser_view, - new BrowserFrameViewLayoutLinuxNative(nav_button_provider.get()), - std::move(nav_button_provider)); + frame, browser_view, layout, std::move(nav_button_provider), + window_frame_provider); } } return std::make_unique<BrowserFrameViewLinux>(
diff --git a/chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.cc b/chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.cc index 72de2e9..01f1c517 100644 --- a/chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.cc +++ b/chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.cc
@@ -24,6 +24,35 @@ #include "ui/views/bubble/bubble_frame_view.h" #include "url/origin.h" +namespace { + +ax::mojom::Role GetAccessibleRoleForReason( + LocationBarBubbleDelegateView::DisplayReason reason) { + if (reason == LocationBarBubbleDelegateView::USER_GESTURE) { + // crbug.com/1132318: The bubble appears as a direct result of a user + // action and will get focused. If we used an alert-like role, it would + // produce an event that would cause double-speaking the bubble. + return ax::mojom::Role::kDialog; + } + + // crbug.com/1079320, crbug.com/1119367, crbug.com/1119734: The bubble + // appears spontaneously over the course of the user's interaction with + // Chrome and doesn't get focused. We need an alert-like role so the + // corresponding event is triggered and ATs announce the bubble. +#if defined(OS_WIN) + // crbug.com/1125118: Windows ATs only announce these bubbles if the alert + // role is used, despite it not being the most appropriate choice. + // TODO(accessibility): review the role mappings for alerts and dialogs, + // making sure they are translated to the best candidate in each flatform + // without resorting to hacks like this. + return ax::mojom::Role::kAlert; +#else + return ax::mojom::Role::kAlertDialog; +#endif +} + +} // namespace + LocationBarBubbleDelegateView::WebContentMouseHandler::WebContentMouseHandler( LocationBarBubbleDelegateView* bubble, content::WebContents* web_contents) @@ -61,6 +90,11 @@ fullscreen_observation_.Observe( browser->exclusive_access_manager()->fullscreen_controller()); } + // TODO(pbos): Removing this seems to crash on linux-ozone-rel which seems + // really wrong. If we need the accessible role before ShowForReason() we + // can't rely on DisplayReason in there. It also really seems like this dialog + // role should not depend on if it's showing in the foreground or not. + SetAccessibleRole(GetAccessibleRoleForReason(display_reason_)); } LocationBarBubbleDelegateView::~LocationBarBubbleDelegateView() = default; @@ -68,6 +102,7 @@ void LocationBarBubbleDelegateView::ShowForReason(DisplayReason reason, bool allow_refocus_alert) { display_reason_ = reason; + SetAccessibleRole(GetAccessibleRoleForReason(reason)); // These bubbles all anchor to the location bar or toolbar. We selectively // anchor location bar bubbles to one end or the other of the toolbar based on @@ -100,30 +135,6 @@ } } -ax::mojom::Role LocationBarBubbleDelegateView::GetAccessibleWindowRole() { - if (display_reason_ == USER_GESTURE) { - // crbug.com/1132318: The bubble appears as a direct result of a user - // action and will get focused. If we used an alert-like role, it would - // produce an event that would cause double-speaking the bubble. - return ax::mojom::Role::kDialog; - } - - // crbug.com/1079320, crbug.com/1119367, crbug.com/1119734: The bubble - // appears spontaneously over the course of the user's interaction with - // Chrome and doesn't get focused. We need an alert-like role so the - // corresponding event is triggered and ATs announce the bubble. -#if defined(OS_WIN) - // crbug.com/1125118: Windows ATs only announce these bubbles if the alert - // role is used, despite it not being the most appropriate choice. - // TODO(accessibility): review the role mappings for alerts and dialogs, - // making sure they are translated to the best candidate in each flatform - // without resorting to hacks like this. - return ax::mojom::Role::kAlert; -#else - return ax::mojom::Role::kAlertDialog; -#endif -} - void LocationBarBubbleDelegateView::OnFullscreenStateChanged() { GetWidget()->SetVisibilityAnimationTransition(views::Widget::ANIMATE_NONE); CloseBubble();
diff --git a/chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.h b/chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.h index bd955dc..0c623a7c 100644 --- a/chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.h +++ b/chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.h
@@ -71,7 +71,6 @@ content::NavigationHandle* navigation_handle) override; // views::BubbleDialogDelegateView: - ax::mojom::Role GetAccessibleWindowRole() override; gfx::Rect GetAnchorBoundsInScreen() const override; // If the bubble is not anchored to a view, places the bubble in the top right
diff --git a/chrome/browser/ui/views/passwords/password_bubble_browsertest.cc b/chrome/browser/ui/views/passwords/password_bubble_browsertest.cc index a060899c..b8b186fa 100644 --- a/chrome/browser/ui/views/passwords/password_bubble_browsertest.cc +++ b/chrome/browser/ui/views/passwords/password_bubble_browsertest.cc
@@ -103,7 +103,7 @@ EXPECT_EQ(0, counter.GetCount(ax::mojom::Event::kAlert)); // This needs to show a password bubble that does not trigger as a user // gesture in order to fire an alert event. See - // LocationBarBubbleDelegateView::GetAccessibleWindowRole(). + // LocationBarBubbleDelegateView's calls to SetAccessibleRole(). ShowUi("AutomaticPasswordBubble"); EXPECT_EQ(1, counter.GetCount(ax::mojom::Event::kAlert)); }
diff --git a/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view.cc b/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view.cc index 2068a113..bdf3ccc 100644 --- a/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view.cc +++ b/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view.cc
@@ -344,6 +344,8 @@ url_formatter::FormatUrlForSecurityDisplay( delegate_->GetEmbeddingOrigin(), url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC)); + case permissions::RequestType::kU2fApiRequest: + return l10n_util::GetStringUTF16(IDS_U2F_API_PERMISSION_EXPLANATION); default: return absl::nullopt; }
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view_base.cc b/chrome/browser/ui/views/profiles/profile_menu_view_base.cc index 5b5baee8..8dffbd45f 100644 --- a/chrome/browser/ui/views/profiles/profile_menu_view_base.cc +++ b/chrome/browser/ui/views/profiles/profile_menu_view_base.cc
@@ -565,6 +565,11 @@ RegisterWindowClosingCallback(base::BindOnce( &ProfileMenuViewBase::OnWindowClosing, base::Unretained(this))); + + // Use `ax::mojom::Role::kMenuBar`, because it fits better the kind of UI + // contained in this dialog. The top-level container in this dialog uses a + // kMenu role to match. + SetAccessibleRole(ax::mojom::Role::kMenuBar); } ProfileMenuViewBase::~ProfileMenuViewBase() { @@ -1022,13 +1027,6 @@ g_profile_bubble_ = nullptr; } -ax::mojom::Role ProfileMenuViewBase::GetAccessibleWindowRole() { - // Return |ax::mojom::Role::kMenuBar|, because it fits better the kind of UI - // contained in this dialog. The top-level container in this dialog uses a - // kMenu role to match. - return ax::mojom::Role::kMenuBar; -} - bool ProfileMenuViewBase::HandleContextMenu( content::RenderFrameHost* render_frame_host, const content::ContextMenuParams& params) {
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view_base.h b/chrome/browser/ui/views/profiles/profile_menu_view_base.h index 55380425..9c0c0209 100644 --- a/chrome/browser/ui/views/profiles/profile_menu_view_base.h +++ b/chrome/browser/ui/views/profiles/profile_menu_view_base.h
@@ -187,7 +187,6 @@ // views::BubbleDialogDelegateView: void Init() final; void OnThemeChanged() override; - ax::mojom::Role GetAccessibleWindowRole() override; // content::WebContentsDelegate: bool HandleContextMenu(content::RenderFrameHost* render_frame_host,
diff --git a/chrome/browser/ui/views/sharing_hub/sharing_hub_bubble_view_impl.cc b/chrome/browser/ui/views/sharing_hub/sharing_hub_bubble_view_impl.cc index e447e6c..7a03b41 100644 --- a/chrome/browser/ui/views/sharing_hub/sharing_hub_bubble_view_impl.cc +++ b/chrome/browser/ui/views/sharing_hub/sharing_hub_bubble_view_impl.cc
@@ -51,6 +51,7 @@ SetButtons(ui::DIALOG_BUTTON_NONE); set_fixed_width(views::LayoutProvider::Get()->GetDistanceMetric( views::DISTANCE_BUBBLE_PREFERRED_WIDTH)); + SetEnableArrowKeyTraversal(true); DCHECK(controller); }
diff --git a/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc b/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc index dec8eca1..33f278b 100644 --- a/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc +++ b/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc
@@ -481,6 +481,10 @@ } SetButtons(ui::DIALOG_BUTTON_NONE); + // Remove the accessible role so that hover cards are not read when they + // appear because tabs handle accessibility text. + SetAccessibleRole(ax::mojom::Role::kNone); + // We'll do all of our own layout inside the bubble, so no need to inset this // view inside the client view. set_margins(gfx::Insets()); @@ -586,12 +590,6 @@ TabHoverCardBubbleView::~TabHoverCardBubbleView() = default; -ax::mojom::Role TabHoverCardBubbleView::GetAccessibleWindowRole() { - // Override the role so that hover cards are not read when they appear because - // tabs handle accessibility text. - return ax::mojom::Role::kNone; -} - void TabHoverCardBubbleView::UpdateCardContent(const Tab* tab) { // Preview image is never visible for the active tab. if (thumbnail_view_) {
diff --git a/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.h b/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.h index 87052f25..a776948e 100644 --- a/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.h +++ b/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.h
@@ -68,7 +68,6 @@ bool using_rounded_corners() const { return corner_radius_.has_value(); } // views::BubbleDialogDelegateView: - ax::mojom::Role GetAccessibleWindowRole() override; gfx::Size CalculatePreferredSize() const override; void OnThemeChanged() override;
diff --git a/chrome/browser/ui/views/tabs/tab_hover_card_controller.cc b/chrome/browser/ui/views/tabs/tab_hover_card_controller.cc index 6f1dbaad..206148c 100644 --- a/chrome/browser/ui/views/tabs/tab_hover_card_controller.cc +++ b/chrome/browser/ui/views/tabs/tab_hover_card_controller.cc
@@ -8,6 +8,7 @@ #include "base/callback_list.h" #include "base/feature_list.h" #include "base/time/time.h" +#include "build/build_config.h" #include "chrome/browser/metrics/tab_count_metrics.h" #include "chrome/browser/ui/tabs/tab_style.h" #include "chrome/browser/ui/ui_features.h" @@ -297,10 +298,12 @@ slide_animator_->UpdateTargetBounds(); MaybeStartThumbnailObservation(target_tab_, is_initial); +#if defined(OS_LINUX) // Ensure the hover card Widget assumes the highest z-order to avoid occlusion // by other secondary UI Widgets (such as the omnibox Widget, see // crbug.com/1226536). hover_card_->GetWidget()->StackAtTop(); +#endif if (!is_initial || !UseAnimations()) { OnCardFullyVisible();
diff --git a/chrome/browser/ui/views/toolbar/app_menu.cc b/chrome/browser/ui/views/toolbar/app_menu.cc index 032eb050..580ead8 100644 --- a/chrome/browser/ui/views/toolbar/app_menu.cc +++ b/chrome/browser/ui/views/toolbar/app_menu.cc
@@ -867,10 +867,9 @@ // a member of a Widget hierarchy and thus does not have the necessary context // to correctly determine the label color as this requires querying the View's // hosting widget (crbug.com/1233392). - // TODO(ellyjones): Use CONTEXT_MENU instead of CONTEXT_LABEL. return GetLabelFontList(command_id) ? absl::optional<SkColor>(views::style::GetColor( - *root_->GetSubmenu(), views::style::CONTEXT_LABEL, + *root_->GetSubmenu(), views::style::CONTEXT_MENU, views::style::STYLE_PRIMARY)) : absl::nullopt; }
diff --git a/chrome/browser/ui/views/toolbar/chrome_labs_bubble_view.cc b/chrome/browser/ui/views/toolbar/chrome_labs_bubble_view.cc index 86418cfa..d08cc918 100644 --- a/chrome/browser/ui/views/toolbar/chrome_labs_bubble_view.cc +++ b/chrome/browser/ui/views/toolbar/chrome_labs_bubble_view.cc
@@ -198,13 +198,11 @@ views::DISTANCE_BUBBLE_PREFERRED_WIDTH)); set_margins(gfx::Insets(0)); SetEnableArrowKeyTraversal(true); - // Previous role is kUnknown. This override makes ChromeVox draw accessibility - // focus on the entire content area instead of the first combobox. We are not - // using BubbleDialogDelegate::GetAccessibleWindowRole() which will return - // kAlertDialog for this case. kAlertDialog will tell screen readers to - // announce all contents of the bubble when it opens and previous - // accessibility feedback said that behavior was confusing. - GetViewAccessibility().OverrideRole(ax::mojom::Role::kDialog); + // Set `kDialog` to avoid the BubbleDialogDelegate returning a default of + // `kAlertDialog` which would tell screen readers to announce all contents of + // the bubble when it opens and previous accessibility feedback said that + // behavior was confusing. + SetAccessibleRole(ax::mojom::Role::kDialog); // TODO(elainechien): Take care of additional cases 1) kSafeMode switch is // present 2) user is secondary user.
diff --git a/chrome/browser/ui/views/user_education/feature_promo_bubble_params.h b/chrome/browser/ui/views/user_education/feature_promo_bubble_params.h index 49ac652..8126d9ca 100644 --- a/chrome/browser/ui/views/user_education/feature_promo_bubble_params.h +++ b/chrome/browser/ui/views/user_education/feature_promo_bubble_params.h
@@ -78,6 +78,10 @@ // If true, |allow_focus| must be true for keyboard accessibility. bool allow_snooze = false; + // Determines if this IPH has a close button which can dismiss it. This is + // intended to be true for tutorial use cases. + bool show_close_button = false; + // Changes the bubble timeout. Intended for tests, avoid use. absl::optional<base::TimeDelta> timeout_no_interaction; absl::optional<base::TimeDelta> timeout_after_interaction;
diff --git a/chrome/browser/ui/views/user_education/feature_promo_bubble_view.cc b/chrome/browser/ui/views/user_education/feature_promo_bubble_view.cc index a618b5f2..caf877e8 100644 --- a/chrome/browser/ui/views/user_education/feature_promo_bubble_view.cc +++ b/chrome/browser/ui/views/user_education/feature_promo_bubble_view.cc
@@ -16,6 +16,7 @@ #include "chrome/browser/ui/views/user_education/feature_promo_bubble_params.h" #include "chrome/browser/ui/views/user_education/feature_promo_bubble_timeout.h" #include "chrome/grit/generated_resources.h" +#include "components/strings/grit/components_strings.h" #include "components/variations/variations_associated_data.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/metadata/metadata_header_macros.h" @@ -26,14 +27,19 @@ #include "ui/gfx/geometry/insets.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/rect_f.h" +#include "ui/gfx/paint_vector_icon.h" #include "ui/gfx/text_utils.h" #include "ui/views/accessibility/view_accessibility.h" +#include "ui/views/animation/ink_drop.h" #include "ui/views/bubble/bubble_frame_view.h" #include "ui/views/controls/button/button.h" +#include "ui/views/controls/button/image_button.h" +#include "ui/views/controls/button/image_button_factory.h" #include "ui/views/controls/button/label_button.h" #include "ui/views/controls/button/md_text_button.h" #include "ui/views/controls/dot_indicator.h" #include "ui/views/controls/focus_ring.h" +#include "ui/views/controls/highlight_path_generator.h" #include "ui/views/controls/label.h" #include "ui/views/event_monitor.h" #include "ui/views/layout/fill_layout.h" @@ -43,6 +49,7 @@ #include "ui/views/layout/layout_types.h" #include "ui/views/style/platform_style.h" #include "ui/views/style/typography.h" +#include "ui/views/vector_icons.h" #include "ui/views/view_class_properties.h" namespace { @@ -76,6 +83,9 @@ // The background color of the button when focused. constexpr SkColor kBubbleButtonFocusedBackgroundColor = gfx::kGoogleBlue600; +// The background color of the button when highlighted. +constexpr SkColor kBubbleButtonHighlightColor = gfx::kGoogleBlue300; + class MdIPHBubbleButton : public views::MdTextButton { public: METADATA_HEADER(MdIPHBubbleButton); @@ -219,6 +229,10 @@ else accessible_name_ = body_text; + // Since we don't have any controls for the user to interact with (we're just + // an information bubble), override our role to kAlert. + SetAccessibleRole(ax::mojom::Role::kAlert); + // We get the theme provider from the anchor view since our widget hasn't been // created yet. const ui::ThemeProvider* theme_provider = @@ -233,26 +247,56 @@ ThemeProperties::COLOR_FEATURE_PROMO_BUBBLE_TEXT); // Add child views. + views::View* top_row_container = nullptr; + if (params.tutorial_progress_current || params.has_close_button) + top_row_container = AddChildView(std::make_unique<views::View>()); // Add progress indicator. - views::View* progress_indicator_container = nullptr; if (params.tutorial_progress_current) { DCHECK(params.tutorial_progress_max); - progress_indicator_container = - AddChildView(std::make_unique<views::View>()); - // TODO(crbug.com/1197208): surface progress information in a11y tree - for (int i = 0; i < params.tutorial_progress_max; ++i) { SkColor fill_color = i < params.tutorial_progress_current ? SK_ColorWHITE : SK_ColorTRANSPARENT; // TODO(crbug.com/1197208): formalize dot size - progress_indicator_container->AddChildView(std::make_unique<DotView>( + top_row_container->AddChildView(std::make_unique<DotView>( gfx::Size(8, 8), fill_color, SK_ColorWHITE)); } } + auto close_bubble_and_run_callback = [](FeaturePromoBubbleView* view, + base::RepeatingClosure callback, + const ui::Event& event) { + view->CloseBubble(); + callback.Run(); + }; + + // Add close button. + if (params.has_close_button) { + auto* close_button = top_row_container->AddChildView( + std::make_unique<views::ImageButton>(base::BindRepeating( + close_bubble_and_run_callback, base::Unretained(this), + params.dismiss_callback.has_value() + ? std::move(params.dismiss_callback.value()) + : base::DoNothing()))); + close_button->SetImage( + views::ImageButton::STATE_NORMAL, + gfx::CreateVectorIcon(views::kIcCloseIcon, 16, kBubbleButtonTextColor)); + views::ConfigureVectorImageButton(close_button); + views::HighlightPathGenerator::Install( + close_button, + std::make_unique<views::CircleHighlightPathGenerator>(gfx::Insets())); + views::InkDrop::Get(close_button) + ->SetBaseColor(kBubbleButtonHighlightColor); + close_button->SetProperty( + views::kFlexBehaviorKey, + views::FlexSpecification(views::MinimumFlexSizeRule::kPreferred, + views::MaximumFlexSizeRule::kUnbounded) + .WithAlignment(views::LayoutAlignment::kEnd)); + close_button->SetTooltipText(l10n_util::GetStringUTF16(IDS_CLOSE)); + } + // Add title label. views::Label* title_label = nullptr; if (params.title_text.has_value()) { @@ -279,13 +323,6 @@ views::View* button_container = nullptr; if (!params.buttons.empty()) { button_container = AddChildView(std::make_unique<views::View>()); - auto close_bubble_and_run_callback = [](FeaturePromoBubbleView* view, - base::RepeatingClosure callback, - const ui::Event& event) { - view->CloseBubble(); - callback.Run(); - }; - for (ButtonParams& button_params : params.buttons) { MdIPHBubbleButton* const button = button_container->AddChildView(std::make_unique<MdIPHBubbleButton>( @@ -315,11 +352,10 @@ .SetDefault(views::kMarginsKey, gfx::Insets(0, 0, default_spacing, 0)) .SetIgnoreDefaultMainAxisMargins(true); - // Set up progress container layout. + // Set up top row container layout. const int kCloseButtonHeight = 24; - if (progress_indicator_container) { - progress_indicator_container - ->SetLayoutManager(std::make_unique<views::FlexLayout>()) + if (top_row_container) { + top_row_container->SetLayoutManager(std::make_unique<views::FlexLayout>()) ->SetOrientation(views::LayoutOrientation::kHorizontal) .SetCrossAxisAlignment(views::LayoutAlignment::kCenter) .SetMinimumCrossAxisSize(kCloseButtonHeight) @@ -436,12 +472,6 @@ feature_promo_bubble_timeout_->OnMouseExited(); } -ax::mojom::Role FeaturePromoBubbleView::GetAccessibleWindowRole() { - // Since we don't have any controls for the user to interact with (we're just - // an information bubble), override our role to kAlert. - return ax::mojom::Role::kAlert; -} - std::u16string FeaturePromoBubbleView::GetAccessibleWindowTitle() const { return accessible_name_; }
diff --git a/chrome/browser/ui/views/user_education/feature_promo_bubble_view.h b/chrome/browser/ui/views/user_education/feature_promo_bubble_view.h index fd0c952..fc5c5e8 100644 --- a/chrome/browser/ui/views/user_education/feature_promo_bubble_view.h +++ b/chrome/browser/ui/views/user_education/feature_promo_bubble_view.h
@@ -68,6 +68,7 @@ bool focus_on_create = false; bool persist_on_blur = true; + bool has_close_button = false; // Determines how progress indicators for tutorials will be rendered. If not // provided, no progress indicator will be visible. @@ -78,6 +79,9 @@ absl::optional<base::TimeDelta> timeout_no_interaction; absl::optional<base::TimeDelta> timeout_after_interaction; + // Used to call feature specific logic on dismiss. + absl::optional<base::RepeatingClosure> dismiss_callback; + // Used to call feature specific logic on timeout. base::RepeatingClosure timeout_callback; }; @@ -103,7 +107,6 @@ bool OnMousePressed(const ui::MouseEvent& event) override; void OnMouseEntered(const ui::MouseEvent& event) override; void OnMouseExited(const ui::MouseEvent& event) override; - ax::mojom::Role GetAccessibleWindowRole() override; std::u16string GetAccessibleWindowTitle() const override; void UpdateHighlightedButton(bool highlighted) override { // Do nothing: the anchor for promo bubbles should not highlight.
diff --git a/chrome/browser/ui/views/user_education/feature_promo_controller_views.cc b/chrome/browser/ui/views/user_education/feature_promo_controller_views.cc index 5e7e3d60..3009691 100644 --- a/chrome/browser/ui/views/user_education/feature_promo_controller_views.cc +++ b/chrome/browser/ui/views/user_education/feature_promo_controller_views.cc
@@ -340,6 +340,13 @@ std::swap(create_params.buttons[0], create_params.buttons[1]); } + if (params.show_close_button) { + create_params.has_close_button = true; + create_params.dismiss_callback = base::BindRepeating( + &FeaturePromoControllerViews::OnUserDismiss, + weak_ptr_factory_.GetWeakPtr(), *current_iph_feature_); + } + bubble_id_ = bubble_owner_->ShowBubble( std::move(create_params), base::BindOnce(&FeaturePromoControllerViews::HandleBubbleClosed,
diff --git a/chrome/browser/ui/views/user_education/tutorial_dialog_browsertest.cc b/chrome/browser/ui/views/user_education/tutorial_dialog_browsertest.cc index 08cd0cd..f3991bc 100644 --- a/chrome/browser/ui/views/user_education/tutorial_dialog_browsertest.cc +++ b/chrome/browser/ui/views/user_education/tutorial_dialog_browsertest.cc
@@ -19,6 +19,7 @@ BrowserView::GetBrowserViewForBrowser(browser()); FeaturePromoBubbleView::CreateParams params; + params.has_close_button = true; params.anchor_view = browser_view->toolbar()->app_menu_button(); params.arrow = views::BubbleBorder::TOP_RIGHT; params.body_text = u"Hello world, I am a tutorial";
diff --git a/chrome/browser/ui/views/web_apps/web_app_identity_update_confirmation_view.cc b/chrome/browser/ui/views/web_apps/web_app_identity_update_confirmation_view.cc index b39191c1..0f3db23 100644 --- a/chrome/browser/ui/views/web_apps/web_app_identity_update_confirmation_view.cc +++ b/chrome/browser/ui/views/web_apps/web_app_identity_update_confirmation_view.cc
@@ -4,13 +4,13 @@ #include "chrome/browser/ui/views/web_apps/web_app_identity_update_confirmation_view.h" -#include "chrome/app/vector_icons/vector_icons.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/views/chrome_layout_provider.h" #include "chrome/browser/ui/views/web_apps/web_app_uninstall_dialog_view.h" #include "chrome/browser/web_applications/components/web_app_callback_app_identity.h" #include "chrome/grit/generated_resources.h" #include "components/constrained_window/constrained_window_views.h" +#include "components/vector_icons/vector_icons.h" #include "components/webapps/browser/installable/installable_metrics.h" #include "content/public/browser/web_contents.h" #include "ui/base/l10n/l10n_util.h" @@ -26,6 +26,13 @@ namespace { const int kArrowIconSizeDp = 32; +// The width of the column right below the title of the dialog. +const int kMessageColumnWidth = 380; + +// The width of the columns left and right of the arrow (containing the name +// of the app (before and after). +const int kNameColumnWidth = 170; + bool g_auto_accept_app_identity_update_for_testing = false; } // namespace @@ -89,11 +96,12 @@ // the views centered. column_set_main->AddPaddingColumn(/*resize_percent= */ 100, /* width= */ 0); // Column showing the 'before' icon/text. - column_set_main->AddColumn(views::GridLayout::CENTER, - views::GridLayout::CENTER, - views::GridLayout::kFixedSize, - views::GridLayout::ColumnSize::kUsePreferred, - /* fixed_width= */ 0, /* min_width= */ 0); + column_set_main->AddColumn( + /* h_align= */ views::GridLayout::CENTER, + /* v_align= */ views::GridLayout::LEADING, + /* resize_percent= */ views::GridLayout::kFixedSize, + /* size_type= */ views::GridLayout::ColumnSize::kUsePreferred, + /* fixed_width= */ kNameColumnWidth, /* min_width= */ 0); // Padding between the left side and the arrow. column_set_main->AddPaddingColumn( views::GridLayout::kFixedSize, @@ -110,11 +118,12 @@ views::GridLayout::FILL, layout_provider->GetDistanceMetric( views::DISTANCE_RELATED_CONTROL_HORIZONTAL)); // Column showing the 'after' icon/text. - column_set_main->AddColumn(views::GridLayout::CENTER, - views::GridLayout::CENTER, - views::GridLayout::kFixedSize, - views::GridLayout::ColumnSize::kUsePreferred, - /* fixed_width= */ 0, /* min_width= */ 0); + column_set_main->AddColumn( + /* h_align= */ views::GridLayout::CENTER, + /* v_align= */ views::GridLayout::LEADING, + /* resize_percent= */ views::GridLayout::kFixedSize, + /* size_type= */ views::GridLayout::ColumnSize::kUsePreferred, + /* fixed_width= */ kNameColumnWidth, /* min_width= */ 0); // Padding column on the far right side of the dialog. Grows as needed to keep // the views centered. column_set_main->AddPaddingColumn(/*resize_percent= */ 100, /* width= */ 0); @@ -126,7 +135,7 @@ views::style::CONTEXT_LABEL); message_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); message_label->SetMultiLine(true); - message_label->SizeToFit(fixed_width()); + message_label->SizeToFit(kMessageColumnWidth); layout->AddView(std::move(message_label)); layout->AddPaddingRow( @@ -145,8 +154,8 @@ auto arrow = std::make_unique<views::ImageView>(ui::ImageModel::FromVectorIcon( - kKeyboardArrowRightIcon, ui::NativeTheme::kColorId_DefaultIconColor, - kArrowIconSizeDp)); + vector_icons::kForwardArrowIcon, + ui::NativeTheme::kColorId_DefaultIconColor, kArrowIconSizeDp)); layout->AddView(std::move(arrow)); auto new_icon_image_view = std::make_unique<views::ImageView>(); @@ -164,10 +173,12 @@ std::make_unique<views::Label>(old_title, views::style::CONTEXT_LABEL); auto new_title_label = std::make_unique<views::Label>(new_title, views::style::CONTEXT_LABEL); - old_title_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); - new_title_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); + old_title_label->SetHorizontalAlignment(gfx::ALIGN_CENTER); + new_title_label->SetHorizontalAlignment(gfx::ALIGN_CENTER); old_title_label->SetMultiLine(true); new_title_label->SetMultiLine(true); + old_title_label->SizeToFit(kNameColumnWidth); + new_title_label->SizeToFit(kNameColumnWidth); layout->StartRow(views::GridLayout::kFixedSize, kColumnSetIdMain); layout->AddView(std::move(old_title_label));
diff --git a/chrome/browser/ui/web_applications/test/web_app_browsertest_util.cc b/chrome/browser/ui/web_applications/test/web_app_browsertest_util.cc index 4ea30b4..3b38b48 100644 --- a/chrome/browser/ui/web_applications/test/web_app_browsertest_util.cc +++ b/chrome/browser/ui/web_applications/test/web_app_browsertest_util.cc
@@ -58,6 +58,8 @@ #endif #if defined(OS_WIN) +#include <windows.h> + #include <shellapi.h> #include "ui/gfx/icon_util.h" #endif
diff --git a/chrome/browser/ui/webui/settings/chromeos/bluetooth_section.cc b/chrome/browser/ui/webui/settings/chromeos/bluetooth_section.cc index 5dc3310..e591c82d 100644 --- a/chrome/browser/ui/webui/settings/chromeos/bluetooth_section.cc +++ b/chrome/browser/ui/webui/settings/chromeos/bluetooth_section.cc
@@ -184,6 +184,15 @@ {"bluetoothPairNewDevice", IDS_SETTINGS_BLUETOOTH_PAIR_NEW_DEVICES}, {"bluetoothConnect", IDS_SETTINGS_BLUETOOTH_CONNECT}, {"bluetoothDisconnect", IDS_SETTINGS_BLUETOOTH_DISCONNECT}, + {"bluetoothDeviceDetailConnected", + IDS_SETTINGS_BLUETOOTH_DEVICE_DETAIL_CONNECTED}, + {"bluetoothDeviceDetailDisconnected", + IDS_SETTINGS_BLUETOOTH_DEVICE_DETAIL_DISCONNECTED}, + {"bluetoothDeviceDetailForget", + IDS_SETTINGS_BLUETOOTH_DEVICE_DETAIL_FORGET}, + {"bluetoothDeviceDetailName", IDS_SETTINGS_BLUETOOTH_DEVICE_DETAIL_NAME}, + {"bluetoothDeviceDetailChangeDeviceName", + IDS_SETTINGS_BLUETOOTH_DEVICE_DETAIL_CHANGE_DEVICE_NAME}, {"bluetoothToggleA11yLabel", IDS_SETTINGS_BLUETOOTH_TOGGLE_ACCESSIBILITY_LABEL}, {"bluetoothExpandA11yLabel", @@ -204,6 +213,8 @@ IDS_SETTINGS_BLUETOOTH_SUMMARY_PAGE_TWO_DEVICES_DESCRIPTION}, {"bluetoothSummaryPageOff", IDS_SETTINGS_BLUETOOTH_SUMMARY_PAGE_OFF}, {"bluetoothSummaryPageOn", IDS_SETTINGS_BLUETOOTH_SUMMARY_PAGE_ON}, + {"bluetoothPairedDeviceItemBatteryPercentage", + IDS_SETTINGS_BLUETOOTH_PAIRED_DEVICE_ITEM_BATTERY_PERCENTAGE}, {"bluetoothPairDevicePageTitle", IDS_SETTINGS_BLUETOOTH_PAIR_DEVICE_TITLE}, {"bluetoothRemove", IDS_SETTINGS_BLUETOOTH_REMOVE},
diff --git a/chrome/browser/ui/webui/settings/downloads_handler_unittest.cc b/chrome/browser/ui/webui/settings/downloads_handler_unittest.cc index 204b58a..89484f7 100644 --- a/chrome/browser/ui/webui/settings/downloads_handler_unittest.cc +++ b/chrome/browser/ui/webui/settings/downloads_handler_unittest.cc
@@ -28,6 +28,7 @@ namespace { namespace ec = enterprise_connectors; +using testing::NiceMock; using WebUIDataReceivedPtr = std::unique_ptr<content::TestWebUI::CallData>; struct DownloadsSettings { @@ -125,7 +126,7 @@ class DownloadsHandlerTest : public testing::TestWithParam<DownloadsSettings> { public: DownloadsHandlerTest() - : download_manager_(new content::MockDownloadManager()), + : download_manager_(new NiceMock<content::MockDownloadManager>()), handler_(&profile_) { profile_.SetDownloadManagerForTesting(base::WrapUnique(download_manager_)); std::unique_ptr<ChromeDownloadManagerDelegate> delegate =
diff --git a/chrome/browser/web_applications/components/web_app_install_utils.cc b/chrome/browser/web_applications/components/web_app_install_utils.cc index 9c2ee80..41f756e 100644 --- a/chrome/browser/web_applications/components/web_app_install_utils.cc +++ b/chrome/browser/web_applications/components/web_app_install_utils.cc
@@ -361,6 +361,9 @@ web_app_info->is_storage_isolated = manifest.isolated_storage; web_app_info->launch_handler = manifest.launch_handler; + if (manifest.description.has_value()) { + web_app_info->description = manifest.description.value(); + } } std::vector<GURL> GetValidIconUrlsToDownload(
diff --git a/chrome/browser/win/app_icon.h b/chrome/browser/win/app_icon.h index b03b315..bbcea27c 100644 --- a/chrome/browser/win/app_icon.h +++ b/chrome/browser/win/app_icon.h
@@ -5,7 +5,7 @@ #ifndef CHROME_BROWSER_WIN_APP_ICON_H_ #define CHROME_BROWSER_WIN_APP_ICON_H_ -#include <windows.h> +#include "base/win/windows_types.h" #include <memory>
diff --git a/chrome/common/extensions/api/cryptotoken_private.idl b/chrome/common/extensions/api/cryptotoken_private.idl index bd76150..83259da 100644 --- a/chrome/common/extensions/api/cryptotoken_private.idl +++ b/chrome/common/extensions/api/cryptotoken_private.idl
@@ -13,9 +13,9 @@ callback BooleanCallback = void(boolean result); callback VoidCallback = void(); - dictionary CanAppIdGetAttestationOptions { - // The AppId (see definition, above) that was used in the registration - // request and which has been authenticated by |canOriginAssertAppId|. + dictionary U2fApiRequestOptions { + // The AppId (see definition, above) that is used in the register or sign + // request. DOMString appId; // The origin of the caller. DOMString origin; @@ -47,9 +47,14 @@ // identifies the token. If not, the attestation from the token must be // substituted with a randomly generated certificate since webauthn and U2F // require that some attestation be provided. - static void canAppIdGetAttestation(CanAppIdGetAttestationOptions options, + static void canAppIdGetAttestation(U2fApiRequestOptions options, BooleanCallback callback); + // Checks whether a site may issue a U2F register or sign request. Chrome + // displays a permission prompt to determine the result. + static void canMakeU2fApiRequest(U2fApiRequestOptions options, + BooleanCallback callback); + // Increments the WebFeature::kU2FCryptotokenRegister UseCounter for the // main frame associated with |tabId|. static void recordRegisterRequest(long tabId, long frameId,
diff --git a/chrome/common/extensions/api/enterprise_reporting_private.idl b/chrome/common/extensions/api/enterprise_reporting_private.idl index f882e28..13f63e0 100644 --- a/chrome/common/extensions/api/enterprise_reporting_private.idl +++ b/chrome/common/extensions/api/enterprise_reporting_private.idl
@@ -38,6 +38,8 @@ SettingValue screenLockSecured; SettingValue diskEncrypted; DOMString[] macAddresses; + DOMString? windowsMachineDomain; + DOMString? windowsUserDomain; }; // Invoked by <code>getDeviceInfo</code> to return device information. @@ -76,6 +78,7 @@ boolean chromeRemoteDesktopAppBlocked; boolean? thirdPartyBlockingEnabled; SettingValue osFirewall; + DOMString[] systemDnsServers; }; // Invoked by <code>getContextInfo</code> to return context information.
diff --git a/chrome/services/removable_storage_writer/public/mojom/BUILD.gn b/chrome/services/removable_storage_writer/public/mojom/BUILD.gn index c852d70..d01a095 100644 --- a/chrome/services/removable_storage_writer/public/mojom/BUILD.gn +++ b/chrome/services/removable_storage_writer/public/mojom/BUILD.gn
@@ -7,5 +7,8 @@ mojom("mojom") { sources = [ "removable_storage_writer.mojom" ] - public_deps = [ "//mojo/public/mojom/base" ] + public_deps = [ + "//mojo/public/mojom/base", + "//sandbox/policy/mojom", + ] }
diff --git a/chrome/services/removable_storage_writer/public/mojom/removable_storage_writer.mojom b/chrome/services/removable_storage_writer/public/mojom/removable_storage_writer.mojom index ddf7062..c19c30c7 100644 --- a/chrome/services/removable_storage_writer/public/mojom/removable_storage_writer.mojom +++ b/chrome/services/removable_storage_writer/public/mojom/removable_storage_writer.mojom
@@ -5,7 +5,18 @@ module chrome.mojom; import "mojo/public/mojom/base/file_path.mojom"; +import "sandbox/policy/mojom/sandbox.mojom"; +[EnableIf=is_win] +const sandbox.mojom.Sandbox kRemovableStorageWriterSandbox + = sandbox.mojom.Sandbox.kNoSandboxAndElevatedPrivileges; +[EnableIfNot=is_win] +const sandbox.mojom.Sandbox kRemovableStorageWriterSandbox + = sandbox.mojom.Sandbox.kNoSandbox; + +// Used by the Chromebook Recovery Utility to write bootable images on removable +// storage devices. On Windows requires elevation to access the disk directly. +[ServiceSandbox=kRemovableStorageWriterSandbox] interface RemovableStorageWriter { const string kTestDevice = "chrome://test-removable-storage-writer";
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 5774aee..ab4c4093 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -6998,6 +6998,7 @@ "../browser/enterprise/connectors/file_system/box_uploader_test_helper.cc", "../browser/enterprise/connectors/file_system/box_uploader_test_helper.h", "../browser/enterprise/connectors/file_system/box_uploader_unittest.cc", + "../browser/enterprise/connectors/file_system/signin_confirmation_unittest.cc", "../browser/enterprise/connectors/file_system/signin_experience_unittest.cc", "../browser/enterprise/connectors/file_system/test_helper.cc", "../browser/enterprise/connectors/file_system/test_helper.h",
diff --git a/chrome/test/base/browser_tests_main.cc b/chrome/test/base/browser_tests_main.cc index e739f7d..e9faf0e 100644 --- a/chrome/test/base/browser_tests_main.cc +++ b/chrome/test/base/browser_tests_main.cc
@@ -13,7 +13,6 @@ #if defined(OS_WIN) #include "base/win/win_util.h" -#include "chrome/test/base/test_switches.h" #endif // defined(OS_WIN) int main(int argc, char** argv) { @@ -22,8 +21,6 @@ if (parallel_jobs == 0U) return 1; - base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); - #if defined(OS_WIN) // Many tests validate code that requires user32.dll to be loaded. Loading it, // however, cannot be done on the main thread loop because it is a blocking @@ -32,11 +29,11 @@ // issue. base::win::PinUser32(); - if (command_line->HasSwitch(switches::kEnableHighDpiSupport)) { - base::win::EnableHighDPISupport(); - } + base::win::EnableHighDPISupport(); #endif // defined(OS_WIN) + base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); + // Adjust switches for interactive tests where the user is expected to // manually verify results. if (command_line->HasSwitch(switches::kTestLauncherInteractive)) {
diff --git a/chrome/test/base/interactive_ui_tests_main.cc b/chrome/test/base/interactive_ui_tests_main.cc index 542cdf8..1978c189 100644 --- a/chrome/test/base/interactive_ui_tests_main.cc +++ b/chrome/test/base/interactive_ui_tests_main.cc
@@ -38,7 +38,6 @@ #include "base/win/scoped_com_initializer.h" #include "base/win/win_util.h" #include "chrome/test/base/always_on_top_window_killer_win.h" -#include "chrome/test/base/test_switches.h" #endif class InteractiveUITestSuite : public ChromeTestSuite { @@ -179,10 +178,7 @@ &ui_test_utils::BringBrowserWindowToFront); #if defined(OS_WIN) - if (base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kEnableHighDpiSupport)) { - base::win::EnableHighDPISupport(); - } + base::win::EnableHighDPISupport(); #endif // OS_WIN // Run interactive_ui_tests serially, they do not support running in parallel.
diff --git a/chrome/test/base/test_switches.cc b/chrome/test/base/test_switches.cc index 81205746..5d55845 100644 --- a/chrome/test/base/test_switches.cc +++ b/chrome/test/base/test_switches.cc
@@ -3,8 +3,6 @@ // found in the LICENSE file. #include "chrome/test/base/test_switches.h" -#include "build/build_config.h" -#include "ppapi/buildflags/buildflags.h" namespace switches { @@ -20,9 +18,4 @@ // subclasses. const char kPerfTestPrintUmaMeans[] = "perf-test-print-uma-means"; -#if defined(OS_WIN) -// If enabled, tests will run with high DPI support enabled. -const char kEnableHighDpiSupport[] = "enable-high-dpi-support-for-testing"; -#endif - } // namespace switches
diff --git a/chrome/test/base/test_switches.h b/chrome/test/base/test_switches.h index 86adf8e..c31c973 100644 --- a/chrome/test/base/test_switches.h +++ b/chrome/test/base/test_switches.h
@@ -5,9 +5,6 @@ #ifndef CHROME_TEST_BASE_TEST_SWITCHES_H_ #define CHROME_TEST_BASE_TEST_SWITCHES_H_ -#include "build/build_config.h" -#include "ppapi/buildflags/buildflags.h" - namespace switches { // All switches in alphabetical order. The switches should be documented @@ -18,10 +15,6 @@ extern const char kPerfTestPrintUmaMeans[]; -#if defined(OS_WIN) -extern const char kEnableHighDpiSupport[]; -#endif - } // namespace switches #endif // CHROME_TEST_BASE_TEST_SWITCHES_H_
diff --git a/chrome/test/data/extensions/api_test/tab_capture/active_tab_chrome_pages.html b/chrome/test/data/extensions/api_test/tab_capture/active_tab_chrome_pages/active_tab_chrome_pages.html similarity index 100% rename from chrome/test/data/extensions/api_test/tab_capture/active_tab_chrome_pages.html rename to chrome/test/data/extensions/api_test/tab_capture/active_tab_chrome_pages/active_tab_chrome_pages.html
diff --git a/chrome/test/data/extensions/api_test/tab_capture/active_tab_chrome_pages.js b/chrome/test/data/extensions/api_test/tab_capture/active_tab_chrome_pages/active_tab_chrome_pages.js similarity index 100% rename from chrome/test/data/extensions/api_test/tab_capture/active_tab_chrome_pages.js rename to chrome/test/data/extensions/api_test/tab_capture/active_tab_chrome_pages/active_tab_chrome_pages.js
diff --git a/chrome/test/data/extensions/api_test/tab_capture/manifest.json b/chrome/test/data/extensions/api_test/tab_capture/active_tab_chrome_pages/manifest.json similarity index 100% copy from chrome/test/data/extensions/api_test/tab_capture/manifest.json copy to chrome/test/data/extensions/api_test/tab_capture/active_tab_chrome_pages/manifest.json
diff --git a/chrome/test/data/extensions/api_test/tab_capture/active_tab_permission_test.html b/chrome/test/data/extensions/api_test/tab_capture/active_tab_permission_test/active_tab_permission_test.html similarity index 100% rename from chrome/test/data/extensions/api_test/tab_capture/active_tab_permission_test.html rename to chrome/test/data/extensions/api_test/tab_capture/active_tab_permission_test/active_tab_permission_test.html
diff --git a/chrome/test/data/extensions/api_test/tab_capture/active_tab_permission_test.js b/chrome/test/data/extensions/api_test/tab_capture/active_tab_permission_test/active_tab_permission_test.js similarity index 100% rename from chrome/test/data/extensions/api_test/tab_capture/active_tab_permission_test.js rename to chrome/test/data/extensions/api_test/tab_capture/active_tab_permission_test/active_tab_permission_test.js
diff --git a/chrome/test/data/extensions/api_test/tab_capture/manifest.json b/chrome/test/data/extensions/api_test/tab_capture/active_tab_permission_test/manifest.json similarity index 100% copy from chrome/test/data/extensions/api_test/tab_capture/manifest.json copy to chrome/test/data/extensions/api_test/tab_capture/active_tab_permission_test/manifest.json
diff --git a/chrome/test/data/extensions/api_test/tab_capture/api_tests.html b/chrome/test/data/extensions/api_test/tab_capture/api_tests/api_tests.html similarity index 100% rename from chrome/test/data/extensions/api_test/tab_capture/api_tests.html rename to chrome/test/data/extensions/api_test/tab_capture/api_tests/api_tests.html
diff --git a/chrome/test/data/extensions/api_test/tab_capture/api_tests.js b/chrome/test/data/extensions/api_test/tab_capture/api_tests/api_tests.js similarity index 100% rename from chrome/test/data/extensions/api_test/tab_capture/api_tests.js rename to chrome/test/data/extensions/api_test/tab_capture/api_tests/api_tests.js
diff --git a/chrome/test/data/extensions/api_test/tab_capture/manifest.json b/chrome/test/data/extensions/api_test/tab_capture/api_tests/manifest.json similarity index 100% copy from chrome/test/data/extensions/api_test/tab_capture/manifest.json copy to chrome/test/data/extensions/api_test/tab_capture/api_tests/manifest.json
diff --git a/chrome/test/data/extensions/api_test/tab_capture/constraints.html b/chrome/test/data/extensions/api_test/tab_capture/constraints/constraints.html similarity index 100% rename from chrome/test/data/extensions/api_test/tab_capture/constraints.html rename to chrome/test/data/extensions/api_test/tab_capture/constraints/constraints.html
diff --git a/chrome/test/data/extensions/api_test/tab_capture/constraints.js b/chrome/test/data/extensions/api_test/tab_capture/constraints/constraints.js similarity index 100% rename from chrome/test/data/extensions/api_test/tab_capture/constraints.js rename to chrome/test/data/extensions/api_test/tab_capture/constraints/constraints.js
diff --git a/chrome/test/data/extensions/api_test/tab_capture/manifest.json b/chrome/test/data/extensions/api_test/tab_capture/constraints/manifest.json similarity index 100% copy from chrome/test/data/extensions/api_test/tab_capture/manifest.json copy to chrome/test/data/extensions/api_test/tab_capture/constraints/manifest.json
diff --git a/chrome/test/data/extensions/api_test/tab_capture/end_to_end.html b/chrome/test/data/extensions/api_test/tab_capture/end_to_end/end_to_end.html similarity index 100% rename from chrome/test/data/extensions/api_test/tab_capture/end_to_end.html rename to chrome/test/data/extensions/api_test/tab_capture/end_to_end/end_to_end.html
diff --git a/chrome/test/data/extensions/api_test/tab_capture/end_to_end.js b/chrome/test/data/extensions/api_test/tab_capture/end_to_end/end_to_end.js similarity index 100% rename from chrome/test/data/extensions/api_test/tab_capture/end_to_end.js rename to chrome/test/data/extensions/api_test/tab_capture/end_to_end/end_to_end.js
diff --git a/chrome/test/data/extensions/api_test/tab_capture/manifest.json b/chrome/test/data/extensions/api_test/tab_capture/end_to_end/manifest.json similarity index 100% copy from chrome/test/data/extensions/api_test/tab_capture/manifest.json copy to chrome/test/data/extensions/api_test/tab_capture/end_to_end/manifest.json
diff --git a/chrome/test/data/extensions/api_test/tab_capture/fullscreen_test.html b/chrome/test/data/extensions/api_test/tab_capture/fullscreen_test/fullscreen_test.html similarity index 100% rename from chrome/test/data/extensions/api_test/tab_capture/fullscreen_test.html rename to chrome/test/data/extensions/api_test/tab_capture/fullscreen_test/fullscreen_test.html
diff --git a/chrome/test/data/extensions/api_test/tab_capture/fullscreen_test.js b/chrome/test/data/extensions/api_test/tab_capture/fullscreen_test/fullscreen_test.js similarity index 100% rename from chrome/test/data/extensions/api_test/tab_capture/fullscreen_test.js rename to chrome/test/data/extensions/api_test/tab_capture/fullscreen_test/fullscreen_test.js
diff --git a/chrome/test/data/extensions/api_test/tab_capture/manifest.json b/chrome/test/data/extensions/api_test/tab_capture/fullscreen_test/manifest.json similarity index 100% copy from chrome/test/data/extensions/api_test/tab_capture/manifest.json copy to chrome/test/data/extensions/api_test/tab_capture/fullscreen_test/manifest.json
diff --git a/chrome/test/data/extensions/api_test/tab_capture/get_user_media_test.html b/chrome/test/data/extensions/api_test/tab_capture/get_user_media_test/get_user_media_test.html similarity index 100% rename from chrome/test/data/extensions/api_test/tab_capture/get_user_media_test.html rename to chrome/test/data/extensions/api_test/tab_capture/get_user_media_test/get_user_media_test.html
diff --git a/chrome/test/data/extensions/api_test/tab_capture/get_user_media_test.js b/chrome/test/data/extensions/api_test/tab_capture/get_user_media_test/get_user_media_test.js similarity index 100% rename from chrome/test/data/extensions/api_test/tab_capture/get_user_media_test.js rename to chrome/test/data/extensions/api_test/tab_capture/get_user_media_test/get_user_media_test.js
diff --git a/chrome/test/data/extensions/api_test/tab_capture/manifest.json b/chrome/test/data/extensions/api_test/tab_capture/get_user_media_test/manifest.json similarity index 100% copy from chrome/test/data/extensions/api_test/tab_capture/manifest.json copy to chrome/test/data/extensions/api_test/tab_capture/get_user_media_test/manifest.json
diff --git a/chrome/test/data/extensions/api_test/tab_capture/manifest.json b/chrome/test/data/extensions/api_test/tab_capture/start_tab_capture/manifest.json similarity index 100% rename from chrome/test/data/extensions/api_test/tab_capture/manifest.json rename to chrome/test/data/extensions/api_test/tab_capture/start_tab_capture/manifest.json
diff --git a/chrome/test/data/extensions/api_test/tab_capture/start_tab_capture.html b/chrome/test/data/extensions/api_test/tab_capture/start_tab_capture/start_tab_capture.html similarity index 100% rename from chrome/test/data/extensions/api_test/tab_capture/start_tab_capture.html rename to chrome/test/data/extensions/api_test/tab_capture/start_tab_capture/start_tab_capture.html
diff --git a/chrome/test/data/extensions/api_test/tab_capture/start_tab_capture.js b/chrome/test/data/extensions/api_test/tab_capture/start_tab_capture/start_tab_capture.js similarity index 100% rename from chrome/test/data/extensions/api_test/tab_capture/start_tab_capture.js rename to chrome/test/data/extensions/api_test/tab_capture/start_tab_capture/start_tab_capture.js
diff --git a/chrome/test/data/webrtc/webrtc_getdisplaymedia_test.html b/chrome/test/data/webrtc/webrtc_getdisplaymedia_test.html index 66787c32..3eb19f1 100644 --- a/chrome/test/data/webrtc/webrtc_getdisplaymedia_test.html +++ b/chrome/test/data/webrtc/webrtc_getdisplaymedia_test.html
@@ -79,15 +79,6 @@ } } - function waitVideoEnded() { - if (video_track.readyState == "ended") { - returnToTest("ended"); - } - video_track.onended = function(evt) { - returnToTest("ended"); - } - } - // function readLastResultFromEmbedded() { // // Blocks until the result is reported by the embedded page. // } @@ -109,3 +100,4 @@ <iframe id="disallowedFrame" src="webrtc_getdisplaymedia_embedded_document.html" allow="display-capture 'none'"></iframe> </body> </html> +
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn index a72896c..0af6da8c 100644 --- a/chrome/test/data/webui/BUILD.gn +++ b/chrome/test/data/webui/BUILD.gn
@@ -370,6 +370,7 @@ "$root_gen_dir/chrome/test/data/webui/settings/chromeos/os_bluetooth_page_tests.m.js", "$root_gen_dir/chrome/test/data/webui/settings/chromeos/os_bluetooth_summary_tests.m.js", "$root_gen_dir/chrome/test/data/webui/settings/chromeos/os_bluetooth_devices_subpage_tests.m.js", + "$root_gen_dir/chrome/test/data/webui/settings/chromeos/os_bluetooth_device_detail_subpage_tests.m.js", "$root_gen_dir/chrome/test/data/webui/settings/chromeos/os_paired_bluetooth_list_tests.m.js", "$root_gen_dir/chrome/test/data/webui/settings/chromeos/os_paired_bluetooth_list_item_tests.m.js", "$root_gen_dir/chrome/test/data/webui/settings/chromeos/os_edit_dictionary_page_test.m.js",
diff --git a/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js b/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js index 15c3b16..07e3a58 100644 --- a/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js +++ b/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js
@@ -504,7 +504,7 @@ * Clicks the "Ok" button to close the scan failed dialog. * @return {!Promise} */ - function clickOkButton() { + function clickScanFailedDialogOkButton() { const button = scanningApp.$$('#okButton'); assertTrue(!!button); button.click(); @@ -740,7 +740,7 @@ // The scan failed dialog should open. assertTrue(scanningApp.$$('#scanFailedDialog').open); // Click the dialog's Ok button to return to READY state. - return clickOkButton(); + return clickScanFailedDialogOkButton(); }) .then(() => { // After the dialog closes, the scan button should be enabled and @@ -751,6 +751,45 @@ }); }); + // Verify the scan failed dialog closes and resets the scan app state when the + // user clicks ESC. + test('EscClosesScanFailedDialog', () => { + return initializeScanningApp(expectedScanners, capabilities) + .then(() => { + scanButton = + /** @type {!CrButtonElement} */ (scanningApp.$$('#scanButton')); + return getScannerCapabilities(); + }) + .then(() => { + // Click the Scan button and wait till the scan is started. + scanButton.click(); + return fakeScanService_.whenCalled('startScan'); + }) + .then(() => { + // Simulate a progress update. + return fakeScanService_.simulateProgress( + /*pageNumber=*/ 1, /*progressPercent=*/ 17); + }) + .then(() => { + // Simulate the scan failing. + return fakeScanService_.simulateScanComplete( + ash.scanning.mojom.ScanResult.kIoError, []); + }) + .then(() => { + const scanFailedDialog = scanningApp.$$('#scanFailedDialog'); + + // The scan failed dialog should open. + assertTrue(scanFailedDialog.open); + + // Simulate the ESC key by sending the `cancel` event to the native + // dialog. + scanFailedDialog.$$('dialog').dispatchEvent(new Event('cancel')); + assertFalse(scanningApp.$$('#scanFailedDialog').open); + assertFalse(scanButton.disabled); + assertTrue(isVisible(/** @type {!CrButtonElement} */ (scanButton))); + }); + }); + // Verify a multi-page scan job can be initiated. test('MultiPageScan', () => { /** @type {!Array<!mojoBase.mojom.FilePath>} */ @@ -846,7 +885,7 @@ assertEquals( loadTimeData.getString('scanFailedDialogUnknownErrorText'), scanningApp.$$('#scanFailedDialogText').textContent.trim()); - return clickOkButton(); + return clickScanFailedDialogOkButton(); }) .then(() => { scanButton.click(); @@ -860,7 +899,7 @@ assertEquals( loadTimeData.getString('scanFailedDialogDeviceBusyText'), scanningApp.$$('#scanFailedDialogText').textContent.trim()); - return clickOkButton(); + return clickScanFailedDialogOkButton(); }) .then(() => { scanButton.click(); @@ -874,7 +913,7 @@ assertEquals( loadTimeData.getString('scanFailedDialogAdfJammedText'), scanningApp.$$('#scanFailedDialogText').textContent.trim()); - return clickOkButton(); + return clickScanFailedDialogOkButton(); }) .then(() => { scanButton.click(); @@ -888,7 +927,7 @@ assertEquals( loadTimeData.getString('scanFailedDialogAdfEmptyText'), scanningApp.$$('#scanFailedDialogText').textContent.trim()); - return clickOkButton(); + return clickScanFailedDialogOkButton(); }) .then(() => { scanButton.click(); @@ -902,7 +941,7 @@ assertEquals( loadTimeData.getString('scanFailedDialogFlatbedOpenText'), scanningApp.$$('#scanFailedDialogText').textContent.trim()); - return clickOkButton(); + return clickScanFailedDialogOkButton(); }) .then(() => { scanButton.click(); @@ -916,7 +955,7 @@ assertEquals( loadTimeData.getString('scanFailedDialogIoErrorText'), scanningApp.$$('#scanFailedDialogText').textContent.trim()); - return clickOkButton(); + return clickScanFailedDialogOkButton(); }); });
diff --git a/chrome/test/data/webui/settings/chromeos/BUILD.gn b/chrome/test/data/webui/settings/chromeos/BUILD.gn index 9e1ad9e..dbde41b 100644 --- a/chrome/test/data/webui/settings/chromeos/BUILD.gn +++ b/chrome/test/data/webui/settings/chromeos/BUILD.gn
@@ -124,6 +124,7 @@ "os_bluetooth_page_tests.js", "os_bluetooth_summary_tests.js", "os_bluetooth_devices_subpage_tests.js", + "os_bluetooth_device_detail_subpage_tests.js", "os_edit_dictionary_page_test.js", "os_files_page_test.js", "os_languages_page_v2_tests.js",
diff --git a/chrome/test/data/webui/settings/chromeos/fake_bluetooth_config.js b/chrome/test/data/webui/settings/chromeos/fake_bluetooth_config.js index 9f29be9..edd14207 100644 --- a/chrome/test/data/webui/settings/chromeos/fake_bluetooth_config.js +++ b/chrome/test/data/webui/settings/chromeos/fake_bluetooth_config.js
@@ -9,6 +9,8 @@ import {stringToMojoString16} from 'chrome://resources/cr_components/chromeos/bluetooth/bluetooth_utils.js'; import {assert} from 'chrome://resources/js/assert.m.js'; +const mojom = chromeos.bluetoothConfig.mojom; + /** * @param {string} id * @param {string} publicName @@ -17,14 +19,14 @@ * @return {!chromeos.bluetoothConfig.mojom.PairedBluetoothDeviceProperties} */ export function createDefaultBluetoothDevice( - id, publicName, connected, nickname = undefined) { - const mojom = chromeos.bluetoothConfig.mojom; + id, publicName, connected, nickname = undefined, + audioCapability = mojom.AudioOutputCapability.kNotCapableOfAudio) { return { deviceProperties: { id: id, publicName: stringToMojoString16(publicName), deviceType: mojom.DeviceType.kComputer, - audioCapability: mojom.AudioOutputCapability.kNotCapableOfAudio, + audioCapability: audioCapability, connectionState: connected ? mojom.DeviceConnectionState.kConnected : mojom.DeviceConnectionState.kNotConnected, }, @@ -143,15 +145,37 @@ * device */ removePairedDevice(device) { + this.systemProperties_.pairedDevices.splice( + this.getDeviceIndex_(device), 1); + this.notifyObserversPropertiesUpdated_(); + } + + /** + * @param {chromeos.bluetoothConfig.mojom.PairedBluetoothDeviceProperties} + * device + * @return {number} + * @private + */ + getDeviceIndex_(device) { const foundDeviceIndex = this.systemProperties_.pairedDevices.findIndex( pairedDevice => pairedDevice.deviceProperties.id === device.deviceProperties.id); assert( foundDeviceIndex !== -1, `Device with id: ${device.deviceProperties.id} - was not found.`); + was not found.`); - this.systemProperties_.pairedDevices.splice(foundDeviceIndex, 1); + return foundDeviceIndex; + } + + /** + * Replaces device found in |systemProperties| with |device|. + * @param {chromeos.bluetoothConfig.mojom.PairedBluetoothDeviceProperties} + * device + */ + updatePairedDevice(device) { + this.systemProperties_.pairedDevices.splice( + this.getDeviceIndex_(device), 1, {...device}); this.notifyObserversPropertiesUpdated_(); } @@ -163,4 +187,4 @@ this.observers_.forEach( o => o.onPropertiesUpdated({...this.systemProperties_})); } -} \ No newline at end of file +}
diff --git a/chrome/test/data/webui/settings/chromeos/os_bluetooth_device_detail_subpage_tests.js b/chrome/test/data/webui/settings/chromeos/os_bluetooth_device_detail_subpage_tests.js new file mode 100644 index 0000000..f6ba3f67 --- /dev/null +++ b/chrome/test/data/webui/settings/chromeos/os_bluetooth_device_detail_subpage_tests.js
@@ -0,0 +1,184 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// clang-format off +// #import 'chrome://os-settings/chromeos/os_settings.js'; + +// #import 'chrome://os-settings/strings.m.js'; + +// #import {Router, Route, routes} from 'chrome://os-settings/chromeos/os_settings.js'; +// #import {flush, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +// #import {eventToPromise} from 'chrome://test/test_util.m.js'; +// #import {assertTrue, assertEquals, assertFalse} from '../../../chai_assert.js'; +// #import {createDefaultBluetoothDevice, FakeBluetoothConfig} from './fake_bluetooth_config.m.js'; +// #import {setBluetoothConfigForTesting} from 'chrome://resources/cr_components/chromeos/bluetooth/cros_bluetooth_config.js'; +// clang-format on + +suite('OsBluetoothDeviceDetailPageTest', function() { + /** @type {!FakeBluetoothConfig} */ + let bluetoothConfig; + + /** @type {!SettingsBluetoothDeviceDetailSubpageElement|undefined} */ + let bluetoothDeviceDetailPage; + + /** @type {!chromeos.bluetoothConfig.mojom} */ + let mojom; + + /** + * @type {!chromeos.bluetoothConfig.mojom.SystemPropertiesObserverInterface} + */ + let propertiesObserver; + + setup(function() { + mojom = chromeos.bluetoothConfig.mojom; + bluetoothConfig = new FakeBluetoothConfig(); + setBluetoothConfigForTesting(bluetoothConfig); + }); + + function init() { + bluetoothDeviceDetailPage = + document.createElement('os-settings-bluetooth-device-detail-subpage'); + document.body.appendChild(bluetoothDeviceDetailPage); + Polymer.dom.flush(); + + propertiesObserver = { + /** + * SystemPropertiesObserverInterface override + * @param {!chromeos.bluetoothConfig.mojom.BluetoothSystemProperties} + * properties + */ + onPropertiesUpdated(properties) { + bluetoothDeviceDetailPage.systemProperties = properties; + }, + }; + bluetoothConfig.observeSystemProperties(propertiesObserver); + } + + function flushAsync() { + Polymer.dom.flush(); + return new Promise((resolve) => setTimeout(resolve)); + } + + teardown(function() { + bluetoothDeviceDetailPage.remove(); + bluetoothDeviceDetailPage = null; + settings.Router.getInstance().resetRouteForTesting(); + }); + + + test('Base Test', async function() { + init(); + bluetoothConfig.setBluetoothEnabledState(/*enabled=*/ true); + + const device1 = createDefaultBluetoothDevice( + /*id=*/ '12//345&6789', + /*publicName=*/ 'BeatsX', + /*connected=*/ true, + /*nickname=*/ 'device1'); + + bluetoothConfig.appendToPairedDeviceList([device1]); + await flushAsync(); + + const params = new URLSearchParams(); + params.append('id', '12//345&6789'); + settings.Router.getInstance().navigateTo( + settings.routes.BLUETOOTH_DEVICE_DETAIL, params); + + await flushAsync(); + assertEquals('device1', bluetoothDeviceDetailPage.parentNode.pageTitle); + }); + + test('Device becomes unavailable while viewing page.', async function() { + init(); + bluetoothConfig.setBluetoothEnabledState(/*enabled=*/ true); + + const windowPopstatePromise = test_util.eventToPromise('popstate', window); + + const device1 = createDefaultBluetoothDevice( + /*id=*/ '12345/6789&', + /*publicName=*/ 'BeatsX', + /*connected=*/ true, + /*nickname=*/ 'device1'); + + const device2 = createDefaultBluetoothDevice( + /*id=*/ '987654321', + /*publicName=*/ 'MX 3', + /*connected=*/ true); + + bluetoothConfig.appendToPairedDeviceList([device1, device2]); + await flushAsync(); + + const params = new URLSearchParams(); + params.append('id', '12345/6789&'); + settings.Router.getInstance().navigateTo( + settings.routes.BLUETOOTH_DEVICE_DETAIL, params); + + await flushAsync(); + assertEquals('device1', bluetoothDeviceDetailPage.parentNode.pageTitle); + bluetoothConfig.removePairedDevice(device1); + await windowPopstatePromise; + }); + + test('Device UI states test', async function() { + init(); + const getBluetoothStatusIcon = () => + bluetoothDeviceDetailPage.$$('#statusIcon'); + const getBluetoothStateText = () => + bluetoothDeviceDetailPage.$$('#bluetoothStateText'); + const getBluetoothForgetBtn = () => + bluetoothDeviceDetailPage.$$('#forgetBtn'); + const getBluetoothStateBtn = () => + bluetoothDeviceDetailPage.$$('#stateBtn'); + const getBluetoothDeviceNameLabel = () => + bluetoothDeviceDetailPage.$$('#bluetoothDeviceNameLabel'); + + bluetoothConfig.setBluetoothEnabledState(/*enabled=*/ true); + + assertTrue(!!getBluetoothStatusIcon()); + assertTrue(!!getBluetoothStateText()); + assertTrue(!!getBluetoothForgetBtn()); + assertTrue(!!getBluetoothDeviceNameLabel()); + assertFalse(!!getBluetoothStateBtn()); + + const device1 = createDefaultBluetoothDevice( + /*id=*/ '123456789', + /*publicName=*/ 'BeatsX', + /*connected=*/ true, + /*nickname=*/ 'device1', + /*audioCapability=*/ mojom.AudioOutputCapability.kCapableOfAudioOutput); + + bluetoothConfig.appendToPairedDeviceList([device1]); + await flushAsync(); + + const params = new URLSearchParams(); + params.append('id', '123456789'); + settings.Router.getInstance().navigateTo( + settings.routes.BLUETOOTH_DEVICE_DETAIL, params); + await flushAsync(); + + // Simulate connected state and audio capable. + assertTrue(!!getBluetoothStateBtn()); + assertEquals( + bluetoothDeviceDetailPage.i18n('bluetoothDeviceDetailConnected'), + getBluetoothStateText().textContent.trim()); + assertEquals('device1', getBluetoothDeviceNameLabel().textContent.trim()); + assertEquals( + 'os-settings:bluetooth-connected', getBluetoothStatusIcon().icon); + + // Simulate disconnected state and not audio capable. + device1.deviceProperties.connectionState = + mojom.DeviceConnectionState.kNotConnected; + device1.deviceProperties.audioCapability = + mojom.AudioOutputCapability.kNotCapableOfAudioOutput; + bluetoothConfig.updatePairedDevice(device1); + await flushAsync(); + + assertFalse(!!getBluetoothStateBtn()); + assertEquals( + bluetoothDeviceDetailPage.i18n('bluetoothDeviceDetailDisconnected'), + getBluetoothStateText().textContent.trim()); + assertEquals( + 'os-settings:bluetooth-disabled', getBluetoothStatusIcon().icon); + }); +});
diff --git a/chrome/test/data/webui/settings/chromeos/os_paired_bluetooth_list_item_tests.js b/chrome/test/data/webui/settings/chromeos/os_paired_bluetooth_list_item_tests.js index 8e24ab187..341f3ee 100644 --- a/chrome/test/data/webui/settings/chromeos/os_paired_bluetooth_list_item_tests.js +++ b/chrome/test/data/webui/settings/chromeos/os_paired_bluetooth_list_item_tests.js
@@ -9,6 +9,7 @@ // #import {flush, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; // #import {assertTrue} from '../../../chai_assert.js'; +// #import {createDefaultBluetoothDevice} from './fake_bluetooth_config.m.js'; // clang-format on suite('OsPairedBluetoothListItemTest', function() { @@ -22,7 +23,120 @@ Polymer.dom.flush(); }); - test('Base Test', function() { - assertTrue(!!pairedBluetoothListItem); + function flushAsync() { + Polymer.dom.flush(); + return new Promise(resolve => setTimeout(resolve)); + } + + /** + * @param {number} batteryPercentage + */ + async function setBatteryPercentage(batteryPercentage) { + pairedBluetoothListItem.device.deviceProperties.batteryInfo = { + defaultProperties: {batteryPercentage: batteryPercentage} + }; + pairedBluetoothListItem.device = {...pairedBluetoothListItem.device}; + return flushAsync(); + } + + /** + * @param {boolean} isLowBattery + * @param {boolean} batteryIconRange + */ + function assertBatteryUIState(isLowBattery, batteryIconRange) { + assertEquals(pairedBluetoothListItem.isLowBattery_, isLowBattery); + assertEquals( + pairedBluetoothListItem.shadowRoot.querySelector('#batteryIcon').icon, + 'os-settings:battery-' + batteryIconRange); + } + + // TODO(crbug.com/1010321): Test device type icon here. + test('Device name and battery percentage', async function() { + // Device with no nickname or battery info. + const publicName = 'BeatsX'; + const device = createDefaultBluetoothDevice( + /*id=*/ '123456789', /*publicName=*/ publicName, /*connected=*/ true); + pairedBluetoothListItem.device = device; + await flushAsync(); + + const getDeviceName = () => { + return pairedBluetoothListItem.$.deviceName; + }; + const getBatteryPercentage = () => { + return pairedBluetoothListItem.shadowRoot.querySelector( + '#batteryPercentage'); + }; + assertTrue(!!getDeviceName()); + assertEquals(getDeviceName().innerText, publicName); + assertFalse(!!getBatteryPercentage()); + + // Set device nickname and battery info. + const nickname = 'nickname'; + device.nickname = nickname; + const batteryPercentage = 60; + device.deviceProperties.batteryInfo = { + defaultProperties: {batteryPercentage: batteryPercentage} + }; + pairedBluetoothListItem.device = {...device}; + await flushAsync(); + + assertTrue(!!getDeviceName()); + assertEquals(getDeviceName().innerText, nickname); + assertTrue(!!getBatteryPercentage()); + assertEquals( + getBatteryPercentage().innerText.trim(), + pairedBluetoothListItem.i18n( + 'bluetoothPairedDeviceItemBatteryPercentage', batteryPercentage)); + }); + + test('Battery icon and color', async function() { + const device = createDefaultBluetoothDevice( + /*id=*/ '123456789', /*publicName=*/ 'BeatsX', /*connected=*/ true); + pairedBluetoothListItem.device = device; + + const getBatteryContainer = () => { + return pairedBluetoothListItem.shadowRoot.querySelector( + '#batteryContainer'); + }; + + // Battery percentage out of bounds, should not be visible. + await setBatteryPercentage(-10); + assertFalse(!!getBatteryContainer()); + + // Lower bound edge case. + await setBatteryPercentage(0); + assertBatteryUIState(/*isLowBattery=*/ true, /*batteryIconRange=*/ '0-7'); + + await setBatteryPercentage(3); + assertBatteryUIState( + /*isLowBattery=*/ true, + /*batteryIconRange=*/ '0-7'); + + // Maximum 'low battery' percentage. + await setBatteryPercentage(24); + assertBatteryUIState( + /*isLowBattery=*/ true, + /*batteryIconRange=*/ '22-28'); + + // Minimum non-'low battery' percentage. + await setBatteryPercentage(25); + assertBatteryUIState( + /*isLowBattery=*/ false, + /*batteryIconRange=*/ '22-28'); + + await setBatteryPercentage(94); + assertBatteryUIState( + /*isLowBattery=*/ false, + /*batteryIconRange=*/ '93-100'); + + // Upper bound edge case. + await setBatteryPercentage(100); + assertBatteryUIState( + /*isLowBattery=*/ false, + /*batteryIconRange=*/ '93-100'); + + // Battery percentage out of bounds, should not be visible. + await setBatteryPercentage(101); + assertFalse(!!getBatteryContainer()); }); }); \ No newline at end of file
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js b/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js index 91c640e..be53cce1 100644 --- a/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js +++ b/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js
@@ -283,6 +283,29 @@ } }; +// TODO(crbug.com/1237598) Move this test back into the list of tests below once +// Bluetooth revamp is launched. +// eslint-disable-next-line no-var +var OSSettingsOsBluetoothDeviceDetailSubpageV3Test = + class extends OSSettingsV3BrowserTest { + /** @override */ + get browsePreload() { + return 'chrome://os-settings/test_loader.html?module=settings/chromeos/os_bluetooth_device_detail_subpage_tests.m.js'; + } + + /** @override */ + get featureList() { + return { + enabled: + super.featureList.enabled.concat(['ash::features::kBluetoothRevamp']) + }; + } +}; + +TEST_F('OSSettingsOsBluetoothDeviceDetailSubpageV3Test', 'AllJsTests', () => { + mocha.run(); +}); + [['AccessibilityPage', 'os_a11y_page_tests.m.js'], ['AboutPage', 'os_about_page_tests.m.js'], ['AccountsPage', 'add_users_tests.m.js'],
diff --git a/chrome/updater/test/integration_tests_helper.cc b/chrome/updater/test/integration_tests_helper.cc index e63de6a0..c6c1e7b 100644 --- a/chrome/updater/test/integration_tests_helper.cc +++ b/chrome/updater/test/integration_tests_helper.cc
@@ -172,10 +172,8 @@ {"install", WithSystemScope(Wrap(&Install))}, {"print_log", WithSystemScope(Wrap(&PrintLog))}, {"run_wake", WithSwitch("exit_code", WithSystemScope(Wrap(&RunWake)))}, -#if defined(OS_MAC) {"register_app", WithSwitch("app_id", Wrap(&RegisterApp))}, {"register_test_app", WithSystemScope(Wrap(&RegisterTestApp))}, -#endif // defined(OS_MAC) {"set_existence_checker_path", WithSwitch("path", WithSwitch("app_id", Wrap(&SetExistenceCheckerPath)))}, {"setup_fake_updater_higher_version",
diff --git a/chrome/updater/test/integration_tests_win.cc b/chrome/updater/test/integration_tests_win.cc index 0e5ea5f8..24fd2622 100644 --- a/chrome/updater/test/integration_tests_win.cc +++ b/chrome/updater/test/integration_tests_win.cc
@@ -60,6 +60,9 @@ return test_executable.DirName().AppendASCII(TEST_APP_FULLNAME_STRING ".exe"); } +// Returns the root directory where the updater product is installed. This +// is the parent directory where the versioned directories of the +// updater instances are. absl::optional<base::FilePath> GetProductPath(UpdaterScope scope) { base::FilePath app_data_dir; if (!base::PathService::Get(scope == UpdaterScope::kSystem @@ -69,8 +72,14 @@ return absl::nullopt; } return app_data_dir.AppendASCII(COMPANY_SHORTNAME_STRING) - .AppendASCII(PRODUCT_FULLNAME_STRING) - .AppendASCII(kUpdaterVersion); + .AppendASCII(PRODUCT_FULLNAME_STRING); +} + +// Returns the versioned directory of this updater instances. +absl::optional<base::FilePath> GetProductVersionPath(UpdaterScope scope) { + absl::optional<base::FilePath> product_path = GetProductPath(scope); + return product_path ? product_path->AppendASCII(kUpdaterVersion) + : product_path; } std::wstring GetAppClientStateKey(const std::string& id) { @@ -91,7 +100,7 @@ } // namespace absl::optional<base::FilePath> GetInstalledExecutablePath(UpdaterScope scope) { - absl::optional<base::FilePath> path = GetProductPath(scope); + absl::optional<base::FilePath> path = GetProductVersionPath(scope); if (!path) return absl::nullopt; return path->AppendASCII("updater.exe"); @@ -100,7 +109,7 @@ absl::optional<base::FilePath> GetFakeUpdaterInstallFolderPath( UpdaterScope scope, const base::Version& version) { - absl::optional<base::FilePath> path = GetProductPath(scope); + absl::optional<base::FilePath> path = GetProductVersionPath(scope); if (!path) return absl::nullopt; return path->AppendASCII(version.GetString()); @@ -241,7 +250,7 @@ // TODO(crbug.com/1062288): Assert there are no Wake tasks. // Files must not exist on the file system. - absl::optional<base::FilePath> path = GetProductPath(scope); + absl::optional<base::FilePath> path = GetProductVersionPath(scope); EXPECT_TRUE(path); if (path) EXPECT_FALSE(base::PathExists(*path)); @@ -268,7 +277,7 @@ // TODO(crbug.com/1062288): Assert there are Wake tasks. // Files must exist on the file system. - absl::optional<base::FilePath> path = GetProductPath(scope); + absl::optional<base::FilePath> path = GetProductVersionPath(scope); EXPECT_TRUE(path); if (path) EXPECT_TRUE(base::PathExists(*path)); @@ -279,7 +288,7 @@ // TODO(crbug.com/1062288): Assert there are no Wake tasks. // Files must not exist on the file system. - absl::optional<base::FilePath> path = GetProductPath(scope); + absl::optional<base::FilePath> path = GetProductVersionPath(scope); EXPECT_TRUE(path); if (path) EXPECT_FALSE(base::PathExists(*path)); @@ -289,7 +298,7 @@ // TODO(crbug.com/1062288): Assert that COM interfaces point to this version. // Files must exist on the file system. - absl::optional<base::FilePath> path = GetProductPath(scope); + absl::optional<base::FilePath> path = GetProductVersionPath(scope); EXPECT_TRUE(path); if (path) EXPECT_TRUE(base::PathExists(*path));
diff --git a/chrome/updater/test/service/win/updater_test_service.py b/chrome/updater/test/service/win/updater_test_service.py index 15f5bc78..866a754 100644 --- a/chrome/updater/test/service/win/updater_test_service.py +++ b/chrome/updater/test/service/win/updater_test_service.py
@@ -19,7 +19,7 @@ _XML_RPC_SERVER_PORT = 9090 -class UpdaterTestRequestHanlder(): +class UpdaterTestRPCHandler(): # TODO(crbug.com/1233612): Replace this placeholder function with real ones to # serve test requests. Also consider to move this class into a separate @@ -28,13 +28,34 @@ return message +class UpdaterTestRequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHandler): + + def log_message(self, format, *args): + # Overrides base class's implementation which writes the messages to + # sys.stderr. + # When XML RPC server runs within the service, sys.stderr is None. This + # crashes the server and aborts connection. Workaround this issue by using + # python logging. + logging.error(format, *args) + + class UpdaterTestXmlRpcServer(SimpleXMLRPCServer.SimpleXMLRPCServer): """Customized XML-RPC server for updater tests.""" + def __init__(self): + # Can't use super() here because the Python 2.4-2.7 implementation of + # SocketServer (from which SimpleXMLRPCServer extends) uses the old style of + # class definition (not inheriting from 'object'). super() doesn't work in + # that case. + SimpleXMLRPCServer.SimpleXMLRPCServer.__init__( + self, ('localhost', _XML_RPC_SERVER_PORT), + requestHandler=UpdaterTestRequestHandler, + allow_none=True) + def run(self): """xml-rpc server main loop.""" self.register_introspection_functions() - self.register_instance(UpdaterTestRequestHanlder()) + self.register_instance(UpdaterTestRPCHandler()) self.serve_forever() @@ -63,8 +84,7 @@ servicemanager.PYS_SERVICE_STARTED, (self._svc_name_, '')) self.ReportServiceStatus(win32service.SERVICE_RUNNING) - self._xmlrpc_server = UpdaterTestXmlRpcServer( - ('localhost', _XML_RPC_SERVER_PORT)) + self._xmlrpc_server = UpdaterTestXmlRpcServer() self._xmlrpc_server.run() servicemanager.LogInfoMsg(self._svc_name_ + ' - Ended') except pywintypes.error as err:
diff --git a/chrome/updater/test/test_app/test_app.cc b/chrome/updater/test/test_app/test_app.cc index e6f7de9..ab78d33 100644 --- a/chrome/updater/test/test_app/test_app.cc +++ b/chrome/updater/test/test_app/test_app.cc
@@ -21,6 +21,7 @@ #include "base/task/thread_pool/thread_pool_instance.h" #include "base/threading/thread_restrictions.h" #include "chrome/updater/app/app.h" +#include "chrome/updater/constants.h" #include "chrome/updater/test/test_app/constants.h" #include "chrome/updater/test/test_app/update_client.h" #include "chrome/updater/updater_scope.h" @@ -35,9 +36,9 @@ ~TestApp() override = default; void FirstTaskRun() override; - void DoForegroundUpdate(); + void DoForegroundUpdate(UpdaterScope updater_scope); void HandleCommandLine(); - void Register(); + void Register(UpdaterScope updater_scope); void SetUpdateStatus(UpdateStatus status, int progress, bool rollback, @@ -81,13 +82,14 @@ } } -void TestApp::Register() { - UpdateClient::Create()->Register(base::BindOnce(&TestApp::Shutdown, this)); +void TestApp::Register(UpdaterScope updater_scope) { + UpdateClient::Create(updater_scope) + ->Register(base::BindOnce(&TestApp::Shutdown, this)); } -void TestApp::DoForegroundUpdate() { - UpdateClient::Create()->CheckForUpdate( - base::BindRepeating(&TestApp::SetUpdateStatus, this)); +void TestApp::DoForegroundUpdate(UpdaterScope updater_scope) { + UpdateClient::Create(updater_scope) + ->CheckForUpdate(base::BindRepeating(&TestApp::SetUpdateStatus, this)); } void TestApp::HandleCommandLine() { @@ -97,15 +99,18 @@ base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}; const base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); + const UpdaterScope updater_scope = command_line->HasSwitch(kSystemSwitch) + ? UpdaterScope::kSystem + : UpdaterScope::kUser; if (command_line->HasSwitch(kInstallUpdaterSwitch)) { base::ThreadPool::PostTaskAndReplyWithResult( FROM_HERE, kTaskTraitsBlockWithSyncPrimitives, base::BindOnce(&InstallUpdater), base::BindOnce(&TestApp::Shutdown, this)); } else if (command_line->HasSwitch(kRegisterToUpdaterSwitch)) { - Register(); + Register(updater_scope); } else if (command_line->HasSwitch(kForegroundUpdateSwitch)) { - DoForegroundUpdate(); + DoForegroundUpdate(updater_scope); } else if (command_line->HasSwitch(kRegisterUpdaterSwitch)) { base::ThreadPool::PostTaskAndReplyWithResult( FROM_HERE, kTaskTraitsBlockWithSyncPrimitives, @@ -119,7 +124,7 @@ } std::move(register_func).Run(); }, - base::BindOnce(&TestApp::Register, this), + base::BindOnce(&TestApp::Register, this, updater_scope), base::BindOnce(&TestApp::Shutdown, this))); } else { Shutdown(0);
diff --git a/chrome/updater/test/test_app/update_client.cc b/chrome/updater/test/test_app/update_client.cc index 0626d35..3008326 100644 --- a/chrome/updater/test/test_app/update_client.cc +++ b/chrome/updater/test/test_app/update_client.cc
@@ -16,12 +16,14 @@ #include "base/task/post_task.h" #include "base/threading/sequenced_task_runner_handle.h" #include "chrome/updater/test/test_app/test_app_version.h" +#include "chrome/updater/updater_scope.h" #include "chrome/updater/util.h" namespace updater { -UpdateClient::UpdateClient() - : callback_task_runner_(base::SequencedTaskRunnerHandle::Get()) {} +UpdateClient::UpdateClient(UpdaterScope updater_scope) + : updater_scope_(updater_scope), + callback_task_runner_(base::SequencedTaskRunnerHandle::Get()) {} UpdateClient::~UpdateClient() = default;
diff --git a/chrome/updater/test/test_app/update_client.h b/chrome/updater/test/test_app/update_client.h index ce982bad..feab524 100644 --- a/chrome/updater/test/test_app/update_client.h +++ b/chrome/updater/test/test_app/update_client.h
@@ -13,6 +13,7 @@ #include "base/sequence_checker.h" #include "chrome/updater/test/test_app/constants.h" #include "chrome/updater/update_service.h" +#include "chrome/updater/updater_scope.h" namespace base { class SequencedTaskRunner; @@ -30,9 +31,9 @@ int64_t update_size, const std::u16string& message)>; - static scoped_refptr<UpdateClient> Create(); + static scoped_refptr<UpdateClient> Create(UpdaterScope updater_scope); - UpdateClient(); + explicit UpdateClient(UpdaterScope updater_scope); void Register(base::OnceCallback<void(int)> callback); void CheckForUpdate(StatusCallback callback); @@ -49,6 +50,8 @@ return callback_task_runner_; } + UpdaterScope updater_scope() const { return updater_scope_; } + private: bool CanCheckForUpdate(); virtual void BeginRegister(const std::string& brand_code, @@ -59,8 +62,8 @@ UpdateService::Callback callback) = 0; virtual bool CanDialIPC() = 0; + const UpdaterScope updater_scope_; StatusCallback callback_; - scoped_refptr<base::SequencedTaskRunner> callback_task_runner_; };
diff --git a/chrome/updater/test/test_app/update_client_mac.h b/chrome/updater/test/test_app/update_client_mac.h index 882ca500..d087864 100644 --- a/chrome/updater/test/test_app/update_client_mac.h +++ b/chrome/updater/test/test_app/update_client_mac.h
@@ -5,10 +5,12 @@ #ifndef CHROME_UPDATER_TEST_TEST_APP_UPDATE_CLIENT_MAC_H_ #define CHROME_UPDATER_TEST_TEST_APP_UPDATE_CLIENT_MAC_H_ +#include "chrome/updater/test/test_app/update_client.h" + #include <string> #include "base/mac/scoped_nsobject.h" -#include "chrome/updater/test/test_app/update_client.h" +#include "chrome/updater/updater_scope.h" @class CRUUpdateClientOnDemandImpl; @@ -16,7 +18,7 @@ class UpdateClientMac : public UpdateClient { public: - UpdateClientMac(); + explicit UpdateClientMac(UpdaterScope updater_scope); private: ~UpdateClientMac() override;
diff --git a/chrome/updater/test/test_app/update_client_mac.mm b/chrome/updater/test/test_app/update_client_mac.mm index 7bb53a7..56ae39a 100644 --- a/chrome/updater/test/test_app/update_client_mac.mm +++ b/chrome/updater/test/test_app/update_client_mac.mm
@@ -22,6 +22,7 @@ #import "chrome/updater/mac/xpc_service_names.h" #include "chrome/updater/test/test_app/constants.h" #include "chrome/updater/test/test_app/test_app_version.h" +#include "chrome/updater/updater_scope.h" @interface CRUUpdateClientOnDemandImpl : NSObject <CRUUpdateServicing> { base::scoped_nsobject<NSXPCConnection> _xpcConnection; @@ -124,11 +125,12 @@ namespace updater { -UpdateClientMac::UpdateClientMac() { +UpdateClientMac::UpdateClientMac(UpdaterScope updater_scope) + : UpdateClient(updater_scope) { client_.reset([[CRUUpdateClientOnDemandImpl alloc] init]); } -UpdateClientMac::~UpdateClientMac() {} +UpdateClientMac::~UpdateClientMac() = default; bool UpdateClientMac::CanDialIPC() { return client_.get().CanDialIPC; @@ -182,8 +184,8 @@ reply:reply]; } -scoped_refptr<UpdateClient> UpdateClient::Create() { - return base::MakeRefCounted<UpdateClientMac>(); +scoped_refptr<UpdateClient> UpdateClient::Create(UpdaterScope updater_scope) { + return base::MakeRefCounted<UpdateClientMac>(updater_scope); } } // namespace updater
diff --git a/chrome/updater/test/test_app/update_client_win.cc b/chrome/updater/test/test_app/update_client_win.cc index cefc896..f86a0215 100644 --- a/chrome/updater/test/test_app/update_client_win.cc +++ b/chrome/updater/test/test_app/update_client_win.cc
@@ -27,16 +27,19 @@ #include "chrome/updater/app/server/win/updater_idl.h" #include "chrome/updater/test/test_app/constants.h" #include "chrome/updater/update_service.h" +#include "chrome/updater/updater_scope.h" namespace updater { namespace { // TODO(crbug.com/1096654): Enable for system tests. -HRESULT CreateUpdaterInterface(Microsoft::WRL::ComPtr<IUpdater>* updater) { +HRESULT CreateUpdaterInterface(UpdaterScope updater_scope, + Microsoft::WRL::ComPtr<IUpdater>* updater) { Microsoft::WRL::ComPtr<IUnknown> server; - HRESULT hr = ::CoCreateInstance(__uuidof(UpdaterUserClass), nullptr, - CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&server)); - + HRESULT hr = ::CoCreateInstance( + updater_scope == UpdaterScope::kSystem ? __uuidof(UpdaterSystemClass) + : __uuidof(UpdaterUserClass), + nullptr, CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&server)); if (FAILED(hr)) { LOG(ERROR) << "Failed to instantiate the update server. " << std::hex << hr; return hr; @@ -157,8 +160,9 @@ } // namespace -UpdateClientWin::UpdateClientWin() - : com_task_runner_(base::ThreadPool::CreateCOMSTATaskRunner( +UpdateClientWin::UpdateClientWin(UpdaterScope updater_scope) + : UpdateClient(updater_scope), + com_task_runner_(base::ThreadPool::CreateCOMSTATaskRunner( {base::TaskPriority::BEST_EFFORT, base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})) {} @@ -186,7 +190,7 @@ DCHECK(com_task_runner_->BelongsToCurrentThread()); Microsoft::WRL::ComPtr<IUpdater> updater; - HRESULT hr = CreateUpdaterInterface(&updater); + HRESULT hr = CreateUpdaterInterface(updater_scope(), &updater); if (FAILED(hr)) { LOG(ERROR) << "Failed to create IUpdater:" << std::hex << hr; std::move(callback).Run(UpdateService::Result::kServiceFailed); @@ -230,7 +234,7 @@ DCHECK(com_task_runner_->BelongsToCurrentThread()); if (!updater_) { - HRESULT hr = CreateUpdaterInterface(&updater_); + HRESULT hr = CreateUpdaterInterface(updater_scope(), &updater_); if (FAILED(hr)) { return; } @@ -249,8 +253,8 @@ } } -scoped_refptr<UpdateClient> UpdateClient::Create() { - return base::MakeRefCounted<UpdateClientWin>(); +scoped_refptr<UpdateClient> UpdateClient::Create(UpdaterScope updater_scope) { + return base::MakeRefCounted<UpdateClientWin>(updater_scope); } } // namespace updater
diff --git a/chrome/updater/test/test_app/update_client_win.h b/chrome/updater/test/test_app/update_client_win.h index 25e16c5..465a8f25 100644 --- a/chrome/updater/test/test_app/update_client_win.h +++ b/chrome/updater/test/test_app/update_client_win.h
@@ -10,7 +10,12 @@ #include <windows.h> #include <wrl/client.h> -struct IUpdater; +#include <string> + +#include "base/memory/scoped_refptr.h" +#include "chrome/updater/app/server/win/updater_idl.h" +#include "chrome/updater/update_service.h" +#include "chrome/updater/updater_scope.h" namespace base { class SingleThreadTaskRunner; @@ -20,7 +25,7 @@ class UpdateClientWin : public UpdateClient { public: - UpdateClientWin(); + explicit UpdateClientWin(UpdaterScope updater_scope); private: ~UpdateClientWin() override;
diff --git a/chrome/updater/updater.cc b/chrome/updater/updater.cc index 651b302..4701e03 100644 --- a/chrome/updater/updater.cc +++ b/chrome/updater/updater.cc
@@ -12,6 +12,7 @@ #include "base/files/file_path.h" #include "base/logging.h" #include "base/message_loop/message_pump_type.h" +#include "base/process/memory.h" #include "base/task/single_thread_task_executor.h" #include "base/threading/platform_thread.h" #include "build/build_config.h" @@ -31,6 +32,7 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #if defined(OS_WIN) +#include "base/win/process_startup_helper.h" #include "chrome/updater/app/server/win/server.h" #include "chrome/updater/app/server/win/service_main.h" #include "chrome/updater/win/win_util.h" @@ -117,12 +119,18 @@ StartCrashReporter(updater_scope, kUpdaterVersion); InitializeCrashReporting(updater_scope); - base::SingleThreadTaskExecutor main_task_executor(base::MessagePumpType::UI); + // Make the process more resilient to memory allocation issues. + base::EnableTerminationOnHeapCorruption(); + base::EnableTerminationOnOutOfMemory(); #if defined(OS_WIN) + base::win::RegisterInvalidParamHandler(); + VLOG(1) << GetUACState(); #endif + base::SingleThreadTaskExecutor main_task_executor(base::MessagePumpType::UI); + if (command_line->HasSwitch(kCrashMeSwitch)) { // Records a backtrace in the log, crashes the program, saves a crash dump, // and reports the crash.
diff --git a/chrome/updater/win/setup/uninstall.cc b/chrome/updater/win/setup/uninstall.cc index c4f31dd..79d181d 100644 --- a/chrome/updater/win/setup/uninstall.cc +++ b/chrome/updater/win/setup/uninstall.cc
@@ -78,13 +78,18 @@ } } -int RunUninstallScript(bool uninstall_all) { +int RunUninstallScript(UpdaterScope scope, bool uninstall_all) { const absl::optional<base::FilePath> versioned_dir = - GetVersionedDirectory(UpdaterScope()); + GetVersionedDirectory(scope); if (!versioned_dir) { LOG(ERROR) << "GetVersionedDirectory failed."; return -1; } + const absl::optional<base::FilePath> base_dir = GetBaseDirectory(scope); + if (scope == UpdaterScope::kSystem && !base_dir) { + LOG(ERROR) << "GetBaseDirectory failed."; + return -1; + } wchar_t cmd_path[MAX_PATH] = {0}; DWORD size = ExpandEnvironmentStrings(L"%SystemRoot%\\System32\\cmd.exe", @@ -96,9 +101,10 @@ versioned_dir->AppendASCII(kUninstallScript); std::wstring cmdline = cmd_path; - base::StringAppendF(&cmdline, L" /Q /C \"%ls\" %ls", - script_path.value().c_str(), - uninstall_all ? L"all" : L"local"); + base::StringAppendF( + &cmdline, L" /Q /C \"\"%ls\" --dir=\"%ls\"\"", + script_path.value().c_str(), + (uninstall_all ? base_dir : versioned_dir)->value().c_str()); base::LaunchOptions options; options.start_hidden = true; @@ -146,7 +152,7 @@ DeleteComService(); DeleteComServer(scope, key); - return RunUninstallScript(true); + return RunUninstallScript(scope, true); } // Uninstalls this version of the updater, without uninstalling any other @@ -162,7 +168,7 @@ // TODO(crbug.com/1175095): Remove the UpdateServiceInternal server as well. // TODO(crbug.com/1175095): Remove COM interfaces. - return RunUninstallScript(false); + return RunUninstallScript(scope, false); } } // namespace updater
diff --git a/chrome/updater/win/setup/uninstall.cmd b/chrome/updater/win/setup/uninstall.cmd index 2f236e5..72bf8924 100644 --- a/chrome/updater/win/setup/uninstall.cmd +++ b/chrome/updater/win/setup/uninstall.cmd
@@ -1,17 +1,28 @@ -rem Deletes the script's grandparent directory if -rem \AppData\Local\@COMPANY_SHORTNAME@\@PRODUCT_FULLNAME@\ is anywhere in the -rem directory path. Sleeps 3 seconds and tries 3 times to delete the -rem directory. @echo off -set Directory=%~dp0 -IF "%1%" EQU "all" ( - FOR %%a IN ("%Directory:~0,-1%") DO set Directory=%%~dpa + +rem Deletes recursively the directory specified by the `--dir` command line +rem argument of the script. The directory must be an updater install path. + +echo %1 %2 +if not "%1"=="--dir" ( + echo "Invalid switch." + exit 1 ) -@echo %Directory% | FindStr /R \\AppData\\Local\\@COMPANY_SHORTNAME@\\@PRODUCT_FULLNAME@\\ > nul -IF %ERRORLEVEL% NEQ 0 exit 1 -@echo Deleting "%Directory%"... + +set Directory=%2 + +rem Validate the path is an updater path. +@echo %Directory% | FindStr /L \@COMPANY_SHORTNAME@\@PRODUCT_FULLNAME@ > nul +if %ERRORLEVEL% NEQ 0 ( + echo "Invalid argument." + exit 2 +) + for /L %%G IN (1,1,3) do ( - rmdir "%Directory%" /s /q > nul - if not exist "%Directory%" exit 0 + rmdir %Directory% /s /q > nul + if not exist %Directory% exit 0 ping -n 3 127.0.0.1 > nul ) + +exit 3 +
diff --git a/chromecast/browser/cast_web_contents_browsertest.cc b/chromecast/browser/cast_web_contents_browsertest.cc index e3bf83e..104e0a2 100644 --- a/chromecast/browser/cast_web_contents_browsertest.cc +++ b/chromecast/browser/cast_web_contents_browsertest.cc
@@ -1159,18 +1159,15 @@ // RenderFrame::GetRemoteInterfaces(). Since poking renderer state in browser // tests is challenging, we simply simulate the resulting WebContentsObbserver // calls here instead and verify end-to-end connection for each interface. - content::RenderFrameHost* main_frame = - cast_web_contents_->web_contents()->GetMainFrame(); mojo::Remote<mojom::TestAdder> adder; - mojo::ScopedMessagePipeHandle adder_receiver_pipe = - adder.BindNewPipeAndPassReceiver().PassPipe(); - cast_web_contents_->OnInterfaceRequestFromFrame( - main_frame, mojom::TestAdder::Name_, &adder_receiver_pipe); + mojo::GenericPendingReceiver adder_receiver( + adder.BindNewPipeAndPassReceiver()); + EXPECT_TRUE(cast_web_contents_->TryBindReceiver(adder_receiver)); + mojo::Remote<mojom::TestDoubler> doubler; - mojo::ScopedMessagePipeHandle doubler_receiver_pipe = - doubler.BindNewPipeAndPassReceiver().PassPipe(); - cast_web_contents_->OnInterfaceRequestFromFrame( - main_frame, mojom::TestDoubler::Name_, &doubler_receiver_pipe); + mojo::GenericPendingReceiver doubler_receiver( + doubler.BindNewPipeAndPassReceiver()); + EXPECT_TRUE(cast_web_contents_->TryBindReceiver(doubler_receiver)); base::RunLoop add_loop; adder->Add(37, 5, base::BindLambdaForTesting([&](int32_t result) {
diff --git a/chromecast/browser/cast_web_contents_impl.cc b/chromecast/browser/cast_web_contents_impl.cc index 9b00b3d..09cf1ec 100644 --- a/chromecast/browser/cast_web_contents_impl.cc +++ b/chromecast/browser/cast_web_contents_impl.cc
@@ -627,24 +627,6 @@ return true; } -void CastWebContentsImpl::OnInterfaceRequestFromFrame( - content::RenderFrameHost* /* render_frame_host */, - const std::string& interface_name, - mojo::ScopedMessagePipeHandle* interface_pipe) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - if (!can_bind_interfaces()) { - return; - } - - mojo::GenericPendingReceiver receiver(interface_name, - std::move(*interface_pipe)); - if (!TryBindReceiver(receiver)) { - // If binding was unsuccessful, give the caller its pipe back. - *interface_pipe = receiver.PassPipe(); - } -} - void CastWebContentsImpl::RenderProcessGone(base::TerminationStatus status) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); LOG(INFO) << "Render process for main frame exited unexpectedly.";
diff --git a/chromecast/browser/cast_web_contents_impl.h b/chromecast/browser/cast_web_contents_impl.h index a182d567..47ede81a 100644 --- a/chromecast/browser/cast_web_contents_impl.h +++ b/chromecast/browser/cast_web_contents_impl.h
@@ -106,10 +106,6 @@ // content::WebContentsObserver implementation: void RenderFrameCreated(content::RenderFrameHost* render_frame_host) override; - void OnInterfaceRequestFromFrame( - content::RenderFrameHost* /* render_frame_host */, - const std::string& interface_name, - mojo::ScopedMessagePipeHandle* interface_pipe) override; void RenderProcessGone(base::TerminationStatus status) override; void DidStartNavigation( content::NavigationHandle* navigation_handle) override;
diff --git a/chromecast/cast_core/BUILD.gn b/chromecast/cast_core/BUILD.gn index 8139b38..8a88250 100644 --- a/chromecast/cast_core/BUILD.gn +++ b/chromecast/cast_core/BUILD.gn
@@ -100,6 +100,41 @@ ] } +cast_source_set("grpc_webui") { + sources = [ + "grpc_resource_data_source.cc", + "grpc_resource_data_source.h", + "grpc_webui_controller.cc", + "grpc_webui_controller.h", + "grpc_webui_controller_factory.cc", + "grpc_webui_controller_factory.h", + ] + + deps = [ + "//base", + "//chromecast:chromecast_buildflags", + "//chromecast/base", + "//chromecast/base:chromecast_switches", + "//chromecast/base:default_create_sys_info", + "//chromecast/browser:browser_base", + "//chromecast/browser:public", + "//third_party/blink/public/common:headers", + "//third_party/grpc:grpc++", + "//third_party/openscreen/src/cast/cast_core/api:core_application_service_proto", + ] + + if (enable_chromecast_extensions) { + sources += [ + "grpc_webui_controller_extension.cc", + "grpc_webui_controller_extension.h", + ] + deps += [ + "//components/guest_view/browser", + "//extensions/browser", + ] + } +} + if (is_linux) { cast_source_set("core_runtime_bindings") { sources = [ @@ -135,6 +170,7 @@ public_deps = [ ":grpc_impl", ":grpc_support", + ":grpc_webui", ":metrics_recorder", "//base", "//chromecast/browser:public", @@ -274,18 +310,22 @@ deps += [ "//chromecast/internal/cast_core/services" ] } } +} - cast_executable("core_runtime_simple") { - sources = [ "cast_runtime_main.cc" ] +cast_executable("core_runtime_simple") { + sources = [ "cast_runtime_main.cc" ] - deps = [ - ":cast_core", - "//chromecast/app", - "//chromecast/base:default_create_sys_info", - "//chromecast/browser:simple_main_parts", - "//chromecast/utility:simple_client", - "//content/public/app", - ] + deps = [ + ":cast_core", + "//chromecast/app", + "//chromecast/base:default_create_sys_info", + "//chromecast/browser:simple_main_parts", + "//chromecast/utility:simple_client", + "//content/public/app", + ] + + if (!enable_cast_media_runtime) { + deps += [ "//chromecast/browser:simple_client" ] } } @@ -321,6 +361,7 @@ group("cast_core") { deps = [ ":browser", + ":grpc_webui", ":message_port", ":metrics_recorder", ":renderer", @@ -342,18 +383,23 @@ test("cast_cast_core_unittests") { sources = [ "cast_runtime_histogram_flattener_unittest.cc", + "grpc_resource_data_source_unittest.cc", "streaming_receiver_session_client_unittest.cc", "url_rewrite_rules_adapter_unittests.cc", ] deps = [ + ":browser", ":cast_core_test_utils", + ":grpc_webui", ":metrics_recorder", ":streaming_receiver_session_client", ":url_rewrite", "//base", "//base/test:test_support", "//chromecast/base/metrics", + "//chromecast/browser:simple_client", + "//chromecast/browser:simple_main_parts", "//chromecast/shared:platform_info_serializer", "//components/cast_streaming/browser", "//components/cast_streaming/public/mojom", @@ -361,6 +407,9 @@ "//mojo/public/cpp/bindings", "//testing/gmock", "//testing/gtest", + "//third_party/grpc:grpc++", + "//third_party/inspector_protocol:crdtp", "//third_party/metrics_proto", + "//third_party/openscreen/src/cast/cast_core/api:core_application_service_proto", ] }
diff --git a/chromecast/cast_core/DEPS b/chromecast/cast_core/DEPS index 074a981f..147bca2 100644 --- a/chromecast/cast_core/DEPS +++ b/chromecast/cast_core/DEPS
@@ -12,10 +12,13 @@ "+chromecast/shared", "+components/cast", "+components/cast_streaming", + "+components/guest_view", "+content/public", + "+extensions/browser", "+media/base", "+mojo/core/test", "+mojo/public", + "+net/base", "+third_party/blink/public", "+third_party/grpc", "+third_party/metrics_proto",
diff --git a/chromecast/cast_core/demo_platform_service.cc b/chromecast/cast_core/demo_platform_service.cc index 676a4a0..12b36249 100644 --- a/chromecast/cast_core/demo_platform_service.cc +++ b/chromecast/cast_core/demo_platform_service.cc
@@ -23,8 +23,10 @@ namespace { -constexpr const char* kCastCoreServiceAddress = "unix:/tmp/cast-core-service"; -constexpr const char* kPlatformServiceAddress = "unix:/tmp/platform-service"; +constexpr const char* kCastCoreServiceAddress = + "unix:/tmp/cast/grpc/core-service"; +constexpr const char* kPlatformServiceAddress = + "unix:/tmp/cast/grpc/platform-service"; } // namespace
diff --git a/chromecast/cast_core/grpc_resource_data_source.cc b/chromecast/cast_core/grpc_resource_data_source.cc new file mode 100644 index 0000000..ed13a0a --- /dev/null +++ b/chromecast/cast_core/grpc_resource_data_source.cc
@@ -0,0 +1,199 @@ +// 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 "chromecast/cast_core/grpc_resource_data_source.h" + +#include "base/bind.h" +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/memory/ref_counted_memory.h" +#include "base/strings/string_util.h" +#include "base/task/task_traits.h" +#include "base/task/thread_pool.h" +#include "base/threading/thread_task_runner_handle.h" +#include "chromecast/base/cast_constants.h" +#include "net/base/mime_util.h" + +namespace chromecast { + +namespace { + +// File extension types +constexpr const char kExtensionTypeCss[] = ".css"; +constexpr const char kExtensionTypeJs[] = ".js"; +constexpr const char kExtensionTypeJson[] = ".json"; +constexpr const char kExtensionTypePdf[] = ".pdf"; +constexpr const char kExtensionTypeSvg[] = ".svg"; +constexpr const char kExtensionTypePng[] = ".png"; +constexpr const char kExtensionTypeJpeg[] = ".jpeg"; +constexpr const char kExtensionTypeHtml[] = ".html"; + +// Mime types of the resource requested by the Cast app's WebUI. +constexpr const char kMimeTypeHtml[] = "text/html"; +constexpr const char kMimeTypeCss[] = "text/css"; +constexpr const char kMimeTypeJavascript[] = "application/javascript"; +constexpr const char kMimeTypeJson[] = "application/json"; +constexpr const char kMimeTypePdf[] = "application/pdf"; +constexpr const char kMimeTypeSvgXml[] = "image/svg+xml"; +constexpr const char kMimeTypeJpeg[] = "image/jpeg"; +constexpr const char kMimeTypePng[] = "image/png"; +constexpr const char kAllowedOriginPrefix[] = "chrome://"; + +} // namespace + +GrpcResourceDataSource::GrpcResourceDataSource( + const std::string host, + bool for_webui, + cast::v2::CoreApplicationService::Stub core_app_service_stub) + : task_runner_(base::ThreadPool::CreateSequencedTaskRunner( + {base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})), + host_(host), + for_webui_(for_webui), + core_app_service_stub_(std::move(core_app_service_stub)) { + DCHECK(!host.empty()); +} + +GrpcResourceDataSource::~GrpcResourceDataSource() = default; + +std::string GrpcResourceDataSource::GetSource() { + return host_; +} + +void GrpcResourceDataSource::StartDataRequest( + const GURL& url, + const content::WebContents::Getter& wc_getter, + content::URLDataSource::GotDataCallback callback) { + LOG(INFO) << "Starting Data request for " << url; + std::string path = content::URLDataSource::URLToRequestPath(url); + std::string contents; + + // TODO(b/195894244): Replace this with gRPC framework from + // chromecast/cast_core. + grpc::Status status; + cast::v2::GetWebUIResourceResponse response; + { + grpc::ClientContext context; + cast::v2::GetWebUIResourceRequest request; + request.set_resource_id(path); + status = + core_app_service_stub_.GetWebUIResource(&context, request, &response); + contents = response.resource_path(); + } + + if (!status.ok()) { + LOG(ERROR) << "Failed to receive resource path response"; + std::move(callback).Run(nullptr); + return; + } + + task_runner_->PostTask( + FROM_HERE, base::BindOnce(&GrpcResourceDataSource::ReadResourceFile, + weak_ptr_factory_.GetWeakPtr(), contents, + std::move(callback))); +} + +void GrpcResourceDataSource::ReadResourceFile( + base::StringPiece resource_file_path, + content::URLDataSource::GotDataCallback callback) { + base::FilePath path(resource_file_path); + if (!base::PathExists(path)) { + LOG(ERROR) << "Resource " << resource_file_path << " does not exist"; + std::move(callback).Run(nullptr); + return; + } + + std::string text; + base::ReadFileToString(base::FilePath(resource_file_path), &text); + std::move(callback).Run(base::RefCountedString::TakeString(&text)); +} + +// The Path can either be a filename or a remote url string starting with "?". +// Examples - "?remote_url=https://google.com", "fonts.css". +std::string GrpcResourceDataSource::GetMimeType(const std::string& path) { + if (!for_webui_) { + std::string mime_type; + base::FilePath::StringType file_ext = + base::FilePath().AppendASCII(path).Extension(); + if (!file_ext.empty()) + net::GetWellKnownMimeTypeFromExtension(file_ext.substr(1), &mime_type); + return mime_type; + } + + // If the path starts with ? or if the path does not contain an extension, + // return default MimeType. + auto extension_index = path.find_last_of("."); + if (path.find("?") != std::string::npos || + extension_index == std::string::npos) { + return kMimeTypeHtml; + } + + base::FilePath file_path(path); + auto extension = file_path.Extension(); + if (extension.empty()) { + return kMimeTypeHtml; + } + + if (base::EqualsCaseInsensitiveASCII(extension, kExtensionTypeCss)) { + return kMimeTypeCss; + } + if (base::EqualsCaseInsensitiveASCII(extension, kExtensionTypeJs)) { + return kMimeTypeJavascript; + } + if (base::EqualsCaseInsensitiveASCII(extension, kExtensionTypeJson)) { + return kMimeTypeJson; + } + if (base::EqualsCaseInsensitiveASCII(extension, kExtensionTypePdf)) { + return kMimeTypePdf; + } + if (base::EqualsCaseInsensitiveASCII(extension, kExtensionTypeSvg)) { + return kMimeTypeSvgXml; + } + if (base::EqualsCaseInsensitiveASCII(extension, kExtensionTypeJpeg)) { + return kMimeTypeJpeg; + } + if (base::EqualsCaseInsensitiveASCII(extension, kExtensionTypePng)) { + return kMimeTypePng; + } + if (base::EqualsCaseInsensitiveASCII(extension, kExtensionTypeHtml)) { + return kMimeTypeHtml; + } + + NOTREACHED() << "Unknown Mime type of file " << path; + return ""; +} + +bool GrpcResourceDataSource::ShouldServiceRequest( + const GURL& url, + content::BrowserContext* browser_context, + int render_process_id) { + if (url.SchemeIs(kChromeResourceScheme)) { + return true; + } + return URLDataSource::ShouldServiceRequest(url, browser_context, + render_process_id); +} + +std::string GrpcResourceDataSource::GetAccessControlAllowOriginForOrigin( + const std::string& origin) { + if (!base::StartsWith(origin, kAllowedOriginPrefix, + base::CompareCase::SENSITIVE)) { + return ""; + } + return origin; +} + +void GrpcResourceDataSource::OverrideContentSecurityPolicyChildSrc( + const std::string& data) { + frame_src_ = data; +} + +void GrpcResourceDataSource::DisableDenyXFrameOptions() { + deny_xframe_options_ = false; +} + +bool GrpcResourceDataSource::ShouldDenyXFrameOptions() { + return deny_xframe_options_; +} + +} // namespace chromecast
diff --git a/chromecast/cast_core/grpc_resource_data_source.h b/chromecast/cast_core/grpc_resource_data_source.h new file mode 100644 index 0000000..0177183 --- /dev/null +++ b/chromecast/cast_core/grpc_resource_data_source.h
@@ -0,0 +1,73 @@ +// 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 CHROMECAST_CAST_CORE_GRPC_RESOURCE_DATA_SOURCE_H_ +#define CHROMECAST_CAST_CORE_GRPC_RESOURCE_DATA_SOURCE_H_ + +#include "base/macros.h" +#include "base/sequenced_task_runner.h" +#include "content/public/browser/url_data_source.h" +#include "third_party/abseil-cpp/absl/types/optional.h" +#include "third_party/openscreen/src/cast/cast_core/api/v2/core_application_service.grpc.pb.h" + +namespace chromecast { + +// This class is responsible for making data requests for resources required by +// Cast WebUI. This implementation uses gRPC for requesting resources from +// CastCore. +class GrpcResourceDataSource : public content::URLDataSource { + public: + GrpcResourceDataSource( + const std::string host, + bool for_webui, + cast::v2::CoreApplicationService::Stub core_app_service_stub); + ~GrpcResourceDataSource() override; + + void OverrideContentSecurityPolicyChildSrc(const std::string& data); + void DisableDenyXFrameOptions(); + + private: + friend class GrpcResourceDataSourceTest; + + // content::URLDataSource implementation. + std::string GetSource() override; + + // Starts a gRPC request to fetch resources. + void StartDataRequest( + const GURL& url, + const content::WebContents::Getter& wc_getter, + content::URLDataSource::GotDataCallback callback) override; + std::string GetMimeType(const std::string& path) override; + + // Determines whether the Url request is allowed. + bool ShouldServiceRequest(const GURL& url, + content::BrowserContext* browser_context, + int render_process_id) override; + + // Checks origin of the data request url. + std::string GetAccessControlAllowOriginForOrigin( + const std::string& origin) override; + + bool ShouldDenyXFrameOptions() override; + + void ReadResourceFile(base::StringPiece path, + content::URLDataSource::GotDataCallback callback); + + scoped_refptr<base::SequencedTaskRunner> task_runner_; + const std::string host_; + + // This is set to true when GrpcResourceDataSource is initialized by + // GrpcWebUIController and false otherwise. In practice, for all the + // chrome://home/* urls this is set to true and false for chrome-resource://* + const bool for_webui_; + cast::v2::CoreApplicationService::Stub core_app_service_stub_; + + absl::optional<std::string> frame_src_; + bool deny_xframe_options_ = true; + base::WeakPtrFactory<GrpcResourceDataSource> weak_ptr_factory_{this}; +}; + +} // namespace chromecast + +#endif // CHROMECAST_CAST_CORE_GRPC_RESOURCE_DATA_SOURCE_H_
diff --git a/chromecast/cast_core/grpc_resource_data_source_unittest.cc b/chromecast/cast_core/grpc_resource_data_source_unittest.cc new file mode 100644 index 0000000..eff905c --- /dev/null +++ b/chromecast/cast_core/grpc_resource_data_source_unittest.cc
@@ -0,0 +1,68 @@ +// 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 "chromecast/cast_core/grpc_resource_data_source.h" +#include "base/test/task_environment.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/grpc/src/include/grpcpp/channel.h" +#include "third_party/grpc/src/include/grpcpp/create_channel.h" + +using ::testing::IsEmpty; + +namespace chromecast { + +class GrpcResourceDataSourceTest : public ::testing::Test { + public: + GrpcResourceDataSourceTest() + : grpc_resource_data_source_( + new GrpcResourceDataSource("chrome", true, *stub_.get())) {} + + protected: + std::string GetMimeType(const std::string& path) { + return grpc_resource_data_source_->GetMimeType(path); + } + + std::string GetAccessControlAllowOriginForOrigin(const std::string& origin) { + return grpc_resource_data_source_->GetAccessControlAllowOriginForOrigin( + origin); + } + + base::test::TaskEnvironment task_environment_; + std::string core_application_service_address_ = "fake-address"; + std::unique_ptr<cast::v2::CoreApplicationService::Stub> stub_ = + cast::v2::CoreApplicationService::NewStub( + grpc::CreateChannel(core_application_service_address_, + grpc::InsecureChannelCredentials())); + GrpcResourceDataSource* grpc_resource_data_source_; +}; + +TEST_F(GrpcResourceDataSourceTest, GetMimeTypeEmptyParam) { + EXPECT_EQ(GetMimeType(""), "text/html"); +} + +TEST_F(GrpcResourceDataSourceTest, GetMimeTypeRemoteUrl) { + EXPECT_EQ(GetMimeType("?resource=http://google.com"), "text/html"); +} + +TEST_F(GrpcResourceDataSourceTest, GetMimeTypeNoExtension) { + EXPECT_EQ(GetMimeType("fontscss"), "text/html"); +} + +TEST_F(GrpcResourceDataSourceTest, GetMimeTypeSuccess) { + EXPECT_EQ(GetMimeType("fonts.css"), "text/css"); +} + +TEST_F(GrpcResourceDataSourceTest, + GetAccessControlAllowOriginForOriginAllowedOrigin) { + EXPECT_EQ(GetAccessControlAllowOriginForOrigin("chrome://"), "chrome://"); +} + +TEST_F(GrpcResourceDataSourceTest, + GetAccessControlAllowOriginForOriginDisallowedOrigin) { + EXPECT_THAT(GetAccessControlAllowOriginForOrigin("chrome-resources://"), + IsEmpty()); +} + +} // namespace chromecast
diff --git a/chromecast/cast_core/grpc_webui_controller.cc b/chromecast/cast_core/grpc_webui_controller.cc new file mode 100644 index 0000000..c98bc019 --- /dev/null +++ b/chromecast/cast_core/grpc_webui_controller.cc
@@ -0,0 +1,135 @@ +// 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 "chromecast/cast_core/grpc_webui_controller.h" + +#include "base/command_line.h" +#include "chromecast/base/chromecast_switches.h" +#include "chromecast/browser/webui/cast_webui_message_handler.h" +#include "chromecast/browser/webui/constants.h" +#include "chromecast/cast_core/grpc_resource_data_source.h" +#include "chromecast/chromecast_buildflags.h" +#include "content/public/browser/url_data_source.h" +#include "content/public/browser/web_contents.h" +#include "content/public/browser/web_ui.h" +#include "content/public/common/bindings_policy.h" + +namespace { + +// Javascript callbacks from renderer. +constexpr const char kFuncStartPingNotify[] = "startPingNotify"; +constexpr const char kFuncStopPingNotify[] = "stopPingNotify"; +constexpr const char kFuncSetOobeFinished[] = "setOobeFinished"; +constexpr const char kFuncRecordAction[] = "recordAction"; +constexpr const char kFuncLaunchTutorial[] = "launchTutorial"; +constexpr const char kFuncGetQRCode[] = "getQRCode"; + +// Javascript functions called by callbacks. +constexpr const char kJSPingNotifyCallback[] = + "home_web_ui_.pingNotifyCallback"; +constexpr const char kJSEurekaInfoChangedCallback[] = + "home_web_ui_.eurekaInfoChangedCallback"; + +// ContentSecurityOverride Prefix. +constexpr const char kContentSecurityPolicyOverride[] = + "frame-src https://*.google.com,"; + +} // namespace + +namespace chromecast { + +#if !BUILDFLAG(ENABLE_CHROMECAST_EXTENSIONS) +// static +std::unique_ptr<CastCoreWebUI> CastCoreWebUI::Create( + content::WebUI* webui, + const std::string host, + cast::v2::CoreApplicationService::Stub core_app_service_stub) { + return std::make_unique<CastCoreWebUI>(webui, host, + std::move(core_app_service_stub)); +} +#endif + +GrpcWebUIController::GrpcWebUIController( + content::WebUI* webui, + const std::string host, + cast::v2::CoreApplicationService::Stub core_app_service_stub) + : WebUIController(webui), + web_contents_(webui->GetWebContents()), + browser_context_(web_contents_->GetBrowserContext()) { + DCHECK(web_contents_); + DCHECK(browser_context_); + webui->SetBindings(content::BINDINGS_POLICY_WEB_UI); + auto cast_resources = std::make_unique<GrpcResourceDataSource>( + host, true /* for_webui */, std::move(core_app_service_stub)); + if (host == kCastWebUIHomeHost) { + cast_resources->OverrideContentSecurityPolicyChildSrc( + kContentSecurityPolicyOverride); + cast_resources->DisableDenyXFrameOptions(); + } + + content::URLDataSource::Add(browser_context_, std::move(cast_resources)); + auto message_handler = std::make_unique<CastWebUIMessageHandler>(); + message_handler_ = message_handler.get(); + webui->AddMessageHandler(std::move(message_handler)); + RegisterMessageCallbacks(); +} + +GrpcWebUIController::~GrpcWebUIController() = default; + +content::WebContents* GrpcWebUIController::web_contents() const { + return web_contents_; +} + +content::BrowserContext* GrpcWebUIController::browser_context() const { + return browser_context_; +} + +void GrpcWebUIController::StartPingNotify(const base::ListValue* args) { + CallJavascriptFunction(kJSPingNotifyCallback, {}); +} + +void GrpcWebUIController::StopPingNotify(const base::ListValue* args) { + CallJavascriptFunction(kJSEurekaInfoChangedCallback, {}); +} + +void GrpcWebUIController::SetOobeFinished(const base::ListValue* args) {} + +void GrpcWebUIController::RecordAction(const base::ListValue* args) {} + +void GrpcWebUIController::LaunchTutorial(const base::ListValue* args) {} + +void GrpcWebUIController::GetQRCode(const base::ListValue* args) {} + +void GrpcWebUIController::RegisterMessageCallbacks() { + web_ui()->RegisterMessageCallback( + kFuncStartPingNotify, + base::BindRepeating(&GrpcWebUIController::StartPingNotify, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + kFuncStopPingNotify, + base::BindRepeating(&GrpcWebUIController::StopPingNotify, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + kFuncSetOobeFinished, + base::BindRepeating(&GrpcWebUIController::SetOobeFinished, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + kFuncRecordAction, base::BindRepeating(&GrpcWebUIController::RecordAction, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + kFuncLaunchTutorial, + base::BindRepeating(&GrpcWebUIController::LaunchTutorial, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + kFuncGetQRCode, base::BindRepeating(&GrpcWebUIController::GetQRCode, + base::Unretained(this))); +} + +void GrpcWebUIController::CallJavascriptFunction( + const std::string& function, + std::vector<base::Value> args) { + message_handler_->CallJavascriptFunction(function, std::move(args)); +} + +} // namespace chromecast \ No newline at end of file
diff --git a/chromecast/cast_core/grpc_webui_controller.h b/chromecast/cast_core/grpc_webui_controller.h new file mode 100644 index 0000000..1c55405d --- /dev/null +++ b/chromecast/cast_core/grpc_webui_controller.h
@@ -0,0 +1,77 @@ +// 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 CHROMECAST_CAST_CORE_GRPC_WEBUI_CONTROLLER_H_ +#define CHROMECAST_CAST_CORE_GRPC_WEBUI_CONTROLLER_H_ + +#include <memory> +#include <vector> + +#include "base/containers/flat_map.h" +#include "base/values.h" +#include "content/public/browser/web_ui_controller.h" +#include "third_party/openscreen/src/cast/cast_core/api/v2/core_application_service.grpc.pb.h" + +namespace content { +class BrowserContext; +class WebContents; +class WebUI; +} // namespace content + +namespace chromecast { + +class CastWebUIMessageHandler; + +// WebUI is a part of the Chrome Web Technologies stack used to load UIs for +// chrome: URLs. GrpcWebUIController is used for rendering Backdrop (IdleScreen) +// on devices running CastCore receiver + Web runtime. +class GrpcWebUIController : public content::WebUIController { + public: + // |webui| stays alive for the lifetime of the Backdrop app. Every time the + // screen switches from casting to idle screen (Backdrop), a new WebUI + // instance is created. + GrpcWebUIController( + content::WebUI* webui, + const std::string host, + cast::v2::CoreApplicationService::Stub core_app_service_stub); + ~GrpcWebUIController() override; + + // Creates an instance of GrpcWebUIController. + // Implementation is inside GrpcExtensionWebUI. + static std::unique_ptr<GrpcWebUIController> Create( + content::WebUI* webui, + const std::string host, + cast::v2::CoreApplicationService::Stub core_app_service_stub); + + protected: + content::WebContents* web_contents() const; + content::BrowserContext* browser_context() const; + + private: + content::WebContents* const web_contents_; + content::BrowserContext* const browser_context_; + void AddWebviewSupport(); + void OnWebUIReady(const base::ListValue* args); + void InvokeCallback(const std::string& message, const base::ListValue* args); + void RegisterMessageCallbacks(); + + // Callbacks from javascript + void StartPingNotify(const base::ListValue* args); + void StopPingNotify(const base::ListValue* args); + void SetOobeFinished(const base::ListValue* args); + void RecordAction(const base::ListValue* args); + void LaunchTutorial(const base::ListValue* args); + void GetQRCode(const base::ListValue* args); + void CallJavascriptFunction(const std::string& function, + std::vector<base::Value> args); + + // Pointer to the generic message handler owned by the ctor provided|webui|. + // The message handler is guaranteed to outlive GrpcWebUIController since + // |this| is the first member to be deleted in the Web UI. + CastWebUIMessageHandler* message_handler_; +}; + +} // namespace chromecast + +#endif // CHROMECAST_CAST_CORE_GRPC_WEBUI_CONTROLLER_H_ \ No newline at end of file
diff --git a/chromecast/cast_core/grpc_webui_controller_extension.cc b/chromecast/cast_core/grpc_webui_controller_extension.cc new file mode 100644 index 0000000..e03bb239 --- /dev/null +++ b/chromecast/cast_core/grpc_webui_controller_extension.cc
@@ -0,0 +1,52 @@ +// 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 "chromecast/cast_core/grpc_webui_controller_extension.h" +#include "chromecast/browser/extensions/cast_extension_web_contents_observer.h" +#include "chromecast/browser/webui/constants.h" +#include "components/guest_view/browser/guest_view_manager.h" +#include "extensions/browser/guest_view/extensions_guest_view_manager_delegate.h" + +namespace chromecast { + +// static +std::unique_ptr<GrpcWebUIController> GrpcWebUIController::Create( + content::WebUI* webui, + const std::string host, + cast::v2::CoreApplicationService::Stub core_app_service_stub) { + return std::make_unique<GrpcWebUIControllerExtension>( + webui, host, std::move(core_app_service_stub)); +} + +GrpcWebUIControllerExtension::GrpcWebUIControllerExtension( + content::WebUI* webui, + const std::string host, + cast::v2::CoreApplicationService::Stub core_app_service_stub) + : GrpcWebUIController(webui, host, std::move(core_app_service_stub)) { + if (host == kCastWebUIHomeHost) { + // We need an ExtensionWebContentsObserver to support the <webview> tag, + // so make sure one exists (this is a no-op if one already does). + extensions::CastExtensionWebContentsObserver::CreateForWebContents( + web_contents()); + extensions::ExtensionWebContentsObserver::GetForWebContents(web_contents()) + ->dispatcher() + ->set_delegate(this); + if (!guest_view::GuestViewManager::FromBrowserContext(browser_context())) { + guest_view::GuestViewManager::CreateWithDelegate( + browser_context(), + std::make_unique<extensions::ExtensionsGuestViewManagerDelegate>( + browser_context())); + } + } +} + +GrpcWebUIControllerExtension::~GrpcWebUIControllerExtension() = default; + +content::WebContents* GrpcWebUIControllerExtension::GetAssociatedWebContents() + const { + DCHECK(web_contents()); + return web_contents(); +} + +} // namespace chromecast
diff --git a/chromecast/cast_core/grpc_webui_controller_extension.h b/chromecast/cast_core/grpc_webui_controller_extension.h new file mode 100644 index 0000000..6cb41db --- /dev/null +++ b/chromecast/cast_core/grpc_webui_controller_extension.h
@@ -0,0 +1,36 @@ +// 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 CHROMECAST_CAST_CORE_GRPC_WEBUI_CONTROLLER_EXTENSION_H_ +#define CHROMECAST_CAST_CORE_GRPC_WEBUI_CONTROLLER_EXTENSION_H_ + +#include "chromecast/cast_core/grpc_webui_controller.h" +#include "extensions/browser/extension_function_dispatcher.h" + +namespace content { +class WebContents; +class WebUI; +} // namespace content + +namespace chromecast { + +// This class is used for rendering web contents of a Cast application inside a +// |CastWebView|. For example, a Cast IdleScreen +class GrpcWebUIControllerExtension + : public GrpcWebUIController, + public extensions::ExtensionFunctionDispatcher::Delegate { + public: + GrpcWebUIControllerExtension( + content::WebUI* webui, + const std::string host, + cast::v2::CoreApplicationService::Stub core_app_service_stub); + ~GrpcWebUIControllerExtension() override; + + // extensions::ExtensionFunctionDispatcher::Delegate implementation: + content::WebContents* GetAssociatedWebContents() const override; +}; + +} // namespace chromecast + +#endif // CHROMECAST_CAST_CORE_GRPC_WEBUI_CONTROLLER_EXTENSION_H_
diff --git a/chromecast/cast_core/grpc_webui_controller_factory.cc b/chromecast/cast_core/grpc_webui_controller_factory.cc new file mode 100644 index 0000000..e8f6528 --- /dev/null +++ b/chromecast/cast_core/grpc_webui_controller_factory.cc
@@ -0,0 +1,56 @@ +// 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 "chromecast/cast_core/grpc_webui_controller_factory.h" +#include "base/containers/contains.h" +#include "chromecast/browser/webui/constants.h" +#include "chromecast/cast_core/grpc_resource_data_source.h" +#include "chromecast/cast_core/grpc_webui_controller.h" +#include "content/public/browser/url_data_source.h" +#include "content/public/browser/web_contents.h" +#include "content/public/browser/web_ui_controller_factory.h" +#include "url/gurl.h" + +namespace chromecast { + +GrpcWebUiControllerFactory::GrpcWebUiControllerFactory( + const std::vector<std::string> hosts, + cast::v2::CoreApplicationService::Stub core_app_service_stub) + : hosts_(std::move(hosts)), + core_app_service_stub_(std::move(core_app_service_stub)) {} + +GrpcWebUiControllerFactory::~GrpcWebUiControllerFactory() = default; + +content::WebUI::TypeID GrpcWebUiControllerFactory::GetWebUIType( + content::BrowserContext* browser_context, + const GURL& url) { + if (base::Contains(hosts_, url.host())) { + return const_cast<GrpcWebUiControllerFactory*>(this); + } + return content::WebUI::kNoWebUI; +} + +bool GrpcWebUiControllerFactory::UseWebUIForURL( + content::BrowserContext* browser_context, + const GURL& url) { + return GetWebUIType(browser_context, url) != content::WebUI::kNoWebUI; +} + +std::unique_ptr<content::WebUIController> +GrpcWebUiControllerFactory::CreateWebUIControllerForURL(content::WebUI* web_ui, + const GURL& url) { + static std::once_flag flag; + std::call_once(flag, [this, web_ui] { + auto cast_resources = std::make_unique<GrpcResourceDataSource>( + kCastWebUIResourceHost, false /* for_webui */, + this->core_app_service_stub_); + content::URLDataSource::Add(web_ui->GetWebContents()->GetBrowserContext(), + std::move(cast_resources)); + }); + + return GrpcWebUIController::Create(web_ui, url.host(), + core_app_service_stub_); +} + +} // namespace chromecast \ No newline at end of file
diff --git a/chromecast/cast_core/grpc_webui_controller_factory.h b/chromecast/cast_core/grpc_webui_controller_factory.h new file mode 100644 index 0000000..1ac688b7f --- /dev/null +++ b/chromecast/cast_core/grpc_webui_controller_factory.h
@@ -0,0 +1,54 @@ +// 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 CHROMECAST_CAST_CORE_GRPC_WEBUI_CONTROLLER_FACTORY_H_ +#define CHROMECAST_CAST_CORE_GRPC_WEBUI_CONTROLLER_FACTORY_H_ + +#include "base/macros.h" +#include "content/public/browser/web_ui_controller_factory.h" +#include "third_party/openscreen/src/cast/cast_core/api/v2/core_application_service.grpc.pb.h" + +namespace content { +class BrowserContext; +class WebUI; +class WebUIController; +} // namespace content + +namespace chromecast { + +// WebUIController Factory that uses gRPC for IPC. It determines which WebUIType +// to use based on the URL and creates an instance of GrpcWebUI for Urls of the +// form chrome://*. +class GrpcWebUiControllerFactory : public content::WebUIControllerFactory { + public: + GrpcWebUiControllerFactory( + const std::vector<std::string> hosts, + cast::v2::CoreApplicationService::Stub core_app_service_stub); + GrpcWebUiControllerFactory(const GrpcWebUiControllerFactory&) = delete; + GrpcWebUiControllerFactory& operator=(const GrpcWebUiControllerFactory&) = + delete; + ~GrpcWebUiControllerFactory() override; + + // content::WebUIControllerFactory implementation: + content::WebUI::TypeID GetWebUIType(content::BrowserContext* browser_context, + const GURL& url) override; + + // Gets WebUI type for the url. + bool UseWebUIForURL(content::BrowserContext* browser_context, + const GURL& url) override; + + // For CastCore, this function only creates an instance of GrpcWebUI + // and does not create a WebUIController as it does not exist on core side. + std::unique_ptr<content::WebUIController> CreateWebUIControllerForURL( + content::WebUI* web_ui, + const GURL& url) override; + + private: + const std::vector<std::string> hosts_; + cast::v2::CoreApplicationService::Stub core_app_service_stub_; +}; + +} // namespace chromecast + +#endif // CHROMECAST_CAST_CORE_GRPC_WEBUI_CONTROLLER_FACTORY_H_
diff --git a/chromecast/cast_core/web_runtime_application_service.cc b/chromecast/cast_core/web_runtime_application_service.cc index 2251fdb5..860e660 100644 --- a/chromecast/cast_core/web_runtime_application_service.cc +++ b/chromecast/cast_core/web_runtime_application_service.cc
@@ -7,6 +7,7 @@ #include "chromecast/browser/cast_web_service.h" #include "chromecast/browser/cast_web_view_factory.h" #include "chromecast/cast_core/bindings_manager_web_runtime.h" +#include "chromecast/cast_core/grpc_webui_controller_factory.h" #include "chromecast/cast_core/url_rewrite_rules_adapter.h" #include "content/public/browser/web_contents.h" #include "mojo/public/cpp/bindings/associated_remote.h" @@ -168,6 +169,12 @@ core_app_stub_->GetAll(&context, bindings_request, &bindings_response); } + // Register GrpcWebUI for handling Cast apps with URLs in the form + // chrome*://* that use WebUIs. + std::vector<std::string> hosts = {"home", "error", "cast_resources"}; + content::WebUIControllerFactory::RegisterFactory( + new GrpcWebUiControllerFactory(std::move(hosts), *core_app_stub_.get())); + CastWebView::CreateParams create_params; create_params.delegate = weak_factory_.GetWeakPtr(); create_params.web_contents_delegate = weak_factory_.GetWeakPtr();
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM index a045b3b..5001a837 100644 --- a/chromeos/CHROMEOS_LKGM +++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@ -14148.0.0 \ No newline at end of file +14151.0.0 \ No newline at end of file
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_af.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_af.xtb index 3239585c..bcaef29f 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_af.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_af.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3838931309141338733">Skandeer strepieskode</translation> <translation id="3892148308691398805">Kopieer teks</translation> -<translation id="4000398125663085899">Nuwe foto's en video's sal nou in 'n vouer in die Files-program gestoor word: My lêers > Kamera</translation> <translation id="4118525110028899586">Onderbreek opname</translation> <translation id="4269820728363426813">Kopieer skakeladres</translation> <translation id="4279490309300973883">Weerspieëling</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Gaan na galery toe</translation> <translation id="520537883758714667">Dokumentskandering is nou beskikbaar</translation> <translation id="5268823927180092501">Aktiveer dokumentmodus op alle kameras</translation> -<translation id="5422455049771430511">Jou foto's en video's het 'n nuwe tuiste</translation> <translation id="5444515100983837161">Plaas al die kante van die dokument binne die raam. Skandering werk die beste as die dokument en agtergrond verskillende kleure is.</translation> <translation id="5671277269877808209">Vierkant</translation> <translation id="5753488212459587150">Aktiveer kennermodus</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Kennermodus</translation> <translation id="5869546221129391014">Rooster</translation> <translation id="5975083100439434680">Zoem uit</translation> -<translation id="6040143037577758943">Maak toe</translation> <translation id="6073451960410192870">Stop opname</translation> <translation id="6197807149213783179">Stoor metadata</translation> <translation id="6233780560267770709">3 by 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_am.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_am.xtb index 3334e3f..c75eb8f 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_am.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_am.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">ቪዲዮ</translation> <translation id="3838931309141338733">የአሞሌ ኮድ ይቃኙ</translation> <translation id="3892148308691398805">ጽሑፍ ቅዳ</translation> -<translation id="4000398125663085899">አዳዲስ ፎቶዎች እና ቪዲዮዎች አሁን በፋይሎች መተግበሪያ ውስጥ ወዳለው አቃፊ ይቀመጣሉ፦ የእኔ ፋይሎች> ካሜራ</translation> <translation id="4118525110028899586">ቀረጻን ለአፍታ አቁም</translation> <translation id="4269820728363426813">የአገናኝ አድራሻ ቅዳ</translation> <translation id="4279490309300973883">በማንጸባረቅ ላይ</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">ወደ ማዕከለ-ሥዕላት ሂድ</translation> <translation id="520537883758714667">የሰነድ ቅኝት አሁን ይገኛል</translation> <translation id="5268823927180092501">በሁሉም ካሜራዎች ላይ የሰነድ ሁነታን ያንቁ</translation> -<translation id="5422455049771430511">የእርስዎ ፎቶዎች እና ቪዲዮዎች አዲስ ቤት አላቸው</translation> <translation id="5444515100983837161">የሰነዱን ሁሉንም ጠርዞች በክፈፉ ውስጥ ያስቀምጡ። ሰነዱ እና ዳራ የተለያዩ ቀለሞች ከሆኑ ቅኝት በተሻለ ሁኔታ ይሠራል።</translation> <translation id="5671277269877808209">ካሬ</translation> <translation id="5753488212459587150">የባለሙያ ሁነታን ያንቁ</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">ወደ ውጭ መላክ ሁነታ</translation> <translation id="5869546221129391014">ፍርግርግ</translation> <translation id="5975083100439434680">አሳንስ</translation> -<translation id="6040143037577758943">ዝጋ</translation> <translation id="6073451960410192870">መቅረጽ አቁም</translation> <translation id="6197807149213783179">የዲበ ውሂብ አስቀምጥ</translation> <translation id="6233780560267770709">3 በ 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ar.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ar.xtb index 173f2bc..8f92ae0 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ar.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ar.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">الفيديوهات</translation> <translation id="3838931309141338733">مسح الرمز الشريطي ضوئيًا</translation> <translation id="3892148308691398805">نسخ النص</translation> -<translation id="4000398125663085899">سيتم الآن حفظ الصور والفيديوهات الجديدة في مجلد في تطبيق "الملفات": ملفاتي > الكاميرا.</translation> <translation id="4118525110028899586">إيقاف التسجيل مؤقتًا</translation> <translation id="4269820728363426813">نسخ عنوان الرابط</translation> <translation id="4279490309300973883">النسخ المطابق</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">الانتقال إلى المعرض</translation> <translation id="520537883758714667">تتوفّر الآن ميزة مسح المستندات ضوئيًا.</translation> <translation id="5268823927180092501">تفعيل وضع المستند على جميع الكاميرات</translation> -<translation id="5422455049771430511">سيتم حفظ صورك وفيديوهاتك في مكان جديد</translation> <translation id="5444515100983837161">المستند بكل حوافه يجب أن يكون ضمن الإطار. وللحصول على أفضل النتائج، يجب أن يختلف لون المستند عن لون الخلفية.</translation> <translation id="5671277269877808209">وضع المربّع</translation> <translation id="5753488212459587150">تفعيل الوضع المختصّ</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">الوضع المختصّ</translation> <translation id="5869546221129391014">شبكة</translation> <translation id="5975083100439434680">تصغير</translation> -<translation id="6040143037577758943">إغلاق</translation> <translation id="6073451960410192870">إيقاف التسجيل</translation> <translation id="6197807149213783179">حفظ البيانات الوصفية</translation> <translation id="6233780560267770709">3 × 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_as.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_as.xtb index fd87850..3a65090 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_as.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_as.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">ভিডিঅ’</translation> <translation id="3838931309141338733">বাৰক’ড স্কেন কৰক</translation> <translation id="3892148308691398805">পাঠৰ প্ৰতিলিপি কৰক</translation> -<translation id="4000398125663085899">নতুন ফট’ আৰু ভিডিঅ’ এতিয়া Files এপ্টোৰ এটা ফ’ল্ডাৰত ছেভ কৰা হ’ব: মোৰ ফাইল > কেমেৰা</translation> <translation id="4118525110028899586">ৰেকৰ্ডিং পজ কৰক</translation> <translation id="4269820728363426813">লিংকৰ ঠিকনাটো প্ৰতিলিপি কৰক</translation> <translation id="4279490309300973883">প্ৰতিবিম্বকৰণ</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">গেলাৰীলৈ যাওক</translation> <translation id="520537883758714667">এতিয়া নথি স্কেন কৰাৰ সুবিধাটো উপলব্ধ</translation> <translation id="5268823927180092501">আটাইবোৰ কেমেৰাত নথিৰ ম’ডটো সক্ষম কৰক</translation> -<translation id="5422455049771430511">আপোনাৰ ফট' আৰু ভিডিঅ'সমূহ ৰাখিবৰ বাবে এখন নতুন ঠাই আছে</translation> <translation id="5444515100983837161">নথিখনৰ আটাইকেইটা কাষ ফ্ৰে’মটোৰ ভিতৰত ৰাখক। নথিখনৰ সৈতে নেপথ্যৰ ৰঙটো পৃথক হ’লে স্কেন কৰাৰ সুবিধাটোৱে আটাইতকৈ ভালকৈ কৰে।</translation> <translation id="5671277269877808209">বৰ্গাকাৰ</translation> <translation id="5753488212459587150">বিশেষজ্ঞ ম’ড সক্ষম কৰক</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">বিশেষজ্ঞ ম’ড</translation> <translation id="5869546221129391014">গ্ৰিড</translation> <translation id="5975083100439434680">জুম আউট কৰক</translation> -<translation id="6040143037577758943">বন্ধ কৰক</translation> <translation id="6073451960410192870">ৰেকৰ্ডিং কৰা বন্ধ কৰক</translation> <translation id="6197807149213783179">মেটাডেটা ছেভ কৰক</translation> <translation id="6233780560267770709">৩x৩</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_az.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_az.xtb index e32561d..48c22ef 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_az.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_az.xtb
@@ -47,7 +47,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3838931309141338733">Barkodu skan edin</translation> <translation id="3892148308691398805">Mətni kopyalayın</translation> -<translation id="4000398125663085899">İndi yeni foto və videolar Fayllar tətbiqindəki qovluqda saxlanılacaq: Fayllarım > Kamera</translation> <translation id="4118525110028899586">Səsi yazmağa fasilə verin</translation> <translation id="4269820728363426813">Link ünvanını kopyalayın</translation> <translation id="4279490309300973883">Əks etdirilir</translation> @@ -65,7 +64,6 @@ <translation id="5152121255775685072">Qalereyaya daxil olun</translation> <translation id="520537883758714667">Sənəd skanlama əlçatan deyil</translation> <translation id="5268823927180092501">Bütün kameralarda sənəd rejimini aktivləşdirin</translation> -<translation id="5422455049771430511">Foto və videolarınızın yeni məkanı var</translation> <translation id="5444515100983837161">Sənədin bütün kənarlarını çərçivənin daxilinə yerləşdirin. Sənəd və arxa fon fərqli rənglərdə olduqda skanlama daha keyfiyyətli olur.</translation> <translation id="5671277269877808209">Kvadrat</translation> <translation id="5753488212459587150">Ekspert rejimini aktiv edin</translation> @@ -73,7 +71,6 @@ <translation id="5775960006311140197">Ekspert rejimi</translation> <translation id="5869546221129391014">Şəbəkə</translation> <translation id="5975083100439434680">Kiçildin</translation> -<translation id="6040143037577758943">Qapat</translation> <translation id="6073451960410192870">Çəkməyi dayandırın</translation> <translation id="6197807149213783179">Metadatanı yadda saxlayın</translation> <translation id="6233780560267770709">3x3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_be.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_be.xtb index 80e89d0..7d6bdba 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_be.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_be.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Відэа</translation> <translation id="3838931309141338733">Сканіраваць штрыхкод</translation> <translation id="3892148308691398805">Скапіраваць тэкст</translation> -<translation id="4000398125663085899">Новыя фота і відэа цяпер будуць захоўвацца ў папцы ў праграме "Файлы": "Мае файлы > Камера"</translation> <translation id="4118525110028899586">Прыпыніць запіс</translation> <translation id="4269820728363426813">Капіраваць спасылку</translation> <translation id="4279490309300973883">Адлюстраванне</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Перайсці ў галерэю</translation> <translation id="520537883758714667">Функцыя сканіравання дакументаў даступная</translation> <translation id="5268823927180092501">Уключыць рэжым здымкі дакументаў для ўсіх камер</translation> -<translation id="5422455049771430511">Новае месца захоўвання для вашых фота і відэа</translation> <translation id="5444515100983837161">Памясціце ўсе краі дакумента ўнутр рамкі. Якасць сканіравання будзе лепшай, калі дакумент і фон, на якім ён знаходзіцца, маюць розны колер.</translation> <translation id="5671277269877808209">Квадрат</translation> <translation id="5753488212459587150">Уключыць экспертны рэжым</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Экспертны рэжым</translation> <translation id="5869546221129391014">Сетка</translation> <translation id="5975083100439434680">Паменшыць</translation> -<translation id="6040143037577758943">Закрыць</translation> <translation id="6073451960410192870">Спыніць запіс</translation> <translation id="6197807149213783179">Захаваць метаданыя</translation> <translation id="6233780560267770709">3 на 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_bg.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_bg.xtb index 322c70e..cdf9faf 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_bg.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_bg.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Видео</translation> <translation id="3838931309141338733">Сканиране на баркод</translation> <translation id="3892148308691398805">Копиране на текста</translation> -<translation id="4000398125663085899">Новите снимки и видеоклипове вече ще се запазват в папка в приложението Файлове: „Моите файлове > Камера“</translation> <translation id="4118525110028899586">Пауза на записа</translation> <translation id="4269820728363426813">Копиране на адреса на връзката</translation> <translation id="4279490309300973883">Дублиране</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Към галерията</translation> <translation id="520537883758714667">Функцията за сканиране на документи вече е налице</translation> <translation id="5268823927180092501">Активиране на режима за документи за всички камери</translation> -<translation id="5422455049771430511">Снимките и видеоклиповете ви имат нов дом</translation> <translation id="5444515100983837161">Поставете документа изцяло в рамката. Функцията работи най-добре, ако документът и фонът са с различни цветове.</translation> <translation id="5671277269877808209">Квадрат</translation> <translation id="5753488212459587150">Активиране на експертния режим</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Експертен режим</translation> <translation id="5869546221129391014">Таблица</translation> <translation id="5975083100439434680">Намаляване на мащаба</translation> -<translation id="6040143037577758943">Затваряне</translation> <translation id="6073451960410192870">Спиране на записа</translation> <translation id="6197807149213783179">Запазване на метаданните</translation> <translation id="6233780560267770709">3 на 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_bn.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_bn.xtb index 7cd595d..4c6ffc7 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_bn.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_bn.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">ভিডিও</translation> <translation id="3838931309141338733">বারকোড স্ক্যান করুন</translation> <translation id="3892148308691398805">টেক্সট কপি করুন</translation> -<translation id="4000398125663085899">নতুন ফটো ও ভিডিও এখন Files অ্যাপের একটি ফোল্ডারে সেভ করা হবে: আমার ফাইল > ক্যামেরা</translation> <translation id="4118525110028899586">রেকর্ডিং পজ করুন</translation> <translation id="4269820728363426813">লিঙ্ক অ্যাড্রেস কপি করুন</translation> <translation id="4279490309300973883">অনুকরণ করা হচ্ছে</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">গ্যালারিতে যান</translation> <translation id="520537883758714667">এখন ডকুমেন্ট স্ক্যান করা উপলভ্য</translation> <translation id="5268823927180092501">সব ক্যামেরার জন্য 'ডকুমেন্ট মোড' চালু করুন</translation> -<translation id="5422455049771430511">আপনার ফটো ও ভিডিও সেভ করার নতুন জায়গা</translation> <translation id="5444515100983837161">ডকুমেন্টের সমস্ত প্রান্ত ফ্রেমের মধ্যে রাখুন। ডকুমেন্ট ও ব্যাকগ্রাউন্ডের রং আলাদা হলে, স্ক্যানিং সবচেয়ে ভাল কাজ করে।</translation> <translation id="5671277269877808209">চৌকো</translation> <translation id="5753488212459587150">এক্সপার্ট মোড চালু করুন</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">বিশেষজ্ঞ মোড</translation> <translation id="5869546221129391014">গ্রিড</translation> <translation id="5975083100439434680">ছোট করুন</translation> -<translation id="6040143037577758943">বন্ধ</translation> <translation id="6073451960410192870">রেকর্ডিং বন্ধ করুন</translation> <translation id="6197807149213783179">মেটাডেটা সেভ করুন</translation> <translation id="6233780560267770709">৩ x ৩</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_bs.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_bs.xtb index 73869c0..47635c6 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_bs.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_bs.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Videozapis</translation> <translation id="3838931309141338733">Skeniraj bar kôd</translation> <translation id="3892148308691398805">Kopiraj tekst</translation> -<translation id="4000398125663085899">Nove fotografije i videozapisi sada će se pohranjivati u folder aplikacije Fajlovi: Moji fajlovi > Kamera</translation> <translation id="4118525110028899586">Pauziraj snimanje</translation> <translation id="4269820728363426813">Kopiraj adresu linka</translation> <translation id="4279490309300973883">Preslikavanje</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Idi u galeriju</translation> <translation id="520537883758714667">Skeniranje dokumenta je sada dostupno</translation> <translation id="5268823927180092501">Omogući način rada dokumenta na svim kamerama</translation> -<translation id="5422455049771430511">Vaše fotografije i videozapisi imaju novi dom</translation> <translation id="5444515100983837161">Postavite sve ivice dokumenta unutar okvira. Skeniranje najbolje funkcionira ako su boje dokumenta i pozadine različite.</translation> <translation id="5671277269877808209">Kvadrat</translation> <translation id="5753488212459587150">Omogući način rada za stručnjake</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Način rada za stručnjake</translation> <translation id="5869546221129391014">Mreža</translation> <translation id="5975083100439434680">Smanji</translation> -<translation id="6040143037577758943">Zatvori</translation> <translation id="6073451960410192870">Zaustavi snimanje</translation> <translation id="6197807149213783179">Sačuvaj metapodatke</translation> <translation id="6233780560267770709">3 sa 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ca.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ca.xtb index 8e8fe66..8db25cf 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ca.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ca.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Vídeo</translation> <translation id="3838931309141338733">Escaneja el codi de barres</translation> <translation id="3892148308691398805">Copia el text</translation> -<translation id="4000398125663085899">Ara, les fotos i els vídeos nous es desaran en una carpeta de l'aplicació Fitxers: Els meus fitxers > Càmera</translation> <translation id="4118525110028899586">Posa en pausa la gravació</translation> <translation id="4269820728363426813">Copia l'adreça de l'enllaç</translation> <translation id="4279490309300973883">S'està creant una rèplica</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Ves a la galeria</translation> <translation id="520537883758714667">L'escaneig de documents ja està disponible</translation> <translation id="5268823927180092501">Activa el mode de document en totes les càmeres</translation> -<translation id="5422455049771430511">Les teves fotos i els teus vídeos han canviat de lloc</translation> <translation id="5444515100983837161">Col·loca totes les vores del document dins del marc. L'escaneig funciona millor si el document i el fons tenen colors diferents.</translation> <translation id="5671277269877808209">Quadrat</translation> <translation id="5753488212459587150">Activa el mode expert</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Mode expert</translation> <translation id="5869546221129391014">Quadrícula</translation> <translation id="5975083100439434680">Redueix</translation> -<translation id="6040143037577758943">Tanca</translation> <translation id="6073451960410192870">Atura la gravació</translation> <translation id="6197807149213783179">Desa les metadades</translation> <translation id="6233780560267770709">3 per 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_cs.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_cs.xtb index 00ae47d..b043eb1 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_cs.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_cs.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3838931309141338733">Skenovat čárový kód</translation> <translation id="3892148308691398805">Kopírovat text</translation> -<translation id="4000398125663085899">Nové fotky a videa se teď budou ukládat do složky v aplikaci Soubory: Moje soubory > Fotoaparát</translation> <translation id="4118525110028899586">Pozastavit nahrávání</translation> <translation id="4269820728363426813">Zkopírovat adresu odkazu</translation> <translation id="4279490309300973883">Zrcadlení</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Přejít do galerie</translation> <translation id="520537883758714667">Nově je k dispozici skenování dokumentů</translation> <translation id="5268823927180092501">Aktivovat režim dokumentu na všech fotoaparátech</translation> -<translation id="5422455049771430511">Vaše fotky a videa mají nový domov</translation> <translation id="5444515100983837161">Umístěte všechny okraje dokumentu do rámečku. Skenování funguje nejlépe, když se barva dokumentu liší od barvy pozadí.</translation> <translation id="5671277269877808209">Čtverec</translation> <translation id="5753488212459587150">Aktivovat režim pro experty</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Režim pro experty</translation> <translation id="5869546221129391014">Mřížka</translation> <translation id="5975083100439434680">Oddálit</translation> -<translation id="6040143037577758943">Zavřít</translation> <translation id="6073451960410192870">Zastavit nahrávání</translation> <translation id="6197807149213783179">Uložit metadata</translation> <translation id="6233780560267770709">3 krát 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_da.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_da.xtb index 7d05946..a0a2452 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_da.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_da.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3838931309141338733">Scan stregkode</translation> <translation id="3892148308691398805">Kopiér tekst</translation> -<translation id="4000398125663085899">Nye billeder og videoer gemmes nu i en mappe i appen Filer: Mine filer > Kamera</translation> <translation id="4118525110028899586">Sæt optagelsen på pause</translation> <translation id="4269820728363426813">Kopiér linkadresse</translation> <translation id="4279490309300973883">Spejling</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Gå til galleri</translation> <translation id="520537883758714667">Det er nu muligt at scanne dokumenter</translation> <translation id="5268823927180092501">Aktivér dokumenttilstand på alle kameraer</translation> -<translation id="5422455049771430511">Dine billeder og videoer har fået et nyt hjem</translation> <translation id="5444515100983837161">Sørg for, at alle dokumentets kanter er inden for rammen. Scanning fungerer bedst, når dokumentet har en anden farve end baggrunden.</translation> <translation id="5671277269877808209">Kvadrat</translation> <translation id="5753488212459587150">Aktivér eksperttilstand</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Eksperttilstand</translation> <translation id="5869546221129391014">Gitter</translation> <translation id="5975083100439434680">Zoom ud</translation> -<translation id="6040143037577758943">Luk</translation> <translation id="6073451960410192870">Stop optagelse</translation> <translation id="6197807149213783179">Gem metadata</translation> <translation id="6233780560267770709">3 gange 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_de.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_de.xtb index 391ce52..655025a 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_de.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_de.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3838931309141338733">Barcode scannen</translation> <translation id="3892148308691398805">Text kopieren</translation> -<translation id="4000398125663085899">Neue Fotos und Videos werden jetzt in einem Ordner in der App „Dateien“ gespeichert: „Meine Dateien“ > „Kamera“.</translation> <translation id="4118525110028899586">Aufnahme pausieren</translation> <translation id="4269820728363426813">URL kopieren</translation> <translation id="4279490309300973883">Spiegelung</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Zur Galerie</translation> <translation id="520537883758714667">Scannen von Dokumenten jetzt verfügbar</translation> <translation id="5268823927180092501">Dokumentmodus auf allen Kameras aktivieren</translation> -<translation id="5422455049771430511">Ihre Fotos und Videos sind umgezogen</translation> <translation id="5444515100983837161">Alle Ränder des Dokuments müssen sich innerhalb des Rahmens befinden. Die besten Ergebnisse erzielen Sie, wenn das Dokument und der Hintergrund unterschiedliche Farben haben.</translation> <translation id="5671277269877808209">Quadrat</translation> <translation id="5753488212459587150">Einstellungen für Fortgeschrittene aktivieren</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Einstellungen für Fortgeschrittene</translation> <translation id="5869546221129391014">Raster</translation> <translation id="5975083100439434680">Verkleinern</translation> -<translation id="6040143037577758943">Schließen</translation> <translation id="6073451960410192870">Aufnahme beenden</translation> <translation id="6197807149213783179">Metadaten speichern</translation> <translation id="6233780560267770709">3 mal 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_el.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_el.xtb index a3e6146..d6ec49d 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_el.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_el.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Βίντεο</translation> <translation id="3838931309141338733">Σάρωση γραμμωτού κώδικα</translation> <translation id="3892148308691398805">Αντιγραφή κειμένου</translation> -<translation id="4000398125663085899">Οι νέες φωτογραφίες και τα βίντεο θα αποθηκεύονται πλέον σε έναν φάκελο στην εφαρμογή Αρχεία: Τα αρχεία μου > Κάμερα</translation> <translation id="4118525110028899586">Παύση εγγραφής</translation> <translation id="4269820728363426813">Αντιγρ. διεύθυνσης συνδέσμου</translation> <translation id="4279490309300973883">Κατοπτρισμός</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Μετάβαση στο gallery</translation> <translation id="520537883758714667">Η σάρωση εγγράφων είναι πλέον διαθέσιμη</translation> <translation id="5268823927180092501">Ενεργοποίηση λειτουργίας εγγράφου σε όλες τις κάμερες</translation> -<translation id="5422455049771430511">Οι φωτογραφίες και τα βίντεό σας βρήκαν νέα στέγη</translation> <translation id="5444515100983837161">Τοποθετήστε όλες τις άκρες του εγγράφου μέσα στο πλαίσιο. Η σάρωση λειτουργεί καλύτερα εάν το έγγραφο και το φόντο έχουν διαφορετικά χρώματα.</translation> <translation id="5671277269877808209">Τετράγωνο</translation> <translation id="5753488212459587150">Ενεργοποίηση λειτουργίας Expert</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Λειτουργία Expert</translation> <translation id="5869546221129391014">Πλέγμα</translation> <translation id="5975083100439434680">Σμίκρυνση</translation> -<translation id="6040143037577758943">Κλείσιμο</translation> <translation id="6073451960410192870">Διακοπή εγγραφής</translation> <translation id="6197807149213783179">Αποθήκευση μεταδεδομένων</translation> <translation id="6233780560267770709">3 επί 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_en-GB.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_en-GB.xtb index 5717633..bc1497e 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_en-GB.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_en-GB.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3838931309141338733">Scan barcode</translation> <translation id="3892148308691398805">Copy text</translation> -<translation id="4000398125663085899">New photos and videos will now be saved to a folder in the Files app: My files > Camera</translation> <translation id="4118525110028899586">Pause recording</translation> <translation id="4269820728363426813">Copy link address</translation> <translation id="4279490309300973883">Mirroring</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Go to gallery</translation> <translation id="520537883758714667">Document scanning now available</translation> <translation id="5268823927180092501">Enable document mode on all cameras</translation> -<translation id="5422455049771430511">Your photos and videos have a new home</translation> <translation id="5444515100983837161">Place all edges of the document within the frame. Scanning works best if the document and background are different colours.</translation> <translation id="5671277269877808209">Square</translation> <translation id="5753488212459587150">Enable expert mode</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Expert mode</translation> <translation id="5869546221129391014">Grid</translation> <translation id="5975083100439434680">Zoom out</translation> -<translation id="6040143037577758943">Close</translation> <translation id="6073451960410192870">Stop recording</translation> <translation id="6197807149213783179">Save metadata</translation> <translation id="6233780560267770709">3 by 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_es-419.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_es-419.xtb index e40cc10..17ad3682 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_es-419.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_es-419.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3838931309141338733">Escanear el código de barras</translation> <translation id="3892148308691398805">Copiar texto</translation> -<translation id="4000398125663085899">Los videos y fotos nuevos ahora se guardarán en una carpeta de la app de Archivos: Mis archivos > Cámara</translation> <translation id="4118525110028899586">Pausar la grabación</translation> <translation id="4269820728363426813">Copiar dirección del vínculo</translation> <translation id="4279490309300973883">Duplicando</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Ir a la galería</translation> <translation id="520537883758714667">La función para escanear documentos ya está disponible.</translation> <translation id="5268823927180092501">Habilitar el modo de documento en todas las cámaras</translation> -<translation id="5422455049771430511">Tus fotos y videos tienen un nuevo hogar</translation> <translation id="5444515100983837161">Coloca todos los bordes del documento dentro del cuadro. El escaneado funciona mejor si el documento tiene un color diferente al del fondo.</translation> <translation id="5671277269877808209">Cuadrado</translation> <translation id="5753488212459587150">Habilitar el modo experto</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Modo experto</translation> <translation id="5869546221129391014">Cuadrícula</translation> <translation id="5975083100439434680">Alejar</translation> -<translation id="6040143037577758943">Cerrar</translation> <translation id="6073451960410192870">Detener grabación</translation> <translation id="6197807149213783179">Guardar metadatos</translation> <translation id="6233780560267770709">3 por 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_es.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_es.xtb index 2448590..8fb904d68 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_es.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_es.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Vídeo</translation> <translation id="3838931309141338733">Escanear código de barras</translation> <translation id="3892148308691398805">Copiar texto</translation> -<translation id="4000398125663085899">Las fotos y los vídeos nuevos se guardarán ahora en una carpeta en la aplicación Archivos: Mis archivos > Cámara</translation> <translation id="4118525110028899586">Pausar grabación</translation> <translation id="4269820728363426813">Copiar la dirección del enlace</translation> <translation id="4279490309300973883">Duplicando</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Ir a la galería</translation> <translation id="520537883758714667">La función para escanear documentos ya está disponible</translation> <translation id="5268823927180092501">Habilitar modo de documento en todas las cámaras</translation> -<translation id="5422455049771430511">Tus fotos y vídeos tienen un nuevo hogar</translation> <translation id="5444515100983837161">Coloca todos los bordes del documento dentro del marco. Los documentos se escanean mejor si su color y el color de fondo son diferentes.</translation> <translation id="5671277269877808209">Cuadrado</translation> <translation id="5753488212459587150">Habilitar modo experto</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Modo experto</translation> <translation id="5869546221129391014">Cuadrícula</translation> <translation id="5975083100439434680">Reducir</translation> -<translation id="6040143037577758943">Cerrar</translation> <translation id="6073451960410192870">Detener grabación</translation> <translation id="6197807149213783179">Guardar metadatos</translation> <translation id="6233780560267770709">Tres por tres</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_et.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_et.xtb index d423e9f2..0c4483f 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_et.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_et.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3838931309141338733">Skannige ribakood</translation> <translation id="3892148308691398805">Kopeeri tekst</translation> -<translation id="4000398125663085899">Uued fotod ja videod salvestatakse nüüd rakenduse Failid kausta: Minu failid > Kaamera</translation> <translation id="4118525110028899586">Peata salvestamine</translation> <translation id="4269820728363426813">Kopeeri lingi aadress</translation> <translation id="4279490309300973883">Peegeldamine</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Ava galerii</translation> <translation id="520537883758714667">Dokumendiskannimine on nüüd saadaval</translation> <translation id="5268823927180092501">Luba dokumendirežiim kõigis kaamerates</translation> -<translation id="5422455049771430511">Teie fotodel ja videotel on nüüd uus kodu</translation> <translation id="5444515100983837161">Paigutage kõik dokumendi servad raami sisse. Skannimine toimib kõige paremini, kui dokument ja taust on eri värvi.</translation> <translation id="5671277269877808209">Ruut</translation> <translation id="5753488212459587150">Luba ekspertrežiim</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Ekspertrežiim</translation> <translation id="5869546221129391014">Ruudustik</translation> <translation id="5975083100439434680">Suumib välja</translation> -<translation id="6040143037577758943">Sulge</translation> <translation id="6073451960410192870">Peata salvestamine</translation> <translation id="6197807149213783179">Salvesta metaandmed</translation> <translation id="6233780560267770709">3 korda 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_eu.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_eu.xtb index b513e43..36d545f 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_eu.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_eu.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Bideoa</translation> <translation id="3838931309141338733">Eskaneatu barra-kodea</translation> <translation id="3892148308691398805">Kopiatu testua</translation> -<translation id="4000398125663085899">Orain, Fitxategiak aplikazioko karpeta honetan gordeko dira argazki eta bideo berriak: Nire fitxategiak > Kamera</translation> <translation id="4118525110028899586">Pausatu grabaketa</translation> <translation id="4269820728363426813">Kopiatu estekaren helbidea</translation> <translation id="4279490309300973883">Islatzen</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Joan galeriara</translation> <translation id="520537883758714667">Dokumentuak eskaneatzeko eginbidea eskuragarri dago</translation> <translation id="5268823927180092501">Gaitu dokumentu modua kamera guztietan</translation> -<translation id="5422455049771430511">Etxe berria dute zure argazki eta bideoek</translation> <translation id="5444515100983837161">Jarri dokumentuaren ertz guztiak markoaren barruan. Hobeto eskaneatzen da dokumentuaren eta hondoaren koloreak ezberdinak badira.</translation> <translation id="5671277269877808209">Karratua</translation> <translation id="5753488212459587150">Gaitu adituen modua</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Adituen modua</translation> <translation id="5869546221129391014">Sareta</translation> <translation id="5975083100439434680">Txikitu</translation> -<translation id="6040143037577758943">Itxi</translation> <translation id="6073451960410192870">Utzi grabatzeari</translation> <translation id="6197807149213783179">Gorde metadatuak</translation> <translation id="6233780560267770709">3 × 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fa.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fa.xtb index b7f01d92..76defeca 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fa.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fa.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">فیلم</translation> <translation id="3838931309141338733">اسکن بارکد</translation> <translation id="3892148308691398805">کپی کردن نوشتار</translation> -<translation id="4000398125663085899">عکسها و ویدیوهای جدید اکنون در پوشهای در برنامه Files: «فایلهای من > دوربین» ذخیره خواهند شد.</translation> <translation id="4118525110028899586">توقف موقت ضبط</translation> <translation id="4269820728363426813">کپی نشانی پیوند</translation> <translation id="4279490309300973883">بازتاب میشود</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">رفتن به گالری</translation> <translation id="520537883758714667">اسکن سند اکنون دردسترس است</translation> <translation id="5268823927180092501">فعال کردن حالت سند در همه دوربینها</translation> -<translation id="5422455049771430511">عکسها و ویدیوهایتان مکان جدیدی دارند</translation> <translation id="5444515100983837161">همه لبههای سند را داخل قاب قرار دهید. اسکن بهترین عملکرد را زمانی دارد که رنگ سند و پسزمینه متفاوت باشد.</translation> <translation id="5671277269877808209">مربع</translation> <translation id="5753488212459587150">فعال کردن حالت کارشناس</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">حالت کارشناس</translation> <translation id="5869546221129391014">جدولی</translation> <translation id="5975083100439434680">دورنمایی کردن</translation> -<translation id="6040143037577758943">بستن</translation> <translation id="6073451960410192870">توقف ضبط</translation> <translation id="6197807149213783179">ذخیره فراداده</translation> <translation id="6233780560267770709">۳ در ۳</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fi.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fi.xtb index 1c4d3e3..ff98056 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fi.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fi.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3838931309141338733">Skannaa viivakoodi</translation> <translation id="3892148308691398805">Kopioi teksti</translation> -<translation id="4000398125663085899">Uudet kuvat ja videot tallennetaan nyt kansioon Tiedostot-sovelluksessa: Omat tiedostot > Kamera</translation> <translation id="4118525110028899586">Keskeytä tallennus</translation> <translation id="4269820728363426813">Kopioi linkin osoite</translation> <translation id="4279490309300973883">Peilaus päällä</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Siirry galleriaan</translation> <translation id="520537883758714667">Dokumenttien skannaus on nyt saatavilla</translation> <translation id="5268823927180092501">Ota dokumenttitila käyttöön kaikilla kameroilla</translation> -<translation id="5422455049771430511">Kuvillasi ja videoillasi on nyt uusi koti</translation> <translation id="5444515100983837161">Aseta dokumentti niin, että kaikki reunat ovat kehyksen sisällä. Skannaus toimii parhaiten, kun dokumentti ja tausta ovat erivärisiä</translation> <translation id="5671277269877808209">Neliö</translation> <translation id="5753488212459587150">Ota asiantuntijatila käyttöön</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Asiantuntija-tila</translation> <translation id="5869546221129391014">Ruudukko</translation> <translation id="5975083100439434680">Loitonna</translation> -<translation id="6040143037577758943">Sulje</translation> <translation id="6073451960410192870">Lopeta tallennus</translation> <translation id="6197807149213783179">Tallenna sisällönkuvaustiedot</translation> <translation id="6233780560267770709">3x3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fil.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fil.xtb index e4fb51e..a97ca740 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fil.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fil.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3838931309141338733">I-scan ang barcode</translation> <translation id="3892148308691398805">Kopyahin ang text</translation> -<translation id="4000398125663085899">Mase-save na ngayon ang mga bagong larawan at video sa isang folder sa Files app: Aking mga file > Camera</translation> <translation id="4118525110028899586">I-pause ang pag-record</translation> <translation id="4269820728363426813">Kopyahin ang address ng link</translation> <translation id="4279490309300973883">Nagmi-mirror</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Pumunta sa gallery</translation> <translation id="520537883758714667">Available na ang pag-scan ng dokumento</translation> <translation id="5268823927180092501">I-enable ang document mode sa lahat ng camera</translation> -<translation id="5422455049771430511">May bago nang lugar para sa iyong mga larawan at video</translation> <translation id="5444515100983837161">Ilagay sa loob ng frame ang lahat ng gilid ng dokumento. Pinakamahusay na gumagana ang pag-scan kung magkaiba ng kulay ang dokumento at background.</translation> <translation id="5671277269877808209">Parisukat</translation> <translation id="5753488212459587150">I-enable ang expert mode</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Expert mode</translation> <translation id="5869546221129391014">Grid</translation> <translation id="5975083100439434680">Mag-zoom out</translation> -<translation id="6040143037577758943">Isara</translation> <translation id="6073451960410192870">Ihinto ang pag-record</translation> <translation id="6197807149213783179">I-save ang metadata</translation> <translation id="6233780560267770709">3 by 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr-CA.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr-CA.xtb index 0f2808c..2e0412e 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr-CA.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr-CA.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Vidéo</translation> <translation id="3838931309141338733">Numériser le code-barres</translation> <translation id="3892148308691398805">Copier le texte</translation> -<translation id="4000398125663085899">Les nouvelles photos et vidéos seront maintenant enregistrées dans un dossier de l'application Fichiers : Mes fichiers > Caméra</translation> <translation id="4118525110028899586">Interrompre l'enregistrement</translation> <translation id="4269820728363426813">Copier l'adresse du lien</translation> <translation id="4279490309300973883">Mise en miroir</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Accéder à la galerie</translation> <translation id="520537883758714667">Numérisation de documents désormais disponible</translation> <translation id="5268823927180092501">Activer le mode document sur tous les appareils photo</translation> -<translation id="5422455049771430511">Nouveau répertoire pour les photos et les vidéos</translation> <translation id="5444515100983837161">Placez l'intégralité du document dans le cadre. La numérisation sera de meilleure qualité si les couleurs du document et de l'arrière-plan sont différentes.</translation> <translation id="5671277269877808209">Carré</translation> <translation id="5753488212459587150">Activer le mode Expert</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Mode Expert</translation> <translation id="5869546221129391014">Grille</translation> <translation id="5975083100439434680">Zoom arrière</translation> -<translation id="6040143037577758943">Fermer</translation> <translation id="6073451960410192870">Arrêter l'enregistrement</translation> <translation id="6197807149213783179">Enregistrer les métadonnées</translation> <translation id="6233780560267770709">3 par 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr.xtb index 67071832..71998708 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Vidéo</translation> <translation id="3838931309141338733">Lire le code-barres</translation> <translation id="3892148308691398805">Copier le texte</translation> -<translation id="4000398125663085899">Les nouvelles photos et vidéos seront désormais enregistrées dans un dossier de l'application Fichiers : Mes fichiers > Appareil photo.</translation> <translation id="4118525110028899586">Suspendre l'enregistrement</translation> <translation id="4269820728363426813">Copier l'adresse du lien</translation> <translation id="4279490309300973883">Mise en miroir</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Accéder à la galerie</translation> <translation id="520537883758714667">Numérisation de documents désormais disponible</translation> <translation id="5268823927180092501">Activer le mode document sur toutes les caméras</translation> -<translation id="5422455049771430511">Nouveau dossier pour vos photos et vidéos</translation> <translation id="5444515100983837161">Placez le document dans le cadre. L'image scannée sera de meilleure qualité si les couleurs du document et de l'arrière-plan sont différentes.</translation> <translation id="5671277269877808209">Carré</translation> <translation id="5753488212459587150">Activer le mode Expert</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Mode Expert</translation> <translation id="5869546221129391014">Grille</translation> <translation id="5975083100439434680">Zoom arrière</translation> -<translation id="6040143037577758943">Fermer</translation> <translation id="6073451960410192870">Arrêter l'enregistrement</translation> <translation id="6197807149213783179">Enregistrer les métadonnées</translation> <translation id="6233780560267770709">3 par 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_gl.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_gl.xtb index 3a75b14..9bf9d0d 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_gl.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_gl.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Vídeo</translation> <translation id="3838931309141338733">Escanear código de barras</translation> <translation id="3892148308691398805">Copiar texto</translation> -<translation id="4000398125663085899">Agora as fotos e os vídeos novos gardaranse nun cartafol da aplicación Ficheiros: Os meus ficheiros > Cámara</translation> <translation id="4118525110028899586">Pór gravación en pausa</translation> <translation id="4269820728363426813">Copiar enderezo da ligazón</translation> <translation id="4279490309300973883">Proxección</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Ir á galería</translation> <translation id="520537883758714667">O escaneado de documentos xa está dispoñible</translation> <translation id="5268823927180092501">Activar modo de documento en todas as cámaras</translation> -<translation id="5422455049771430511">As túas fotos e vídeos cambiaron de lugar</translation> <translation id="5444515100983837161">Coloca todos os bordos do documento no marco. O escaneado funciona mellor se o documento e o fondo son de cores diferentes.</translation> <translation id="5671277269877808209">Cadrado</translation> <translation id="5753488212459587150">Activar modo experto</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Modo experto</translation> <translation id="5869546221129391014">Grade</translation> <translation id="5975083100439434680">Afastar</translation> -<translation id="6040143037577758943">Pechar</translation> <translation id="6073451960410192870">Deter gravación</translation> <translation id="6197807149213783179">Gardar metadatos</translation> <translation id="6233780560267770709">3 por 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_gu.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_gu.xtb index dfa94fb..3373c35 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_gu.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_gu.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">વીડિયો</translation> <translation id="3838931309141338733">બારકોડ સ્કૅન કરો</translation> <translation id="3892148308691398805">ટેક્સ્ટ કૉપિ કરો</translation> -<translation id="4000398125663085899">હવે નવા ફોટા અને વીડિયો Files ઍપના કોઈ ફોલ્ડરમાં સાચવવામાં આવશે: મારી ફાઇલો > કૅમેરા</translation> <translation id="4118525110028899586">રેકોર્ડિંગ થોભાવો</translation> <translation id="4269820728363426813">લિંક સરનામું કૉપિ કરો</translation> <translation id="4279490309300973883">પ્રતિબિંબત થઈ રહ્યું છે</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">ગૅલેરી પર જાઓ</translation> <translation id="520537883758714667">દસ્તાવેજ સ્કૅન કરવાની સુવિધા હવે ઉપલબ્ધ છે</translation> <translation id="5268823927180092501">બધા કૅમેરામાં 'દસ્તાવેજ મોડ' ચાલુ કરો</translation> -<translation id="5422455049771430511">હવે તમારા ફોટા અને વીડિયો માટે નવું સ્થાન ઉપલબ્ધ છે</translation> <translation id="5444515100983837161">દસ્તાવેજના બધા ખૂણાઓને ફ્રેમની અંદર રાખો. જો દસ્તાવેજ અને બૅકગ્રાઉન્ડ અલગ-અલગ રંગોના હોય, તો સ્કૅન શ્રેષ્ઠ રીતે કામ કરે છે.</translation> <translation id="5671277269877808209">ચોરસ</translation> <translation id="5753488212459587150">નિષ્ણાત મોડ ચાલુ કરો</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">નિષ્ણાત મોડ</translation> <translation id="5869546221129391014">ગ્રિડ</translation> <translation id="5975083100439434680">ઝૂમ ઘટાડો</translation> -<translation id="6040143037577758943">બંધ કરો</translation> <translation id="6073451960410192870">રેકોર્ડિંગ બંધ કરો</translation> <translation id="6197807149213783179">મેટાડેટા સાચવો</translation> <translation id="6233780560267770709">3 બાય 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hi.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hi.xtb index 7428e5f..78bb9a9 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hi.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hi.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">वीडियो</translation> <translation id="3838931309141338733">बारकोड स्कैन करें</translation> <translation id="3892148308691398805">टेक्स्ट कॉपी करें</translation> -<translation id="4000398125663085899">नई फ़ोटो और वीडियो अब फ़ाइल ऐप्लिकेशन के फ़ोल्डर में सेव होंगे: मेरी फ़ाइलें > कैमरा</translation> <translation id="4118525110028899586">रिकॉर्डिंग रोकें</translation> <translation id="4269820728363426813">लिंक पते को कॉपी करें</translation> <translation id="4279490309300973883">स्क्रीन शेयर करने की सुविधा चालू है</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">गैलरी में जाएं</translation> <translation id="520537883758714667">दस्तावेज़ को स्कैन करने की सुविधा अब उपलब्ध है</translation> <translation id="5268823927180092501">सभी कैमरे के लिए दस्तावेज़ मोड चालू करें</translation> -<translation id="5422455049771430511">आपकी फ़ोटो और वीडियो के लिए नई जगह</translation> <translation id="5444515100983837161">दस्तावेज़ के सभी कोने फ़्रेम के अंदर रखें. दस्तावेज़ और बैकग्राउंड का रंग अलग-अलग होने पर स्कैन बेहतर होता है.</translation> <translation id="5671277269877808209">वर्ग</translation> <translation id="5753488212459587150">एक्सपर्ट मोड चालू करें</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">एक्सपर्ट मोड</translation> <translation id="5869546221129391014">ग्रिड</translation> <translation id="5975083100439434680">ज़ूम आउट</translation> -<translation id="6040143037577758943">बंद करें</translation> <translation id="6073451960410192870">रिकॉर्डिंग बंद करें</translation> <translation id="6197807149213783179">मेटाडेटा सेव करें</translation> <translation id="6233780560267770709">3 गुणा 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hr.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hr.xtb index fdaab32..4e1be74 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hr.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hr.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3838931309141338733">Skenirajte crtični kôd</translation> <translation id="3892148308691398805">Kopiranje teksta</translation> -<translation id="4000398125663085899">Nove fotografije i videozapisi sad će se spremati u mapu u aplikaciji Datoteke: Moje datoteke > Kamera</translation> <translation id="4118525110028899586">Pauziraj snimanje</translation> <translation id="4269820728363426813">Kopiraj adresu veze</translation> <translation id="4279490309300973883">Zrcaljenje</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Otvori galeriju</translation> <translation id="520537883758714667">Sad je dostupno skeniranje dokumenata</translation> <translation id="5268823927180092501">Omogućite način rada s dokumentom na svim kamerama</translation> -<translation id="5422455049771430511">Fotografije i videozapisi sad se nalaze na novom mjestu</translation> <translation id="5444515100983837161">Postavite sve rubove dokumenta unutar okvira. Skeniranje najbolje funkcionira ako su dokument i pozadina različitih boja.</translation> <translation id="5671277269877808209">Kvadrat</translation> <translation id="5753488212459587150">Omogući stručni način rada</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Stručni način rada</translation> <translation id="5869546221129391014">Rešetka</translation> <translation id="5975083100439434680">Smanji</translation> -<translation id="6040143037577758943">Zatvori</translation> <translation id="6073451960410192870">Zaustavi snimanje</translation> <translation id="6197807149213783179">Spremi metapodatke</translation> <translation id="6233780560267770709">Tri puta tri</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hu.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hu.xtb index e81b8231..1b4d1c4f 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hu.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hu.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Videó</translation> <translation id="3838931309141338733">Vonalkód beolvasása</translation> <translation id="3892148308691398805">Szöveg másolása</translation> -<translation id="4000398125663085899">Az új fotók és videók mostantól a Fájlok alkalmazás egyik mappájába lesznek mentve: Saját fájlok > Kamera</translation> <translation id="4118525110028899586">Felvétel szüneteltetése</translation> <translation id="4269820728363426813">Link másolása</translation> <translation id="4279490309300973883">Tükrözés</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Ugrás a galériába</translation> <translation id="520537883758714667">A dokumentumbeolvasás már használható</translation> <translation id="5268823927180092501">Dokumentum mód engedélyezése az összes kamerán</translation> -<translation id="5422455049771430511">Fényképei és videói új otthonba költöztek.</translation> <translation id="5444515100983837161">A dokumentum összes szélének a kereten belül kell lennie. A beolvasás akkor működik a legjobban, ha a dokumentum és a háttér színei különbözőek.</translation> <translation id="5671277269877808209">Négyzet</translation> <translation id="5753488212459587150">Szakértői mód bekapcsolása</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Szakértői mód</translation> <translation id="5869546221129391014">Rács</translation> <translation id="5975083100439434680">Kicsinyítés</translation> -<translation id="6040143037577758943">Bezárás</translation> <translation id="6073451960410192870">Felvétel leállítása</translation> <translation id="6197807149213783179">Metaadatok mentése</translation> <translation id="6233780560267770709">Háromszor hármas</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hy.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hy.xtb index 445ea51..d578e61 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hy.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hy.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Տեսանյութ</translation> <translation id="3838931309141338733">Սկանավորել գծակոդը</translation> <translation id="3892148308691398805">Պատճենել տեքստը</translation> -<translation id="4000398125663085899">Այժմ նոր լուսանկարներն ու տեսանյութերը կպահվեն «Ֆայլեր» հավելվածի հետևյալ պանակում՝ Իմ ֆայլերը > Տեսախցիկ։</translation> <translation id="4118525110028899586">Դադարեցնել տեսագրումը</translation> <translation id="4269820728363426813">Պատճենել հղման հասցեն</translation> <translation id="4279490309300973883">Հայելապատճենում</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Անցնել ցուցասրահ</translation> <translation id="520537883758714667">Փաստաթղթերի սկանավորումն արդեն հասանելի է</translation> <translation id="5268823927180092501">Միացնել փաստաթղթի ռեժիմը բոլոր տեսախցիկներում</translation> -<translation id="5422455049771430511">Ձեր լուսանկարներն ու տեսանյութերը կպահվեն նոր տեղում</translation> <translation id="5444515100983837161">Փաստաթուղթը դրեք շրջանակի մեջ։ Սկանավորումը լավագույնս աշխատում է, երբ փաստաթղթի և ֆոնի գույները տարբեր են։</translation> <translation id="5671277269877808209">Քառակուսի</translation> <translation id="5753488212459587150">Միացնել փորձագետի ռեժիմը</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Փորձագետի ռեժիմ</translation> <translation id="5869546221129391014">Ցանց</translation> <translation id="5975083100439434680">Փոքրացնել</translation> -<translation id="6040143037577758943">Փակել</translation> <translation id="6073451960410192870">Դադարեցնել տեսագրումը</translation> <translation id="6197807149213783179">Պահել մետատվյալները</translation> <translation id="6233780560267770709">3-ը 3-ի</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_id.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_id.xtb index 48478ab..af8ea185 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_id.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_id.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3838931309141338733">Pindai kode batang</translation> <translation id="3892148308691398805">Salin teks</translation> -<translation id="4000398125663085899">Foto dan video baru kini akan disimpan ke folder di aplikasi File: File saya > Kamera</translation> <translation id="4118525110028899586">Jeda rekaman</translation> <translation id="4269820728363426813">Salin URL</translation> <translation id="4279490309300973883">Mencerminkan</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Buka galeri</translation> <translation id="520537883758714667">Pemindaian dokumen kini tersedia</translation> <translation id="5268823927180092501">Aktifkan mode dokumen di semua kamera</translation> -<translation id="5422455049771430511">Foto dan video Anda punya tempat baru</translation> <translation id="5444515100983837161">Tempatkan semua sisi dokumen ke dalam bingkai. Pemindaian akan berfungsi baik jika dokumen dan latar belakang memiliki warna yang berbeda.</translation> <translation id="5671277269877808209">Persegi</translation> <translation id="5753488212459587150">Aktifkan mode pakar</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Mode pakar</translation> <translation id="5869546221129391014">Kisi</translation> <translation id="5975083100439434680">Perkecil</translation> -<translation id="6040143037577758943">Tutup</translation> <translation id="6073451960410192870">Berhenti merekam</translation> <translation id="6197807149213783179">Simpan metadata</translation> <translation id="6233780560267770709">3 kali 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_is.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_is.xtb index be93b3c..16fbb9c 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_is.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_is.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Myndskeið</translation> <translation id="3838931309141338733">Skanna strikamerki</translation> <translation id="3892148308691398805">Afrita texta</translation> -<translation id="4000398125663085899">Nýjar myndir og myndskeið verða nú vistuð í möppu í forritinu Files: Skrárnar mínar > Myndavél.</translation> <translation id="4118525110028899586">Gera hlé á upptöku</translation> <translation id="4269820728363426813">Afrita slóð tengils</translation> <translation id="4279490309300973883">Speglun</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Opna safn</translation> <translation id="520537883758714667">Nú er skjalaskönnun í boði</translation> <translation id="5268823927180092501">Virkja skjalastillingu í öllum myndavélum</translation> -<translation id="5422455049771430511">Myndirnar þínar og myndskeiðin eru komin á nýjan stað</translation> <translation id="5444515100983837161">Settu öll horn skjalsins í rammann. Skönnun virkar betur ef skjalið og bakgrunnurinn eru í mismunandi litum.</translation> <translation id="5671277269877808209">Ferningur</translation> <translation id="5753488212459587150">Nota ítarlegar stillingar</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Ítarlegar stillingar</translation> <translation id="5869546221129391014">Tafla</translation> <translation id="5975083100439434680">Minnka aðdrátt</translation> -<translation id="6040143037577758943">Loka</translation> <translation id="6073451960410192870">Stöðva upptöku</translation> <translation id="6197807149213783179">Vista lýsigögn</translation> <translation id="6233780560267770709">3 sinnum 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_it.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_it.xtb index a618624..660faca 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_it.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_it.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3838931309141338733">Scansiona il codice a barre</translation> <translation id="3892148308691398805">Copia testo</translation> -<translation id="4000398125663085899">Ora le nuove foto e i nuovi video verranno salvati in una cartella dell'app File: I miei file > Fotocamera</translation> <translation id="4118525110028899586">Metti in pausa la registrazione</translation> <translation id="4269820728363426813">Copia indirizzo link</translation> <translation id="4279490309300973883">Mirroring</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Vai alla galleria</translation> <translation id="520537883758714667">Ora è disponibile la scansione di documenti</translation> <translation id="5268823927180092501">Abilita la modalità documento per tutte le fotocamere</translation> -<translation id="5422455049771430511">Le tue foto e i tuoi video hanno cambiato posto</translation> <translation id="5444515100983837161">Posiziona i bordi del documento all'interno dell'inquadratura. La qualità della scansione è migliore se il documento e lo sfondo sono di colori diversi.</translation> <translation id="5671277269877808209">Quadrato</translation> <translation id="5753488212459587150">Attiva modalità Esperto</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Modalità Esperto</translation> <translation id="5869546221129391014">Griglia</translation> <translation id="5975083100439434680">Diminuisci lo zoom</translation> -<translation id="6040143037577758943">Chiudi</translation> <translation id="6073451960410192870">Interrompi registrazione</translation> <translation id="6197807149213783179">Salva metadati</translation> <translation id="6233780560267770709">3 x 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_iw.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_iw.xtb index 8025d0966..4df91d2 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_iw.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_iw.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">סרטון</translation> <translation id="3838931309141338733">סריקת ברקוד</translation> <translation id="3892148308691398805">העתקת הטקסט</translation> -<translation id="4000398125663085899">מעכשיו, תמונות וסרטונים חדשים יישמרו בתיקייה באפליקציה 'קבצים': הקבצים שלי > מצלמה.</translation> <translation id="4118525110028899586">השהיית ההקלטה</translation> <translation id="4269820728363426813">העתקת כתובת של קישור</translation> <translation id="4279490309300973883">שיקוף</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">למעבר אל הגלריה</translation> <translation id="520537883758714667">התכונה 'סריקת מסמכים' זמינה עכשיו</translation> <translation id="5268823927180092501">הפעלת מצב מסמך בכל המצלמות</translation> -<translation id="5422455049771430511">התמונות והסרטונים שלך עברו למקום חדש</translation> <translation id="5444515100983837161">יש למקם את כל קצות המסמך בתוך המסגרת. הסריקה תתבצע בצורה הטובה ביותר אם המסמך והרקע יהיו בצבעים שונים.</translation> <translation id="5671277269877808209">ריבוע</translation> <translation id="5753488212459587150">הפעלת מצב מתקדם</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">מצב מתקדם</translation> <translation id="5869546221129391014">רשת</translation> <translation id="5975083100439434680">התרחקות</translation> -<translation id="6040143037577758943">סגירה</translation> <translation id="6073451960410192870">הפסקת צילום הסרטון</translation> <translation id="6197807149213783179">שמירת מטא-נתונים</translation> <translation id="6233780560267770709">3 על 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ja.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ja.xtb index a56df741..71dc093 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ja.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ja.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">動画</translation> <translation id="3838931309141338733">バーコード スキャン</translation> <translation id="3892148308691398805">テキストをコピー</translation> -<translation id="4000398125663085899">新しい画像と動画はファイルアプリのフォルダ([マイファイル] > [カメラ])に保存されるようになりました</translation> <translation id="4118525110028899586">録画を一時停止</translation> <translation id="4269820728363426813">リンクアドレスをコピー</translation> <translation id="4279490309300973883">ミラーリング</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">ギャラリーに移動</translation> <translation id="520537883758714667">ドキュメント スキャンをご利用いただけるようになりました</translation> <translation id="5268823927180092501">すべてのカメラでドキュメント モードを有効にする</translation> -<translation id="5422455049771430511">画像と動画の保存先が変わりました</translation> <translation id="5444515100983837161">ドキュメントのすべての端をフレーム内に収めてください。ドキュメントと背景を異なる色にすると、うまくスキャンできます。</translation> <translation id="5671277269877808209">スクエア</translation> <translation id="5753488212459587150">エキスパート モードを有効にする</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">エキスパート モード</translation> <translation id="5869546221129391014">グリッド</translation> <translation id="5975083100439434680">縮小する</translation> -<translation id="6040143037577758943">閉じる</translation> <translation id="6073451960410192870">撮影を停止</translation> <translation id="6197807149213783179">メタデータを保存</translation> <translation id="6233780560267770709">3 かける 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ka.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ka.xtb index 6ef0d12c..fdf42a3 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ka.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ka.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">ვიდეო</translation> <translation id="3838931309141338733">შტრიხკოდის სკანირება</translation> <translation id="3892148308691398805">ტექსტის კოპირება</translation> -<translation id="4000398125663085899">ახალი ფოტოები და ვიდეოები ამიერიდან შეინახება ფაილების აპის საქაღალდეში: ჩემი ფაილები > კამერა</translation> <translation id="4118525110028899586">ჩაწერის დაპაუზება</translation> <translation id="4269820728363426813">ბმულის მისამართის კოპირება</translation> <translation id="4279490309300973883">არეკვლა</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">გალერეაზე გადასვლა</translation> <translation id="520537883758714667">ამიერიდან ხელმისაწვდომია დოკუმენტების სკანირების ფუნქცია</translation> <translation id="5268823927180092501">დოკუმენტის რეჟიმის ჩართვა ყველა კამერაზე</translation> -<translation id="5422455049771430511">თქვენმა ფოტოებმა და ვიდეოებმა ახალ სივრცეში გადაინაცვლა</translation> <translation id="5444515100983837161">მოათავსეთ დოკუმენტის ყველა კიდე ჩარჩოში. საუკეთესო შედეგების მისაღებად დოკუმენტისა და ფონის ფერები განსხვავებული უნდა იყოს.</translation> <translation id="5671277269877808209">კვადრატი</translation> <translation id="5753488212459587150">ექსპერტის რეჟიმის ჩართვა</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">ექსპერტთა რეჟიმი</translation> <translation id="5869546221129391014">ბადე</translation> <translation id="5975083100439434680">დაშორება</translation> -<translation id="6040143037577758943">დახურვა</translation> <translation id="6073451960410192870">ჩაწერის შეწყვეტა</translation> <translation id="6197807149213783179">მეტამონაცემების შენახვა</translation> <translation id="6233780560267770709">სამი სამზე</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_kk.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_kk.xtb index 729915f..a1ec069 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_kk.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_kk.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Бейне</translation> <translation id="3838931309141338733">Сканерлеу штрих коды</translation> <translation id="3892148308691398805">Мәтінді көшіру</translation> -<translation id="4000398125663085899">Жаңа фотосуреттер мен бейнелер енді Files қолданбасының қалтасында сақталады: "Менің файлдарым > Камера".</translation> <translation id="4118525110028899586">Жазуды кідірту</translation> <translation id="4269820728363426813">Сілтеме мекенжайын көшіру</translation> <translation id="4279490309300973883">Экран көшірмесін көрсету</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Галереяға өту</translation> <translation id="520537883758714667">Енді кұжатты сканерлеуге болады.</translation> <translation id="5268823927180092501">Барлық камерада құжат режимін қосу</translation> -<translation id="5422455049771430511">Фотосуреттеріңіз бен бейнелеріңіз сақталатын жаңа орын пайда болды</translation> <translation id="5444515100983837161">Құжатты жақтаудың ішіне орналастырыңыз. Сканерлеудің сапасы жақсы болуы үшін, құжат пен фонның түсі әртүрлі болуы керек.</translation> <translation id="5671277269877808209">Шаршы</translation> <translation id="5753488212459587150">Сарапшы режимін қосу</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Сарапшы режимі</translation> <translation id="5869546221129391014">Тор</translation> <translation id="5975083100439434680">Кішірейту</translation> -<translation id="6040143037577758943">Жабу</translation> <translation id="6073451960410192870">Бейнеге түсіруді тоқтату</translation> <translation id="6197807149213783179">Метадеректі сақтау</translation> <translation id="6233780560267770709">3 x 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_km.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_km.xtb index 04ff5cbd..c9f59ba 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_km.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_km.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">វីដេអូ</translation> <translation id="3838931309141338733">ស្កេនបារកូដ</translation> <translation id="3892148308691398805">ចម្លងអត្ថបទ</translation> -<translation id="4000398125663085899">រូបថត និងវីដេអូថ្មីនឹងរក្សាទុកក្នុងថតនៅក្នុងកម្មវិធី Files ឥឡូវនេះ៖ ឯកសារខ្ញុំ > កាមេរ៉ា</translation> <translation id="4118525110028899586">ផ្អាកការថត</translation> <translation id="4269820728363426813">ចម្លងអាសយដ្ឋានតំណ</translation> <translation id="4279490309300973883">កំពុងឆ្លុះ</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">ចូលទៅកាន់សាលរូបភាព</translation> <translation id="520537883758714667">ឥឡូវនេះ មានមុខងារស្កេនឯកសារហើយ</translation> <translation id="5268823927180092501">បើកមុខងារឯកសារនៅលើកាមេរ៉ាទាំងអស់</translation> -<translation id="5422455049771430511">រូបថត និងវីដេអូរបស់អ្នកមានកន្លែងទុកថ្មី</translation> <translation id="5444515100983837161">ដាក់គែមឯកសារទាំងអស់នៅក្នុងស៊ុម។ ការស្កេនដំណើរការបានល្អបំផុត ប្រសិនបើឯកសារ និងផ្ទៃខាងក្រោយមានពណ៌ខុសគ្នា។</translation> <translation id="5671277269877808209">ការ៉េ</translation> <translation id="5753488212459587150">បើកមុខងារសម្រាប់អ្នកជំនាញ</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">មុខងារអ្នកជំនាញ</translation> <translation id="5869546221129391014">ក្រឡា</translation> <translation id="5975083100439434680">បង្រួម</translation> -<translation id="6040143037577758943">បិទ</translation> <translation id="6073451960410192870">បញ្ឈប់ការថត</translation> <translation id="6197807149213783179">រក្សាទុកទិន្នន័យមេតា</translation> <translation id="6233780560267770709">3 គុណនឹង 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_kn.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_kn.xtb index 1e93e86b9..edfb8e22 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_kn.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_kn.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">ವೀಡಿಯೊ</translation> <translation id="3838931309141338733">ಬಾರ್ಕೋಡ್ ಸ್ಕ್ಯಾನ್ ಮಾಡಿ</translation> <translation id="3892148308691398805">ಪಠ್ಯ ನಕಲಿಸಿ</translation> -<translation id="4000398125663085899">ಹೊಸ ಫೋಟೋಗಳು ಮತ್ತು ವೀಡಿಯೊಗಳನ್ನು ಈಗ Files ಆ್ಯಪ್ನಲ್ಲಿರುವ ಫೋಲ್ಡರ್ಗೆ ಉಳಿಸಲಾಗುತ್ತದೆ: ನನ್ನ ಫೈಲ್ಗಳು > ಕ್ಯಾಮರಾ</translation> <translation id="4118525110028899586">ರೆಕಾರ್ಡಿಂಗ್ ವಿರಾಮಗೊಳಿಸಿ</translation> <translation id="4269820728363426813">ಲಿಂಕ್ ವಿಳಾಸವನ್ನು ನಕಲಿಸಿ</translation> <translation id="4279490309300973883">ಪ್ರತಿಬಿಂಬಿಸುವಿಕೆ</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">ಗ್ಯಾಲರಿಗೆ ಹೋಗಿ</translation> <translation id="520537883758714667">ಡಾಕ್ಯುಮೆಂಟ್ ಸ್ಕ್ಯಾನಿಂಗ್ ಈಗ ಲಭ್ಯವಿದೆ</translation> <translation id="5268823927180092501">ಎಲ್ಲಾ ಕ್ಯಾಮರಾಗಳಲ್ಲಿ ಡಾಕ್ಯುಮೆಂಟ್ ಮೋಡ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> -<translation id="5422455049771430511">ನಿಮ್ಮ ಫೋಟೋಗಳು ಮತ್ತು ವೀಡಿಯೊಗಳು ಹೊಸ ಹೋಮ್ ಅನ್ನು ಹೊಂದಿವೆ</translation> <translation id="5444515100983837161">ಡಾಕ್ಯುಮೆಂಟ್ನ ಎಲ್ಲಾ ಅಂಚುಗಳನ್ನು ಫ್ರೇಮ್ನೊಳಗೆ ಇರಿಸಿ. ಡಾಕ್ಯುಮೆಂಟ್ ಮತ್ತು ಹಿನ್ನೆಲೆ ವಿಭಿನ್ನ ಬಣ್ಣಗಳಾಗಿದ್ದರೆ ಸ್ಕ್ಯಾನಿಂಗ್ ಉತ್ತಮವಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ.</translation> <translation id="5671277269877808209">ಚೌಕ</translation> <translation id="5753488212459587150">ತಜ್ಞರ ಮೋಡ್ ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">ತಜ್ಞ ಮೋಡ್</translation> <translation id="5869546221129391014">ಗ್ರಿಡ್</translation> <translation id="5975083100439434680">ಝೂಮ್ ಔಟ್</translation> -<translation id="6040143037577758943">ಮುಚ್ಚಿರಿ</translation> <translation id="6073451960410192870">ರೆಕಾರ್ಡಿಂಗ್ ನಿಲ್ಲಿಸಿ</translation> <translation id="6197807149213783179">ಮೆಟಾಡೇಟಾ ಉಳಿಸಿ</translation> <translation id="6233780560267770709">3 x 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ko.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ko.xtb index 52c4d819..8045052 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ko.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ko.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">동영상</translation> <translation id="3838931309141338733">바코드 스캔</translation> <translation id="3892148308691398805">텍스트 복사</translation> -<translation id="4000398125663085899">이제 새로운 사진과 동영상이 Files 앱의 내 파일 > 카메라 폴더에 저장됩니다.</translation> <translation id="4118525110028899586">녹화 일시중지</translation> <translation id="4269820728363426813">링크 주소 복사</translation> <translation id="4279490309300973883">미러링</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">갤러리로 이동</translation> <translation id="520537883758714667">이제 문서를 스캔할 수 있습니다.</translation> <translation id="5268823927180092501">모든 카메라에서 문서 모드 사용 설정</translation> -<translation id="5422455049771430511">사진과 동영상이 새로운 폴더에 저장됩니다</translation> <translation id="5444515100983837161">프레임 안에 문서의 네 모서리를 위치시키세요. 문서와 배경이 서로 다른 색상일 때 스캔이 가장 잘 작동합니다.</translation> <translation id="5671277269877808209">정사각형</translation> <translation id="5753488212459587150">전문가 모드 사용 설정</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">전문가 모드</translation> <translation id="5869546221129391014">격자</translation> <translation id="5975083100439434680">축소</translation> -<translation id="6040143037577758943">닫기</translation> <translation id="6073451960410192870">녹화 중지</translation> <translation id="6197807149213783179">메타데이터 저장</translation> <translation id="6233780560267770709">3x3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ky.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ky.xtb index 2b30850..b5f66cff 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ky.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ky.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Видео</translation> <translation id="3838931309141338733">Штрихкодду скандоо</translation> <translation id="3892148308691398805">Текстти көчүрүү</translation> -<translation id="4000398125663085899">Жаңы сүрөттөр менен видеолор эми Файлдар колдонмосундагы папкага сакталат: Менин файлдарым > Камера</translation> <translation id="4118525110028899586">Видео жаздырууну тындыруу</translation> <translation id="4269820728363426813">Шилтеме дарегин көчүрүү</translation> <translation id="4279490309300973883">Чагылыштыруу</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Галереяга өтүү</translation> <translation id="520537883758714667">Документти скандоо эми жеткиликтүү</translation> <translation id="5268823927180092501">Документ режимин бардык камераларда иштетүү</translation> -<translation id="5422455049771430511">Сүрөттөрүңүз менен видеолоруңуз жаңы үйгө ээ болду</translation> <translation id="5444515100983837161">Документтин бардык бурчтары алкактын ичинде болгондой кылып түздөңүз. Документ жана фон ар кандай түстө болсо, скан жакшыраак иштейт.</translation> <translation id="5671277269877808209">Чарчы</translation> <translation id="5753488212459587150">Адис режимин иштетүү</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Адис режими</translation> <translation id="5869546221129391014">Тор</translation> <translation id="5975083100439434680">Кичирейтүү</translation> -<translation id="6040143037577758943">Жабуу</translation> <translation id="6073451960410192870">Жаздырууну токтотуу</translation> <translation id="6197807149213783179">Метадайындарды сактоо</translation> <translation id="6233780560267770709">3 х 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_lo.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_lo.xtb index 6be9208..4ef336f1 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_lo.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_lo.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">ວິດີໂອ</translation> <translation id="3838931309141338733">ສະແກນບາໂຄດ</translation> <translation id="3892148308691398805">ສຳເນົາຂໍ້ຄວາມ</translation> -<translation id="4000398125663085899">ດຽວນີ້ຮູບພາບ ແລະ ວິດີໂອໃໝ່ຈະຖືກບັນທຶກໄວ້ໃນໂຟນເດີໃນແອັບ Files: ໄຟລ໌ຂອງຂ້ອຍ > ກ້ອງ</translation> <translation id="4118525110028899586">ຢຸດການບັນທຶກໄວ້ຊົ່ວຄາວ</translation> <translation id="4269820728363426813">ກັອບປີ້ທີ່ຢູ່ລິ້ງ</translation> <translation id="4279490309300973883">ການສ່ອງ</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">ໄປທີ່ຄັງຮູບພາບ</translation> <translation id="520537883758714667">ຕອນນີ້ສາມາດສະແກນເອກະສານໄດ້ແລ້ວ</translation> <translation id="5268823927180092501">ເປີດການນຳໃຊ້ໂໝດເອກະສານຢູ່ກ້ອງຖ່າຍຮູບທັງໝົດ</translation> -<translation id="5422455049771430511">ຮູບພາບ ແລະ ວິດີໂອຂອງທ່ານມີໂຟນເດີໃໝ່</translation> <translation id="5444515100983837161">ວາງຂອບທັງໝົດຂອງເອກະສານໄວ້ພາຍໃນເຟຣມ. ການສະແກນເຮັດວຽກໄດ້ດີທີ່ສຸດຫາກເອກະສານ ແລະ ພື້ນຫຼັງເປັນຄົນລະສີກັນ.</translation> <translation id="5671277269877808209">ສີ່ຫຼ່ຽມ</translation> <translation id="5753488212459587150">ເປີດການນຳໃຊ້ໂໝດຜູ້ຊ່ຽວຊານ</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">ໂໝດຜູ້ຊ່ຽວຊານ</translation> <translation id="5869546221129391014">ຕາຂ່າຍ</translation> <translation id="5975083100439434680">ຊູມອອກ</translation> -<translation id="6040143037577758943">ປິດ</translation> <translation id="6073451960410192870">ຢຸດການບັນທຶກ</translation> <translation id="6197807149213783179">ບັນທຶກເມຕາເດຕາໄວ້</translation> <translation id="6233780560267770709">3 ຄູນ 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_lt.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_lt.xtb index 1d0c461..4668fbd 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_lt.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_lt.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Vaizdo</translation> <translation id="3838931309141338733">Nuskaityti brūkšninį kodą</translation> <translation id="3892148308691398805">Kopijuoti tekstą</translation> -<translation id="4000398125663085899">Naujos nuotraukos ir vaizdo įrašai dabar bus išsaugoti aplanke Failų programoje: „Mano failai“ > „Fotoaparatas“</translation> <translation id="4118525110028899586">Pristabdyti įrašymą</translation> <translation id="4269820728363426813">Kopijuoti nuorodos adresą</translation> <translation id="4279490309300973883">Dubliuojama</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Eiti į galeriją</translation> <translation id="520537883758714667">Dabar galima nuskaityti dokumentus</translation> <translation id="5268823927180092501">Įgalinti dokumento režimą visuose fotoaparatuose</translation> -<translation id="5422455049771430511">Nauja vieta jūsų nuotraukoms ir vaizdo įrašams</translation> <translation id="5444515100983837161">Visi dokumento kraštai turi būti rėmelyje. Geriausia nuskaitymo kokybė užtikrinama, kai dokumento ir fono spalvos skiriasi.</translation> <translation id="5671277269877808209">Kvadratas</translation> <translation id="5753488212459587150">Įgalinti eksperto režimą</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Eksperto režimas</translation> <translation id="5869546221129391014">Tinklelis</translation> <translation id="5975083100439434680">Tolinti</translation> -<translation id="6040143037577758943">Uždaryti</translation> <translation id="6073451960410192870">Sustabdyti įrašymą</translation> <translation id="6197807149213783179">Išsaugoti metaduomenis</translation> <translation id="6233780560267770709">3 iš 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_lv.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_lv.xtb index ca69123..d2c40b3 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_lv.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_lv.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3838931309141338733">Skenēt svītrkodu</translation> <translation id="3892148308691398805">Kopēt tekstu</translation> -<translation id="4000398125663085899">Turpmāk jauni fotoattēli un videoklipi tiks saglabāti lietotnes Faili mapē: Mani faili > Kamera</translation> <translation id="4118525110028899586">Pārtraukt ierakstīšanu</translation> <translation id="4269820728363426813">Kopēt saites adresi</translation> <translation id="4279490309300973883">Spoguļošana</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Pāriet uz galeriju</translation> <translation id="520537883758714667">Tagad ir pieejama dokumentu skenēšana</translation> <translation id="5268823927180092501">Iespējot dokumentu režīmu visās kamerās</translation> -<translation id="5422455049771430511">Jauna vieta jūsu fotoattēliem un videoklipiem</translation> <translation id="5444515100983837161">Novietojiet visas dokumenta malas kadrā. Skenēšana darbojas vislabāk, ja dokuments un fons ir atšķirīgā krāsā.</translation> <translation id="5671277269877808209">Kvadrāts</translation> <translation id="5753488212459587150">Iespējot eksperta režīmu</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Eksperta režīms</translation> <translation id="5869546221129391014">Režģis</translation> <translation id="5975083100439434680">Tālināt</translation> -<translation id="6040143037577758943">Aizvērt</translation> <translation id="6073451960410192870">Pārtraukt ierakstīšanu</translation> <translation id="6197807149213783179">Saglabāt metadatus</translation> <translation id="6233780560267770709">3 pa 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_mk.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_mk.xtb index 6c714a3..e80ceec 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_mk.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_mk.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Видео</translation> <translation id="3838931309141338733">Скенирајте го бар-кодот</translation> <translation id="3892148308691398805">Копирај текст</translation> -<translation id="4000398125663085899">Новите фотографии и видеа отсега ќе се зачувуваат во папка во апликацијата „Датотеки“: „Мои датотеки > Камера“</translation> <translation id="4118525110028899586">Паузирај го снимањето</translation> <translation id="4269820728363426813">Копирај адреса на врска</translation> <translation id="4279490309300973883">Отсликување</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Оди во галеријата</translation> <translation id="520537883758714667">Отсега е достапно скенирање документи</translation> <translation id="5268823927180092501">Овозможи режим на документ за сите камери</translation> -<translation id="5422455049771430511">Нов дом за вашите фотографии и видеа</translation> <translation id="5444515100983837161">Поставете ги сите рабови на документот во рамката. Скенирањето функционира најдобро кога документот и заднината имаат различни бои.</translation> <translation id="5671277269877808209">Квадрат</translation> <translation id="5753488212459587150">Овозможи режим на експерт</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Експертски режим</translation> <translation id="5869546221129391014">Мрежа</translation> <translation id="5975083100439434680">Одзумирај</translation> -<translation id="6040143037577758943">Затвори</translation> <translation id="6073451960410192870">Сопри со снимање</translation> <translation id="6197807149213783179">Зачувувај метаподатоци</translation> <translation id="6233780560267770709">3 на 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ml.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ml.xtb index 48ef7992..d4b70dd 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ml.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ml.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">വീഡിയോ</translation> <translation id="3838931309141338733">ബാർകോഡ് സ്കാൻ ചെയ്യുക</translation> <translation id="3892148308691398805">ടെക്സ്റ്റ് പകർത്തുക</translation> -<translation id="4000398125663085899">പുതിയ ഫോട്ടോകളും വീഡിയോകളും ഇപ്പോൾ Files ആപ്പ്: എന്റെ ഫയലുകൾ > ക്യാമറ എന്നതിലെ ഒരു ഫോൾഡറിലേക്ക് സംരക്ഷിക്കും</translation> <translation id="4118525110028899586">റെക്കോർഡ് ചെയ്യൽ തൽക്കാലം നിർത്തുക</translation> <translation id="4269820728363426813">ലിങ്ക് വിലാസം പകർത്തുക</translation> <translation id="4279490309300973883">മിററിംഗ്</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">ഗാലറിയിലേക്ക് പോവുക</translation> <translation id="520537883758714667">ഡോക്യുമെന്റ് സ്കാൻ ചെയ്യൽ ഇപ്പോൾ ലഭ്യമാണ്</translation> <translation id="5268823927180092501">എല്ലാ ക്യാമറകളിലും ഡോക്യുമെന്റ് മോഡ് പ്രവർത്തനക്ഷമമാക്കുക</translation> -<translation id="5422455049771430511">നിങ്ങളുടെ ഫോട്ടോകൾക്കും വീഡിയോകൾക്കും ഒരു പുതിയ ഇടം</translation> <translation id="5444515100983837161">ഡോക്യുമെന്റിന്റെ എല്ലാ അരികുകളും ഫ്രെയിമിനകത്ത് വയ്ക്കുക. ഡോക്യുമെന്റും അതിന്റെ പശ്ചാത്തലവും വ്യത്യസ്ത നിറങ്ങളിലാണെങ്കിൽ സ്കാൻ ചെയ്യൽ മികച്ച രീതിയിൽ പ്രവർത്തിക്കുന്നു.</translation> <translation id="5671277269877808209">ചതുരം</translation> <translation id="5753488212459587150">വിദഗ്ദ്ധ മോഡ് പ്രവർത്തനക്ഷമമാക്കുക</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">വിദഗ്ദ്ധ മോഡ്</translation> <translation id="5869546221129391014">ഗ്രിഡ്</translation> <translation id="5975083100439434680">സൂം ഔട്ട് ചെയ്യുക</translation> -<translation id="6040143037577758943">അടയ്ക്കുക</translation> <translation id="6073451960410192870">റെക്കോർഡിംഗ് നിർത്തുക</translation> <translation id="6197807149213783179">മെറ്റാഡാറ്റ സംരക്ഷിക്കുക</translation> <translation id="6233780560267770709">3 ബൈ 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_mn.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_mn.xtb index 12c4fb6..1234cae2 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_mn.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_mn.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Видео</translation> <translation id="3838931309141338733">Баркодыг скан хийх</translation> <translation id="3892148308691398805">Текстийг хуулах</translation> -<translation id="4000398125663085899">Шинэ зургууд болон видеонуудыг одоо Файлс апп: Миний файлууд > Камер дахь фолдерт хадгална</translation> <translation id="4118525110028899586">Бичлэгийг түр зогсоох</translation> <translation id="4269820728363426813">Холбоосын хаягийг хуулах</translation> <translation id="4279490309300973883">Толин тусгал үүсгэх</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Галлерей руу очих</translation> <translation id="520537883758714667">Одоо документ скан хийх боломжтой боллоо</translation> <translation id="5268823927180092501">Бүх камерт документын горимыг идэвхжүүлэх</translation> -<translation id="5422455049771430511">Таны зураг болон видеонууд шинэ гэртэй боллоо</translation> <translation id="5444515100983837161">Документын бүх ирмэгийг хүрээнд байрлуулна уу. Документ болон дэвсгэр өөр өөр өнгөтэй тохиолдолд илүү сайн скан хийнэ.</translation> <translation id="5671277269877808209">Дөрвөлжин</translation> <translation id="5753488212459587150">Мэргэжилтний горимыг идэвхжүүлэх</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Мэргэжилтэн горим</translation> <translation id="5869546221129391014">Сүлжээний тор</translation> <translation id="5975083100439434680">Багасгаж харах</translation> -<translation id="6040143037577758943">Хаах</translation> <translation id="6073451960410192870">Бичихийг зогсоох</translation> <translation id="6197807149213783179">Мета өгөгдлийг хадгалах</translation> <translation id="6233780560267770709">3-г харьцах нь 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_mr.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_mr.xtb index 70914148..a9147c0 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_mr.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_mr.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">व्हिडिओ</translation> <translation id="3838931309141338733">बारकोड स्कॅन करा</translation> <translation id="3892148308691398805">मजकूर कॉपी करा</translation> -<translation id="4000398125663085899">नवीन फोटो आणि व्हिडिओ आता Files ॲपमधील फोल्डरमध्ये सेव्ह केले जातील: माझ्या फाइल > कॅमेरा</translation> <translation id="4118525110028899586">रेकॉर्डिंग थांबवा</translation> <translation id="4269820728363426813">लिंकचा पत्ता कॉपी करा</translation> <translation id="4279490309300973883">मिररिंग</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">गॅलरीवर जा</translation> <translation id="520537883758714667">दस्तऐवज स्कॅन करणे आता उपलब्ध आहे</translation> <translation id="5268823927180092501">सर्व कॅमेरावर दस्तऐवज मोड सुरू करा</translation> -<translation id="5422455049771430511">तुमच्या फोटो आणि व्हिडिओंना नवीन घर मिळाले आहे</translation> <translation id="5444515100983837161">दस्तऐवजाच्या सर्व कडा फ्रेमच्या आत ठेवा. दस्तऐवज आणि बॅकग्राउंड हे दोन्ही वेगळ्या रंगांचे असल्यास, आणखी चांगल्या प्रकारे स्कॅन करता येते.</translation> <translation id="5671277269877808209">चौरस</translation> <translation id="5753488212459587150">एक्सपोर्ट मोड सुरू करा</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">एक्सपोर्ट मोड</translation> <translation id="5869546221129391014">ग्रिड</translation> <translation id="5975083100439434680">झूम कमी करा</translation> -<translation id="6040143037577758943">बंद करा</translation> <translation id="6073451960410192870">रेकॉर्डिंग थांबवा</translation> <translation id="6197807149213783179">मेटाडेटा सेव्ह करा</translation> <translation id="6233780560267770709">३ बाय ३</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ms.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ms.xtb index eeb291d..2a3c96e 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ms.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ms.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3838931309141338733">Imbas kod bar</translation> <translation id="3892148308691398805">Salin teks</translation> -<translation id="4000398125663085899">Kini foto dan video baharu akan disimpan pada folder dalam apl Files: Fail saya > Kamera</translation> <translation id="4118525110028899586">Jeda rakaman</translation> <translation id="4269820728363426813">Salin alamat pautan</translation> <translation id="4279490309300973883">Pencerminan</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Pergi ke galeri</translation> <translation id="520537883758714667">Kini pengimbasan dokumen tersedia</translation> <translation id="5268823927180092501">Dayakan mod dokumen pada semua kamera</translation> -<translation id="5422455049771430511">Foto dan video anda mempunyai wadah baharu</translation> <translation id="5444515100983837161">Pastikan keempat-empat sisi dokumen berada dalam bingkai. Pengimbasan berfungsi pada tahap terbaik jika warna dokumen dan latar belakang adalah berbeza.</translation> <translation id="5671277269877808209">Segi empat sama</translation> <translation id="5753488212459587150">Dayakan mod pakar</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Mod pakar</translation> <translation id="5869546221129391014">Grid</translation> <translation id="5975083100439434680">Zum keluar</translation> -<translation id="6040143037577758943">Tutup</translation> <translation id="6073451960410192870">Hentikan rakaman</translation> <translation id="6197807149213783179">Simpan metadata</translation> <translation id="6233780560267770709">3 kali 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_my.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_my.xtb index ad6c2098..c463655 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_my.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_my.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">ဗီဒီယို</translation> <translation id="3838931309141338733">ဘားကုဒ်ကို စကင်ဖတ်ရန်</translation> <translation id="3892148308691398805">စာသား မိတ္တူကူးရန်</translation> -<translation id="4000398125663085899">ဓာတ်ပုံနှင့် ဗီဒီယိုအသစ်များကို Files အက်ပ်ရှိ ဤဖိုင်တွဲသို့ ယခုသိမ်းလိုက်ပါမည်- ကျွန်ုပ်၏ဖိုင်များ > ကင်မရာ</translation> <translation id="4118525110028899586">ရိုက်ကူးမှု ခဏရပ်ရန်</translation> <translation id="4269820728363426813">လင့် လိပ်စာ ကူးယူရန်</translation> <translation id="4279490309300973883">ထင်ဟပ်ပေးနေ</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">ပြခန်းသို့ သွားရန်</translation> <translation id="520537883758714667">မှတ်တမ်းဖိုင်ကို ယခု စကင်ဖတ်နိုင်ပါပြီ</translation> <translation id="5268823927180092501">ကင်မရာအားလုံးတွင် မှတ်တမ်းမုဒ် ဖွင့်ရန်</translation> -<translation id="5422455049771430511">သင့်ဓာတ်ပုံနှင့် ဗီဒီယိုများအတွက် နေရာအသစ် ရသွားပါပြီ</translation> <translation id="5444515100983837161">မှတ်တမ်းဖိုင်၏ အစွန်းအားလုံးကို ဘောင်အတွင်းထားပါ။ မှတ်တမ်းဖိုင်နှင့် နောက်ခံတို့သည် အရောင်မတူလျှင် စကင် အကောင်းဆုံး ဖတ်နိုင်သည်။</translation> <translation id="5671277269877808209">စတုရန်း</translation> <translation id="5753488212459587150">ကျွမ်းကျင်သူမုဒ် ဖွင့်ရန်</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">ကျွမ်းကျင်မုဒ်</translation> <translation id="5869546221129391014">လိုင်းကွက်</translation> <translation id="5975083100439434680">ဇူးမ်ဖြုတ်ရန်</translation> -<translation id="6040143037577758943">ပိတ်ရန်</translation> <translation id="6073451960410192870">ကူးယူမှု ရပ်ရန်</translation> <translation id="6197807149213783179">မက်တာဒေတာကို သိမ်းရန်</translation> <translation id="6233780560267770709">အလျား ၃၊ အနံ ၃</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ne.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ne.xtb index d04a230..3a306b8 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ne.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ne.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">भिडियो</translation> <translation id="3838931309141338733">बारकोड स्क्यान गर्नुहोस्</translation> <translation id="3892148308691398805">पाठ कपी गर्नुहोस्</translation> -<translation id="4000398125663085899">अब नयाँ फोटो तथा भिडियोहरू Files एपको फोल्डर अर्थात् "मेरा फाइल > क्यामेरा" मा सुरक्षित गरिने छन्</translation> <translation id="4118525110028899586">रेकर्डिङ पज गर्नुहोस्</translation> <translation id="4269820728363426813">लिङ्क ठेगाना कपी गर्नुहोस्</translation> <translation id="4279490309300973883">प्रतिबिम्ब गर्दै</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">ग्यालेरीमा जानुहोस्</translation> <translation id="520537883758714667">तपाईं अब डकुमेन्ट स्क्यान गर्न सक्नुहुन्छ</translation> <translation id="5268823927180092501">सबै क्यामेराहरूमा डकुमेन्ट मोड अन गरियोस्</translation> -<translation id="5422455049771430511">अब तपाईंका फोटो तथा भिडियोहरू नयाँ फोल्डरमा सुरक्षित गरिने छन्</translation> <translation id="5444515100983837161">डकुमेन्टका सबै किनारा फ्रेमभित्र पार्नुहोस्। डकुमेन्ट र पृष्ठभूमि बेग्लाबेग्लै रङका भएका खण्डमा स्क्यान गर्ने सुविधाले सबैभन्दा राम्ररी काम गर्छ।</translation> <translation id="5671277269877808209">वर्गाकार</translation> <translation id="5753488212459587150">विशेषज्ञ मोड अन गर्नुहोस्</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">विशेषज्ञ मोड</translation> <translation id="5869546221129391014">ग्रिड</translation> <translation id="5975083100439434680">जुम आउट</translation> -<translation id="6040143037577758943">बन्द गर्नुहोस्</translation> <translation id="6073451960410192870">रेकर्ड गर्न छाड्नुहोस्</translation> <translation id="6197807149213783179">मेटाडेटा सेभ गर्नुहोस्</translation> <translation id="6233780560267770709">३ गुणा ३</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_nl.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_nl.xtb index 57109fc..6b42217 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_nl.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_nl.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3838931309141338733">Streepjescode scannen</translation> <translation id="3892148308691398805">Tekst kopiëren</translation> -<translation id="4000398125663085899">Nieuwe foto's en video's worden nu opgeslagen in een map in de app Bestanden: Mijn bestanden > Camera</translation> <translation id="4118525110028899586">Opname onderbreken</translation> <translation id="4269820728363426813">Linkadres kopiëren</translation> <translation id="4279490309300973883">Mirroring</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Naar galerij</translation> <translation id="520537883758714667">Documenten scannen is nu beschikbaar</translation> <translation id="5268823927180092501">Documentmodus aanzetten voor alle camera's</translation> -<translation id="5422455049771430511">Je foto's en video's staan op een nieuwe plaats</translation> <translation id="5444515100983837161">Plaats alle randen van het document binnen het frame. Scannen werkt het beste als het document en de achtergrond een verschillende kleur hebben.</translation> <translation id="5671277269877808209">Vierkant</translation> <translation id="5753488212459587150">Expertmodus aanzetten</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Expertmodus</translation> <translation id="5869546221129391014">Raster</translation> <translation id="5975083100439434680">Uitzoomen</translation> -<translation id="6040143037577758943">Sluiten</translation> <translation id="6073451960410192870">Opname stoppen</translation> <translation id="6197807149213783179">Metadata opslaan</translation> <translation id="6233780560267770709">3 bij 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_no.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_no.xtb index e34b477c..17b0d60 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_no.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_no.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3838931309141338733">Skann strekkoden</translation> <translation id="3892148308691398805">Kopiér teksten</translation> -<translation id="4000398125663085899">Nye bilder og videoer lagres nå i en mappe i Filer-appen: Mine filer > Kamera</translation> <translation id="4118525110028899586">Sett opptaket på pause</translation> <translation id="4269820728363426813">Kopiér linkadressen</translation> <translation id="4279490309300973883">Speiling</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Gå til galleriet</translation> <translation id="520537883758714667">Dokumentskanning er nå tilgjengelig</translation> <translation id="5268823927180092501">Slå på dokumentmodus på alle kameraer</translation> -<translation id="5422455049771430511">Bildene og videoene dine har fått et nytt hjem</translation> <translation id="5444515100983837161">Plassér alle hjørnene av dokumentet innenfor rammen. Skanning fungerer best hvis dokumentet og bakgrunnen har ulik farge.</translation> <translation id="5671277269877808209">Kvadrat</translation> <translation id="5753488212459587150">Slå på ekspertmodus</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Ekspertmodus</translation> <translation id="5869546221129391014">Rutenett</translation> <translation id="5975083100439434680">Zoom ut</translation> -<translation id="6040143037577758943">Lukk</translation> <translation id="6073451960410192870">Stopp opptaket</translation> <translation id="6197807149213783179">Lagre metadata</translation> <translation id="6233780560267770709">3 ganger 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_or.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_or.xtb index b52bbc9..a2f6241e 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_or.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_or.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">ଭିଡିଓ</translation> <translation id="3838931309141338733">ବାରକୋଡ୍ ସ୍କାନ୍ କରନ୍ତୁ</translation> <translation id="3892148308691398805">ଟେକ୍ସଟ୍ କପି କରନ୍ତୁ</translation> -<translation id="4000398125663085899">ନୂଆ ଫଟୋ ଏବଂ ଭିଡିଓଗୁଡ଼ିକ ବର୍ତ୍ତମାନ Files ଆପରେ ଏକ ଫୋଲ୍ଡରରେ ସେଭ୍ କରାଯିବ: ମୋ ଫାଇଲ୍ > କ୍ୟାମେରା</translation> <translation id="4118525110028899586">ରେକର୍ଡିଂ ବିରତ କରନ୍ତୁ</translation> <translation id="4269820728363426813">ଲିଙ୍କ୍ ଠିକଣା କପି କରନ୍ତୁ</translation> <translation id="4279490309300973883">ପ୍ରତିଫଳନ</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">ଗ୍ୟାଲେରୀକୁ ଯାଆନ୍ତୁ</translation> <translation id="520537883758714667">ଡକ୍ୟୁମେଣ୍ଟ ସ୍କାନ୍ କରିବା ସୁବିଧା ବର୍ତ୍ତମାନ ଉପଲବ୍ଧ ଅଛି</translation> <translation id="5268823927180092501">ସବୁ କ୍ୟାମେରାରେ ଡକ୍ୟୁମେଣ୍ଟ ମୋଡ୍ ସକ୍ଷମ କରନ୍ତୁ</translation> -<translation id="5422455049771430511">ବର୍ତ୍ତମାନ ଆପଣଙ୍କ ଫଟୋ ଏବଂ ଭିଡିଓଗୁଡ଼ିକ ପାଇଁ ଏକ ନୂଆ ସ୍ଥାନ ଉପଲବ୍ଧ ଅଛି</translation> <translation id="5444515100983837161">ଡକ୍ୟୁମେଣ୍ଟର ସମସ୍ତ ଧାରକୁ ଫ୍ରେମ୍ ଭିତରେ ରଖନ୍ତୁ। ଯଦି ଡକ୍ୟୁମେଣ୍ଟ ଏବଂ ପୃଷ୍ଠପଟ ଭିନ୍ନ ରଙ୍ଗର ହୋଇଥାଏ ତେବେ ସ୍କାନିଂ ଭଲ କାମ କରେ।</translation> <translation id="5671277269877808209">ବର୍ଗାକାର</translation> <translation id="5753488212459587150">ଏକ୍ସପର୍ଟ ମୋଡ୍ ସକ୍ଷମ କରନ୍ତୁ</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">ଏକ୍ସପାର୍ଟ ମୋଡ୍</translation> <translation id="5869546221129391014">ଗ୍ରିଡ୍</translation> <translation id="5975083100439434680">ଜୁମ୍ କମାନ୍ତୁ</translation> -<translation id="6040143037577758943">ବନ୍ଦ</translation> <translation id="6073451960410192870">ରେକର୍ଡିଂ ବନ୍ଦ କରନ୍ତୁ</translation> <translation id="6197807149213783179">ମେଟାଡାଟା ସେଭ୍ କରନ୍ତୁ</translation> <translation id="6233780560267770709">3 ଗୁଣନ 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pa.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pa.xtb index 2c7f9af9..52af106 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pa.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pa.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">ਵੀਡਿਓ</translation> <translation id="3838931309141338733">ਬਾਰਕੋਡ ਸਕੈਨ ਕਰੋ</translation> <translation id="3892148308691398805">ਲਿਖਤ ਕਾਪੀ ਕਰੋ</translation> -<translation id="4000398125663085899">ਨਵੀਆਂ ਫ਼ੋਟੋਆਂ ਅਤੇ ਵੀਡੀਓ ਨੂੰ ਹੁਣ Files ਐਪ ਵਿੱਚ ਕਿਸੇ ਫੋਲਡਰ: ਮੇਰੀਆਂ ਫ਼ਾਈਲਾਂ > ਕੈਮਰੇ ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾਵੇਗਾ</translation> <translation id="4118525110028899586">ਰਿਕਾਰਡਿੰਗ ਰੋਕੋ</translation> <translation id="4269820728363426813">ਲਿੰਕ ਪਤਾ ਕਾਪੀ ਕਰੋ</translation> <translation id="4279490309300973883">ਪ੍ਰਤਿਬਿੰਬੀਕਰਨ</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">ਗੈਲਰੀ 'ਤੇ ਜਾਓ</translation> <translation id="520537883758714667">ਦਸਤਾਵੇਜ਼ ਸਕੈਨਿੰਗ ਵਿਸ਼ੇਸ਼ਤਾ ਹੁਣ ਉਪਲਬਧ ਹੈ</translation> <translation id="5268823927180092501">ਸਾਰੇ ਕੈਮਰਿਆਂ ਵਿੱਚ ਦਸਤਾਵੇਜ਼ ਮੋਡ ਚਾਲੂ ਕਰੋ</translation> -<translation id="5422455049771430511">ਤੁਹਾਡੀਆਂ ਫ਼ੋਟੋਆਂ ਅਤੇ ਵੀਡੀਓ ਲਈ ਨਵੀਂ ਜਗ੍ਹਾ</translation> <translation id="5444515100983837161">ਦਸਤਾਵੇਜ਼ ਦੇ ਸਾਰੇ ਕਿਨਾਰਿਆਂ ਨੂੰ ਫ੍ਰੇਮ ਦੇ ਅੰਦਰ ਹੀ ਰੱਖੋ। ਜੇ ਦਸਤਾਵੇਜ਼ ਅਤੇ ਬੈਕਗ੍ਰਾਊਂਡ ਵੱਖਰੇ ਰੰਗ ਦੇ ਹੋਣ ਤਾਂ ਸਕੈਨਿੰਗ ਵਿਸ਼ੇਸ਼ਤਾ ਬਿਹਤਰੀਨ ਢੰਗ ਨਾਲ ਕੰਮ ਕਰਦੀ ਹੈ।</translation> <translation id="5671277269877808209">ਵਰਗ</translation> <translation id="5753488212459587150">ਮਾਹਰ ਮੋਡ ਚਾਲੂ ਕਰੋ</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">ਮਾਹਰ ਮੋਡ</translation> <translation id="5869546221129391014">ਗ੍ਰਿਡ</translation> <translation id="5975083100439434680">ਜ਼ੂਮ ਘਟਾਓ</translation> -<translation id="6040143037577758943">ਬੰਦ ਕਰੋ</translation> <translation id="6073451960410192870">ਰਿਕਾਰਡਿੰਗ ਬੰਦ ਕਰੋ</translation> <translation id="6197807149213783179">ਮੈਟਾਡਾਟਾ ਰੱਖਿਅਤ ਕਰੋ</translation> <translation id="6233780560267770709">3 ਗੁਣਾ 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pl.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pl.xtb index 9f9220a..dbd429b 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pl.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pl.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Wideo</translation> <translation id="3838931309141338733">Zeskanuj kod kreskowy</translation> <translation id="3892148308691398805">Kopiuj tekst</translation> -<translation id="4000398125663085899">Nowe zdjecia i filmy będą teraz zapisywane w folderze w aplikacji Pliki: Moje pliki > Aparat</translation> <translation id="4118525110028899586">Wstrzymaj nagrywanie</translation> <translation id="4269820728363426813">Kopiuj adres linku</translation> <translation id="4279490309300973883">Odbicie lustrzane</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Otwórz galerię</translation> <translation id="520537883758714667">Skanowanie dokumentów jest teraz dostępne</translation> <translation id="5268823927180092501">Włącz tryb dokumentu dla wszystkich aparatów</translation> -<translation id="5422455049771430511">Masz nowe miejsce na zdjęcia i filmy</translation> <translation id="5444515100983837161">Wszystkie krawędzie dokumentu muszą znaleźć się wewnątrz ramki. Skanowanie działa najlepiej, jeśli dokument i tło mają różne kolory.</translation> <translation id="5671277269877808209">Kwadrat</translation> <translation id="5753488212459587150">Włącz tryb eksperta</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Tryb eksperta</translation> <translation id="5869546221129391014">Siatka</translation> <translation id="5975083100439434680">Pomniejsz</translation> -<translation id="6040143037577758943">Zamknij</translation> <translation id="6073451960410192870">Zatrzymaj nagrywanie</translation> <translation id="6197807149213783179">Zapisz metadane</translation> <translation id="6233780560267770709">3 na 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb index dd31ba2..90e1ba9 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Vídeo</translation> <translation id="3838931309141338733">Ler código de barras</translation> <translation id="3892148308691398805">Copiar texto</translation> -<translation id="4000398125663085899">Novos vídeos e fotos serão salvos em uma pasta no app Arquivos: Meus arquivos > Câmera</translation> <translation id="4118525110028899586">Pausar gravação</translation> <translation id="4269820728363426813">Copiar endereço do link</translation> <translation id="4279490309300973883">Espelhamento</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Ir para a galeria</translation> <translation id="520537883758714667">A digitalização de documentos está disponível</translation> <translation id="5268823927180092501">Ativar o modo de documento em todas as câmeras</translation> -<translation id="5422455049771430511">Suas fotos e seus vídeos estão de casa nova</translation> <translation id="5444515100983837161">Posicione todas as bordas do documento dentro do quadro. A digitalização funciona melhor quando o documento e o plano de fundo têm cores diferentes.</translation> <translation id="5671277269877808209">Quadrado</translation> <translation id="5753488212459587150">Ativar o modo Especialista</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Modo Especialista</translation> <translation id="5869546221129391014">Grade</translation> <translation id="5975083100439434680">Diminuir zoom</translation> -<translation id="6040143037577758943">Fechar</translation> <translation id="6073451960410192870">Parar de gravar</translation> <translation id="6197807149213783179">Salvar metadados</translation> <translation id="6233780560267770709">3 por 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb index 02f6796..5bca94f 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Vídeo</translation> <translation id="3838931309141338733">Ler código de barras</translation> <translation id="3892148308691398805">Copiar texto</translation> -<translation id="4000398125663085899">As fotos e os vídeos novos serão agora guardados numa pasta na app Files: Os meus ficheiros > Câmara.</translation> <translation id="4118525110028899586">Interromper gravação</translation> <translation id="4269820728363426813">Copiar endereço do link</translation> <translation id="4279490309300973883">Espelhamento</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Ir para a galeria</translation> <translation id="520537883758714667">A digitalização de documentos já está disponível</translation> <translation id="5268823927180092501">Ativar modo de documento em todas as câmaras</translation> -<translation id="5422455049771430511">As suas fotos e vídeos têm uma nova localização</translation> <translation id="5444515100983837161">Posicione todas as margens do documento dentro da moldura. A digitalização funciona melhor se o documento e o fundo tiverem cores diferentes.</translation> <translation id="5671277269877808209">Quadrado</translation> <translation id="5753488212459587150">Ativar modo Especialista</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Modo Especialista</translation> <translation id="5869546221129391014">Grelha</translation> <translation id="5975083100439434680">Reduzir</translation> -<translation id="6040143037577758943">Fechar</translation> <translation id="6073451960410192870">Parar gravação</translation> <translation id="6197807149213783179">Guardar metadados</translation> <translation id="6233780560267770709">3 por 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ro.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ro.xtb index 41c217c..bdeb8a5 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ro.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ro.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3838931309141338733">Scanează codul de bare</translation> <translation id="3892148308691398805">Copiază textul</translation> -<translation id="4000398125663085899">De acum, fotografiile și videoclipurile noi se vor salva într-un dosar în aplicația Fișiere: Fișierele mele > Cameră foto</translation> <translation id="4118525110028899586">Întrerupe înregistrarea</translation> <translation id="4269820728363426813">Copiază adresa linkului</translation> <translation id="4279490309300973883">Oglindire</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Accesează galeria</translation> <translation id="520537883758714667">Scanarea documentelor este acum disponibilă</translation> <translation id="5268823927180092501">Activează modul documentare pentru toate camerele</translation> -<translation id="5422455049771430511">Fotografiile și videoclipurile se salvează într-o nouă locație</translation> <translation id="5444515100983837161">Încadrează toate marginile documentului în cadru. Scanarea funcționează optim dacă documentul și fundalul sunt de culori diferite.</translation> <translation id="5671277269877808209">Pătrat</translation> <translation id="5753488212459587150">Activează modul expert</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Modul expert</translation> <translation id="5869546221129391014">Grilă</translation> <translation id="5975083100439434680">Micșorează</translation> -<translation id="6040143037577758943">Închide</translation> <translation id="6073451960410192870">Oprește înregistrarea</translation> <translation id="6197807149213783179">Salvează metadatele</translation> <translation id="6233780560267770709">3 pe 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ru.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ru.xtb index 53b48d1..63f75ff 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ru.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ru.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Видео</translation> <translation id="3838931309141338733">Сканировать штрихкод</translation> <translation id="3892148308691398805">Копировать текст</translation> -<translation id="4000398125663085899">Для них предназначена новая папка в приложении "Файлы" (Мои файлы > Камера).</translation> <translation id="4118525110028899586">Приостановить запись</translation> <translation id="4269820728363426813">Копировать адрес ссылки</translation> <translation id="4279490309300973883">Отражение</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Перейти в галерею</translation> <translation id="520537883758714667">Доступно сканирование документов.</translation> <translation id="5268823927180092501">Включить режим документа на всех камерах</translation> -<translation id="5422455049771430511">Теперь фото и видео сохраняются в другой папке</translation> <translation id="5444515100983837161">Расположите документ внутри рамки. Для повышения качества отсканированного изображения цвета документа и фона должны различаться.</translation> <translation id="5671277269877808209">Квадрат</translation> <translation id="5753488212459587150">Включить режим эксперта</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Режим эксперта</translation> <translation id="5869546221129391014">Сетка</translation> <translation id="5975083100439434680">Уменьшить</translation> -<translation id="6040143037577758943">Закрыть</translation> <translation id="6073451960410192870">Остановить запись</translation> <translation id="6197807149213783179">Сохранение метаданных</translation> <translation id="6233780560267770709">3 на 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_si.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_si.xtb index 038befe..ff4fabf 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_si.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_si.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">වීඩියෝ</translation> <translation id="3838931309141338733">තීරු කේතය ස්කෑන් කරන්න</translation> <translation id="3892148308691398805">පෙළ පිටපත් කරන්න</translation> -<translation id="4000398125663085899">නව ඡායාරූප සහ වීඩියෝ දැන් ගොනු යෙදුම තුළ ෆෝල්ඩරයකට සුරකිනු ඇත: මගේ ගොනු > කැමරාව</translation> <translation id="4118525110028899586">පටිගත කිරීම විරාම කරන්න</translation> <translation id="4269820728363426813">ලින්ක් ලිපිනය පිටපත් කරන්න</translation> <translation id="4279490309300973883">ආදර්ශනය කරමින්</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">ගැලරියට යන්න</translation> <translation id="520537883758714667">ලේඛන ස්කෑන් කිරීම දැන් ලබා ගත හැකිය</translation> <translation id="5268823927180092501">සියලු කැමරාවල ලේඛන ප්රකාරය සබල කරන්න</translation> -<translation id="5422455049771430511">ඔබගේ ඡායාරූප සහ වීඩියෝවලට නව මුල් පිටුවක් ඇත</translation> <translation id="5444515100983837161">ලේඛනයේ සියලු මායිම් රාමුව තුළ තබන්න. ලේඛනය සහ පසුබිම විවිධ වර්ණවලින් යුතු නම් ස්කෑන් කිරීම වඩාත්ම හොඳින් ක්රියා කරයි.</translation> <translation id="5671277269877808209">සමචතුරස්රය</translation> <translation id="5753488212459587150">විශේෂඥ ප්රකාරය සබල කරන්න</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">ප්රවීණ ප්රකාරය</translation> <translation id="5869546221129391014">ජාලය</translation> <translation id="5975083100439434680">විශාලනය අඩු කරන්න</translation> -<translation id="6040143037577758943">වසන්න</translation> <translation id="6073451960410192870">පටිගත කිරීම නැවැත්වීම</translation> <translation id="6197807149213783179">පාරදත්ත සුරකින්න</translation> <translation id="6233780560267770709">3 න් 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sk.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sk.xtb index c69b411..2fe50c74 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sk.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sk.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3838931309141338733">Skenovať čiarový kód</translation> <translation id="3892148308691398805">Kopírovať text</translation> -<translation id="4000398125663085899">Nové fotky a videá sa budú odteraz ukladať do priečinka v aplikácii Súbory: Moje súbory > Kamera</translation> <translation id="4118525110028899586">Pozastaviť nahrávanie</translation> <translation id="4269820728363426813">Kopírovať adresu odkazu</translation> <translation id="4279490309300973883">Zrkadlenie</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Prejsť do galérie</translation> <translation id="520537883758714667">Skenovanie dokumentov je teraz k dispozícii</translation> <translation id="5268823927180092501">Zapnúť režim dokumentov vo všetkých fotoaparátoch</translation> -<translation id="5422455049771430511">Fotky a videá nájdete v novom priečinku</translation> <translation id="5444515100983837161">Umiestnite všetky rohy dokumentu do rámu. Skenovanie funguje najlepšie vtedy, keď má dokument inú farbu ako pozadie.</translation> <translation id="5671277269877808209">Štvorec</translation> <translation id="5753488212459587150">Povoliť expertný režim</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Expertný režim</translation> <translation id="5869546221129391014">Mriežka</translation> <translation id="5975083100439434680">Oddialiť</translation> -<translation id="6040143037577758943">Zavrieť</translation> <translation id="6073451960410192870">Zastaviť zaznamenávanie</translation> <translation id="6197807149213783179">Uložiť metadáta</translation> <translation id="6233780560267770709">3 na 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sl.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sl.xtb index 2a027b1f..eeb6458 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sl.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sl.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3838931309141338733">Optično branje črtne kode</translation> <translation id="3892148308691398805">Kopiraj besedilo</translation> -<translation id="4000398125663085899">Nove fotografije in videoposnetki bodo zdaj shranjeni v mapo v aplikaciji Datoteke: Moje datoteke > Fotoaparat.</translation> <translation id="4118525110028899586">Začasna zaustavitev snemanja</translation> <translation id="4269820728363426813">Kopiraj naslov povezave</translation> <translation id="4279490309300973883">Zrcaljenje</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">V galerijo</translation> <translation id="520537883758714667">Optično branje dokumentov je zdaj na voljo</translation> <translation id="5268823927180092501">Omogočanje načina dokumentov v vseh fotoaparatih</translation> -<translation id="5422455049771430511">Fotografije in videoposnetki imajo novi dom</translation> <translation id="5444515100983837161">Postavite vse robe dokumenta znotraj okvira. Optično branje deluje najbolje, če sta dokument in ozadje različnih barv.</translation> <translation id="5671277269877808209">Kvadratno</translation> <translation id="5753488212459587150">Omogoči poznavalski način</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Poznavalski način</translation> <translation id="5869546221129391014">Mreža</translation> <translation id="5975083100439434680">Pomanjšaj</translation> -<translation id="6040143037577758943">Zapri</translation> <translation id="6073451960410192870">Ustavi snemanje</translation> <translation id="6197807149213783179">Shrani metapodatke</translation> <translation id="6233780560267770709">3 x 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sq.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sq.xtb index 67f90abd..cc8b41e 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sq.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sq.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3838931309141338733">Skano bardkodin</translation> <translation id="3892148308691398805">Kopjo tekstin</translation> -<translation id="4000398125663085899">Fotografitë dhe videot e reja tani do të ruhen në një dosje në aplikacionin "Skedarët": Skedarët e mi > Kamera</translation> <translation id="4118525110028899586">Vendose në pauzë regjistrimin</translation> <translation id="4269820728363426813">Kopjo adresën e lidhjes</translation> <translation id="4279490309300973883">Pasqyrim</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Shko te galeria</translation> <translation id="520537883758714667">Skanimi i dokumenteve ofrohet tani</translation> <translation id="5268823927180092501">Aktivizo modalitetin e dokumenteve në të gjitha kamerat</translation> -<translation id="5422455049771430511">Fotografitë dhe videot e tua kanë një shtëpi të re</translation> <translation id="5444515100983837161">Vendos të gjitha anët e dokumentit brenda kuadrit Skanimi funksionon më mirë nëse dokumenti dhe sfondi kanë ngjyra të ndryshme.</translation> <translation id="5671277269877808209">Katror</translation> <translation id="5753488212459587150">Aktivizo modalitetin e ekspertit</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Modaliteti i ekspertëve</translation> <translation id="5869546221129391014">Rrjetë</translation> <translation id="5975083100439434680">Zvogëlo</translation> -<translation id="6040143037577758943">Mbyll</translation> <translation id="6073451960410192870">Ndalo regjistrimin</translation> <translation id="6197807149213783179">Ruaj të dhënat meta</translation> <translation id="6233780560267770709">3 me 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb index 1159af20..c9424ee9 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3838931309141338733">Skeniraj bar-kod</translation> <translation id="3892148308691398805">Kopiraj tekst</translation> -<translation id="4000398125663085899">Nove slike i video snimci će sada biti sačuvani u folderu u aplikaciji Fajlovi: Moji fajlovi > Kamera</translation> <translation id="4118525110028899586">Pauziraj snimanje</translation> <translation id="4269820728363426813">Kopiraj adresu linka</translation> <translation id="4279490309300973883">Preslikavanje</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Idi u galeriju</translation> <translation id="520537883758714667">Sada je dostupno skeniranje dokumenata</translation> <translation id="5268823927180092501">Omogući režim dokumenta na svim kamerama</translation> -<translation id="5422455049771430511">Slike i video snimci su sada na novom mestu</translation> <translation id="5444515100983837161">Postavite sve ivice dokumenta u okvir. Skeniranje je najuspešnije ako su dokument i pozadina različite boje.</translation> <translation id="5671277269877808209">Kvadrat</translation> <translation id="5753488212459587150">Omogući režim za stručnjake</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Režim za stručnjake</translation> <translation id="5869546221129391014">Mreža</translation> <translation id="5975083100439434680">Umanjivanje</translation> -<translation id="6040143037577758943">Zatvori</translation> <translation id="6073451960410192870">Zaustavi snimanje</translation> <translation id="6197807149213783179">Sačuvaj metapodatke</translation> <translation id="6233780560267770709">3 sa 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr.xtb index 737933c3..e3a910e 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Видео</translation> <translation id="3838931309141338733">Скенирај бар-код</translation> <translation id="3892148308691398805">Копирај текст</translation> -<translation id="4000398125663085899">Нове слике и видео снимци ће сада бити сачувани у фолдеру у апликацији Фајлови: Моји фајлови > Камера</translation> <translation id="4118525110028899586">Паузирај снимање</translation> <translation id="4269820728363426813">Копирај адресу линка</translation> <translation id="4279490309300973883">Пресликавање</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Иди у галерију</translation> <translation id="520537883758714667">Сада је доступно скенирање докумената</translation> <translation id="5268823927180092501">Омогући режим документа на свим камерама</translation> -<translation id="5422455049771430511">Слике и видео снимци су сада на новом месту</translation> <translation id="5444515100983837161">Поставите све ивице документа у оквир. Скенирање је најуспешније ако су документ и позадина различите боје.</translation> <translation id="5671277269877808209">Квадрат</translation> <translation id="5753488212459587150">Омогући режим за стручњаке</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Режим за стручњаке</translation> <translation id="5869546221129391014">Мрежа</translation> <translation id="5975083100439434680">Умањивање</translation> -<translation id="6040143037577758943">Затвори</translation> <translation id="6073451960410192870">Заустави снимање</translation> <translation id="6197807149213783179">Сачувај метаподатке</translation> <translation id="6233780560267770709">3 са 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sv.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sv.xtb index 6c71a0f..3e4f33a1 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sv.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sv.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3838931309141338733">Läs av streckkod</translation> <translation id="3892148308691398805">Kopiera text</translation> -<translation id="4000398125663085899">Nu sparas foton och videor i en ny mapp i appen Filer under Mina filer > Kamera</translation> <translation id="4118525110028899586">Pausa inspelning</translation> <translation id="4269820728363426813">Kopiera länkadress</translation> <translation id="4279490309300973883">Spegling</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Besök galleriet</translation> <translation id="520537883758714667">Dokumentskanning är nu tillgängligt</translation> <translation id="5268823927180092501">Aktivera dokumentläge i alla kameror</translation> -<translation id="5422455049771430511">Nu hittar du dina foton och videor på ett nytt ställe</translation> <translation id="5444515100983837161">Placera dokumentets kanter i ramen. Skanning fungerar bäst om dokumentet och bakgrunden har olika färger.</translation> <translation id="5671277269877808209">Kvadratiskt</translation> <translation id="5753488212459587150">Aktivera expertläge</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Expertläge</translation> <translation id="5869546221129391014">Rutnät</translation> <translation id="5975083100439434680">Zooma ut</translation> -<translation id="6040143037577758943">Stäng</translation> <translation id="6073451960410192870">Sluta spela in</translation> <translation id="6197807149213783179">Spara metadata</translation> <translation id="6233780560267770709">Tre gånger tre</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sw.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sw.xtb index f7b2d380..3d2399d 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sw.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sw.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3838931309141338733">Changanua msimbo wa mistari</translation> <translation id="3892148308691398805">Nakili maandishi</translation> -<translation id="4000398125663085899">Picha na video mpya sasa zitahifadhiwa kwenye folda katika programu ya Faili: Faili zangu > Kamera</translation> <translation id="4118525110028899586">Sitisha kurekodi</translation> <translation id="4269820728363426813">Nakili anwani ya kiungo</translation> <translation id="4279490309300973883">Kuakisi</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Nenda kwenye matunzio</translation> <translation id="520537883758714667">Kipengele cha kuchanganua hati sasa kinapatikana</translation> <translation id="5268823927180092501">Washa hali ya hati kwenye kamera zote</translation> -<translation id="5422455049771430511">Sasa una sehemu mpya ya kuweka picha na video zako</translation> <translation id="5444515100983837161">Weka kingo zote za hati ndani ya fremu. Kipengele cha kuchanganua hufanya kazi vizuri zaidi ikiwa rangi ya hati ni tofauti na ya mandharinyuma.</translation> <translation id="5671277269877808209">Mraba</translation> <translation id="5753488212459587150">Washa hali ya mtaalamu</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Hali ya wataalamu</translation> <translation id="5869546221129391014">Gridi</translation> <translation id="5975083100439434680">Fifiza</translation> -<translation id="6040143037577758943">Funga</translation> <translation id="6073451960410192870">Acha kurekodi</translation> <translation id="6197807149213783179">Hifadhi metadata</translation> <translation id="6233780560267770709">3 kwa 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ta.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ta.xtb index d2d25f79..7a40eeb 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ta.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ta.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">வீடியோ</translation> <translation id="3838931309141338733">பார்கோடை ஸ்கேன் செய்</translation> <translation id="3892148308691398805">உரையை நகலெடு</translation> -<translation id="4000398125663085899">இப்போது புதிய படங்களும் வீடியோக்களும் Files ஆப்ஸில் உள்ள இந்தக் கோப்புறையில் சேமிக்கப்படும்: எனது ஃபைல்கள் > கேமரா</translation> <translation id="4118525110028899586">ரெக்கார்டிங்கை இடைநிறுத்து</translation> <translation id="4269820728363426813">இணைப்பு முகவரியை நகலெடு</translation> <translation id="4279490309300973883">பிரதிபலிக்கிறது</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">கேலரிக்குச் செல்</translation> <translation id="520537883758714667">இப்போது ஆவணத்தை ஸ்கேன் செய்யலாம்</translation> <translation id="5268823927180092501">அனைத்துக் கேமராவிலும் ஆவணப் பயன்முறையை இயக்கு</translation> -<translation id="5422455049771430511">உங்கள் படங்களுக்கும் வீடியோக்களுக்குமான புதிய சேமிப்பிடம்</translation> <translation id="5444515100983837161">ஃபிரேமிற்குள் இருக்கும் வகையில் ஆவணத்தைச் சரிசெய்யவும். ஆவணமும் அதன் பின்புலமும் வெவ்வேறு வண்ணங்களாக இருந்தால் நன்றாக ஸ்கேன் செய்யலாம்.</translation> <translation id="5671277269877808209">சதுரம்</translation> <translation id="5753488212459587150">எக்ஸ்பெர்ட் பயன்முறையை இயக்கு</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">எக்ஸ்பெர்ட் பயன்முறை</translation> <translation id="5869546221129391014">கட்டம்</translation> <translation id="5975083100439434680">சிறிதாக்கு</translation> -<translation id="6040143037577758943">மூடு</translation> <translation id="6073451960410192870">பதிவுசெய்வதை நிறுத்து</translation> <translation id="6197807149213783179">தரவுத்தகவலைச் சேமி</translation> <translation id="6233780560267770709">3 x 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_te.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_te.xtb index 62179e50..6c9734a 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_te.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_te.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">వీడియో</translation> <translation id="3838931309141338733">బార్కోడ్ను స్కాన్ చేయండి</translation> <translation id="3892148308691398805">టెక్స్ట్ను కాపీ చేయి</translation> -<translation id="4000398125663085899">కొత్త ఫోటోలు, వీడియోలు ఇప్పుడు Files యాప్లోని ఫోల్డర్లో సేవ్ చేయబడతాయి: నా ఫైళ్లు > కెమెరా</translation> <translation id="4118525110028899586">రికార్డింగ్ను పాజ్ చేయి</translation> <translation id="4269820728363426813">లింక్ అడ్రస్ను కాపీ చేయండి</translation> <translation id="4279490309300973883">మిర్రరింగ్</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">గ్యాలరీకి వెళ్లు</translation> <translation id="520537883758714667">డాక్యుమెంట్ స్కానింగ్ ఇప్పుడు అందుబాటులో ఉంది</translation> <translation id="5268823927180092501">అన్ని కెమెరాలలో డాక్యుమెంట్ మోడ్ను ఎనేబుల్ చేయండి</translation> -<translation id="5422455049771430511">మీ ఫోటోలు, వీడియోలు ఇప్పుడు ఒక కొత్త చోట సేవ్ చేయబడతాయి</translation> <translation id="5444515100983837161">డాక్యుమెంట్లోని అన్ని అంచులు ఫ్రేమ్ లోపల వచ్చేటట్టుగా ఉంచుతుంది. డాక్యుమెంట్, బ్యాక్గ్రౌండ్ రెండూ వేర్వేరు రంగులలో ఉన్నప్పుడు స్కానింగ్ బాగా పని చేస్తుంది.</translation> <translation id="5671277269877808209">చతురస్రం</translation> <translation id="5753488212459587150">నిపుణుల మోడ్ను ఎనేబుల్ చేయండి</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">నిపుణుల మోడ్</translation> <translation id="5869546221129391014">గ్రిడ్</translation> <translation id="5975083100439434680">దూరంగా జూమ్ చేయి</translation> -<translation id="6040143037577758943">మూసివేయి</translation> <translation id="6073451960410192870">రికార్డ్ చేయడం ఆపివేయి</translation> <translation id="6197807149213783179">మెటాడేటాను సేవ్ చేయి</translation> <translation id="6233780560267770709">3 బై 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_th.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_th.xtb index 22bfff4..81ba6c7 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_th.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_th.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">วิดีโอ</translation> <translation id="3838931309141338733">สแกนบาร์โค้ด</translation> <translation id="3892148308691398805">คัดลอกข้อความ</translation> -<translation id="4000398125663085899">ตอนนี้รูปภาพและวิดีโอใหม่จะบันทึกลงในโฟลเดอร์ใหม่ในแอป Files ที่ไฟล์ของฉัน > กล้อง</translation> <translation id="4118525110028899586">หยุดบันทึกชั่วคราว</translation> <translation id="4269820728363426813">คัดลอกที่อยู่ลิงก์</translation> <translation id="4279490309300973883">กำลังแสดงผล</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">ไปที่แกลเลอรี</translation> <translation id="520537883758714667">การสแกนเอกสารพร้อมใช้งานแล้ว</translation> <translation id="5268823927180092501">เปิดใช้โหมดเอกสารในทุกกล้อง</translation> -<translation id="5422455049771430511">โฟลเดอร์ใหม่สำหรับรูปภาพและวิดีโอ</translation> <translation id="5444515100983837161">จัดขอบเอกสารทุกด้านให้อยู่ภายในกรอบ การสแกนจะทำงานได้ดีที่สุดหากเอกสารและพื้นหลังมีสีต่างกัน</translation> <translation id="5671277269877808209">สี่เหลี่ยมจัตุรัส</translation> <translation id="5753488212459587150">เปิดใช้โหมดผู้เชี่ยวชาญ</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">โหมดผู้เชี่ยวชาญ</translation> <translation id="5869546221129391014">ตาราง</translation> <translation id="5975083100439434680">ย่อ</translation> -<translation id="6040143037577758943">ปิด</translation> <translation id="6073451960410192870">หยุดบันทึก</translation> <translation id="6197807149213783179">บันทึกข้อมูลเมตา</translation> <translation id="6233780560267770709">3 x 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_tr.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_tr.xtb index 1020e75..3db2dc1d 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_tr.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_tr.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3838931309141338733">Barkodu tara</translation> <translation id="3892148308691398805">Metni kopyala</translation> -<translation id="4000398125663085899">Artık yeni fotoğraflar ve videolar, Dosyalar uygulamasında bir klasöre kaydedilecek: Dosyalarım > Kamera</translation> <translation id="4118525110028899586">Kaydı duraklat</translation> <translation id="4269820728363426813">Bağlantı adresini kopyala</translation> <translation id="4279490309300973883">Yansıtılıyor</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Galeriye git</translation> <translation id="520537883758714667">Doküman tarama artık kullanılabilir</translation> <translation id="5268823927180092501">Tüm kameralarda doküman modunu etkinleştir</translation> -<translation id="5422455049771430511">Fotoğraflarınız ve videolarınız artık yeni yerinde</translation> <translation id="5444515100983837161">Dokümanın tüm kenarlarını çerçevenin içine yerleştirin. Dokümanla arka plan farklı renklere sahip olduğunda tarama daha iyi sonuç verir.</translation> <translation id="5671277269877808209">Kare</translation> <translation id="5753488212459587150">Uzman modunu etkinleştir</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Uzman modu</translation> <translation id="5869546221129391014">Tablo</translation> <translation id="5975083100439434680">Uzaklaştır</translation> -<translation id="6040143037577758943">Kapat</translation> <translation id="6073451960410192870">Kaydı durdur</translation> <translation id="6197807149213783179">Meta veriyi kaydet</translation> <translation id="6233780560267770709">3'e 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_uk.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_uk.xtb index 2b7c199..797d3f3 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_uk.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_uk.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Відео</translation> <translation id="3838931309141338733">Сканувати штрих-код</translation> <translation id="3892148308691398805">Копіювати текст</translation> -<translation id="4000398125663085899">Нові фотографії й відео тепер зберігатимуться в папці в додатку Файли: "Мої файли" > "Камера"</translation> <translation id="4118525110028899586">Призупинити запис</translation> <translation id="4269820728363426813">Копіювати адресу посилання</translation> <translation id="4279490309300973883">Дзеркальне відображення</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Перейти в галерею</translation> <translation id="520537883758714667">Тепер доступне сканування документів</translation> <translation id="5268823927180092501">Увімкнути режим документа на всіх камерах</translation> -<translation id="5422455049771430511">Нове сховище для ваших фотографій і відео</translation> <translation id="5444515100983837161">Розмістіть усі краї документа всередині рамки. Сканування працює найкраще, коли кольори документа й фону відрізняються.</translation> <translation id="5671277269877808209">Квадрат</translation> <translation id="5753488212459587150">Увімкнути режим експерта</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Режим експерта</translation> <translation id="5869546221129391014">Сітка</translation> <translation id="5975083100439434680">Зменшити масштаб</translation> -<translation id="6040143037577758943">Закрити</translation> <translation id="6073451960410192870">Припинити запис</translation> <translation id="6197807149213783179">Зберегти метадані</translation> <translation id="6233780560267770709">3 на 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ur.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ur.xtb index 41d7fc7..3a31038 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ur.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ur.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">ویڈیو</translation> <translation id="3838931309141338733">بارکوڈ اسکین کریں</translation> <translation id="3892148308691398805">ٹیکسٹ کاپی کریں</translation> -<translation id="4000398125663085899">نئی تصاویر اور ویڈیوز کو فائلز ایپ میں ایک فولڈر میں محفوظ کیا جائے گا: میری فائلیں > کیمرا۔</translation> <translation id="4118525110028899586">ریکارڈنگ موقوف کریں</translation> <translation id="4269820728363426813">لنک کا پتہ کاپی کریں</translation> <translation id="4279490309300973883">مررنگ</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">گیلری میں جائیں</translation> <translation id="520537883758714667">دستاویز کو اسکین کرنے کی خصوصیت اب دستیاب ہے</translation> <translation id="5268823927180092501">سبھی کیمروں پر دستاویز وضع فعال کریں</translation> -<translation id="5422455049771430511">آپ کی تصاویر اور ویڈیوز کیلئے ایک نئی جگہ</translation> <translation id="5444515100983837161">دستاویز کے سبھی کناروں کو فریم میں رکھیں۔ اگر دستاویز اور پس منظر کے رنگ مختلف ہوں تو اسکیننگ بہترین کام کرتا ہے۔</translation> <translation id="5671277269877808209">مربع</translation> <translation id="5753488212459587150">ماہر وضع کو فعال کریں</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">ماہر وضع</translation> <translation id="5869546221129391014">گرڈ</translation> <translation id="5975083100439434680">زوم آؤٹ کریں</translation> -<translation id="6040143037577758943">بند کریں</translation> <translation id="6073451960410192870">ریکارڈنگ روکیں</translation> <translation id="6197807149213783179">میٹا ڈیٹا محفوظ کریں</translation> <translation id="6233780560267770709">3 ضرب 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_uz.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_uz.xtb index d6b943c..ae0e57b 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_uz.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_uz.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3838931309141338733">Shtrix-kodni skanerlash</translation> <translation id="3892148308691398805">Matnni nusxalash</translation> -<translation id="4000398125663085899">Yangi rasm va videolar endi Files ilovasidagi jildda saqlanadi: Fayllarim > Kamera.</translation> <translation id="4118525110028899586">Pauza qilish</translation> <translation id="4269820728363426813">Havola manzilini nusxalash</translation> <translation id="4279490309300973883">Ekran nusxasini boshqa ekranga uzatish</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Galereyani ochish</translation> <translation id="520537883758714667">Endi hujjatlarni skanerlash mumkin</translation> <translation id="5268823927180092501">Barcha kameralarda hujjat rejimini yoqish</translation> -<translation id="5422455049771430511">Rasm va videolaringiz endi yangi joyda saqlanadi</translation> <translation id="5444515100983837161">Hujjat chetlarini hoshiyaga moslab joylang. Hujjat uning rangi foni bilan farqli boʻlganda yaxshi skanerlanadi.</translation> <translation id="5671277269877808209">Kvadrat</translation> <translation id="5753488212459587150">Ekspert rejimini yoqish</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Ekspert rejimi</translation> <translation id="5869546221129391014">Setka</translation> <translation id="5975083100439434680">Kichiklashtirish</translation> -<translation id="6040143037577758943">Yopish</translation> <translation id="6073451960410192870">Yozuvni toʻxtatish</translation> <translation id="6197807149213783179">Meta-axborotni saqlash</translation> <translation id="6233780560267770709">3 ga 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_vi.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_vi.xtb index 1e1c6fcd..8a4c89a 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_vi.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_vi.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3838931309141338733">Quét mã vạch</translation> <translation id="3892148308691398805">Sao chép văn bản</translation> -<translation id="4000398125663085899">Giờ đây, các ảnh và video mới sẽ được lưu vào một thư mục trong ứng dụng Files: Tệp của tôi > Máy ảnh</translation> <translation id="4118525110028899586">Tạm dừng quay</translation> <translation id="4269820728363426813">Sao chép địa chỉ liên kết</translation> <translation id="4279490309300973883">Đang phản chiếu</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Truy cập thư viện</translation> <translation id="520537883758714667">Tính năng quét tài liệu hiện có sẵn</translation> <translation id="5268823927180092501">Bật chế độ tài liệu trên tất cả máy ảnh</translation> -<translation id="5422455049771430511">Ảnh và video của bạn sẽ có nơi lưu trữ mới</translation> <translation id="5444515100983837161">Đặt tất cả cạnh của tài liệu vào trong khung. Tính năng quét hoạt động hiệu quả nhất khi màu của tài liệu và nền khác nhau.</translation> <translation id="5671277269877808209">Vuông</translation> <translation id="5753488212459587150">Bật chế độ chuyên gia</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Chế độ Chuyên gia</translation> <translation id="5869546221129391014">Lưới</translation> <translation id="5975083100439434680">Thu nhỏ</translation> -<translation id="6040143037577758943">Đóng</translation> <translation id="6073451960410192870">Dừng ghi</translation> <translation id="6197807149213783179">Lưu siêu dữ liệu</translation> <translation id="6233780560267770709">3 x 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-CN.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-CN.xtb index 7c32177..35f0dded 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-CN.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-CN.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">视频</translation> <translation id="3838931309141338733">扫描条形码</translation> <translation id="3892148308691398805">复制文字</translation> -<translation id="4000398125663085899">现在,新照片和视频会保存到“文件”应用中的文件夹:“我的文件”>“相机”</translation> <translation id="4118525110028899586">暂停录制</translation> <translation id="4269820728363426813">复制链接地址</translation> <translation id="4279490309300973883">正在镜像</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">打开图库</translation> <translation id="520537883758714667">文件扫描功能现已推出</translation> <translation id="5268823927180092501">为所有摄像头启用文档模式</translation> -<translation id="5422455049771430511">您的照片和视频有新家了</translation> <translation id="5444515100983837161">请将文件的各个边置于框内。当文件的颜色与背景的颜色不同时,扫描效果最佳。</translation> <translation id="5671277269877808209">方形</translation> <translation id="5753488212459587150">启用专家模式</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">专家模式</translation> <translation id="5869546221129391014">网格</translation> <translation id="5975083100439434680">缩小</translation> -<translation id="6040143037577758943">关闭</translation> <translation id="6073451960410192870">停止录制</translation> <translation id="6197807149213783179">保存元数据</translation> <translation id="6233780560267770709">3 x 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb index 9a0675f..adaea32 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">影片</translation> <translation id="3838931309141338733">掃描條碼</translation> <translation id="3892148308691398805">複製文字</translation> -<translation id="4000398125663085899">新相片和影片現在會儲存在「檔案」應用程式內的資料夾:[我的檔案] > [相機]</translation> <translation id="4118525110028899586">暫停錄影</translation> <translation id="4269820728363426813">複製連結網址</translation> <translation id="4279490309300973883">鏡像</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">前往相片集</translation> <translation id="520537883758714667">文件掃瞄功能現已推出</translation> <translation id="5268823927180092501">在所有相機上啟用文件模式</translation> -<translation id="5422455049771430511">您的相片和影片都放在新的位置</translation> <translation id="5444515100983837161">將鏡頭對準文件,確認各邊都在方框內。如要獲得最佳的掃瞄效果,請將文件與背景的顏色區分起來。</translation> <translation id="5671277269877808209">正方形</translation> <translation id="5753488212459587150">啟用專業模式</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">專業模式</translation> <translation id="5869546221129391014">網格</translation> <translation id="5975083100439434680">縮小</translation> -<translation id="6040143037577758943">關閉</translation> <translation id="6073451960410192870">停止錄影</translation> <translation id="6197807149213783179">儲存元數據</translation> <translation id="6233780560267770709">3 x 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb index 1f37871..69a77f9f 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">影片</translation> <translation id="3838931309141338733">掃描條碼</translation> <translation id="3892148308691398805">複製文字</translation> -<translation id="4000398125663085899">現在新的相片和影片會儲存到「檔案」應用程式中的資料夾:[我的檔案] > [攝影機]</translation> <translation id="4118525110028899586">暫停錄影</translation> <translation id="4269820728363426813">複製連結網址</translation> <translation id="4279490309300973883">鏡像</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">前往圖片庫</translation> <translation id="520537883758714667">文件掃描功能現已推出</translation> <translation id="5268823927180092501">針對所有相機啟用文件模式</translation> -<translation id="5422455049771430511">你的相片和影片有新家了</translation> <translation id="5444515100983837161">將鏡頭對準文件,確認各邊都在方框內。如要獲得最佳的掃描效果,請將文件與背景的顏色區分開來。</translation> <translation id="5671277269877808209">正方形</translation> <translation id="5753488212459587150">啟用專家模式</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">專家模式</translation> <translation id="5869546221129391014">格線</translation> <translation id="5975083100439434680">縮小</translation> -<translation id="6040143037577758943">關閉</translation> <translation id="6073451960410192870">停止錄影</translation> <translation id="6197807149213783179">儲存中繼資料</translation> <translation id="6233780560267770709">3 x 3</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zu.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zu.xtb index 00b03158..509093fce 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zu.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zu.xtb
@@ -49,7 +49,6 @@ <translation id="3810838688059735925">Ividiyo</translation> <translation id="3838931309141338733">Skena ibhakhodi</translation> <translation id="3892148308691398805">Kopisha umbhalo</translation> -<translation id="4000398125663085899">Izithombe namavidiyo amasha manje sekuzolondolozeka kufolda ekuhlelo lokusebenza lwe-Files: Amafayela wami > Ikhamera</translation> <translation id="4118525110028899586">Misa okwesikhashana ukurekhoda</translation> <translation id="4269820728363426813">Kopisha ikheli lesixhumanisi</translation> <translation id="4279490309300973883">Yenza isibuko</translation> @@ -67,7 +66,6 @@ <translation id="5152121255775685072">Hamba kugalari</translation> <translation id="520537883758714667">Ukuskena idokhumenti manje sekuyatholakala</translation> <translation id="5268823927180092501">Nika amandla imodi yedokhumenti kuwo wonke amakhamera</translation> -<translation id="5422455049771430511">Izithombe namavidiyo wakho sekunekhaya elisha</translation> <translation id="5444515100983837161">Beka bonke onqenqema bedokhumenti ngaphakathi kohlaka. Ukuskena kusebenza kangcono uma idokhumenti nengemuva kuyimibala ehlukile.</translation> <translation id="5671277269877808209">Isikwele</translation> <translation id="5753488212459587150">Nika amandla imodi yengcweti</translation> @@ -75,7 +73,6 @@ <translation id="5775960006311140197">Imodi yongcweit</translation> <translation id="5869546221129391014">I-Grid</translation> <translation id="5975083100439434680">Hlehlisa isithombe</translation> -<translation id="6040143037577758943">Vala</translation> <translation id="6073451960410192870">Misa ukurekhoda</translation> <translation id="6197807149213783179">Londoloza imethadatha</translation> <translation id="6233780560267770709">3 ngo-3</translation>
diff --git a/chromeos/components/personalization_app/resources/trusted/wallpaper_breadcrumb_element.html b/chromeos/components/personalization_app/resources/trusted/wallpaper_breadcrumb_element.html index 090b8b3df..e069971 100644 --- a/chromeos/components/personalization_app/resources/trusted/wallpaper_breadcrumb_element.html +++ b/chromeos/components/personalization_app/resources/trusted/wallpaper_breadcrumb_element.html
@@ -32,6 +32,10 @@ margin-left: 8px; } + #wallpaperLabel { + cursor: pointer; + } + iron-icon { height: 20px; width: 20px; @@ -44,7 +48,7 @@ </cr-icon-button> </template> <div id="textContainer" aria-hidden="true"> - <p id="wallpaperLabel">[[i18n('title')]]</p> + <p on-click="onBackClick_" id="wallpaperLabel">[[i18n('title')]]</p> <template is="dom-if" if="[[pageLabel_]]"> <iron-icon icon="cr:chevron-right"></iron-icon> <p id="pageLabel">[[pageLabel_]]</span>
diff --git a/chromeos/dbus/missive/fake_missive_client.h b/chromeos/dbus/missive/fake_missive_client.h index 8eb1b9aa..083eb13 100644 --- a/chromeos/dbus/missive/fake_missive_client.h +++ b/chromeos/dbus/missive/fake_missive_client.h
@@ -25,11 +25,11 @@ private: void EnqueueRecord( - const reporting::Priority priority, + reporting::Priority priority, reporting::Record record, base::OnceCallback<void(reporting::Status)> completion_callback); - void Flush(const reporting::Priority priority, + void Flush(reporting::Priority priority, base::OnceCallback<void(reporting::Status)> completion_callback); void ReportSuccess(
diff --git a/chromeos/dbus/rmad/OWNERS b/chromeos/dbus/rmad/OWNERS index 4822e6f6..daf34cc 100644 --- a/chromeos/dbus/rmad/OWNERS +++ b/chromeos/dbus/rmad/OWNERS
@@ -1,3 +1,2 @@ # Primary Owners -joonbug@chromium.org zentaro@chromium.org
diff --git a/chromeos/services/libassistant/display_controller_unittest.cc b/chromeos/services/libassistant/display_controller_unittest.cc index 8457a02..15c4993c 100644 --- a/chromeos/services/libassistant/display_controller_unittest.cc +++ b/chromeos/services/libassistant/display_controller_unittest.cc
@@ -9,6 +9,7 @@ #include "chromeos/assistant/test_support/expect_utils.h" #include "chromeos/services/libassistant/grpc/assistant_client.h" #include "chromeos/services/libassistant/public/mojom/speech_recognition_observer.mojom.h" +#include "chromeos/services/libassistant/test_support/fake_assistant_client.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -24,13 +25,13 @@ constexpr char kSampleUserId[] = "user-id"; constexpr char kSamplePackageName[] = "app.test"; -class AssistantClientMock : public AssistantClient { +class AssistantClientMock : public FakeAssistantClient { public: AssistantClientMock( - std::unique_ptr<assistant_client::AssistantManager> assistant_manager, - assistant_client::AssistantManagerInternal* assistant_manager_internal) - : AssistantClient(std::move(assistant_manager), - assistant_manager_internal) {} + std::unique_ptr<assistant::FakeAssistantManager> assistant_manager, + assistant::FakeAssistantManagerInternal* assistant_manager_internal) + : FakeAssistantClient(std::move(assistant_manager), + assistant_manager_internal) {} ~AssistantClientMock() override = default; // AssistantClient: @@ -44,18 +45,6 @@ const std::string& description, const ::assistant::api::VoicelessOptions& options, base::OnceCallback<void(bool)> on_done)); - MOCK_METHOD( - void, - StartSpeakerIdEnrollment, - (const StartSpeakerIdEnrollmentRequest& request, - base::RepeatingCallback<void(const SpeakerIdEnrollmentEvent&)> on_done)); - MOCK_METHOD(void, - CancelSpeakerIdEnrollment, - (const CancelSpeakerIdEnrollmentRequest& request)); - MOCK_METHOD(void, - GetSpeakerIdEnrollmentInfo, - (const GetSpeakerIdEnrollmentInfoRequest& request, - base::OnceCallback<void(bool user_model_exists)> on_done)); }; class AssistantManagerInternalMock
diff --git a/chromeos/services/libassistant/grpc/BUILD.gn b/chromeos/services/libassistant/grpc/BUILD.gn index ef106fa..ed6fa63e 100644 --- a/chromeos/services/libassistant/grpc/BUILD.gn +++ b/chromeos/services/libassistant/grpc/BUILD.gn
@@ -20,6 +20,7 @@ "//chromeos/assistant/internal", "//chromeos/services/assistant/public/cpp", "//libassistant/shared/internal_api:assistant_manager_internal", + "//libassistant/shared/internal_api:fuchsia_api_helper", "//libassistant/shared/public", ] }
diff --git a/chromeos/services/libassistant/grpc/assistant_client.h b/chromeos/services/libassistant/grpc/assistant_client.h index 944f3791..458bf90 100644 --- a/chromeos/services/libassistant/grpc/assistant_client.h +++ b/chromeos/services/libassistant/grpc/assistant_client.h
@@ -26,6 +26,7 @@ namespace assistant_client { class AssistantManager; class AssistantManagerInternal; +class ChromeOSApiDelegate; } // namespace assistant_client namespace chromeos { @@ -53,6 +54,11 @@ AssistantClient& operator=(const AssistantClient&) = delete; virtual ~AssistantClient(); + virtual void StartServices() = 0; + + virtual void SetChromeOSApiDelegate( + assistant_client::ChromeOSApiDelegate* delegate) = 0; + // 1. Start a gRPC server which hosts the services that Libassistant depends // on (maybe called by Libassistant) or receive events from Libassistant. // 2. Register this client as a customer of Libassistant by sending @@ -79,6 +85,8 @@ const GetSpeakerIdEnrollmentInfoRequest& request, base::OnceCallback<void(bool user_model_exists)> on_done) = 0; + virtual void ResetAllDataAndShutdown() = 0; + // Will not return nullptr. assistant_client::AssistantManager* assistant_manager() { return assistant_manager_.get();
diff --git a/chromeos/services/libassistant/grpc/assistant_client_v1.cc b/chromeos/services/libassistant/grpc/assistant_client_v1.cc index d8aa0cb..0118cf8 100644 --- a/chromeos/services/libassistant/grpc/assistant_client_v1.cc +++ b/chromeos/services/libassistant/grpc/assistant_client_v1.cc
@@ -11,6 +11,7 @@ #include "chromeos/assistant/internal/proto/shared/proto/v2/speaker_id_enrollment_interface.pb.h" #include "chromeos/services/libassistant/callback_utils.h" #include "libassistant/shared/internal_api/assistant_manager_internal.h" +#include "libassistant/shared/internal_api/fuchsia_api_helper.h" #include "libassistant/shared/internal_api/speaker_id_enrollment.h" namespace chromeos { @@ -72,6 +73,17 @@ AssistantClientV1::~AssistantClientV1() = default; +void AssistantClientV1::StartServices() { + assistant_manager()->Start(); +} + +void AssistantClientV1::SetChromeOSApiDelegate( + assistant_client::ChromeOSApiDelegate* delegate) { + assistant_manager_internal() + ->GetFuchsiaApiHelperOrDie() + ->SetChromeOSApiDelegate(delegate); +} + bool AssistantClientV1::StartGrpcServices() { return true; } @@ -135,5 +147,9 @@ ToStdFunction(BindToCurrentSequence(std::move(callback)))); } +void AssistantClientV1::ResetAllDataAndShutdown() { + assistant_manager()->ResetAllDataAndShutdown(); +} + } // namespace libassistant } // namespace chromeos
diff --git a/chromeos/services/libassistant/grpc/assistant_client_v1.h b/chromeos/services/libassistant/grpc/assistant_client_v1.h index f3b9a4b..c9348f3 100644 --- a/chromeos/services/libassistant/grpc/assistant_client_v1.h +++ b/chromeos/services/libassistant/grpc/assistant_client_v1.h
@@ -19,6 +19,9 @@ ~AssistantClientV1() override; // chromeos::libassistant::AssistantClient: + void StartServices() override; + void SetChromeOSApiDelegate( + assistant_client::ChromeOSApiDelegate* delegate) override; bool StartGrpcServices() override; void AddExperimentIds(const std::vector<std::string>& exp_ids) override; void SendVoicelessInteraction( @@ -35,6 +38,7 @@ void GetSpeakerIdEnrollmentInfo( const GetSpeakerIdEnrollmentInfoRequest& request, base::OnceCallback<void(bool user_model_exists)> on_done) override; + void ResetAllDataAndShutdown() override; }; } // namespace libassistant
diff --git a/chromeos/services/libassistant/service_controller.cc b/chromeos/services/libassistant/service_controller.cc index 36b1c8e8..ac19e78 100644 --- a/chromeos/services/libassistant/service_controller.cc +++ b/chromeos/services/libassistant/service_controller.cc
@@ -179,7 +179,7 @@ DCHECK(IsInitialized()) << "Initialize() must be called before Start()"; DVLOG(1) << "Starting Libassistant service"; - assistant_manager()->Start(); + assistant_client_->StartServices(); SetStateAndInformObservers(ServiceState::kStarted); @@ -212,9 +212,9 @@ } void ServiceController::ResetAllDataAndStop() { - if (assistant_manager()) { + if (assistant_client_) { DVLOG(1) << "Resetting all Libassistant data"; - assistant_manager()->ResetAllDataAndShutdown(); + assistant_client_->ResetAllDataAndShutdown(); } Stop(); } @@ -317,17 +317,15 @@ void ServiceController::CreateAndRegisterDeviceStateListener() { device_state_listener_ = std::make_unique<DeviceStateListener>(this); - assistant_manager()->AddDeviceStateListener(device_state_listener_.get()); + assistant_client_->assistant_manager()->AddDeviceStateListener( + device_state_listener_.get()); } void ServiceController::CreateAndRegisterChromiumApiDelegate( mojo::PendingRemote<network::mojom::URLLoaderFactory> url_loader_factory_remote) { CreateChromiumApiDelegate(std::move(url_loader_factory_remote)); - - assistant_manager_internal() - ->GetFuchsiaApiHelperOrDie() - ->SetChromeOSApiDelegate(chromium_api_delegate_.get()); + assistant_client_->SetChromeOSApiDelegate(chromium_api_delegate_.get()); } void ServiceController::CreateChromiumApiDelegate(
diff --git a/chromeos/services/libassistant/test_support/fake_assistant_client.cc b/chromeos/services/libassistant/test_support/fake_assistant_client.cc index b328b34..28c5ce2 100644 --- a/chromeos/services/libassistant/test_support/fake_assistant_client.cc +++ b/chromeos/services/libassistant/test_support/fake_assistant_client.cc
@@ -17,6 +17,11 @@ FakeAssistantClient::~FakeAssistantClient() = default; +void FakeAssistantClient::StartServices() {} + +void FakeAssistantClient::SetChromeOSApiDelegate( + assistant_client::ChromeOSApiDelegate* delegate) {} + bool FakeAssistantClient::StartGrpcServices() { return true; } @@ -41,5 +46,7 @@ const ::assistant::api::GetSpeakerIdEnrollmentInfoRequest& request, base::OnceCallback<void(bool user_model_exists)> on_done) {} +void FakeAssistantClient::ResetAllDataAndShutdown() {} + } // namespace libassistant } // namespace chromeos
diff --git a/chromeos/services/libassistant/test_support/fake_assistant_client.h b/chromeos/services/libassistant/test_support/fake_assistant_client.h index 3a79cac..64aa103 100644 --- a/chromeos/services/libassistant/test_support/fake_assistant_client.h +++ b/chromeos/services/libassistant/test_support/fake_assistant_client.h
@@ -29,6 +29,9 @@ AssistantClient::assistant_manager_internal()); } + void StartServices() override; + void SetChromeOSApiDelegate( + assistant_client::ChromeOSApiDelegate* delegate) override; bool StartGrpcServices() override; void AddExperimentIds(const std::vector<std::string>& exp_ids) override; void SendVoicelessInteraction( @@ -45,6 +48,7 @@ void GetSpeakerIdEnrollmentInfo( const GetSpeakerIdEnrollmentInfoRequest& request, base::OnceCallback<void(bool user_model_exists)> on_done) override; + void ResetAllDataAndShutdown() override; }; } // namespace libassistant
diff --git a/chromeos/strings/chromeos_strings_az.xtb b/chromeos/strings/chromeos_strings_az.xtb index 05023de..a028984 100644 --- a/chromeos/strings/chromeos_strings_az.xtb +++ b/chromeos/strings/chromeos_strings_az.xtb
@@ -366,9 +366,11 @@ <translation id="7835501727204647447">CloudReady quraşdırın</translation> <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Provayder növü</translation> +<translation id="7895471513946376273">Rəsm və dizayn alətlərini kəşf edin</translation> <translation id="7936303884198020182">Ad serveri tapılmadı</translation> <translation id="7960831585769876809">Temperatur</translation> <translation id="7994702968232966508">EAP üsulu</translation> +<translation id="8020238979854764615">Xəta oldu. Fərqli şəkil seçin və yenidən cəhd edin.</translation> <translation id="802154636333426148">Endirmə alınmadı</translation> <translation id="8041089156583427627">Geri Əlaqə Göndərin</translation> <translation id="8075838845814659848">Qalan şarj</translation>
diff --git a/chromeos/strings/chromeos_strings_gl.xtb b/chromeos/strings/chromeos_strings_gl.xtb index 234cf03..f9593357 100644 --- a/chromeos/strings/chromeos_strings_gl.xtb +++ b/chromeos/strings/chromeos_strings_gl.xtb
@@ -367,9 +367,11 @@ <translation id="7835501727204647447">Instalar CloudReady</translation> <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Tipo de fornecedor</translation> +<translation id="7895471513946376273">Descubre as ferramentas de debuxo e deseño</translation> <translation id="7936303884198020182">Non se atoparon servidores de nomes</translation> <translation id="7960831585769876809">Temperatura</translation> <translation id="7994702968232966508">Método EAP</translation> +<translation id="8020238979854764615">Produciuse un erro. Téntao de novo escollendo outras imaxes.</translation> <translation id="802154636333426148">Produciuse un erro na descarga</translation> <translation id="8041089156583427627">Enviar comentarios</translation> <translation id="8075838845814659848">Carga restante</translation>
diff --git a/chromeos/strings/chromeos_strings_ml.xtb b/chromeos/strings/chromeos_strings_ml.xtb index 1753823..2a24baf 100644 --- a/chromeos/strings/chromeos_strings_ml.xtb +++ b/chromeos/strings/chromeos_strings_ml.xtb
@@ -366,9 +366,11 @@ <translation id="7835501727204647447">CloudReady ഇൻസ്റ്റാൾ ചെയ്യുക</translation> <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">പ്രൊവൈഡര് തരം:</translation> +<translation id="7895471513946376273">ഡ്രോയിംഗ്, ഡിസൈൻ ടൂളുകൾ കണ്ടെത്തുക</translation> <translation id="7936303884198020182">നെയിം സെർവറുകളൊന്നും കണ്ടെത്തിയില്ല</translation> <translation id="7960831585769876809">താപനില</translation> <translation id="7994702968232966508">EAP രീതി</translation> +<translation id="8020238979854764615">ഒരു പിശകുണ്ടായി. മറ്റ് ചിത്രങ്ങൾ തിരഞ്ഞെടുത്ത് വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="802154636333426148">ഡൗൺലോഡ് പരാജയപ്പെട്ടു</translation> <translation id="8041089156583427627">ഫീഡ്ബാക്ക് അയയ്ക്കുക</translation> <translation id="8075838845814659848">ശേഷിക്കുന്ന ചാർജ്</translation>
diff --git a/chromeos/strings/chromeos_strings_mr.xtb b/chromeos/strings/chromeos_strings_mr.xtb index 584210f..4ee55c49 100644 --- a/chromeos/strings/chromeos_strings_mr.xtb +++ b/chromeos/strings/chromeos_strings_mr.xtb
@@ -218,7 +218,7 @@ <translation id="5168185087976003268">बॅटरीची स्थिती</translation> <translation id="5170568018924773124">फोल्डरमध्ये दर्शवा</translation> <translation id="5212543919916444558">मी मदत करू शकेन असे मला तुमच्या स्क्रीनवर काही आढळले नाही. -मला काहीही विचारण्यासाठी माइकवर टॅप करून पाहा.</translation> +मला काहीही विचारण्यासाठी माइकवर टॅप करून पहा.</translation> <translation id="5222676887888702881">साइन आउट करा</translation> <translation id="5234764350956374838">डिसमिस करा</translation> <translation id="5252456968953390977">रोमिंग</translation> @@ -367,9 +367,11 @@ <translation id="7835501727204647447">CloudReady इंस्टॉल करा</translation> <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">प्रदाता प्रकार</translation> +<translation id="7895471513946376273">ड्रॉइंग आणि डिझाइनची टूल शोधा</translation> <translation id="7936303884198020182">नेम सर्व्हर आढळले नाहीत</translation> <translation id="7960831585769876809">तापमान</translation> <translation id="7994702968232966508">EAP पद्धत</translation> +<translation id="8020238979854764615">एरर आली. कृपया इतर इमेज निवडून पुन्हा प्रयत्न करा.</translation> <translation id="802154636333426148">डाउनलोड अयशस्वी झाले</translation> <translation id="8041089156583427627">अभिप्राय पाठवा</translation> <translation id="8075838845814659848">शिल्लक चार्जिंग</translation>
diff --git a/chromeos/strings/chromeos_strings_ne.xtb b/chromeos/strings/chromeos_strings_ne.xtb index c83f2bc..83c51b0 100644 --- a/chromeos/strings/chromeos_strings_ne.xtb +++ b/chromeos/strings/chromeos_strings_ne.xtb
@@ -366,9 +366,11 @@ <translation id="7835501727204647447">CloudReady इन्स्टल गर्नुहोस्</translation> <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">प्रदायकको प्रकार</translation> +<translation id="7895471513946376273">रेखाचित्र र डिजाइनसम्बन्धी संयन्त्रहरू खोज्नुहोस्</translation> <translation id="7936303884198020182">कुनै पनि डोमेन नेम सर्भर फेला परेन</translation> <translation id="7960831585769876809">तापक्रम</translation> <translation id="7994702968232966508">EAP विधि</translation> +<translation id="8020238979854764615">कुनै त्रुटि भयो। कृपया अन्य फोटोहरू छनौट गरी फेरि प्रयास गर्नुहोस्।</translation> <translation id="802154636333426148">डाउनलोड गर्न सकिएन</translation> <translation id="8041089156583427627">प्रतिक्रिया पठाउनुहोस्।</translation> <translation id="8075838845814659848">बाँकी ब्याट्री</translation>
diff --git a/chromeos/strings/chromeos_strings_pa.xtb b/chromeos/strings/chromeos_strings_pa.xtb index c4f81d10..13b844a7 100644 --- a/chromeos/strings/chromeos_strings_pa.xtb +++ b/chromeos/strings/chromeos_strings_pa.xtb
@@ -366,9 +366,11 @@ <translation id="7835501727204647447">CloudReady ਨੂੰ ਸਥਾਪਤ ਕਰੋ</translation> <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">ਪ੍ਰਦਾਨਕ ਕਿਸਮ</translation> +<translation id="7895471513946376273">ਚਿੱਤਰਕਾਰੀ ਅਤੇ ਡਿਜ਼ਾਈਨ ਸੰਬੰਧੀ ਟੂਲ ਲੱਭੋ</translation> <translation id="7936303884198020182">ਕੋਈ ਨਾਮ ਸਰਵਰ ਨਹੀਂ ਮਿਲਿਆ</translation> <translation id="7960831585769876809">ਤਾਪਮਾਨ</translation> <translation id="7994702968232966508">EAP ਵਿਧੀ</translation> +<translation id="8020238979854764615">ਕੋਈ ਗੜਬੜ ਹੋ ਗਈ। ਕਿਰਪਾ ਕਰਕੇ ਹੋਰ ਚਿੱਤਰਾਂ ਦੀ ਚੋਣ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="802154636333426148">ਡਾਊਨਲੋਡ ਅਸਫਲ ਰਿਹਾ</translation> <translation id="8041089156583427627">ਵਿਚਾਰ ਭੇਜੋ</translation> <translation id="8075838845814659848">ਬਾਕੀ ਚਾਰਜ</translation>
diff --git a/chromeos/strings/chromeos_strings_ur.xtb b/chromeos/strings/chromeos_strings_ur.xtb index 313e72d8..6416cbc 100644 --- a/chromeos/strings/chromeos_strings_ur.xtb +++ b/chromeos/strings/chromeos_strings_ur.xtb
@@ -366,9 +366,11 @@ <translation id="7835501727204647447">CloudReady انسٹال کریں</translation> <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">فراہم کنندہ کی قسم</translation> +<translation id="7895471513946376273">ڈرائنگ اور ڈیزائن کے ٹولز دریافت کریں</translation> <translation id="7936303884198020182">کوئی نام سرور نہیں ملا</translation> <translation id="7960831585769876809">درجہ حرارت</translation> <translation id="7994702968232966508">EAP طریقہ</translation> +<translation id="8020238979854764615">ایک خرابی پیش آ گئی۔ براہ کرم دوسری تصاویر منتخب کرکے دوبارہ کوشش کریں۔</translation> <translation id="802154636333426148">ڈاؤن لوڈ ناکام ہوگیا</translation> <translation id="8041089156583427627">تاثرات بھیجیں</translation> <translation id="8075838845814659848">باقی چارج</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-HK.xtb b/chromeos/strings/chromeos_strings_zh-HK.xtb index f0324890..352f98ac 100644 --- a/chromeos/strings/chromeos_strings_zh-HK.xtb +++ b/chromeos/strings/chromeos_strings_zh-HK.xtb
@@ -367,11 +367,11 @@ <translation id="7835501727204647447">安裝 CloudReady</translation> <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">供應商類型</translation> -<translation id="7895471513946376273">探索繪圖與設計工具</translation> +<translation id="7895471513946376273">探索繪圖和設計工具</translation> <translation id="7936303884198020182">找不到域名伺服器</translation> <translation id="7960831585769876809">溫度</translation> <translation id="7994702968232966508">EAP 方法</translation> -<translation id="8020238979854764615">發生錯誤,請選擇其他圖片再試一次。</translation> +<translation id="8020238979854764615">發生錯誤。請選擇其他圖片再試一次。</translation> <translation id="802154636333426148">下載失敗</translation> <translation id="8041089156583427627">提供意見</translation> <translation id="8075838845814659848">剩餘電量</translation>
diff --git a/components/README.md b/components/README.md index cfaefab..5388dec 100644 --- a/components/README.md +++ b/components/README.md
@@ -101,7 +101,3 @@ Code in a component should be placed in a namespace corresponding to the name of the component; e.g. for a component living in `//components/foo`, code in that component should be in the `foo::` namespace. - -## How does this differ from //base/util? - -See the explanation in [//base/util/README.md](https://chromium.googlesource.com/chromium/src/+/HEAD/base/util/README.md#how-does-this-differ-from-components).
diff --git a/components/download/content/factory/download_service_factory_helper.cc b/components/download/content/factory/download_service_factory_helper.cc index f6da432e..c7edd2d1 100644 --- a/components/download/content/factory/download_service_factory_helper.cc +++ b/components/download/content/factory/download_service_factory_helper.cc
@@ -10,7 +10,6 @@ #include "build/build_config.h" #include "components/download/content/factory/navigation_monitor_factory.h" #include "components/download/content/internal/download_driver_impl.h" -#include "components/download/internal/background_service/background_download_service_impl.h" #include "components/download/internal/background_service/client_set.h" #include "components/download/internal/background_service/config.h" #include "components/download/internal/background_service/controller_impl.h" @@ -18,6 +17,7 @@ #include "components/download/internal/background_service/empty_file_monitor.h" #include "components/download/internal/background_service/file_monitor_impl.h" #include "components/download/internal/background_service/in_memory_download_driver.h" +#include "components/download/internal/background_service/init_aware_background_download_service.h" #include "components/download/internal/background_service/logger_impl.h" #include "components/download/internal/background_service/model_impl.h" #include "components/download/internal/background_service/noop_store.h" @@ -85,15 +85,16 @@ auto scheduler = std::make_unique<SchedulerImpl>( task_scheduler.get(), config.get(), client_set.get()); auto logger = std::make_unique<LoggerImpl>(); + auto* logger_ptr = logger.get(); auto controller = std::make_unique<ControllerImpl>( - config.get(), logger.get(), std::move(client_set), std::move(driver), - std::move(model), std::move(device_status_listener), navigation_monitor, - std::move(scheduler), std::move(task_scheduler), std::move(file_monitor), - files_storage_dir); - logger->SetLogSource(controller.get()); + std::move(config), std::move(logger), logger_ptr, std::move(client_set), + std::move(driver), std::move(model), std::move(device_status_listener), + navigation_monitor, std::move(scheduler), std::move(task_scheduler), + std::move(file_monitor), files_storage_dir); + logger_ptr->SetLogSource(controller.get()); - return std::make_unique<BackgroundDownloadServiceImpl>( - std::move(config), std::move(logger), std::move(controller)); + return std::make_unique<InitAwareBackgroundDownloadService>( + std::move(controller)); } // Create download service for normal profile.
diff --git a/components/download/internal/background_service/BUILD.gn b/components/download/internal/background_service/BUILD.gn index 8210afd..d646a1c0 100644 --- a/components/download/internal/background_service/BUILD.gn +++ b/components/download/internal/background_service/BUILD.gn
@@ -17,8 +17,6 @@ ] sources = [ - "background_download_service_impl.cc", - "background_download_service_impl.h", "blob_task_proxy.cc", "blob_task_proxy.h", "controller_impl.cc", @@ -108,6 +106,9 @@ "file_monitor.h", "file_monitor_impl.cc", "file_monitor_impl.h", + "init_aware_background_download_service.cc", + "init_aware_background_download_service.h", + "initializable_background_download_service.h", "log_sink.h", "log_source.h", "logger_impl.cc", @@ -187,13 +188,13 @@ if (!is_ios) { sources += [ - "background_download_service_impl_unittest.cc", "client_set_unittest.cc", "controller_impl_unittest.cc", "download_store_unittest.cc", "entry_utils_unittest.cc", "in_memory_download_driver_unittest.cc", "in_memory_download_unittest.cc", + "init_aware_background_download_service_unittest.cc", "model_impl_unittest.cc", "navigation_monitor_impl_unittests.cc", "proto_conversions_unittest.cc",
diff --git a/components/download/internal/background_service/background_download_service_impl.cc b/components/download/internal/background_service/background_download_service_impl.cc deleted file mode 100644 index 50c5fa8..0000000 --- a/components/download/internal/background_service/background_download_service_impl.cc +++ /dev/null
@@ -1,157 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/download/internal/background_service/background_download_service_impl.h" - -#include <utility> - -#include "base/bind.h" -#include "base/strings/string_util.h" -#include "components/download/internal/background_service/controller.h" -#include "components/download/internal/background_service/logger_impl.h" -#include "components/download/internal/background_service/startup_status.h" -#include "components/download/internal/background_service/stats.h" - -namespace download { - -BackgroundDownloadServiceImpl::BackgroundDownloadServiceImpl( - std::unique_ptr<Configuration> config, - std::unique_ptr<Logger> logger, - std::unique_ptr<Controller> controller) - : config_(std::move(config)), - logger_(std::move(logger)), - controller_(std::move(controller)), - service_config_(config_.get()), - startup_completed_(false) { - controller_->Initialize( - base::BindOnce(&BackgroundDownloadServiceImpl::OnControllerInitialized, - weak_ptr_factory_.GetWeakPtr())); -} - -BackgroundDownloadServiceImpl::~BackgroundDownloadServiceImpl() = default; - -const ServiceConfig& BackgroundDownloadServiceImpl::GetConfig() { - return service_config_; -} - -void BackgroundDownloadServiceImpl::OnStartScheduledTask( - DownloadTaskType task_type, - TaskFinishedCallback callback) { - if (startup_completed_) { - controller_->OnStartScheduledTask(task_type, std::move(callback)); - return; - } - - pending_tasks_[task_type] = base::BindOnce( - &Controller::OnStartScheduledTask, base::Unretained(controller_.get()), - task_type, std::move(callback)); -} - -bool BackgroundDownloadServiceImpl::OnStopScheduledTask( - DownloadTaskType task_type) { - if (startup_completed_) { - return controller_->OnStopScheduledTask(task_type); - } - - auto iter = pending_tasks_.find(task_type); - if (iter != pending_tasks_.end()) { - // We still need to run the callback in order to properly cleanup and notify - // the system by running the respective task finished callbacks. - std::move(iter->second).Run(); - pending_tasks_.erase(iter); - } - - return true; -} - -BackgroundDownloadService::ServiceStatus -BackgroundDownloadServiceImpl::GetStatus() { - switch (controller_->GetState()) { - case Controller::State::CREATED: // Intentional fallthrough. - case Controller::State::INITIALIZING: // Intentional fallthrough. - case Controller::State::RECOVERING: - return BackgroundDownloadService::ServiceStatus::STARTING_UP; - case Controller::State::READY: - return BackgroundDownloadService::ServiceStatus::READY; - case Controller::State::UNAVAILABLE: // Intentional fallthrough. - default: - return BackgroundDownloadService::ServiceStatus::UNAVAILABLE; - } -} - -void BackgroundDownloadServiceImpl::StartDownload( - DownloadParams download_params) { - stats::LogServiceApiAction(download_params.client, - stats::ServiceApiAction::START_DOWNLOAD); - if (startup_completed_) { - controller_->StartDownload(std::move(download_params)); - } else { - pending_actions_.push_back(base::BindOnce( - &Controller::StartDownload, base::Unretained(controller_.get()), - std::move(download_params))); - } -} - -void BackgroundDownloadServiceImpl::PauseDownload(const std::string& guid) { - if (startup_completed_) { - controller_->PauseDownload(guid); - } else { - pending_actions_.push_back(base::BindOnce( - &Controller::PauseDownload, base::Unretained(controller_.get()), guid)); - } -} - -void BackgroundDownloadServiceImpl::ResumeDownload(const std::string& guid) { - if (startup_completed_) { - controller_->ResumeDownload(guid); - } else { - pending_actions_.push_back( - base::BindOnce(&Controller::ResumeDownload, - base::Unretained(controller_.get()), guid)); - } -} - -void BackgroundDownloadServiceImpl::CancelDownload(const std::string& guid) { - if (startup_completed_) { - controller_->CancelDownload(guid); - } else { - pending_actions_.push_back( - base::BindOnce(&Controller::CancelDownload, - base::Unretained(controller_.get()), guid)); - } -} - -void BackgroundDownloadServiceImpl::ChangeDownloadCriteria( - const std::string& guid, - const SchedulingParams& params) { - if (startup_completed_) { - controller_->ChangeDownloadCriteria(guid, params); - } else { - pending_actions_.push_back( - base::BindOnce(&Controller::ChangeDownloadCriteria, - base::Unretained(controller_.get()), guid, params)); - } -} - -Logger* BackgroundDownloadServiceImpl::GetLogger() { - return logger_.get(); -} - -void BackgroundDownloadServiceImpl::OnControllerInitialized() { - while (!pending_actions_.empty()) { - auto callback = std::move(pending_actions_.front()); - pending_actions_.pop_front(); - std::move(callback).Run(); - } - - while (!pending_tasks_.empty()) { - auto iter = pending_tasks_.begin(); - std::move(iter->second).Run(); - pending_tasks_.erase(iter); - } - - startup_completed_ = true; -} - -} // namespace download
diff --git a/components/download/internal/background_service/background_download_service_impl.h b/components/download/internal/background_service/background_download_service_impl.h deleted file mode 100644 index 2604689c..0000000 --- a/components/download/internal/background_service/background_download_service_impl.h +++ /dev/null
@@ -1,71 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_DOWNLOAD_INTERNAL_BACKGROUND_SERVICE_BACKGROUND_DOWNLOAD_SERVICE_IMPL_H_ -#define COMPONENTS_DOWNLOAD_INTERNAL_BACKGROUND_SERVICE_BACKGROUND_DOWNLOAD_SERVICE_IMPL_H_ - -#include <map> -#include <memory> -#include <string> - -#include "base/containers/circular_deque.h" -#include "base/macros.h" -#include "base/memory/weak_ptr.h" -#include "components/download/internal/background_service/config.h" -#include "components/download/internal/background_service/service_config_impl.h" -#include "components/download/public/background_service/background_download_service.h" - -namespace download { - -class Controller; -class Logger; - -struct DownloadParams; -struct SchedulingParams; - -// The internal implementation of the BackgroundDownloadService. -class BackgroundDownloadServiceImpl : public BackgroundDownloadService { - public: - BackgroundDownloadServiceImpl(std::unique_ptr<Configuration> config, - std::unique_ptr<Logger> logger, - std::unique_ptr<Controller> controller); - ~BackgroundDownloadServiceImpl() override; - - // BackgroundDownloadService implementation. - const ServiceConfig& GetConfig() override; - void OnStartScheduledTask(DownloadTaskType task_type, - TaskFinishedCallback callback) override; - bool OnStopScheduledTask(DownloadTaskType task_type) override; - ServiceStatus GetStatus() override; - void StartDownload(DownloadParams download_params) override; - void PauseDownload(const std::string& guid) override; - void ResumeDownload(const std::string& guid) override; - void CancelDownload(const std::string& guid) override; - void ChangeDownloadCriteria(const std::string& guid, - const SchedulingParams& params) override; - Logger* GetLogger() override; - - private: - void OnControllerInitialized(); - - // config_ needs to be destructed after controller_ and service_config_ which - // hold onto references to it. - std::unique_ptr<Configuration> config_; - - std::unique_ptr<Logger> logger_; - std::unique_ptr<Controller> controller_; - ServiceConfigImpl service_config_; - - base::circular_deque<base::OnceClosure> pending_actions_; - std::map<DownloadTaskType, base::OnceClosure> pending_tasks_; - bool startup_completed_; - - base::WeakPtrFactory<BackgroundDownloadServiceImpl> weak_ptr_factory_{this}; - - DISALLOW_COPY_AND_ASSIGN(BackgroundDownloadServiceImpl); -}; - -} // namespace download - -#endif // COMPONENTS_DOWNLOAD_INTERNAL_BACKGROUND_SERVICE_BACKGROUND_DOWNLOAD_SERVICE_IMPL_H_
diff --git a/components/download/internal/background_service/controller.h b/components/download/internal/background_service/controller.h index 2d4a5fe..e73b6d4 100644 --- a/components/download/internal/background_service/controller.h +++ b/components/download/internal/background_service/controller.h
@@ -8,18 +8,14 @@ #include <string> #include "base/macros.h" -#include "components/download/public/background_service/background_download_service.h" +#include "components/download/internal/background_service/initializable_background_download_service.h" #include "components/download/public/background_service/clients.h" -#include "components/download/public/task/download_task_types.h" namespace download { -struct DownloadParams; -struct SchedulingParams; - // The core Controller responsible for gluing various BackgroundDownloadService // components together to manage the active downloads. -class Controller { +class Controller : public InitializableBackgroundDownloadService { public: enum class State { // The Controller has been created but has not been initialized yet. It @@ -42,46 +38,15 @@ }; Controller() = default; - virtual ~Controller() = default; - - // Initializes the controller. Initialization may be asynchronous. - virtual void Initialize(base::OnceClosure callback) = 0; + ~Controller() override = default; // Returns the status of Controller. virtual State GetState() = 0; - // Starts a download with |params|. See DownloadParams::StartCallback and - // DownloadParams::StartResponse for information on how a caller can determine - // whether or not the download was successfully accepted and queued. - virtual void StartDownload(DownloadParams params) = 0; - - // Pauses a download request associated with |guid| if one exists. - virtual void PauseDownload(const std::string& guid) = 0; - - // Resumes a download request associated with |guid| if one exists. The - // download request may or may not start downloading at this time, but it will - // no longer be blocked by any prior PauseDownload() actions. - virtual void ResumeDownload(const std::string& guid) = 0; - - // Cancels a download request associated with |guid| if one exists. - virtual void CancelDownload(const std::string& guid) = 0; - - // Changes the SchedulingParams of a download request associated with |guid| - // to |params|. - virtual void ChangeDownloadCriteria(const std::string& guid, - const SchedulingParams& params) = 0; - // Exposes the owner of the download request for |guid| if one exists. // Otherwise returns DownloadClient::INVALID for an unowned entry. virtual DownloadClient GetOwnerOfDownload(const std::string& guid) = 0; - // See BackgroundDownloadService::OnStartScheduledTask. - virtual void OnStartScheduledTask(DownloadTaskType task_type, - TaskFinishedCallback callback) = 0; - - // See BackgroundDownloadService::OnStopScheduledTask. - virtual bool OnStopScheduledTask(DownloadTaskType task_type) = 0; - private: DISALLOW_COPY_AND_ASSIGN(Controller); };
diff --git a/components/download/internal/background_service/controller_impl.cc b/components/download/internal/background_service/controller_impl.cc index d1a8faf..948dd45 100644 --- a/components/download/internal/background_service/controller_impl.cc +++ b/components/download/internal/background_service/controller_impl.cc
@@ -22,6 +22,7 @@ #include "components/download/internal/background_service/entry_utils.h" #include "components/download/internal/background_service/file_monitor.h" #include "components/download/internal/background_service/log_sink.h" +#include "components/download/internal/background_service/logger_impl.h" #include "components/download/internal/background_service/model.h" #include "components/download/internal/background_service/scheduler/scheduler.h" #include "components/download/internal/background_service/stats.h" @@ -105,7 +106,8 @@ } // namespace ControllerImpl::ControllerImpl( - Configuration* config, + std::unique_ptr<Configuration> config, + std::unique_ptr<Logger> logger, LogSink* log_sink, std::unique_ptr<ClientSet> clients, std::unique_ptr<DownloadDriver> driver, @@ -116,9 +118,11 @@ std::unique_ptr<TaskScheduler> task_scheduler, std::unique_ptr<FileMonitor> file_monitor, const base::FilePath& download_file_dir) - : config_(config), + : download_file_dir_(download_file_dir), + config_(std::move(config)), + service_config_(config_.get()), + logger_(std::move(logger)), log_sink_(log_sink), - download_file_dir_(download_file_dir), clients_(std::move(clients)), driver_(std::move(driver)), model_(std::move(model)), @@ -159,6 +163,24 @@ navigation_monitor_->SetObserver(this); } +const ServiceConfig& ControllerImpl::GetConfig() { + return service_config_; +} + +BackgroundDownloadService::ServiceStatus ControllerImpl::GetStatus() { + switch (GetState()) { + case Controller::State::CREATED: // Intentional fallthrough. + case Controller::State::INITIALIZING: // Intentional fallthrough. + case Controller::State::RECOVERING: + return BackgroundDownloadService::ServiceStatus::STARTING_UP; + case Controller::State::READY: + return BackgroundDownloadService::ServiceStatus::READY; + case Controller::State::UNAVAILABLE: // Intentional fallthrough. + default: + return BackgroundDownloadService::ServiceStatus::UNAVAILABLE; + } +} + Controller::State ControllerImpl::GetState() { return controller_state_; } @@ -344,6 +366,10 @@ return false; } +Logger* ControllerImpl::GetLogger() { + return logger_.get(); +} + void ControllerImpl::OnCompleteCleanupTask() { HandleTaskFinished(DownloadTaskType::CLEANUP_TASK, false, stats::ScheduledTaskStatus::COMPLETED_NORMALLY); @@ -1277,7 +1303,7 @@ uint32_t paused_count = entries_states[Entry::State::PAUSED]; uint32_t active_count = entries_states[Entry::State::ACTIVE]; - while (CanActivateMoreDownloads(config_, active_count, paused_count)) { + while (CanActivateMoreDownloads(config_.get(), active_count, paused_count)) { Entry* next = scheduler_->Next( model_->PeekEntries(), device_status_listener_->CurrentDeviceStatus()); if (!next)
diff --git a/components/download/internal/background_service/controller_impl.h b/components/download/internal/background_service/controller_impl.h index d1feb345..8fc9220 100644 --- a/components/download/internal/background_service/controller_impl.h +++ b/components/download/internal/background_service/controller_impl.h
@@ -22,6 +22,7 @@ #include "components/download/internal/background_service/log_source.h" #include "components/download/internal/background_service/model.h" #include "components/download/internal/background_service/scheduler/device_status_listener.h" +#include "components/download/internal/background_service/service_config_impl.h" #include "components/download/internal/background_service/startup_status.h" #include "components/download/internal/background_service/stats.h" #include "components/download/public/background_service/client.h" @@ -56,7 +57,8 @@ public: // |config| and |log_sink| are externally owned and must be guaranteed to // outlive this class. - ControllerImpl(Configuration* config, + ControllerImpl(std::unique_ptr<Configuration> config, + std::unique_ptr<Logger> logger, LogSink* log_sink, std::unique_ptr<ClientSet> clients, std::unique_ptr<DownloadDriver> driver, @@ -71,6 +73,8 @@ // Controller implementation. void Initialize(base::OnceClosure callback) override; + const ServiceConfig& GetConfig() override; + BackgroundDownloadService::ServiceStatus GetStatus() override; State GetState() override; void StartDownload(DownloadParams params) override; void PauseDownload(const std::string& guid) override; @@ -82,6 +86,7 @@ void OnStartScheduledTask(DownloadTaskType task_type, TaskFinishedCallback callback) override; bool OnStopScheduledTask(DownloadTaskType task_type) override; + Logger* GetLogger() override; private: // DownloadDriver::Client implementation. @@ -248,13 +253,14 @@ // received upload data from their respective clients. void KillTimedOutUploads(); - Configuration* config_; - LogSink* log_sink_; - // The directory in which the downloaded files are stored. const base::FilePath download_file_dir_; // Owned Dependencies. + std::unique_ptr<Configuration> config_; + ServiceConfigImpl service_config_; + std::unique_ptr<Logger> logger_; + LogSink* log_sink_; std::unique_ptr<ClientSet> clients_; std::unique_ptr<DownloadDriver> driver_; std::unique_ptr<Model> model_;
diff --git a/components/download/internal/background_service/controller_impl_unittest.cc b/components/download/internal/background_service/controller_impl_unittest.cc index 968d4d9..8ce18cd0 100644 --- a/components/download/internal/background_service/controller_impl_unittest.cc +++ b/components/download/internal/background_service/controller_impl_unittest.cc
@@ -33,6 +33,7 @@ #include "components/download/internal/background_service/test/test_download_driver.h" #include "components/download/internal/background_service/test/test_store.h" #include "components/download/public/background_service/test/empty_client.h" +#include "components/download/public/background_service/test/empty_logger.h" #include "components/download/public/background_service/test/mock_client.h" #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" #include "services/network/public/cpp/resource_request_body.h" @@ -146,14 +147,15 @@ auto client3 = std::make_unique<NiceMock<UploadClient>>(); auto driver = std::make_unique<test::TestDownloadDriver>(); auto store = std::make_unique<test::TestStore>(); - config_ = std::make_unique<Configuration>(); + auto config = std::make_unique<Configuration>(); + config_ = config.get(); config_->max_retry_count = 1; config_->max_resumption_count = 4; config_->file_keep_alive_time = base::TimeDelta::FromMinutes(10); config_->file_cleanup_window = base::TimeDelta::FromMinutes(5); config_->max_concurrent_downloads = 5; config_->max_running_downloads = 5; - + auto logger = std::make_unique<test::EmptyLogger>(); log_sink_ = std::make_unique<test::BlackHoleLogSink>(); client_ = client.get(); @@ -183,9 +185,10 @@ file_monitor_ = file_monitor.get(); controller_ = std::make_unique<ControllerImpl>( - config_.get(), log_sink_.get(), std::move(client_set), - std::move(driver), std::move(model), std::move(device_status_listener), - &navigation_monitor, std::move(scheduler), std::move(task_scheduler), + std::move(config), std::move(logger), log_sink_.get(), + std::move(client_set), std::move(driver), std::move(model), + std::move(device_status_listener), &navigation_monitor, + std::move(scheduler), std::move(task_scheduler), std::move(file_monitor), download_file_dir); } @@ -217,7 +220,7 @@ base::ThreadTaskRunnerHandle handle_; std::unique_ptr<ControllerImpl> controller_; - std::unique_ptr<Configuration> config_; + Configuration* config_; std::unique_ptr<LogSink> log_sink_; NavigationMonitorImpl navigation_monitor; test::MockClient* client_;
diff --git a/components/download/internal/background_service/init_aware_background_download_service.cc b/components/download/internal/background_service/init_aware_background_download_service.cc new file mode 100644 index 0000000..0f4195d --- /dev/null +++ b/components/download/internal/background_service/init_aware_background_download_service.cc
@@ -0,0 +1,144 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/download/internal/background_service/init_aware_background_download_service.h" + +#include <utility> + +#include "base/bind.h" +#include "base/strings/string_util.h" +#include "components/download/internal/background_service/initializable_background_download_service.h" +#include "components/download/internal/background_service/stats.h" + +namespace download { + +InitAwareBackgroundDownloadService::InitAwareBackgroundDownloadService( + std::unique_ptr<InitializableBackgroundDownloadService> service) + : service_(std::move(service)), startup_completed_(false) { + service_->Initialize( + base::BindOnce(&InitAwareBackgroundDownloadService::OnServiceInitialized, + weak_ptr_factory_.GetWeakPtr())); +} + +InitAwareBackgroundDownloadService::~InitAwareBackgroundDownloadService() = + default; + +const ServiceConfig& InitAwareBackgroundDownloadService::GetConfig() { + return service_->GetConfig(); +} + +void InitAwareBackgroundDownloadService::OnStartScheduledTask( + DownloadTaskType task_type, + TaskFinishedCallback callback) { + if (startup_completed_) { + service_->OnStartScheduledTask(task_type, std::move(callback)); + return; + } + + pending_tasks_[task_type] = base::BindOnce( + &InitializableBackgroundDownloadService::OnStartScheduledTask, + base::Unretained(service_.get()), task_type, std::move(callback)); +} + +bool InitAwareBackgroundDownloadService::OnStopScheduledTask( + DownloadTaskType task_type) { + if (startup_completed_) { + return service_->OnStopScheduledTask(task_type); + } + + auto iter = pending_tasks_.find(task_type); + if (iter != pending_tasks_.end()) { + // We still need to run the callback in order to properly cleanup and notify + // the system by running the respective task finished callbacks. + std::move(iter->second).Run(); + pending_tasks_.erase(iter); + } + + return true; +} + +BackgroundDownloadService::ServiceStatus +InitAwareBackgroundDownloadService::GetStatus() { + return service_->GetStatus(); +} + +void InitAwareBackgroundDownloadService::StartDownload( + DownloadParams download_params) { + stats::LogServiceApiAction(download_params.client, + stats::ServiceApiAction::START_DOWNLOAD); + if (startup_completed_) { + service_->StartDownload(std::move(download_params)); + } else { + pending_actions_.push_back(base::BindOnce( + &InitializableBackgroundDownloadService::StartDownload, + base::Unretained(service_.get()), std::move(download_params))); + } +} + +void InitAwareBackgroundDownloadService::PauseDownload( + const std::string& guid) { + if (startup_completed_) { + service_->PauseDownload(guid); + } else { + pending_actions_.push_back( + base::BindOnce(&InitializableBackgroundDownloadService::PauseDownload, + base::Unretained(service_.get()), guid)); + } +} + +void InitAwareBackgroundDownloadService::ResumeDownload( + const std::string& guid) { + if (startup_completed_) { + service_->ResumeDownload(guid); + } else { + pending_actions_.push_back( + base::BindOnce(&InitializableBackgroundDownloadService::ResumeDownload, + base::Unretained(service_.get()), guid)); + } +} + +void InitAwareBackgroundDownloadService::CancelDownload( + const std::string& guid) { + if (startup_completed_) { + service_->CancelDownload(guid); + } else { + pending_actions_.push_back( + base::BindOnce(&InitializableBackgroundDownloadService::CancelDownload, + base::Unretained(service_.get()), guid)); + } +} + +void InitAwareBackgroundDownloadService::ChangeDownloadCriteria( + const std::string& guid, + const SchedulingParams& params) { + if (startup_completed_) { + service_->ChangeDownloadCriteria(guid, params); + } else { + pending_actions_.push_back(base::BindOnce( + &InitializableBackgroundDownloadService::ChangeDownloadCriteria, + base::Unretained(service_.get()), guid, params)); + } +} + +Logger* InitAwareBackgroundDownloadService::GetLogger() { + return service_->GetLogger(); +} + +void InitAwareBackgroundDownloadService::OnServiceInitialized() { + while (!pending_actions_.empty()) { + auto callback = std::move(pending_actions_.front()); + pending_actions_.pop_front(); + std::move(callback).Run(); + } + + while (!pending_tasks_.empty()) { + auto iter = pending_tasks_.begin(); + std::move(iter->second).Run(); + pending_tasks_.erase(iter); + } + + startup_completed_ = true; +} + +} // namespace download
diff --git a/components/download/internal/background_service/init_aware_background_download_service.h b/components/download/internal/background_service/init_aware_background_download_service.h new file mode 100644 index 0000000..e0b0134 --- /dev/null +++ b/components/download/internal/background_service/init_aware_background_download_service.h
@@ -0,0 +1,63 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_DOWNLOAD_INTERNAL_BACKGROUND_SERVICE_INIT_AWARE_BACKGROUND_DOWNLOAD_SERVICE_H_ +#define COMPONENTS_DOWNLOAD_INTERNAL_BACKGROUND_SERVICE_INIT_AWARE_BACKGROUND_DOWNLOAD_SERVICE_H_ + +#include <map> +#include <memory> +#include <string> + +#include "base/containers/circular_deque.h" +#include "base/macros.h" +#include "base/memory/weak_ptr.h" +#include "components/download/public/background_service/background_download_service.h" + +namespace download { + +class InitializableBackgroundDownloadService; +class Logger; + +struct DownloadParams; +struct SchedulingParams; + +// The internal implementation of the BackgroundDownloadService. +class InitAwareBackgroundDownloadService : public BackgroundDownloadService { + public: + explicit InitAwareBackgroundDownloadService( + std::unique_ptr<InitializableBackgroundDownloadService> service); + ~InitAwareBackgroundDownloadService() override; + + // BackgroundDownloadService implementation. + const ServiceConfig& GetConfig() override; + void OnStartScheduledTask(DownloadTaskType task_type, + TaskFinishedCallback callback) override; + bool OnStopScheduledTask(DownloadTaskType task_type) override; + ServiceStatus GetStatus() override; + void StartDownload(DownloadParams download_params) override; + void PauseDownload(const std::string& guid) override; + void ResumeDownload(const std::string& guid) override; + void CancelDownload(const std::string& guid) override; + void ChangeDownloadCriteria(const std::string& guid, + const SchedulingParams& params) override; + Logger* GetLogger() override; + + private: + void OnServiceInitialized(); + + std::unique_ptr<InitializableBackgroundDownloadService> service_; + + base::circular_deque<base::OnceClosure> pending_actions_; + std::map<DownloadTaskType, base::OnceClosure> pending_tasks_; + bool startup_completed_; + + base::WeakPtrFactory<InitAwareBackgroundDownloadService> weak_ptr_factory_{ + this}; + + DISALLOW_COPY_AND_ASSIGN(InitAwareBackgroundDownloadService); +}; + +} // namespace download + +#endif // COMPONENTS_DOWNLOAD_INTERNAL_BACKGROUND_SERVICE_INIT_AWARE_BACKGROUND_DOWNLOAD_SERVICE_H_
diff --git a/components/download/internal/background_service/background_download_service_impl_unittest.cc b/components/download/internal/background_service/init_aware_background_download_service_unittest.cc similarity index 75% rename from components/download/internal/background_service/background_download_service_impl_unittest.cc rename to components/download/internal/background_service/init_aware_background_download_service_unittest.cc index c364abf5..791a96a 100644 --- a/components/download/internal/background_service/background_download_service_impl_unittest.cc +++ b/components/download/internal/background_service/init_aware_background_download_service_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/download/internal/background_service/background_download_service_impl.h" +#include "components/download/internal/background_service/init_aware_background_download_service.h" #include <memory> @@ -11,11 +11,9 @@ #include "base/test/metrics/histogram_tester.h" #include "base/test/test_simple_task_runner.h" #include "base/threading/thread_task_runner_handle.h" -#include "components/download/internal/background_service/startup_status.h" #include "components/download/internal/background_service/stats.h" #include "components/download/internal/background_service/test/download_params_utils.h" #include "components/download/internal/background_service/test/mock_controller.h" -#include "components/download/public/background_service/test/empty_logger.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -25,40 +23,38 @@ namespace download { namespace { -class BackgroundDownloadServiceImplTest : public testing::Test { +class InitAwareBackgroundDownloadServiceTest : public testing::Test { public: - BackgroundDownloadServiceImplTest() + InitAwareBackgroundDownloadServiceTest() : controller_(nullptr), task_runner_(new base::TestSimpleTaskRunner), handle_(task_runner_) {} - ~BackgroundDownloadServiceImplTest() override = default; + ~InitAwareBackgroundDownloadServiceTest() override = default; void SetUp() override { - auto config = std::make_unique<Configuration>(); - auto logger = std::make_unique<test::EmptyLogger>(); auto controller = std::make_unique<test::MockController>(); controller_ = controller.get(); - service_ = std::make_unique<BackgroundDownloadServiceImpl>( - std::move(config), std::move(logger), std::move(controller)); + service_ = std::make_unique<InitAwareBackgroundDownloadService>( + std::move(controller)); } protected: test::MockController* controller_; - std::unique_ptr<BackgroundDownloadServiceImpl> service_; + std::unique_ptr<InitAwareBackgroundDownloadService> service_; scoped_refptr<base::TestSimpleTaskRunner> task_runner_; base::ThreadTaskRunnerHandle handle_; - DISALLOW_COPY_AND_ASSIGN(BackgroundDownloadServiceImplTest); + DISALLOW_COPY_AND_ASSIGN(InitAwareBackgroundDownloadServiceTest); }; } // namespace -TEST_F(BackgroundDownloadServiceImplTest, TestGetStatus) { +TEST_F(InitAwareBackgroundDownloadServiceTest, TestGetStatus) { StartupStatus startup_status; - EXPECT_CALL(*controller_, GetState()) - .WillOnce(Return(Controller::State::INITIALIZING)) - .WillOnce(Return(Controller::State::READY)) - .WillOnce(Return(Controller::State::UNAVAILABLE)); + EXPECT_CALL(*controller_, GetStatus()) + .WillOnce(Return(BackgroundDownloadService::ServiceStatus::STARTING_UP)) + .WillOnce(Return(BackgroundDownloadService::ServiceStatus::READY)) + .WillOnce(Return(BackgroundDownloadService::ServiceStatus::UNAVAILABLE)); EXPECT_EQ(BackgroundDownloadService::ServiceStatus::STARTING_UP, service_->GetStatus()); @@ -68,7 +64,7 @@ service_->GetStatus()); } -TEST_F(BackgroundDownloadServiceImplTest, TestApiPassThrough) { +TEST_F(InitAwareBackgroundDownloadServiceTest, TestApiPassThrough) { DownloadParams params = test::BuildBasicDownloadParams(); auto guid = params.guid; SchedulingParams scheduling_params; @@ -77,7 +73,7 @@ EXPECT_CALL(*controller_, GetOwnerOfDownload(_)) .WillRepeatedly(Return(DownloadClient::TEST)); - EXPECT_CALL(*controller_, StartDownload_(_)).Times(0); + EXPECT_CALL(*controller_, StartDownload(_)).Times(0); EXPECT_CALL(*controller_, PauseDownload(params.guid)).Times(0); EXPECT_CALL(*controller_, ResumeDownload(params.guid)).Times(0); EXPECT_CALL(*controller_, CancelDownload(params.guid)).Times(0); @@ -110,7 +106,7 @@ task_runner_->RunUntilIdle(); testing::Sequence seq1; - EXPECT_CALL(*controller_, StartDownload_(_)).Times(1).InSequence(seq1); + EXPECT_CALL(*controller_, StartDownload(_)).Times(1).InSequence(seq1); EXPECT_CALL(*controller_, PauseDownload(guid)).Times(1).InSequence(seq1); EXPECT_CALL(*controller_, ResumeDownload(guid)).Times(1).InSequence(seq1); EXPECT_CALL(*controller_, CancelDownload(guid)).Times(1).InSequence(seq1);
diff --git a/components/download/internal/background_service/initializable_background_download_service.h b/components/download/internal/background_service/initializable_background_download_service.h new file mode 100644 index 0000000..8e3bf3c --- /dev/null +++ b/components/download/internal/background_service/initializable_background_download_service.h
@@ -0,0 +1,28 @@ +// 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 COMPONENTS_DOWNLOAD_INTERNAL_BACKGROUND_SERVICE_INITIALIZABLE_BACKGROUND_DOWNLOAD_SERVICE_H_ +#define COMPONENTS_DOWNLOAD_INTERNAL_BACKGROUND_SERVICE_INITIALIZABLE_BACKGROUND_DOWNLOAD_SERVICE_H_ + +#include "base/callback_forward.h" +#include "components/download/public/background_service/background_download_service.h" + +namespace download { + +// A Background download service that needs to be explicitly initialized. +class InitializableBackgroundDownloadService + : public BackgroundDownloadService { + public: + // Initializes the background download service. + virtual void Initialize(base::OnceClosure callback) = 0; + + ~InitializableBackgroundDownloadService() override = default; + + protected: + InitializableBackgroundDownloadService() = default; +}; + +} // namespace download + +#endif // COMPONENTS_DOWNLOAD_INTERNAL_BACKGROUND_SERVICE_INITIALIZABLE_BACKGROUND_DOWNLOAD_SERVICE_H_
diff --git a/components/download/internal/background_service/ios/background_download_service_impl.cc b/components/download/internal/background_service/ios/background_download_service_impl.cc index a2b56a2d..62ae79f 100644 --- a/components/download/internal/background_service/ios/background_download_service_impl.cc +++ b/components/download/internal/background_service/ios/background_download_service_impl.cc
@@ -53,11 +53,15 @@ download_dir_(download_dir) { // iOS doesn't use driver interface, mark it ready. startup_status_.driver_ok = true; - model_->Initialize(this); } BackgroundDownloadServiceImpl::~BackgroundDownloadServiceImpl() = default; +void BackgroundDownloadServiceImpl::Initialize(base::OnceClosure callback) { + init_callback_ = std::move(callback); + model_->Initialize(this); +} + const ServiceConfig& BackgroundDownloadServiceImpl::GetConfig() { NOTREACHED() << " This function is not supported on iOS."; return service_config_; @@ -86,8 +90,6 @@ void BackgroundDownloadServiceImpl::StartDownload( DownloadParams download_params) { - // TODO(xingliu): Refactor non-iOS download service to share cached api - // functionality. if (GetStatus() != BackgroundDownloadService::ServiceStatus::READY) { LOG(ERROR) << "Background download service is not intialized successfully."; InvokeStartCallback(download_params.client, download_params.guid, @@ -190,6 +192,8 @@ DCHECK(startup_status_.Ok()); log_sink_->OnServiceStatusChanged(); stats::LogStartUpResult(false, stats::StartUpResult::SUCCESS); + if (init_callback_) + std::move(init_callback_).Run(); // Report download metadata to clients. auto metadata_map = util::MapEntriesToMetadataForClients(
diff --git a/components/download/internal/background_service/ios/background_download_service_impl.h b/components/download/internal/background_service/ios/background_download_service_impl.h index 96477ec..bed41b5 100644 --- a/components/download/internal/background_service/ios/background_download_service_impl.h +++ b/components/download/internal/background_service/ios/background_download_service_impl.h
@@ -12,11 +12,11 @@ #include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" #include "base/time/clock.h" +#include "components/download/internal/background_service/initializable_background_download_service.h" #include "components/download/internal/background_service/log_source.h" #include "components/download/internal/background_service/model_impl.h" #include "components/download/internal/background_service/service_config_impl.h" #include "components/download/internal/background_service/startup_status.h" -#include "components/download/public/background_service/background_download_service.h" #include "components/download/public/task/download_task_types.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -32,9 +32,10 @@ struct DownloadParams; struct SchedulingParams; -class BackgroundDownloadServiceImpl : public BackgroundDownloadService, - public LogSource, - public Model::Client { +class BackgroundDownloadServiceImpl + : public InitializableBackgroundDownloadService, + public LogSource, + public Model::Client { public: BackgroundDownloadServiceImpl( std::unique_ptr<ClientSet> clients, @@ -48,7 +49,8 @@ ~BackgroundDownloadServiceImpl() override; private: - // BackgroundDownloadService implementation. + // InitializableBackgroundDownloadService implementation. + void Initialize(base::OnceClosure callback) override; const ServiceConfig& GetConfig() override; void OnStartScheduledTask(DownloadTaskType task_type, TaskFinishedCallback callback) override; @@ -113,6 +115,7 @@ std::map<std::string, DownloadParams::StartCallback> start_callbacks_; base::Time update_time_; base::Clock* clock_; + base::OnceClosure init_callback_; // A directory to hold download service files. The files in here will be // pruned frequently.
diff --git a/components/download/internal/background_service/ios/background_download_service_impl_unittest.cc b/components/download/internal/background_service/ios/background_download_service_impl_unittest.cc index 0b7d4a5..e700a58 100644 --- a/components/download/internal/background_service/ios/background_download_service_impl_unittest.cc +++ b/components/download/internal/background_service/ios/background_download_service_impl_unittest.cc
@@ -90,9 +90,10 @@ &clock_); ON_CALL(*file_monitor_, DeleteUnknownFiles(_, _, _)) .WillByDefault(RunOnceCallback<2>()); + service_->Initialize(base::DoNothing()); } - BackgroundDownloadService* service() { return service_.get(); } + InitializableBackgroundDownloadService* service() { return service_.get(); } std::unique_ptr<std::vector<Entry>> empty_entries() { return std::make_unique<std::vector<Entry>>(); } @@ -122,7 +123,7 @@ private: test::BlackHoleLogSink log_sink_; - std::unique_ptr<BackgroundDownloadServiceImpl> service_; + std::unique_ptr<InitializableBackgroundDownloadService> service_; }; TEST_F(BackgroundDownloadServiceImplTest, InitSuccess) {
diff --git a/components/download/internal/background_service/test/mock_controller.h b/components/download/internal/background_service/test/mock_controller.h index 41c0864..f6e756c 100644 --- a/components/download/internal/background_service/test/mock_controller.h +++ b/components/download/internal/background_service/test/mock_controller.h
@@ -23,21 +23,30 @@ // Controller implementation. void Initialize(base::OnceClosure callback) override; - MOCK_METHOD0(GetState, Controller::State()); - void StartDownload(DownloadParams download_params) override { - // Redirect as gmock can't handle move-only types. - StartDownload_(download_params); - } - MOCK_METHOD1(StartDownload_, void(DownloadParams&)); - MOCK_METHOD1(PauseDownload, void(const std::string&)); - MOCK_METHOD1(ResumeDownload, void(const std::string&)); - MOCK_METHOD1(CancelDownload, void(const std::string&)); - MOCK_METHOD2(ChangeDownloadCriteria, - void(const std::string&, const SchedulingParams&)); - MOCK_METHOD1(GetOwnerOfDownload, DownloadClient(const std::string&)); - MOCK_METHOD2(OnStartScheduledTask, - void(DownloadTaskType, TaskFinishedCallback)); - MOCK_METHOD1(OnStopScheduledTask, bool(DownloadTaskType task_type)); + MOCK_METHOD(Controller::State, GetState, (), (override)); + MOCK_METHOD(const ServiceConfig&, GetConfig, (), (override)); + MOCK_METHOD(BackgroundDownloadService::ServiceStatus, + GetStatus, + (), + (override)); + MOCK_METHOD(void, StartDownload, (DownloadParams), (override)); + MOCK_METHOD(void, PauseDownload, (const std::string&), (override)); + MOCK_METHOD(void, ResumeDownload, (const std::string&), (override)); + MOCK_METHOD(void, CancelDownload, (const std::string&), (override)); + MOCK_METHOD(void, + ChangeDownloadCriteria, + (const std::string&, const SchedulingParams&), + (override)); + MOCK_METHOD(DownloadClient, + GetOwnerOfDownload, + (const std::string&), + (override)); + MOCK_METHOD(void, + OnStartScheduledTask, + (DownloadTaskType, TaskFinishedCallback), + (override)); + MOCK_METHOD(bool, OnStopScheduledTask, (DownloadTaskType), (override)); + MOCK_METHOD(Logger*, GetLogger, (), (override)); void TriggerInitCompleted();
diff --git a/components/download/internal/common/download_utils.cc b/components/download/internal/common/download_utils.cc index fe5303a..7dd7812 100644 --- a/components/download/internal/common/download_utils.cc +++ b/components/download/internal/common/download_utils.cc
@@ -272,6 +272,7 @@ request->url = params->url(); request->request_initiator = params->initiator(); request->trusted_params = network::ResourceRequest::TrustedParams(); + request->has_user_gesture = params->has_user_gesture(); if (params->isolation_info().has_value()) { request->trusted_params->isolation_info = params->isolation_info().value();
diff --git a/components/download/public/common/download_url_parameters.cc b/components/download/public/common/download_url_parameters.cc index 0d898ac9..3d571542f 100644 --- a/components/download/public/common/download_url_parameters.cc +++ b/components/download/public/common/download_url_parameters.cc
@@ -32,7 +32,8 @@ transient_(false), traffic_annotation_(traffic_annotation), download_source_(DownloadSource::UNKNOWN), - require_safety_checks_(true) {} + require_safety_checks_(true), + has_user_gesture_(false) {} DownloadUrlParameters::~DownloadUrlParameters() = default;
diff --git a/components/download/public/common/download_url_parameters.h b/components/download/public/common/download_url_parameters.h index 903a532..8f2fb1a 100644 --- a/components/download/public/common/download_url_parameters.h +++ b/components/download/public/common/download_url_parameters.h
@@ -260,6 +260,10 @@ isolation_info_ = isolation_info; } + void set_has_user_gesture(bool has_user_gesture) { + has_user_gesture_ = has_user_gesture; + } + OnStartedCallback& callback() { return callback_; } bool content_initiated() const { return content_initiated_; } const std::string& last_modified() const { return last_modified_; } @@ -308,6 +312,7 @@ const absl::optional<net::IsolationInfo>& isolation_info() const { return isolation_info_; } + bool has_user_gesture() const { return has_user_gesture_; } // STATE CHANGING: All save_info_ sub-objects will be in an indeterminate // state following this call. @@ -354,6 +359,7 @@ UploadProgressCallback upload_callback_; bool require_safety_checks_; absl::optional<net::IsolationInfo> isolation_info_; + bool has_user_gesture_; DISALLOW_COPY_AND_ASSIGN(DownloadUrlParameters); };
diff --git a/components/feedback/OWNERS b/components/feedback/OWNERS index 795f92a..3de1c82a 100644 --- a/components/feedback/OWNERS +++ b/components/feedback/OWNERS
@@ -1,6 +1,5 @@ # Primary OWNERS jimmyxgong@chromium.org -joonbug@chromium.org # Backup OWNERS zentaro@chromium.org
diff --git a/components/full_restore/app_restore_data.h b/components/full_restore/app_restore_data.h index 87a7f06..7fef52ed 100644 --- a/components/full_restore/app_restore_data.h +++ b/components/full_restore/app_restore_data.h
@@ -95,7 +95,6 @@ absl::optional<int32_t> activation_index; absl::optional<int32_t> desk_id; absl::optional<bool> visible_on_all_workspaces; - absl::optional<gfx::Rect> restore_bounds; absl::optional<gfx::Rect> current_bounds; absl::optional<chromeos::WindowStateType> window_state_type; absl::optional<ui::WindowShowState> pre_minimized_show_state_type;
diff --git a/components/gwp_asan/crash_handler/crash_analyzer_unittest.cc b/components/gwp_asan/crash_handler/crash_analyzer_unittest.cc index ada2af8..f5e5034f 100644 --- a/components/gwp_asan/crash_handler/crash_analyzer_unittest.cc +++ b/components/gwp_asan/crash_handler/crash_analyzer_unittest.cc
@@ -29,6 +29,10 @@ #include "third_party/crashpad/crashpad/test/process_type.h" #include "third_party/crashpad/crashpad/util/process/process_memory_native.h" +#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS) +#include "third_party/crashpad/crashpad/test/linux/fake_ptrace_connection.h" +#endif + namespace gwp_asan { namespace internal { @@ -74,8 +78,13 @@ crashpad::CPUArchitecture::kCPUArchitectureX86; #endif +#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS) + ASSERT_TRUE(connection_.Initialize(getpid())); + auto memory = std::make_unique<crashpad::ProcessMemoryLinux>(&connection_); +#else auto memory = std::make_unique<crashpad::ProcessMemoryNative>(); ASSERT_TRUE(memory->Initialize(crashpad::test::GetSelfProcess())); +#endif // OS_ANDROID || OS_LINUX || OS_CHROMEOS process_snapshot_.AddModule(std::move(module)); process_snapshot_.SetException(std::move(exception)); @@ -84,6 +93,10 @@ GuardedPageAllocator gpa_; crashpad::test::TestProcessSnapshot process_snapshot_; +#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS) + crashpad::test::FakePtraceConnection connection_; +#endif + }; // Stack trace collection on Android builds with frame pointers enabled does
diff --git a/components/omnibox/browser/actions/omnibox_pedal.cc b/components/omnibox/browser/actions/omnibox_pedal.cc index 2f46971..a6b7baf2 100644 --- a/components/omnibox/browser/actions/omnibox_pedal.cc +++ b/components/omnibox/browser/actions/omnibox_pedal.cc
@@ -254,11 +254,7 @@ #if (!defined(OS_ANDROID) || BUILDFLAG(ENABLE_VR)) && !defined(OS_IOS) // static const gfx::VectorIcon& OmniboxPedal::GetDefaultVectorIcon() { - if (OmniboxFieldTrial::IsPedalsDefaultIconColored()) { - return omnibox::kPedalIcon; - } else { - return omnibox::kProductIcon; - } + return omnibox::kPedalIcon; } const gfx::VectorIcon& OmniboxPedal::GetVectorIcon() const {
diff --git a/components/omnibox/browser/actions/omnibox_pedal_implementations.cc b/components/omnibox/browser/actions/omnibox_pedal_implementations.cc index a30324c0..d6f955c 100644 --- a/components/omnibox/browser/actions/omnibox_pedal_implementations.cc +++ b/components/omnibox/browser/actions/omnibox_pedal_implementations.cc
@@ -1107,26 +1107,24 @@ add(new OmniboxPedalLaunchIncognito()); add(new OmniboxPedalTranslate()); add(new OmniboxPedalUpdateChrome()); - if (OmniboxFieldTrial::IsPedalsBatch2Enabled()) { - add(new OmniboxPedalRunChromeSafetyCheck()); - add(new OmniboxPedalManageSecuritySettings()); - add(new OmniboxPedalManageCookies()); - add(new OmniboxPedalManageAddresses()); - add(new OmniboxPedalManageSync()); - add(new OmniboxPedalManageSiteSettings()); - add(new OmniboxPedalSeeChromeTips()); + add(new OmniboxPedalRunChromeSafetyCheck()); + add(new OmniboxPedalManageSecuritySettings()); + add(new OmniboxPedalManageCookies()); + add(new OmniboxPedalManageAddresses()); + add(new OmniboxPedalManageSync()); + add(new OmniboxPedalManageSiteSettings()); + add(new OmniboxPedalSeeChromeTips()); - if (with_branding) { - add(new OmniboxPedalCreateGoogleDoc()); - add(new OmniboxPedalCreateGoogleSheet()); - add(new OmniboxPedalCreateGoogleSlide()); - add(new OmniboxPedalCreateGoogleCalendarEvent()); - add(new OmniboxPedalCreateGoogleSite()); - add(new OmniboxPedalCreateGoogleKeepNote()); - add(new OmniboxPedalCreateGoogleForm()); - add(new OmniboxPedalManageGoogleAccount()); - add(new OmniboxPedalChangeGooglePassword()); - } + if (with_branding) { + add(new OmniboxPedalCreateGoogleDoc()); + add(new OmniboxPedalCreateGoogleSheet()); + add(new OmniboxPedalCreateGoogleSlide()); + add(new OmniboxPedalCreateGoogleCalendarEvent()); + add(new OmniboxPedalCreateGoogleSite()); + add(new OmniboxPedalCreateGoogleKeepNote()); + add(new OmniboxPedalCreateGoogleForm()); + add(new OmniboxPedalManageGoogleAccount()); + add(new OmniboxPedalChangeGooglePassword()); } if (OmniboxFieldTrial::IsPedalsBatch3Enabled()) { if (incognito) {
diff --git a/components/omnibox/browser/actions/omnibox_pedal_implementations_unittest.cc b/components/omnibox/browser/actions/omnibox_pedal_implementations_unittest.cc index 4e73c6e..085fedbe 100644 --- a/components/omnibox/browser/actions/omnibox_pedal_implementations_unittest.cc +++ b/components/omnibox/browser/actions/omnibox_pedal_implementations_unittest.cc
@@ -24,8 +24,7 @@ void SetUp() override { feature_list_.InitWithFeatures( - {omnibox::kOmniboxPedalsBatch2, omnibox::kOmniboxPedalsBatch2NonEnglish, - omnibox::kOmniboxPedalsBatch3, + {omnibox::kOmniboxPedalsBatch2NonEnglish, omnibox::kOmniboxPedalsBatch3, omnibox::kOmniboxPedalsTranslationConsole}, {}); } @@ -16421,7 +16420,6 @@ void SetUp() override { feature_list_.InitWithFeatures( { - omnibox::kOmniboxPedalsBatch2, omnibox::kOmniboxPedalsBatch2NonEnglish, omnibox::kOmniboxPedalsBatch3, },
diff --git a/components/omnibox/browser/actions/omnibox_pedal_provider.cc b/components/omnibox/browser/actions/omnibox_pedal_provider.cc index d5f546da..085c4a6 100644 --- a/components/omnibox/browser/actions/omnibox_pedal_provider.cc +++ b/components/omnibox/browser/actions/omnibox_pedal_provider.cc
@@ -318,9 +318,8 @@ // not enabled for the current locale. if (id >= static_cast<int>(OmniboxPedalId::RUN_CHROME_SAFETY_CHECK) && id <= static_cast<int>(OmniboxPedalId::CHANGE_GOOGLE_PASSWORD) && - !(OmniboxFieldTrial::IsPedalsBatch2Enabled() && - (locale_is_english || - OmniboxFieldTrial::IsPedalsBatch2NonEnglishEnabled()))) { + !(locale_is_english || + OmniboxFieldTrial::IsPedalsBatch2NonEnglishEnabled())) { continue; } const auto pedal_iter = pedals_.find(static_cast<OmniboxPedalId>(id));
diff --git a/components/omnibox/browser/actions/omnibox_pedal_provider_unittest.cc b/components/omnibox/browser/actions/omnibox_pedal_provider_unittest.cc index e3a0919..ab3d8ad 100644 --- a/components/omnibox/browser/actions/omnibox_pedal_provider_unittest.cc +++ b/components/omnibox/browser/actions/omnibox_pedal_provider_unittest.cc
@@ -18,8 +18,7 @@ void SetUp() override { feature_list_.InitWithFeatures( - {omnibox::kOmniboxPedalsBatch2, omnibox::kOmniboxPedalsBatch2NonEnglish, - omnibox::kOmniboxPedalsBatch3, + {omnibox::kOmniboxPedalsBatch2NonEnglish, omnibox::kOmniboxPedalsBatch3, omnibox::kOmniboxPedalsTranslationConsole}, {}); }
diff --git a/components/omnibox/browser/history_quick_provider_unittest.cc b/components/omnibox/browser/history_quick_provider_unittest.cc index d66b233..4dcfd71 100644 --- a/components/omnibox/browser/history_quick_provider_unittest.cc +++ b/components/omnibox/browser/history_quick_provider_unittest.cc
@@ -197,14 +197,17 @@ void HistoryQuickProviderTest::SetUp() { client_ = std::make_unique<FakeAutocompleteProviderClient>(); ASSERT_TRUE(client_->GetHistoryService()); - ASSERT_NO_FATAL_FAILURE(FillData()); + + // First make sure the automatic initialization completes to avoid a race + // between that and our manual indexing below. + InMemoryURLIndex* url_index = client_->GetInMemoryURLIndex(); + BlockUntilInMemoryURLIndexIsRefreshed(url_index); // FillData() must be called before RebuildFromHistory(). This will // ensure that the index is properly populated with data from the database. - InMemoryURLIndex* url_index = client_->GetInMemoryURLIndex(); + ASSERT_NO_FATAL_FAILURE(FillData()); url_index->RebuildFromHistory( client_->GetHistoryService()->history_backend_->db()); - BlockUntilInMemoryURLIndexIsRefreshed(url_index); // History index refresh creates rebuilt tasks to run on history thread. // Block here to make sure that all of them are complete.
diff --git a/components/omnibox/browser/in_memory_url_index.cc b/components/omnibox/browser/in_memory_url_index.cc index 0e718719..405f26f 100644 --- a/components/omnibox/browser/in_memory_url_index.cc +++ b/components/omnibox/browser/in_memory_url_index.cc
@@ -74,7 +74,7 @@ void InMemoryURLIndex::RebuildPrivateDataFromHistoryDBTask:: DoneRunOnMainThread() { - index_->DoneRebuidingPrivateDataFromHistoryDB(succeeded_, data_); + index_->DoneRebuildingPrivateDataFromHistoryDB(succeeded_, data_); UMA_HISTOGRAM_TIMES("History.InMemoryURLIndexingTime.RoundTripTime", base::TimeTicks::Now() - task_creation_time_); } @@ -333,7 +333,7 @@ &cache_reader_tracker_); } -void InMemoryURLIndex::DoneRebuidingPrivateDataFromHistoryDB( +void InMemoryURLIndex::DoneRebuildingPrivateDataFromHistoryDB( bool succeeded, scoped_refptr<URLIndexPrivateData> private_data) { TRACE_EVENT_NESTABLE_ASYNC_END0(
diff --git a/components/omnibox/browser/in_memory_url_index.h b/components/omnibox/browser/in_memory_url_index.h index 704a60d..f0461ad 100644 --- a/components/omnibox/browser/in_memory_url_index.h +++ b/components/omnibox/browser/in_memory_url_index.h
@@ -203,7 +203,7 @@ // or rebuilding our private data from the history database. |succeeded| // will be true if the rebuild was successful. |data| will point to a new // instanceof the private data just rebuilt. - void DoneRebuidingPrivateDataFromHistoryDB( + void DoneRebuildingPrivateDataFromHistoryDB( bool succeeded, scoped_refptr<URLIndexPrivateData> private_data);
diff --git a/components/omnibox/browser/in_memory_url_index_unittest.cc b/components/omnibox/browser/in_memory_url_index_unittest.cc index a272a4c..0a497c6 100644 --- a/components/omnibox/browser/in_memory_url_index_unittest.cc +++ b/components/omnibox/browser/in_memory_url_index_unittest.cc
@@ -24,6 +24,7 @@ #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" +#include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "components/history/core/browser/history_backend.h" #include "components/history/core/browser/history_database.h" @@ -34,6 +35,7 @@ #include "components/omnibox/browser/in_memory_url_index_test_util.h" #include "components/omnibox/browser/in_memory_url_index_types.h" #include "components/omnibox/browser/url_index_private_data.h" +#include "components/omnibox/common/omnibox_features.h" #include "components/search_engines/template_url_service.h" #include "sql/transaction.h" #include "testing/gtest/include/gtest/gtest.h" @@ -1213,6 +1215,11 @@ } TEST_F(InMemoryURLIndexTest, RebuildFromHistoryIfCacheOld) { + // Test specifically covers the flag-disabled behavior. + base::test::ScopedFeatureList feature_list; + feature_list.InitAndDisableFeature( + omnibox::kHistoryQuickProviderAblateInMemoryURLIndexCacheFile); + ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); set_history_dir(temp_dir_.GetPath());
diff --git a/components/omnibox/browser/omnibox_field_trial.cc b/components/omnibox/browser/omnibox_field_trial.cc index c72fe16..9fd9f5ea 100644 --- a/components/omnibox/browser/omnibox_field_trial.cc +++ b/components/omnibox/browser/omnibox_field_trial.cc
@@ -602,24 +602,14 @@ return base::FeatureList::IsEnabled(omnibox::kOmniboxTabSwitchSuggestions); } -bool OmniboxFieldTrial::IsPedalsBatch2Enabled() { - return base::FeatureList::IsEnabled(omnibox::kOmniboxPedalsBatch2); -} - bool OmniboxFieldTrial::IsPedalsBatch2NonEnglishEnabled() { - return IsPedalsBatch2Enabled() && - base::FeatureList::IsEnabled(omnibox::kOmniboxPedalsBatch2NonEnglish); + return base::FeatureList::IsEnabled(omnibox::kOmniboxPedalsBatch2NonEnglish); } bool OmniboxFieldTrial::IsPedalsBatch3Enabled() { return base::FeatureList::IsEnabled(omnibox::kOmniboxPedalsBatch3); } -bool OmniboxFieldTrial::IsPedalsDefaultIconColored() { - return base::FeatureList::IsEnabled( - omnibox::kOmniboxPedalsDefaultIconColored); -} - bool OmniboxFieldTrial::IsPedalsTranslationConsoleEnabled() { return base::FeatureList::IsEnabled( omnibox::kOmniboxPedalsTranslationConsole);
diff --git a/components/omnibox/browser/omnibox_field_trial.h b/components/omnibox/browser/omnibox_field_trial.h index 48c870c1..e4c206bb 100644 --- a/components/omnibox/browser/omnibox_field_trial.h +++ b/components/omnibox/browser/omnibox_field_trial.h
@@ -357,9 +357,6 @@ // Returns true if the tab switch suggestions flag is enabled. bool IsTabSwitchSuggestionsEnabled(); -// Returns true if the second batch of Pedals is enabled. -bool IsPedalsBatch2Enabled(); - // Returns true if the second batch of Pedals is enabled for non-English // locales. This is only meaningful if batch 2 is enabled. bool IsPedalsBatch2NonEnglishEnabled(); @@ -367,9 +364,6 @@ // Returns true if the third batch of Pedals is enabled. bool IsPedalsBatch3Enabled(); -// Returns true if the default icon used for Pedal buttons should be colored. -bool IsPedalsDefaultIconColored(); - // Returns true if the Pedals synonyms should be loaded from the translation // console. bool IsPedalsTranslationConsoleEnabled();
diff --git a/components/omnibox/common/omnibox_features.cc b/components/omnibox/common/omnibox_features.cc index 79b66ee1..063d9bc5 100644 --- a/components/omnibox/common/omnibox_features.cc +++ b/components/omnibox/common/omnibox_features.cc
@@ -177,7 +177,7 @@ // over 10% of all shutdown hangs. const base::Feature kHistoryQuickProviderAblateInMemoryURLIndexCacheFile{ "OmniboxHistoryQuickProviderAblateInMemoryURLIndexCacheFile", - base::FEATURE_DISABLED_BY_DEFAULT}; + enabled_by_default_desktop_only}; // If enabled, suggestions from a cgi param name match are scored to 0. const base::Feature kDisableCGIParamMatching{"OmniboxDisableCGIParamMatching", @@ -254,10 +254,6 @@ const base::Feature kNtpRealboxSuggestionAnswers{ "NtpRealboxSuggestionAnswers", base::FEATURE_DISABLED_BY_DEFAULT}; -// Feature used to enable the second batch of Pedals (Safety Check, etc.). -const base::Feature kOmniboxPedalsBatch2{"OmniboxPedalsBatch2", - base::FEATURE_ENABLED_BY_DEFAULT}; - // Feature used to enable the second batch of Pedals (Safety Check, etc.) // for non-English locales (English locales are 'en' and 'en-GB'). // This feature is only meaningful if `OmniboxPedalsBatch2` is enabled. @@ -268,10 +264,6 @@ const base::Feature kOmniboxPedalsBatch3{"OmniboxPedalsBatch3", base::FEATURE_DISABLED_BY_DEFAULT}; -// Feature that enables use of the colored version of the default Pedal icon. -const base::Feature kOmniboxPedalsDefaultIconColored{ - "OmniboxPedalsDefaultIconColored", base::FEATURE_ENABLED_BY_DEFAULT}; - // Feature that enables loading synonyms from the translation console. const base::Feature kOmniboxPedalsTranslationConsole{ "OmniboxPedalsTranslationConsole", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/components/omnibox/common/omnibox_features.h b/components/omnibox/common/omnibox_features.h index f34f131..647278c 100644 --- a/components/omnibox/common/omnibox_features.h +++ b/components/omnibox/common/omnibox_features.h
@@ -69,10 +69,8 @@ extern const base::Feature kMostVisitedTiles; extern const base::Feature kRichAutocompletion; extern const base::Feature kNtpRealboxSuggestionAnswers; -extern const base::Feature kOmniboxPedalsBatch2; extern const base::Feature kOmniboxPedalsBatch2NonEnglish; extern const base::Feature kOmniboxPedalsBatch3; -extern const base::Feature kOmniboxPedalsDefaultIconColored; extern const base::Feature kOmniboxPedalsTranslationConsole; extern const base::Feature kOmniboxKeywordSearchButton; extern const base::Feature kWebUIOmniboxPopup;
diff --git a/components/permissions/permission_request.cc b/components/permissions/permission_request.cc index d14013d..015f54c7 100644 --- a/components/permissions/permission_request.cc +++ b/components/permissions/permission_request.cc
@@ -203,6 +203,9 @@ case RequestType::kSecurityAttestation: message_id = IDS_SECURITY_KEY_ATTESTATION_PERMISSION_FRAGMENT; break; + case RequestType::kU2fApiRequest: + message_id = IDS_U2F_API_PERMISSION_FRAGMENT; + break; case RequestType::kVrSession: message_id = IDS_VR_PERMISSION_FRAGMENT; break;
diff --git a/components/permissions/permission_uma_util.cc b/components/permissions/permission_uma_util.cc index f990d07b..6cfe37e 100644 --- a/components/permissions/permission_uma_util.cc +++ b/components/permissions/permission_uma_util.cc
@@ -98,6 +98,8 @@ return RequestTypeForUma::REGISTER_PROTOCOL_HANDLER; case RequestType::kSecurityAttestation: return RequestTypeForUma::PERMISSION_SECURITY_KEY_ATTESTATION; + case RequestType::kU2fApiRequest: + return RequestTypeForUma::PERMISSION_U2F_API_REQUEST; #endif case RequestType::kStorageAccess: return RequestTypeForUma::PERMISSION_STORAGE_ACCESS; @@ -158,6 +160,8 @@ return "IdleDetection"; case RequestTypeForUma::PERMISSION_FILE_HANDLING: return "FileHandling"; + case RequestTypeForUma::PERMISSION_U2F_API_REQUEST: + return "U2fApiRequest"; default: NOTREACHED(); return "";
diff --git a/components/permissions/permission_uma_util.h b/components/permissions/permission_uma_util.h index fd42419..b4d8758 100644 --- a/components/permissions/permission_uma_util.h +++ b/components/permissions/permission_uma_util.h
@@ -69,6 +69,7 @@ PERMISSION_FONT_ACCESS = 26, PERMISSION_IDLE_DETECTION = 27, PERMISSION_FILE_HANDLING = 28, + PERMISSION_U2F_API_REQUEST = 29, // NUM must be the last value in the enum. NUM };
diff --git a/components/permissions/request_type.cc b/components/permissions/request_type.cc index 1202f21..4af2ddb 100644 --- a/components/permissions/request_type.cc +++ b/components/permissions/request_type.cc
@@ -101,6 +101,8 @@ return vector_icons::kProtocolHandlerIcon; case RequestType::kSecurityAttestation: return kUsbSecurityKeyIcon; + case RequestType::kU2fApiRequest: + return kUsbSecurityKeyIcon; case RequestType::kStorageAccess: return vector_icons::kCookieIcon; case RequestType::kWindowPlacement: @@ -280,6 +282,10 @@ #endif case permissions::RequestType::kStorageAccess: return "storage_access"; +#if !defined(OS_ANDROID) + case permissions::RequestType::kU2fApiRequest: + return "u2f_api_request"; +#endif case permissions::RequestType::kVrSession: return "vr_session"; #if !defined(OS_ANDROID)
diff --git a/components/permissions/request_type.h b/components/permissions/request_type.h index fac8dfb5..43339fe 100644 --- a/components/permissions/request_type.h +++ b/components/permissions/request_type.h
@@ -49,6 +49,9 @@ kSecurityAttestation, #endif kStorageAccess, +#if !defined(OS_ANDROID) + kU2fApiRequest, +#endif kVrSession, #if !defined(OS_ANDROID) kWindowPlacement,
diff --git a/components/permissions_strings.grdp b/components/permissions_strings.grdp index eb85a03..1bff91f 100644 --- a/components/permissions_strings.grdp +++ b/components/permissions_strings.grdp
@@ -131,6 +131,12 @@ <message name="IDS_SECURITY_KEY_ATTESTATION_PERMISSION_FRAGMENT" desc="A permission prompt shown to a user when a website wants to see information that identifies the user's Security Key, such as make and model number. The text '[website URL] wants to:' precedes this string. The 'make' of a device is the brand name of the manufacturer, e.g. Yubikey is a make of Security Key. The 'model' of a device is the specific product, e.g. Yubikey Neo is a model of Security Key."> See the make and model of your Security Key </message> + <message name="IDS_U2F_API_PERMISSION_FRAGMENT" desc="A permission prompt shown to a user when a website wants to make a request to access a user's Security Key. A 'Security Key' is a small USB device that a user can touch in order to sign into a website."> + Use your Security Key + </message> + <message name="IDS_U2F_API_PERMISSION_EXPLANATION" desc="A permission prompt shown to a user when a website wants to make a request to access a user's Security Key. A 'Security Key' is a small USB device that a user can touch in order to sign into a website. 'U2F API' and 'Web Authentication API' are the names of two different web platform APIs for interacting with Security Keys."> + This site won't be able to use the U2F API after February 2022. If you own this site, you should change it to use the Web Authentication API. + </message> <message name="IDS_PERMISSION_ALLOW" desc="Label on button to allow a permissions request."> Allow </message>
diff --git a/components/permissions_strings_grdp/IDS_U2F_API_PERMISSION_EXPLANATION.png.sha1 b/components/permissions_strings_grdp/IDS_U2F_API_PERMISSION_EXPLANATION.png.sha1 new file mode 100644 index 0000000..7cb2bb1c --- /dev/null +++ b/components/permissions_strings_grdp/IDS_U2F_API_PERMISSION_EXPLANATION.png.sha1
@@ -0,0 +1 @@ +f86e22599eebf78433a892ee7286c2d9e181d20b \ No newline at end of file
diff --git a/components/permissions_strings_grdp/IDS_U2F_API_PERMISSION_FRAGMENT.png.sha1 b/components/permissions_strings_grdp/IDS_U2F_API_PERMISSION_FRAGMENT.png.sha1 new file mode 100644 index 0000000..7cb2bb1c --- /dev/null +++ b/components/permissions_strings_grdp/IDS_U2F_API_PERMISSION_FRAGMENT.png.sha1
@@ -0,0 +1 @@ +f86e22599eebf78433a892ee7286c2d9e181d20b \ No newline at end of file
diff --git a/components/reporting/client/BUILD.gn b/components/reporting/client/BUILD.gn index 2c8b339..359e64f 100644 --- a/components/reporting/client/BUILD.gn +++ b/components/reporting/client/BUILD.gn
@@ -47,6 +47,7 @@ "//base", "//components/reporting/proto:record_constants", "//components/reporting/proto:record_proto", + "//components/reporting/storage:storage_uploader_interface", "//components/reporting/util:status", "//components/reporting/util:status_macros", "//third_party/protobuf:protobuf_lite",
diff --git a/components/reporting/client/report_queue.h b/components/reporting/client/report_queue.h index 41f16e8..99ebd1cc 100644 --- a/components/reporting/client/report_queue.h +++ b/components/reporting/client/report_queue.h
@@ -14,6 +14,7 @@ #include "base/values.h" #include "components/reporting/proto/record.pb.h" #include "components/reporting/proto/record_constants.pb.h" +#include "components/reporting/storage/storage_uploader_interface.h" #include "components/reporting/util/status.h" #include "components/reporting/util/statusor.h" #include "third_party/protobuf/src/google/protobuf/message_lite.h"
diff --git a/components/reporting/client/report_queue_factory.cc b/components/reporting/client/report_queue_factory.cc index 8990dfb..9f73554 100644 --- a/components/reporting/client/report_queue_factory.cc +++ b/components/reporting/client/report_queue_factory.cc
@@ -47,6 +47,39 @@ std::move(try_set_cb))); } +// static +std::unique_ptr<::reporting::ReportQueue, base::OnTaskRunnerDeleter> +ReportQueueFactory::CreateSpeculativeReportQueue( + base::StringPiece dm_token_value, + const Destination destination) { + DCHECK(base::SequencedTaskRunnerHandle::IsSet()); + + auto config_result = ::reporting::ReportQueueConfiguration::Create( + dm_token_value, destination, + base::BindRepeating([]() { return ::reporting::Status::StatusOK(); })); + + if (!config_result.ok()) { + DVLOG(1) + << "Cannot initialize report queue. Invalid ReportQueueConfiguration: " + << config_result.status(); + return std::unique_ptr<::reporting::ReportQueue, base::OnTaskRunnerDeleter>( + nullptr, + base::OnTaskRunnerDeleter(base::SequencedTaskRunnerHandle::Get())); + } + + auto speculative_queue_result = + ::reporting::ReportQueueProvider::CreateSpeculativeQueue( + std::move(config_result.ValueOrDie())); + if (!speculative_queue_result.ok()) { + DVLOG(1) << "Failed to create speculative queue"; + return std::unique_ptr<::reporting::ReportQueue, base::OnTaskRunnerDeleter>( + nullptr, + base::OnTaskRunnerDeleter(base::SequencedTaskRunnerHandle::Get())); + } + + return std::move(speculative_queue_result.ValueOrDie()); +} + ReportQueueFactory::TrySetReportQueueCallback ReportQueueFactory::CreateTrySetCallback( base::StringPiece dm_token_value,
diff --git a/components/reporting/client/report_queue_factory.h b/components/reporting/client/report_queue_factory.h index ebc5380..7b797c5 100644 --- a/components/reporting/client/report_queue_factory.h +++ b/components/reporting/client/report_queue_factory.h
@@ -8,6 +8,7 @@ #include <memory> #include "base/callback.h" +#include "base/sequenced_task_runner.h" #include "base/strings/string_piece_forward.h" #include "components/reporting/client/report_queue.h" #include "components/reporting/util/statusor.h" @@ -38,6 +39,10 @@ const Destination destination, SuccessCallback done_cb); + static std::unique_ptr<::reporting::ReportQueue, base::OnTaskRunnerDeleter> + CreateSpeculativeReportQueue(base::StringPiece dm_token_value, + const Destination destination); + private: static void TrySetReportQueue( SuccessCallback success_cb,
diff --git a/components/reporting/storage/missive_storage_module_delegate_impl.cc b/components/reporting/storage/missive_storage_module_delegate_impl.cc index 1468c9c..14a57e5a 100644 --- a/components/reporting/storage/missive_storage_module_delegate_impl.cc +++ b/components/reporting/storage/missive_storage_module_delegate_impl.cc
@@ -25,14 +25,14 @@ MissiveStorageModuleDelegateImpl::~MissiveStorageModuleDelegateImpl() = default; void MissiveStorageModuleDelegateImpl::AddRecord( - const Priority priority, + Priority priority, Record record, base::OnceCallback<void(Status)> callback) { add_record_.Run(priority, std::move(record), std::move(callback)); } void MissiveStorageModuleDelegateImpl::Flush( - const Priority priority, + Priority priority, base::OnceCallback<void(Status)> callback) { flush_.Run(priority, std::move(callback)); }
diff --git a/components/reporting/storage/missive_storage_module_delegate_impl.h b/components/reporting/storage/missive_storage_module_delegate_impl.h index 559f133..bd3d788a 100644 --- a/components/reporting/storage/missive_storage_module_delegate_impl.h +++ b/components/reporting/storage/missive_storage_module_delegate_impl.h
@@ -18,10 +18,9 @@ : public MissiveStorageModule::MissiveStorageModuleDelegateInterface { public: using AddRecordCallback = base::RepeatingCallback< - void(const Priority, Record, base::OnceCallback<void(Status)>)>; + void(Priority, Record, base::OnceCallback<void(Status)>)>; using FlushCallback = - base::RepeatingCallback<void(const Priority, - base::OnceCallback<void(Status)>)>; + base::RepeatingCallback<void(Priority, base::OnceCallback<void(Status)>)>; using ReportSuccessCallback = base::RepeatingCallback<void(const SequencingInformation&, bool)>; using UpdateEncryptionKeyCallback = @@ -34,11 +33,11 @@ UpdateEncryptionKeyCallback update_encryption_key); ~MissiveStorageModuleDelegateImpl() override; - void AddRecord(const Priority priority, + void AddRecord(Priority priority, Record record, base::OnceCallback<void(Status)> callback) override; - void Flush(const Priority priority, + void Flush(Priority priority, base::OnceCallback<void(Status)> callback) override; void ReportSuccess(const SequencingInformation& sequencing_information,
diff --git a/components/reporting/storage/storage.cc b/components/reporting/storage/storage.cc index 5278fea..b79671c4 100644 --- a/components/reporting/storage/storage.cc +++ b/components/reporting/storage/storage.cc
@@ -36,6 +36,7 @@ #include "components/reporting/util/status_macros.h" #include "components/reporting/util/statusor.h" #include "components/reporting/util/task_runner_context.h" +#include "storage_uploader_interface.h" #include "third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl.h" namespace reporting { @@ -134,10 +135,13 @@ static void AsyncProvideUploader( Priority priority, Storage* storage, + UploaderInterface::UploadReason reason, UploaderInterfaceResultCb start_uploader_cb) { storage->async_start_upload_cb_.Run( - /*need_encryption_key=*/EncryptionModuleInterface::is_enabled() && - storage->encryption_module_->need_encryption_key(), + (/*need_encryption_key=*/EncryptionModuleInterface::is_enabled() && + storage->encryption_module_->need_encryption_key()) + ? UploaderInterface::KEY_DELIVERY + : reason, base::BindOnce(&QueueUploaderInterface::WrapInstantiatedUploader, priority, std::move(start_uploader_cb))); } @@ -224,7 +228,7 @@ base::BindOnce(&KeyDelivery::EncryptionKeyReceiverReady, base::Unretained(this)); async_start_upload_cb_.Run( - /*need_encryption_key=*/true, + UploaderInterface::KEY_DELIVERY, base::BindOnce(&KeyDelivery::WrapInstantiatedKeyUploader, /*priority=*/MANUAL_BATCH, std::move(start_uploader_cb)));
diff --git a/components/reporting/storage/storage_module.cc b/components/reporting/storage/storage_module.cc index 8245b2d7..129374ea 100644 --- a/components/reporting/storage/storage_module.cc +++ b/components/reporting/storage/storage_module.cc
@@ -21,6 +21,7 @@ #include "components/reporting/storage/storage_uploader_interface.h" #include "components/reporting/util/status.h" #include "components/reporting/util/statusor.h" +#include "storage_uploader_interface.h" namespace reporting {
diff --git a/components/reporting/storage/storage_module_interface.h b/components/reporting/storage/storage_module_interface.h index f4b301de..a81f170 100644 --- a/components/reporting/storage/storage_module_interface.h +++ b/components/reporting/storage/storage_module_interface.h
@@ -10,6 +10,7 @@ #include "base/memory/scoped_refptr.h" #include "components/reporting/proto/record.pb.h" #include "components/reporting/proto/record_constants.pb.h" +#include "components/reporting/storage/storage_uploader_interface.h" #include "components/reporting/util/status.h" namespace reporting {
diff --git a/components/reporting/storage/storage_queue.cc b/components/reporting/storage/storage_queue.cc index 01e5991..ca89f755 100644 --- a/components/reporting/storage/storage_queue.cc +++ b/components/reporting/storage/storage_queue.cc
@@ -47,6 +47,7 @@ #include "components/reporting/util/task_runner_context.h" #include "crypto/random.h" #include "crypto/sha2.h" +#include "storage_uploader_interface.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h" @@ -224,13 +225,13 @@ // Initiate periodic uploading, if needed. if (!options_.upload_period().is_zero()) { upload_timer_.Start(FROM_HERE, options_.upload_period(), this, - &StorageQueue::Flush); + &StorageQueue::PeriodicUpload); } // In case some events are found in the queue, initiate an upload. // This is especially imporant for non-periodic queues, but won't harm // others either. if (first_sequencing_id_ < next_sequencing_id_) { - Flush(); + Start<ReadContext>(UploaderInterface::INIT_RESUME, this); } return Status::StatusOK(); } @@ -658,7 +659,7 @@ base::StrCat({METADATA_NAME, FILE_PATH_LITERAL(".*")})); base::FilePath full_name; while (full_name = dir_enum.Next(), !full_name.empty()) { - const auto extension = dir_enum.GetInfo().GetName().Extension(); + const auto extension = dir_enum.GetInfo().GetName().FinalExtension(); if (extension.empty()) { continue; } @@ -763,11 +764,13 @@ // is zero, RemoveConfirmedData can delete the unused files). class StorageQueue::ReadContext : public TaskRunnerContext<Status> { public: - explicit ReadContext(scoped_refptr<StorageQueue> storage_queue) + ReadContext(UploaderInterface::UploadReason reason, + scoped_refptr<StorageQueue> storage_queue) : TaskRunnerContext<Status>( base::BindOnce(&ReadContext::UploadingCompleted, base::Unretained(this)), storage_queue->sequenced_task_runner_), + reason_(reason), async_start_upload_cb_(storage_queue->async_start_upload_cb_), must_invoke_upload_( EncryptionModuleInterface::is_enabled() && @@ -775,6 +778,7 @@ storage_queue_(storage_queue->weakptr_factory_.GetWeakPtr()) { DCHECK(storage_queue.get()); DCHECK(async_start_upload_cb_); + DCHECK_LT(reason, UploaderInterface::MAX_REASON); DETACH_FROM_SEQUENCE(read_sequence_checker_); } @@ -1158,9 +1162,11 @@ FROM_HERE, {base::TaskPriority::BEST_EFFORT}, base::BindOnce( [](base::OnceCallback<void()> continuation, ReadContext* self) { - self->async_start_upload_cb_.Run(base::BindOnce( - &ReadContext::ScheduleOnUploaderInstantiated, - base::Unretained(self), std::move(continuation))); + self->async_start_upload_cb_.Run( + self->reason_, + base::BindOnce(&ReadContext::ScheduleOnUploaderInstantiated, + base::Unretained(self), + std::move(continuation))); }, std::move(continuation), base::Unretained(this))); } @@ -1190,6 +1196,10 @@ std::move(continuation).Run(); } + // Upload reason. Passed to uploader instantiation and may affect + // the uploader object. + const UploaderInterface::UploadReason reason_; + // Files that will be read (in order of sequencing ids). std::map<int64_t, scoped_refptr<SingleFile>> files_; SequencingInformation sequencing_info_; @@ -1245,7 +1255,7 @@ // Otherwise initiate Upload right after writing // finished and respond back when reading Upload is done. // Note: new uploader created synchronously before scheduling Upload. - Start<ReadContext>(storage_queue_); + Start<ReadContext>(UploaderInterface::IMMEDIATE_FLUSH, storage_queue_); } void OnStart() override { @@ -1600,23 +1610,26 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(storage_queue_sequence_checker_); if (!status.ok()) { // Previous upload failed, retry. - Flush(); + Start<ReadContext>(UploaderInterface::FAILURE_RETRY, this); return; } if (!first_unconfirmed_sequencing_id_.has_value() || first_unconfirmed_sequencing_id_.value() < next_sequencing_id) { // Not all uploaded events were confirmed after upload, retry. - Flush(); + Start<ReadContext>(UploaderInterface::IMCOMPLETE_RETRY, this); return; } // No need to retry. } +void StorageQueue::PeriodicUpload() { + Start<ReadContext>(UploaderInterface::PERIODIC, this); +} + void StorageQueue::Flush() { - // Note: new uploader created every time Flush is called. - Start<ReadContext>(this); + Start<ReadContext>(UploaderInterface::MANUAL, this); } void StorageQueue::ReleaseAllFileInstances() {
diff --git a/components/reporting/storage/storage_queue.h b/components/reporting/storage/storage_queue.h index 6d62ad1a..0f57b1f 100644 --- a/components/reporting/storage/storage_queue.h +++ b/components/reporting/storage/storage_queue.h
@@ -42,6 +42,7 @@ public: // Callback type for UploadInterface provider for this queue. using AsyncStartUploaderCb = base::RepeatingCallback<void( + UploaderInterface::UploadReason, UploaderInterface::UploaderInterfaceResultCb)>; // Creates StorageQueue instance with the specified options, and returns it @@ -299,6 +300,9 @@ // |next_sequencing_id| were not uploaded. void CheckBackUpload(Status status, int64_t next_sequencing_id); + // Helper method called by periodic time to upload data. + void PeriodicUpload(); + // Sequential task runner for all activities in this StorageQueue // (must be first member in class). scoped_refptr<base::SequencedTaskRunner> sequenced_task_runner_;
diff --git a/components/reporting/storage/storage_queue_stress_test.cc b/components/reporting/storage/storage_queue_stress_test.cc index a5e77a2c..e770e36 100644 --- a/components/reporting/storage/storage_queue_stress_test.cc +++ b/components/reporting/storage/storage_queue_stress_test.cc
@@ -193,7 +193,9 @@ } void AsyncStartTestUploader( + UploaderInterface::UploadReason reason, UploaderInterface::UploaderInterfaceResultCb start_uploader_cb) { + // Ignore reason for stress test. std::move(start_uploader_cb) .Run(std::make_unique<TestUploadClient>(&last_record_digest_map_)); }
diff --git a/components/reporting/storage/storage_queue_unittest.cc b/components/reporting/storage/storage_queue_unittest.cc index 3ad2008b..1ff620a 100644 --- a/components/reporting/storage/storage_queue_unittest.cc +++ b/components/reporting/storage/storage_queue_unittest.cc
@@ -4,16 +4,20 @@ #include "components/reporting/storage/storage_queue.h" +#include <atomic> #include <cstdint> #include <initializer_list> #include <utility> #include <vector> +#include <base/containers/flat_map.h> #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/files/scoped_temp_dir.h" +#include "base/sequenced_task_runner.h" #include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" +#include "base/task/thread_pool.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "build/build_config.h" @@ -28,6 +32,7 @@ #include "components/reporting/util/statusor.h" #include "components/reporting/util/test_support_callbacks.h" #include "crypto/sha2.h" +#include "storage_uploader_interface.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -36,6 +41,7 @@ using ::testing::Between; using ::testing::Eq; using ::testing::Invoke; +using ::testing::Ne; using ::testing::NotNull; using ::testing::Return; using ::testing::Sequence; @@ -60,15 +66,22 @@ // should have that digest already recorded. Only the first record in a // generation is uploaded without last record digest. "Optional" is set to // no-value if there was a gap record instead of a real one. - using LastRecordDigestMap = - std::map<std::pair<int64_t /*generation id */, int64_t /*sequencing id*/>, - absl::optional<std::string /*digest*/>>; + using LastRecordDigestMap = base::flat_map< + std::pair<int64_t /*generation id */, int64_t /*sequencing id*/>, + absl::optional<std::string /*digest*/>>; explicit MockUploadClient(LastRecordDigestMap* last_record_digest_map) - : last_record_digest_map_(last_record_digest_map) {} + : last_record_digest_map_(last_record_digest_map) { + DETACH_FROM_SEQUENCE(upload_client_checker_); + } + + ~MockUploadClient() override { + DCHECK_CALLED_ON_VALID_SEQUENCE(upload_client_checker_); + } void ProcessRecord(EncryptedRecord encrypted_record, base::OnceCallback<void(bool)> processed_cb) override { + DCHECK_CALLED_ON_VALID_SEQUENCE(upload_client_checker_); WrappedRecord wrapped_record; // Decompress encrypted_wrapped_record if is was compressed. if (encrypted_record.has_compression_information()) { @@ -152,6 +165,7 @@ void ProcessGap(SequencingInformation sequencing_information, uint64_t count, base::OnceCallback<void(bool)> processed_cb) override { + DCHECK_CALLED_ON_VALID_SEQUENCE(upload_client_checker_); // Verify generation match. if (generation_id_.has_value() && generation_id_.value() != sequencing_information.generation_id()) { @@ -184,7 +198,10 @@ .Run(UploadGap(sequencing_information.sequencing_id(), count)); } - void Completed(Status status) override { UploadComplete(status); } + void Completed(Status status) override { + DCHECK_CALLED_ON_VALID_SEQUENCE(upload_client_checker_); + UploadComplete(status); + } MOCK_METHOD(void, EncounterSeqId, (int64_t), (const)); MOCK_METHOD(bool, UploadRecord, (int64_t, base::StringPiece), (const)); @@ -271,6 +288,8 @@ }; private: + SEQUENCE_CHECKER(upload_client_checker_); + absl::optional<int64_t> generation_id_; LastRecordDigestMap* const last_record_digest_map_; @@ -278,17 +297,22 @@ Sequence test_upload_sequence_; }; -// Do-nothing mock upload. -Status DoNotUpload(MockUploadClient*) { - return Status::StatusOK(); -} - class StorageQueueTest : public ::testing::TestWithParam<size_t> { protected: void SetUp() override { ASSERT_TRUE(location_.CreateUniqueTempDir()); options_.set_directory(base::FilePath(location_.GetPath())) .set_single_file_size(GetParam()); + sequenced_task_runner_ = base::ThreadPool::CreateSequencedTaskRunner( + {base::TaskPriority::BEST_EFFORT, base::MayBlock()}); + EXPECT_CALL(set_mock_uploader_expectations_, Call(_, NotNull())) + .WillRepeatedly(Invoke([](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { + return Status( + error::UNAVAILABLE, + base::StrCat({"Mock Client not provided by the test, reason=", + base::NumberToString(reason)})); + })); } void TearDown() override { @@ -356,10 +380,12 @@ } void AsyncStartMockUploader( + UploaderInterface::UploadReason reason, UploaderInterface::UploaderInterfaceResultCb start_uploader_cb) { auto uploader = std::make_unique<MockUploadClient>(&last_record_digest_map_); - const auto status = set_mock_uploader_expectations_.Call(uploader.get()); + const auto status = + set_mock_uploader_expectations_.Call(reason, uploader.get()); if (!status.ok()) { std::move(start_uploader_cb).Run(status); return; @@ -394,6 +420,7 @@ base::test::TaskEnvironment task_environment_{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; + scoped_refptr<base::SequencedTaskRunner> sequenced_task_runner_; base::test::ScopedFeatureList scoped_feature_list_; base::ScopedTempDir location_; StorageOptions options_; @@ -404,7 +431,8 @@ // digest. Serves all MockUploadClients created by test fixture. MockUploadClient::LastRecordDigestMap last_record_digest_map_; - ::testing::MockFunction<Status(MockUploadClient*)> + ::testing::MockFunction<Status(UploaderInterface::UploadReason, + MockUploadClient*)> set_mock_uploader_expectations_; }; @@ -445,15 +473,16 @@ // Set uploader expectations. test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::PERIODIC, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(0, kData[0]) .Required(1, kData[1]) .Required(2, kData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); // Trigger upload. task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); @@ -470,23 +499,22 @@ // Set uploader expectations. test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::PERIODIC, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(0, kData[0]) .RequiredGap(1, 1) .Possible(2, kData[2]); // Depending on records binpacking return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); // Trigger upload. task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); } -// TODO(crbug.com/1233846): This test is very flaky. -TEST_P(StorageQueueTest, - DISABLED_WriteIntoNewStorageQueueReopenWriteMoreAndUpload) { +TEST_P(StorageQueueTest, WriteIntoNewStorageQueueReopenWriteMoreAndUpload) { CreateTestStorageQueueOrDie(BuildStorageQueueOptionsPeriodic()); WriteStringOrDie(kData[0]); WriteStringOrDie(kData[1]); @@ -494,6 +522,7 @@ ResetTestStorageQueue(); + // Set uploader expectations. CreateTestStorageQueueOrDie(BuildStorageQueueOptionsPeriodic()); WriteStringOrDie(kMoreData[0]); WriteStringOrDie(kMoreData[1]); @@ -501,8 +530,10 @@ // Set uploader expectations. test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(Eq(UploaderInterface::PERIODIC), NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(0, kData[0]) .Required(1, kData[1]) @@ -511,17 +542,14 @@ .Required(4, kMoreData[1]) .Required(5, kMoreData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); // Trigger upload. task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); } -// TODO(crbug.com/1194878) - this is very flaky on all platforms. -TEST_P( - StorageQueueTest, - DISABLED_WriteIntoNewStorageQueueReopenWithMissingMetadataWriteMoreAndUpload) { +TEST_P(StorageQueueTest, + WriteIntoNewStorageQueueReopenWithMissingMetadataWriteMoreAndUpload) { CreateTestStorageQueueOrDie(BuildStorageQueueOptionsPeriodic()); WriteStringOrDie(kData[0]); WriteStringOrDie(kData[1]); @@ -550,24 +578,27 @@ // Set uploader expectations. Previous data is all lost. test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::PERIODIC, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) - .Required(0, kMoreData[0]) - .Required(1, kMoreData[1]) - .Required(2, kMoreData[2]); + .Required(0, kData[0]) + .Required(1, kData[1]) + .Required(2, kData[2]) + .Required(3, kMoreData[0]) + .Required(4, kMoreData[1]) + .Required(5, kMoreData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); // Trigger upload. task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); } -// TODO(crbug.com/1194878) - this is very flaky on all platforms. TEST_P( StorageQueueTest, - DISABLED_WriteIntoNewStorageQueueReopenWithMissingLastMetadataWriteMoreAndUpload) { + WriteIntoNewStorageQueueReopenWithMissingLastMetadataWriteMoreAndUpload) { CreateTestStorageQueueOrDie(BuildStorageQueueOptionsPeriodic()); WriteStringOrDie(kData[0]); WriteStringOrDie(kData[1]); @@ -596,24 +627,26 @@ // Set uploader expectations. Previous data is all lost. test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::PERIODIC, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) - .Required(0, kMoreData[0]) - .Required(1, kMoreData[1]) - .Required(2, kMoreData[2]); + .Required(0, kData[0]) + .Required(1, kData[1]) + .Required(2, kData[2]) + .Required(3, kMoreData[0]) + .Required(4, kMoreData[1]) + .Required(5, kMoreData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); // Trigger upload. task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); } -// TODO(crbug.com/1194878) - this is very flaky on all platforms. -TEST_P( - StorageQueueTest, - DISABLED_WriteIntoNewStorageQueueReopenWithMissingDataWriteMoreAndUpload) { +TEST_P(StorageQueueTest, + WriteIntoNewStorageQueueReopenWithMissingDataWriteMoreAndUpload) { CreateTestStorageQueueOrDie(BuildStorageQueueOptionsPeriodic()); WriteStringOrDie(kData[0]); WriteStringOrDie(kData[1]); @@ -627,10 +660,17 @@ // Reopen with the same generation and sequencing information. CreateTestStorageQueueOrDie(BuildStorageQueueOptionsPeriodic()); - // Delete the first data file. - base::FilePath full_name = options.directory().Append( - base::StrCat({options.file_prefix(), FILE_PATH_LITERAL(".0")})); - base::DeleteFile(full_name); + // Delete the data file *.generation.0 + { + base::FileEnumerator dir_enum( + options.directory(), + /*recursive=*/false, base::FileEnumerator::FILES, + base::StrCat({options.file_prefix(), FILE_PATH_LITERAL(".*.0")})); + base::FilePath full_name; + while (full_name = dir_enum.Next(), !full_name.empty()) { + base::DeleteFile(full_name); + } + } // Write more data. WriteStringOrDie(kMoreData[0]); @@ -642,8 +682,10 @@ test::TestCallbackAutoWaiter waiter; switch (options.single_file_size()) { case 1: // single record in file - deletion killed the first record - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::PERIODIC, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .PossibleGap(0, 1) .Required(1, kData[1]) @@ -652,13 +694,14 @@ .Required(4, kMoreData[1]) .Required(5, kMoreData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); break; case 256: // two records in file - deletion killed the first two records. // Can bring gap of 2 records or 2 gaps 1 record each. - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::PERIODIC, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .PossibleGap(0, 1) .PossibleGap(1, 1) @@ -669,13 +712,14 @@ .Required(4, kMoreData[1]) .Required(5, kMoreData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); break; default: // Unlimited file size - deletion above killed all the data. Can // bring gap of 1-6 records. - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::PERIODIC, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .PossibleGap(0, 1) .PossibleGap(0, 2) @@ -684,8 +728,7 @@ .PossibleGap(0, 5) .PossibleGap(0, 6); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); } // Trigger upload. @@ -700,15 +743,16 @@ // Set uploader expectations. test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::MANUAL, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(0, kData[0]) .Required(1, kData[1]) .Required(2, kData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); // Flush manually. storage_queue_->Flush(); @@ -729,8 +773,10 @@ // Set uploader expectations. test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::MANUAL, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(0, kData[0]) .Required(1, kData[1]) @@ -739,8 +785,7 @@ .Required(4, kMoreData[1]) .Required(5, kMoreData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); // Flush manually. storage_queue_->Flush(); @@ -758,15 +803,16 @@ // Set uploader expectations. test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([data, &waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::MANUAL, NotNull())) + .WillOnce(Invoke([data, &waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp client_setup(mock_upload_client, &waiter); for (size_t i = 0; i < data.size(); ++i) { client_setup.Required(i, data[i]); } return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); // Flush manually. storage_queue_->Flush(); @@ -782,15 +828,16 @@ { // Set uploader expectations. test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::PERIODIC, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(0, kData[0]) .Required(1, kData[1]) .Required(2, kData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); // Forward time to trigger upload task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); @@ -800,14 +847,15 @@ { // Set uploader expectations. test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::PERIODIC, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(1, kData[1]) .Required(2, kData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); // Forward time to trigger upload task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); } @@ -817,13 +865,14 @@ { // Set uploader expectations. test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::PERIODIC, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(2, kData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); // Forward time to trigger upload task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); } @@ -836,16 +885,17 @@ { // Set uploader expectations. test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::PERIODIC, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(2, kData[2]) .Required(3, kMoreData[0]) .Required(4, kMoreData[1]) .Required(5, kMoreData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); } @@ -855,29 +905,21 @@ { // Set uploader expectations. test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::PERIODIC, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(3, kMoreData[0]) .Required(4, kMoreData[1]) .Required(5, kMoreData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); } } -// Disable on Linux and Chrome OS due to flaky. crbug.com/1232644 -#if defined(OS_CHROMEOS) || defined(OS_LINUX) -#define MAYBE_WriteAndRepeatedlyUploadWithConfirmationsAndReopen \ - DISABLED_WriteAndRepeatedlyUploadWithConfirmationsAndReopen -#else -#define MAYBE_WriteAndRepeatedlyUploadWithConfirmationsAndReopen \ - WriteAndRepeatedlyUploadWithConfirmationsAndReopen -#endif -TEST_P(StorageQueueTest, - MAYBE_WriteAndRepeatedlyUploadWithConfirmationsAndReopen) { +TEST_P(StorageQueueTest, WriteAndRepeatedlyUploadWithConfirmationsAndReopen) { CreateTestStorageQueueOrDie(BuildStorageQueueOptionsPeriodic()); WriteStringOrDie(kData[0]); @@ -887,15 +929,16 @@ { // Set uploader expectations. test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::PERIODIC, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(0, kData[0]) .Required(1, kData[1]) .Required(2, kData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); // Forward time to trigger upload task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); @@ -906,14 +949,15 @@ { // Set uploader expectations. test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::PERIODIC, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(1, kData[1]) .Required(2, kData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); // Forward time to trigger upload task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); } @@ -923,13 +967,14 @@ { // Set uploader expectations. test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::PERIODIC, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(2, kData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); // Forward time to trigger upload task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); } @@ -946,8 +991,10 @@ // Set uploader expectations. test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::PERIODIC, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Possible(0, kData[0]) .Possible(1, kData[1]) @@ -956,8 +1003,7 @@ .Required(4, kMoreData[1]) .Required(5, kMoreData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); } @@ -967,15 +1013,16 @@ { test::TestCallbackAutoWaiter waiter; // Set uploader expectations. - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::PERIODIC, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(3, kMoreData[0]) .Required(4, kMoreData[1]) .Required(5, kMoreData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); } } @@ -991,15 +1038,16 @@ { // Set uploader expectations. test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::PERIODIC, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(0, kData[0]) .Required(1, kData[1]) .Required(2, kData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); // Forward time to trigger upload task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); @@ -1010,14 +1058,15 @@ { // Set uploader expectations. test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::PERIODIC, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(1, kData[1]) .Required(2, kData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); // Forward time to trigger upload task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); } @@ -1027,13 +1076,14 @@ { test::TestCallbackAutoWaiter waiter; // Set uploader expectations. - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::PERIODIC, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(2, kData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); // Forward time to trigger upload task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); } @@ -1052,8 +1102,10 @@ { // Set uploader expectations. test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::PERIODIC, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Possible(0, kData[0]) .Possible(1, kData[1]) @@ -1064,8 +1116,7 @@ .PossibleGap(4, 1) .PossibleGap(5, 1); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); } @@ -1078,15 +1129,16 @@ { // Set uploader expectations. test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::PERIODIC, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(3, kMoreData[0]) .Required(4, kMoreData[1]) .Required(5, kMoreData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); } } @@ -1099,43 +1151,46 @@ // data after the current one as |Possible|. { test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::IMMEDIATE_FLUSH, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(0, kData[0]) .Possible(1, kData[1]) .Possible(2, kData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); WriteStringOrDie(kData[0]); } { test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::IMMEDIATE_FLUSH, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(0, kData[0]) .Required(1, kData[1]) .Possible(2, kData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); WriteStringOrDie(kData[1]); } { test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::IMMEDIATE_FLUSH, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(0, kData[0]) .Required(1, kData[1]) .Required(2, kData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); WriteStringOrDie(kData[2]); } } @@ -1149,40 +1204,43 @@ // |Possible|. { test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::IMMEDIATE_FLUSH, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(0, kData[0]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); WriteStringOrDie(kData[0]); } { test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::IMMEDIATE_FLUSH, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(0, kData[0]) .Required(1, kData[1]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); WriteStringOrDie(kData[1]); } { test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::IMMEDIATE_FLUSH, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(0, kData[0]) .Required(1, kData[1]) .Required(2, kData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); WriteStringOrDie(kData[2]); } @@ -1195,43 +1253,46 @@ // data after the current one as |Possible|. { test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::IMMEDIATE_FLUSH, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(2, kData[2]) .Required(3, kMoreData[0]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); WriteStringOrDie(kMoreData[0]); } { test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::IMMEDIATE_FLUSH, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(2, kData[2]) .Required(3, kMoreData[0]) .Required(4, kMoreData[1]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); WriteStringOrDie(kMoreData[1]); } { test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::IMMEDIATE_FLUSH, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(2, kData[2]) .Required(3, kMoreData[0]) .Required(4, kMoreData[1]) .Required(5, kMoreData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); WriteStringOrDie(kMoreData[2]); } } @@ -1243,16 +1304,20 @@ // and then restarts. { test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::IMMEDIATE_FLUSH, NotNull())) + .WillOnce(Invoke([](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { return Status(error::UNAVAILABLE, "Test uploader unavailable"); - })) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + })); + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::FAILURE_RETRY, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(0, kData[0]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); WriteStringOrDie(kData[0]); // Immediately uploads and fails. // Let it retry upload and verify. @@ -1267,31 +1332,35 @@ // and then restarts. { test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::IMMEDIATE_FLUSH, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(0, kData[0]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); WriteStringOrDie(kData[0]); // Immediately uploads and does not confirm. } // Let it retry upload and verify. { test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::IMCOMPLETE_RETRY, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(0, kData[0]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); } // Confirm 0 and make sure no retry happens (since everything is confirmed). - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())).Times(0); + EXPECT_CALL(set_mock_uploader_expectations_, + Call(Ne(UploaderInterface::IMCOMPLETE_RETRY), NotNull())) + .Times(0); ConfirmOrDie(/*sequencing_id=*/0); task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); @@ -1310,28 +1379,6 @@ EXPECT_EQ(result.error_code(), error::UNKNOWN); } -TEST_P(StorageQueueTest, EnableCompression) { - CreateTestStorageQueueOrDie(BuildStorageQueueOptionsPeriodic()); - WriteStringOrDie(kData[0]); - WriteStringOrDie(kData[1]); - WriteStringOrDie(kData[2]); - - // Set uploader expectations. - test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { - MockUploadClient::SetUp(mock_upload_client, &waiter) - .Required(0, kData[0]) - .Required(1, kData[1]) - .Required(2, kData[2]); - return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); - - // Trigger upload. - task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); -} - TEST_P(StorageQueueTest, ForceConfirm) { CreateTestStorageQueueOrDie(BuildStorageQueueOptionsPeriodic()); @@ -1342,15 +1389,16 @@ { // Set uploader expectations. test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::PERIODIC, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(0, kData[0]) .Required(1, kData[1]) .Required(2, kData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); // Forward time to trigger upload task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); @@ -1362,13 +1410,14 @@ { // Set uploader expectations. test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::PERIODIC, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .Required(2, kData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); // Forward time to trigger upload task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); } @@ -1380,8 +1429,10 @@ // Set uploader expectations. // #0 and #1 could be returned as Gaps test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::PERIODIC, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .RequiredSeqId(0) .RequiredSeqId(1) @@ -1394,8 +1445,7 @@ .Possible(1, kData[1]) .Required(2, kData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); // Forward time to trigger upload task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); } @@ -1407,8 +1457,10 @@ // Set uploader expectations. // #0 and #1 could be returned as Gaps test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) - .WillOnce(Invoke([&waiter](MockUploadClient* mock_upload_client) { + EXPECT_CALL(set_mock_uploader_expectations_, + Call(UploaderInterface::PERIODIC, NotNull())) + .WillOnce(Invoke([&waiter](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(mock_upload_client, &waiter) .RequiredSeqId(1) .RequiredSeqId(2) @@ -1418,8 +1470,7 @@ .Possible(1, kData[1]) .Required(2, kData[2]); return Status::StatusOK(); - })) - .WillRepeatedly(Invoke(&DoNotUpload)); + })); // Forward time to trigger upload task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); }
diff --git a/components/reporting/storage/storage_unittest.cc b/components/reporting/storage/storage_unittest.cc index d6c41db..4b47b6b38b1 100644 --- a/components/reporting/storage/storage_unittest.cc +++ b/components/reporting/storage/storage_unittest.cc
@@ -9,6 +9,7 @@ #include <tuple> #include <utility> +#include <base/containers/flat_map.h> #include "base/callback_helpers.h" #include "base/files/scoped_temp_dir.h" #include "base/sequenced_task_runner.h" @@ -35,6 +36,7 @@ #include "components/reporting/util/statusor.h" #include "components/reporting/util/test_support_callbacks.h" #include "crypto/sha2.h" +#include "storage_uploader_interface.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -182,10 +184,11 @@ // Whenever a record is uploaded and includes last record digest, this map // should have that digest already recorded. Only the first record in a // generation is uploaded without last record digest. - using LastRecordDigestMap = std::map<std::tuple<Priority, - int64_t /*generation id*/, - int64_t /*sequencing id*/>, - absl::optional<std::string /*digest*/>>; + using LastRecordDigestMap = + base::flat_map<std::tuple<Priority, + int64_t /*generation id*/, + int64_t /*sequencing id*/>, + absl::optional<std::string /*digest*/>>; explicit MockUploadClient( LastRecordDigestMap* last_record_digest_map, @@ -510,9 +513,13 @@ // Disallow uploads unless other expectation is set (any later EXPECT_CALL // will take precedence over this one). EXPECT_CALL(set_mock_uploader_expectations_, Call(_, NotNull())) - .WillRepeatedly(WithoutArgs(Invoke([]() { - return Status(error::UNAVAILABLE, "Upload unavailable at this time"); - }))); + .WillRepeatedly(Invoke([](UploaderInterface::UploadReason reason, + MockUploadClient* mock_upload_client) { + return Status( + error::UNAVAILABLE, + base::StrCat({"Mock Client not provided by the test, reason=", + base::NumberToString(reason)})); + })); // Encryption is enabled by default. ASSERT_TRUE(EncryptionModuleInterface::is_enabled()); if (is_encryption_enabled()) { @@ -560,7 +567,7 @@ // Set uploader expectations for any queue; expect no records and need // key. Make sure no uploads happen, and key is requested. EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(true), NotNull())) + Call(Eq(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce(WithArg<1>(Invoke([](MockUploadClient* mock_upload_client) { MockUploadClient::SetKeyDelivery client(mock_upload_client); return Status::StatusOK(); @@ -626,17 +633,18 @@ } void AsyncStartMockUploader( - bool need_encryption_key, + UploaderInterface::UploadReason reason, UploaderInterface::UploaderInterfaceResultCb start_uploader_cb) { auto uploader = std::make_unique<MockUploadClient>( &last_record_digest_map_, sequenced_task_runner_, - need_encryption_key ? base::BindOnce(&Storage::UpdateEncryptionKey, - base::Unretained(storage_.get()), - signed_encryption_key_) - : base::DoNothing(), + reason == UploaderInterface::KEY_DELIVERY + ? base::BindOnce(&Storage::UpdateEncryptionKey, + base::Unretained(storage_.get()), + signed_encryption_key_) + : base::DoNothing(), decryptor_); - const auto status = set_mock_uploader_expectations_.Call( - need_encryption_key, uploader.get()); + const auto status = + set_mock_uploader_expectations_.Call(reason, uploader.get()); if (!status.ok()) { std::move(start_uploader_cb).Run(status); return; @@ -645,14 +653,15 @@ } void AsyncStartMockUploaderFailing( - bool need_encryption_key, + UploaderInterface::UploadReason reason, UploaderInterface::UploaderInterfaceResultCb start_uploader_cb) { - if (key_delivery_failure_.load()) { + if (reason == UploaderInterface::KEY_DELIVERY && + key_delivery_failure_.load()) { std::move(start_uploader_cb) .Run(Status(error::FAILED_PRECONDITION, "Test cannot start upload")); return; } - AsyncStartMockUploader(need_encryption_key, std::move(start_uploader_cb)); + AsyncStartMockUploader(reason, std::move(start_uploader_cb)); } Status WriteString(Priority priority, base::StringPiece data) { @@ -751,7 +760,7 @@ base::ThreadPool::CreateSequencedTaskRunner(base::TaskTraits())}; ::testing::NiceMock<::testing::MockFunction< - Status(bool /*need_encryption_key*/, MockUploadClient*)>> + Status(UploaderInterface::UploadReason /*reason*/, MockUploadClient*)>> set_mock_uploader_expectations_; }; @@ -793,7 +802,7 @@ // Set uploader expectations. test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(FAST_BATCH, mock_upload_client, &waiter) @@ -823,15 +832,14 @@ // Set uploader expectations. { test::TestCallbackAutoWaiter waiter; - EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/_, NotNull())) + EXPECT_CALL(set_mock_uploader_expectations_, Call(/*reason=*/_, NotNull())) .WillRepeatedly( WithArg<1>(Invoke([](MockUploadClient* mock_upload_client) { MockUploadClient::SetEmpty client(mock_upload_client); return Status::StatusOK(); }))); EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(MANUAL_BATCH, mock_upload_client, &waiter) @@ -860,7 +868,7 @@ // Set uploader expectations with encryption key request. test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(true), NotNull())) + Call(Eq(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(MANUAL_BATCH, mock_upload_client, &waiter) @@ -891,7 +899,7 @@ // Set uploader expectations. test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(FAST_BATCH, mock_upload_client, &waiter) @@ -918,7 +926,7 @@ // Set uploader expectations. test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(MANUAL_BATCH, mock_upload_client, &waiter) @@ -949,7 +957,7 @@ // Set uploader expectations. test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(MANUAL_BATCH, mock_upload_client, &waiter) @@ -978,7 +986,7 @@ // Set uploader expectations. test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(FAST_BATCH, mock_upload_client, &waiter) @@ -999,7 +1007,7 @@ // Set uploader expectations. test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(FAST_BATCH, mock_upload_client, &waiter) @@ -1018,7 +1026,7 @@ test::TestCallbackAutoWaiter waiter; // Set uploader expectations. EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(FAST_BATCH, mock_upload_client, &waiter) @@ -1039,7 +1047,7 @@ // Set uploader expectations. test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(FAST_BATCH, mock_upload_client, &waiter) @@ -1059,7 +1067,7 @@ // Set uploader expectations. test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(FAST_BATCH, mock_upload_client, &waiter) @@ -1082,7 +1090,7 @@ { test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(IMMEDIATE, mock_upload_client, &waiter) @@ -1097,7 +1105,7 @@ { test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(IMMEDIATE, mock_upload_client, &waiter) @@ -1113,7 +1121,7 @@ { test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(IMMEDIATE, mock_upload_client, &waiter) @@ -1138,7 +1146,7 @@ { test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(IMMEDIATE, mock_upload_client, &waiter) @@ -1152,7 +1160,7 @@ { test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(IMMEDIATE, mock_upload_client, &waiter) @@ -1167,7 +1175,7 @@ { test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(IMMEDIATE, mock_upload_client, &waiter) @@ -1190,7 +1198,7 @@ { test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(IMMEDIATE, mock_upload_client, &waiter) @@ -1205,7 +1213,7 @@ { test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(IMMEDIATE, mock_upload_client, &waiter) @@ -1221,7 +1229,7 @@ { test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(IMMEDIATE, mock_upload_client, &waiter) @@ -1242,7 +1250,7 @@ { test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(IMMEDIATE, mock_upload_client, &waiter) @@ -1258,7 +1266,7 @@ { test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(IMMEDIATE, mock_upload_client, &waiter) @@ -1279,7 +1287,7 @@ { test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(SLOW_BATCH, mock_upload_client, &waiter) @@ -1298,7 +1306,7 @@ { test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(IMMEDIATE, mock_upload_client, &waiter) @@ -1317,7 +1325,7 @@ { test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(SLOW_BATCH, mock_upload_client, &waiter) @@ -1338,7 +1346,7 @@ { test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce(WithArg<1>(Invoke([](MockUploadClient* mock_upload_client) { return Status(error::UNAVAILABLE, "Test uploader unavailable"); }))) @@ -1392,7 +1400,7 @@ { test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(FAST_BATCH, mock_upload_client, &waiter) @@ -1412,7 +1420,7 @@ { test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(FAST_BATCH, mock_upload_client, &waiter) @@ -1430,7 +1438,7 @@ { test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(FAST_BATCH, mock_upload_client, &waiter) @@ -1457,7 +1465,7 @@ { test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(FAST_BATCH, mock_upload_client, &waiter) @@ -1510,7 +1518,7 @@ // key. Make sure no uploads happen, and key is requested. key_delivery_failure_.store(false); EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(true), NotNull())) + Call(UploaderInterface::KEY_DELIVERY, NotNull())) .WillOnce(WithArg<1>(Invoke([](MockUploadClient* mock_upload_client) { MockUploadClient::SetKeyDelivery client(mock_upload_client); return Status::StatusOK(); @@ -1529,7 +1537,7 @@ { test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(FAST_BATCH, mock_upload_client, &waiter) @@ -1556,7 +1564,7 @@ { test::TestCallbackAutoWaiter waiter; EXPECT_CALL(set_mock_uploader_expectations_, - Call(/*need_encryption_key=*/Eq(false), NotNull())) + Call(Ne(UploaderInterface::KEY_DELIVERY), NotNull())) .WillOnce( WithArg<1>(Invoke([&waiter](MockUploadClient* mock_upload_client) { MockUploadClient::SetUp(FAST_BATCH, mock_upload_client, &waiter)
diff --git a/components/reporting/storage/storage_uploader_interface.h b/components/reporting/storage/storage_uploader_interface.h index a4975c2..1f288ab 100644 --- a/components/reporting/storage/storage_uploader_interface.h +++ b/components/reporting/storage/storage_uploader_interface.h
@@ -24,6 +24,19 @@ // automatically discards after |Completed| returns. class UploaderInterface { public: + // Reason upload is instantiated. + enum UploadReason { + UNKNOWN = 0, + MANUAL = 1, + KEY_DELIVERY = 2, + PERIODIC = 3, + IMMEDIATE_FLUSH = 4, + FAILURE_RETRY = 5, + IMCOMPLETE_RETRY = 6, + INIT_RESUME = 7, + MAX_REASON = 8, // Anything beyond this is illegal. + }; + // using AsyncStartUploaderCb = // base::RepeatingCallback<StatusOr<std::unique_ptr<UploaderInterface>>( // bool need_encryption_key)>; @@ -36,7 +49,7 @@ base::OnceCallback<void(StatusOr<std::unique_ptr<UploaderInterface>>)>; // Callback type for asynchronous UploadInterface provider. using AsyncStartUploaderCb = - base::RepeatingCallback<void(bool need_encryption_key, + base::RepeatingCallback<void(UploaderInterface::UploadReason reason, UploaderInterfaceResultCb)>; UploaderInterface(const UploaderInterface& other) = delete;
diff --git a/components/safe_browsing/content/browser/download/BUILD.gn b/components/safe_browsing/content/browser/download/BUILD.gn index e86536d..ec1f7d3 100644 --- a/components/safe_browsing/content/browser/download/BUILD.gn +++ b/components/safe_browsing/content/browser/download/BUILD.gn
@@ -24,6 +24,7 @@ deps = [ ":download_stats", "//base/test:test_support", + "//components/safe_browsing/content/common:file_type_policies", "//testing/gtest", ] }
diff --git a/components/safe_browsing/content/browser/download/download_stats.cc b/components/safe_browsing/content/browser/download/download_stats.cc index 33d8eef9..fb88aed 100644 --- a/components/safe_browsing/content/browser/download/download_stats.cc +++ b/components/safe_browsing/content/browser/download/download_stats.cc
@@ -118,4 +118,32 @@ /* max */ base::TimeDelta::FromDays(1), /* buckets */ 50); } +void RecordDownloadFileTypeAttributes( + DownloadFileType::DangerLevel danger_level, + bool has_user_gesture, + bool visited_referrer_before) { + if (danger_level != DownloadFileType::ALLOW_ON_USER_GESTURE) { + return; + } + base::UmaHistogramEnumeration( + "SBClientDownload.UserGestureFileType.Attributes", + UserGestureFileTypeAttributes::TOTAL_TYPE_CHECKED); + if (has_user_gesture) { + base::UmaHistogramEnumeration( + "SBClientDownload.UserGestureFileType.Attributes", + UserGestureFileTypeAttributes::HAS_USER_GESTURE); + } + if (visited_referrer_before) { + base::UmaHistogramEnumeration( + "SBClientDownload.UserGestureFileType.Attributes", + UserGestureFileTypeAttributes::HAS_REFERRER_VISIT); + } + if (has_user_gesture && visited_referrer_before) { + base::UmaHistogramEnumeration( + "SBClientDownload.UserGestureFileType.Attributes", + UserGestureFileTypeAttributes:: + HAS_BOTH_USER_GESTURE_AND_REFERRER_VISIT); + } +} + } // namespace safe_browsing
diff --git a/components/safe_browsing/content/browser/download/download_stats.h b/components/safe_browsing/content/browser/download/download_stats.h index 66402ec..95cf4a6 100644 --- a/components/safe_browsing/content/browser/download/download_stats.h +++ b/components/safe_browsing/content/browser/download/download_stats.h
@@ -6,6 +6,7 @@ #define COMPONENTS_SAFE_BROWSING_CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_STATS_H_ #include "components/download/public/common/download_danger_type.h" +#include "components/safe_browsing/content/common/file_type_policies.h" namespace base { class FilePath; @@ -15,6 +16,26 @@ // The functions in this file are for logging UMA metrics related to downloads. namespace safe_browsing { +// Enum representing different attributes for file types that are allowed on +// user gestures. This enum is used for logging UMA histograms, so entries must +// not be removed or reordered. Please update the enums.xml file if new values +// are added. +enum class UserGestureFileTypeAttributes { + // The total number of checks. This value should be used as the denominator + // when calculating the percentage of a specific attribute below. + TOTAL_TYPE_CHECKED = 0, + // The download is initiated with a user gesture. + HAS_USER_GESTURE = 1, + // The referrer of the download was visited before. + HAS_REFERRER_VISIT = 2, + // The referrer of the download is initiated with a user gesture and was + // visited before. + // The download is considered safe in this case. + HAS_BOTH_USER_GESTURE_AND_REFERRER_VISIT = 3, + + kMaxValue = HAS_BOTH_USER_GESTURE_AND_REFERRER_VISIT +}; + // Records that a download warning was shown on the download shelf. void RecordDangerousDownloadWarningShown( download::DownloadDangerType danger_type, @@ -37,6 +58,12 @@ base::Time download_end_time, bool show_download_in_folder); +// Records the attributes of a download. +void RecordDownloadFileTypeAttributes( + DownloadFileType::DangerLevel danger_level, + bool has_user_gesture, + bool visited_referrer_before); + } // namespace safe_browsing #endif // COMPONENTS_SAFE_BROWSING_CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_STATS_H_
diff --git a/components/safe_browsing/content/browser/download/download_stats_unittest.cc b/components/safe_browsing/content/browser/download/download_stats_unittest.cc index 3512da8..6a01cf8 100644 --- a/components/safe_browsing/content/browser/download/download_stats_unittest.cc +++ b/components/safe_browsing/content/browser/download/download_stats_unittest.cc
@@ -6,6 +6,7 @@ #include "base/files/file_path.h" #include "base/test/metrics/histogram_tester.h" +#include "components/safe_browsing/content/common/file_type_policies.h" #include "testing/gtest/include/gtest/gtest.h" namespace { @@ -103,4 +104,40 @@ /*count=*/1); } +TEST(SafeBrowsingDownloadStatsTest, RecordDownloadFileTypeAttributes) { + { + base::HistogramTester histogram_tester; + RecordDownloadFileTypeAttributes(DownloadFileType::ALLOW_ON_USER_GESTURE, + /*has_user_gesture=*/false, + /*visited_referrer_before=*/false); + histogram_tester.ExpectUniqueSample( + "SBClientDownload.UserGestureFileType.Attributes", + /*sample=*/UserGestureFileTypeAttributes::TOTAL_TYPE_CHECKED, + /*expected_bucket_count=*/1); + } + { + base::HistogramTester histogram_tester; + RecordDownloadFileTypeAttributes(DownloadFileType::ALLOW_ON_USER_GESTURE, + /*has_user_gesture=*/true, + /*visited_referrer_before=*/true); + histogram_tester.ExpectBucketCount( + "SBClientDownload.UserGestureFileType.Attributes", + /*sample=*/UserGestureFileTypeAttributes::TOTAL_TYPE_CHECKED, + /*expected_count=*/1); + histogram_tester.ExpectBucketCount( + "SBClientDownload.UserGestureFileType.Attributes", + /*sample=*/UserGestureFileTypeAttributes::HAS_USER_GESTURE, + /*expected_count=*/1); + histogram_tester.ExpectBucketCount( + "SBClientDownload.UserGestureFileType.Attributes", + /*sample=*/UserGestureFileTypeAttributes::HAS_REFERRER_VISIT, + /*expected_count=*/1); + histogram_tester.ExpectBucketCount( + "SBClientDownload.UserGestureFileType.Attributes", + /*sample=*/ + UserGestureFileTypeAttributes::HAS_BOTH_USER_GESTURE_AND_REFERRER_VISIT, + /*expected_count=*/1); + } +} + } // namespace safe_browsing
diff --git a/components/safe_browsing/core/browser/password_protection/password_protection_service_base.cc b/components/safe_browsing/core/browser/password_protection/password_protection_service_base.cc index fac0300f..11dfbcf 100644 --- a/components/safe_browsing/core/browser/password_protection/password_protection_service_base.cc +++ b/components/safe_browsing/core/browser/password_protection/password_protection_service_base.cc
@@ -122,6 +122,15 @@ !IsInExcludedCountry(); } +bool PasswordProtectionServiceBase:: + IsSyncingGMAILPasswordWithSignedInProtectionEnabled( + ReusedPasswordAccountType password_type) const { + return base::FeatureList::IsEnabled( + safe_browsing::kPasswordProtectionForSignedInUsers) && + password_type.account_type() == ReusedPasswordAccountType::GMAIL && + password_type.is_account_syncing(); +} + void PasswordProtectionServiceBase::RequestFinished( PasswordProtectionRequest* request, RequestOutcome outcome, @@ -382,10 +391,7 @@ // Currently password reuse warnings are only supported for saved passwords // and GAIA passwords on Android. #if defined(OS_ANDROID) - return base::FeatureList::IsEnabled( - safe_browsing::kPasswordProtectionForSignedInUsers) && - password_type.account_type() == ReusedPasswordAccountType::GMAIL && - password_type.is_account_syncing(); + return IsSyncingGMAILPasswordWithSignedInProtectionEnabled(password_type); #else if (password_type.account_type() == ReusedPasswordAccountType::NON_GAIA_ENTERPRISE)
diff --git a/components/safe_browsing/core/browser/password_protection/password_protection_service_base.h b/components/safe_browsing/core/browser/password_protection/password_protection_service_base.h index 8238fe4..37a9ae78 100644 --- a/components/safe_browsing/core/browser/password_protection/password_protection_service_base.h +++ b/components/safe_browsing/core/browser/password_protection/password_protection_service_base.h
@@ -251,6 +251,11 @@ const GURL& main_frame_url, ReusedPasswordAccountType password_type); + // If ReusedPasswordAccountType is GMAIL and syncing and + // kPasswordProtectionForSignedInUsers is enabled. + bool IsSyncingGMAILPasswordWithSignedInProtectionEnabled( + ReusedPasswordAccountType password_type) const; + // Called by a PasswordProtectionRequest instance when it finishes to remove // itself from |requests_|. virtual void RequestFinished(
diff --git a/components/services/quarantine/public/mojom/BUILD.gn b/components/services/quarantine/public/mojom/BUILD.gn index 4282d890..b8c94630 100644 --- a/components/services/quarantine/public/mojom/BUILD.gn +++ b/components/services/quarantine/public/mojom/BUILD.gn
@@ -9,6 +9,7 @@ public_deps = [ "//mojo/public/mojom/base", + "//sandbox/policy/mojom", "//url/mojom:url_mojom_gurl", ] }
diff --git a/components/services/quarantine/public/mojom/quarantine.mojom b/components/services/quarantine/public/mojom/quarantine.mojom index 4f03cad8..c6cb9b2 100644 --- a/components/services/quarantine/public/mojom/quarantine.mojom +++ b/components/services/quarantine/public/mojom/quarantine.mojom
@@ -5,6 +5,7 @@ module quarantine.mojom; import "mojo/public/mojom/base/file_path.mojom"; +import "sandbox/policy/mojom/sandbox.mojom"; import "url/mojom/url.mojom"; enum QuarantineFileResult { @@ -23,6 +24,9 @@ // deleted. }; +// Usually hosted in the browser process. On Windows this may run out +// of process for stability. +[ServiceSandbox=sandbox.mojom.Sandbox.kNoSandbox] interface Quarantine { QuarantineFile(mojo_base.mojom.FilePath full_path,
diff --git a/components/strings/components_strings_az.xtb b/components/strings/components_strings_az.xtb index ca63b38..ab2352e 100644 --- a/components/strings/components_strings_az.xtb +++ b/components/strings/components_strings_az.xtb
@@ -96,6 +96,7 @@ <translation id="129863573139666797"><ph name="BEGIN_LINK" />Kukiləriniz təmizlənir<ph name="END_LINK" /></translation> <translation id="1301324364792935241">Təhlükəsiz DNS ayarlarınızı yoxlayın</translation> <translation id="1307966114820526988">Ləğv edilmiş funksiya</translation> +<translation id="1312803275555673949">Hansı dəlillər bunu dəstəkləyir?</translation> <translation id="131405271941274527">NFC cihazında telefonunuza toxunan zaman <ph name="URL" /> məlumat göndərmək və qəbul etmək istəyir</translation> <translation id="1314509827145471431">Sağdan uclarını qovuşdurun</translation> <translation id="1319245136674974084">Bu tətbiq haqqında bir daha soruşmayın</translation> @@ -639,6 +640,7 @@ <translation id="3240791268468473923">"Təhlükəsiz ödəniş giriş məlumatları uyğun gəlmir" giriş məlumatları səhifəsi açılıb</translation> <translation id="3249845759089040423">Modern</translation> <translation id="3252266817569339921">Fransız</translation> +<translation id="3257954757204451555">Bu məlumatların arxasında kim dayanır?</translation> <translation id="3259648571731540213"><ph name="CREATE_GOOGLE_CALENDAR_EVENT_FOCUSED_FRIENDLY_MATCH_TEXT" />, Tab düyməsi, sonra Enter düyməsinə basaraq Google Calendar'da cəld yeni tədbir yaradın</translation> <translation id="3266793032086590337">Dəyər (zidd)</translation> <translation id="3268451620468152448">Panelləri Açın</translation> @@ -1035,6 +1037,7 @@ <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">Artırmalarınız deaktiv edilir</translation> <translation id="4559332380232738994">10x11</translation> +<translation id="4567686777917670400">Administrator brauzer quraşdırmasını uzaqdan dəyişə bilər. Bu cihazdakı fəaliyyət Chromium'dan kənarda da idarə edilə bilər. <ph name="BEGIN_LINK" />Ətraflı məlumat<ph name="END_LINK" /></translation> <translation id="457875822857220463">Çatdırılma</translation> <translation id="4579056131138995126">Şəxsi (Zərf)</translation> <translation id="4582204425268416675">Kartı silin</translation> @@ -1526,6 +1529,7 @@ <translation id="6337534724793800597">Siyasətləri adlara əsasən filtrləyin</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> tətbiqini quraşdırın</translation> <translation id="6353505687280762741">{COUNT,plural, =0{Heç biri}=1{1 parol (<ph name="DOMAIN_LIST" /> üçün sinxronizasiya edilib)}=2{2 parol (<ph name="DOMAIN_LIST" />üçün sinxronizasiya edilib)}other{# parol (<ph name="DOMAIN_LIST" />üçün sinxronizasiya edilib)}}</translation> +<translation id="6355392890578844978">Bu brauzer şirkət və ya başqa təşkilat tərəfindən idarə edilmir. Bu cihazdakı fəaliyyət Chromium'dan kənarda idarə edilə bilər. <ph name="BEGIN_LINK" />Ətraflı məlumat<ph name="END_LINK" /></translation> <translation id="6358450015545214790">Bunun mənası nədir?</translation> <translation id="6361757823711327522">B7</translation> <translation id="6364095313648930329"><ph name="BEGIN_LINK" />Proksi, qoruyucu divar və DNS konfiqurasiyası yoxlanılır<ph name="END_LINK" /></translation> @@ -1977,6 +1981,7 @@ <translation id="7961015016161918242">Heç vaxt</translation> <translation id="7966803981046576691">İş hesabı növü</translation> <translation id="79682505114836835">"<ph name="VALUE" />" dəyəri yanlış altılıq rəngdir.</translation> +<translation id="7970392640816874403">Digər mənbələr nə deyir?</translation> <translation id="7976214039405368314">Həddən çox sorğu var</translation> <translation id="7977538094055660992">Çıxış cihazı</translation> <translation id="7977894662897852582">Edp</translation>
diff --git a/components/strings/components_strings_gl.xtb b/components/strings/components_strings_gl.xtb index 6e00d0a..c6ec27d 100644 --- a/components/strings/components_strings_gl.xtb +++ b/components/strings/components_strings_gl.xtb
@@ -96,6 +96,7 @@ <translation id="129863573139666797"><ph name="BEGIN_LINK" />Proba a borrar as cookies<ph name="END_LINK" /></translation> <translation id="1301324364792935241">Comproba a configuración do teu DNS seguro</translation> <translation id="1307966114820526988">Funcións obsoletas</translation> +<translation id="1312803275555673949">Que probas demostran a información?</translation> <translation id="131405271941274527"><ph name="URL" /> quere enviar e recibir información cando o teu teléfono toque un dispositivo NFC</translation> <translation id="1314509827145471431">Encadernación na parte dereita</translation> <translation id="1319245136674974084">Non volver preguntar para esta aplicación</translation> @@ -640,6 +641,7 @@ <translation id="3240791268468473923">A folla da credencial de pagos seguros correspondente ás credenciais non coincidentes está aberta</translation> <translation id="3249845759089040423">Moderno</translation> <translation id="3252266817569339921">Francés</translation> +<translation id="3257954757204451555">Quen ofrece esta información?</translation> <translation id="3259648571731540213"><ph name="CREATE_GOOGLE_CALENDAR_EVENT_FOCUSED_FRIENDLY_MATCH_TEXT" />. Preme Tabulador e, a continuación, Introducir para crear rapidamente un novo evento en Google Calendar</translation> <translation id="3266793032086590337">Valor (en conflito)</translation> <translation id="3268451620468152448">Pestanas abertas</translation> @@ -1039,6 +1041,7 @@ <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">Proba a desactivar as extensións.</translation> <translation id="4559332380232738994">10x11</translation> +<translation id="4567686777917670400">O teu administrador pode cambiar a configuración do navegador de forma remota. A actividade deste dispositivo tamén se pode xestionar fóra de Chromium. <ph name="BEGIN_LINK" />Máis información<ph name="END_LINK" /></translation> <translation id="457875822857220463">Entrega</translation> <translation id="4579056131138995126">Personal (sobre)</translation> <translation id="4582204425268416675">Quitar tarxeta</translation> @@ -1530,6 +1533,7 @@ <translation id="6337534724793800597">Filtrar políticas por nome</translation> <translation id="6349101878882523185">Instalar a aplicación <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Ningún}=1{1 contrasinal (para <ph name="DOMAIN_LIST" />, sincronizado)}=2{2 contrasinais (para <ph name="DOMAIN_LIST" />, sincronizados)}other{# contrasinais (para <ph name="DOMAIN_LIST" />, sincronizados)}}</translation> +<translation id="6355392890578844978">Ningunha compañía ou organización xestiona este navegador. A actividade deste dispositivo pódese xestionar fóra de Chromium. <ph name="BEGIN_LINK" />Máis información<ph name="END_LINK" /></translation> <translation id="6358450015545214790">Que significan estas seccións?</translation> <translation id="6361757823711327522">B7</translation> <translation id="6364095313648930329"><ph name="BEGIN_LINK" />Comprobar o proxy, o firewall e a configuración do DNS seguro<ph name="END_LINK" /></translation> @@ -1981,6 +1985,7 @@ <translation id="7961015016161918242">Nunca</translation> <translation id="7966803981046576691">Tipo de conta para o traballo</translation> <translation id="79682505114836835">O valor "<ph name="VALUE" />" é unha cor hexadecimal non válida.</translation> +<translation id="7970392640816874403">Que din outras fontes?</translation> <translation id="7976214039405368314">Hai demasiadas solicitudes</translation> <translation id="7977538094055660992">Dispositivo de saída</translation> <translation id="7977894662897852582">Edp</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb index 3f97038..98d757d 100644 --- a/components/strings/components_strings_ml.xtb +++ b/components/strings/components_strings_ml.xtb
@@ -96,6 +96,7 @@ <translation id="129863573139666797"><ph name="BEGIN_LINK" />നിങ്ങളുടെ കുക്കികൾ മായ്ക്കുന്നത് പരീക്ഷിക്കുക<ph name="END_LINK" /></translation> <translation id="1301324364792935241">നിങ്ങളുടെ സുരക്ഷിത DNS ക്രമീകരണം പരിശോധിക്കുക</translation> <translation id="1307966114820526988">അവസാനിപ്പിച്ച ഫീച്ചറുകൾ</translation> +<translation id="1312803275555673949">ഇതിനെ പിന്തുണയ്ക്കുന്ന തെളിവുകൾ എന്തൊക്കെയാണ്?</translation> <translation id="131405271941274527">ഒരു NFC ഉപകരണത്തിൽ നിങ്ങളുടെ ഫോൺ ടാപ്പ് ചെയ്യുമ്പോൾ വിവരങ്ങൾ അയയ്ക്കാനും സ്വീകരിക്കാനും <ph name="URL" /> താൽപ്പര്യപ്പെടുന്നു</translation> <translation id="1314509827145471431">വലതുവശത്ത് ബൈൻഡ് ചെയ്യുക</translation> <translation id="1319245136674974084">ഈ ആപ്പിൽ വീണ്ടും ആവശ്യപ്പെടരുത്</translation> @@ -639,6 +640,7 @@ <translation id="3240791268468473923">സുരക്ഷിതമായ പേയ്മെന്റ് ക്രെഡൻഷ്യലുമായി പൊരുത്തമില്ലാത്ത ക്രെഡൻഷ്യൽ ഷീറ്റ് തുറന്നു</translation> <translation id="3249845759089040423">ഗ്രൂവി</translation> <translation id="3252266817569339921">ഫ്രഞ്ച്</translation> +<translation id="3257954757204451555">ആരാണ് ഈ വിവരങ്ങൾ നൽകിയത്?</translation> <translation id="3259648571731540213"><ph name="CREATE_GOOGLE_CALENDAR_EVENT_FOCUSED_FRIENDLY_MATCH_TEXT" />, Google Calendar-ൽ പുതിയൊരു ഇവന്റ് വേഗത്തിൽ സൃഷ്ടിക്കാൻ Enter അമർത്തുക</translation> <translation id="3266793032086590337">മൂല്യം (വൈരുദ്ധ്യം)</translation> <translation id="3268451620468152448">ഓപ്പൺ ടാബുകൾ</translation> @@ -1036,6 +1038,7 @@ <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">നിങ്ങളുടെ വിപുലീകരണങ്ങൾ പ്രവർത്തനരഹിതമാക്കുന്നത് പരീക്ഷിക്കുക.</translation> <translation id="4559332380232738994">10x11</translation> +<translation id="4567686777917670400">നിങ്ങളുടെ അഡ്മിന് വിദൂരമായി ബ്രൗസർ സജ്ജീകരണം മാറ്റാനാകും. ഈ ഉപകരണത്തിലെ ആക്റ്റിവിറ്റി Chromium-ന് പുറത്തും മാനേജ് ചെയ്തേക്കാം. <ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation> <translation id="457875822857220463">ഡെലിവറി വിവരങ്ങൾ</translation> <translation id="4579056131138995126">വ്യക്തിപരം (എൻവലപ്പ്)</translation> <translation id="4582204425268416675">കാർഡ് നീക്കം ചെയ്യുക</translation> @@ -1527,6 +1530,7 @@ <translation id="6337534724793800597">പേരിന്റെ ക്രമത്തിൽ നയങ്ങൾ ഫിൽട്ടർ ചെയ്യുക</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> ഇൻസ്റ്റാൾ ചെയ്യുക</translation> <translation id="6353505687280762741">{COUNT,plural, =0{ഒന്നുമില്ല}=1{<ph name="DOMAIN_LIST" /> എന്നതിനുള്ള ഒരു പാസ്വേഡ് (സമന്വയിപ്പിച്ചത്)}=2{<ph name="DOMAIN_LIST" /> എന്നതിനുള്ള 2 പാസ്വേഡുകൾ (സമന്വയിപ്പിച്ചത്)}other{<ph name="DOMAIN_LIST" /> എന്നതിനുള്ള# പാസ്വേഡുകൾ (സമന്വയിപ്പിച്ചത്)}}</translation> +<translation id="6355392890578844978">കമ്പനിയോ മറ്റേതെങ്കിലും സ്ഥാപനമോ മാനേജ് ചെയ്യുന്നതല്ല ഈ ബ്രൗസർ. ഈ ഉപകരണത്തിലെ ആക്റ്റിവിറ്റി Chromium-ന് പുറത്ത് മാനേജ് ചെയ്തേക്കാം. <ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation> <translation id="6358450015545214790">ഇത് അര്ത്ഥമാക്കുന്നതെന്താണ്?</translation> <translation id="6361757823711327522">B7</translation> <translation id="6364095313648930329"><ph name="BEGIN_LINK" />പ്രോക്സിയും ഫയർവാളും സുരക്ഷിത DNS കോൺഫിഗറേഷനും പരിശോധിക്കുന്നു<ph name="END_LINK" /></translation> @@ -1976,6 +1980,7 @@ <translation id="7961015016161918242">ഒരിക്കലും</translation> <translation id="7966803981046576691">ജോബ് അക്കൗണ്ട് തരം</translation> <translation id="79682505114836835">"<ph name="VALUE" />" എന്ന മൂല്യം അസാധുവായ ഒരു ഹെക്സ് നിറമാണ്.</translation> +<translation id="7970392640816874403">മറ്റ് ഉറവിടങ്ങൾ എന്താണ് പറയുന്നത്?</translation> <translation id="7976214039405368314">നിരവധി അഭ്യർത്ഥനകൾ</translation> <translation id="7977538094055660992">ഔട്ട്പുട്ട് ഉപകരണം</translation> <translation id="7977894662897852582">Edp</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb index 33603a4..bd3a7b4 100644 --- a/components/strings/components_strings_mr.xtb +++ b/components/strings/components_strings_mr.xtb
@@ -10,7 +10,7 @@ <translation id="1021110881106174305">स्वीकारलेली कार्ड</translation> <translation id="1021753677514347426">तुम्ही किंवा इतर कोणीतरी तुमच्या डिव्हाइसवर इंस्टॉल केलेल्या सर्टिफिकेटमुळे ही समस्या येते. हे सर्टिफिकेट नेटवर्कचे नियंत्रण करण्यासाठी आणि व्यत्यय आणण्यासाठी वापरले जाते आणि Chromium ला यावर विश्वास नाही. दरम्यान नियंत्रण करण्यासाठी काही कायदेशीर प्रकरणे अस्तित्त्वात आहेत, जसे की शाळा किंवा कंपनीच्या नेटवर्कवर, तुम्ही हे थांबवू शकत नसलात तरीही तुम्हाला याची जाणीव आहे याची Chromium ला खात्री करायची आहे. वेबचा ॲक्सेस असणाऱ्या कोणत्याही ब्राउझर किंवा ॲप्लिकेशनचे नियंत्रण केले जाऊ शकते.</translation> <translation id="1024111578869940408">हल्लेखोर कधीकधी वेब पत्त्यामध्ये पटकन लक्षात न येणारे बदल करून साइटची नक्कल करतात.</translation> -<translation id="1028781062521375153">तपशील पाहा</translation> +<translation id="1028781062521375153">तपशील पहा</translation> <translation id="1030706264415084469"><ph name="URL" /> ला तुमच्या डिव्हाइसवर मोठ्या प्रमाणावर डेटा कायमचा स्टोअर करायचा आहे</translation> <translation id="1032854598605920125">घड्याळाच्या दिशेने फिरवा</translation> <translation id="1036348656032585052">बंद करा</translation> @@ -96,6 +96,7 @@ <translation id="129863573139666797"><ph name="BEGIN_LINK" />आपल्या कुकीज साफ करून पहा<ph name="END_LINK" /></translation> <translation id="1301324364792935241">तुमची सुरक्षित DNS सेटिंग्ज तपासा</translation> <translation id="1307966114820526988">कालबाह्य झालेली वैशिष्ट्ये</translation> +<translation id="1312803275555673949">यासाठी काय पुरावा आहे?</translation> <translation id="131405271941274527">तुम्ही तुमचा फोन NFC डिव्हाइसवर टॅप करता तेव्हा <ph name="URL" /> ला माहिती पाठवायची आणि मिळवायची असते</translation> <translation id="1314509827145471431">बाइंड राइट</translation> <translation id="1319245136674974084">या अॅपसाठी पुन्हा विचारू नका</translation> @@ -300,7 +301,7 @@ <translation id="1974060860693918893">प्रगत</translation> <translation id="1975584088563498795">मेलबॉक्स १०</translation> <translation id="1978555033938440688">फर्मवेयर आवृत्ती</translation> -<translation id="1988881251331415125">शब्दलेखन योग्य असल्यास, <ph name="BEGIN_LINK" />कनेक्टिव्हिटी निदान रन करून पाहा<ph name="END_LINK" />.</translation> +<translation id="1988881251331415125">शब्दलेखन योग्य असल्यास, <ph name="BEGIN_LINK" />कनेक्टिव्हिटी निदान रन करून पहा<ph name="END_LINK" />.</translation> <translation id="1992331125980284532">JIS B3</translation> <translation id="1997484222658892567"><ph name="URL" /> ला तुमच्या स्थानिक काँप्युटरवर मोठ्या प्रमाणावर डेटा कायमचा स्टोअर करायचा आहे</translation> <translation id="2001146170449793414">{COUNT,plural, =1{आणि 1 अधिक}other{आणि # अधिक}}</translation> @@ -641,6 +642,7 @@ <translation id="3240791268468473923">सुरक्षित पेमेंट क्रेडेंशियल याची जुळणारे कोणतेही क्रेडेंशियल नाही ही शीट उघडली आहे</translation> <translation id="3249845759089040423">आधुनिक</translation> <translation id="3252266817569339921">फ्रेंच</translation> +<translation id="3257954757204451555">ही माहिती कोणी पुरवली आहे?</translation> <translation id="3259648571731540213"><ph name="CREATE_GOOGLE_CALENDAR_EVENT_FOCUSED_FRIENDLY_MATCH_TEXT" />, Google Calendar मध्ये नवीन इव्हेंट झटपट तयार करण्यासाठी टॅब आणि त्यानंतर एंटर दाबा</translation> <translation id="3266793032086590337">मूल्य (परस्परविरोधी)</translation> <translation id="3268451620468152448">उघडे Tabs</translation> @@ -653,7 +655,7 @@ <translation id="3287510313208355388">ऑनलाइन असताना डाउनलोड करा</translation> <translation id="3288238092761586174">तुमच्या पेमेंटची पडताळणी करण्यासाठी <ph name="URL" /> ने अतिरिक्त पावले उचलणे आवश्यक असू शकते</translation> <translation id="3293642807462928945"><ph name="POLICY_NAME" /> धोरणांबद्दल अधिक जाणून घ्या</translation> -<translation id="3295444047715739395">Chrome सेटिंग्जमध्ये तुमचे पासवर्ड पाहा आणि व्यवस्थापित करा</translation> +<translation id="3295444047715739395">Chrome सेटिंग्जमध्ये तुमचे पासवर्ड पहा आणि व्यवस्थापित करा</translation> <translation id="3303855915957856445">कोणतेही शोध परिणाम आढळले नाहीत</translation> <translation id="3308006649705061278">संस्थात्मक एकक (OU)</translation> <translation id="3320021301628644560">बिलिंग पत्ता जोडा</translation> @@ -671,7 +673,7 @@ <ph name="END_LIST" /></translation> <translation id="3362968246557010467">हे धोरण कालबाह्य झालेल्या <ph name="OLD_POLICY" /> धोरणावरून आपोआप कॉपी केले गेले. तुम्ही त्याऐवजी हे धोरण वापरले पाहिजे.</translation> <translation id="3364869320075768271"><ph name="URL" /> ला तुमचे आभासी वास्तविकता डिव्हाइस आणि डेटा वापरायचा आहे</translation> -<translation id="3366477098757335611">कार्डे पाहा</translation> +<translation id="3366477098757335611">कार्डे पहा</translation> <translation id="3369192424181595722">घड्याळ एरर</translation> <translation id="3371076217486966826"><ph name="URL" /> ला हे करायचे आहे: • तुमच्या सभोवतालचा 3D नकाशा तयार करणे आणि कॅमेरा स्थितीचा मागोवा घेणे @@ -1039,6 +1041,7 @@ <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">तुमचे विस्तार अक्षम करून पहा.</translation> <translation id="4559332380232738994">10x11</translation> +<translation id="4567686777917670400">तुमचा अॅडमिनिस्ट्रेटर तुमच्या ब्राउझरचा सेटअप रिमोट पद्धतीने बदलू शकतो. या डिव्हाइसवरील अॅक्टिव्हिटी Chromium च्या बाहेरदेखील व्यवस्थापित केली जाऊ शकते. <ph name="BEGIN_LINK" />अधिक जाणून घ्या<ph name="END_LINK" /></translation> <translation id="457875822857220463">वितरण</translation> <translation id="4579056131138995126">Personal (Envelope)</translation> <translation id="4582204425268416675">कार्ड काढून टाका</translation> @@ -1153,7 +1156,7 @@ <translation id="4974590756084640048">चेतावण्या पुन्हा सुरू करा</translation> <translation id="4984088539114770594">मायक्रोफोन वापरायचा का?</translation> <translation id="4984339528288761049">Prc5 (Envelope)</translation> -<translation id="4989163558385430922">सर्व पाहा</translation> +<translation id="4989163558385430922">सर्व पहा</translation> <translation id="4989542687859782284">अनुपलब्ध</translation> <translation id="4989809363548539747">हे प्लगइन सपोर्टेड नाही</translation> <translation id="4995216769782533993">या साइटसोबत तुमच्या कार्डाचा तपशील शेअर करण्यासाठी सुरक्षा कोडची खात्री करा</translation> @@ -1531,6 +1534,7 @@ <translation id="6337534724793800597">धोरणे नावानुसार फिल्टर करा</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> इंस्टॉल करा</translation> <translation id="6353505687280762741">{COUNT,plural, =0{काहीही नाही}=1{(<ph name="DOMAIN_LIST" /> साठी) एक पासवर्ड सिंक केला}=2{(<ph name="DOMAIN_LIST" /> साठी) दोन पासवर्ड सिंक केले}other{(<ph name="DOMAIN_LIST" /> साठी) # पासवर्ड सिंक केले}}</translation> +<translation id="6355392890578844978">हा ब्राउझर कंपनी किंवा इतर संस्थेद्वारे व्यवस्थापित केला जात नाही. या डिव्हाइसवरील अॅक्टिव्हिटी Chromium च्या बाहेर व्यवस्थापित केली जाऊ शकते. <ph name="BEGIN_LINK" />अधिक जाणून घ्या<ph name="END_LINK" /></translation> <translation id="6358450015545214790">याचा अर्थ काय आहे?</translation> <translation id="6361757823711327522">B7</translation> <translation id="6364095313648930329"><ph name="BEGIN_LINK" />प्रॉक्सी, फायरवॉल आणि सुरक्षित DNS कॉंफिगरेशन तपासत आहे<ph name="END_LINK" /></translation> @@ -1815,7 +1819,7 @@ <translation id="7407424307057130981"><p>जर तुमच्या Windows कॉंप्युटरवर Superfish सॉफ्टवेअर असेल, तर तुम्हाला हा एरर दिसेल.</p> <p>सॉफ्टवेअरला तात्पुरत्या स्वरुपात बंद करण्यासाठी या पायऱ्यांनुसार कृती करा, जेणेकरून तुम्ही ते वेबवर मिळवू शकाल. तुमच्याकडे ॲडमिनिस्ट्रेटरचे अधिकार असणे आवश्यक आहे.</p> <ol> - <li><strong>सुरू</strong> वर क्लिक करा, मग स्थानिक सेवा शोधा आणि<strong>"स्थानिक सेवा पाहा"</strong> निवडा + <li><strong>सुरू</strong> वर क्लिक करा, मग स्थानिक सेवा शोधा आणि<strong>"स्थानिक सेवा पहा"</strong> निवडा <li><strong>व्हिज्युअल डिस्कव्हरी</strong> निवडा <li><strong>स्टार्टअप प्रकार</strong> मध्ये, <strong>बंद</strong> निवडा <li><strong>सेवा स्थिती</strong> मध्ये, <strong>थांबवा</strong> वर क्लिक करा @@ -1959,7 +1963,7 @@ <translation id="7887683347370398519">तुमचे CVC तपासा आणि पुन्हा प्रयत्न करा</translation> <translation id="7887885240995164102">चित्रात-चित्र एंटर करा</translation> <translation id="7888575728750733395">प्रस्तुतीकरण इंटेंट प्रिंट करा</translation> -<translation id="7894280532028510793">शब्दलेखन योग्य असल्यास, <ph name="BEGIN_LINK" />नेटवर्क निदान रन करून पाहा<ph name="END_LINK" />.</translation> +<translation id="7894280532028510793">शब्दलेखन योग्य असल्यास, <ph name="BEGIN_LINK" />नेटवर्क निदान रन करून पहा<ph name="END_LINK" />.</translation> <translation id="7904208859782148177">C3 (Envelope)</translation> <translation id="7931318309563332511">अनोळखी</translation> <translation id="793209273132572360">पत्ता अपडेट करायचा आहे का?</translation> @@ -1982,6 +1986,7 @@ <translation id="7961015016161918242">कधीही नाही</translation> <translation id="7966803981046576691">जॉब खाते प्रकार</translation> <translation id="79682505114836835">मूल्य "<ph name="VALUE" />" हा चुकीचा हेक्स रंग आहे.</translation> +<translation id="7970392640816874403">इतर स्रोत काय सांगतात?</translation> <translation id="7976214039405368314">खूप जास्त विनंत्या</translation> <translation id="7977538094055660992">आउटपुट डिव्हाइस</translation> <translation id="7977894662897852582">Edp</translation> @@ -2213,7 +2218,7 @@ <translation id="884923133447025588">कोणतीही निरस्त करण्याची प्रणाली आढळली नाही.</translation> <translation id="885730110891505394">Google सह सामायिकरण</translation> <translation id="8858065207712248076">जर तुम्ही तुमच्या <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> पासवर्डचा इतर साइटवर पुन्हा वापर केला असेल तर Chrome तुम्हाला तो रीसेट करण्याची शिफारस करतो.</translation> -<translation id="885906927438988819">शब्दलेखन योग्य असल्यास, <ph name="BEGIN_LINK" />Windows नेटवर्क निदान रन करून पाहा<ph name="END_LINK" />.</translation> +<translation id="885906927438988819">शब्दलेखन योग्य असल्यास, <ph name="BEGIN_LINK" />Windows नेटवर्क निदान रन करून पहा<ph name="END_LINK" />.</translation> <translation id="8866481888320382733">धोरण सेटिंग्ज पार्स करताना एरर</translation> <translation id="8866928039507595380">फोल्ड</translation> <translation id="886872106311861689">B3</translation>
diff --git a/components/strings/components_strings_ne.xtb b/components/strings/components_strings_ne.xtb index d6a1033..a256e24 100644 --- a/components/strings/components_strings_ne.xtb +++ b/components/strings/components_strings_ne.xtb
@@ -96,6 +96,7 @@ <translation id="129863573139666797"><ph name="BEGIN_LINK" />कुकीहरूलाई खाली गर्ने प्रयास गर्नुहोस्<ph name="END_LINK" /></translation> <translation id="1301324364792935241">DNS सेटिङ</translation> <translation id="1307966114820526988">चल्तीबाट हटाइएका सुविधाहरू</translation> +<translation id="1312803275555673949">यो कुरा सही छ भनी पुष्टि गर्ने के प्रमाण छ?</translation> <translation id="131405271941274527"><ph name="URL" /> तपाईंले NFC यन्त्रहरूमा ट्याप गर्दा जानकारी पठाउन तथा प्राप्त गर्न चाहन्छ</translation> <translation id="1314509827145471431">दायाँ बाइन्ड</translation> <translation id="1319245136674974084">यो एपका हकमा फेरि नसोधियोस्</translation> @@ -638,6 +639,7 @@ <translation id="3240791268468473923">क्रिडेन्सियल सिटसँग नमिल्ने सुरक्षित भुक्तानी क्रिडेन्सियल खोलियो</translation> <translation id="3249845759089040423">सानदार</translation> <translation id="3252266817569339921">फ्रेन्च</translation> +<translation id="3257954757204451555">यो जानकारी कसले उपलब्ध गराएको हो?</translation> <translation id="3259648571731540213"><ph name="CREATE_GOOGLE_CALENDAR_EVENT_FOCUSED_FRIENDLY_MATCH_TEXT" />, Google पात्रो प्रयोग गरी तुरुन्तै नयाँ कार्यक्रम बनाउन Tab थिच्नुहोस् अनि Enter थिच्नुहोस्</translation> <translation id="3266793032086590337">मान (बेमेल)</translation> <translation id="3268451620468152448">ट्याबहरू खोल्नुहोस्</translation> @@ -1036,6 +1038,7 @@ <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">आफ्ना विस्तारहरूलाई असक्षम गर्ने प्रयास गर्नुहोस्।</translation> <translation id="4559332380232738994">10x11</translation> +<translation id="4567686777917670400">तपाईंका एड्मिन टाढैबाट तपाईंको ब्राउजरको सेटअप बदल्न सक्छन्। यो डिभाइसमा गरिएका क्रियाकलाप Chromium बाहिरबाट पनि व्यवस्थापन गरिन सक्छ। <ph name="BEGIN_LINK" />थप जान्नुहोस्<ph name="END_LINK" /></translation> <translation id="457875822857220463">डेलिभरी</translation> <translation id="4579056131138995126">Personal (Envelope)</translation> <translation id="4582204425268416675">कार्ड हटाउनुहोस्</translation> @@ -1527,6 +1530,7 @@ <translation id="6337534724793800597">नामद्वारा नीतिहरू फिल्टर गर्छ</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> स्थापना गर्नुहोस्</translation> <translation id="6353505687280762741">{COUNT,plural, =0{कुनै पनि होइन}=1{<ph name="DOMAIN_LIST" /> को १ पासवर्ड (सिंक गरिएको छ)}=2{<ph name="DOMAIN_LIST" /> का २ पासवर्डहरू (सिंक गरिएका छन्)}other{<ph name="DOMAIN_LIST" /> का # पासवर्डहरू (सिंक गरिएका छन्)}}</translation> +<translation id="6355392890578844978">कुनै कम्पनी वा अन्य सङ्गठनले यो ब्राउजर व्यवस्थापन गर्दैन। यो डिभाइसमा गरिएका क्रियाकलाप Chromium बाहिरबाट व्यवस्थापन गरिन सक्छ। <ph name="BEGIN_LINK" />थप जान्नुहोस्<ph name="END_LINK" /></translation> <translation id="6358450015545214790">यसको अर्थ के हो?</translation> <translation id="6361757823711327522">B7</translation> <translation id="6364095313648930329"><ph name="BEGIN_LINK" />प्रोक्सी, फायरवाल र सुरक्षित DNS कन्फिगुरेसनको जाँच गर्दै<ph name="END_LINK" /></translation> @@ -1978,6 +1982,7 @@ <translation id="7961015016161918242">कहिल्यै पनि होइन</translation> <translation id="7966803981046576691">कार्य खाताको प्रकार</translation> <translation id="79682505114836835">मान "<ph name="VALUE" />" वैध हेक्स कलर होइन।</translation> +<translation id="7970392640816874403">अन्य स्रोतहरूमा के भनिएको छ?</translation> <translation id="7976214039405368314">अत्यन्त धेरै पटक अनुरोध गरियो</translation> <translation id="7977538094055660992">आउटपुट यन्त्र</translation> <translation id="7977894662897852582">Edp</translation>
diff --git a/components/strings/components_strings_pa.xtb b/components/strings/components_strings_pa.xtb index 73af729..8058e386 100644 --- a/components/strings/components_strings_pa.xtb +++ b/components/strings/components_strings_pa.xtb
@@ -96,6 +96,7 @@ <translation id="129863573139666797"><ph name="BEGIN_LINK" />ਆਪਣੀਆਂ ਕੁਕੀਜ਼ ਨੂੰ ਸਾਫ਼ ਕਰਨ ਨੂੰ ਅਜ਼ਮਾਓ<ph name="END_LINK" /></translation> <translation id="1301324364792935241">ਆਪਣੀਆਂ ਸੁਰੱਖਿਅਤ DNS ਸੈਟਿੰਗਾਂ ਦੀ ਜਾਂਚ ਕਰੋ</translation> <translation id="1307966114820526988">ਨਾਪਸੰਦ ਕੀਤੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ</translation> +<translation id="1312803275555673949">ਕਿਹੜਾ ਸਬੂਤ ਇਸ ਦਾ ਸਮਰਥਨ ਕਰਦਾ ਹੈ?</translation> <translation id="131405271941274527">ਜਦੋਂ ਤੁਸੀਂ ਆਪਣੇ ਫ਼ੋਨ ਨੂੰ ਕਿਸੇ NFC ਡੀਵਾਈਸ 'ਤੇ ਟੈਪ ਕਰਦੇ ਹੋ ਤਾਂ <ph name="URL" /> ਜਾਣਕਾਰੀ ਭੇਜਣਾ ਅਤੇ ਪ੍ਰਾਪਤ ਕਰਨਾ ਚਾਹੁੰਦਾ ਹੈ</translation> <translation id="1314509827145471431">ਸੱਜੇ ਜਿਲਦਬੰਦ</translation> <translation id="1319245136674974084">ਇਸ ਐਪ ਲਈ ਦੁਬਾਰਾ ਨਾ ਪੁੱਛੋ</translation> @@ -635,6 +636,7 @@ <translation id="3240791268468473923">ਭਗਤਾਨ ਕ੍ਰੀਡੈਂਸ਼ੀਅਲ ਨੂੰ ਸੁਰੱਖਿਅਤ ਬਣਾਓ ਕੋਈ ਮੇਲ ਖਾਂਦੇ ਕ੍ਰੀਡੈਂਸ਼ੀਅਲ ਸੰਬੰਧੀ ਸ਼ੀਟ ਖੁੱਲ੍ਹੀ ਨਹੀਂ ਹੈ</translation> <translation id="3249845759089040423">ਗਰੂਵੀ</translation> <translation id="3252266817569339921">ਫਰੈਂਚ</translation> +<translation id="3257954757204451555">ਇਸ ਜਾਣਕਾਰੀ ਪਿੱਛੇ ਕੌਣ ਹੈ?</translation> <translation id="3259648571731540213"><ph name="CREATE_GOOGLE_CALENDAR_EVENT_FOCUSED_FRIENDLY_MATCH_TEXT" />, Google Calendar ਵਿੱਚ ਤੇਜ਼ੀ ਨਾਲ ਨਵਾਂ ਇਵੈਂਟ ਬਣਾਉਣ ਲਈ Tab ਦਬਾ ਕੇ ਫਿਰ Enter ਦਬਾਓ</translation> <translation id="3266793032086590337">ਮੁੱਲ (ਵਿਵਾਦ)</translation> <translation id="3268451620468152448">ਟੈਬਸ ਖੋਲ੍ਹੋ</translation> @@ -1028,6 +1030,7 @@ <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">ਆਪਣੀਆਂ ਐਕਸਟੈਂਸ਼ਨਾਂ ਨੂੰ ਅਯੋਗ ਬਣਾਉਣਾ ਅਜ਼ਮਾਓ।</translation> <translation id="4559332380232738994">10x11</translation> +<translation id="4567686777917670400">ਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਦੂਰ-ਦੁਰਾਡੇ ਤੋਂ ਤੁਹਾਡੇ ਬ੍ਰਾਊਜ਼ਰ ਸੈੱਟਅੱਪ ਨੂੰ ਬਦਲ ਸਕਦਾ ਹੈ। ਇਸ ਡੀਵਾਈਸ ਦੀ ਸਰਗਰਮੀ ਦਾ ਪ੍ਰਬੰਧਨ Chromium ਤੋਂ ਬਾਹਰ ਵੀ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ। <ph name="BEGIN_LINK" />ਹੋਰ ਜਾਣੋ<ph name="END_LINK" /></translation> <translation id="457875822857220463">ਡਿਲੀਵਰੀ</translation> <translation id="4579056131138995126">ਨਿੱਜੀ (ਲਿਫ਼ਾਫ਼ਾ)</translation> <translation id="4582204425268416675">ਕਾਰਡ ਹਟਾਓ</translation> @@ -1518,6 +1521,7 @@ <translation id="6337534724793800597">ਨਾਮ ਮੁਤਾਬਕ ਨੀਤੀਆਂ ਫਿਲਟਰ ਕਰੋ</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> ਸਥਾਪਤ ਕਰੋ</translation> <translation id="6353505687280762741">{COUNT,plural, =0{ਕੋਈ ਨਹੀਂ}=1{1 ਪਾਸਵਰਡ (<ph name="DOMAIN_LIST" /> ਲਈ, ਸਮਕਾਲੀਕਿਰਤ ਕੀਤਾ ਗਿਆ)}=2{2 ਪਾਸਵਰਡ (<ph name="DOMAIN_LIST" /> ਲਈ, ਸਮਕਾਲੀਕਿਰਤ ਕੀਤੇ ਗਏ)}other{# ਪਾਸਵਰਡ (<ph name="DOMAIN_LIST" /> ਲਈ, ਸਮਕਾਲੀਕਿਰਤ ਕੀਤੇ ਗਏ)}}</translation> +<translation id="6355392890578844978">ਇਹ ਬ੍ਰਾਊਜ਼ਰ ਦਾ ਪ੍ਰਬੰਧਨ ਕਿਸੇ ਕੰਪਨੀ ਜਾਂ ਹੋਰ ਸੰਸਥਾ ਵੱਲੋਂ ਨਹੀਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਇਸ ਡੀਵਾਈਸ ਦੀ ਸਰਗਰਮੀ ਦਾ ਪ੍ਰਬੰਧਨ Chromium ਤੋਂ ਬਾਹਰ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ। <ph name="BEGIN_LINK" />ਹੋਰ ਜਾਣੋ<ph name="END_LINK" /></translation> <translation id="6358450015545214790">ਇਹਨਾਂ ਦਾ ਕੀ ਮਤਲਬ ਹੈ?</translation> <translation id="6361757823711327522">B7</translation> <translation id="6364095313648930329"><ph name="BEGIN_LINK" />ਪ੍ਰੌਕਸੀ, ਫ਼ਾਇਰਵਾਲ, ਅਤੇ ਸੁਰੱਖਿਅਤ DNS ਦੇ ਸੰਰੂਪਣ ਦੀ ਜਾਂਚ ਕਰਨਾ<ph name="END_LINK" /></translation> @@ -1969,6 +1973,7 @@ <translation id="7961015016161918242">ਕਦੇ ਨਹੀਂ</translation> <translation id="7966803981046576691">ਕਾਰਵਾਈ ਖਾਤੇ ਦੀ ਕਿਸਮ</translation> <translation id="79682505114836835">ਮੁੱਲ "<ph name="VALUE" />" ਇੱਕ ਅਵੈਧ ਹੈਕਸ ਰੰਗ ਹੈ।</translation> +<translation id="7970392640816874403">ਦੂਜੇ ਸਰੋਤ ਕੀ ਕਹਿੰਦੇ ਹਨ?</translation> <translation id="7976214039405368314">ਬਹੁਤ ਸਾਰੀਆਂ ਬੇਨਤੀਆਂ</translation> <translation id="7977538094055660992">ਆਊਟਪੁੱਟ ਡੀਵਾਈਸ</translation> <translation id="7977894662897852582">Edp</translation>
diff --git a/components/strings/components_strings_ur.xtb b/components/strings/components_strings_ur.xtb index e3b881f..42b4f96 100644 --- a/components/strings/components_strings_ur.xtb +++ b/components/strings/components_strings_ur.xtb
@@ -96,6 +96,7 @@ <translation id="129863573139666797"><ph name="BEGIN_LINK" />اپنی کوکیز صاف کرنے کی کوشش کریں<ph name="END_LINK" /></translation> <translation id="1301324364792935241">اپنی محفوظ DNS ترتیبات چیک کریں</translation> <translation id="1307966114820526988">فرسودہ خصوصیات</translation> +<translation id="1312803275555673949">کون سا ثبوت اس کو سپورٹ کرتا ہے؟</translation> <translation id="131405271941274527">آپ کے NFC آلہ پر تھپتھپاتے وقت <ph name="URL" /> معلومات بھیجنا اور وصول کرنا چاہتا ہے</translation> <translation id="1314509827145471431">دائیں طرف باندھیں</translation> <translation id="1319245136674974084">اس ایپ کیلئے دوبارہ نہ پوچھیں</translation> @@ -642,6 +643,7 @@ <translation id="3240791268468473923">ادائیگی کی اسناد محفوظ کریں کوئی مماثل اسناد نہیں کی شیٹ کھلی ہوئی ہے</translation> <translation id="3249845759089040423">دلکش</translation> <translation id="3252266817569339921">فرانسيسی</translation> +<translation id="3257954757204451555">اس معلومات کے پیچھے کون ہے؟</translation> <translation id="3259648571731540213"><ph name="CREATE_GOOGLE_CALENDAR_EVENT_FOCUSED_FRIENDLY_MATCH_TEXT" />، Google کیلنڈر میں تیزی سے ایک نیا ایونٹ تخلیق کرنے کیلئے Tab، پھر Enter دبائیں</translation> <translation id="3266793032086590337">قدر (متضاد)</translation> <translation id="3268451620468152448">کھلے ٹیبز</translation> @@ -1041,6 +1043,7 @@ <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">اپنے ایکسٹینشنز کو غیر فعال کرنے کی کوشش کریں۔</translation> <translation id="4559332380232738994">10x11</translation> +<translation id="4567686777917670400">آپ کا منتظم دور سے آپ کے براؤزر کا سیٹ اپ تبدیل کر سکتا ہے۔ اس آلے پر ہونے والی سرگرمی کا نظم Chromium سے باہر بھی کیا جا سکتا ہے۔ <ph name="BEGIN_LINK" />مزید جانیں<ph name="END_LINK" /></translation> <translation id="457875822857220463">ڈیلیوری</translation> <translation id="4579056131138995126">Personal (Envelope)</translation> <translation id="4582204425268416675">کارڈ ہٹائیں</translation> @@ -1533,6 +1536,7 @@ <translation id="6337534724793800597">نام کے لحاظ سے پالیسیاں فلٹر کریں</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> انسٹال کریں</translation> <translation id="6353505687280762741">{COUNT,plural, =0{کوئی نہیں}=1{1 پاس ورڈ (برائے <ph name="DOMAIN_LIST" />، مطابقت پذیر ہے)}=2{2 پاس ورڈز (برائے <ph name="DOMAIN_LIST" />، مطابقت پذیر ہیں)}other{# پاس ورڈز (برائے <ph name="DOMAIN_LIST" />، مطابقت پذیر ہیں)}}</translation> +<translation id="6355392890578844978">یہ براؤزر کسی کمپنی یا دوسری تنظیم کے زیر انتظام نہیں ہے۔ اس آلے پر ہونے والی سرگرمی کا نظم Chromium سے باہر کیا جا سکتا ہے۔ <ph name="BEGIN_LINK" />مزید جانیں<ph name="END_LINK" /></translation> <translation id="6358450015545214790">ان کا کیا مطلب ہے؟</translation> <translation id="6361757823711327522">B7</translation> <translation id="6364095313648930329"><ph name="BEGIN_LINK" />پراکسی، فائروال اور محفوظ DNS کنفیگریشن کو چیک کرنے کی کوشش کریں<ph name="END_LINK" /></translation> @@ -1984,6 +1988,7 @@ <translation id="7961015016161918242">کبھی نہیں</translation> <translation id="7966803981046576691">جاب اکاؤنٹ کی قسم</translation> <translation id="79682505114836835">قدر "<ph name="VALUE" />" ایک غلط ہیکس رنگ ہے۔</translation> +<translation id="7970392640816874403">دوسرے ذرائع کیا کہتے ہیں؟</translation> <translation id="7976214039405368314">بہت زیادہ درخواستیں</translation> <translation id="7977538094055660992">آؤٹ پٹ آلہ</translation> <translation id="7977894662897852582">Edp</translation>
diff --git a/components/strings/components_strings_zh-HK.xtb b/components/strings/components_strings_zh-HK.xtb index 0a9ca8b..46da60f 100644 --- a/components/strings/components_strings_zh-HK.xtb +++ b/components/strings/components_strings_zh-HK.xtb
@@ -96,7 +96,7 @@ <translation id="129863573139666797"><ph name="BEGIN_LINK" />嘗試清除 Cookie<ph name="END_LINK" /></translation> <translation id="1301324364792935241">請檢查您的安全 DNS 設定</translation> <translation id="1307966114820526988">這些功能已被淘汰</translation> -<translation id="1312803275555673949">有何證據可證明資訊屬實?</translation> +<translation id="1312803275555673949">有什麼證據證明資訊屬實?</translation> <translation id="131405271941274527"><ph name="URL" /> 想在您以手機觸踫 NFC 裝置時傳送和接收資料</translation> <translation id="1314509827145471431">釘裝 (右側)</translation> <translation id="1319245136674974084">使用這個應用程式時不要再問我</translation> @@ -638,7 +638,7 @@ <translation id="3240791268468473923">開咗冇相符安全付款憑證工作表</translation> <translation id="3249845759089040423">型格</translation> <translation id="3252266817569339921">法文</translation> -<translation id="3257954757204451555">這項資訊是由誰提供?</translation> +<translation id="3257954757204451555">這項資料是由誰提供?</translation> <translation id="3259648571731540213"><ph name="CREATE_GOOGLE_CALENDAR_EVENT_FOCUSED_FRIENDLY_MATCH_TEXT" />,㩒一下 Tab 鍵,然後㩒一下 Enter 鍵就可以喺 Google 日曆度快速建立新活動</translation> <translation id="3266793032086590337">值 (衝突)</translation> <translation id="3268451620468152448">開啟的分頁</translation> @@ -1032,7 +1032,7 @@ <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">嘗試停用擴充程式。</translation> <translation id="4559332380232738994">10x11</translation> -<translation id="4567686777917670400">你的系統管理員可從遠端變更瀏覽器設定。這部裝置上的活動也可透過 Chromium 以外的服務管理。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation> +<translation id="4567686777917670400">您的管理員可遠端變更瀏覽器設定。此裝置上的活動也可透過 Chromium 以外的服務管理。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation> <translation id="457875822857220463">送貨</translation> <translation id="4579056131138995126">Personal (信封)</translation> <translation id="4582204425268416675">移除卡</translation> @@ -1524,7 +1524,7 @@ <translation id="6337534724793800597">依名稱篩選政策</translation> <translation id="6349101878882523185">安裝 <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{無}=1{有 1 個密碼 (<ph name="DOMAIN_LIST" />,已同步)}=2{有 2 個密碼 (<ph name="DOMAIN_LIST" />,已同步)}other{有 # 個密碼 (<ph name="DOMAIN_LIST" />,已同步)}}</translation> -<translation id="6355392890578844978">這個瀏覽器未受到任何公司或其他機構管理。這部裝置上的活動可透過 Chromium 以外的服務管理。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation> +<translation id="6355392890578844978">此瀏覽器未受任何公司或其他機構管理。此裝置上的活動可透過 Chromium 以外的服務管理。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation> <translation id="6358450015545214790">我需要進一步資料</translation> <translation id="6361757823711327522">B7</translation> <translation id="6364095313648930329"><ph name="BEGIN_LINK" />檢查 Proxy、防火牆和安全 DNS 設定<ph name="END_LINK" /></translation> @@ -1976,7 +1976,7 @@ <translation id="7961015016161918242">從來沒有</translation> <translation id="7966803981046576691">工作帳戶類型</translation> <translation id="79682505114836835">「<ph name="VALUE" />」是無效的十六進制顏色值。</translation> -<translation id="7970392640816874403">其他來源提供了哪些資訊?</translation> +<translation id="7970392640816874403">其他資料來源提供了哪些資訊?</translation> <translation id="7976214039405368314">要求數量過多</translation> <translation id="7977538094055660992">輸出裝置</translation> <translation id="7977894662897852582">Edp</translation>
diff --git a/components/subresource_filter/content/browser/BUILD.gn b/components/subresource_filter/content/browser/BUILD.gn index af63751..a09891a 100644 --- a/components/subresource_filter/content/browser/BUILD.gn +++ b/components/subresource_filter/content/browser/BUILD.gn
@@ -82,11 +82,15 @@ "ads_blocked_infobar.h", "ads_blocked_infobar_delegate.cc", "ads_blocked_infobar_delegate.h", + "ads_blocked_message_delegate.cc", + "ads_blocked_message_delegate.h", ] deps += [ "//components/infobars/android", "//components/infobars/content", "//components/infobars/core", + "//components/messages/android", + "//components/messages/android:feature_flags", "//components/resources:android_resources", "//components/strings:components_strings_grit", "//components/subresource_filter/android:subresource_filter_jni_headers",
diff --git a/components/subresource_filter/content/browser/DEPS b/components/subresource_filter/content/browser/DEPS index 8ce38db..28c1662 100644 --- a/components/subresource_filter/content/browser/DEPS +++ b/components/subresource_filter/content/browser/DEPS
@@ -3,6 +3,7 @@ "+components/content_settings/core/browser", "+components/content_settings/core/common", "+components/infobars", + "+components/messages", "+components/resources", "+components/strings", "+components/keyed_service/core",
diff --git a/components/subresource_filter/content/browser/ads_blocked_message_delegate.cc b/components/subresource_filter/content/browser/ads_blocked_message_delegate.cc new file mode 100644 index 0000000..49bbcf0e --- /dev/null +++ b/components/subresource_filter/content/browser/ads_blocked_message_delegate.cc
@@ -0,0 +1,75 @@ +// 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 "components/subresource_filter/content/browser/ads_blocked_message_delegate.h" + +#include "base/memory/ptr_util.h" +#include "base/strings/utf_string_conversions.h" +#include "components/messages/android/message_dispatcher_bridge.h" +#include "components/resources/android/theme_resources.h" +#include "components/strings/grit/components_strings.h" +#include "components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h" +#include "components/subresource_filter/core/browser/subresource_filter_constants.h" +#include "content/public/browser/web_contents.h" +#include "ui/base/l10n/l10n_util.h" + +namespace subresource_filter { + +void AdsBlockedMessageDelegate::ShowMessage() { + if (message_) { + // There is already an active "ads blocked" message. + return; + } + + // Unretained is safe because |this| will always outlive |message_| which owns + // the callback. + auto message = std::make_unique<messages::MessageWrapper>( + messages::MessageIdentifier::ADS_BLOCKED, + base::BindOnce(&AdsBlockedMessageDelegate::HandleClick, + base::Unretained(this)), + base::BindOnce(&AdsBlockedMessageDelegate::HandleDismissCallback, + base::Unretained(this))); + + message->SetTitle( + l10n_util::GetStringUTF16(IDS_BLOCKED_ADS_MESSAGE_PRIMARY_TEXT)); + message->SetPrimaryButtonText(l10n_util::GetStringUTF16(IDS_OK)); + + // TODO: Set primary and secondary resource icons. + // message->SetIconResourceId(); + // message->SetSecondaryIconResourceId(); + + // TODO(crbug.com/1223078): On rare occasions, such as the moment when + // activity is being recreated or destroyed, ads blocked message will not be + // displayed. + messages::MessageDispatcherBridge::Get()->EnqueueMessage( + message.get(), web_contents_, messages::MessageScopeType::WEB_CONTENTS, + messages::MessagePriority::kNormal); + + message_ = std::move(message); +} + +AdsBlockedMessageDelegate::~AdsBlockedMessageDelegate() { + if (message_) { + // Do not use message_ after this. + messages::MessageDispatcherBridge::Get()->DismissMessage( + message_.get(), web_contents_, messages::DismissReason::UNKNOWN); + } +} + +AdsBlockedMessageDelegate::AdsBlockedMessageDelegate( + content::WebContents* web_contents) + : web_contents_(web_contents) {} + +void AdsBlockedMessageDelegate::HandleDismissCallback( + messages::DismissReason dismiss_reason) { + message_.reset(); +} + +void AdsBlockedMessageDelegate::HandleClick() { + // TODO: Add implementation. +} + +WEB_CONTENTS_USER_DATA_KEY_IMPL(AdsBlockedMessageDelegate) + +} // namespace subresource_filter
diff --git a/components/subresource_filter/content/browser/ads_blocked_message_delegate.h b/components/subresource_filter/content/browser/ads_blocked_message_delegate.h new file mode 100644 index 0000000..25c885c --- /dev/null +++ b/components/subresource_filter/content/browser/ads_blocked_message_delegate.h
@@ -0,0 +1,53 @@ +// 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 COMPONENTS_SUBRESOURCE_FILTER_CONTENT_BROWSER_ADS_BLOCKED_MESSAGE_DELEGATE_H_ +#define COMPONENTS_SUBRESOURCE_FILTER_CONTENT_BROWSER_ADS_BLOCKED_MESSAGE_DELEGATE_H_ + +#include <memory> + +#include "base/macros.h" +#include "components/infobars/android/infobar_android.h" +#include "components/infobars/core/confirm_infobar_delegate.h" +#include "components/messages/android/message_enums.h" +#include "components/messages/android/message_wrapper.h" +#include "content/public/browser/web_contents_user_data.h" + +namespace content { +class WebContents; +} // namespace content + +namespace subresource_filter { + +// An ads blocked delegate responsible for showing message bubbles. +// Created when the user proceeds through Safe Browsing warning +// interstitials to a site with deceptive embedded content, and matches the +// lifetime of WebContents afterwards. +// +// The message also appears when the site is known to show intrusive ads. +class AdsBlockedMessageDelegate + : public content::WebContentsUserData<AdsBlockedMessageDelegate> { + public: + void ShowMessage(); + + ~AdsBlockedMessageDelegate() override; + + messages::MessageWrapper* message_for_testing() { return message_.get(); } + + private: + friend class content::WebContentsUserData<AdsBlockedMessageDelegate>; + + explicit AdsBlockedMessageDelegate(content::WebContents* web_contents); + void HandleClick(); + void HandleDismissCallback(messages::DismissReason dismiss_reason); + + content::WebContents* web_contents_ = nullptr; + std::unique_ptr<messages::MessageWrapper> message_; + + WEB_CONTENTS_USER_DATA_KEY_DECL(); +}; + +} // namespace subresource_filter + +#endif // COMPONENTS_SUBRESOURCE_FILTER_CONTENT_BROWSER_ADS_BLOCKED_INFOBAR_DELEGATE_H_
diff --git a/components/subresource_filter/content/browser/profile_interaction_manager.cc b/components/subresource_filter/content/browser/profile_interaction_manager.cc index 8912cd3..68545196 100644 --- a/components/subresource_filter/content/browser/profile_interaction_manager.cc +++ b/components/subresource_filter/content/browser/profile_interaction_manager.cc
@@ -19,7 +19,9 @@ #if defined(OS_ANDROID) #include "components/infobars/content/content_infobar_manager.h" // nogncheck +#include "components/messages/android/messages_feature.h" #include "components/subresource_filter/content/browser/ads_blocked_infobar_delegate.h" +#include "components/subresource_filter/content/browser/ads_blocked_message_delegate.h" #endif namespace subresource_filter { @@ -136,12 +138,20 @@ if (profile_context_->settings_manager()->ShouldShowUIForSite( top_level_url)) { #if defined(OS_ANDROID) - // NOTE: It is acceptable for the embedder to not have installed an infobar - // manager. - if (auto* infobar_manager = - infobars::ContentInfoBarManager::FromWebContents( - GetWebContents())) { - subresource_filter::AdsBlockedInfobarDelegate::Create(infobar_manager); + if (messages::IsAdsBlockedMessagesUiEnabled()) { + subresource_filter::AdsBlockedMessageDelegate::CreateForWebContents( + GetWebContents()); + subresource_filter::AdsBlockedMessageDelegate::FromWebContents( + GetWebContents()) + ->ShowMessage(); + } else { + // NOTE: It is acceptable for the embedder to not have installed an + // infobar manager. + if (auto* infobar_manager = + infobars::ContentInfoBarManager::FromWebContents( + GetWebContents())) { + subresource_filter::AdsBlockedInfobarDelegate::Create(infobar_manager); + } } #endif
diff --git a/components/subresource_filter_strings.grdp b/components/subresource_filter_strings.grdp index 86d6ab3..38020a8a 100644 --- a/components/subresource_filter_strings.grdp +++ b/components/subresource_filter_strings.grdp
@@ -14,5 +14,8 @@ <message name="IDS_BLOCKED_ADS_INFOBAR_MESSAGE" desc="The mini infobar message shown to users on Android when Chrome has blocked ads on the site because the site tends to show intrusive ads. Will be presented as a sentence, next to a Details link to expand the infobar."> Ads blocked. </message> + <message name="IDS_BLOCKED_ADS_MESSAGE_PRIMARY_TEXT" desc="The primary message text shown to users on Android when Chrome has blocked ads on the site because the site tends to show intrusive ads. Will be presented next to a clickable gear icon to take necessary action on a subsequent dialog."> + Ads blocked + </message> </if> </grit-part>
diff --git a/components/subresource_filter_strings_grdp/IDS_BLOCKED_ADS_MESSAGE_PRIMARY_TEXT.png.sha1 b/components/subresource_filter_strings_grdp/IDS_BLOCKED_ADS_MESSAGE_PRIMARY_TEXT.png.sha1 new file mode 100644 index 0000000..a4aa065b --- /dev/null +++ b/components/subresource_filter_strings_grdp/IDS_BLOCKED_ADS_MESSAGE_PRIMARY_TEXT.png.sha1
@@ -0,0 +1 @@ +7fbe0b42ca00ff76f3b7ea904fc5df5c4dd760c5 \ No newline at end of file
diff --git a/content/browser/accessibility/browser_accessibility_android.cc b/content/browser/accessibility/browser_accessibility_android.cc index a5499b8..3c249e84 100644 --- a/content/browser/accessibility/browser_accessibility_android.cc +++ b/content/browser/accessibility/browser_accessibility_android.cc
@@ -611,10 +611,10 @@ if (GetRole() == ax::mojom::Role::kSplitter) return text; - // Append image description strings to the text, if not running as WebView. + // Append image description strings to the text. auto* manager = static_cast<BrowserAccessibilityManagerAndroid*>(this->manager()); - if (!manager->IsRunningAsWebView()) { + if (manager->AllowImageDescriptions()) { auto status = GetData().GetImageAnnotationStatus(); switch (status) { case ax::mojom::ImageAnnotationStatus::kEligibleForAnnotation: @@ -1022,10 +1022,9 @@ } // If this node is an image, check status and potentially add unlabeled role. - // If running inside a WebView, do not change default image role description. auto* manager = static_cast<BrowserAccessibilityManagerAndroid*>(this->manager()); - if (!manager->IsRunningAsWebView()) { + if (manager->AllowImageDescriptions()) { auto status = GetData().GetImageAnnotationStatus(); switch (status) { case ax::mojom::ImageAnnotationStatus::kEligibleForAnnotation:
diff --git a/content/browser/accessibility/browser_accessibility_android_unittest.cc b/content/browser/accessibility/browser_accessibility_android_unittest.cc index 377681a..93f84314 100644 --- a/content/browser/accessibility/browser_accessibility_android_unittest.cc +++ b/content/browser/accessibility/browser_accessibility_android_unittest.cc
@@ -9,6 +9,7 @@ #include "base/test/task_environment.h" #include "build/build_config.h" #include "content/browser/accessibility/browser_accessibility_manager.h" +#include "content/browser/accessibility/browser_accessibility_manager_android.h" #include "content/browser/accessibility/test_browser_accessibility_delegate.h" #include "content/test/test_content_client.h" #include "testing/gtest/include/gtest/gtest.h" @@ -346,6 +347,10 @@ BrowserAccessibilityManager::Create( tree, test_browser_accessibility_delegate_.get())); + BrowserAccessibilityManagerAndroid* android_manager = + manager->ToBrowserAccessibilityManagerAndroid(); + android_manager->set_allow_image_descriptions(true); + for (int child_index = 0; child_index < static_cast<int>(tree.nodes[0].child_ids.size()); ++child_index) { @@ -394,6 +399,10 @@ BrowserAccessibilityManager::Create( tree, test_browser_accessibility_delegate_.get())); + BrowserAccessibilityManagerAndroid* android_manager = + manager->ToBrowserAccessibilityManagerAndroid(); + android_manager->set_allow_image_descriptions(true); + for (int child_index = 0; child_index < static_cast<int>(tree.nodes[0].child_ids.size()); ++child_index) { @@ -433,6 +442,10 @@ BrowserAccessibilityManager::Create( tree, test_browser_accessibility_delegate_.get())); + BrowserAccessibilityManagerAndroid* android_manager = + manager->ToBrowserAccessibilityManagerAndroid(); + android_manager->set_allow_image_descriptions(true); + BrowserAccessibilityAndroid* image_ltr = static_cast<BrowserAccessibilityAndroid*>( manager->GetRoot()->PlatformGetChild(0)); @@ -484,6 +497,10 @@ BrowserAccessibilityManager::Create( tree, test_browser_accessibility_delegate_.get())); + BrowserAccessibilityManagerAndroid* android_manager = + manager->ToBrowserAccessibilityManagerAndroid(); + android_manager->set_allow_image_descriptions(true); + BrowserAccessibilityAndroid* image_pending = static_cast<BrowserAccessibilityAndroid*>( manager->GetRoot()->PlatformGetChild(0)); @@ -539,6 +556,10 @@ BrowserAccessibilityManager::Create( tree, test_browser_accessibility_delegate_.get())); + BrowserAccessibilityManagerAndroid* android_manager = + manager->ToBrowserAccessibilityManagerAndroid(); + android_manager->set_allow_image_descriptions(true); + BrowserAccessibilityAndroid* image_none = static_cast<BrowserAccessibilityAndroid*>( manager->GetRoot()->PlatformGetChild(0)); @@ -588,6 +609,10 @@ BrowserAccessibilityManager::Create( tree, test_browser_accessibility_delegate_.get())); + BrowserAccessibilityManagerAndroid* android_manager = + manager->ToBrowserAccessibilityManagerAndroid(); + android_manager->set_allow_image_descriptions(true); + BrowserAccessibilityAndroid* image_succeeded = static_cast<BrowserAccessibilityAndroid*>( manager->GetRoot()->PlatformGetChild(0));
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.cc b/content/browser/accessibility/browser_accessibility_manager_android.cc index fda19f3..3933cf02 100644 --- a/content/browser/accessibility/browser_accessibility_manager_android.cc +++ b/content/browser/accessibility/browser_accessibility_manager_android.cc
@@ -40,6 +40,11 @@ BrowserAccessibilityManagerAndroid::GetEmptyDocument(), delegate); } +BrowserAccessibilityManagerAndroid* +BrowserAccessibilityManager::ToBrowserAccessibilityManagerAndroid() { + return static_cast<BrowserAccessibilityManagerAndroid*>(this); +} + BrowserAccessibilityManagerAndroid::BrowserAccessibilityManagerAndroid( const ui::AXTreeUpdate& initial_tree, base::WeakPtr<WebContentsAccessibilityAndroid> web_contents_accessibility,
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.h b/content/browser/accessibility/browser_accessibility_manager_android.h index 9535412f..e0debea2 100644 --- a/content/browser/accessibility/browser_accessibility_manager_android.h +++ b/content/browser/accessibility/browser_accessibility_manager_android.h
@@ -50,11 +50,11 @@ static ui::AXTreeUpdate GetEmptyDocument(); - // Helper methods to set/check if this is running as part of a WebView. - void set_is_running_as_webview(bool is_webview) { - is_running_as_webview_ = is_webview; + // Helper methods to set/check if image descriptions are allowed. + void set_allow_image_descriptions(bool allow_image_descriptions) { + allow_image_descriptions_ = allow_image_descriptions; } - bool IsRunningAsWebView() { return is_running_as_webview_; } + bool AllowImageDescriptions() { return allow_image_descriptions_; } // By default, the tree is pruned for a better screen reading experience, // including: @@ -155,8 +155,8 @@ // See docs for set_prune_tree_for_screen_reader, above. bool prune_tree_for_screen_reader_; - // Whether this manager is running as part of a WebView. - bool is_running_as_webview_ = false; + // Whether this manager allows image descriptions. + bool allow_image_descriptions_ = false; // Only set on the root BrowserAccessibilityManager. Keeps track of if // any node uses touch passthrough in any frame. See comment next to
diff --git a/content/browser/accessibility/web_contents_accessibility_android.cc b/content/browser/accessibility/web_contents_accessibility_android.cc index 3c2ff0c2..b159b6e 100644 --- a/content/browser/accessibility/web_contents_accessibility_android.cc +++ b/content/browser/accessibility/web_contents_accessibility_android.cc
@@ -299,13 +299,13 @@ web_contents_->AddAccessibilityMode(ui::kAXModeComplete); } -void WebContentsAccessibilityAndroid::SetIsRunningAsWebView( +void WebContentsAccessibilityAndroid::SetAllowImageDescriptions( JNIEnv* env, const base::android::JavaParamRef<jobject>& obj, - jboolean is_webview) { + jboolean allow_image_descriptions) { auto* manager = GetRootBrowserAccessibilityManager(); if (manager) { - manager->set_is_running_as_webview(is_webview); + manager->set_allow_image_descriptions(allow_image_descriptions); } }
diff --git a/content/browser/accessibility/web_contents_accessibility_android.h b/content/browser/accessibility/web_contents_accessibility_android.h index f39d2aa6..a7356b1 100644 --- a/content/browser/accessibility/web_contents_accessibility_android.h +++ b/content/browser/accessibility/web_contents_accessibility_android.h
@@ -82,9 +82,10 @@ JNIEnv* env, const base::android::JavaParamRef<jobject>& obj); - void SetIsRunningAsWebView(JNIEnv* env, - const base::android::JavaParamRef<jobject>& obj, - jboolean is_webview); + void SetAllowImageDescriptions( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj, + jboolean allow_image_descriptions); // Tree methods. jint GetRootId(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
diff --git a/content/browser/android/java_interfaces_impl.cc b/content/browser/android/java_interfaces_impl.cc index 3485507..a2d9b004 100644 --- a/content/browser/android/java_interfaces_impl.cc +++ b/content/browser/android/java_interfaces_impl.cc
@@ -21,20 +21,31 @@ namespace { +template <BrowserThread::ID thread> class JavaInterfaceProviderHolder { public: JavaInterfaceProviderHolder() { mojo::PendingRemote<service_manager::mojom::InterfaceProvider> provider; JNIEnv* env = base::android::AttachCurrentThread(); - Java_InterfaceRegistrarImpl_createInterfaceRegistry( - env, - provider.InitWithNewPipeAndPassReceiver().PassPipe().release().value()); + if (thread == BrowserThread::IO) { + Java_InterfaceRegistrarImpl_createInterfaceRegistryOnIOThread( + env, provider.InitWithNewPipeAndPassReceiver() + .PassPipe() + .release() + .value()); + } else { + Java_InterfaceRegistrarImpl_createInterfaceRegistry( + env, provider.InitWithNewPipeAndPassReceiver() + .PassPipe() + .release() + .value()); + } interface_provider_.Bind(std::move(provider)); } static JavaInterfaceProviderHolder* GetInstance() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - return base::Singleton<JavaInterfaceProviderHolder>::get(); + DCHECK_CURRENTLY_ON(thread); + return base::Singleton<JavaInterfaceProviderHolder<thread>>::get(); } service_manager::InterfaceProvider* GetJavaInterfaces() { @@ -49,7 +60,13 @@ } // namespace service_manager::InterfaceProvider* GetGlobalJavaInterfaces() { - return JavaInterfaceProviderHolder::GetInstance()->GetJavaInterfaces(); + return JavaInterfaceProviderHolder<BrowserThread::UI>::GetInstance() + ->GetJavaInterfaces(); +} + +service_manager::InterfaceProvider* GetGlobalJavaInterfacesOnIOThread() { + return JavaInterfaceProviderHolder<BrowserThread::IO>::GetInstance() + ->GetJavaInterfaces(); } void BindInterfaceRegistryForWebContents(
diff --git a/content/browser/android/java_interfaces_impl.h b/content/browser/android/java_interfaces_impl.h index b491c077..affaab4 100644 --- a/content/browser/android/java_interfaces_impl.h +++ b/content/browser/android/java_interfaces_impl.h
@@ -13,6 +13,10 @@ class RenderFrameHostImpl; class WebContents; +// Returns an InterfaceProvider for global Java-implemented interfaces on the IO +// thread. +service_manager::InterfaceProvider* GetGlobalJavaInterfacesOnIOThread(); + void BindInterfaceRegistryForWebContents( mojo::PendingReceiver<service_manager::mojom::InterfaceProvider> receiver, WebContents* web_contents);
diff --git a/content/browser/devtools/network_service_devtools_observer.cc b/content/browser/devtools/network_service_devtools_observer.cc index 6826f4a..668bfcaf 100644 --- a/content/browser/devtools/network_service_devtools_observer.cc +++ b/content/browser/devtools/network_service_devtools_observer.cc
@@ -52,6 +52,7 @@ const std::string& devtools_request_id, const net::CookieAccessResultList& request_cookie_list, std::vector<network::mojom::HttpRawHeaderPairPtr> request_headers, + base::TimeTicks timestamp, network::mojom::ClientSecurityStatePtr security_state) { auto* host = GetDevToolsAgentHost(); if (!host) @@ -59,7 +60,7 @@ DispatchToAgents(host, &protocol::NetworkHandler::OnRequestWillBeSentExtraInfo, devtools_request_id, request_cookie_list, request_headers, - security_state); + timestamp, security_state); } void NetworkServiceDevToolsObserver::OnRawResponse(
diff --git a/content/browser/devtools/network_service_devtools_observer.h b/content/browser/devtools/network_service_devtools_observer.h index e3e683d..38a14f4 100644 --- a/content/browser/devtools/network_service_devtools_observer.h +++ b/content/browser/devtools/network_service_devtools_observer.h
@@ -7,6 +7,7 @@ #include <string> +#include "base/time/time.h" #include "base/types/pass_key.h" #include "content/browser/renderer_host/frame_tree_node.h" #include "content/common/content_export.h" @@ -39,6 +40,7 @@ const std::string& devtools_request_id, const net::CookieAccessResultList& request_cookie_list, std::vector<network::mojom::HttpRawHeaderPairPtr> request_headers, + const base::TimeTicks timestamp, network::mojom::ClientSecurityStatePtr security_state) override; void OnRawResponse( const std::string& devtools_request_id,
diff --git a/content/browser/devtools/protocol/network_handler.cc b/content/browser/devtools/protocol/network_handler.cc index 6023c529a..9919ffd 100644 --- a/content/browser/devtools/protocol/network_handler.cc +++ b/content/browser/devtools/protocol/network_handler.cc
@@ -571,6 +571,14 @@ .Build(); } +std::unique_ptr<Network::ConnectTiming> GetConnectTiming( + const base::TimeTicks timestamp) { + const base::TimeTicks kNullTicks; + return Network::ConnectTiming::Create() + .SetRequestTime((timestamp - kNullTicks).InSecondsF()) + .Build(); +} + std::unique_ptr<Object> GetRawHeaders( const std::vector<network::mojom::HttpRawHeaderPairPtr>& headers) { std::unique_ptr<DictionaryValue> headers_dict(DictionaryValue::create()); @@ -2613,13 +2621,14 @@ const std::string& devtools_request_id, const net::CookieAccessResultList& request_cookie_list, const std::vector<network::mojom::HttpRawHeaderPairPtr>& request_headers, + const base::TimeTicks timestamp, const network::mojom::ClientSecurityStatePtr& security_state) { if (!enabled_) return; frontend_->RequestWillBeSentExtraInfo( devtools_request_id, BuildProtocolAssociatedCookies(request_cookie_list), - GetRawHeaders(request_headers), + GetRawHeaders(request_headers), GetConnectTiming(timestamp), MaybeBuildClientSecurityState(security_state)); }
diff --git a/content/browser/devtools/protocol/network_handler.h b/content/browser/devtools/protocol/network_handler.h index 6bf7522b..e2f1931 100644 --- a/content/browser/devtools/protocol/network_handler.h +++ b/content/browser/devtools/protocol/network_handler.h
@@ -221,6 +221,7 @@ const std::string& devtools_request_id, const net::CookieAccessResultList& request_cookie_list, const std::vector<network::mojom::HttpRawHeaderPairPtr>& request_headers, + const base::TimeTicks timestamp, const network::mojom::ClientSecurityStatePtr& security_state); void OnResponseReceivedExtraInfo( const std::string& devtools_request_id,
diff --git a/content/browser/download/download_browsertest.cc b/content/browser/download/download_browsertest.cc index 4df7eff..670acc7 100644 --- a/content/browser/download/download_browsertest.cc +++ b/content/browser/download/download_browsertest.cc
@@ -990,6 +990,14 @@ DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL); } + // Create a DownloadTestObserverInProgress that will wait for the + // specified number of downloads to start. + DownloadTestObserver* CreateInProgressWaiter(Shell* shell, + int num_downloads) { + DownloadManager* download_manager = DownloadManagerForShell(shell); + return new DownloadTestObserverInProgress(download_manager, num_downloads); + } + void WaitForInterrupt(download::DownloadItem* download) { DownloadUpdatedObserver( download, base::BindRepeating(&IsDownloadInState, @@ -3979,6 +3987,8 @@ EXPECT_EQ(FILE_PATH_LITERAL("suggested-filename"), downloads[0]->GetTargetFilePath().BaseName().value()); + // A link clicked by JavaScript should not have a gesture. + EXPECT_FALSE(downloads[0]->HasUserGesture()); ASSERT_TRUE(server.ShutdownAndWaitUntilComplete()); } @@ -5006,4 +5016,50 @@ EXPECT_TRUE(downloads.empty()); } +// A download triggered by clicking on a link with a |download| attribute should +// have the user-gesture flag set. +IN_PROC_BROWSER_TEST_F(DownloadContentTest, + DownloadAttributePreservesUserGesture) { + net::EmbeddedTestServer server; + ASSERT_TRUE(server.InitializeAndListen()); + + // The download-attribute.html page contains an anchor element whose href is + // set to the value of the query parameter (specified as |target| in the URL + // below). When the page is loaded, a script simulates a click on the anchor, + // triggering a download of the target URL. + GURL download_url = server.GetURL("/download"); + GURL referrer_url = + server.GetURL(std::string("/download-attribute.html?noclick&target=") + + download_url.spec()); + server.ServeFilesFromDirectory(GetTestFilePath("download", "")); + + // download-attribute.html initiates a download of /download. + server.RegisterRequestHandler( + CreateBasicResponseHandler("/download", net::HTTP_OK, base::StringPairs(), + "application/octet-stream", "Hello")); + + server.StartAcceptingConnections(); + std::unique_ptr<DownloadTestObserver> observer( + CreateInProgressWaiter(shell(), 1)); + + // Load the download page and click on the link. + EXPECT_TRUE(NavigateToURL(shell(), referrer_url)); + content::SimulateMouseClickOrTapElementWithId(shell()->web_contents(), + "downloadlink"); + + // Wait for the download. + observer->WaitForFinished(); + + std::vector<download::DownloadItem*> downloads; + DownloadManagerForShell(shell())->GetAllDownloads(&downloads); + ASSERT_EQ(1u, downloads.size()); + + // Ensure that the download is treated as having a user-gesture. + EXPECT_EQ(FILE_PATH_LITERAL("suggested-filename"), + downloads[0]->GetTargetFilePath().BaseName().value()); + EXPECT_TRUE(downloads[0]->HasUserGesture()); + + ASSERT_TRUE(server.ShutdownAndWaitUntilComplete()); +} + } // namespace content
diff --git a/content/browser/manifest/manifest_icon_downloader.cc b/content/browser/manifest/manifest_icon_downloader.cc index 14f26f80..df4334e 100644 --- a/content/browser/manifest/manifest_icon_downloader.cc +++ b/content/browser/manifest/manifest_icon_downloader.cc
@@ -16,7 +16,6 @@ #include "content/public/browser/browser_thread.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_contents.h" -#include "content/public/browser/web_contents_observer.h" #include "skia/ext/image_operations.h" #include "third_party/blink/public/mojom/devtools/console_message.mojom.h" @@ -27,26 +26,28 @@ // ManifestIconDownloader and the callers do not have to worry about // |web_contents| lifetime. If the |web_contents| is invalidated before the // message can be sent, the message will simply be ignored. -class ManifestIconDownloader::DevToolsConsoleHelper - : public WebContentsObserver { +class ManifestIconDownloader::DevToolsConsoleHelper { public: explicit DevToolsConsoleHelper(WebContents* web_contents); - ~DevToolsConsoleHelper() override = default; + ~DevToolsConsoleHelper() = default; void AddMessage(blink::mojom::ConsoleMessageLevel level, const std::string& message); + + private: + base::WeakPtr<WebContents> web_contents_; }; ManifestIconDownloader::DevToolsConsoleHelper::DevToolsConsoleHelper( WebContents* web_contents) - : WebContentsObserver(web_contents) {} + : web_contents_(web_contents->GetWeakPtr()) {} void ManifestIconDownloader::DevToolsConsoleHelper::AddMessage( blink::mojom::ConsoleMessageLevel level, const std::string& message) { - if (!web_contents()) + if (!web_contents_) return; - web_contents()->GetMainFrame()->AddMessageToConsole(level, message); + web_contents_->GetMainFrame()->AddMessageToConsole(level, message); } bool ManifestIconDownloader::Download(
diff --git a/content/browser/renderer_host/render_frame_host_delegate.h b/content/browser/renderer_host/render_frame_host_delegate.h index 9b6ae71..6b68c86 100644 --- a/content/browser/renderer_host/render_frame_host_delegate.h +++ b/content/browser/renderer_host/render_frame_host_delegate.h
@@ -134,12 +134,6 @@ virtual bool OnMessageReceived(RenderFrameHostImpl* render_frame_host, const IPC::Message& message); - // Allows the delegate to filter incoming interface requests. - virtual void OnInterfaceRequest( - RenderFrameHostImpl* render_frame_host, - const std::string& interface_name, - mojo::ScopedMessagePipeHandle* interface_pipe) {} - // Notification from the renderer host that a suspicious navigation of the // main frame has been blocked. Allows the delegate to provide some UI to let // the user know about the blocked navigation and give them the option to
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc index e3643b8..ac98459 100644 --- a/content/browser/renderer_host/render_frame_host_impl.cc +++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -4752,6 +4752,7 @@ GetProcess()->GetID(), GetRoutingID(), traffic_annotation)); parameters->set_content_initiated(!blink_parameters->is_context_menu_save); + parameters->set_has_user_gesture(blink_parameters->has_user_gesture); parameters->set_suggested_name( blink_parameters->suggested_name.value_or(std::u16string())); parameters->set_prompt(blink_parameters->is_context_menu_save);
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index eaf1acc..a9860b9 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -225,6 +225,7 @@ #include "url/url_constants.h" #if defined(OS_ANDROID) +#include "content/browser/android/java_interfaces_impl.h" #include "content/public/browser/android/java_interfaces.h" #include "media/audio/android/audio_manager_android.h" #include "third_party/blink/public/mojom/android_font_lookup/android_font_lookup.mojom.h" @@ -1497,6 +1498,18 @@ return; } +#if defined(OS_ANDROID) + if (base::FeatureList::IsEnabled( + features::kNavigationThreadingOptimizations)) { + // Bind the font lookup on the IO thread as an optimization to avoid + // running navigation critical path tasks on the UI thread. + if (auto r = receiver.As<blink::mojom::AndroidFontLookup>()) { + GetGlobalJavaInterfacesOnIOThread()->GetInterface(std::move(r)); + return; + } + } +#endif + std::string interface_name = *receiver.interface_name(); mojo::ScopedMessagePipeHandle pipe = receiver.PassPipe(); if (binders_->TryBindInterface(interface_name, &pipe))
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index aac8edf2..357c6a5 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -6516,21 +6516,6 @@ observers_.NotifyObservers(&WebContentsObserver::NavigationEntriesDeleted); } -void WebContentsImpl::OnInterfaceRequest( - RenderFrameHostImpl* render_frame_host, - const std::string& interface_name, - mojo::ScopedMessagePipeHandle* interface_pipe) { - OPTIONAL_TRACE_EVENT2("content", "WebContentsImpl::OnInterfaceRequest", - "render_frame_host", render_frame_host, - "interface_name", interface_name); - for (auto& observer : observers_.observer_list()) { - observer.OnInterfaceRequestFromFrame(render_frame_host, interface_name, - interface_pipe); - if (!interface_pipe->is_valid()) - break; - } -} - void WebContentsImpl::OnDidBlockNavigation( const GURL& blocked_url, const GURL& initiator_url,
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h index d6582d6..59fcd30e 100644 --- a/content/browser/web_contents/web_contents_impl.h +++ b/content/browser/web_contents/web_contents_impl.h
@@ -564,10 +564,6 @@ // RenderFrameHostDelegate --------------------------------------------------- bool OnMessageReceived(RenderFrameHostImpl* render_frame_host, const IPC::Message& message) override; - void OnInterfaceRequest( - RenderFrameHostImpl* render_frame_host, - const std::string& interface_name, - mojo::ScopedMessagePipeHandle* interface_pipe) override; void OnDidBlockNavigation( const GURL& blocked_url, const GURL& initiator_url,
diff --git a/content/browser/webid/federated_auth_request_impl.cc b/content/browser/webid/federated_auth_request_impl.cc index e7f96d4..eb348d16 100644 --- a/content/browser/webid/federated_auth_request_impl.cc +++ b/content/browser/webid/federated_auth_request_impl.cc
@@ -78,6 +78,7 @@ const std::string& client_id, const std::string& nonce, RequestMode mode, + bool prefer_auto_sign_in, RequestIdTokenCallback callback) { if (logout_callback_ || auth_request_callback_) { std::move(callback).Run(RequestIdTokenStatus::kErrorTooManyRequests, ""); @@ -89,6 +90,7 @@ client_id_ = client_id; nonce_ = nonce; mode_ = mode; + prefer_auto_sign_in_ = prefer_auto_sign_in; network_manager_ = CreateNetworkManager(provider); if (!network_manager_) { @@ -401,6 +403,18 @@ account.login_state = login_state; } + // Auto signs in returning users if they have a single account and are + // signing in. + // TODO(yigu): Add additional controls for RP/IDP/User for this flow. + // https://crbug.com/1236678. + if (prefer_auto_sign_in_ && accounts.size() == 1 && + accounts[0].login_state == LoginState::kSignIn) { + // TODO(yigu): Implement UI for users to cancel the auto sign in. + // https://crbug.com/1236678. + OnAccountSelected(accounts[0].sub); + return; + } + idp_web_contents_ = CreateIdpWebContents(); request_dialog_controller_->ShowAccountsDialog( rp_web_contents, idp_web_contents_.get(), provider_, accounts,
diff --git a/content/browser/webid/federated_auth_request_impl.h b/content/browser/webid/federated_auth_request_impl.h index b214358..ec11945 100644 --- a/content/browser/webid/federated_auth_request_impl.h +++ b/content/browser/webid/federated_auth_request_impl.h
@@ -53,6 +53,7 @@ const std::string& client_id, const std::string& nonce, blink::mojom::RequestMode mode, + bool prefer_auto_sign_in, RequestIdTokenCallback) override; void Logout(const std::vector<std::string>& logout_endpoints, LogoutCallback) override; @@ -121,6 +122,8 @@ blink::mojom::RequestMode mode_; + bool prefer_auto_sign_in_; + // Fetched from the IDP well-known configuration. struct { GURL idp;
diff --git a/content/browser/webid/federated_auth_request_impl_unittest.cc b/content/browser/webid/federated_auth_request_impl_unittest.cc index cf9c9bb..c993ec371 100644 --- a/content/browser/webid/federated_auth_request_impl_unittest.cc +++ b/content/browser/webid/federated_auth_request_impl_unittest.cc
@@ -47,6 +47,8 @@ namespace { +constexpr bool kPreferAutoSignIn = true; +constexpr bool kNotPreferAutoSignIn = false; constexpr char kRpTestOrigin[] = "https://rp.example"; constexpr char kIdpTestOrigin[] = "https://idp.example"; constexpr char kIdpEndpoint[] = "https://idp.example/webid"; @@ -74,6 +76,7 @@ const char* client_id; const char* nonce; RequestMode mode; + bool prefer_auto_sign_in; } RequestParameters; // Expected return values from a call to RequestIdToken. @@ -384,7 +387,8 @@ std::pair<RequestIdTokenStatus, absl::optional<std::string>> PerformAuthRequest(const std::string& client_id, const std::string& nonce, - blink::mojom::RequestMode mode) { + blink::mojom::RequestMode mode, + bool prefer_auto_sign_in) { auth_request_impl_->SetNetworkManagerForTests( std::move(mock_request_manager_)); auth_request_impl_->SetDialogControllerForTests( @@ -392,6 +396,7 @@ AuthRequestCallbackHelper auth_helper; request_remote_->RequestIdToken(provider_, client_id, nonce, mode, + prefer_auto_sign_in, auth_helper.callback()); auth_helper.WaitForCallback(); return std::make_pair(auth_helper.status(), auth_helper.token()); @@ -458,7 +463,8 @@ } void SetMediatedMockExpectations(const MockMediatedConfiguration& conf, - std::string token) { + std::string token, + bool prefer_auto_sign_in) { if (conf.accounts_response) { EXPECT_CALL(*mock_request_manager_, SendAccountsRequest(_, _)) .WillOnce(Invoke( @@ -468,7 +474,12 @@ })); } - if (conf.accounts_response == AccountsResponse::kSuccess) { + if (conf.accounts_response == AccountsResponse::kSuccess && + !prefer_auto_sign_in) { + // Expects a dialog if prefer_auto_sign_in is not set by RP. However, + // even though the bit is set we may not exercise the AutoSignIn flow. + // e.g. for sign up flow, multiple accounts, user opt-out etc. In this + // case, it's up to the test to expect this mock function call. EXPECT_CALL(*mock_dialog_controller_, ShowAccountsDialog(_, _, _, _, _)) .WillOnce(Invoke( [&](content::WebContents* rp_web_contents, @@ -523,7 +534,8 @@ SetPermissionMockExpectations(test_case.config.Permission_conf, test_case.config.token); SetMediatedMockExpectations(test_case.config.Mediated_conf, - test_case.config.token); + test_case.config.token, + test_case.inputs.prefer_auto_sign_in); } // Expectations have to be set explicitly in advance using @@ -569,6 +581,9 @@ } const AccountList& displayed_accounts() const { return displayed_accounts_; } + MockIdentityRequestDialogController* mock_dialog_controller() const { + return mock_dialog_controller_.get(); + } private: mojo::Remote<blink::mojom::FederatedAuthRequest> request_remote_; @@ -612,9 +627,9 @@ AuthRequestTestCase test_case = GetParam(); CreateAuthRequest(GURL(test_case.inputs.provider)); SetMockExpectations(test_case); - auto auth_response = - PerformAuthRequest(test_case.inputs.client_id, test_case.inputs.nonce, - test_case.inputs.mode); + auto auth_response = PerformAuthRequest( + test_case.inputs.client_id, test_case.inputs.nonce, test_case.inputs.mode, + test_case.inputs.prefer_auto_sign_in); EXPECT_EQ(auth_response.first, test_case.expected.return_status); EXPECT_EQ(auth_response.second, test_case.expected.token); } @@ -692,7 +707,8 @@ static const AuthRequestTestCase kSuccessfulMediatedSignUpTestCase{ "Successful mediated flow with one account", - {kIdpTestOrigin, kClientId, kNonce, RequestMode::kMediated}, + {kIdpTestOrigin, kClientId, kNonce, RequestMode::kMediated, + kNotPreferAutoSignIn}, {RequestIdTokenStatus::kSuccess, kToken}, {kToken, absl::nullopt, @@ -705,7 +721,8 @@ static const AuthRequestTestCase kFailedMediatedSignUpTestCase{ "Failed mediated flow with one account", - {kIdpTestOrigin, kClientId, kNonce, RequestMode::kMediated}, + {kIdpTestOrigin, kClientId, kNonce, RequestMode::kMediated, + kNotPreferAutoSignIn}, {RequestIdTokenStatus::kSuccess, kToken}, {kToken, absl::nullopt, @@ -717,14 +734,28 @@ {AccountsResponse::kSuccess, kAccounts, TokenResponse::kInvalidResponseError}}}; +static const AuthRequestTestCase kSuccessfulMediatedAutoSignInTestCase{ + "Successful mediated flow with one account", + {kIdpTestOrigin, kClientId, kNonce, RequestMode::kMediated, + kPreferAutoSignIn}, + {RequestIdTokenStatus::kSuccess, kToken}, + {kToken, + absl::nullopt, + FetchStatus::kSuccess, + "", + kAccountsEndpoint, + kTokenEndpoint, + kPermissionNoop, + {AccountsResponse::kSuccess, kAccounts, TokenResponse::kSuccess}}}; + TEST_F(BasicFederatedAuthRequestImplTest, LoginStateShouldBeSignUpForFirstTimeUser) { const auto& test_case = kSuccessfulMediatedSignUpTestCase; CreateAuthRequest(GURL(test_case.inputs.provider)); SetMockExpectations(test_case); - auto auth_response = - PerformAuthRequest(test_case.inputs.client_id, test_case.inputs.nonce, - test_case.inputs.mode); + auto auth_response = PerformAuthRequest( + test_case.inputs.client_id, test_case.inputs.nonce, test_case.inputs.mode, + test_case.inputs.prefer_auto_sign_in); EXPECT_EQ(LoginState::kSignUp, displayed_accounts()[0].login_state); } @@ -749,9 +780,9 @@ url::Origin::Create(GURL(kIdpTestOrigin)), _, "1234")) .WillOnce(Return(true)); - auto auth_response = - PerformAuthRequest(test_case.inputs.client_id, test_case.inputs.nonce, - test_case.inputs.mode); + auto auth_response = PerformAuthRequest( + test_case.inputs.client_id, test_case.inputs.nonce, test_case.inputs.mode, + test_case.inputs.prefer_auto_sign_in); EXPECT_EQ(LoginState::kSignIn, displayed_accounts()[0].login_state); } @@ -776,9 +807,9 @@ url::Origin::Create(GURL(kIdpTestOrigin)), _, "1234")) .Times(1); - auto auth_response = - PerformAuthRequest(test_case.inputs.client_id, test_case.inputs.nonce, - test_case.inputs.mode); + auto auth_response = PerformAuthRequest( + test_case.inputs.client_id, test_case.inputs.nonce, test_case.inputs.mode, + test_case.inputs.prefer_auto_sign_in); } TEST_F(BasicFederatedAuthRequestImplTest, @@ -798,9 +829,65 @@ GrantSharingPermissionForAccount(_, _, _)) .Times(0); - auto auth_response = - PerformAuthRequest(test_case.inputs.client_id, test_case.inputs.nonce, - test_case.inputs.mode); + auto auth_response = PerformAuthRequest( + test_case.inputs.client_id, test_case.inputs.nonce, test_case.inputs.mode, + test_case.inputs.prefer_auto_sign_in); +} + +TEST_F(BasicFederatedAuthRequestImplTest, AutoSignInForReturningUser) { + const auto& test_case = kSuccessfulMediatedAutoSignInTestCase; + auto& auth_request = CreateAuthRequest(GURL(test_case.inputs.provider)); + SetMockExpectations(test_case); + // Set specific expectations for sharing permission: + NiceMock<MockSharingPermissionDelegate> mock_sharing_permission_delegate; + auth_request.SetSharingPermissionDelegateForTests( + &mock_sharing_permission_delegate); + + // Pretend the sharing permission has been granted for this account. + // + // TODO(majidvp): Ideally we would use the kRpTestOrigin for second argument + // but web contents has not navigated to that URL so origin() is null in + // tests. We should fix this. + EXPECT_CALL(mock_sharing_permission_delegate, + HasSharingPermissionForAccount( + url::Origin::Create(GURL(kIdpTestOrigin)), _, "1234")) + .WillOnce(Return(true)); + // TODO(yigu): once the AutoSignIn UI is implemented we expect this call to + // happen once. + EXPECT_CALL(*mock_dialog_controller(), ShowAccountsDialog(_, _, _, _, _)) + .Times(0); + + EXPECT_EQ(test_case.config.Mediated_conf.accounts.size(), 1u); + auto auth_response = PerformAuthRequest( + test_case.inputs.client_id, test_case.inputs.nonce, test_case.inputs.mode, + test_case.inputs.prefer_auto_sign_in); + EXPECT_EQ(test_case.config.Mediated_conf.accounts[0].login_state, + LoginState::kSignIn); + EXPECT_EQ(auth_response.second.value(), kToken); +} + +TEST_F(BasicFederatedAuthRequestImplTest, AutoSignInForFirstTimeUser) { + AccountList displayed_accounts; + const auto& test_case = kSuccessfulMediatedAutoSignInTestCase; + CreateAuthRequest(GURL(test_case.inputs.provider)); + EXPECT_CALL(*mock_dialog_controller(), ShowAccountsDialog(_, _, _, _, _)) + .WillOnce( + Invoke([&](content::WebContents* rp_web_contents, + content::WebContents* idp_web_contents, + const GURL& idp_signin_url, AccountList accounts, + IdentityRequestDialogController::AccountSelectionCallback + on_selected) { + displayed_accounts = accounts; + std::move(on_selected).Run(accounts[0].sub); + })); + + SetMockExpectations(test_case); + auto auth_response = PerformAuthRequest( + test_case.inputs.client_id, test_case.inputs.nonce, test_case.inputs.mode, + test_case.inputs.prefer_auto_sign_in); + + EXPECT_EQ(displayed_accounts[0].login_state, LoginState::kSignUp); + EXPECT_EQ(auth_response.second.value(), kToken); } } // namespace content
diff --git a/content/public/android/java/src/org/chromium/content/browser/InterfaceRegistrarImpl.java b/content/public/android/java/src/org/chromium/content/browser/InterfaceRegistrarImpl.java index d684872..97330d87 100644 --- a/content/public/android/java/src/org/chromium/content/browser/InterfaceRegistrarImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/InterfaceRegistrarImpl.java
@@ -32,6 +32,13 @@ } @CalledByNative + static void createInterfaceRegistryOnIOThread(int nativeHandle) { + InterfaceRegistry registry = InterfaceRegistry.create( + CoreImpl.getInstance().acquireNativeHandle(nativeHandle).toMessagePipeHandle()); + registerInterfacesOnIOThread(registry); + } + + @CalledByNative static void createInterfaceRegistryForWebContents(int nativeHandle, WebContents webContents) { ensureSingletonRegistrarsAreRegistered(); @@ -56,6 +63,10 @@ InterfaceRegistrar.Registry.addSingletonRegistrar(new SingletonInterfaceRegistrar()); } + private static void registerInterfacesOnIOThread(InterfaceRegistry registry) { + registry.addInterface(AndroidFontLookup.MANAGER, new AndroidFontLookupImpl.Factory()); + } + private static class SingletonInterfaceRegistrar implements InterfaceRegistrar<Void> { @Override public void registerInterfaces(InterfaceRegistry registry, Void v) {
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java index c0a0d45..a8913e0 100644 --- a/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java
@@ -196,6 +196,9 @@ // WebView. private boolean mShouldFocusOnPageLoad; + // Whether the image descriptions feature is allowed for this instance. + private boolean mAllowImageDescriptions; + // If true, the web contents are obscured by another view and we shouldn't // return an AccessibilityNodeProvider or process touch exploration events. private boolean mIsObscuredByAnotherView; @@ -714,6 +717,14 @@ @Override public void setShouldFocusOnPageLoad(boolean on) { mShouldFocusOnPageLoad = on; + + // If focus on page load is true, we will allow the image descriptions feature. + mAllowImageDescriptions = on; + } + + @Override + public void setAllowImageDescriptions(boolean allowImageDescriptions) { + mAllowImageDescriptions = allowImageDescriptions; } @Override @@ -1430,13 +1441,12 @@ @CalledByNative private void handlePageLoaded(int id) { - // If |mShouldFocusOnPageLoad| is false, that means this is a WebView and we should disable - // the image descriptions alt-text hints. - if (!mShouldFocusOnPageLoad) { - WebContentsAccessibilityImplJni.get().setIsRunningAsWebView( - mNativeObj, WebContentsAccessibilityImpl.this, true); - return; - } + // Set whether image descriptions should be enabled for this instance. We do not want + // the feature to run in certain cases (e.g. WebView or Chrome Custom Tab). + WebContentsAccessibilityImplJni.get().setAllowImageDescriptions( + mNativeObj, WebContentsAccessibilityImpl.this, mAllowImageDescriptions); + + if (!mShouldFocusOnPageLoad) return; if (mUserHasTouchExplored) return; moveAccessibilityFocusToIdAndRefocusIfNeeded(id); } @@ -2196,8 +2206,8 @@ WebContentsAccessibilityImpl caller, int maxEvents); int getMaxContentChangedEventsToFireForTesting(long nativeWebContentsAccessibilityAndroid); void signalEndOfTestForTesting(long nativeWebContentsAccessibilityAndroid); - void setIsRunningAsWebView(long nativeWebContentsAccessibilityAndroid, - WebContentsAccessibilityImpl caller, boolean isWebView); + void setAllowImageDescriptions(long nativeWebContentsAccessibilityAndroid, + WebContentsAccessibilityImpl caller, boolean allowImageDescriptions); boolean onHoverEventNoRenderer(long nativeWebContentsAccessibilityAndroid, WebContentsAccessibilityImpl caller, float x, float y); }
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/WebContentsAccessibility.java b/content/public/android/java/src/org/chromium/content_public/browser/WebContentsAccessibility.java index 7c1337d..25c24216 100644 --- a/content/public/android/java/src/org/chromium/content_public/browser/WebContentsAccessibility.java +++ b/content/public/android/java/src/org/chromium/content_public/browser/WebContentsAccessibility.java
@@ -111,6 +111,11 @@ void setShouldFocusOnPageLoad(boolean on); /** + * Sets whether or not the image descriptions feature should be allowed. + */ + void setAllowImageDescriptions(boolean allowImageDescriptions); + + /** * Called when autofill popup is displayed. Used to upport navigation through the view. * @param autofillPopupView The displayed autofill popup view. */
diff --git a/content/public/browser/web_contents_observer.h b/content/public/browser/web_contents_observer.h index 264f4fa..d6f20a6 100644 --- a/content/public/browser/web_contents_observer.h +++ b/content/public/browser/web_contents_observer.h
@@ -714,15 +714,6 @@ virtual void DidUpdateWebManifestURL(RenderFrameHost* target_frame, const GURL& manifest_url) {} - // DEPRECATED. Please register interface binders with BrowserInterfaceBroker - // instead (see 'Interface-Brokers' section in //docs/mojo_and_services.md). - // Called to give the embedder an opportunity to bind an interface request - // from a frame. If the request can be bound, |interface_pipe| will be taken. - virtual void OnInterfaceRequestFromFrame( - RenderFrameHost* render_frame_host, - const std::string& interface_name, - mojo::ScopedMessagePipeHandle* interface_pipe) {} - // Called when "audible" playback starts or stops on a WebAudio AudioContext. using AudioContextId = std::pair<RenderFrameHost*, int>; virtual void AudioContextPlaybackStarted(
diff --git a/content/public/test/mock_web_contents_observer.h b/content/public/test/mock_web_contents_observer.h index efe7cb4..601d988 100644 --- a/content/public/test/mock_web_contents_observer.h +++ b/content/public/test/mock_web_contents_observer.h
@@ -340,12 +340,6 @@ (RenderFrameHost * target_frame, const GURL& manifest_url), (override)); MOCK_METHOD(void, - OnInterfaceRequestFromFrame, - (RenderFrameHost* render_frame_host, - const std::string& interface_name, - mojo::ScopedMessagePipeHandle* interface_pipe), - (override)); - MOCK_METHOD(void, AudioContextPlaybackStarted, (const AudioContextId& audio_context_id), (override));
diff --git a/content/renderer/media/win/dcomp_texture_host.cc b/content/renderer/media/win/dcomp_texture_host.cc index c4d0ca4..7b77274 100644 --- a/content/renderer/media/win/dcomp_texture_host.cc +++ b/content/renderer/media/win/dcomp_texture_host.cc
@@ -4,6 +4,7 @@ #include "content/renderer/media/win/dcomp_texture_host.h" +#include "base/bind_post_task.h" #include "base/unguessable_token.h" #include "gpu/ipc/client/gpu_channel_host.h" #include "gpu/ipc/common/command_buffer_id.h" @@ -27,8 +28,10 @@ DCHECK(route_id_); DCHECK(listener_); - texture_remote_.Bind(std::move(texture)); + // `allow_binding` is needed to make sure `texture_remote_` and `receiver_` + // are both bound on `media_task_runner`. See crbug.com/1229833. IPC::ScopedAllowOffSequenceChannelAssociatedBindings allow_binding; + texture_remote_.Bind(std::move(texture), media_task_runner); texture_remote_->StartListening( receiver_.BindNewEndpointAndPassRemote(media_task_runner)); texture_remote_.set_disconnect_handler(base::BindOnce( @@ -55,11 +58,14 @@ texture_remote_->SetTextureSize(size); } -void DCOMPTextureHost::SetDCOMPSurface( - const base::UnguessableToken& surface_token) { +void DCOMPTextureHost::SetDCOMPSurfaceHandle( + const base::UnguessableToken& token, + SetDCOMPSurfaceHandleCB set_dcomp_surface_handle_cb) { DVLOG_FUNC(1); - if (texture_remote_) - texture_remote_->SetSurfaceHandle(surface_token); + if (texture_remote_) { + texture_remote_->SetDCOMPSurfaceHandle( + token, std::move(set_dcomp_surface_handle_cb)); + } } void DCOMPTextureHost::OnDisconnectedFromGpuProcess() { @@ -74,11 +80,6 @@ listener_->OnSharedImageMailboxBound(mailbox); } -void DCOMPTextureHost::OnDCOMPSurfaceHandleBound(bool success) { - DVLOG_FUNC(1) << "success=" << success; - listener_->OnDCOMPSurfaceHandleBound(success); -} - void DCOMPTextureHost::OnCompositionParamsChanged( const gfx::Rect& output_rect) { DVLOG_FUNC(3);
diff --git a/content/renderer/media/win/dcomp_texture_host.h b/content/renderer/media/win/dcomp_texture_host.h index 58b61e877..8e53afd0 100644 --- a/content/renderer/media/win/dcomp_texture_host.h +++ b/content/renderer/media/win/dcomp_texture_host.h
@@ -37,7 +37,6 @@ class Listener { public: virtual void OnSharedImageMailboxBound(gpu::Mailbox mailbox) = 0; - virtual void OnDCOMPSurfaceHandleBound(bool success) = 0; virtual void OnCompositionParamsReceived(gfx::Rect output_rect) = 0; }; @@ -52,14 +51,17 @@ ~DCOMPTextureHost() override; void SetTextureSize(const gfx::Size& size); - void SetDCOMPSurface(const base::UnguessableToken& surface_token); + + using SetDCOMPSurfaceHandleCB = base::OnceCallback<void(bool)>; + void SetDCOMPSurfaceHandle( + const base::UnguessableToken& token, + SetDCOMPSurfaceHandleCB set_dcomp_surface_handle_cb); private: void OnDisconnectedFromGpuProcess(); // gpu::mojom::DCOMPTextureClient: void OnSharedImageMailboxBound(const gpu::Mailbox& mailbox) override; - void OnDCOMPSurfaceHandleBound(bool success) override; void OnCompositionParamsChanged(const gfx::Rect& output_rect) override; scoped_refptr<gpu::GpuChannelHost> channel_;
diff --git a/content/renderer/media/win/dcomp_texture_wrapper_impl.cc b/content/renderer/media/win/dcomp_texture_wrapper_impl.cc index 9b9cde1d..194e97a 100644 --- a/content/renderer/media/win/dcomp_texture_wrapper_impl.cc +++ b/content/renderer/media/win/dcomp_texture_wrapper_impl.cc
@@ -102,7 +102,6 @@ // TODO(xhwang): Remove `init_cb` and return the result synchronously. void DCOMPTextureWrapperImpl::Initialize( const gfx::Size& natural_size, - DCOMPSurfaceHandleBoundCB dcomp_surface_handle_bound_cb, CompositionParamsReceivedCB comp_params_received_cb, InitCB init_cb) { DVLOG_FUNC(1); @@ -116,7 +115,6 @@ return; } - dcomp_surface_handle_bound_cb_ = std::move(dcomp_surface_handle_bound_cb); comp_params_received_cb_ = std::move(comp_params_received_cb); std::move(init_cb).Run(true); @@ -136,12 +134,14 @@ dcomp_texture_host_->SetTextureSize(new_size); } -void DCOMPTextureWrapperImpl::SetDCOMPSurface( - const base::UnguessableToken& surface_token) { +void DCOMPTextureWrapperImpl::SetDCOMPSurfaceHandle( + const base::UnguessableToken& token, + SetDCOMPSurfaceHandleCB set_dcomp_surface_handle_cb) { DVLOG_FUNC(1); DCHECK(media_task_runner_->BelongsToCurrentThread()); - dcomp_texture_host_->SetDCOMPSurface(surface_token); + dcomp_texture_host_->SetDCOMPSurfaceHandle( + token, std::move(set_dcomp_surface_handle_cb)); } void DCOMPTextureWrapperImpl::CreateVideoFrame( @@ -200,14 +200,6 @@ } } -void DCOMPTextureWrapperImpl::OnDCOMPSurfaceHandleBound(bool success) { - DVLOG_FUNC(1); - DCHECK(media_task_runner_->BelongsToCurrentThread()); - DCHECK(dcomp_surface_handle_bound_cb_); - - std::move(dcomp_surface_handle_bound_cb_).Run(success); -} - void DCOMPTextureWrapperImpl::OnCompositionParamsReceived( gfx::Rect output_rect) { DVLOG_FUNC(1);
diff --git a/content/renderer/media/win/dcomp_texture_wrapper_impl.h b/content/renderer/media/win/dcomp_texture_wrapper_impl.h index aac241e..9604e85 100644 --- a/content/renderer/media/win/dcomp_texture_wrapper_impl.h +++ b/content/renderer/media/win/dcomp_texture_wrapper_impl.h
@@ -32,9 +32,6 @@ // - We create a SharedImage mailbox representing the DCOMPTexture at a given // size. // - We create a VideoFrame which takes ownership of this SharedImage mailbox. -// - When the DCOMPTexture's OnDCOMPSurfaceHandleBound() callback is fired, we -// notify MediaFoundationRendererClient that the DCOMP handle has been bound, -// via the `dcomp_surface_handle_bound_cb_` callback. class DCOMPTextureWrapperImpl : public media::DCOMPTextureWrapper, public DCOMPTextureHost::Listener { public: @@ -47,13 +44,14 @@ // Initializes `this` and run `init_cb` with success or failure. All other // methods should only be called after a successful initialization. void Initialize(const gfx::Size& natural_size, - DCOMPSurfaceHandleBoundCB dcomp_surface_handle_bound_cb, CompositionParamsReceivedCB comp_params_received_cb, InitCB init_cb) override; // DCOMPTextureWrapper: void UpdateTextureSize(const gfx::Size& natural_size) override; - void SetDCOMPSurface(const base::UnguessableToken& surface_token) override; + void SetDCOMPSurfaceHandle( + const base::UnguessableToken& token, + SetDCOMPSurfaceHandleCB set_dcomp_surface_handle_cb) override; void CreateVideoFrame(CreateVideoFrameCB create_video_frame_cb) override; private: @@ -65,14 +63,12 @@ // DCOMPTextureHost::Listener: void OnSharedImageMailboxBound(gpu::Mailbox mailbox) override; - void OnDCOMPSurfaceHandleBound(bool success) override; void OnCompositionParamsReceived(gfx::Rect output_rect) override; scoped_refptr<DCOMPTextureFactory> factory_; scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_; gfx::Size natural_size_; // Size of the video frames. - DCOMPSurfaceHandleBoundCB dcomp_surface_handle_bound_cb_; CompositionParamsReceivedCB comp_params_received_cb_; std::unique_ptr<DCOMPTextureHost> dcomp_texture_host_;
diff --git a/content/test/data/download/download-attribute.html b/content/test/data/download/download-attribute.html index 01f4c96..f82cffeb 100644 --- a/content/test/data/download/download-attribute.html +++ b/content/test/data/download/download-attribute.html
@@ -1,7 +1,8 @@ <!DOCTYPE html> <html> +<head><meta name="viewport" content="width=device-width,minimum-scale=1"></head> <body> -<a download="suggested-filename" href="">link</a> +<a download="suggested-filename" id="downloadlink" href="">link</a> <script> var anchorElement = document.querySelector('a[download]'); url = window.location.href;
diff --git a/content/test/data/gpu/pixel_webgpu_copy_image.html b/content/test/data/gpu/pixel_webgpu_copy_image.html new file mode 100644 index 0000000..382b8076 --- /dev/null +++ b/content/test/data/gpu/pixel_webgpu_copy_image.html
@@ -0,0 +1,60 @@ +<!DOCTYPE html> +<html> +<head> + <title>WebGPU Canvas Save/Copy Image Test</title> + <style type="text/css"> + .nomargin { + margin: 0px auto; + } + </style> + <script type="text/javascript" src="pixel_webgpu_util.js"></script> + <script type="text/javascript"> + var g_swapsBeforeAck = 15; + + function waitForFinish() { + if (g_swapsBeforeAck == 0) { + sendResult("SUCCESS"); + } else { + g_swapsBeforeAck--; + window.requestAnimationFrame(waitForFinish); + } + } + + function sendResult(status) { + if (domAutomationController) { + domAutomationController.send(status); + } else { + console.log(status); + } + } + + async function main() { + const gpuCanvas = document.getElementById('canvas_gpu'); + const [gpuDevice, gpuContext] = await webGpuUtils.init(gpuCanvas); + if (!gpuDevice || !gpuContext) { + console.error("Failed to initialize WebGPU - skipping test"); + domAutomationController.send("FAILURE"); + return; + } + + const renderCallback = function() { + webGpuUtils.fourColorsTest(gpuDevice, gpuContext, gpuCanvas.width, + gpuCanvas.height); + + let dataURL = canvas_gpu.toDataURL(); + + let image = document.getElementById("i"); + image.src = dataURL; + + waitForFinish(); + }; + + window.requestAnimationFrame(renderCallback); + } + </script> +</head> +<body onload="main()"> + <canvas id="canvas_gpu" width="200" height="200" class="nomargin"></canvas> + <img id="i" width="100" height="100" class="nomargin" style="background-color:black"> +</body> +</html>
diff --git a/content/test/gpu/gpu_tests/pixel_test_pages.py b/content/test/gpu/gpu_tests/pixel_test_pages.py index e755383..52ceeee 100644 --- a/content/test/gpu/gpu_tests/pixel_test_pages.py +++ b/content/test/gpu/gpu_tests/pixel_test_pages.py
@@ -365,6 +365,10 @@ base_name + '_WebGPUCanvas2DDrawImage', test_rect=[0, 0, 400, 200], browser_args=webgpu_args), + PixelTestPage('pixel_webgpu_copy_image.html', + base_name + '_WebGPUToDataURL', + test_rect=[0, 0, 400, 300], + browser_args=webgpu_args), ] # Pages that should be run with GPU rasterization enabled.
diff --git a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt index 3755938..8709075 100644 --- a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
@@ -395,13 +395,19 @@ crbug.com/1209344 [ linux display-server-wayland intel skia-renderer-gl ] Pixel_Video_MP4 [ RetryOnFailure ] # WebGPU pixel tests hang on mac bots which mostly run older versions of mac os. -crbug.com/1213170 [ mac ] Pixel_WebGPU* [ Skip ] +crbug.com/1213170 [ mac ] Pixel_WebGPUImport* [ Skip ] +crbug.com/1213170 [ mac ] Pixel_WebGPUCanvas* [ Skip ] +crbug.com/1213170 [ mac ] Pixel_WebGPUWebGL* [ Skip ] # WebGPU pixel tests fail on Linux+SkiaRenderer+Vulkan -crbug.com/1213657 [ linux skia-renderer-vulkan ] Pixel_WebGPU* [ Skip ] +crbug.com/1213657 [ linux skia-renderer-vulkan ] Pixel_WebGPUImport* [ Skip ] +crbug.com/1213657 [ linux skia-renderer-vulkan ] Pixel_WebGPUCanvas* [ Skip ] +crbug.com/1213657 [ linux skia-renderer-vulkan ] Pixel_WebGPUWebGL* [ Skip ] # WebGPU pixel tests fail on Win10+SkiaRenderer+Dawn. -crbug.com/1213920 [ win10 skia-renderer-dawn ] Pixel_WebGPU* [ Failure ] +crbug.com/1213920 [ win10 skia-renderer-dawn ] Pixel_WebGPUImport* [ Failure ] +crbug.com/1213920 [ win10 skia-renderer-dawn ] Pixel_WebGPUCanvas* [ Failure ] +crbug.com/1213920 [ win10 skia-renderer-dawn ] Pixel_WebGPUWebGL* [ Failure ] # WebGPU is only supported on Win10, Mac, and Linux+SkiaRenderer+Vulkan. crbug.com/976495 [ linux skia-renderer-gl ] Pixel_WebGPU* [ Skip ]
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt index d456fd5a..8ce37bea 100644 --- a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
@@ -406,6 +406,7 @@ crbug.com/1214931 [ mojave amd-0x6821 angle-opengl passthrough ] deqp/functional/gles3/shadertexturefunction/texturesize.html [ RetryOnFailure ] crbug.com/1230781 [ mac amd-0x6821 ] conformance/canvas/to-data-url-test.html [ Failure ] crbug.com/1230781 [ mac amd-0x679e ] conformance/canvas/to-data-url-test.html [ Failure ] +crbug.com/1037958 [ mac amd-0x679e ] conformance2/transform_feedback/switching-objects.html [ RetryOnFailure ] # The transformfeedback tests are specialized for two different AMD # GPUs because of different failure modes on each. @@ -769,29 +770,153 @@ crbug.com/angleproject/3686 [ android angle-opengles ] deqp/functional/gles3/multisample/fbo_8_samples.html [ Failure ] crbug.com/angleproject/3686 [ android angle-opengles ] deqp/functional/gles3/multisample/fbo_max_samples.html [ Failure ] -############ -# ChromeOS # -############ +##################### +# ChromeOS failures # +##################### # Skip these, rather than expect them to fail to avoid that they impact the # following tests result. -crbug.com/1237319 [ chromeos ] conformance2/reading/read-pixels-from-fbo-test.html [ Skip ] -crbug.com/1237319 [ chromeos ] conformance2/rendering/framebuffer-render-to-layer.html [ Skip ] +crbug.com/1237319 [ chromeos passthrough ] conformance2/reading/read-pixels-from-fbo-test.html [ Skip ] +crbug.com/1237319 [ chromeos passthrough ] conformance2/rendering/framebuffer-render-to-layer.html [ Skip ] crbug.com/1237319 [ chromeos passthrough ] conformance/textures/misc/texture-size-limit.html [ Skip ] crbug.com/1237319 [ chromeos passthrough ] conformance2/textures/misc/tex-3d-size-limit.html [ Skip ] -crbug.com/1237319 [ chromeos passthrough ] conformance/extensions/khr-parallel-shader-compile.html [ skip ] +crbug.com/1237319 [ chromeos passthrough ] conformance/extensions/khr-parallel-shader-compile.html [ Skip ] # Won't investigate failures on validating command decoder. Remove once it's unshipped. -crbug.com/1237319 [ chromeos no-passthrough ] conformance/extensions/webgl-compressed-texture-astc.html [ Skip ] -crbug.com/1237319 [ chromeos no-passthrough ] conformance2/textures/canvas_sub_rectangle/tex-2d-r8ui-red_integer-unsigned_byte.html [ Skip ] crbug.com/1237319 [ chromeos no-passthrough ] conformance2/textures/canvas_sub_rectangle/tex-3d-* [ Skip ] crbug.com/1237319 [ chromeos no-passthrough ] conformance2/textures/misc/origin-clean-conformance-offscreencanvas.html [ Skip ] -crbug.com/1237319 [ chromeos no-passthrough ] conformance2/textures/webgl_canvas/tex-2d-r8ui-red_integer-unsigned_byte.html [ Skip ] crbug.com/1237319 [ chromeos no-passthrough ] conformance2/textures/webgl_canvas/tex-3d-* [ Skip ] crbug.com/1237319 [ chromeos no-passthrough ] deqp/functional/gles3/clipping.html [ Skip ] -crbug.com/1237319 [ chromeos no-passthrough ] deqp/functional/gles3/negativetextureapi.html [ Skip ] -crbug.com/1037958 [ mac amd-0x679e ] conformance2/transform_feedback/switching-objects.html [ RetryOnFailure ] +crbug.com/1215700 [ chromeos no-passthrough ] deqp/functional/gles3/negativetextureapi.html [ Failure ] + +crbug.com/1210240 [ chromeos chromeos-board-amd64-generic no-passthrough ] conformance2/textures/canvas_sub_rectangle/tex-3d* [ Failure ] +crbug.com/1210240 [ chromeos chromeos-board-amd64-generic no-passthrough ] conformance2/textures/canvas_sub_rectangle/tex-2d-r8ui-red_integer-unsigned_byte.html [ Failure ] +crbug.com/1210240 [ chromeos chromeos-board-amd64-generic no-passthrough ] conformance2/textures/webgl_canvas/tex-3d* [ Failure ] +crbug.com/1210240 [ chromeos chromeos-board-amd64-generic no-passthrough ] conformance2/textures/webgl_canvas/tex-2d-r8ui-red_integer-unsigned_byte.html [ Failure ] +crbug.com/1211582 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/texturefiltering/* [ Failure ] +crbug.com/1213198 [ chromeos chromeos-board-amd64-generic no-passthrough ] WebglExtension_EXT_texture_filter_anisotropic [ Failure ] +crbug.com/1213198 [ chromeos chromeos-board-amd64-generic no-passthrough ] WebglExtension_OVR_multiview2 [ Failure ] +crbug.com/1213198 [ chromeos chromeos-board-amd64-generic no-passthrough ] WebglExtension_WEBGL_compressed_texture_pvrtc [ Failure ] +crbug.com/1213198 [ chromeos chromeos-board-amd64-generic no-passthrough ] WebglExtension_WEBGL_draw_instanced_base_vertex_base_instance [ Failure ] +crbug.com/1213198 [ chromeos chromeos-board-amd64-generic no-passthrough ] WebglExtension_WEBGL_multi_draw_instanced_base_vertex_base_instance [ Failure ] +crbug.com/1215695 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/fbocolorbuffer/tex2d_00.html [ Failure ] +crbug.com/1215695 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/fbocolorbuffer/tex2d_01.html [ Failure ] +crbug.com/1215695 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/fbocolorbuffer/tex2darray_00.html [ Failure ] +crbug.com/1215695 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/fbocolorbuffer/tex2darray_01.html [ Failure ] +crbug.com/1215695 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/fbocolorbuffer/tex3d_00.html [ Failure ] +crbug.com/1215695 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/fbocolorbuffer/tex3d_01.html [ Failure ] +crbug.com/1215695 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/fbocolorbuffer/texcube_00.html [ Failure ] +crbug.com/1215695 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/fbocolorbuffer/texcube_01.html [ Failure ] +crbug.com/1215698 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/fborender/recreate_color_00.html [ Failure ] +crbug.com/1215698 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/fborender/recreate_color_01.html [ Failure ] +crbug.com/1215698 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/fborender/recreate_color_02.html [ Failure ] +crbug.com/1215698 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/fborender/recreate_color_04.html [ Failure ] +crbug.com/1215698 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/fborender/recreate_color_05.html [ Failure ] +crbug.com/1215698 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/fborender/recreate_color_06.html [ Failure ] +crbug.com/1215698 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/fborender/resize_00.html [ Failure ] +crbug.com/1215698 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/fborender/resize_01.html [ Failure ] +crbug.com/1215698 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/fborender/resize_02.html [ Failure ] +crbug.com/1215698 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/fborender/resize_03.html [ Failure ] +crbug.com/1218607 [ chromeos chromeos-board-amd64-generic no-passthrough ] conformance2/reading/read-pixels-from-fbo-test.html [ Failure ] +crbug.com/1221362 [ chromeos chromeos-board-amd64-generic no-passthrough ] conformance2/rendering/blitframebuffer-filter-outofbounds.html [ Failure ] +crbug.com/1221362 [ chromeos chromeos-board-amd64-generic no-passthrough ] conformance2/rendering/blitframebuffer-filter-srgb.html [ Failure ] +crbug.com/1221362 [ chromeos chromeos-board-amd64-generic no-passthrough ] conformance2/rendering/blitframebuffer-multisampled-readbuffer.html [ Failure ] +crbug.com/1221364 [ chromeos chromeos-board-amd64-generic no-passthrough ] conformance2/state/gl-get-calls.html [ Failure ] +crbug.com/1221364 [ chromeos chromeos-board-amd64-generic no-passthrough ] conformance2/state/gl-object-get-calls.html [ Failure ] +crbug.com/1221365 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/data/gles3/shaders/conversions.html [ Failure ] +crbug.com/1221365 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/data/gles3/shaders/swizzles.html [ Failure ] +crbug.com/1221366 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/shaderderivate_dfdx.html [ Failure ] +crbug.com/1221366 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/shaderderivate_dfdy.html [ Failure ] +crbug.com/1221366 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/shaderderivate_fwidth.html [ Failure ] +crbug.com/1223529 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/vertexarrays/single_attribute.normalize.html [ Failure ] +crbug.com/1223529 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/vertexarrays/single_attribute.output_type.unsigned_int.html [ Failure ] +crbug.com/1223538 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/shaderoperator/unary_operator_01.html [ Failure ] +crbug.com/1223538 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/shaderoperator/unary_operator_02.html [ Failure ] +crbug.com/1223542 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/framebufferblit/rect_03.html [ Failure ] +crbug.com/1223542 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/framebufferblit/rect_04.html [ Failure ] +crbug.com/1231760 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/fbomultisample.2_samples.html [ Failure ] +crbug.com/1231760 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/fbomultisample.4_samples.html [ Failure ] +crbug.com/1231762 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/fboinvalidate/sub.html [ Failure ] +crbug.com/1231762 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/fboinvalidate/whole.html [ Failure ] +crbug.com/1232102 [ chromeos chromeos-board-amd64-generic no-passthrough ] conformance/context/context-attributes-alpha-depth-stencil-antialias.html [ Failure ] +crbug.com/1232106 [ chromeos chromeos-board-amd64-generic no-passthrough ] conformance/extensions/webgl-compressed-texture-astc.html [ Failure ] +crbug.com/1232112 [ chromeos chromeos-board-amd64-generic no-passthrough ] conformance/textures/misc/texture-size-limit.html [ Failure ] +crbug.com/1232118 [ chromeos chromeos-board-amd64-generic no-passthrough ] conformance/uniforms/uniform-samplers-test.html [ Failure ] +crbug.com/1232120 [ chromeos chromeos-board-amd64-generic no-passthrough ] conformance2/rendering/clipping-wide-points.html [ Failure ] +crbug.com/1232123 [ chromeos chromeos-board-amd64-generic no-passthrough ] conformance2/rendering/line-rendering-quality.html [ Failure ] +crbug.com/1232125 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/fbocompleteness.html [ Failure ] +crbug.com/1232128 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/fbodepthbuffer.html [ Failure ] +crbug.com/1232129 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/integerstatequery.html [ Failure ] +crbug.com/1232130 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/multisample/fbo_max_samples.html [ Failure ] +crbug.com/1232131 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/negativebufferapi.html [ Failure ] +crbug.com/1232132 [ chromeos chromeos-board-amd64-generic no-passthrough ] deqp/functional/gles3/shaderindexing/tmp.html [ Failure ] +crbug.com/1238075 [ chromeos chromeos-board-amd64-generic no-passthrough ] conformance/rendering/gl-scissor-test.html [ Failure ] + +crbug.com/1211588 [ chromeos chromeos-board-kevin no-passthrough ] deqp/functional/gles3/transformfeedback/* [ Failure ] +crbug.com/1213198 [ chromeos chromeos-board-kevin no-passthrough ] WebglExtension_EXT_texture_compression_bptc [ Failure ] +crbug.com/1213198 [ chromeos chromeos-board-kevin no-passthrough ] WebglExtension_EXT_texture_compression_rgtc [ Failure ] +crbug.com/1213198 [ chromeos chromeos-board-kevin no-passthrough ] WebglExtension_EXT_texture_filter_anisotropic [ Failure ] +crbug.com/1213198 [ chromeos chromeos-board-kevin no-passthrough ] WebglExtension_EXT_texture_norm16 [ Failure ] +crbug.com/1213198 [ chromeos chromeos-board-kevin no-passthrough ] WebglExtension_OES_texture_float_linear [ Failure ] +crbug.com/1213198 [ chromeos chromeos-board-kevin no-passthrough ] WebglExtension_OVR_multiview2 [ Failure ] +crbug.com/1213198 [ chromeos chromeos-board-kevin no-passthrough ] WebglExtension_WEBGL_compressed_texture_pvrtc [ Failure ] +crbug.com/1213198 [ chromeos chromeos-board-kevin no-passthrough ] WebglExtension_WEBGL_compressed_texture_s3tc [ Failure ] +crbug.com/1213198 [ chromeos chromeos-board-kevin no-passthrough ] WebglExtension_WEBGL_compressed_texture_s3tc_srgb [ Failure ] +crbug.com/1213198 [ chromeos chromeos-board-kevin no-passthrough ] WebglExtension_WEBGL_draw_instanced_base_vertex_base_instance [ Failure ] +crbug.com/1213198 [ chromeos chromeos-board-kevin no-passthrough ] WebglExtension_WEBGL_multi_draw_instanced_base_vertex_base_instance [ Failure ] +crbug.com/1213198 [ chromeos chromeos-board-kevin no-passthrough ] conformance/extensions/ext-float-blend.html [ Failure ] +crbug.com/1215695 [ chromeos chromeos-board-kevin no-passthrough ] deqp/functional/gles3/fbocolorbuffer/tex2d_00.html [ Failure ] +crbug.com/1215695 [ chromeos chromeos-board-kevin no-passthrough ] deqp/functional/gles3/fbocolorbuffer/tex2darray_00.html [ Failure ] +crbug.com/1215695 [ chromeos chromeos-board-kevin no-passthrough ] deqp/functional/gles3/fbocolorbuffer/tex2darray_01.html [ Failure ] +crbug.com/1215695 [ chromeos chromeos-board-kevin no-passthrough ] deqp/functional/gles3/fbocolorbuffer/tex3d_00.html [ Failure ] +crbug.com/1215695 [ chromeos chromeos-board-kevin no-passthrough ] deqp/functional/gles3/fbocolorbuffer/texcube_00.html [ Failure ] +crbug.com/1215695 [ chromeos chromeos-board-kevin no-passthrough ] deqp/functional/gles3/fbocolorbuffer/texcube_01.html [ Failure ] +crbug.com/1215698 [ chromeos chromeos-board-kevin no-passthrough ] deqp/functional/gles3/fborender/recreate_color_01.html [ Failure ] +crbug.com/1215698 [ chromeos chromeos-board-kevin no-passthrough ] deqp/functional/gles3/fborender/recreate_color_04.html [ Failure ] +crbug.com/1215698 [ chromeos chromeos-board-kevin no-passthrough ] deqp/functional/gles3/fborender/recreate_color_05.html [ Failure ] +crbug.com/1215698 [ chromeos chromeos-board-kevin no-passthrough ] deqp/functional/gles3/fborender/recreate_color_06.html [ Failure ] +crbug.com/1215698 [ chromeos chromeos-board-kevin no-passthrough ] deqp/functional/gles3/fborender/resize_00.html [ Failure ] +crbug.com/1215698 [ chromeos chromeos-board-kevin no-passthrough ] deqp/functional/gles3/fborender/resize_01.html [ Failure ] +crbug.com/1215698 [ chromeos chromeos-board-kevin no-passthrough ] deqp/functional/gles3/fborender/resize_02.html [ Failure ] +crbug.com/1215698 [ chromeos chromeos-board-kevin no-passthrough ] deqp/functional/gles3/fborender/resize_03.html [ Failure ] +crbug.com/1218157 [ chromeos chromeos-board-kevin no-passthrough ] conformance/offscreencanvas/context-lost-restored.html [ Failure ] +crbug.com/1218157 [ chromeos chromeos-board-kevin no-passthrough ] conformance/offscreencanvas/context-lost-restored-worker.html [ Failure ] +crbug.com/1218162 [ chromeos chromeos-board-kevin no-passthrough ] deqp/functional/gles3/uniformbuffers/instance_array_basic_type.html [ Failure ] +crbug.com/1218162 [ chromeos chromeos-board-kevin no-passthrough ] deqp/functional/gles3/uniformbuffers/random.html [ Failure ] +crbug.com/1218162 [ chromeos chromeos-board-kevin no-passthrough ] deqp/functional/gles3/uniformbuffers/single_basic_array.html [ Failure ] +crbug.com/1218162 [ chromeos chromeos-board-kevin no-passthrough ] deqp/functional/gles3/uniformbuffers/single_basic_type.html [ Failure ] +crbug.com/1218169 [ chromeos chromeos-board-kevin no-passthrough ] deqp/functional/gles3/fragmentoutput/array.float.html [ Failure ] +crbug.com/1218169 [ chromeos chromeos-board-kevin no-passthrough ] deqp/functional/gles3/fragmentoutput/basic.float.html [ Failure ] +crbug.com/1218509 [ chromeos chromeos-board-kevin no-passthrough ] deqp/functional/gles3/fbomultisample.8_samples.html [ Failure ] +crbug.com/1218512 [ chromeos chromeos-board-kevin no-passthrough ] deqp/functional/gles3/shadertexturefunction/texturelodoffset.html [ Failure ] +crbug.com/1218516 [ chromeos chromeos-board-kevin no-passthrough ] deqp/data/gles3/shaders/arrays.html [ Failure ] +crbug.com/1218607 [ chromeos chromeos-board-kevin no-passthrough ] conformance2/reading/read-pixels-from-fbo-test.html [ Failure ] +crbug.com/1218607 [ chromeos chromeos-board-kevin no-passthrough ] conformance2/reading/read-pixels-pack-parameters.html [ Failure ] +crbug.com/1218612 [ chromeos chromeos-board-kevin no-passthrough ] conformance2/glsl3/array-as-return-value.html [ Failure ] +crbug.com/1218612 [ chromeos chromeos-board-kevin no-passthrough ] conformance2/glsl3/matrix-row-major.html [ Failure ] +crbug.com/1218612 [ chromeos chromeos-board-kevin no-passthrough ] conformance2/glsl3/tricky-loop-conditions.html [ Failure ] +crbug.com/1218612 [ chromeos chromeos-board-kevin no-passthrough ] conformance2/glsl3/uninitialized-local-global-variables.html [ Failure ] +crbug.com/1218615 [ chromeos chromeos-board-kevin no-passthrough ] conformance2/extensions/ext-color-buffer-float.html [ Failure ] +crbug.com/1219024 [ chromeos chromeos-board-kevin no-passthrough ] conformance/glsl/bugs/constant-precision-qualifier.html [ Failure ] +crbug.com/1219024 [ chromeos chromeos-board-kevin no-passthrough ] conformance/misc/shader-precision-format.html [ Failure ] +crbug.com/1219024 [ chromeos chromeos-board-kevin no-passthrough ] conformance/rendering/blending.html [ Failure ] +crbug.com/1219024 [ chromeos chromeos-board-kevin no-passthrough ] conformance2/rendering/framebuffer-render-to-layer.html [ Failure ] +crbug.com/1219055 [ chromeos chromeos-board-kevin no-passthrough ] conformance2/textures/misc/generate-mipmap-with-large-base-level.html [ Failure ] +crbug.com/1219057 [ chromeos chromeos-board-kevin no-passthrough ] conformance2/buffers/uniform-buffers.html [ Failure ] + +############################## +# Lacros-like Linux Failures # +############################## + +crbug.com/1210240 [ linux intel display-server-wayland no-passthrough ] conformance2/textures/canvas_sub_rectangle/tex-3d* [ Failure ] +crbug.com/1210240 [ linux intel display-server-wayland no-passthrough ] conformance2/textures/webgl_canvas/tex-2d-r8ui-red_integer-unsigned_byte.html [ Failure ] +crbug.com/1210240 [ linux intel display-server-wayland no-passthrough ] conformance2/textures/canvas_sub_rectangle/tex-2d-r8ui-red_integer-unsigned_byte.html [ Failure ] +crbug.com/1210240 [ linux intel display-server-wayland no-passthrough ] conformance2/textures/webgl_canvas/tex-3d* [ Failure ] +crbug.com/1215700 [ linux intel display-server-wayland no-passthrough ] deqp/functional/gles3/negativetextureapi.html [ Failure ] +crbug.com/1218607 [ linux intel display-server-wayland no-passthrough ] conformance2/reading/read-pixels-from-fbo-test.html [ Failure ] +crbug.com/1231736 [ linux intel display-server-wayland no-passthrough ] deqp/functional/gles3/clipping.html [ Failure ] + # Conflicting expectations to test that the # "Expectations have no collisions" unittest works.
diff --git a/content/test/gpu/unexpected_passes/gpu_queries.py b/content/test/gpu/unexpected_passes/gpu_queries.py index b7a0269..871609a 100644 --- a/content/test/gpu/unexpected_passes/gpu_queries.py +++ b/content/test/gpu/unexpected_passes/gpu_queries.py
@@ -181,6 +181,11 @@ target_num_ids = TARGET_RESULTS_PER_QUERY / self._num_samples return GpuSplitQueryGenerator(builder_type, test_ids, target_num_ids) + def _GetRelevantExpectationFilesForQueryResult(self, _): + # Only one expectation file is ever used for the GPU tests, so just use + # whichever one we've read in. + return None + def _GetSuiteFilterClause(self): """Returns a SQL clause to only include relevant suites.
diff --git a/content/test/gpu/unexpected_passes/gpu_queries_unittest.py b/content/test/gpu/unexpected_passes/gpu_queries_unittest.py index 5901852..855960b 100755 --- a/content/test/gpu/unexpected_passes/gpu_queries_unittest.py +++ b/content/test/gpu/unexpected_passes/gpu_queries_unittest.py
@@ -72,16 +72,18 @@ querier = gpu_uu.CreateGenericGpuQuerier(suite='webgl_conformance1') self._popen_mock.return_value = uu.FakeProcess( stdout=json.dumps(query_results)) - results = querier.QueryBuilder('builder', 'ci') + results, expectation_files = querier.QueryBuilder('builder', 'ci') self.assertEqual(len(results), 1) + self.assertIsNone(expectation_files) self.assertEqual( results[0], data_types.Result('test_name', ['webgl-version-1'], 'Failure', 'step_name', '1234')) querier = gpu_uu.CreateGenericGpuQuerier(suite='webgl_conformance2') - results = querier.QueryBuilder('builder', 'ci') + results, expectation_files = querier.QueryBuilder('builder', 'ci') self.assertEqual(len(results), 1) + self.assertIsNone(expectation_files) self.assertEqual( results[0], data_types.Result('test_name', ['webgl-version-2'], 'Failure',
diff --git a/device/fido/features.cc b/device/fido/features.cc index 2036780..06cc056 100644 --- a/device/fido/features.cc +++ b/device/fido/features.cc
@@ -58,4 +58,7 @@ base::FEATURE_ENABLED_BY_DEFAULT}; #endif // BUILDFLAG(IS_CHROMEOS_ASH) +extern const base::Feature kU2fPermissionPrompt{ + "U2fPermissionPrompt", base::FEATURE_ENABLED_BY_DEFAULT}; + } // namespace device
diff --git a/device/fido/features.h b/device/fido/features.h index e3243f6..3c6b64d 100644 --- a/device/fido/features.h +++ b/device/fido/features.h
@@ -47,6 +47,9 @@ extern const base::Feature kWebAuthCrosPlatformAuthenticator; #endif // BUILDFLAG(IS_CHROMEOS_ASH) +COMPONENT_EXPORT(DEVICE_FIDO) +extern const base::Feature kU2fPermissionPrompt; + } // namespace device #endif // DEVICE_FIDO_FEATURES_H_
diff --git a/docs/android_dynamic_feature_modules.md b/docs/android_dynamic_feature_modules.md index 86f96f6..280996eb 100644 --- a/docs/android_dynamic_feature_modules.md +++ b/docs/android_dynamic_feature_modules.md
@@ -822,12 +822,13 @@ ``` To test on-demand install, "fake-install" the DFM. It's fake because -the DFM is not installed as a true split. Instead it will be emulated by Chrome. +the DFM is not installed as a true split. Instead it will be emulated by play +core's `--local-testing` [mode][play-core-local-testing]. Fake-install and launch Chrome with the following command: ```shell $ $OUTDIR/bin/monochrome_public_bundle install -m base -f foo -$ $OUTDIR/bin/monochrome_public_bundle launch --args="--fake-feature-module-install" +$ $OUTDIR/bin/monochrome_public_bundle launch ``` When running the install code, the Foo DFM module will be emulated. @@ -945,3 +946,5 @@ You may also have to add `java` as a dependency of `chrome_test_java` if you want to call into Foo from test code. + +[play-core-local-testing]: https://developer.android.com/guide/playcore/feature-delivery/on-demand#local-testing \ No newline at end of file
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h index 31f6943..14f64ee 100644 --- a/extensions/browser/extension_function_histogram_value.h +++ b/extensions/browser/extension_function_histogram_value.h
@@ -1631,6 +1631,7 @@ OS_TELEMETRY_GETOEMDATA = 1568, SCRIPTING_UNREGISTERCONTENTSCRIPTS = 1569, FILEMANAGERPRIVATE_GETZIPPROGRESS = 1570, + CRYPTOTOKENPRIVATE_CANMAKEU2FAPIREQUEST = 1571, // Last entry: Add new entries above, then run: // python tools/metrics/histograms/update_extension_histograms.py ENUM_BOUNDARY
diff --git a/extensions/renderer/api/automation/automation_internal_custom_bindings.cc b/extensions/renderer/api/automation/automation_internal_custom_bindings.cc index 0a9db83..7447b60 100644 --- a/extensions/renderer/api/automation/automation_internal_custom_bindings.cc +++ b/extensions/renderer/api/automation/automation_internal_custom_bindings.cc
@@ -2424,6 +2424,11 @@ SendChildTreeIDEvent(child_tree_id); } + // At this point, don't bother dispatching to js if the node is ignored. A js + // client shouldn't process ignored nodes. + if (node->IsIgnored()) + return false; + bool has_filter = false; if (tree_change_observer_overall_filter_ & (1
diff --git a/gpu/command_buffer/service/external_vk_image_dawn_representation.cc b/gpu/command_buffer/service/external_vk_image_dawn_representation.cc index 867c51c..65a2db1 100644 --- a/gpu/command_buffer/service/external_vk_image_dawn_representation.cc +++ b/gpu/command_buffer/service/external_vk_image_dawn_representation.cc
@@ -47,7 +47,6 @@ } WGPUTextureDescriptor texture_descriptor = {}; - texture_descriptor.nextInChain = nullptr; texture_descriptor.format = wgpu_format_; texture_descriptor.usage = usage; texture_descriptor.dimension = WGPUTextureDimension_2D; @@ -56,6 +55,14 @@ texture_descriptor.mipLevelCount = 1; texture_descriptor.sampleCount = 1; + // We need to have an internal usage of CopySrc in order to use + // CopyTextureToTextureInternal. + WGPUDawnTextureInternalUsageDescriptor internalDesc = {}; + internalDesc.chain.sType = WGPUSType_DawnTextureInternalUsageDescriptor; + internalDesc.internalUsage = WGPUTextureUsage_CopySrc; + texture_descriptor.nextInChain = + reinterpret_cast<WGPUChainedStruct*>(&internalDesc); + dawn_native::vulkan::ExternalImageDescriptorOpaqueFD descriptor = {}; descriptor.cTextureDescriptor = &texture_descriptor; descriptor.isInitialized = IsCleared();
diff --git a/gpu/command_buffer/service/external_vk_image_factory_unittest.cc b/gpu/command_buffer/service/external_vk_image_factory_unittest.cc index 422eee8..b0131b8 100644 --- a/gpu/command_buffer/service/external_vk_image_factory_unittest.cc +++ b/gpu/command_buffer/service/external_vk_image_factory_unittest.cc
@@ -103,7 +103,13 @@ DawnProcTable procs = dawn_native::GetProcs(); dawnProcSetProcs(&procs); - dawn_device_ = wgpu::Device::Acquire(adapter_it->CreateDevice()); + dawn_native::DeviceDescriptor device_descriptor; + // We need to request internal usage to be able to do operations with + // internal methods that would need specific usages. + device_descriptor.requiredExtensions.push_back("dawn-internal-usages"); + + dawn_device_ = + wgpu::Device::Acquire(adapter_it->CreateDevice(&device_descriptor)); DCHECK(dawn_device_) << "Failed to create Dawn device"; #endif // BUILDFLAG(USE_DAWN) }
diff --git a/gpu/command_buffer/service/raster_decoder.cc b/gpu/command_buffer/service/raster_decoder.cc index ba87b34..f8a9ea8 100644 --- a/gpu/command_buffer/service/raster_decoder.cc +++ b/gpu/command_buffer/service/raster_decoder.cc
@@ -734,6 +734,25 @@ GLuint v_offset, GLuint v_stride, const volatile GLbyte* mailbox); + + // Return true if all of `sk_yuv_color_space`, `sk_plane_config`, + // `sk_subsampling`, `rgba_image, `num_yuva_images`, and `yuva_images` were + // successfully populated. Return false on error. If this returns false, some + // of the output arguments may be left populated. + bool ConvertYUVACommon( + const char* function_name, + GLenum yuv_color_space, + GLenum plane_config, + GLenum subsampling, + const volatile GLbyte* raw_mailboxes, + SkYUVColorSpace& sk_yuv_color_space, + SkYUVAInfo::PlaneConfig& sk_plane_config, + SkYUVAInfo::Subsampling& sk_subsampling, + std::unique_ptr<SharedImageRepresentationSkia>& rgba_image, + int& num_yuva_images, + std::array<std::unique_ptr<SharedImageRepresentationSkia>, + SkYUVAInfo::kMaxPlanes>& yuva_images); + void DoConvertYUVAMailboxesToRGBINTERNAL(GLenum yuv_color_space, GLenum plane_config, GLenum subsampling, @@ -3102,81 +3121,105 @@ *result = 1; } +bool RasterDecoderImpl::ConvertYUVACommon( + const char* function_name, + GLenum yuv_color_space_in, + GLenum plane_config_in, + GLenum subsampling_in, + const volatile GLbyte* mailboxes_in, + SkYUVColorSpace& sk_yuv_color_space, + SkYUVAInfo::PlaneConfig& sk_plane_config, + SkYUVAInfo::Subsampling& sk_subsampling, + std::unique_ptr<SharedImageRepresentationSkia>& rgba_image, + int& num_yuva_planes, + std::array<std::unique_ptr<SharedImageRepresentationSkia>, + SkYUVAInfo::kMaxPlanes>& yuva_images) { + if (yuv_color_space_in > kLastEnum_SkYUVColorSpace) { + LOCAL_SET_GL_ERROR(GL_INVALID_ENUM, function_name, + "yuv_color_space must be a valid SkYUVColorSpace"); + return false; + } + sk_yuv_color_space = static_cast<SkYUVColorSpace>(yuv_color_space_in); + if (plane_config_in > static_cast<GLenum>(SkYUVAInfo::PlaneConfig::kLast)) { + LOCAL_SET_GL_ERROR(GL_INVALID_ENUM, function_name, + "plane_config must be a valid SkYUVAInfo::PlaneConfig"); + return false; + } + sk_plane_config = static_cast<SkYUVAInfo::PlaneConfig>(plane_config_in); + if (subsampling_in > static_cast<GLenum>(SkYUVAInfo::Subsampling::kLast)) { + LOCAL_SET_GL_ERROR(GL_INVALID_ENUM, function_name, + "subsampling must be a valid SkYUVAInfo::Subsampling"); + return false; + } + sk_subsampling = static_cast<SkYUVAInfo::Subsampling>(subsampling_in); + + std::array<gpu::Mailbox, SkYUVAInfo::kMaxPlanes> yuva_mailboxes; + num_yuva_planes = SkYUVAInfo::NumPlanes(sk_plane_config); + for (int i = 0; i < num_yuva_planes; ++i) { + yuva_mailboxes[i] = Mailbox::FromVolatile( + reinterpret_cast<const volatile Mailbox*>(mailboxes_in)[i]); + DLOG_IF(ERROR, !yuva_mailboxes[i].Verify()) + << function_name + << " was " + "passed an invalid mailbox for YUVA plane: " + << i << " with plane config " << plane_config_in; + } + gpu::Mailbox rgba_mailbox; + rgba_mailbox = + Mailbox::FromVolatile(reinterpret_cast<const volatile Mailbox*>( + mailboxes_in)[SkYUVAInfo::kMaxPlanes]); + DLOG_IF(ERROR, !rgba_mailbox.Verify()) + << function_name + << " was " + "passed an invalid mailbox for RGBA"; + + for (int i = 0; i < num_yuva_planes; ++i) { + yuva_images[i] = shared_image_representation_factory_.ProduceSkia( + yuva_mailboxes[i], shared_context_state_); + if (!yuva_images[i]) { + LOCAL_SET_GL_ERROR( + GL_INVALID_OPERATION, function_name, + ("Attempting to operate on unknown mailbox for plane index " + + base::NumberToString(i) + " using plane config " + + base::NumberToString(plane_config_in) + ".") + .c_str()); + return false; + } + } + rgba_image = shared_image_representation_factory_.ProduceSkia( + rgba_mailbox, shared_context_state_); + if (!rgba_image) { + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "ConvertYUVAMailboxesToRGB", + "Attempting to operate on unknown dest mailbox."); + return false; + } + return true; +} + void RasterDecoderImpl::DoConvertYUVAMailboxesToRGBINTERNAL( GLenum planes_yuv_color_space, GLenum plane_config, GLenum subsampling, const volatile GLbyte* mailboxes_in) { - if (planes_yuv_color_space > kLastEnum_SkYUVColorSpace) { - LOCAL_SET_GL_ERROR( - GL_INVALID_ENUM, "glConvertYUVAMailboxesToRGB", - "planes_yuv_color_space must be a valid SkYUVColorSpace"); - return; - } - if (plane_config > static_cast<GLenum>(SkYUVAInfo::PlaneConfig::kLast)) { - LOCAL_SET_GL_ERROR(GL_INVALID_ENUM, "glConvertYUVAMailboxesToRGB", - "plane_config must be a valid SkYUVAInfo::PlaneConfig"); - return; - } - if (subsampling > static_cast<GLenum>(SkYUVAInfo::Subsampling::kLast)) { - LOCAL_SET_GL_ERROR(GL_INVALID_ENUM, "glConvertYUVAMailboxesToRGB", - "subsampling must be a valid SkYUVAInfo::Subsampling"); - return; - } - SkYUVColorSpace src_color_space = - static_cast<SkYUVColorSpace>(planes_yuv_color_space); - SkYUVAInfo::PlaneConfig src_plane_config = - static_cast<SkYUVAInfo::PlaneConfig>(plane_config); - SkYUVAInfo::Subsampling src_subsampling = - static_cast<SkYUVAInfo::Subsampling>(subsampling); - - static constexpr size_t kNumInputMailboxes = SkYUVAInfo::kMaxPlanes; - static constexpr size_t kTotalMailboxes = kNumInputMailboxes + 1; - static constexpr size_t kDestIndex = kTotalMailboxes - 1; - int num_src_planes = SkYUVAInfo::NumPlanes(src_plane_config); - - std::array<gpu::Mailbox, kTotalMailboxes> mailboxes; - for (int i = 0; i < num_src_planes; ++i) { - mailboxes[i] = Mailbox::FromVolatile( - reinterpret_cast<const volatile Mailbox*>(mailboxes_in)[i]); - DLOG_IF(ERROR, !mailboxes[i].Verify()) - << "ConvertYUVAMailboxesToRGB was " - "passed an invalid mailbox for src plane: " - << i << " with plane config " << plane_config; - } - mailboxes[kDestIndex] = Mailbox::FromVolatile( - reinterpret_cast<const volatile Mailbox*>(mailboxes_in)[kDestIndex]); - DLOG_IF(ERROR, !mailboxes[kDestIndex].Verify()) - << "ConvertYUVAMailboxesToRGB was " - "passed an invalid mailbox for dest"; - - std::array<std::unique_ptr<SharedImageRepresentationSkia>, kTotalMailboxes> - images; - for (int i = 0; i < num_src_planes; ++i) { - images[i] = shared_image_representation_factory_.ProduceSkia( - mailboxes[i], shared_context_state_); - if (!images[i]) { - LOCAL_SET_GL_ERROR( - GL_INVALID_OPERATION, "glConvertYUVAMailboxesToRGB", - ("Attempting to operate on unknown mailbox for plane index " + - base::NumberToString(i) + " using plane config " + - base::NumberToString(plane_config) + ".") - .c_str()); - return; - } - } - images[kDestIndex] = shared_image_representation_factory_.ProduceSkia( - mailboxes[kDestIndex], shared_context_state_); - if (!images[kDestIndex]) { - LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glConvertYUVAMailboxesToRGB", - "Attempting to operate on unknown dest mailbox."); + SkYUVColorSpace src_color_space; + SkYUVAInfo::PlaneConfig src_plane_config; + SkYUVAInfo::Subsampling src_subsampling; + std::unique_ptr<SharedImageRepresentationSkia> rgba_image; + int num_src_planes; + std::array<std::unique_ptr<SharedImageRepresentationSkia>, + SkYUVAInfo::kMaxPlanes> + yuva_images; + if (!ConvertYUVACommon("ConvertYUVAMailboxesToRGB", planes_yuv_color_space, + plane_config, subsampling, mailboxes_in, + src_color_space, src_plane_config, src_subsampling, + rgba_image, num_src_planes, yuva_images)) { return; } std::vector<GrBackendSemaphore> begin_semaphores; std::vector<GrBackendSemaphore> end_semaphores; - auto dest_scoped_access = images[kDestIndex]->BeginScopedWriteAccess( + auto dest_scoped_access = rgba_image->BeginScopedWriteAccess( &begin_semaphores, &end_semaphores, SharedImageRepresentation::AllowUnclearedAccess::kYes); if (!dest_scoped_access) { @@ -3188,11 +3231,11 @@ bool source_access_valid = true; std::array<std::unique_ptr<SharedImageRepresentationSkia::ScopedReadAccess>, - kNumInputMailboxes> + SkYUVAInfo::kMaxPlanes> source_scoped_access; for (int i = 0; i < num_src_planes; ++i) { - source_scoped_access[i] = - images[i]->BeginScopedReadAccess(&begin_semaphores, &end_semaphores); + source_scoped_access[i] = yuva_images[i]->BeginScopedReadAccess( + &begin_semaphores, &end_semaphores); if (!source_scoped_access[i]) { LOCAL_SET_GL_ERROR( @@ -3216,7 +3259,7 @@ bool drew_image = false; if (source_access_valid) { - std::array<GrBackendTexture, kNumInputMailboxes> yuva_textures; + std::array<GrBackendTexture, SkYUVAInfo::kMaxPlanes> yuva_textures; for (int i = 0; i < num_src_planes; ++i) { yuva_textures[i] = source_scoped_access[i]->promise_image_texture()->backendTexture(); @@ -3245,8 +3288,8 @@ FlushAndSubmitIfNecessary(dest_scoped_access->surface(), std::move(end_semaphores)); - if (!images[kDestIndex]->IsCleared() && drew_image) { - images[kDestIndex]->SetCleared(); + if (!rgba_image->IsCleared() && drew_image) { + rgba_image->SetCleared(); } }
diff --git a/gpu/command_buffer/service/shared_image_backing_d3d.cc b/gpu/command_buffer/service/shared_image_backing_d3d.cc index 91ce315a..0541dc4 100644 --- a/gpu/command_buffer/service/shared_image_backing_d3d.cc +++ b/gpu/command_buffer/service/shared_image_backing_d3d.cc
@@ -455,7 +455,6 @@ } WGPUTextureDescriptor texture_descriptor = {}; - texture_descriptor.nextInChain = nullptr; texture_descriptor.format = wgpu_format; texture_descriptor.usage = GetAllowedDawnUsages(); texture_descriptor.dimension = WGPUTextureDimension_2D; @@ -464,6 +463,14 @@ texture_descriptor.mipLevelCount = 1; texture_descriptor.sampleCount = 1; + // We need to have an internal usage of CopySrc in order to use + // CopyTextureToTextureInternal. + WGPUDawnTextureInternalUsageDescriptor internalDesc = {}; + internalDesc.chain.sType = WGPUSType_DawnTextureInternalUsageDescriptor; + internalDesc.internalUsage = WGPUTextureUsage_CopySrc; + texture_descriptor.nextInChain = + reinterpret_cast<WGPUChainedStruct*>(&internalDesc); + #if BUILDFLAG(DAWN_ENABLE_BACKEND_OPENGLES) if (backend_type == WGPUBackendType_OpenGLES) { // EGLImage textures do not support sampling, at the moment.
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_d3d_unittest.cc b/gpu/command_buffer/service/shared_image_backing_factory_d3d_unittest.cc index 14764ec..7c56f64 100644 --- a/gpu/command_buffer/service/shared_image_backing_factory_d3d_unittest.cc +++ b/gpu/command_buffer/service/shared_image_backing_factory_d3d_unittest.cc
@@ -555,7 +555,13 @@ }); ASSERT_NE(adapter_it, adapters.end()); - wgpu::Device device = wgpu::Device::Acquire(adapter_it->CreateDevice()); + dawn_native::DeviceDescriptor device_descriptor; + // We need to request internal usage to be able to do operations with + // internal methods that would need specific usages. + device_descriptor.requiredExtensions.push_back("dawn-internal-usages"); + + wgpu::Device device = + wgpu::Device::Acquire(adapter_it->CreateDevice(&device_descriptor)); DawnProcTable procs = dawn_native::GetProcs(); dawnProcSetProcs(&procs); @@ -692,7 +698,13 @@ }); ASSERT_NE(adapter_it, adapters.end()); - wgpu::Device device = wgpu::Device::Acquire(adapter_it->CreateDevice()); + dawn_native::DeviceDescriptor device_descriptor; + // We need to request internal usage to be able to do operations with + // internal methods that would need specific usages. + device_descriptor.requiredExtensions.push_back("dawn-internal-usages"); + + wgpu::Device device = + wgpu::Device::Acquire(adapter_it->CreateDevice(&device_descriptor)); DawnProcTable procs = dawn_native::GetProcs(); dawnProcSetProcs(&procs); { @@ -776,7 +788,13 @@ }); ASSERT_NE(adapter_it, adapters.end()); - wgpu::Device device = wgpu::Device::Acquire(adapter_it->CreateDevice()); + dawn_native::DeviceDescriptor device_descriptor; + // We need to request internal usage to be able to do operations with + // internal methods that would need specific usages. + device_descriptor.requiredExtensions.push_back("dawn-internal-usages"); + + wgpu::Device device = + wgpu::Device::Acquire(adapter_it->CreateDevice(&device_descriptor)); DawnProcTable procs = dawn_native::GetProcs(); dawnProcSetProcs(&procs); { @@ -980,7 +998,13 @@ }); ASSERT_NE(adapter_it, adapters.end()); - wgpu::Device device = wgpu::Device::Acquire(adapter_it->CreateDevice()); + dawn_native::DeviceDescriptor device_descriptor; + // We need to request internal usage to be able to do operations with + // internal methods that would need specific usages. + device_descriptor.requiredExtensions.push_back("dawn-internal-usages"); + + wgpu::Device device = + wgpu::Device::Acquire(adapter_it->CreateDevice(&device_descriptor)); DawnProcTable procs = dawn_native::GetProcs(); dawnProcSetProcs(&procs); @@ -1102,7 +1126,13 @@ }); ASSERT_NE(adapter_it, adapters.end()); - wgpu::Device device = wgpu::Device::Acquire(adapter_it->CreateDevice()); + dawn_native::DeviceDescriptor device_descriptor; + // We need to request internal usage to be able to do operations with + // internal methods that would need specific usages. + device_descriptor.requiredExtensions.push_back("dawn-internal-usages"); + + wgpu::Device device = + wgpu::Device::Acquire(adapter_it->CreateDevice(&device_descriptor)); DawnProcTable procs = dawn_native::GetProcs(); dawnProcSetProcs(&procs);
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_iosurface.mm b/gpu/command_buffer/service/shared_image_backing_factory_iosurface.mm index 33c146c..e36c27f 100644 --- a/gpu/command_buffer/service/shared_image_backing_factory_iosurface.mm +++ b/gpu/command_buffer/service/shared_image_backing_factory_iosurface.mm
@@ -112,7 +112,6 @@ WGPUTexture BeginAccess(WGPUTextureUsage usage) final { WGPUTextureDescriptor texture_descriptor = {}; - texture_descriptor.nextInChain = nullptr; texture_descriptor.format = wgpu_format_; texture_descriptor.usage = usage; texture_descriptor.dimension = WGPUTextureDimension_2D; @@ -121,6 +120,14 @@ texture_descriptor.mipLevelCount = 1; texture_descriptor.sampleCount = 1; + // We need to have an internal usage of CopySrc in order to use + // CopyTextureToTextureInternal. + WGPUDawnTextureInternalUsageDescriptor internalDesc = {}; + internalDesc.chain.sType = WGPUSType_DawnTextureInternalUsageDescriptor; + internalDesc.internalUsage = WGPUTextureUsage_CopySrc; + texture_descriptor.nextInChain = + reinterpret_cast<WGPUChainedStruct*>(&internalDesc); + dawn_native::metal::ExternalImageDescriptorIOSurface descriptor; descriptor.cTextureDescriptor = &texture_descriptor; descriptor.isInitialized = IsCleared();
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_iosurface_unittest.cc b/gpu/command_buffer/service/shared_image_backing_factory_iosurface_unittest.cc index f37ec78..6bbbaf5 100644 --- a/gpu/command_buffer/service/shared_image_backing_factory_iosurface_unittest.cc +++ b/gpu/command_buffer/service/shared_image_backing_factory_iosurface_unittest.cc
@@ -382,7 +382,13 @@ }); ASSERT_NE(adapter_it, adapters.end()); - wgpu::Device device = wgpu::Device::Acquire(adapter_it->CreateDevice()); + dawn_native::DeviceDescriptor device_descriptor; + // We need to request internal usage to be able to do operations with + // internal methods that would need specific usages. + device_descriptor.requiredExtensions.push_back("dawn-internal-usages"); + + wgpu::Device device = + wgpu::Device::Acquire(adapter_it->CreateDevice(&device_descriptor)); DawnProcTable procs = dawn_native::GetProcs(); dawnProcSetProcs(&procs); @@ -525,7 +531,13 @@ }); ASSERT_NE(adapter_it, adapters.end()); - wgpu::Device device = wgpu::Device::Acquire(adapter_it->CreateDevice()); + dawn_native::DeviceDescriptor device_descriptor; + // We need to request internal usage to be able to do operations with + // internal methods that would need specific usages. + device_descriptor.requiredExtensions.push_back("dawn-internal-usages"); + + wgpu::Device device = + wgpu::Device::Acquire(adapter_it->CreateDevice(&device_descriptor)); DawnProcTable procs = dawn_native::GetProcs(); dawnProcSetProcs(&procs); { @@ -607,7 +619,13 @@ }); ASSERT_NE(adapter_it, adapters.end()); - wgpu::Device device = wgpu::Device::Acquire(adapter_it->CreateDevice()); + dawn_native::DeviceDescriptor device_descriptor; + // We need to request internal usage to be able to do operations with + // internal methods that would need specific usages. + device_descriptor.requiredExtensions.push_back("dawn-internal-usages"); + + wgpu::Device device = + wgpu::Device::Acquire(adapter_it->CreateDevice(&device_descriptor)); DawnProcTable procs = dawn_native::GetProcs(); dawnProcSetProcs(&procs); {
diff --git a/gpu/command_buffer/service/shared_image_representation_dawn_ozone.cc b/gpu/command_buffer/service/shared_image_representation_dawn_ozone.cc index 421034c..65adb4b 100644 --- a/gpu/command_buffer/service/shared_image_representation_dawn_ozone.cc +++ b/gpu/command_buffer/service/shared_image_representation_dawn_ozone.cc
@@ -62,7 +62,6 @@ gfx::Size pixmap_size = pixmap_->GetBufferSize(); WGPUTextureDescriptor texture_descriptor = {}; - texture_descriptor.nextInChain = nullptr; texture_descriptor.format = format_; texture_descriptor.usage = usage; texture_descriptor.dimension = WGPUTextureDimension_2D; @@ -71,6 +70,14 @@ texture_descriptor.mipLevelCount = 1; texture_descriptor.sampleCount = 1; + // We need to have an internal usage of CopySrc in order to use + // CopyTextureToTextureInternal. + WGPUDawnTextureInternalUsageDescriptor internalDesc = {}; + internalDesc.chain.sType = WGPUSType_DawnTextureInternalUsageDescriptor; + internalDesc.internalUsage = WGPUTextureUsage_CopySrc; + texture_descriptor.nextInChain = + reinterpret_cast<WGPUChainedStruct*>(&internalDesc); + dawn_native::vulkan::ExternalImageDescriptorDmaBuf descriptor = {}; descriptor.cTextureDescriptor = &texture_descriptor; descriptor.isInitialized = IsCleared();
diff --git a/gpu/command_buffer/service/webgpu_decoder_impl.cc b/gpu/command_buffer/service/webgpu_decoder_impl.cc index 703dd4c..805cc1e14 100644 --- a/gpu/command_buffer/service/webgpu_decoder_impl.cc +++ b/gpu/command_buffer/service/webgpu_decoder_impl.cc
@@ -609,6 +609,10 @@ device_descriptor.requiredExtensions.push_back("invalid_extension"); } + // We need to request internal usage to be able to do operations with internal + // methods that would need specific usages. + device_descriptor.requiredExtensions.push_back("dawn-internal-usages"); + // If a new toggle is added here, ForceDawnTogglesForWebGPU() which collects // info for about:gpu should be updated as well.
diff --git a/gpu/ipc/common/gpu_channel.mojom b/gpu/ipc/common/gpu_channel.mojom index 2bdd3cb..ab9f8a0 100644 --- a/gpu/ipc/common/gpu_channel.mojom +++ b/gpu/ipc/common/gpu_channel.mojom
@@ -370,10 +370,11 @@ // Sets the size of DCOMPTexture. SetTextureSize(gfx.mojom.Size size); - // Binds the DCOMPTexture to a DCOMP surface handle. The surface handle is - // provided as token registered with the DCOMP surface handle registry in the - // GPU process. - SetSurfaceHandle(mojo_base.mojom.UnguessableToken surface_handle_token); + // Binds the DCOMPTexture to a DCOMP surface handle and returns whether the + // operation succeeded or not. The surface handle is provided as `token` + // registered with the DCOMP surface handle registry in the GPU process. + SetDCOMPSurfaceHandle(mojo_base.mojom.UnguessableToken token) + => (bool success); }; // Interface used by GPU to notify the client of a DCOMPTexture instance about @@ -387,10 +388,6 @@ // DCOMPTexture instance. OnSharedImageMailboxBound(Mailbox mailbox); - // Informs the client that DCOMP surface handle has been bound to the - // DCOMPTexture instance. - OnDCOMPSurfaceHandleBound(bool success); - // Informs the client of a change in video composition parameter. OnCompositionParamsChanged(gfx.mojom.Rect output_rect); };
diff --git a/gpu/ipc/service/BUILD.gn b/gpu/ipc/service/BUILD.gn index 0f57981767..bf6949e 100644 --- a/gpu/ipc/service/BUILD.gn +++ b/gpu/ipc/service/BUILD.gn
@@ -100,6 +100,7 @@ libs += [ "d3d11.lib", "dcomp.lib", + "dxguid.lib", ] } if (is_mac) {
diff --git a/gpu/ipc/service/dcomp_texture_win.cc b/gpu/ipc/service/dcomp_texture_win.cc index 76ea29a..949b84f 100644 --- a/gpu/ipc/service/dcomp_texture_win.cc +++ b/gpu/ipc/service/dcomp_texture_win.cc
@@ -135,22 +135,21 @@ } } -void DCOMPTexture::SetSurfaceHandle(const base::UnguessableToken& token) { +void DCOMPTexture::SetDCOMPSurfaceHandle( + const base::UnguessableToken& token, + SetDCOMPSurfaceHandleCallback callback) { DVLOG(1) << __func__; - bool succeeded = false; + base::win::ScopedHandle surface_handle = gl::DCOMPSurfaceRegistry::GetInstance()->TakeDCOMPSurfaceHandle(token); - if (surface_handle.IsValid()) { - surface_handle_.Set(surface_handle.Take()); - succeeded = true; - } else { + if (!surface_handle.IsValid()) { DLOG(ERROR) << __func__ << ": No surface registered for token " << token; + std::move(callback).Run(false); + return; } - if (client_) - client_->OnDCOMPSurfaceHandleBound(succeeded); - else - DLOG(ERROR) << "Unable to call client_->OnDCOMPSurfaceHandleBound"; + surface_handle_.Set(surface_handle.Take()); + std::move(callback).Run(true); } gpu::Mailbox DCOMPTexture::CreateSharedImage() {
diff --git a/gpu/ipc/service/dcomp_texture_win.h b/gpu/ipc/service/dcomp_texture_win.h index 79d87a5..9a9d4c6 100644 --- a/gpu/ipc/service/dcomp_texture_win.h +++ b/gpu/ipc/service/dcomp_texture_win.h
@@ -58,7 +58,8 @@ void StartListening( mojo::PendingAssociatedRemote<mojom::DCOMPTextureClient> client) override; void SetTextureSize(const gfx::Size& size) override; - void SetSurfaceHandle(const base::UnguessableToken& token) override; + void SetDCOMPSurfaceHandle(const base::UnguessableToken& token, + SetDCOMPSurfaceHandleCallback callback) override; gpu::Mailbox CreateSharedImage(); gfx::Rect GetParentWindowRect();
diff --git a/gpu/ipc/service/gpu_memory_buffer_factory_dxgi.cc b/gpu/ipc/service/gpu_memory_buffer_factory_dxgi.cc index c3f812cc..29725e4 100644 --- a/gpu/ipc/service/gpu_memory_buffer_factory_dxgi.cc +++ b/gpu/ipc/service/gpu_memory_buffer_factory_dxgi.cc
@@ -73,6 +73,10 @@ DLOG(ERROR) << "D3D11CreateDevice failed with error 0x" << std::hex << hr; return nullptr; } + + const char* kDebugName = "GPUIPC_GpuMemoryBufferFactoryDXGI"; + d3d11_device_->SetPrivateData(WKPDID_D3DDebugObjectName, strlen(kDebugName), + kDebugName); } DCHECK(d3d11_device_); return d3d11_device_;
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_mr.xtb index 4d628f47..6b4e8b6c 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_mr.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_mr.xtb
@@ -17,7 +17,7 @@ <translation id="1838412507805038478"><ph name="ISSUER" /> ने या वेबसाइटचे सर्टिफिकेट जारी केले हे Chromium ने पडताळले.</translation> <translation id="1843424232666537147">Chromium कडे अशी वैशिष्ट्ये आहेत जी तुम्हाला तुमचा इंटरनेट डेटा आणि तुम्ही किती द्रुतपणे वेबपृष्ठे लोड करण्यात सक्षम आहात हे व्यवस्थापित करण्यास मदत करतात. <ph name="BEGIN_LINK" />अधिक जाणून घ्या<ph name="END_LINK" /></translation> -<translation id="2006345422933397527">Chromium ला अपडेट तपासता आली नाहीत. तुमचे इंटरनेट कनेक्शन तपासून पाहा.</translation> +<translation id="2006345422933397527">Chromium ला अपडेट तपासता आली नाहीत. तुमचे इंटरनेट कनेक्शन तपासून पहा.</translation> <translation id="2054703085270098503">Chromium सह सुरक्षित राहा</translation> <translation id="2168108852149185974">Chromium क्रॅश होण्याचे कारण काही ॲड-ऑन आहेत. कृपया ती अनइंस्टॉल करा:</translation> <translation id="2178608107313874732">Chromium आत्ता तुमचा कॅमेरा वापरू शकत नाही</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_mr.xtb index 92193e9..bb44c34a 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_mr.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_mr.xtb
@@ -6,7 +6,7 @@ <translation id="1314663809820920746">तुम्ही तरीही या डिव्हाइसवर तुमचे सर्व बुकमार्क, इतिहास, पासवर्ड आणि इतर सेटिंग्ज पाहू शकता. तुम्ही बदल केल्यास, ते तुमच्या Google खाते मध्ये सिंक केले जाणार नाहीत.</translation> <translation id="1479202195792305274">तुम्ही तुमचे Google खाते वापरून साइन इन करता तेव्हा, Chrome तुमचे पासवर्ड तपासू शकते.</translation> <translation id="1493827051843127077">तुमच्या सर्व डिव्हाइसवर तुमचे टॅब, पासवर्ड आणि पेमेंटशी संबंधित माहिती सिंक करण्यासाठी Chrome डीफॉल्ट म्हणून सेट करा</translation> -<translation id="1504372625950710826">Chrome ला अपडेट तपासता आली नाहीत. तुमचे इंटरनेट कनेक्शन तपासून पाहा.</translation> +<translation id="1504372625950710826">Chrome ला अपडेट तपासता आली नाहीत. तुमचे इंटरनेट कनेक्शन तपासून पहा.</translation> <translation id="1682483655351012182">तुमचा Chrome डेटा सिंक करा</translation> <translation id="1759842336958782510">Chrome</translation> <translation id="1812249337131447686">Google कडे वापर आकडेवारी आणि क्रॅश अहवाल पाठवून Chrome मध्ये सुधारणा करण्यात मदत करा</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_az.xtb b/ios/chrome/app/strings/resources/ios_strings_az.xtb index 41adcfd..54a7609 100644 --- a/ios/chrome/app/strings/resources/ios_strings_az.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_az.xtb
@@ -149,6 +149,7 @@ <translation id="2421004566762153674">Üçüncü tərəf kukilərinin bloklanması</translation> <translation id="2421044535038393232">Redaktəyə Davam Edin</translation> <translation id="2435457462613246316">Parol görünsün</translation> +<translation id="2476359652512522418">Seçilməyib</translation> <translation id="2497852260688568942">Sinxronizasiya administratorunuz tərəfindən deaktiv edilib</translation> <translation id="2500374554657206846">Parolu Yadda Saxlamaq üçün Seçimlər</translation> <translation id="2523363575747517183">Bu veb sayt davamlı olaraq digər tətbiqi açmağa çalışır.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gl.xtb b/ios/chrome/app/strings/resources/ios_strings_gl.xtb index da63f73..3c85a73 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
@@ -149,6 +149,7 @@ <translation id="2421004566762153674">Bloqueando cookies de terceiros</translation> <translation id="2421044535038393232">Seguir editando</translation> <translation id="2435457462613246316">Mostrar contrasinal</translation> +<translation id="2476359652512522418">Non seleccionada</translation> <translation id="2497852260688568942">O administrador desactivou a sincronización</translation> <translation id="2500374554657206846">Opcións para gardar contrasinais</translation> <translation id="2523363575747517183">Este sitio web está tentando abrir outra aplicación.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb index e96d97c..8b0110c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -149,6 +149,7 @@ <translation id="2421004566762153674">മൂന്നാം കക്ഷി കുക്കികളെ ബ്ലോക്ക് ചെയ്യുന്നു</translation> <translation id="2421044535038393232">എഡിറ്റ് ചെയ്യുന്നത് തുടരുക</translation> <translation id="2435457462613246316">പാസ്വേഡ് കാണിക്കുക</translation> +<translation id="2476359652512522418">തിരഞ്ഞെടുത്തിട്ടില്ല</translation> <translation id="2497852260688568942">നിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്റർ സമന്വയിപ്പിക്കൽ പ്രവർത്തനരഹിതമാക്കി</translation> <translation id="2500374554657206846">പാസ്വേഡ് സംരക്ഷിക്കാനുള്ള ഓപ്ഷനുകൾ</translation> <translation id="2523363575747517183">മറ്റൊരു ആപ്പ് തുറക്കാൻ ഈ വെബ്സൈറ്റ് ആവർത്തിച്ച് ശ്രമിക്കുന്നു.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_strings_mr.xtb index 429dbf2..f021477 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
@@ -23,7 +23,7 @@ <translation id="1125564390852150847">नवीन टॅब तयार करा.</translation> <translation id="1145536944570833626">विद्यमान डेटा हटवा.</translation> <translation id="1147031633655575115"><ph name="USER" /> म्हणून साइन इन केले</translation> -<translation id="1154984953698510061">इतर टॅब पाहा</translation> +<translation id="1154984953698510061">इतर टॅब पहा</translation> <translation id="1157749421655780457">स्थानासाठी अनुमती द्या...</translation> <translation id="1165039591588034296">एरर</translation> <translation id="1172898394251786223">पुढील फील्ड</translation> @@ -149,6 +149,7 @@ <translation id="2421004566762153674">तृतीय पक्षाच्या कुकी ब्लॉक करत आहे</translation> <translation id="2421044535038393232">संपादन करणे सुरू ठेवा</translation> <translation id="2435457462613246316">पासवर्ड दर्शवा</translation> +<translation id="2476359652512522418">न निवडलेले</translation> <translation id="2497852260688568942">तुमच्या ॲडमिनिस्ट्रेटरने सिंक अक्षम केले आहे</translation> <translation id="2500374554657206846">पासवर्ड सेव्ह करण्यासाठी पर्याय</translation> <translation id="2523363575747517183">ही वेबसाइट वारंवार दुसरे अॅप्लिकेशन उघडण्याचा प्रयत्न करत आहे.</translation> @@ -436,7 +437,7 @@ <translation id="5300589172476337783">दर्शवा</translation> <translation id="5317780077021120954">सेव्ह करा</translation> <translation id="5339316356165661760">सिंक सुरू करा</translation> -<translation id="5360976571138293719">गोपनीयता, सुरक्षा आणि डेटा संग्रह यांच्याशी संबंधित आणखी सेटिंग्जसाठी, <ph name="BEGIN_LINK" />Google सेवा<ph name="END_LINK" /> पाहा.</translation> +<translation id="5360976571138293719">गोपनीयता, सुरक्षा आणि डेटा संग्रह यांच्याशी संबंधित आणखी सेटिंग्जसाठी, <ph name="BEGIN_LINK" />Google सेवा<ph name="END_LINK" /> पहा.</translation> <translation id="5388358297987318779">इमेज उघडा</translation> <translation id="5407969256130905701">बदल काढून टाका</translation> <translation id="5416022985862681400">मागील सात दिवस</translation> @@ -467,7 +468,7 @@ <translation id="567881659373499783">आवृत्ती <ph name="PRODUCT_VERSION" /></translation> <translation id="5690398455483874150">{count,plural, =1{आता एक Chrome विंडो दाखवत आहे}other{आता {count} Chrome विंडो दाखवत आहे}}</translation> <translation id="5706552126692816153">एका दिवसापूर्वी ॲक्टिव्ह होते</translation> -<translation id="5711039611392265845">गोपनीयता, सुरक्षितता आणि डेटा संग्रहाशी संबंधित अधिक सेटिंग्जसाठी, <ph name="BEGIN_LINK" />सिंक आणि Google सेवा<ph name="END_LINK" /> पाहा.</translation> +<translation id="5711039611392265845">गोपनीयता, सुरक्षितता आणि डेटा संग्रहाशी संबंधित अधिक सेटिंग्जसाठी, <ph name="BEGIN_LINK" />सिंक आणि Google सेवा<ph name="END_LINK" /> पहा.</translation> <translation id="5724941645893276623">वेब खाजगीरीत्या ब्राउझ करण्यासाठी नवीन टॅब जोडा</translation> <translation id="5728700505257787410">क्षमस्व, आपल्या खात्यामध्ये साइन इन करताना काहीतरी समस्या आली.</translation> <translation id="5737974891429562743">खाते साइन-इन तपशील कालबाह्य झाले आहेत. सिंक सुरू करण्यासाठी अपडेट करा.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ne.xtb b/ios/chrome/app/strings/resources/ios_strings_ne.xtb index 056ced2..67538e1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ne.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ne.xtb
@@ -149,6 +149,7 @@ <translation id="2421004566762153674">तेस्रो पक्षीय कुकीहरूलाई रोक लगाउँदै</translation> <translation id="2421044535038393232">सम्पादन गरिरहनुहोस्</translation> <translation id="2435457462613246316">पासवर्ड देखाउनुहोस्</translation> +<translation id="2476359652512522418">चयन गरिएको छैन</translation> <translation id="2497852260688568942">तपाईंको प्रशासकले सिंंक असक्षम पार्नुभएको छ।</translation> <translation id="2500374554657206846">पासवर्ड सुरक्षित गर्ने विकल्पहरू</translation> <translation id="2523363575747517183">यो वेबसाइटले बारम्बार अर्को एप खोल्ने प्रयास गर्दैछ।</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pa.xtb b/ios/chrome/app/strings/resources/ios_strings_pa.xtb index 5f0fc72..73208aa 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pa.xtb
@@ -149,6 +149,7 @@ <translation id="2421004566762153674">ਤੀਜੀ-ਧਿਰ ਵਾਲੀਆਂ ਕੁਕੀਜ਼ ਬਲਾਕ ਕੀਤੀਆਂ ਜਾ ਰਹੀਆਂ ਹਨ</translation> <translation id="2421044535038393232">ਸੰਪਾਦਨ ਕਰਦੇ ਰਹੋ</translation> <translation id="2435457462613246316">ਪਾਸਵਰਡ ਵੇਖੋ</translation> +<translation id="2476359652512522418">ਚੁਣੀ ਨਹੀਂ ਗਈ</translation> <translation id="2497852260688568942">ਸਮਕਾਲੀਕਰਨ ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਦੁਆਰਾ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ।</translation> <translation id="2500374554657206846">ਪਾਸਵਰਡ ਰੱਖਿਅਤ ਕਰਨ ਦੇ ਵਿਕਲਪ</translation> <translation id="2523363575747517183">ਇਹ ਵੈੱਬਸਾਈਟ ਵਾਰ-ਵਾਰ ਕੋਈ ਹੋਰ ਐਪਲੀਕੇਸ਼ਨ ਖੋਲ੍ਹਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਰਹੀ ਹੈ।</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ur.xtb b/ios/chrome/app/strings/resources/ios_strings_ur.xtb index 39307220..1c5a9a6d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ur.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
@@ -149,6 +149,7 @@ <translation id="2421004566762153674">فریق ثالث کوکیز کو مسدود کیا جا رہا ہے</translation> <translation id="2421044535038393232">ترمیم جاری رکھیں</translation> <translation id="2435457462613246316">پاس ورڈ دکھائیں</translation> +<translation id="2476359652512522418">انتخاب نہیں کیا گیا</translation> <translation id="2497852260688568942">مطابقت پذیری کو آپ کے منتظم نے غیر فعال کر دیا ہے</translation> <translation id="2500374554657206846">پاس ورڈ محفوظ کرنے کے اختیارات</translation> <translation id="2523363575747517183">یہ ویب سائٹ بار بار ایک اور ایپلیکیشن کھولنے کی کوشش کر رہی ہے۔</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb index 223ab0c..107a6e1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
@@ -149,7 +149,7 @@ <translation id="2421004566762153674">封鎖第三方 Cookie</translation> <translation id="2421044535038393232">繼續編輯</translation> <translation id="2435457462613246316">顯示密碼</translation> -<translation id="2476359652512522418">未選取</translation> +<translation id="2476359652512522418">無揀</translation> <translation id="2497852260688568942">您的管理員已停用同步功能</translation> <translation id="2500374554657206846">儲存密碼選項</translation> <translation id="2523363575747517183">這個網站嘗試重覆開啟另一個應用程式。</translation>
diff --git a/ios/chrome/browser/download/background_service/background_download_service_factory.cc b/ios/chrome/browser/download/background_service/background_download_service_factory.cc index 415ab77..e6eb078 100644 --- a/ios/chrome/browser/download/background_service/background_download_service_factory.cc +++ b/ios/chrome/browser/download/background_service/background_download_service_factory.cc
@@ -12,6 +12,7 @@ #include "components/download/internal/background_service/client_set.h" #include "components/download/internal/background_service/download_store.h" #include "components/download/internal/background_service/file_monitor_impl.h" +#include "components/download/internal/background_service/init_aware_background_download_service.h" #include "components/download/internal/background_service/ios/background_download_service_impl.h" #include "components/download/internal/background_service/ios/background_download_task_helper.h" #include "components/download/internal/background_service/logger_impl.h" @@ -91,5 +92,8 @@ files_storage_dir, std::move(logger), logger_ptr, base::DefaultClock::GetInstance()); logger_ptr->SetLogSource(service.get()); - return service; + auto init_aware_service = + std::make_unique<download::InitAwareBackgroundDownloadService>( + std::move(service)); + return init_aware_service; }
diff --git a/ios/chrome/browser/download/background_service/background_download_service_test.cc b/ios/chrome/browser/download/background_service/background_download_service_test.cc index 01554b8..c37fb3c 100644 --- a/ios/chrome/browser/download/background_service/background_download_service_test.cc +++ b/ios/chrome/browser/download/background_service/background_download_service_test.cc
@@ -28,11 +28,6 @@ FakeClient() = default; ~FakeClient() override = default; - void WaitForInitialized() { - run_loop_ = std::make_unique<base::RunLoop>(); - run_loop_->Run(); - } - void WaitForDownload() { run_loop_ = std::make_unique<base::RunLoop>(); run_loop_->Run(); @@ -48,8 +43,6 @@ bool state_lost, const std::vector<download::DownloadMetaData>& downloads) override { metadata_ = downloads; - DCHECK(run_loop_); - run_loop_->Quit(); } void OnDownloadSucceeded( @@ -122,7 +115,6 @@ // Verifies download can be finished. TEST_F(BackgroundDownloadServiceTest, DownloadComplete) { - client()->WaitForInitialized(); Download(); client()->WaitForDownload(); std::string content;
diff --git a/ios/chrome/browser/metrics/demographics_egtest.mm b/ios/chrome/browser/metrics/demographics_egtest.mm index 52e514e5..7c0e9b7 100644 --- a/ios/chrome/browser/metrics/demographics_egtest.mm +++ b/ios/chrome/browser/metrics/demographics_egtest.mm
@@ -27,7 +27,7 @@ } // namespace @interface DemographicsTestCase : ChromeTestCase { - int testBirthYear_; + int birthYear_; } @end @@ -45,8 +45,8 @@ [MetricsAppInterface updateNetworkTime:now]; // Get the maximum eligible birth year for reporting demographics. - testBirthYear_ = [MetricsAppInterface maximumEligibleBirthYearForTime:now]; - [self addUserDemographicsToSyncServerWithBirthYear:testBirthYear_ + birthYear_ = [MetricsAppInterface maximumEligibleBirthYearForTime:now]; + [self addUserDemographicsToSyncServerWithBirthYear:birthYear_ gender:kTestGender]; [self signInAndSync]; [self grantMetricsConsent]; @@ -191,7 +191,7 @@ [self buildAndStoreUKMLog]; - GREYAssertTrue([MetricsAppInterface UKMReportHasBirthYear:testBirthYear_ + GREYAssertTrue([MetricsAppInterface UKMReportHasBirthYear:birthYear_ gender:kTestGender], @"The report should contain the specified user demographics"); @@ -245,7 +245,7 @@ GREYAssertTrue([MetricsAppInterface hasUnsentUMALogs], @"The UKM service should have unsent logs."); - GREYAssertTrue([MetricsAppInterface UMALogHasBirthYear:testBirthYear_ + GREYAssertTrue([MetricsAppInterface UMALogHasBirthYear:birthYear_ gender:kTestGender], @"The report should contain the specified user demographics");
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_az.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_az.xtb index 4ddbff7..5fa2b21 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_az.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_az.xtb
@@ -1,12 +1,14 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="az"> +<translation id="1196785757634502276">Artıq <ph name="WEBSITE" /> saytında "<ph name="USERNAME" />" üçün parolu yadda saxlamısınız. Onu əvəz etmək istəyirsiniz?</translation> <translation id="1276428923064733819">Kopyalayın</translation> <translation id="1614914292771557551">Parolunuz Chrome'a qayıtdıqda Google Hesabınızda (<ph name="EMAIL" />) saxlanacaq</translation> <translation id="1706288056912586527">Parol görünsün</translation> <translation id="1977167321677356409">Parol</translation> <translation id="2712586044587587728">Chrome parollarınız başqa tətbiqlərdə istifadə edilə biləcək. Bunu istənilən vaxt Ayarlar tətbiqində deaktiv edə bilərsiniz.</translation> <translation id="3580107423202590938">Chrome Parolu Yoxdur</translation> +<translation id="368844171100841558">Əvəz edin</translation> <translation id="3753678329684433031">Chrome Parolunu Avtomatik Doldurun</translation> <translation id="3789385946721385622">İstifadəçi adı</translation> <translation id="4064278913989596727">Yardım</translation> @@ -36,6 +38,7 @@ <translation id="8219905600827687498">Təklif edilən parollar</translation> <translation id="8300526662653766176">Parol ayarlayın</translation> <translation id="8332511935157148552">Parol tapılmadı</translation> +<translation id="8486024683491936104">Parol əvəz edilsin?</translation> <translation id="8503813439785031346">İstifadəçi adı</translation> <translation id="8518521100965196752">Parollardan istifadə etmək üçün əvvəlcə cihazınızda parol ayarlamalısınız.</translation> <translation id="8877181643142698531">URL</translation>
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gl.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gl.xtb index afa7b0a3..3185683 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gl.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gl.xtb
@@ -1,12 +1,14 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="gl"> +<translation id="1196785757634502276">Xa gardaches un contrasinal para <ph name="USERNAME" /> en <ph name="WEBSITE" />. Queres substituílo?</translation> <translation id="1276428923064733819">Copiar</translation> <translation id="1614914292771557551">O teu contrasinal gardarase na túa Conta de Google (<ph name="EMAIL" />) cando volvas a Chrome</translation> <translation id="1706288056912586527">Mostrar contrasinal</translation> <translation id="1977167321677356409">Contrasinal</translation> <translation id="2712586044587587728">Os teus contrasinais de Chrome estarán dispoñibles para utilizarse noutras aplicacións. Podes desactivar esta opción cando queiras en Configuración.</translation> <translation id="3580107423202590938">Non hai ningún contrasinal de Chrome</translation> +<translation id="368844171100841558">Substituír</translation> <translation id="3753678329684433031">Autocompletar contrasinal de Chrome</translation> <translation id="3789385946721385622">Nome de usuario</translation> <translation id="4064278913989596727">Axuda</translation> @@ -36,6 +38,7 @@ <translation id="8219905600827687498">Contrasinais suxeridos</translation> <translation id="8300526662653766176">Define un contrasinal</translation> <translation id="8332511935157148552">Non se atoparon contrasinais</translation> +<translation id="8486024683491936104">Queres substituír o contrasinal?</translation> <translation id="8503813439785031346">Nome de usuario</translation> <translation id="8518521100965196752">Para usar os contrasinais, en primeiro lugar debes definir un contrasinal no teu dispositivo.</translation> <translation id="8877181643142698531">URL</translation>
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ml.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ml.xtb index 2af0ebc9..5c1c9cb 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ml.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ml.xtb
@@ -1,12 +1,14 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ml"> +<translation id="1196785757634502276">നിങ്ങൾ "<ph name="USERNAME" />" എന്നതിനുള്ള പാസ്വേഡ് <ph name="WEBSITE" /> എന്ന വെബ്സൈറ്റിൽ മുമ്പേ സംരക്ഷിച്ചു. ഇത് മാറ്റി പകരം മറ്റൊന്ന് നൽകണോ?</translation> <translation id="1276428923064733819">പകർത്തുക</translation> <translation id="1614914292771557551">Chrome-ലേക്ക് മടങ്ങിയെത്തുമ്പോൾ പാസ്വേഡ് നിങ്ങളുടെ Google അക്കൗണ്ടിൽ (<ph name="EMAIL" />) സംരക്ഷിക്കും</translation> <translation id="1706288056912586527">പാസ്വേഡ് കാണിക്കുക</translation> <translation id="1977167321677356409">പാസ്വേഡ്</translation> <translation id="2712586044587587728">നിങ്ങളുടെ Chrome പാസ്വേഡുകൾ മറ്റ് ആപ്പുകളിൽ ഉപയോഗിക്കാൻ ലഭ്യമാകും. നിങ്ങൾക്ക് ഏതുസമയത്തും ക്രമീകരണ ആപ്പിൽ ഇത് ഓഫാക്കാം.</translation> <translation id="3580107423202590938">Chrome പാസ്വേഡുകളൊന്നുമില്ല</translation> +<translation id="368844171100841558">പകരം മറ്റൊന്ന് നൽകുക</translation> <translation id="3753678329684433031">Chrome പാസ്വേഡ് സ്വയമേവ പൂരിപ്പിക്കൽ</translation> <translation id="3789385946721385622">ഉപയോക്തൃനാമം</translation> <translation id="4064278913989596727">സഹായം</translation> @@ -36,6 +38,7 @@ <translation id="8219905600827687498">നിർദ്ദേശിച്ചിരിക്കുന്ന പാസ്വേഡുകൾ</translation> <translation id="8300526662653766176">പാസ്കോഡ് സജ്ജീകരിക്കുക</translation> <translation id="8332511935157148552">പാസ്വേഡുകളൊന്നും കണ്ടെത്തിയില്ല</translation> +<translation id="8486024683491936104">പാസ്വേഡ് മാറ്റി പകരം മറ്റൊന്ന് നൽകണോ?</translation> <translation id="8503813439785031346">ഉപയോക്തൃനാമം</translation> <translation id="8518521100965196752">പാസ്വേഡുകൾ ഉപയോഗിക്കാൻ, ആദ്യം നിങ്ങളുടെ ഉപകരണത്തിൽ പാസ്കോഡ് സജ്ജീകരിക്കുക.</translation> <translation id="8877181643142698531">URL</translation>
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mr.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mr.xtb index 94e2589..c9c523b 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mr.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mr.xtb
@@ -1,12 +1,14 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="mr"> +<translation id="1196785757634502276">तुम्ही <ph name="WEBSITE" /> वर "<ph name="USERNAME" />" चा पासवर्ड आधीच सेव्ह केला आहे. तुम्हाला तो बदलायचा आहे का?</translation> <translation id="1276428923064733819">कॉपी करा</translation> <translation id="1614914292771557551">तुम्ही Chrome वर परत आल्यावर, तुमचा पासवर्ड तुमच्या Google खाते (<ph name="EMAIL" />) मध्ये सेव्ह केला जाईल</translation> <translation id="1706288056912586527">पासवर्ड दाखवा</translation> <translation id="1977167321677356409">पासवर्ड</translation> <translation id="2712586044587587728">तुमचे Chrome पासवर्ड इतर अॅप्समध्ये वापरण्यासाठी उपलब्ध असतील. तुम्ही ते सेटिंग्ज अॅपमध्ये कधीही बंद करू शकता.</translation> <translation id="3580107423202590938">Chrome पासवर्ड नाहीत</translation> +<translation id="368844171100841558">बदला</translation> <translation id="3753678329684433031">Chrome पासवर्ड ऑटोफिल करा</translation> <translation id="3789385946721385622">वापरकर्ता नाव</translation> <translation id="4064278913989596727">मदत</translation> @@ -36,6 +38,7 @@ <translation id="8219905600827687498">सुचवलेले पासवर्ड</translation> <translation id="8300526662653766176">पासकोड सेट करा</translation> <translation id="8332511935157148552">पासवर्ड आढळले नाहीत</translation> +<translation id="8486024683491936104">पासवर्ड बदलायचा आहे का?</translation> <translation id="8503813439785031346">वापरकर्ता नाव</translation> <translation id="8518521100965196752">पासवर्ड वापरण्यासाठी, तुम्ही आधी तुमच्या डिव्हाइसवर पासकोड सेट करणे आवश्यक आहे.</translation> <translation id="8877181643142698531">URL</translation>
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ne.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ne.xtb index fd5a0867..6492559 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ne.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ne.xtb
@@ -1,12 +1,14 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ne"> +<translation id="1196785757634502276">तपाईंले <ph name="WEBSITE" /> का हकमा "<ph name="USERNAME" />" को पासवर्ड सेभ गरिसक्नुभएको छ। तपाईं उक्त पासवर्ड बदल्न चाहनुहुन्छ?</translation> <translation id="1276428923064733819">कपी गर्नुहोस्</translation> <translation id="1614914292771557551">तपाईं Chrome मा फर्केर आउँदा तपाईंको पासवर्ड तपाईंको Google खाता (<ph name="EMAIL" />) मा सेभ गरिने छ</translation> <translation id="1706288056912586527">पासवर्ड देखाइयोस्</translation> <translation id="1977167321677356409">पासवर्ड</translation> <translation id="2712586044587587728">Chrome मा सुरक्षित गरिएका तपाईंका पासवर्डहरू अन्य एपहरूमा पनि प्रयोग गर्न सकिने छ। तपाईं सेटिङ एपमा गएर जुनसुकै बेला यो सुविधा निष्क्रिय पार्न सक्नुहुन्छ।</translation> <translation id="3580107423202590938">Chrome मा कुनै पनि पासवर्ड सुरक्षित गरिएको छैन</translation> +<translation id="368844171100841558">बदल्नुहोस्</translation> <translation id="3753678329684433031">Chrome मा सुरक्षित गरिएको पासवर्ड स्वतः भरियोस्</translation> <translation id="3789385946721385622">युजरनेम</translation> <translation id="4064278913989596727">मद्दत</translation> @@ -36,6 +38,7 @@ <translation id="8219905600827687498">सिफारिस गरिएका पासवर्डहरू</translation> <translation id="8300526662653766176">कुनै पासकोड सेट गर्नुहोस्</translation> <translation id="8332511935157148552">कुनै पनि पासवर्ड भेटिएन</translation> +<translation id="8486024683491936104">पासवर्ड बदल्ने हो?</translation> <translation id="8503813439785031346">एक-पटके टेक्स्ट म्यासेज</translation> <translation id="8518521100965196752">पासवर्डहरू प्रयोग गर्न सर्वप्रथम तपाईंले आफ्नो यन्त्रमा अनिवार्य रूपमा कुनै पासकोड सेट गर्नु पर्छ।</translation> <translation id="8877181643142698531">URL</translation>
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pa.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pa.xtb index 7c155db..1860776 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pa.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pa.xtb
@@ -1,12 +1,14 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="pa"> +<translation id="1196785757634502276">ਤੁਸੀਂ ਪਹਿਲਾਂ ਹੀ "<ph name="USERNAME" />" ਲਈ <ph name="WEBSITE" /> 'ਤੇ ਪਾਸਵਰਡ ਰੱਖਿਅਤ ਕਰ ਲਿਆ ਹੈ। ਕੀ ਤੁਸੀਂ ਇਸ ਨੂੰ ਬਦਲਣਾ ਚਾਹੁੰਦੇ ਹੋ?</translation> <translation id="1276428923064733819">ਕਾਪੀ ਕਰੋ</translation> <translation id="1614914292771557551">ਤੁਹਾਡੇ Chrome 'ਤੇ ਵਾਪਸ ਆਉਣ 'ਤੇ ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਤੁਹਾਡੇ Google ਖਾਤੇ (<ph name="EMAIL" />) ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾਵੇਗਾ</translation> <translation id="1706288056912586527">ਪਾਸਵਰਡ ਦਿਖਾਓ</translation> <translation id="1977167321677356409">ਪਾਸਵਰਡ</translation> <translation id="2712586044587587728">ਤੁਹਾਡੇ Chrome ਪਾਸਵਰਡ ਹੋਰ ਐਪਾਂ ਵਿੱਚ ਵਰਤਣ ਲਈ ਉਪਲਬਧ ਹੋਣਗੇ। ਤੁਸੀਂ ਕਿਸੇ ਵੇਲੇ ਵੀ ਇਸ ਨੂੰ ਸੈਟਿੰਗਾਂ ਐਪ ਵਿੱਚ ਜਾ ਕੇ ਬੰਦ ਕਰ ਸਕਦੇ ਹੋ।</translation> <translation id="3580107423202590938">ਕੋਈ Chrome ਪਾਸਵਰਡ ਨਹੀਂ</translation> +<translation id="368844171100841558">ਬਦਲੋ</translation> <translation id="3753678329684433031">ਆਟੋਫਿਲ Chrome ਪਾਸਵਰਡ</translation> <translation id="3789385946721385622">ਵਰਤੋਂਕਾਰ ਨਾਮ</translation> <translation id="4064278913989596727">ਮਦਦ</translation> @@ -36,6 +38,7 @@ <translation id="8219905600827687498">ਸੁਝਾਏ ਗਏ ਪਾਸਵਰਡ</translation> <translation id="8300526662653766176">ਕੋਈ ਪਾਸਕੋਡ ਸੈੱਟ ਕਰੋ</translation> <translation id="8332511935157148552">ਕੋਈ ਪਾਸਵਰਡ ਨਹੀਂ ਮਿਲਿਆ</translation> +<translation id="8486024683491936104">ਕੀ ਪਾਸਵਰਡ ਬਦਲਣਾ ਹੈ?</translation> <translation id="8503813439785031346">ਵਰਤੋਂਕਾਰ ਨਾਮ</translation> <translation id="8518521100965196752">ਪਾਸਵਰਡਾਂ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ ਪਹਿਲਾਂ ਆਪਣੇ ਡੀਵਾਈਸ 'ਤੇ ਪਾਸਕੋਡ ਸੈੱਟ ਕਰਨਾ ਲਾਜ਼ਮੀ ਹੈ।</translation> <translation id="8877181643142698531">URL</translation>
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ur.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ur.xtb index 844b372..fa5e4976 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ur.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ur.xtb
@@ -1,12 +1,14 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ur"> +<translation id="1196785757634502276">آپ نے <ph name="WEBSITE" /> پر <ph name="USERNAME" /> کیلئے پہلے ہی پاس ورڈ محفوظ کر لیا ہے۔ کیا آپ اسے تبدیل کرنا چاہتے ہیں؟</translation> <translation id="1276428923064733819">کاپی کریں</translation> <translation id="1614914292771557551">آپ کے Chrome پر واپس لوٹنے پر آپ کا پاس ورڈ آپ کے Google اکاؤنٹ (<ph name="EMAIL" />) میں محفوظ ہو جائے گا</translation> <translation id="1706288056912586527">پاس ورڈ دکھائیں</translation> <translation id="1977167321677356409">پاس ورڈ</translation> <translation id="2712586044587587728">آپ کے Chrome پاس ورڈ دیگر ایپس میں استعمال کرنے کے لئے دستیاب ہوں گے۔ آپ اسے کسی بھی وقت ترتیبات ایپ میں آف کر سکتے ہیں۔</translation> <translation id="3580107423202590938">کوئی Chrome پاس ورڈز نہیں</translation> +<translation id="368844171100841558">بدلیں</translation> <translation id="3753678329684433031">آٹو فل Chrome پاس ورڈ</translation> <translation id="3789385946721385622">صارف نام</translation> <translation id="4064278913989596727">مدد</translation> @@ -36,6 +38,7 @@ <translation id="8219905600827687498">تجویز کردہ پاس ورڈز</translation> <translation id="8300526662653766176">ایک پاس کوڈ سیٹ کریں</translation> <translation id="8332511935157148552">کوئی پاس ورڈ نہیں ملا</translation> +<translation id="8486024683491936104">پاس ورڈ تبدیل کریں؟</translation> <translation id="8503813439785031346">صارف کا نام</translation> <translation id="8518521100965196752">پاس ورڈز استعمال کرنے کے ليے، آپ کو اپنے آلے پر پہلے پاس کوڈ سیٹ کرنا ہوگا۔</translation> <translation id="8877181643142698531">URL</translation>
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-HK.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-HK.xtb index 404c52a..c46f25c 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-HK.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-HK.xtb
@@ -1,7 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="zh-HK"> -<translation id="1196785757634502276">你已儲存「<ph name="USERNAME" />」在 <ph name="WEBSITE" /> 使用的密碼。要取代這組密碼嗎?</translation> +<translation id="1196785757634502276">您已儲存「<ph name="USERNAME" />」在 <ph name="WEBSITE" /> 使用的密碼。要取代此密碼嗎?</translation> <translation id="1276428923064733819">複製</translation> <translation id="1614914292771557551">當您返回 Chrome 時,密碼將會儲存在 Google 帳戶 (<ph name="EMAIL" />) 中</translation> <translation id="1706288056912586527">顯示密碼</translation>
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 index ec27574..439cca6 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -d387f99f3a3a2356faf608d3c6dc193aaeabcb25 \ No newline at end of file +baa5f11cd7090dcf0d21747c15106d8231542952 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 index 808b48b6..c12e398f 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -34b924f701ffbd9b20eda9b8240d57033df044b2 \ No newline at end of file +4124c34017dfec0e4173412143ea83359fae7457 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1 index 466edd1..1989f648 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -d2e2f93241e64687d37cae23dfc07bc10ec81112 \ No newline at end of file +e510b4621493ec01e7c2e9fe610e09246b3cf62e \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1 index 5fd1d9ad..f14936d 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -9421c19f5012a94ff3a1ed965b3a2f49ec8bf5a4 \ No newline at end of file +bdb55eb24174bb0f0d418ae4419e7ee92988f7e1 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 index b0093596..cecc75cd 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -c3091a6ef0e1374080bd76c5e834a91b1087dc18 \ No newline at end of file +0720172e33aff4ca5d6aab231f4060752f75f6d4 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 index 05299e97..a2a491f 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -996d7d1995c648ee772e075dc8ac283150433ba8 \ No newline at end of file +5f2950db501072e8698aa18a91e31615cb41ed10 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 index 5b4183e..0260cb2 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -762c5da9f81c87e5c494d29eaf1d423da2b7fe04 \ No newline at end of file +8f09874a7fdd30d19905deee4bcd833650acdfd3 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 index 942e2a9..83509df0 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -5f35d74d2855c90ed66821f59a19346318b441b5 \ No newline at end of file +20b97de15a0f87a49b4ae11120bd017d5f1561ea \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 index 4fdc92b0..d8876d2 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -2bf353b82eb5d3a905c44113f2ffcf841e42262b \ No newline at end of file +e025a9507721d86fa802b5f72871d3ddaedcf475 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 index 73e6729c..c9bb21b 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -f3aa9722c89048e898e082e50ce926ac519576cd \ No newline at end of file +ecab0bf937d44e0fe3ee35006ed2bf75d57d5fe1 \ No newline at end of file
diff --git a/ios/third_party/material_components_ios/BUILD.gn b/ios/third_party/material_components_ios/BUILD.gn index a66905c..eb6942a 100644 --- a/ios/third_party/material_components_ios/BUILD.gn +++ b/ios/third_party/material_components_ios/BUILD.gn
@@ -453,7 +453,7 @@ "src/components/Themes/src/MDCTonalPalette.h", "src/components/Themes/src/MaterialThemes.h", "src/components/Typography/src/FontLoader/MDCTypographyFontLoader.h", - "src/components/Typography/src/MDCFontScaler.h", + "src/components/Typography/src/FontScaler/MDCFontScaler.h", "src/components/Typography/src/MDCFontTextStyle.h", "src/components/Typography/src/MDCTypography.h", "src/components/Typography/src/MaterialTypography.h", @@ -684,6 +684,7 @@ "src/components/Themes/src", "src/components/Typography/src", "src/components/Typography/src/FontLoader", + "src/components/Typography/src/FontScaler", "src/components/Typography/src/private", "src/components/private/Application/src", "src/components/private/Color/src", @@ -1387,8 +1388,8 @@ "src/components/Themes/src/MDCTonalPalette.h", "src/components/Themes/src/MaterialThemes.h", "src/components/Typography/src/FontLoader/MDCTypographyFontLoader.h", - "src/components/Typography/src/MDCFontScaler.h", - "src/components/Typography/src/MDCFontScaler.m", + "src/components/Typography/src/FontScaler/MDCFontScaler.h", + "src/components/Typography/src/FontScaler/MDCFontScaler.m", "src/components/Typography/src/MDCFontTextStyle.h", "src/components/Typography/src/MDCTypography.h", "src/components/Typography/src/MDCTypography.m",
diff --git a/media/base/win/dcomp_texture_wrapper.h b/media/base/win/dcomp_texture_wrapper.h index abb45dd..d0a23eb 100644 --- a/media/base/win/dcomp_texture_wrapper.h +++ b/media/base/win/dcomp_texture_wrapper.h
@@ -24,20 +24,20 @@ virtual ~DCOMPTextureWrapper() = default; // Initializes the DCOMPTexture and returns success/failure in `init_cb`. - // TODO(xhwang): Pass `DCOMPSurfaceHandleBoundCB` in `SetDCOMPSurface()`. - using DCOMPSurfaceHandleBoundCB = base::OnceCallback<void(bool)>; using CompositionParamsReceivedCB = base::RepeatingCallback<void(gfx::Rect)>; using InitCB = base::OnceCallback<void(bool)>; virtual void Initialize(const gfx::Size& natural_size, - DCOMPSurfaceHandleBoundCB dcomp_handle_bound_cb, CompositionParamsReceivedCB comp_params_received_cb, InitCB init_cb) = 0; // Called whenever the video's natural size changes. virtual void UpdateTextureSize(const gfx::Size& natural_size) = 0; - // Sets the DirectComposition surface identified by `surface_token`. - virtual void SetDCOMPSurface(const base::UnguessableToken& surface_token) = 0; + // Sets the DirectComposition surface identified by `token`. + using SetDCOMPSurfaceHandleCB = base::OnceCallback<void(bool)>; + virtual void SetDCOMPSurfaceHandle( + const base::UnguessableToken& token, + SetDCOMPSurfaceHandleCB set_dcomp_surface_handle_cb) = 0; // Creates VideoFrame which will be returned in `create_video_frame_cb`. using CreateVideoFrameCB =
diff --git a/media/gpu/chromeos/video_decoder_pipeline.cc b/media/gpu/chromeos/video_decoder_pipeline.cc index 1a48df6..cfbf8b1 100644 --- a/media/gpu/chromeos/video_decoder_pipeline.cc +++ b/media/gpu/chromeos/video_decoder_pipeline.cc
@@ -247,11 +247,6 @@ std::move(init_cb).Run(StatusCode::kDecoderUnsupportedConfig); return; } - if (config.profile() == VIDEO_CODEC_PROFILE_UNKNOWN) { - VLOGF(1) << "VideoCodecProfile is VIDEO_CODEC_PROFILE_UNKNOWN."; - std::move(init_cb).Run(StatusCode::kDecoderUnsupportedConfig); - return; - } #if BUILDFLAG(USE_CHROMEOS_PROTECTED_MEDIA) if (config.is_encrypted() && !cdm_context) { VLOGF(1) << "Encrypted streams require a CdmContext";
diff --git a/media/gpu/v4l2/v4l2_video_decoder.cc b/media/gpu/v4l2/v4l2_video_decoder.cc index a85fbd4..e1b9d205 100644 --- a/media/gpu/v4l2/v4l2_video_decoder.cc +++ b/media/gpu/v4l2/v4l2_video_decoder.cc
@@ -8,10 +8,8 @@ #include "base/bind.h" #include "base/callback_helpers.h" -#include "base/containers/contains.h" #include "base/logging.h" #include "base/memory/ptr_util.h" -#include "base/numerics/safe_conversions.h" #include "base/task/post_task.h" #include "base/trace_event/trace_event.h" #include "media/base/limits.h" @@ -173,7 +171,8 @@ device_ = V4L2Device::Create(); if (!device_) { - SetErrorState("failed to create V4L2 device"); + VLOGF(1) << "Failed to create V4L2 device."; + SetState(State::kError); std::move(init_cb).Run(StatusCode::kV4l2NoDevice); return; } @@ -186,9 +185,15 @@ DCHECK(!output_queue_); profile_ = config.profile(); - DCHECK_NE(profile_, VIDEO_CODEC_PROFILE_UNKNOWN); aspect_ratio_ = config.aspect_ratio(); + if (profile_ == VIDEO_CODEC_PROFILE_UNKNOWN) { + VLOGF(1) << "Unknown profile."; + SetState(State::kError); + std::move(init_cb).Run(StatusCode::kV4l2NoDecoder); + return; + } + // Call init_cb output_cb_ = std::move(output_cb); SetState(State::kInitialized); @@ -228,10 +233,8 @@ can_use_decoder_ = num_instances_.Increment() < kMaxNumOfInstances; if (!can_use_decoder_) { - SetErrorState( - base::StringPrintf("failed to initialize backend, reached maximum " - "number of decoder instances(%d)", - kMaxNumOfInstances)); + VLOGF(1) << "Reached maximum number of decoder instances (" + << kMaxNumOfInstances << ")"; return StatusCode::kDecoderCreationFailed; } @@ -255,8 +258,7 @@ if (!api_and_format.has_value()) { num_instances_.Decrement(); can_use_decoder_ = false; - SetErrorState(base::StringPrintf("no V4L2 API found for profile %s", - GetProfileName(profile_).c_str())); + VLOGF(1) << "No V4L2 API found for profile: " << GetProfileName(profile_); return StatusCode::kV4l2NoDecoder; } @@ -264,21 +266,16 @@ const __u32 kCapsRequired = V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_STREAMING; if (device_->Ioctl(VIDIOC_QUERYCAP, &caps) || (caps.capabilities & kCapsRequired) != kCapsRequired) { - SetErrorState( - base::StringPrintf("capability check failed, needed 0x%x, got 0x%x", - kCapsRequired, caps.capabilities)); + VLOGF(1) << "ioctl() failed: VIDIOC_QUERYCAP, " + << "caps check failed: 0x" << std::hex << caps.capabilities; return StatusCode::kV4l2FailedFileCapabilitiesCheck; } // Create Input/Output V4L2Queue input_queue_ = device_->GetQueue(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); - if (!input_queue_) { - SetErrorState("failed to create |input_queue_|"); - return StatusCode::kV4l2FailedResourceAllocation; - } output_queue_ = device_->GetQueue(V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE); - if (!output_queue_) { - SetErrorState("failed to create |output_queue_|"); + if (!input_queue_ || !output_queue_) { + VLOGF(1) << "Failed to create V4L2 queue."; return StatusCode::kV4l2FailedResourceAllocation; } @@ -299,28 +296,24 @@ } if (!backend_->Initialize()) { - SetErrorState("failed to initialize backend"); + VLOGF(1) << "Failed to initialize backend."; return StatusCode::kV4l2FailedResourceAllocation; } if (!SetupInputFormat(input_format_fourcc)) { - SetErrorState( - base::StringPrintf("Failed to setup input format (%s)", - FourccToString(input_format_fourcc).c_str())); + VLOGF(1) << "Failed to setup input format."; return StatusCode::kV4l2BadFormat; } if (input_queue_->AllocateBuffers(kNumInputBuffers, V4L2_MEMORY_MMAP) == 0) { - SetErrorState( - base::StringPrintf("failed to allocate %d input buffers", - base::checked_cast<int>(kNumInputBuffers))); + VLOGF(1) << "Failed to allocate input buffer."; return StatusCode::kV4l2FailedResourceAllocation; } // Start streaming input queue and polling. This is required for the stateful // decoder, and doesn't hurt for the stateless one. if (!StartStreamV4L2Queue(false)) { - SetErrorState("failed to start streaming"); + VLOGF(1) << "Failed to start streaming."; return StatusCode::kV4L2FailedToStartStreamQueue; } @@ -335,8 +328,9 @@ // Check if the format is supported. std::vector<uint32_t> formats = device_->EnumerateSupportedPixelformats( V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); - if (!base::Contains(formats, input_format_fourcc)) { - DVLOGF(3) << "Input fourcc " << FourccToString(input_format_fourcc) + if (std::find(formats.begin(), formats.end(), input_format_fourcc) == + formats.end()) { + DVLOGF(3) << "Input fourcc " << input_format_fourcc << " not supported by device."; return false; } @@ -521,6 +515,7 @@ if (state_ == State::kInitialized) { const StatusCode status = InitializeBackend(); if (status != StatusCode::kOk) { + SetState(State::kError); std::move(trampoline_decode_cb).Run(status); return; } @@ -535,20 +530,18 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(decoder_sequence_checker_); DVLOGF(3); - if (!input_queue_->Streamon()) { - SetErrorState("failed to streamon V4L2 input queue"); - return false; - } - if (start_output_queue && !output_queue_->Streamon()) { - SetErrorState("failed to streamon V4L2 output queue"); + if (!input_queue_->Streamon() || + (start_output_queue && !output_queue_->Streamon())) { + VLOGF(1) << "Failed to streamon V4L2 queue."; + SetState(State::kError); return false; } if (!device_->StartPolling( base::BindRepeating(&V4L2VideoDecoder::ServiceDeviceTask, weak_this_), - base::BindRepeating(&V4L2VideoDecoder::SetErrorState, weak_this_, - "V4L2DevicePoller error"))) { - SetErrorState("failed to start polling V4L2Device"); + base::BindRepeating(&V4L2VideoDecoder::SetState, weak_this_, + State::kError))) { + SetState(State::kError); return false; } @@ -560,7 +553,7 @@ DVLOGF(3); if (!device_->StopPolling()) { - SetErrorState("failed to stop polling V4L2Device"); + SetState(State::kError); return false; } @@ -641,18 +634,18 @@ return; if (!output_queue_->DeallocateBuffers()) { - SetErrorState("failed to deallocate buffers"); + SetState(State::kError); return; } if (!backend_->ApplyResolution(pic_size, visible_rect, num_output_frames_)) { - SetErrorState("failed to apply resolution"); + SetState(State::kError); return; } if (!SetupOutputFormat(pic_size, visible_rect)) { - // TODO(b/158716673): improve error reporting from SetupOutputFormat(). - SetErrorState("failed to setup output format"); + VLOGF(1) << "Failed to setup output format."; + SetState(State::kError); return; } @@ -662,25 +655,20 @@ (type == V4L2_MEMORY_DMABUF) ? VIDEO_MAX_FRAME : num_output_frames_; if (output_queue_->AllocateBuffers(v4l2_num_buffers, type) == 0) { - SetErrorState( - base::StringPrintf("failed to allocate %d |output_queue_| buffers", - base::checked_cast<int>(v4l2_num_buffers))); + VLOGF(1) << "Failed to request output buffers."; + SetState(State::kError); return; } - const auto actual_v4l2_num_buffers = output_queue_->AllocatedBuffersCount(); - // TODO(mcasas): Is this comparison right or should we - // s/num_output_frames_/v4l2_num_buffers/? - if (actual_v4l2_num_buffers < num_output_frames_) { - SetErrorState(base::StringPrintf( - "allocated num buffers (%d) is less than the expected (%d)", - base::checked_cast<int>(actual_v4l2_num_buffers), - base::checked_cast<int>(num_output_frames_))); + if (output_queue_->AllocatedBuffersCount() < num_output_frames_) { + VLOGF(1) << "Could not allocate requested number of output buffers."; + SetState(State::kError); return; } - // StartStreamV4L2Queue() already calls SetErrorState(...) inside. - if (!StartStreamV4L2Queue(true)) + if (!StartStreamV4L2Queue(true)) { + SetState(State::kError); return; + } // Now notify |backend_| that changing resolution is done successfully. // Note: |backend_| is owned by this, using base::Unretained() is safe. @@ -713,7 +701,7 @@ std::tie(success, dequeued_buffer) = output_queue_->DequeueBuffer(); if (!success) { - SetErrorState("failed to dequeue buffer from |output_queue_|"); + SetState(State::kError); return; } if (!dequeued_buffer) @@ -728,7 +716,7 @@ std::tie(success, dequeued_buffer) = input_queue_->DequeueBuffer(); if (!success) { - SetErrorState("failed to dequeue buffer from |input_queue_|"); + SetState(State::kError); return; } if (!dequeued_buffer) @@ -778,8 +766,7 @@ if (state_ == new_state) return; if (state_ == State::kError) { - DVLOGF(3) - << "V4L2VideoDecoder is in State::kError, ignoring state transition."; + DVLOGF(3) << "Already in kError state."; return; } @@ -823,18 +810,11 @@ return; } -void V4L2VideoDecoder::SetErrorState(const std::string& message) { - LOG(ERROR) << message; - MEDIA_LOG(ERROR, media_log_) << "V4L2VideoDecoder: " << message; - SetState(State::kError); -} - void V4L2VideoDecoder::OnBackendError() { DCHECK_CALLED_ON_VALID_SEQUENCE(decoder_sequence_checker_); DVLOGF(2); - // TODO(b/158716673): improve error reporting from backends. - SetErrorState("V4L2VideoDecoderBackend signalled an error"); + SetState(State::kError); } bool V4L2VideoDecoder::IsDecoding() const {
diff --git a/media/gpu/v4l2/v4l2_video_decoder.h b/media/gpu/v4l2/v4l2_video_decoder.h index 95bdd7f..b000df02 100644 --- a/media/gpu/v4l2/v4l2_video_decoder.h +++ b/media/gpu/v4l2/v4l2_video_decoder.h
@@ -146,13 +146,9 @@ const gfx::Rect& visible_rect, const size_t num_output_frames); - // Change the |state_| and check the state transition is valid. + // Change the state and check the state transition is valid. void SetState(State new_state); - // Tell SetState() to change the |state_| to kError and send |message| to - // MediaLog and to LOG(ERROR). - void SetErrorState(const std::string& message); - // Continue backend initialization. Decoder will not take a hardware context // until InitializeBackend() is called. StatusCode InitializeBackend();
diff --git a/media/gpu/vaapi/vaapi_video_decoder.cc b/media/gpu/vaapi/vaapi_video_decoder.cc index f92e5f64..0226a26 100644 --- a/media/gpu/vaapi/vaapi_video_decoder.cc +++ b/media/gpu/vaapi/vaapi_video_decoder.cc
@@ -500,8 +500,8 @@ return nullptr; } - va_surface = vaapi_wrapper_->CreateVASurfaceForPixmap(std::move(pixmap), - transcryption_); + va_surface = vaapi_wrapper_->CreateVASurfaceForPixmap( + std::move(pixmap), cdm_context_ref_ || transcryption_); if (!va_surface || va_surface->id() == VA_INVALID_ID) { SetErrorState("failed to create VASurface from VideoFrame"); return nullptr;
diff --git a/media/gpu/vaapi/vaapi_wrapper.cc b/media/gpu/vaapi/vaapi_wrapper.cc index 4f2aade..0fb039c 100644 --- a/media/gpu/vaapi/vaapi_wrapper.cc +++ b/media/gpu/vaapi/vaapi_wrapper.cc
@@ -2127,6 +2127,15 @@ DCHECK_EQ(va_attrib_extbuf.flags, 0u); DCHECK_EQ(va_attrib_extbuf.private_data, nullptr); + uint32_t va_format = BufferFormatToVARTFormat(buffer_format); + + if (protected_content) { + if (GetImplementationType() == VAImplementation::kMesaGallium) + va_format |= VA_RT_FORMAT_PROTECTED; + else + va_attrib_extbuf.flags = VA_SURFACE_EXTBUF_DESC_PROTECTED; + } + std::vector<VASurfaceAttrib> va_attribs(2); va_attribs[0].type = VASurfaceAttribMemoryType; @@ -2139,13 +2148,6 @@ va_attribs[1].value.type = VAGenericValueTypePointer; va_attribs[1].value.value.p = &va_attrib_extbuf; - unsigned int va_format = BufferFormatToVARTFormat(buffer_format); - - if (protected_content) { - DCHECK_EQ(GetImplementationType(), VAImplementation::kMesaGallium); - va_format |= VA_RT_FORMAT_PROTECTED; - } - VASurfaceID va_surface_id = VA_INVALID_ID; { base::AutoLock auto_lock(*va_lock_);
diff --git a/media/gpu/windows/dxva_video_decode_accelerator_win.cc b/media/gpu/windows/dxva_video_decode_accelerator_win.cc index 4c0a987..ac63b11 100644 --- a/media/gpu/windows/dxva_video_decode_accelerator_win.cc +++ b/media/gpu/windows/dxva_video_decode_accelerator_win.cc
@@ -2347,7 +2347,7 @@ RETURN_AND_NOTIFY_ON_HR_FAILURE(hr, "Failed to check video stream config", PLATFORM_FAILURE, ); - if (disallow_vp9_resilient_dxva_decoding_ && + if (disallow_vp9_resilient_dxva_decoding_ && config_change_detector_ && config_change_detector_->is_vp9_resilient_mode()) { RETURN_AND_NOTIFY_ON_HR_FAILURE( E_FAIL, "Incompatible GPU for VP9 resilient mode", PLATFORM_FAILURE, );
diff --git a/media/mojo/clients/win/media_foundation_renderer_client.cc b/media/mojo/clients/win/media_foundation_renderer_client.cc index 7110e95..9577e035 100644 --- a/media/mojo/clients/win/media_foundation_renderer_client.cc +++ b/media/mojo/clients/win/media_foundation_renderer_client.cc
@@ -95,7 +95,6 @@ auto weak_ptr = weak_factory_.GetWeakPtr(); dcomp_texture_wrapper_->Initialize( gfx::Size(1, 1), - base::BindOnce(&Self::OnDCOMPSurfaceHandleCreated, weak_ptr), base::BindRepeating(&Self::OnCompositionParamsReceived, weak_ptr), base::BindOnce(&Self::OnDCOMPTextureInitialized, weak_ptr)); // `init_cb_` will be handled in `OnDCOMPTextureInitialized()`. @@ -105,8 +104,7 @@ std::move(init_cb_).Run(status); } -// TODO(xhwang): Rename this method to be consistent across the stack. -void MediaFoundationRendererClient::OnDCOMPSurfaceHandleCreated(bool success) { +void MediaFoundationRendererClient::OnDCOMPSurfaceHandleSet(bool success) { DVLOG_FUNC(1); DCHECK(media_task_runner_->BelongsToCurrentThread()); DCHECK(has_video_); @@ -129,7 +127,10 @@ return; } - dcomp_texture_wrapper_->SetDCOMPSurface(token.value()); + dcomp_texture_wrapper_->SetDCOMPSurfaceHandle( + token.value(), + base::BindOnce(&MediaFoundationRendererClient::OnDCOMPSurfaceHandleSet, + weak_factory_.GetWeakPtr())); } void MediaFoundationRendererClient::OnDCOMPTextureInitialized(bool success) {
diff --git a/media/mojo/clients/win/media_foundation_renderer_client.h b/media/mojo/clients/win/media_foundation_renderer_client.h index ff03f69..cedf216e 100644 --- a/media/mojo/clients/win/media_foundation_renderer_client.h +++ b/media/mojo/clients/win/media_foundation_renderer_client.h
@@ -76,7 +76,7 @@ void InitializeDCOMPRenderingIfNeeded(); void OnDCOMPSurfaceReceived( const absl::optional<base::UnguessableToken>& token); - void OnDCOMPSurfaceHandleCreated(bool success); + void OnDCOMPSurfaceHandleSet(bool success); void OnVideoFrameCreated(scoped_refptr<VideoFrame> video_frame); void OnCompositionParamsReceived(gfx::Rect output_rect);
diff --git a/mojo/core/core.cc b/mojo/core/core.cc index 35a3d3c4..15378b4 100644 --- a/mojo/core/core.cc +++ b/mojo/core/core.cc
@@ -449,8 +449,11 @@ } RequestContext request_context; - return message->ExtractSerializedHandles( + Dispatcher::SetExtractingHandlesFromMessage(true); + MojoResult result = message->ExtractSerializedHandles( UserMessageImpl::ExtractBadHandlePolicy::kAbort, handles); + Dispatcher::SetExtractingHandlesFromMessage(false); + return result; } MojoResult Core::SetMessageContext(
diff --git a/mojo/core/data_pipe_consumer_dispatcher.cc b/mojo/core/data_pipe_consumer_dispatcher.cc index e64ac7e..b8bd302b 100644 --- a/mojo/core/data_pipe_consumer_dispatcher.cc +++ b/mojo/core/data_pipe_consumer_dispatcher.cc
@@ -367,6 +367,7 @@ size_t num_handles) { if (num_ports != 1 || num_handles != 1 || num_bytes != sizeof(SerializedState)) { + AssertNotExtractingHandlesFromMessage(); return nullptr; } @@ -375,13 +376,16 @@ state->options.capacity_num_bytes < state->options.element_num_bytes || state->read_offset >= state->options.capacity_num_bytes || state->bytes_available > state->options.capacity_num_bytes) { + AssertNotExtractingHandlesFromMessage(); return nullptr; } NodeController* node_controller = Core::Get()->GetNodeController(); ports::PortRef port; - if (node_controller->node()->GetPort(ports[0], &port) != ports::OK) + if (node_controller->node()->GetPort(ports[0], &port) != ports::OK) { + AssertNotExtractingHandlesFromMessage(); return nullptr; + } auto region_handle = CreateSharedMemoryRegionHandleFromPlatformHandles( std::move(handles[0]), PlatformHandle()); @@ -395,6 +399,7 @@ base::UnsafeSharedMemoryRegion::Deserialize(std::move(region)); if (!ring_buffer.IsValid()) { DLOG(ERROR) << "Failed to deserialize shared buffer handle."; + AssertNotExtractingHandlesFromMessage(); return nullptr; } @@ -409,10 +414,13 @@ dispatcher->bytes_available_ = state->bytes_available; dispatcher->new_data_available_ = state->bytes_available > 0; dispatcher->peer_closed_ = state->flags & kFlagPeerClosed; - if (!dispatcher->InitializeNoLock()) + if (!dispatcher->InitializeNoLock()) { + AssertNotExtractingHandlesFromMessage(); return nullptr; + } if (state->options.capacity_num_bytes > dispatcher->ring_buffer_mapping_.mapped_size()) { + AssertNotExtractingHandlesFromMessage(); return nullptr; } dispatcher->UpdateSignalsStateNoLock();
diff --git a/mojo/core/data_pipe_producer_dispatcher.cc b/mojo/core/data_pipe_producer_dispatcher.cc index 80ff8ee..1cea670 100644 --- a/mojo/core/data_pipe_producer_dispatcher.cc +++ b/mojo/core/data_pipe_producer_dispatcher.cc
@@ -328,6 +328,7 @@ size_t num_handles) { if (num_ports != 1 || num_handles != 1 || num_bytes != sizeof(SerializedState)) { + AssertNotExtractingHandlesFromMessage(); return nullptr; } @@ -336,13 +337,16 @@ state->options.capacity_num_bytes < state->options.element_num_bytes || state->write_offset >= state->options.capacity_num_bytes || state->available_capacity > state->options.capacity_num_bytes) { + AssertNotExtractingHandlesFromMessage(); return nullptr; } NodeController* node_controller = Core::Get()->GetNodeController(); ports::PortRef port; - if (node_controller->node()->GetPort(ports[0], &port) != ports::OK) + if (node_controller->node()->GetPort(ports[0], &port) != ports::OK) { + AssertNotExtractingHandlesFromMessage(); return nullptr; + } auto region_handle = CreateSharedMemoryRegionHandleFromPlatformHandles( std::move(handles[0]), PlatformHandle()); @@ -356,6 +360,7 @@ base::UnsafeSharedMemoryRegion::Deserialize(std::move(region)); if (!ring_buffer.IsValid()) { DLOG(ERROR) << "Failed to deserialize shared buffer handle."; + AssertNotExtractingHandlesFromMessage(); return nullptr; } @@ -369,10 +374,13 @@ dispatcher->write_offset_ = state->write_offset; dispatcher->available_capacity_ = state->available_capacity; dispatcher->peer_closed_ = state->flags & kFlagPeerClosed; - if (!dispatcher->InitializeNoLock()) + if (!dispatcher->InitializeNoLock()) { + AssertNotExtractingHandlesFromMessage(); return nullptr; + } if (state->options.capacity_num_bytes > dispatcher->ring_buffer_mapping_.mapped_size()) { + AssertNotExtractingHandlesFromMessage(); return nullptr; } dispatcher->UpdateSignalsStateNoLock();
diff --git a/mojo/core/dispatcher.cc b/mojo/core/dispatcher.cc index 25959441..6ac8244 100644 --- a/mojo/core/dispatcher.cc +++ b/mojo/core/dispatcher.cc
@@ -5,6 +5,8 @@ #include "mojo/core/dispatcher.h" #include "base/logging.h" +#include "base/no_destructor.h" +#include "base/threading/thread_local.h" #include "mojo/core/configuration.h" #include "mojo/core/data_pipe_consumer_dispatcher.h" #include "mojo/core/data_pipe_producer_dispatcher.h" @@ -16,6 +18,15 @@ namespace mojo { namespace core { +namespace { + +base::ThreadLocalBoolean& IsExtractingHandlesFromMessage() { + static base::NoDestructor<base::ThreadLocalBoolean> flag; + return *flag; +} + +} // namespace + Dispatcher::DispatcherInTransit::DispatcherInTransit() = default; Dispatcher::DispatcherInTransit::DispatcherInTransit( @@ -23,6 +34,16 @@ Dispatcher::DispatcherInTransit::~DispatcherInTransit() = default; +// static +void Dispatcher::SetExtractingHandlesFromMessage(bool extracting) { + IsExtractingHandlesFromMessage().Set(extracting); +} + +// static +void Dispatcher::AssertNotExtractingHandlesFromMessage() { + CHECK(!IsExtractingHandlesFromMessage().Get()); +} + MojoResult Dispatcher::WatchDispatcher(scoped_refptr<Dispatcher> dispatcher, MojoHandleSignals signals, MojoTriggerCondition condition,
diff --git a/mojo/core/dispatcher.h b/mojo/core/dispatcher.h index be62e70..3fad068 100644 --- a/mojo/core/dispatcher.h +++ b/mojo/core/dispatcher.h
@@ -74,6 +74,17 @@ PLATFORM_HANDLE = -1, }; + // TODO(crbug.com/1229671): Remove these and all callers. + // + // The assert is invoked at various points of handle deserialization failure. + // Such failures are expected and innocuous when destroying unread or unsent, + // discarded messages with attachments that may no longer be valid; but they + // are problematic when hit during normal message deserialization for messages + // the application expects to read and dispatch. Both this setter and the + // assertion are concerned only with their calling thread. + static void SetExtractingHandlesFromMessage(bool extracting); + static void AssertNotExtractingHandlesFromMessage(); + // All Dispatchers must minimally implement these methods. virtual Type GetType() const = 0;
diff --git a/mojo/core/message_pipe_dispatcher.cc b/mojo/core/message_pipe_dispatcher.cc index bbe013f..3fb553b 100644 --- a/mojo/core/message_pipe_dispatcher.cc +++ b/mojo/core/message_pipe_dispatcher.cc
@@ -357,19 +357,25 @@ size_t num_ports, PlatformHandle* handles, size_t num_handles) { - if (num_ports != 1 || num_handles || num_bytes != sizeof(SerializedState)) + if (num_ports != 1 || num_handles || num_bytes != sizeof(SerializedState)) { + AssertNotExtractingHandlesFromMessage(); return nullptr; + } const SerializedState* state = static_cast<const SerializedState*>(data); ports::Node* node = Core::Get()->GetNodeController()->node(); ports::PortRef port; - if (node->GetPort(ports[0], &port) != ports::OK) + if (node->GetPort(ports[0], &port) != ports::OK) { + AssertNotExtractingHandlesFromMessage(); return nullptr; + } ports::PortStatus status; - if (node->GetStatus(port, &status) != ports::OK) + if (node->GetStatus(port, &status) != ports::OK) { + AssertNotExtractingHandlesFromMessage(); return nullptr; + } return new MessagePipeDispatcher(Core::Get()->GetNodeController(), port, state->pipe_id, state->endpoint);
diff --git a/mojo/core/platform_handle_dispatcher.cc b/mojo/core/platform_handle_dispatcher.cc index 7029b96..d933c5d6 100644 --- a/mojo/core/platform_handle_dispatcher.cc +++ b/mojo/core/platform_handle_dispatcher.cc
@@ -77,8 +77,10 @@ size_t num_ports, PlatformHandle* handles, size_t num_handles) { - if (num_bytes || num_ports || num_handles != 1) + if (num_bytes || num_ports || num_handles != 1) { + AssertNotExtractingHandlesFromMessage(); return nullptr; + } return PlatformHandleDispatcher::Create(std::move(handles[0])); }
diff --git a/mojo/core/shared_buffer_dispatcher.cc b/mojo/core/shared_buffer_dispatcher.cc index d49f4e3..e9bc911 100644 --- a/mojo/core/shared_buffer_dispatcher.cc +++ b/mojo/core/shared_buffer_dispatcher.cc
@@ -125,6 +125,7 @@ PlatformHandle* platform_handles, size_t num_platform_handles) { if (num_bytes != sizeof(SerializedState)) { + AssertNotExtractingHandlesFromMessage(); LOG(ERROR) << "Invalid serialized shared buffer dispatcher (bad size)"; return nullptr; } @@ -132,13 +133,16 @@ const SerializedState* serialized_state = static_cast<const SerializedState*>(bytes); if (!serialized_state->num_bytes) { + AssertNotExtractingHandlesFromMessage(); LOG(ERROR) << "Invalid serialized shared buffer dispatcher (invalid num_bytes)"; return nullptr; } - if (num_ports) + if (num_ports) { + AssertNotExtractingHandlesFromMessage(); return nullptr; + } PlatformHandle handles[2]; #if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_MAC) @@ -152,8 +156,10 @@ return nullptr; } #else - if (num_platform_handles != 1) + if (num_platform_handles != 1) { + AssertNotExtractingHandlesFromMessage(); return nullptr; + } #endif handles[0] = std::move(platform_handles[0]); @@ -172,6 +178,7 @@ mode = base::subtle::PlatformSharedMemoryRegion::Mode::kUnsafe; break; default: + AssertNotExtractingHandlesFromMessage(); LOG(ERROR) << "Invalid serialized shared buffer access mode."; return nullptr; } @@ -181,6 +188,7 @@ std::move(handles[1])), mode, static_cast<size_t>(serialized_state->num_bytes), guid); if (!region.IsValid()) { + AssertNotExtractingHandlesFromMessage(); LOG(ERROR) << "Invalid serialized shared buffer dispatcher (invalid num_bytes?)"; return nullptr;
diff --git a/net/BUILD.gn b/net/BUILD.gn index 24c8157..2801b0fb 100644 --- a/net/BUILD.gn +++ b/net/BUILD.gn
@@ -4405,7 +4405,6 @@ "url_request/url_fetcher_impl_unittest.cc", "url_request/url_fetcher_response_writer_unittest.cc", "url_request/url_request_context_builder_unittest.cc", - "url_request/url_request_context_unittest.cc", "url_request/url_request_filter_unittest.cc", "url_request/url_request_http_job_unittest.cc", "url_request/url_request_job_factory_unittest.cc",
diff --git a/net/base/host_port_pair.cc b/net/base/host_port_pair.cc index efa039d3..5e4c2d3a 100644 --- a/net/base/host_port_pair.cc +++ b/net/base/host_port_pair.cc
@@ -92,8 +92,4 @@ return host_; } -size_t HostPortPair::EstimateMemoryUsage() const { - return base::trace_event::EstimateMemoryUsage(host_); -} - } // namespace net
diff --git a/net/base/host_port_pair.h b/net/base/host_port_pair.h index 2ac2aaf2..6a006da 100644 --- a/net/base/host_port_pair.h +++ b/net/base/host_port_pair.h
@@ -78,9 +78,6 @@ // Returns |host_|, adding IPv6 brackets if needed. std::string HostForURL() const; - // Returns the estimate of dynamically allocated memory in bytes. - size_t EstimateMemoryUsage() const; - private: // If |host_| represents an IPv6 address, this string will not contain // brackets around the address.
diff --git a/net/base/proxy_server.cc b/net/base/proxy_server.cc index a0b8fd1..5b652998 100644 --- a/net/base/proxy_server.cc +++ b/net/base/proxy_server.cc
@@ -196,10 +196,6 @@ return GetSchemeFromURIInternal(scheme); } -size_t ProxyServer::EstimateMemoryUsage() const { - return base::trace_event::EstimateMemoryUsage(host_port_pair_); -} - // static ProxyServer ProxyServer::FromSchemeHostAndPort( Scheme scheme,
diff --git a/net/base/proxy_server.h b/net/base/proxy_server.h index 21206d05..c23b54e 100644 --- a/net/base/proxy_server.h +++ b/net/base/proxy_server.h
@@ -165,9 +165,6 @@ std::tie(other.scheme_, other.host_port_pair_); } - // Returns the estimate of dynamically allocated memory in bytes. - size_t EstimateMemoryUsage() const; - private: // Creates a ProxyServer given a scheme, and host/port string. If parsing the // host/port string fails, the returned instance will be invalid.
diff --git a/net/cookies/canonical_cookie.cc b/net/cookies/canonical_cookie.cc index e9d0122..5c1c1e9a 100644 --- a/net/cookies/canonical_cookie.cc +++ b/net/cookies/canonical_cookie.cc
@@ -758,6 +758,10 @@ bool CanonicalCookie::IsEquivalentForSecureCookieMatching( const CanonicalCookie& secure_cookie) const { + bool same_partition_key = + !base::FeatureList::IsEnabled(features::kPartitionedCookies) || + PartitionKey() == secure_cookie.PartitionKey(); + // Names must be the same bool same_name = name_ == secure_cookie.Name(); @@ -772,7 +776,7 @@ bool path_match = secure_cookie.IsOnPath(Path()); bool equivalent_for_secure_cookie_matching = - same_name && domain_match && path_match; + same_partition_key && same_name && domain_match && path_match; // IsEquivalent() is a stricter check than this. DCHECK(!IsEquivalent(secure_cookie) || equivalent_for_secure_cookie_matching);
diff --git a/net/cookies/canonical_cookie.h b/net/cookies/canonical_cookie.h index a8dd4c7a..a0acb97 100644 --- a/net/cookies/canonical_cookie.h +++ b/net/cookies/canonical_cookie.h
@@ -260,6 +260,8 @@ // Returns 'true' if this cookie's name matches |secure_cookie|, and this // cookie is a domain-match for |secure_cookie| (or vice versa), and // |secure_cookie|'s path is "on" this cookie's path (as per 'IsOnPath()'). + // If partitioned cookies are enabled, it also checks that the cookie has + // the same partition key as |secure_cookie|. // // Note that while the domain-match cuts both ways (e.g. 'example.com' // matches 'www.example.com' in either direction), the path-match is
diff --git a/net/cookies/canonical_cookie_unittest.cc b/net/cookies/canonical_cookie_unittest.cc index 55d49f2..3032e85a 100644 --- a/net/cookies/canonical_cookie_unittest.cc +++ b/net/cookies/canonical_cookie_unittest.cc
@@ -762,6 +762,17 @@ bool PartitionedCookiesEnabled() { return GetParam(); } base::test::ScopedFeatureList scoped_feature_list_; + + std::unique_ptr<CanonicalCookie> CreateCookieWithPartitionKey( + absl::optional<CookiePartitionKey> cookie_partition_key) { + return CanonicalCookie::CreateUnsafeCookieForTesting( + "__Host-foo" /* name */, "bar" /* value */, "" /* domain */, + "/" /* path */, base::Time() /* creation_time */, + base::Time() /* expiration_time */, + base::Time() /* last_accessed_time */, true /* secure */, + false /* http_only */, CookieSameSite::NO_RESTRICTION, + COOKIE_PRIORITY_DEFAULT, false /* same_party */, cookie_partition_key); + } }; INSTANTIATE_TEST_SUITE_P(/* no label */, @@ -769,19 +780,6 @@ testing::Bool()); TEST_P(PartitionedCanonicalCookieTest, IsEquivalent) { - const std::string name = "__Host-foo"; - const std::string value = "bar"; - const std::string domain = ""; - const std::string path = "/"; - const base::Time creation_time = base::Time(); - const base::Time expiration_time = base::Time(); - const base::Time last_accessed_time = base::Time(); - const bool secure = true; - const bool http_only = false; - const CookieSameSite same_site = CookieSameSite::NO_RESTRICTION; - const CookiePriority cookie_priority = COOKIE_PRIORITY_DEFAULT; - const bool same_party = false; - const absl::optional<CookiePartitionKey> cookie_partition_key = absl::make_optional( CookiePartitionKey::FromURLForTesting(GURL("https://foo.com"))); @@ -789,14 +787,8 @@ absl::make_optional( CookiePartitionKey::FromURLForTesting(GURL("https://bar.com"))); - auto unpartitioned_cookie = CanonicalCookie::CreateUnsafeCookieForTesting( - name, value, domain, path, creation_time, expiration_time, - last_accessed_time, secure, http_only, same_site, cookie_priority, - same_party, absl::nullopt); - auto partitioned_cookie = CanonicalCookie::CreateUnsafeCookieForTesting( - name, value, domain, path, creation_time, expiration_time, - last_accessed_time, secure, http_only, same_site, cookie_priority, - same_party, cookie_partition_key); + auto unpartitioned_cookie = CreateCookieWithPartitionKey(absl::nullopt); + auto partitioned_cookie = CreateCookieWithPartitionKey(cookie_partition_key); // Check that a cookie without a partition key is not equivalent to a cookie // with one when partitioned cookie are enabled. If they are disabled the @@ -806,22 +798,48 @@ // Check that cookies with the same partition key are equivalent. This should // be true regardless of the partitioned cookies setting. - auto other_cookie = CanonicalCookie::CreateUnsafeCookieForTesting( - name, value, domain, path, creation_time, expiration_time, - last_accessed_time, secure, http_only, same_site, cookie_priority, - same_party, cookie_partition_key); + auto other_cookie = CreateCookieWithPartitionKey(cookie_partition_key); EXPECT_TRUE(partitioned_cookie->IsEquivalent(*other_cookie)); // Check that cookies with different partition keys are not equivalent only // when partitioned cookies are enabled. - other_cookie = CanonicalCookie::CreateUnsafeCookieForTesting( - name, value, domain, path, creation_time, expiration_time, - last_accessed_time, secure, http_only, same_site, cookie_priority, - same_party, other_cookie_partition_key); + other_cookie = CreateCookieWithPartitionKey(other_cookie_partition_key); EXPECT_NE(PartitionedCookiesEnabled(), partitioned_cookie->IsEquivalent(*other_cookie)); } +TEST_P(PartitionedCanonicalCookieTest, IsEquivalentForSecureCookieMatching) { + const absl::optional<CookiePartitionKey> cookie_partition_key = + absl::make_optional( + CookiePartitionKey::FromURLForTesting(GURL("https://foo.com"))); + const absl::optional<CookiePartitionKey> other_cookie_partition_key = + absl::make_optional( + CookiePartitionKey::FromURLForTesting(GURL("https://bar.com"))); + + auto unpartitioned_cookie = CreateCookieWithPartitionKey(absl::nullopt); + auto partitioned_cookie = CreateCookieWithPartitionKey(cookie_partition_key); + + // Check that a cookie without a partition key is not equivalent to a cookie + // with one when partitioned cookie are enabled. If they are disabled the + // cookies should be equivalent. + EXPECT_NE(PartitionedCookiesEnabled(), + unpartitioned_cookie->IsEquivalentForSecureCookieMatching( + *partitioned_cookie)); + + // Check that cookies with the same partition key are equivalent. This should + // be true regardless of the partitioned cookies setting. + auto other_cookie = CreateCookieWithPartitionKey(cookie_partition_key); + EXPECT_TRUE( + partitioned_cookie->IsEquivalentForSecureCookieMatching(*other_cookie)); + + // Check that cookies with different partition keys are not equivalent only + // when partitioned cookies are enabled. + other_cookie = CreateCookieWithPartitionKey(other_cookie_partition_key); + EXPECT_NE( + PartitionedCookiesEnabled(), + partitioned_cookie->IsEquivalentForSecureCookieMatching(*other_cookie)); +} + TEST(CanonicalCookieTest, IsEquivalentForSecureCookieMatching) { struct { struct {
diff --git a/net/disk_cache/backend_unittest.cc b/net/disk_cache/backend_unittest.cc index 8bdbe5b..8ac4fed 100644 --- a/net/disk_cache/backend_unittest.cc +++ b/net/disk_cache/backend_unittest.cc
@@ -817,56 +817,6 @@ DisableIntegrityCheck(); } -TEST_F(DiskCacheBackendTest, MemCacheMemoryDump) { - SetMemoryOnlyMode(); - BackendBasics(); - base::trace_event::MemoryDumpArgs args = { - base::trace_event::MemoryDumpLevelOfDetail::BACKGROUND}; - base::trace_event::ProcessMemoryDump pmd(args); - base::trace_event::MemoryAllocatorDump* parent = - pmd.CreateAllocatorDump("net/url_request_context/main/0x123/http_cache"); - - ASSERT_LT(0u, cache_->DumpMemoryStats(&pmd, parent->absolute_name())); - EXPECT_EQ(2u, pmd.allocator_dumps().size()); - const base::trace_event::MemoryAllocatorDump* sub_dump = - pmd.GetAllocatorDump(parent->absolute_name() + "/memory_backend"); - ASSERT_NE(nullptr, sub_dump); - - using MADEntry = base::trace_event::MemoryAllocatorDump::Entry; - const std::vector<MADEntry>& entries = sub_dump->entries(); - ASSERT_THAT( - entries, - Contains(Field(&MADEntry::name, - Eq(base::trace_event::MemoryAllocatorDump::kNameSize)))); - ASSERT_THAT(entries, - Contains(Field(&MADEntry::name, Eq("mem_backend_max_size")))); - ASSERT_THAT(entries, - Contains(Field(&MADEntry::name, Eq("mem_backend_size")))); -} - -TEST_F(DiskCacheBackendTest, SimpleCacheMemoryDump) { - simple_cache_mode_ = true; - BackendBasics(); - base::trace_event::MemoryDumpArgs args = { - base::trace_event::MemoryDumpLevelOfDetail::BACKGROUND}; - base::trace_event::ProcessMemoryDump pmd(args); - base::trace_event::MemoryAllocatorDump* parent = - pmd.CreateAllocatorDump("net/url_request_context/main/0x123/http_cache"); - - ASSERT_LT(0u, cache_->DumpMemoryStats(&pmd, parent->absolute_name())); - EXPECT_EQ(2u, pmd.allocator_dumps().size()); - const base::trace_event::MemoryAllocatorDump* sub_dump = - pmd.GetAllocatorDump(parent->absolute_name() + "/simple_backend"); - ASSERT_NE(nullptr, sub_dump); - - using MADEntry = base::trace_event::MemoryAllocatorDump::Entry; - const std::vector<MADEntry>& entries = sub_dump->entries(); - ASSERT_THAT(entries, - ElementsAre(Field( - &MADEntry::name, - Eq(base::trace_event::MemoryAllocatorDump::kNameSize)))); -} - TEST_F(DiskCacheBackendTest, BlockFileCacheMemoryDump) { // TODO(jkarlin): If the blockfile cache gets memory dump support, update // this test.
diff --git a/net/disk_cache/memory/mem_backend_impl.cc b/net/disk_cache/memory/mem_backend_impl.cc index 8678c60..868f4c9e 100644 --- a/net/disk_cache/memory/mem_backend_impl.cc +++ b/net/disk_cache/memory/mem_backend_impl.cc
@@ -324,25 +324,11 @@ it->second->UpdateStateOnUse(MemEntryImpl::ENTRY_WAS_NOT_MODIFIED); } +// TODO(crbug.com/1239513): Remove this method. size_t MemBackendImpl::DumpMemoryStats( base::trace_event::ProcessMemoryDump* pmd, const std::string& parent_absolute_name) const { - base::trace_event::MemoryAllocatorDump* dump = - pmd->CreateAllocatorDump(parent_absolute_name + "/memory_backend"); - - // Entries in lru_list_ will be counted by EMU but not in entries_ since - // they're pointers. - size_t size = base::trace_event::EstimateMemoryUsage(lru_list_) + - base::trace_event::EstimateMemoryUsage(entries_); - dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize, - base::trace_event::MemoryAllocatorDump::kUnitsBytes, size); - dump->AddScalar("mem_backend_size", - base::trace_event::MemoryAllocatorDump::kUnitsBytes, - current_size_); - dump->AddScalar("mem_backend_max_size", - base::trace_event::MemoryAllocatorDump::kUnitsBytes, - max_size_); - return size; + return 0; } void MemBackendImpl::EvictIfNeeded() {
diff --git a/net/disk_cache/memory/mem_entry_impl.cc b/net/disk_cache/memory/mem_entry_impl.cc index 3e17d53..6718048a 100644 --- a/net/disk_cache/memory/mem_entry_impl.cc +++ b/net/disk_cache/memory/mem_entry_impl.cc
@@ -281,14 +281,6 @@ last_used_ = time; } -size_t MemEntryImpl::EstimateMemoryUsage() const { - // Subtlety: the entries in children_ are not double counted, as the entry - // pointers won't be followed by EstimateMemoryUsage. - return base::trace_event::EstimateMemoryUsage(data_) + - base::trace_event::EstimateMemoryUsage(key_) + - base::trace_event::EstimateMemoryUsage(children_); -} - // ------------------------------------------------------------------------ MemEntryImpl::MemEntryImpl(base::WeakPtr<MemBackendImpl> backend,
diff --git a/net/disk_cache/memory/mem_entry_impl.h b/net/disk_cache/memory/mem_entry_impl.h index 9b71e03a..af0cc9a 100644 --- a/net/disk_cache/memory/mem_entry_impl.h +++ b/net/disk_cache/memory/mem_entry_impl.h
@@ -133,7 +133,6 @@ void CancelSparseIO() override {} net::Error ReadyForSparseIO(CompletionOnceCallback callback) override; void SetLastUsedTimeForTest(base::Time time) override; - size_t EstimateMemoryUsage() const; private: MemEntryImpl(base::WeakPtr<MemBackendImpl> backend,
diff --git a/net/disk_cache/simple/simple_backend_impl.cc b/net/disk_cache/simple/simple_backend_impl.cc index d79a9cac..4ee81833 100644 --- a/net/disk_cache/simple/simple_backend_impl.cc +++ b/net/disk_cache/simple/simple_backend_impl.cc
@@ -187,13 +187,6 @@ const base::Feature SimpleBackendImpl::kPrioritizedSimpleCacheTasks{ "PrioritizedSimpleCacheTasks", base::FEATURE_ENABLED_BY_DEFAULT}; -// Static function which is called by base::trace_event::EstimateMemoryUsage() -// to estimate the memory of SimpleEntryImpl* type. -// This needs to be in disk_cache namespace. -size_t EstimateMemoryUsage(const SimpleEntryImpl* const& entry_impl) { - return sizeof(SimpleEntryImpl) + entry_impl->EstimateMemoryUsage(); -} - class SimpleBackendImpl::ActiveEntryProxy : public SimpleEntryImpl::ActiveEntryProxy { public: @@ -646,19 +639,11 @@ index_->UseIfExists(simple_util::GetEntryHashKey(key)); } +// TODO(crbug.com/1239513): Remove this method. size_t SimpleBackendImpl::DumpMemoryStats( base::trace_event::ProcessMemoryDump* pmd, const std::string& parent_absolute_name) const { - base::trace_event::MemoryAllocatorDump* dump = - pmd->CreateAllocatorDump(parent_absolute_name + "/simple_backend"); - - size_t size = base::trace_event::EstimateMemoryUsage(index_) + - base::trace_event::EstimateMemoryUsage(active_entries_); - // TODO(xunjieli): crbug.com/669108. Track |post_doom_waiting_| once - // base::OnceClosure is supported in memory_usage_estimator.h. - dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize, - base::trace_event::MemoryAllocatorDump::kUnitsBytes, size); - return size; + return 0; } uint8_t SimpleBackendImpl::GetEntryInMemoryData(const std::string& key) {
diff --git a/net/disk_cache/simple/simple_entry_impl.cc b/net/disk_cache/simple/simple_entry_impl.cc index 69db7cf..6ee786a 100644 --- a/net/disk_cache/simple/simple_entry_impl.cc +++ b/net/disk_cache/simple/simple_entry_impl.cc
@@ -105,13 +105,6 @@ using base::Time; using base::TaskRunner; -// Static function called by base::trace_event::EstimateMemoryUsage() to -// estimate the memory of SimpleEntryOperation. -// This needs to be in disk_cache namespace. -size_t EstimateMemoryUsage(const SimpleEntryOperation& op) { - return 0; -} - // A helper class to insure that RunNextOperationIfNeeded() is called when // exiting the current stack frame. class SimpleEntryImpl::ScopedOperationRunner { @@ -608,15 +601,6 @@ backend_->index()->SetLastUsedTimeForTest(entry_hash_, time); } -size_t SimpleEntryImpl::EstimateMemoryUsage() const { - // TODO(xunjieli): crbug.com/669108. It'd be nice to have the rest of |entry| - // measured, but the ownership of SimpleSynchronousEntry isn't straightforward - return sizeof(SimpleSynchronousEntry) + - base::trace_event::EstimateMemoryUsage(pending_operations_) + - (stream_0_data_ ? stream_0_data_->capacity() : 0) + - (stream_1_prefetch_data_ ? stream_1_prefetch_data_->capacity() : 0); -} - void SimpleEntryImpl::SetPriority(uint32_t entry_priority) { entry_priority_ = entry_priority; }
diff --git a/net/disk_cache/simple/simple_entry_impl.h b/net/disk_cache/simple/simple_entry_impl.h index 9a133e6..3235be35 100644 --- a/net/disk_cache/simple/simple_entry_impl.h +++ b/net/disk_cache/simple/simple_entry_impl.h
@@ -142,9 +142,6 @@ net::Error ReadyForSparseIO(CompletionOnceCallback callback) override; void SetLastUsedTimeForTest(base::Time time) override; - // Returns the estimate of dynamically allocated memory in bytes. - size_t EstimateMemoryUsage() const; - // Changes the entry's priority in its TaskRunner. void SetPriority(uint32_t entry_priority);
diff --git a/net/disk_cache/simple/simple_index.cc b/net/disk_cache/simple/simple_index.cc index 03485ed16..574b231a 100644 --- a/net/disk_cache/simple/simple_index.cc +++ b/net/disk_cache/simple/simple_index.cc
@@ -304,11 +304,6 @@ return size; } -size_t SimpleIndex::EstimateMemoryUsage() const { - return base::trace_event::EstimateMemoryUsage(entries_set_) + - base::trace_event::EstimateMemoryUsage(removed_entries_); -} - base::Time SimpleIndex::GetLastUsedTime(uint64_t entry_hash) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_NE(cache_type_, net::APP_CACHE);
diff --git a/net/disk_cache/simple/simple_index.h b/net/disk_cache/simple/simple_index.h index d62e0fb9..ba55465a 100644 --- a/net/disk_cache/simple/simple_index.h +++ b/net/disk_cache/simple/simple_index.h
@@ -216,9 +216,6 @@ IndexInitMethod init_method() const { return init_method_; } - // Returns the estimate of dynamically allocated memory in bytes. - size_t EstimateMemoryUsage() const; - // Returns base::Time() if hash not known. base::Time GetLastUsedTime(uint64_t entry_hash); void SetLastUsedTimeForTest(uint64_t entry_hash, const base::Time last_used);
diff --git a/net/dns/dns_config_service_linux.cc b/net/dns/dns_config_service_linux.cc index f29c5e8..93bda26 100644 --- a/net/dns/dns_config_service_linux.cc +++ b/net/dns/dns_config_service_linux.cc
@@ -32,6 +32,7 @@ #include "net/base/ip_endpoint.h" #include "net/dns/dns_config.h" #include "net/dns/nsswitch_reader.h" +#include "net/dns/public/resolv_reader.h" #include "net/dns/serial_worker.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -58,37 +59,18 @@ absl::optional<DnsConfig> ConvertResStateToDnsConfig( const struct __res_state& res) { + absl::optional<std::vector<net::IPEndPoint>> nameservers = + GetNameservers(res); DnsConfig dns_config; dns_config.unhandled_options = false; - if (!(res.options & RES_INIT)) + if (!nameservers.has_value()) return absl::nullopt; - static_assert(std::extent<decltype(res.nsaddr_list)>() >= MAXNS && - std::extent<decltype(res._u._ext.nsaddrs)>() >= MAXNS, - "incompatible libresolv res_state"); - DCHECK_LE(res.nscount, MAXNS); - // Initially, glibc stores IPv6 in |_ext.nsaddrs| and IPv4 in |nsaddr_list|. - // In res_send.c:res_nsend, it merges |nsaddr_list| into |nsaddrs|, - // but we have to combine the two arrays ourselves. - for (int i = 0; i < res.nscount; ++i) { - IPEndPoint ipe; - const struct sockaddr* addr = nullptr; - size_t addr_len = 0; - if (res.nsaddr_list[i].sin_family) { // The indicator used by res_nsend. - addr = reinterpret_cast<const struct sockaddr*>(&res.nsaddr_list[i]); - addr_len = sizeof res.nsaddr_list[i]; - } else if (res._u._ext.nsaddrs[i]) { - addr = reinterpret_cast<const struct sockaddr*>(res._u._ext.nsaddrs[i]); - addr_len = sizeof *res._u._ext.nsaddrs[i]; - } else { - return absl::nullopt; - } - if (!ipe.FromSockAddr(addr, addr_len)) - return absl::nullopt; - dns_config.nameservers.push_back(ipe); - } + // Expected to be validated by GetNameservers() + DCHECK(res.options & RES_INIT); + dns_config.nameservers = std::move(nameservers.value()); dns_config.search.clear(); for (int i = 0; (i < MAXDNSRCH) && res.dnsrch[i]; ++i) { dns_config.search.emplace_back(res.dnsrch[i]); @@ -484,24 +466,6 @@ std::unique_ptr<NsswitchReader> nsswitch_reader_; }; -std::unique_ptr<struct __res_state> -DnsConfigServiceLinux::ResolvReader::GetResState() { - auto res = std::make_unique<struct __res_state>(); - memset(res.get(), 0, sizeof(struct __res_state)); - - if (res_ninit(res.get()) != 0) { - CloseResState(res.get()); - return nullptr; - } - - return res; -} - -void DnsConfigServiceLinux::ResolvReader::CloseResState( - struct __res_state* res) { - res_nclose(res); -} - DnsConfigServiceLinux::DnsConfigServiceLinux() : DnsConfigService(kFilePathHosts) { // Allow constructing on one thread and living on another.
diff --git a/net/dns/dns_config_service_linux.h b/net/dns/dns_config_service_linux.h index 93cab451..be41bd4 100644 --- a/net/dns/dns_config_service_linux.h +++ b/net/dns/dns_config_service_linux.h
@@ -5,9 +5,6 @@ #ifndef NET_DNS_DNS_CONFIG_SERVICE_LINUX_H_ #define NET_DNS_DNS_CONFIG_SERVICE_LINUX_H_ -#include <arpa/inet.h> -#include <resolv.h> - #include <memory> #include <utility> @@ -16,6 +13,7 @@ #include "net/base/net_export.h" #include "net/dns/dns_config_service.h" #include "net/dns/nsswitch_reader.h" +#include "net/dns/public/resolv_reader.h" namespace net { @@ -29,18 +27,6 @@ // it's later called on. WatchConfig() must be called prior to ReadConfig(). class NET_EXPORT_PRIVATE DnsConfigServiceLinux : public DnsConfigService { public: - // Test-overridable class to handle the interactions with OS APIs for reading - // resolv.conf. - class NET_EXPORT_PRIVATE ResolvReader { - public: - virtual ~ResolvReader() = default; - - // Null` on failure. If not null, result must be cleaned up through a call - // to `CloseResState()`. - virtual std::unique_ptr<struct __res_state> GetResState(); - virtual void CloseResState(struct __res_state* res); - }; - DnsConfigServiceLinux(); ~DnsConfigServiceLinux() override;
diff --git a/net/dns/dns_config_service_linux_unittest.cc b/net/dns/dns_config_service_linux_unittest.cc index 9dce781..d260f7e2 100644 --- a/net/dns/dns_config_service_linux_unittest.cc +++ b/net/dns/dns_config_service_linux_unittest.cc
@@ -158,7 +158,7 @@ base::RunLoop run_loop_; }; -class TestResolvReader : public internal::DnsConfigServiceLinux::ResolvReader { +class TestResolvReader : public ResolvReader { public: void set_value(std::unique_ptr<struct __res_state> value) { value_ = std::move(value); @@ -167,7 +167,7 @@ bool closed() { return closed_; } - // DnsConfigServiceLinux::ResolvReader: + // ResolvReader: std::unique_ptr<struct __res_state> GetResState() override { return std::move(value_); }
diff --git a/net/dns/public/BUILD.gn b/net/dns/public/BUILD.gn index 338dbdb..3bfc0a8c 100644 --- a/net/dns/public/BUILD.gn +++ b/net/dns/public/BUILD.gn
@@ -37,6 +37,13 @@ "util.h", ] + if (is_linux) { + sources += [ + "resolv_reader.cc", + "resolv_reader.h", + ] + } + deps = [ "//net:net_deps" ] public_deps = [ "//net:net_public_deps" ] @@ -55,6 +62,10 @@ "util_unittest.cc", ] + if (is_linux) { + sources += [ "resolv_reader_unittest.cc" ] + } + deps = [ "//net", "//testing/gtest",
diff --git a/net/dns/public/resolv_reader.cc b/net/dns/public/resolv_reader.cc new file mode 100644 index 0000000..5686762 --- /dev/null +++ b/net/dns/public/resolv_reader.cc
@@ -0,0 +1,73 @@ +// 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 "net/dns/public/resolv_reader.h" + +#include <netinet/in.h> +#include <resolv.h> +#include <sys/types.h> + +#include <memory> +#include <type_traits> +#include <utility> +#include <vector> + +#include "base/bind.h" +#include "base/check_op.h" +#include "net/base/ip_endpoint.h" + +namespace net { + +std::unique_ptr<struct __res_state> ResolvReader::GetResState() { + auto res = std::make_unique<struct __res_state>(); + memset(res.get(), 0, sizeof(struct __res_state)); + + if (res_ninit(res.get()) != 0) { + CloseResState(res.get()); + return nullptr; + } + + return res; +} + +void ResolvReader::CloseResState(struct __res_state* res) { + res_nclose(res); +} + +absl::optional<std::vector<IPEndPoint>> GetNameservers( + const struct __res_state& res) { + std::vector<IPEndPoint> nameservers; + + if (!(res.options & RES_INIT)) + return absl::nullopt; + + static_assert(std::extent<decltype(res.nsaddr_list)>() >= MAXNS && + std::extent<decltype(res._u._ext.nsaddrs)>() >= MAXNS, + "incompatible libresolv res_state"); + DCHECK_LE(res.nscount, MAXNS); + // Initially, glibc stores IPv6 in |_ext.nsaddrs| and IPv4 in |nsaddr_list|. + // In res_send.c:res_nsend, it merges |nsaddr_list| into |nsaddrs|, + // but we have to combine the two arrays ourselves. + for (int i = 0; i < res.nscount; ++i) { + IPEndPoint ipe; + const struct sockaddr* addr = nullptr; + size_t addr_len = 0; + if (res.nsaddr_list[i].sin_family) { // The indicator used by res_nsend. + addr = reinterpret_cast<const struct sockaddr*>(&res.nsaddr_list[i]); + addr_len = sizeof res.nsaddr_list[i]; + } else if (res._u._ext.nsaddrs[i]) { + addr = reinterpret_cast<const struct sockaddr*>(res._u._ext.nsaddrs[i]); + addr_len = sizeof *res._u._ext.nsaddrs[i]; + } else { + return absl::nullopt; + } + if (!ipe.FromSockAddr(addr, addr_len)) + return absl::nullopt; + nameservers.push_back(ipe); + } + + return nameservers; +} + +} // namespace net \ No newline at end of file
diff --git a/net/dns/public/resolv_reader.h b/net/dns/public/resolv_reader.h new file mode 100644 index 0000000..0f9d2ac --- /dev/null +++ b/net/dns/public/resolv_reader.h
@@ -0,0 +1,37 @@ +// 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 NET_DNS_PUBLIC_RESOLV_READER_H_ +#define NET_DNS_PUBLIC_RESOLV_READER_H_ + +#include <resolv.h> + +#include <memory> +#include <vector> + +#include "net/base/ip_endpoint.h" +#include "net/base/net_export.h" +#include "third_party/abseil-cpp/absl/types/optional.h" + +namespace net { + +// Test-overridable class to handle the interactions with OS APIs for reading +// resolv.conf. +class NET_EXPORT ResolvReader { + public: + virtual ~ResolvReader() = default; + + // Null on failure. If not null, result must be cleaned up through a call + // to `CloseResState()`. + virtual std::unique_ptr<struct __res_state> GetResState(); + virtual void CloseResState(struct __res_state* res); +}; + +// Returns configured DNS servers or nullopt on failure. +NET_EXPORT absl::optional<std::vector<IPEndPoint>> GetNameservers( + const struct __res_state& res); + +} // namespace net + +#endif // NET_DNS_PUBLIC_RESOLV_READER_H_ \ No newline at end of file
diff --git a/net/dns/public/resolv_reader_unittest.cc b/net/dns/public/resolv_reader_unittest.cc new file mode 100644 index 0000000..f8d6ed67 --- /dev/null +++ b/net/dns/public/resolv_reader_unittest.cc
@@ -0,0 +1,98 @@ +// Copyright (c) 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/dns/public/resolv_reader.h" + +#include <arpa/inet.h> +#include <resolv.h> + +#include <memory> +#include <utility> +#include <vector> + +#include "base/bind.h" +#include "base/cancelable_callback.h" +#include "base/check.h" +#include "base/cxx17_backports.h" +#include "base/run_loop.h" +#include "base/sequenced_task_runner.h" +#include "base/sys_byteorder.h" +#include "base/task/post_task.h" +#include "base/task/task_traits.h" +#include "base/task/thread_pool.h" +#include "net/base/ip_address.h" +#include "net/dns/public/dns_protocol.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/abseil-cpp/absl/types/optional.h" + +namespace net { + +namespace { + +// MAXNS is normally 3, but let's test 4 if possible. +const char* const kNameserversIPv4[] = { + "8.8.8.8", + "192.168.1.1", + "63.1.2.4", + "1.0.0.1", +}; + +const char* const kNameserversIPv6[] = { + nullptr, + "2001:DB8:0::42", + nullptr, + "::FFFF:129.144.52.38", +}; + +// Fills in |res| with sane configuration. +void InitializeResState(res_state res) { + memset(res, 0, sizeof(*res)); + res->options = RES_INIT; + + for (unsigned i = 0; i < base::size(kNameserversIPv4) && i < MAXNS; ++i) { + struct sockaddr_in sa; + sa.sin_family = AF_INET; + sa.sin_port = base::HostToNet16(NS_DEFAULTPORT + i); + inet_pton(AF_INET, kNameserversIPv4[i], &sa.sin_addr); + res->nsaddr_list[i] = sa; + ++res->nscount; + } + + // Install IPv6 addresses, replacing the corresponding IPv4 addresses. + unsigned nscount6 = 0; + for (unsigned i = 0; i < base::size(kNameserversIPv6) && i < MAXNS; ++i) { + if (!kNameserversIPv6[i]) + continue; + // Must use malloc to mimic res_ninit. Expect to be freed in + // `TestResolvReader::CloseResState()`. + struct sockaddr_in6* sa6; + sa6 = static_cast<sockaddr_in6*>(malloc(sizeof(*sa6))); + sa6->sin6_family = AF_INET6; + sa6->sin6_port = base::HostToNet16(NS_DEFAULTPORT - i); + inet_pton(AF_INET6, kNameserversIPv6[i], &sa6->sin6_addr); + res->_u._ext.nsaddrs[i] = sa6; + memset(&res->nsaddr_list[i], 0, sizeof res->nsaddr_list[i]); + ++nscount6; + } + res->_u._ext.nscount6 = nscount6; +} + +void FreeResState(struct __res_state* res) { + for (int i = 0; i < res->nscount; ++i) { + if (res->_u._ext.nsaddrs[i] != nullptr) + free(res->_u._ext.nsaddrs[i]); + } +} + +TEST(ResolvReaderTest, GetNameservers) { + auto res = std::make_unique<struct __res_state>(); + InitializeResState(res.get()); + + EXPECT_TRUE(GetNameservers(*res.get()).has_value()); + FreeResState(res.get()); +} + +} // namespace + +} // namespace net \ No newline at end of file
diff --git a/net/http/http_cache.cc b/net/http/http_cache.cc index 093510b..dcb7ec2 100644 --- a/net/http/http_cache.cc +++ b/net/http/http_cache.cc
@@ -131,13 +131,6 @@ } } -size_t HttpCache::ActiveEntry::EstimateMemoryUsage() const { - // Skip |disk_entry| which is tracked in simple_backend_impl; Skip |readers| - // and |add_to_entry_queue| because the Transactions are owned by their - // respective URLRequestHttpJobs. - return 0; -} - bool HttpCache::ActiveEntry::HasNoTransactions() { return (!writers || writers->IsEmpty()) && readers.empty() && add_to_entry_queue.empty() && done_headers_queue.empty() && @@ -162,14 +155,6 @@ : entry(nullptr), entry_opened(false), callback_will_delete(false) {} ~PendingOp() = default; - // Returns the estimate of dynamically allocated memory in bytes. - size_t EstimateMemoryUsage() const { - // Note that backend isn't counted because it doesn't provide an EMU - // function. - return base::trace_event::EstimateMemoryUsage(writer) + - base::trace_event::EstimateMemoryUsage(pending_queue); - } - disk_cache::Entry* entry; bool entry_opened; // rather than created. @@ -239,9 +224,6 @@ return transaction_ || entry_ || !callback_.is_null(); } - // Returns the estimate of dynamically allocated memory in bytes. - size_t EstimateMemoryUsage() const { return 0; } - private: WorkItemOperation operation_; Transaction* transaction_; @@ -429,20 +411,9 @@ return old_network_layer; } +// TODO(crbug.com/1239513): Remove this method. void HttpCache::DumpMemoryStats(base::trace_event::ProcessMemoryDump* pmd, const std::string& parent_absolute_name) const { - // Skip tracking members like |clock_| and |backend_factory_| because they - // don't allocate. - std::string name = parent_absolute_name + "/http_cache"; - base::trace_event::MemoryAllocatorDump* dump = pmd->CreateAllocatorDump(name); - size_t size = base::trace_event::EstimateMemoryUsage(active_entries_) + - base::trace_event::EstimateMemoryUsage(doomed_entries_) + - base::trace_event::EstimateMemoryUsage(pending_ops_); - if (disk_cache_) - size += disk_cache_->DumpMemoryStats(pmd, name); - - dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize, - base::trace_event::MemoryAllocatorDump::kUnitsBytes, size); } std::string HttpCache::GetResourceURLFromHttpCacheKey(const std::string& key) {
diff --git a/net/http/http_cache.h b/net/http/http_cache.h index ab76ecd..bc46f16 100644 --- a/net/http/http_cache.h +++ b/net/http/http_cache.h
@@ -358,7 +358,6 @@ struct NET_EXPORT_PRIVATE ActiveEntry { ActiveEntry(disk_cache::Entry* entry, bool opened_in); ~ActiveEntry(); - size_t EstimateMemoryUsage() const; // Returns true if no transactions are associated with this entry. bool HasNoTransactions();
diff --git a/net/http/http_cache_transaction.cc b/net/http/http_cache_transaction.cc index e23f3b0..3e384f39 100644 --- a/net/http/http_cache_transaction.cc +++ b/net/http/http_cache_transaction.cc
@@ -637,11 +637,6 @@ entry_ = nullptr; } -size_t HttpCache::Transaction::EstimateMemoryUsage() const { - // TODO(xunjieli): Consider improving the coverage. crbug.com/669108. - return 0; -} - void HttpCache::Transaction::WriterAboutToBeRemovedFromEntry(int result) { // Since the transaction can no longer access the network transaction, save // all network related info now.
diff --git a/net/http/http_cache_transaction.h b/net/http/http_cache_transaction.h index 06d665c4..75c0f83 100644 --- a/net/http/http_cache_transaction.h +++ b/net/http/http_cache_transaction.h
@@ -172,9 +172,6 @@ // added to an entry and the entry. void ResetCachePendingState() { cache_pending_ = false; } - // Returns the estimate of dynamically allocated memory in bytes. - size_t EstimateMemoryUsage() const; - RequestPriority priority() const { return priority_; } PartialData* partial() { return partial_.get(); } bool is_truncated() { return truncated_; }
diff --git a/net/http/http_cache_unittest.cc b/net/http/http_cache_unittest.cc index 1151e744..61e4075 100644 --- a/net/http/http_cache_unittest.cc +++ b/net/http/http_cache_unittest.cc
@@ -12969,54 +12969,6 @@ ASSERT_EQ(entry2, nullptr); } -class HttpCacheMemoryDumpTest - : public testing::TestWithParam<base::trace_event::MemoryDumpLevelOfDetail>, - public WithTaskEnvironment {}; - -INSTANTIATE_TEST_SUITE_P( - All, - HttpCacheMemoryDumpTest, - ::testing::Values(base::trace_event::MemoryDumpLevelOfDetail::DETAILED, - base::trace_event::MemoryDumpLevelOfDetail::BACKGROUND)); - -// Basic test to make sure HttpCache::DumpMemoryStats doesn't crash. -TEST_P(HttpCacheMemoryDumpTest, DumpMemoryStats) { - MockHttpCache cache; - cache.FailConditionalizations(); - RunTransactionTest(cache.http_cache(), kTypicalGET_Transaction); - - HttpResponseInfo response_info; - RunTransactionTestWithResponseInfo(cache.http_cache(), - kTypicalGET_Transaction, &response_info); - - EXPECT_FALSE(response_info.was_cached); - EXPECT_TRUE(response_info.network_accessed); - EXPECT_EQ(CacheEntryStatus::ENTRY_CANT_CONDITIONALIZE, - response_info.cache_entry_status); - - base::trace_event::MemoryDumpArgs dump_args = {GetParam()}; - auto process_memory_dump = - std::make_unique<base::trace_event::ProcessMemoryDump>(dump_args); - base::trace_event::MemoryAllocatorDump* parent_dump = - process_memory_dump->CreateAllocatorDump( - "net/url_request_context/main/0x123"); - cache.http_cache()->DumpMemoryStats(process_memory_dump.get(), - parent_dump->absolute_name()); - - const base::trace_event::MemoryAllocatorDump* dump = - process_memory_dump->GetAllocatorDump( - "net/url_request_context/main/0x123/http_cache"); - ASSERT_NE(nullptr, dump); - - using Entry = base::trace_event::MemoryAllocatorDump::Entry; - const std::vector<Entry>& entries = dump->entries(); - ASSERT_THAT(entries, - Contains(AllOf( - Field(&Entry::name, - Eq(base::trace_event::MemoryAllocatorDump::kNameSize)), - Field(&Entry::value_uint64, Gt(0UL))))); -} - TEST_F(HttpCacheTest, DnsAliasesNoRevalidation) { MockHttpCache cache; HttpResponseInfo response;
diff --git a/net/http/http_stream_factory.cc b/net/http/http_stream_factory.cc index aa425ed2..6c722908 100644 --- a/net/http/http_stream_factory.cc +++ b/net/http/http_stream_factory.cc
@@ -196,6 +196,7 @@ } } +// TODO(crbug.com/1239513): Consider removing this method. void HttpStreamFactory::DumpMemoryStats( base::trace_event::ProcessMemoryDump* pmd, const std::string& parent_absolute_name) const { @@ -221,10 +222,6 @@ main_job_count++; } factory_dump->AddScalar( - base::trace_event::MemoryAllocatorDump::kNameSize, - base::trace_event::MemoryAllocatorDump::kUnitsBytes, - base::trace_event::EstimateMemoryUsage(job_controller_set_)); - factory_dump->AddScalar( base::trace_event::MemoryAllocatorDump::kNameObjectCount, base::trace_event::MemoryAllocatorDump::kUnitsObjects, job_controller_set_.size());
diff --git a/net/http/http_stream_factory_job.cc b/net/http/http_stream_factory_job.cc index 082d072..938c1bd6 100644 --- a/net/http/http_stream_factory_job.cc +++ b/net/http/http_stream_factory_job.cc
@@ -317,13 +317,6 @@ return using_spdy_; } -size_t HttpStreamFactory::Job::EstimateMemoryUsage() const { - StreamSocket::SocketMemoryStats stats; - if (connection_) - connection_->DumpMemoryStats(&stats); - return stats.total_size; -} - const SSLConfig& HttpStreamFactory::Job::server_ssl_config() const { return server_ssl_config_; }
diff --git a/net/http/http_stream_factory_job.h b/net/http/http_stream_factory_job.h index f271699..d99a12c 100644 --- a/net/http/http_stream_factory_job.h +++ b/net/http/http_stream_factory_job.h
@@ -201,9 +201,6 @@ return std::move(bidirectional_stream_impl_); } - // Returns the estimated memory usage in bytes. - size_t EstimateMemoryUsage() const; - bool is_waiting() const { return next_state_ == STATE_WAIT_COMPLETE; } const SSLConfig& server_ssl_config() const; const SSLConfig& proxy_ssl_config() const;
diff --git a/net/http/http_stream_factory_job_controller.cc b/net/http/http_stream_factory_job_controller.cc index 7693e320..b2af1cb6 100644 --- a/net/http/http_stream_factory_job_controller.cc +++ b/net/http/http_stream_factory_job_controller.cc
@@ -588,11 +588,6 @@ return alternative_job_.get() != nullptr; } -size_t HttpStreamFactory::JobController::EstimateMemoryUsage() const { - return base::trace_event::EstimateMemoryUsage(main_job_) + - base::trace_event::EstimateMemoryUsage(alternative_job_); -} - WebSocketHandshakeStreamBase::CreateHelper* HttpStreamFactory::JobController::websocket_handshake_stream_create_helper() { DCHECK(request_);
diff --git a/net/http/http_stream_factory_job_controller.h b/net/http/http_stream_factory_job_controller.h index 53292b72..acaf97d 100644 --- a/net/http/http_stream_factory_job_controller.h +++ b/net/http/http_stream_factory_job_controller.h
@@ -158,9 +158,6 @@ // Returns true if |this| has a pending alternative job that is not completed. bool HasPendingAltJob() const; - // Returns the estimated memory usage in bytes. - size_t EstimateMemoryUsage() const; - private: friend class test::JobControllerPeer;
diff --git a/net/quic/properties_based_quic_server_info.cc b/net/quic/properties_based_quic_server_info.cc index 6905703..d41a536 100644 --- a/net/quic/properties_based_quic_server_info.cc +++ b/net/quic/properties_based_quic_server_info.cc
@@ -61,8 +61,4 @@ encoded); } -size_t PropertiesBasedQuicServerInfo::EstimateMemoryUsage() const { - return 0; -} - } // namespace net
diff --git a/net/quic/properties_based_quic_server_info.h b/net/quic/properties_based_quic_server_info.h index 3b658283..945f45b5 100644 --- a/net/quic/properties_based_quic_server_info.h +++ b/net/quic/properties_based_quic_server_info.h
@@ -30,7 +30,6 @@ // QuicServerInfo implementation. bool Load() override; void Persist() override; - size_t EstimateMemoryUsage() const override; private: const NetworkIsolationKey network_isolation_key_;
diff --git a/net/quic/quic_chromium_client_session.cc b/net/quic/quic_chromium_client_session.cc index 15f25429..6758f47 100644 --- a/net/quic/quic_chromium_client_session.cc +++ b/net/quic/quic_chromium_client_session.cc
@@ -3778,13 +3778,6 @@ return connection()->version(); } -size_t QuicChromiumClientSession::EstimateMemoryUsage() const { - // TODO(xunjieli): Estimate |crypto_stream_|, quic::QuicSpdySession's - // quic::QuicHeaderList, quic::QuicSession's QuiCWriteBlockedList, open - // streams and unacked packet map. - return base::trace_event::EstimateMemoryUsage(packet_readers_); -} - quic::QuicClientPromisedInfo* QuicChromiumClientSession::GetPromised( const GURL& url, const QuicSessionKey& session_key) {
diff --git a/net/quic/quic_chromium_client_session.h b/net/quic/quic_chromium_client_session.h index 6ee1230..d4299a5e 100644 --- a/net/quic/quic_chromium_client_session.h +++ b/net/quic/quic_chromium_client_session.h
@@ -850,11 +850,6 @@ quic::ParsedQuicVersion GetQuicVersion() const; - // Returns the estimate of dynamically allocated memory in bytes. - // See base/trace_event/memory_usage_estimator.h. - // TODO(xunjieli): It only tracks |packet_readers_|. Write a better estimate. - size_t EstimateMemoryUsage() const; - // Looks for a push that matches the provided parameters. quic::QuicClientPromisedInfo* GetPromised(const GURL& url, const QuicSessionKey& session_key);
diff --git a/net/quic/quic_chromium_packet_reader.cc b/net/quic/quic_chromium_packet_reader.cc index 8d6d807b..2022fd5b 100644 --- a/net/quic/quic_chromium_packet_reader.cc +++ b/net/quic/quic_chromium_packet_reader.cc
@@ -79,10 +79,6 @@ } } -size_t QuicChromiumPacketReader::EstimateMemoryUsage() const { - return read_buffer_->size(); -} - bool QuicChromiumPacketReader::ProcessReadResult(int result) { read_pending_ = false; if (result <= 0 && net_log_.IsCapturing()) {
diff --git a/net/quic/quic_chromium_packet_reader.h b/net/quic/quic_chromium_packet_reader.h index 2c43954a..ca3d587 100644 --- a/net/quic/quic_chromium_packet_reader.h +++ b/net/quic/quic_chromium_packet_reader.h
@@ -52,9 +52,6 @@ // and passing the data along to the quic::QuicConnection. void StartReading(); - // Returns the estimate of dynamically allocated memory in bytes. - size_t EstimateMemoryUsage() const; - private: // A completion callback invoked when a read completes. void OnReadComplete(int result);
diff --git a/net/quic/quic_server_info.h b/net/quic/quic_server_info.h index bbf1fff..2100fd0 100644 --- a/net/quic/quic_server_info.h +++ b/net/quic/quic_server_info.h
@@ -50,9 +50,6 @@ // Persist allows for the server information to be updated for future uses. virtual void Persist() = 0; - // Returns the size of dynamically allocated memory in bytes. - virtual size_t EstimateMemoryUsage() const = 0; - struct State { State(); ~State();
diff --git a/net/spdy/http2_priority_dependencies.cc b/net/spdy/http2_priority_dependencies.cc index af22759..40d3da0 100644 --- a/net/spdy/http2_priority_dependencies.cc +++ b/net/spdy/http2_priority_dependencies.cc
@@ -174,10 +174,4 @@ entry_by_stream_id_.erase(emit); } -size_t Http2PriorityDependencies::EstimateMemoryUsage() const { - return base::trace_event::EstimateMemoryUsage(id_priority_lists_); - // TODO(xunjieli): https://crbug.com/690015. Include |entry_by_stream_id_| - // when memory_usage_estimator.h supports std::list::iterator. -} - } // namespace net
diff --git a/net/spdy/http2_priority_dependencies.h b/net/spdy/http2_priority_dependencies.h index 077a3ac..ea952d6 100644 --- a/net/spdy/http2_priority_dependencies.h +++ b/net/spdy/http2_priority_dependencies.h
@@ -57,9 +57,6 @@ std::vector<DependencyUpdate> OnStreamUpdate(spdy::SpdyStreamId id, spdy::SpdyPriority new_priority); - // Returns the estimate of dynamically allocated memory in bytes. - size_t EstimateMemoryUsage() const; - private: // The requirements for the internal data structure for this class are: // a) Constant time insertion of entries at the end of the list,
diff --git a/net/spdy/http2_push_promise_index.cc b/net/spdy/http2_push_promise_index.cc index c89e3669..af6dac393 100644 --- a/net/spdy/http2_push_promise_index.cc +++ b/net/spdy/http2_push_promise_index.cc
@@ -113,16 +113,6 @@ } } -size_t Http2PushPromiseIndex::EstimateMemoryUsage() const { - return base::trace_event::EstimateMemoryUsage(unclaimed_pushed_streams_); -} - -size_t Http2PushPromiseIndex::UnclaimedPushedStream::EstimateMemoryUsage() - const { - return base::trace_event::EstimateMemoryUsage(url) + - sizeof(spdy::SpdyStreamId) + sizeof(Delegate*); -} - bool Http2PushPromiseIndex::CompareByUrl::operator()( const UnclaimedPushedStream& a, const UnclaimedPushedStream& b) const {
diff --git a/net/spdy/http2_push_promise_index.h b/net/spdy/http2_push_promise_index.h index 8e66891..f92fc2a 100644 --- a/net/spdy/http2_push_promise_index.h +++ b/net/spdy/http2_push_promise_index.h
@@ -98,9 +98,6 @@ base::WeakPtr<SpdySession>* session, spdy::SpdyStreamId* stream_id); - // Return the estimate of dynamically allocated memory in bytes. - size_t EstimateMemoryUsage() const; - private: friend test::Http2PushPromiseIndexPeer; @@ -109,7 +106,6 @@ GURL url; Delegate* delegate; spdy::SpdyStreamId stream_id; - size_t EstimateMemoryUsage() const; }; // Function object satisfying the requirements of "Compare", see
diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc index 22d5d30..0d51d4c 100644 --- a/net/spdy/spdy_session.cc +++ b/net/spdy/spdy_session.cc
@@ -797,10 +797,6 @@ return stream; } -size_t SpdyStreamRequest::EstimateMemoryUsage() const { - return base::trace_event::EstimateItemMemoryUsage(url_); -} - void SpdyStreamRequest::SetPriority(RequestPriority priority) { if (priority_ == priority) return; @@ -1791,24 +1787,10 @@ return GetWeakPtr(); } +// TODO(crbug.com/1239513): Remove this method. size_t SpdySession::DumpMemoryStats(StreamSocket::SocketMemoryStats* stats, bool* is_session_active) const { - // TODO(xunjieli): Include |pending_create_stream_queues_| when WeakPtr is - // supported in memory_usage_estimator.h. - *is_session_active = is_active(); - socket_->DumpMemoryStats(stats); - - // |connection_| is estimated in stats->total_size. |read_buffer_| is - // estimated in |read_buffer_size|. TODO(xunjieli): Make them use EMU(). - size_t read_buffer_size = read_buffer_ ? kReadBufferSize : 0; - return stats->total_size + read_buffer_size + - base::trace_event::EstimateMemoryUsage(spdy_session_key_) + - base::trace_event::EstimateMemoryUsage(pooled_aliases_) + - base::trace_event::EstimateMemoryUsage(active_streams_) + - base::trace_event::EstimateMemoryUsage(created_streams_) + - base::trace_event::EstimateMemoryUsage(initial_settings_) + - base::trace_event::EstimateMemoryUsage(stream_send_unstall_queue_) + - base::trace_event::EstimateMemoryUsage(priority_dependency_state_); + return 0; } bool SpdySession::ChangeSocketTag(const SocketTag& new_tag) {
diff --git a/net/spdy/spdy_session.h b/net/spdy/spdy_session.h index 582282a1..6496be9 100644 --- a/net/spdy/spdy_session.h +++ b/net/spdy/spdy_session.h
@@ -272,9 +272,6 @@ // request in the session. void SetPriority(RequestPriority priority); - // Returns the estimate of dynamically allocated memory in bytes. - size_t EstimateMemoryUsage() const; - const NetworkTrafficAnnotationTag traffic_annotation() const { return NetworkTrafficAnnotationTag(traffic_annotation_); }
diff --git a/net/spdy/spdy_session_key.cc b/net/spdy/spdy_session_key.cc index 1bc0847..34901c8 100644 --- a/net/spdy/spdy_session_key.cc +++ b/net/spdy/spdy_session_key.cc
@@ -84,8 +84,4 @@ return result; } -size_t SpdySessionKey::EstimateMemoryUsage() const { - return base::trace_event::EstimateMemoryUsage(host_port_proxy_pair_); -} - } // namespace net
diff --git a/net/spdy/spdy_session_key.h b/net/spdy/spdy_session_key.h index b692b02..f47736a 100644 --- a/net/spdy/spdy_session_key.h +++ b/net/spdy/spdy_session_key.h
@@ -95,9 +95,6 @@ SecureDnsPolicy secure_dns_policy() const { return secure_dns_policy_; } - // Returns the estimate of dynamically allocated memory in bytes. - size_t EstimateMemoryUsage() const; - private: HostPortProxyPair host_port_proxy_pair_; // If enabled, then session cannot be tracked by the server.
diff --git a/net/spdy/spdy_session_pool_unittest.cc b/net/spdy/spdy_session_pool_unittest.cc index 6d42596..4d87baf6 100644 --- a/net/spdy/spdy_session_pool_unittest.cc +++ b/net/spdy/spdy_session_pool_unittest.cc
@@ -1068,66 +1068,6 @@ data.AllWriteDataConsumed(); } -class SpdySessionMemoryDumpTest - : public SpdySessionPoolTest, - public testing::WithParamInterface< - base::trace_event::MemoryDumpLevelOfDetail> {}; - -INSTANTIATE_TEST_SUITE_P( - All, - SpdySessionMemoryDumpTest, - ::testing::Values(base::trace_event::MemoryDumpLevelOfDetail::DETAILED, - base::trace_event::MemoryDumpLevelOfDetail::BACKGROUND)); - -TEST_P(SpdySessionMemoryDumpTest, DumpMemoryStats) { - SpdySessionKey key(HostPortPair("www.example.org", 443), - ProxyServer::Direct(), PRIVACY_MODE_DISABLED, - SpdySessionKey::IsProxySession::kFalse, SocketTag(), - NetworkIsolationKey(), SecureDnsPolicy::kAllow); - - MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING)}; - StaticSocketDataProvider data(reads, base::span<MockWrite>()); - data.set_connect_data(MockConnect(SYNCHRONOUS, OK)); - session_deps_.socket_factory->AddSocketDataProvider(&data); - - SSLSocketDataProvider ssl(SYNCHRONOUS, OK); - session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); - - CreateNetworkSession(); - - base::WeakPtr<SpdySession> session = - CreateSpdySession(http_session_.get(), key, NetLogWithSource()); - - // Flush the SpdySession::OnReadComplete() task. - base::RunLoop().RunUntilIdle(); - - EXPECT_TRUE(HasSpdySession(spdy_session_pool_, key)); - base::trace_event::MemoryDumpArgs dump_args = {GetParam()}; - auto process_memory_dump = - std::make_unique<base::trace_event::ProcessMemoryDump>(dump_args); - base::trace_event::MemoryAllocatorDump* parent_dump = - process_memory_dump->CreateAllocatorDump( - "net/http_network_session_0x123"); - spdy_session_pool_->DumpMemoryStats(process_memory_dump.get(), - parent_dump->absolute_name()); - - // Whether SpdySession::DumpMemoryStats() is invoked. - bool did_dump = false; - const base::trace_event::ProcessMemoryDump::AllocatorDumpsMap& - allocator_dumps = process_memory_dump->allocator_dumps(); - for (const auto& pair : allocator_dumps) { - const std::string& dump_name = pair.first; - if (dump_name.find("spdy_session_pool") == std::string::npos) - continue; - MemoryAllocatorDump::Entry expected("active_session_count", - MemoryAllocatorDump::kUnitsObjects, 0); - ASSERT_THAT(pair.second->entries(), Contains(Eq(ByRef(expected)))); - did_dump = true; - } - EXPECT_TRUE(did_dump); - spdy_session_pool_->CloseCurrentSessions(ERR_ABORTED); -} - TEST_F(SpdySessionPoolTest, IPConnectionPoolingWithWebSockets) { // Define two hosts with identical IP address. const int kTestPort = 443;
diff --git a/net/spdy/spdy_stream.h b/net/spdy/spdy_stream.h index 0a1fdca..a5a1748 100644 --- a/net/spdy/spdy_stream.h +++ b/net/spdy/spdy_stream.h
@@ -397,9 +397,6 @@ return response_headers_; } - // Returns the estimate of dynamically allocated memory in bytes. - size_t EstimateMemoryUsage() const; - const NetworkTrafficAnnotationTag traffic_annotation() const { return traffic_annotation_; }
diff --git a/net/ssl/ssl_client_session_cache_unittest.cc b/net/ssl/ssl_client_session_cache_unittest.cc index cdf1ea7..e47ce609 100644 --- a/net/ssl/ssl_client_session_cache_unittest.cc +++ b/net/ssl/ssl_client_session_cache_unittest.cc
@@ -486,61 +486,4 @@ EXPECT_EQ(nullptr, cache.Lookup(key5).get()); } -class SSLClientSessionCacheMemoryDumpTest - : public SSLClientSessionCacheTest, - public testing::WithParamInterface< - base::trace_event::MemoryDumpLevelOfDetail> {}; - -INSTANTIATE_TEST_SUITE_P( - All, - SSLClientSessionCacheMemoryDumpTest, - ::testing::Values(base::trace_event::MemoryDumpLevelOfDetail::DETAILED, - base::trace_event::MemoryDumpLevelOfDetail::BACKGROUND)); - -// Basic test for dumping memory stats. -TEST_P(SSLClientSessionCacheMemoryDumpTest, TestDumpMemoryStats) { - SSLClientSessionCache::Config config; - SSLClientSessionCache cache(config); - - bssl::UniquePtr<SSL_SESSION> session1 = NewSSLSession(); - bssl::UniquePtr<SSL_SESSION> session2 = NewSSLSession(); - bssl::UniquePtr<SSL_SESSION> session3 = NewSSLSession(); - - // Insert three entries. - cache.Insert(MakeTestKey("key1"), bssl::UpRef(session1)); - cache.Insert(MakeTestKey("key2"), bssl::UpRef(session2)); - cache.Insert(MakeTestKey("key3"), bssl::UpRef(session3)); - EXPECT_EQ(session1.get(), cache.Lookup(MakeTestKey("key1")).get()); - EXPECT_EQ(session2.get(), cache.Lookup(MakeTestKey("key2")).get()); - EXPECT_EQ(session3.get(), cache.Lookup(MakeTestKey("key3")).get()); - EXPECT_EQ(3u, cache.size()); - - base::trace_event::MemoryDumpArgs dump_args = {GetParam()}; - std::unique_ptr<base::trace_event::ProcessMemoryDump> process_memory_dump( - new base::trace_event::ProcessMemoryDump(dump_args)); - - const std::string parent_absolute_name = - "net/http_network_session_0xdeadbeef"; - const std::string expected_dump_name = - parent_absolute_name + "/ssl_client_session_cache"; - - cache.DumpMemoryStats(process_memory_dump.get(), parent_absolute_name); - - using Entry = base::trace_event::MemoryAllocatorDump::Entry; - const base::trace_event::MemoryAllocatorDump* dump = - process_memory_dump->GetAllocatorDump(expected_dump_name); - ASSERT_NE(nullptr, dump); - const std::vector<Entry>& entries = dump->entries(); - EXPECT_THAT(entries, Contains(Field(&Entry::name, Eq("cert_count")))); - EXPECT_THAT(entries, Contains(Field(&Entry::name, Eq("cert_size")))); - EXPECT_THAT(entries, - Contains(Field(&Entry::name, Eq("undeduped_cert_size")))); - EXPECT_THAT(entries, - Contains(Field(&Entry::name, Eq("undeduped_cert_count")))); - EXPECT_THAT( - entries, - Contains(Field(&Entry::name, - Eq(base::trace_event::MemoryAllocatorDump::kNameSize)))); -} - } // namespace net
diff --git a/net/test/spawned_test_server/base_test_server.cc b/net/test/spawned_test_server/base_test_server.cc index 9caaf0ad..5157cde 100644 --- a/net/test/spawned_test_server/base_test_server.cc +++ b/net/test/spawned_test_server/base_test_server.cc
@@ -190,8 +190,6 @@ std::string BaseTestServer::GetScheme() const { switch (type_) { - case TYPE_FTP: - return "ftp"; case TYPE_HTTP: return "http"; case TYPE_HTTPS: @@ -429,11 +427,6 @@ arguments->SetKey("ws-basic-auth", base::Value()); } - if (no_anonymous_ftp_user_) { - DCHECK_EQ(TYPE_FTP, type_); - arguments->SetKey("no-anonymous-ftp-user", base::Value()); - } - if (redirect_connect_to_localhost_) { DCHECK(type_ == TYPE_BASIC_AUTH_PROXY || type_ == TYPE_PROXY); arguments->SetKey("redirect-connect-to-localhost", base::Value());
diff --git a/net/test/spawned_test_server/base_test_server.h b/net/test/spawned_test_server/base_test_server.h index 6c209af..a3854cb9 100644 --- a/net/test/spawned_test_server/base_test_server.h +++ b/net/test/spawned_test_server/base_test_server.h
@@ -41,7 +41,6 @@ // http://www.iana.org/assignments/uri-schemes.html enum Type { TYPE_BASIC_AUTH_PROXY, - TYPE_FTP, TYPE_HTTP, TYPE_HTTPS, TYPE_WS, @@ -301,11 +300,6 @@ ws_basic_auth_ = ws_basic_auth; } - // Disable creation of anonymous FTP user. - void set_no_anonymous_ftp_user(bool no_anonymous_ftp_user) { - no_anonymous_ftp_user_ = no_anonymous_ftp_user; - } - // Redirect proxied CONNECT requests to localhost. void set_redirect_connect_to_localhost(bool redirect_connect_to_localhost) { redirect_connect_to_localhost_ = redirect_connect_to_localhost; @@ -395,9 +389,6 @@ // Is WebSocket basic HTTP authentication enabled? bool ws_basic_auth_ = false; - // Disable creation of anonymous FTP user? - bool no_anonymous_ftp_user_ = false; - // Redirect proxied CONNECT requests to localhost? bool redirect_connect_to_localhost_ = false;
diff --git a/net/test/spawned_test_server/local_test_server.cc b/net/test/spawned_test_server/local_test_server.cc index 8cbb9da..ff546e64 100644 --- a/net/test/spawned_test_server/local_test_server.cc +++ b/net/test/spawned_test_server/local_test_server.cc
@@ -227,9 +227,6 @@ case TYPE_WSS: command_line->AppendArg("--websocket"); break; - case TYPE_FTP: - command_line->AppendArg("--ftp"); - break; case TYPE_BASIC_AUTH_PROXY: command_line->AppendArg("--basic-auth-proxy"); break;
diff --git a/net/test/spawned_test_server/remote_test_server.cc b/net/test/spawned_test_server/remote_test_server.cc index b10f9e7a..9891783 100644 --- a/net/test/spawned_test_server/remote_test_server.cc +++ b/net/test/spawned_test_server/remote_test_server.cc
@@ -36,8 +36,6 @@ // Please keep in sync with dictionary SERVER_TYPES in testserver.py std::string GetServerTypeString(BaseTestServer::Type type) { switch (type) { - case BaseTestServer::TYPE_FTP: - return "ftp"; case BaseTestServer::TYPE_HTTP: case BaseTestServer::TYPE_HTTPS: return "http";
diff --git a/net/tools/testserver/run_testserver.cc b/net/tools/testserver/run_testserver.cc index f3a8bce..c3ea0e3d 100644 --- a/net/tools/testserver/run_testserver.cc +++ b/net/tools/testserver/run_testserver.cc
@@ -20,9 +20,10 @@ #include "net/test/spawned_test_server/spawned_test_server.h" static void PrintUsage() { - printf("run_testserver --doc-root=relpath\n" - " [--http|--https|--ws|--wss|--ftp]\n" - " [--ssl-cert=ok|mismatched-name|expired]\n"); + printf( + "run_testserver --doc-root=relpath\n" + " [--http|--https|--ws|--wss]\n" + " [--ssl-cert=ok|mismatched-name|expired]\n"); printf("(NOTE: relpath should be relative to the 'src' directory.\n"); } @@ -63,8 +64,6 @@ server_type = net::SpawnedTestServer::TYPE_WS; } else if (command_line->HasSwitch("wss")) { server_type = net::SpawnedTestServer::TYPE_WSS; - } else if (command_line->HasSwitch("ftp")) { - server_type = net::SpawnedTestServer::TYPE_FTP; } else { // If no scheme switch is specified, select http or https scheme. // TODO(toyoshim): Remove this estimation.
diff --git a/net/tools/testserver/testserver.py b/net/tools/testserver/testserver.py index 0d1e43a33..e66be97 100755 --- a/net/tools/testserver/testserver.py +++ b/net/tools/testserver/testserver.py
@@ -3,8 +3,8 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -"""This is a simple HTTP/FTP/TCP/UDP/PROXY/BASIC_AUTH_PROXY/WEBSOCKET server -used for testing Chrome. +"""This is a simple HTTP/TCP/PROXY/BASIC_AUTH_PROXY/WEBSOCKET server used for +testing Chrome. It supports several test URLs, as specified by the handlers in TestPageHandler. By default, it listens on an ephemeral port and sends the port number back to @@ -50,18 +50,15 @@ # import manually mod_pywebsocket.standalone.ssl = ssl -import pyftpdlib.ftpserver - import tlslite import tlslite.api import testserver_base SERVER_HTTP = 0 -SERVER_FTP = 1 -SERVER_BASIC_AUTH_PROXY = 2 -SERVER_WEBSOCKET = 3 -SERVER_PROXY = 4 +SERVER_BASIC_AUTH_PROXY = 1 +SERVER_WEBSOCKET = 2 +SERVER_PROXY = 3 # Default request queue size for WebSocketServer. _DEFAULT_REQUEST_QUEUE_SIZE = 128 @@ -250,13 +247,6 @@ return False -class FTPServer(testserver_base.ClientRestrictingServerMixIn, - pyftpdlib.ftpserver.FTPServer): - """This is a specialization of FTPServer that adds client verification.""" - - pass - - class TestPageHandler(testserver_base.BasePageHandler): # Class variables to allow for persistence state between page handler # invocations @@ -1988,31 +1978,6 @@ server = ThreadingHTTPServer((host, port), BasicAuthProxyRequestHandler) print 'BasicAuthProxy server started on port %d...' % server.server_port server_data['port'] = server.server_port - elif self.options.server_type == SERVER_FTP: - my_data_dir = self.__make_data_dir() - - # Instantiate a dummy authorizer for managing 'virtual' users - authorizer = pyftpdlib.ftpserver.DummyAuthorizer() - - # Define a new user having full r/w permissions - authorizer.add_user('chrome', 'chrome', my_data_dir, perm='elradfmw') - - # Define a read-only anonymous user unless disabled - if not self.options.no_anonymous_ftp_user: - authorizer.add_anonymous(my_data_dir) - - # Instantiate FTP handler class - ftp_handler = pyftpdlib.ftpserver.FTPHandler - ftp_handler.authorizer = authorizer - - # Define a customized banner (string returned when client connects) - ftp_handler.banner = ("pyftpdlib %s based ftpd ready." % - pyftpdlib.ftpserver.__ver__) - - # Instantiate FTP server class and listen to address:port - server = pyftpdlib.ftpserver.FTPServer((host, port), ftp_handler) - server_data['port'] = server.socket.getsockname()[1] - print 'FTP server started on port %d...' % server_data['port'] else: raise testserver_base.OptionError('unknown server type' + self.options.server_type) @@ -2030,10 +1995,6 @@ def add_options(self): testserver_base.TestServerRunner.add_options(self) - self.option_parser.add_option('-f', '--ftp', action='store_const', - const=SERVER_FTP, default=SERVER_HTTP, - dest='server_type', - help='start up an FTP server.') self.option_parser.add_option('--proxy', action='store_const', const=SERVER_PROXY, default=SERVER_HTTP, dest='server_type', @@ -2200,11 +2161,6 @@ default=False, action='store_true', help='If set, the server will send a fatal ' 'alert immediately after the handshake.') - self.option_parser.add_option('--no-anonymous-ftp-user', - dest='no_anonymous_ftp_user', - default=False, action='store_true', - help='If set, the FTP server will not create ' - 'an anonymous user.') self.option_parser.add_option('--disable-channel-id', action='store_true') self.option_parser.add_option('--disable-extended-master-secret', action='store_true')
diff --git a/net/url_request/url_request_context_unittest.cc b/net/url_request/url_request_context_unittest.cc deleted file mode 100644 index 3cf06b0..0000000 --- a/net/url_request/url_request_context_unittest.cc +++ /dev/null
@@ -1,71 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "net/url_request/url_request_context.h" - -#include "base/strings/pattern.h" -#include "base/trace_event/memory_dump_request_args.h" -#include "base/trace_event/process_memory_dump.h" -#include "net/proxy_resolution/proxy_config_service_fixed.h" -#include "net/test/test_with_task_environment.h" -#include "net/traffic_annotation/network_traffic_annotation_test_helper.h" -#include "net/url_request/url_request_context_builder.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace net { - -class URLRequestContextMemoryDumpTest - : public testing::TestWithParam<base::trace_event::MemoryDumpLevelOfDetail>, - public WithTaskEnvironment {}; - -INSTANTIATE_TEST_SUITE_P( - All, - URLRequestContextMemoryDumpTest, - ::testing::Values(base::trace_event::MemoryDumpLevelOfDetail::DETAILED, - base::trace_event::MemoryDumpLevelOfDetail::BACKGROUND)); - -// Checks if the dump provider runs without crashing and dumps root objects. -TEST_P(URLRequestContextMemoryDumpTest, MemoryDumpProvider) { - base::trace_event::MemoryDumpArgs dump_args = {GetParam()}; - std::unique_ptr<base::trace_event::ProcessMemoryDump> process_memory_dump( - new base::trace_event::ProcessMemoryDump(dump_args)); - URLRequestContextBuilder builder; -#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_ANDROID) - builder.set_proxy_config_service(std::make_unique<ProxyConfigServiceFixed>( - ProxyConfigWithAnnotation::CreateDirect())); -#endif // defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_ANDROID) - std::unique_ptr<URLRequestContext> context(builder.Build()); - context->OnMemoryDump(dump_args, process_memory_dump.get()); - const base::trace_event::ProcessMemoryDump::AllocatorDumpsMap& - allocator_dumps = process_memory_dump->allocator_dumps(); - - bool did_dump_http_network_session = false; - bool did_dump_ssl_client_session_cache = false; - bool did_dump_url_request_context = false; - bool did_dump_url_request_context_http_network_session = false; - for (const auto& it : allocator_dumps) { - const std::string& dump_name = it.first; - if (dump_name.find("net/http_network_session") != std::string::npos) - did_dump_http_network_session = true; - // Match against a relaxed form of the memory dump permitted pattern. - if (base::MatchPattern( - dump_name, "net/http_network_session_0x*/ssl_client_session_cache")) - did_dump_ssl_client_session_cache = true; - if (dump_name.find("net/url_request_context") != std::string::npos) { - // A sub allocator dump to take into account of the sharing relationship. - if (dump_name.find("http_network_session") != std::string::npos) { - did_dump_url_request_context_http_network_session = true; - } else { - did_dump_url_request_context = true; - } - } - } - ASSERT_TRUE(did_dump_http_network_session); - ASSERT_TRUE(did_dump_ssl_client_session_cache); - ASSERT_TRUE(did_dump_url_request_context); - ASSERT_TRUE(did_dump_url_request_context_http_network_session); -} - -// TODO(xunjieli): Add more granular tests on the MemoryDumpProvider. -} // namespace net
diff --git a/sandbox/policy/mojom/sandbox.mojom b/sandbox/policy/mojom/sandbox.mojom index db9e31b..2101f64 100644 --- a/sandbox/policy/mojom/sandbox.mojom +++ b/sandbox/policy/mojom/sandbox.mojom
@@ -28,6 +28,11 @@ // - On Linux/ChromeOS, the CDM is preloaded in the zygote sandbox. kCdm, + // Runs with the same rights as the browser. Usually needed to improve + // stability by hosting code that interacts with third party code in another + // process. + kNoSandbox, + // Hosts the GPU service and can talk to GPU drivers and other OS APIs which // may not be expecting untrusted input. kGpu, @@ -46,6 +51,10 @@ [EnableIf=is_win] kMediaFoundationCdm, + // Launches elevated. Used by the RemovableStorageWriter. + [EnableIf=is_win] + kNoSandboxAndElevatedPrivileges, + // |kXrCompositing| hosts XR Device Service on Windows. [EnableIf=is_win] kXrCompositing,
diff --git a/sandbox/policy/sandbox_type.h b/sandbox/policy/sandbox_type.h index 4f3ecb7d..0af5485 100644 --- a/sandbox/policy/sandbox_type.h +++ b/sandbox/policy/sandbox_type.h
@@ -127,6 +127,8 @@ return sandbox::policy::SandboxType::kCdm; case sandbox::mojom::Sandbox::kGpu: return sandbox::policy::SandboxType::kGpu; + case sandbox::mojom::Sandbox::kNoSandbox: + return sandbox::policy::SandboxType::kNoSandbox; case sandbox::mojom::Sandbox::kPrintCompositor: return sandbox::policy::SandboxType::kPrintCompositor; case sandbox::mojom::Sandbox::kService: @@ -138,6 +140,8 @@ #if defined(OS_WIN) case sandbox::mojom::Sandbox::kMediaFoundationCdm: return sandbox::policy::SandboxType::kMediaFoundationCdm; + case sandbox::mojom::Sandbox::kNoSandboxAndElevatedPrivileges: + return sandbox::policy::SandboxType::kNoSandboxAndElevatedPrivileges; case sandbox::mojom::Sandbox::kXrCompositing: return sandbox::policy::SandboxType::kXrCompositing; #endif // OS_WIN
diff --git a/services/network/cors/preflight_controller_unittest.cc b/services/network/cors/preflight_controller_unittest.cc index 1511b03..2bd2b049 100644 --- a/services/network/cors/preflight_controller_unittest.cc +++ b/services/network/cors/preflight_controller_unittest.cc
@@ -292,6 +292,7 @@ const std::string& devtools_request_id, const net::CookieAccessResultList& cookies_with_access_result, std::vector<network::mojom::HttpRawHeaderPairPtr> headers, + const base::TimeTicks timestamp, network::mojom::ClientSecurityStatePtr client_security_state) override { on_raw_request_called_ = true; }
diff --git a/services/network/public/mojom/devtools_observer.mojom b/services/network/public/mojom/devtools_observer.mojom index 2ba9087..ea151fd1d 100644 --- a/services/network/public/mojom/devtools_observer.mojom +++ b/services/network/public/mojom/devtools_observer.mojom
@@ -5,6 +5,7 @@ module network.mojom; import "mojo/public/mojom/base/unguessable_token.mojom"; +import "mojo/public/mojom/base/time.mojom"; import "services/network/public/mojom/client_security_state.mojom"; import "services/network/public/mojom/cookie_manager.mojom"; import "services/network/public/mojom/cors.mojom"; @@ -40,6 +41,7 @@ string devtool_request_id, array<CookieWithAccessResult> cookies_with_access_result, array<HttpRawHeaderPair> headers, + mojo_base.mojom.TimeTicks timestamp, ClientSecurityState? client_security_state); // Called to send information about the cookies blocked from storage from a
diff --git a/services/network/test/mock_devtools_observer.cc b/services/network/test/mock_devtools_observer.cc index d09b14a..2857b34b 100644 --- a/services/network/test/mock_devtools_observer.cc +++ b/services/network/test/mock_devtools_observer.cc
@@ -25,6 +25,7 @@ const std::string& devtools_request_id, const net::CookieAccessResultList& cookies_with_access_result, std::vector<network::mojom::HttpRawHeaderPairPtr> headers, + const base::TimeTicks timestamp, network::mojom::ClientSecurityStatePtr client_security_state) { raw_request_cookies_.insert(raw_request_cookies_.end(), cookies_with_access_result.begin(),
diff --git a/services/network/test/mock_devtools_observer.h b/services/network/test/mock_devtools_observer.h index 4eafc43..a44396e 100644 --- a/services/network/test/mock_devtools_observer.h +++ b/services/network/test/mock_devtools_observer.h
@@ -7,6 +7,7 @@ #include <string> +#include "base/time/time.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver_set.h" #include "net/url_request/url_request.h" @@ -32,6 +33,7 @@ const std::string& devtools_request_id, const net::CookieAccessResultList& cookies_with_access_result, std::vector<network::mojom::HttpRawHeaderPairPtr> headers, + const base::TimeTicks timestamp, network::mojom::ClientSecurityStatePtr client_security_state) override; void OnRawResponse(
diff --git a/services/network/url_loader.cc b/services/network/url_loader.cc index e65e1a7..0c0f52fd 100644 --- a/services/network/url_loader.cc +++ b/services/network/url_loader.cc
@@ -33,6 +33,7 @@ #include "net/base/elements_upload_data_stream.h" #include "net/base/isolation_info.h" #include "net/base/load_flags.h" +#include "net/base/load_timing_info.h" #include "net/base/mime_sniffer.h" #include "net/base/schemeful_site.h" #include "net/base/transport_info.h" @@ -1916,9 +1917,13 @@ client_security_state = request_client_security_state_->Clone(); } + net::LoadTimingInfo load_timing_info; + url_request_->GetLoadTimingInfo(&load_timing_info); + devtools_observer->OnRawRequest( devtools_request_id().value(), url_request_->maybe_sent_cookies(), - std::move(header_array), std::move(client_security_state)); + std::move(header_array), load_timing_info.request_start, + std::move(client_security_state)); } if (auto* cookie_observer = GetCookieAccessObserver()) {
diff --git a/testing/buildbot/chrome.json b/testing/buildbot/chrome.json index 6ee8ad09..6f4bba2 100644 --- a/testing/buildbot/chrome.json +++ b/testing/buildbot/chrome.json
@@ -1862,25 +1862,6 @@ ], "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04", - "pool": "chrome.tests", - "ssd": "0" - } - ], - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" },
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json index a0cf63a..c482836 100644 --- a/testing/buildbot/chromium.android.fyi.json +++ b/testing/buildbot/chromium.android.fyi.json
@@ -489,76 +489,6 @@ "--bucket", "chromium-result-details", "--test-name", - "base_util_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "machine_type": "n1-standard-4|e2-standard-4", - "os": "Ubuntu-16.04|Ubuntu-18.04", - "pool": "chromium.tests.avd" - } - ], - "named_caches": [ - { - "name": "avd_generic_android31", - "path": ".android" - }, - { - "name": "system_images_android_31_google_apis_x64", - "path": ".emulator_sdk" - } - ], - "optional_dimensions": { - "60": [ - { - "caches": "avd_generic_android31" - } - ] - }, - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android31.textpb" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", "blink_common_unittests" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -1481,6 +1411,82 @@ "args": [ "--gs-results-bucket=chromium-result-details", "--recover-devices", + "--avd-config=../../tools/android/avd/proto/generic_android31.textpb", + "--git-revision=${got_revision}" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_unit_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "machine_type": "n1-standard-4|e2-standard-4", + "os": "Ubuntu-16.04|Ubuntu-18.04", + "pool": "chromium.tests.avd" + } + ], + "named_caches": [ + { + "name": "avd_generic_android31", + "path": ".android" + }, + { + "name": "system_images_android_31_google_apis_x64", + "path": ".emulator_sdk" + } + ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android31" + } + ] + }, + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_public_unit_test_apk", + "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices", "--avd-config=../../tools/android/avd/proto/generic_android31.textpb" ], "merge": { @@ -4996,7 +5002,7 @@ "--bucket", "chromium-result-details", "--test-name", - "webview_cts_tests" + "webview_64_cts_tests" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, @@ -5058,8 +5064,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 2 }, - "test": "webview_cts_tests", - "test_id_prefix": "ninja://android_webview/test:webview_cts_tests/" + "test": "webview_64_cts_tests", + "test_id_prefix": "ninja://android_webview/test:webview_64_cts_tests/" }, { "args": [ @@ -5744,12 +5750,12 @@ "--test-runner-outdir", ".", "--client-outdir", - "../../weblayer_instrumentation_test_M93/out/Release", + "../../weblayer_instrumentation_test_M94/out/Release", "--implementation-outdir", ".", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--client-version=93", + "--client-version=94", "--gs-results-bucket=chromium-result-details", "--recover-devices", "--avd-config=../../tools/android/avd/proto/generic_android29.textpb" @@ -5759,11 +5765,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_skew_tests_with_client_from_93" + "weblayer_skew_tests_with_client_from_94" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_skew_tests_with_client_from_93", + "name": "weblayer_skew_tests_with_client_from_94", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -5773,8 +5779,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/weblayer-x86", - "location": "weblayer_instrumentation_test_M93", - "revision": "version:93.0.4577.37" + "location": "weblayer_instrumentation_test_M94", + "revision": "version:94.0.4606.3" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -6007,10 +6013,10 @@ "--client-outdir", ".", "--implementation-outdir", - "../../weblayer_instrumentation_test_M93/out/Release", + "../../weblayer_instrumentation_test_M94/out/Release", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--impl-version=93", + "--impl-version=94", "--gs-results-bucket=chromium-result-details", "--recover-devices", "--avd-config=../../tools/android/avd/proto/generic_android29.textpb" @@ -6020,11 +6026,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_skew_tests_with_impl_from_93" + "weblayer_skew_tests_with_impl_from_94" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_skew_tests_with_impl_from_93", + "name": "weblayer_skew_tests_with_impl_from_94", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -6034,8 +6040,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/weblayer-x86", - "location": "weblayer_instrumentation_test_M93", - "revision": "version:93.0.4577.37" + "location": "weblayer_instrumentation_test_M94", + "revision": "version:94.0.4606.3" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json index 0bbe96bc..8cd57c2 100644 --- a/testing/buildbot/chromium.android.json +++ b/testing/buildbot/chromium.android.json
@@ -37,7 +37,7 @@ ], "dimension_sets": [ { - "device_os": "LMY48I", + "device_os": "LMY48M", "device_os_flavor": "google", "device_os_type": "userdebug", "device_type": "hammerhead", @@ -94,7 +94,7 @@ ], "dimension_sets": [ { - "device_os": "LMY48I", + "device_os": "LMY48M", "device_os_flavor": "google", "device_os_type": "userdebug", "device_type": "hammerhead", @@ -154,7 +154,7 @@ ], "dimension_sets": [ { - "device_os": "LMY48I", + "device_os": "LMY48M", "device_os_flavor": "google", "device_os_type": "userdebug", "device_type": "hammerhead", @@ -207,7 +207,7 @@ ], "dimension_sets": [ { - "device_os": "LMY48I", + "device_os": "LMY48M", "device_os_flavor": "google", "device_os_type": "userdebug", "device_type": "hammerhead", @@ -261,7 +261,7 @@ ], "dimension_sets": [ { - "device_os": "LMY48I", + "device_os": "LMY48M", "device_os_flavor": "google", "device_os_type": "userdebug", "device_type": "hammerhead", @@ -2355,57 +2355,6 @@ "--bucket", "chromium-result-details", "--test-name", - "base_util_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "LMY48M|LMY48I", - "device_os_type": "userdebug", - "device_type": "hammerhead", - "os": "Android" - } - ], - "expiration": 10800, - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", "blink_common_unittests" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -3123,6 +3072,63 @@ { "args": [ "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--git-revision=${got_revision}" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_unit_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "LMY48M|LMY48I", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "expiration": 10800, + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_public_unit_test_apk", + "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", "--recover-devices" ], "merge": { @@ -6038,57 +6044,6 @@ "--bucket", "chromium-result-details", "--test-name", - "base_util_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "LMY49B", - "device_os_type": "userdebug", - "device_type": "flo", - "os": "Android" - } - ], - "expiration": 21600, - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", "blink_common_unittests" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -6806,6 +6761,63 @@ { "args": [ "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--git-revision=${got_revision}" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_unit_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "LMY49B", + "device_os_type": "userdebug", + "device_type": "flo", + "os": "Android" + } + ], + "expiration": 21600, + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_public_unit_test_apk", + "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", "--recover-devices" ], "merge": { @@ -9715,56 +9727,6 @@ "--bucket", "chromium-result-details", "--test-name", - "base_util_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "MMB29Q", - "device_os_type": "userdebug", - "device_type": "bullhead", - "os": "Android" - } - ], - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", "blink_common_unittests" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -10522,6 +10484,62 @@ { "args": [ "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--git-revision=${got_revision}" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_unit_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "MMB29Q", + "device_os_type": "userdebug", + "device_type": "bullhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_public_unit_test_apk", + "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", "--recover-devices" ], "merge": { @@ -13385,57 +13403,6 @@ "--bucket", "chromium-result-details", "--test-name", - "base_util_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "MRA58Z", - "device_os_type": "userdebug", - "device_type": "flo", - "os": "Android" - } - ], - "expiration": 10800, - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", "blink_common_unittests" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -14155,6 +14122,63 @@ { "args": [ "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--git-revision=${got_revision}" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_unit_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "MRA58Z", + "device_os_type": "userdebug", + "device_type": "flo", + "os": "Android" + } + ], + "expiration": 10800, + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_public_unit_test_apk", + "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", "--recover-devices" ], "merge": { @@ -17450,6 +17474,62 @@ { "args": [ "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--git-revision=${got_revision}" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_unit_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "OPR3.170623.008", + "device_os_type": "userdebug", + "device_type": "marlin", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_public_unit_test_apk", + "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", "--recover-devices" ], "merge": { @@ -18562,76 +18642,6 @@ "--bucket", "chromium-result-details", "--test-name", - "base_util_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "machine_type": "n1-standard-4|e2-standard-4", - "os": "Ubuntu-16.04|Ubuntu-18.04", - "pool": "chromium.tests.avd" - } - ], - "named_caches": [ - { - "name": "avd_generic_android30", - "path": ".android" - }, - { - "name": "system_images_android_30_google_apis_x86", - "path": ".emulator_sdk" - } - ], - "optional_dimensions": { - "60": [ - { - "caches": "avd_generic_android30" - } - ] - }, - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android30.textpb" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", "blink_common_unittests" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -19560,6 +19570,82 @@ "args": [ "--gs-results-bucket=chromium-result-details", "--recover-devices", + "--avd-config=../../tools/android/avd/proto/generic_android30.textpb", + "--git-revision=${got_revision}" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_unit_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "machine_type": "n1-standard-4|e2-standard-4", + "os": "Ubuntu-16.04|Ubuntu-18.04", + "pool": "chromium.tests.avd" + } + ], + "named_caches": [ + { + "name": "avd_generic_android30", + "path": ".android" + }, + { + "name": "system_images_android_30_google_apis_x86", + "path": ".emulator_sdk" + } + ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_public_unit_test_apk", + "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices", "--avd-config=../../tools/android/avd/proto/generic_android30.textpb" ], "merge": { @@ -23314,56 +23400,6 @@ "--bucket", "chromium-result-details", "--test-name", - "base_util_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "MMB29Q", - "device_os_type": "userdebug", - "device_type": "bullhead", - "os": "Android" - } - ], - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", "blink_common_unittests" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -24120,6 +24156,62 @@ { "args": [ "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--git-revision=${got_revision}" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_unit_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "MMB29Q", + "device_os_type": "userdebug", + "device_type": "bullhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_public_unit_test_apk", + "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", "--recover-devices" ], "merge": { @@ -27050,6 +27142,64 @@ "args": [ "--enable-features=BackForwardCache,BackForwardCacheSameSiteForBots,BackForwardCacheNoTimeEviction,ProactivelySwapBrowsingInstance", "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--git-revision=${got_revision}" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "bf_cache_chrome_public_unit_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "bf_cache_chrome_public_unit_test_apk", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "LMY48M", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_public_unit_test_apk", + "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" + }, + { + "args": [ + "--enable-features=BackForwardCache,BackForwardCacheSameSiteForBots,BackForwardCacheNoTimeEviction,ProactivelySwapBrowsingInstance", + "--gs-results-bucket=chromium-result-details", "--recover-devices" ], "merge": { @@ -30490,56 +30640,6 @@ "--bucket", "chromium-result-details", "--test-name", - "base_util_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "LMY48M", - "device_os_type": "userdebug", - "device_type": "hammerhead", - "os": "Android" - } - ], - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", "blink_common_unittests" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -31034,6 +31134,62 @@ { "args": [ "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--git-revision=${got_revision}" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_unit_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "LMY48M", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_public_unit_test_apk", + "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", "--recover-devices" ], "merge": { @@ -33461,57 +33617,6 @@ "--bucket", "chromium-result-details", "--test-name", - "base_util_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "MMB29Q", - "device_os_type": "userdebug", - "device_type": "bullhead", - "os": "Android" - } - ], - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "isolate_profile_data": true, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", "blink_common_unittests" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -34018,6 +34123,63 @@ { "args": [ "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--git-revision=${got_revision}" + ], + "isolate_profile_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_unit_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "MMB29Q", + "device_os_type": "userdebug", + "device_type": "bullhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_public_unit_test_apk", + "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", "--recover-devices" ], "isolate_profile_data": true, @@ -37577,6 +37739,82 @@ "--gs-results-bucket=chromium-result-details", "--recover-devices", "--avd-config=../../tools/android/avd/proto/generic_android23.textpb", + "--git-revision=${got_revision}" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_unit_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "machine_type": "n1-standard-4|e2-standard-4", + "os": "Ubuntu-16.04|Ubuntu-18.04", + "pool": "chromium.tests.avd" + } + ], + "named_caches": [ + { + "name": "avd_generic_android23", + "path": ".android" + }, + { + "name": "system_images_android_23_google_apis_x86", + "path": ".emulator_sdk" + } + ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_public_unit_test_apk", + "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--avd-config=../../tools/android/avd/proto/generic_android23.textpb", "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_m.content_shell_test_apk.filter" ], "ci_only": true, @@ -38690,76 +38928,6 @@ "--bucket", "chromium-result-details", "--test-name", - "base_util_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "machine_type": "n1-standard-4|e2-standard-4", - "os": "Ubuntu-16.04|Ubuntu-18.04", - "pool": "chromium.tests.avd" - } - ], - "named_caches": [ - { - "name": "avd_generic_android23", - "path": ".android" - }, - { - "name": "system_images_android_23_google_apis_x86", - "path": ".emulator_sdk" - } - ], - "optional_dimensions": { - "60": [ - { - "caches": "avd_generic_android23" - } - ] - }, - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android23.textpb" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", "blink_common_unittests" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -41991,56 +42159,6 @@ "--bucket", "chromium-result-details", "--test-name", - "base_util_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "NJH47F", - "device_os_type": "userdebug", - "device_type": "sailfish", - "os": "Android" - } - ], - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", "blink_common_unittests" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -42800,6 +42918,62 @@ { "args": [ "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--git-revision=${got_revision}" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_unit_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "NJH47F", + "device_os_type": "userdebug", + "device_type": "sailfish", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_public_unit_test_apk", + "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", "--recover-devices" ], "merge": { @@ -46027,58 +46201,6 @@ "--bucket", "chromium-result-details", "--test-name", - "base_util_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "PQ3A.190801.002", - "device_os_flavor": "google", - "device_os_type": "userdebug", - "device_type": "walleye", - "os": "Android" - } - ], - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "isolate_profile_data": true, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", "blink_common_unittests" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -46594,6 +46716,64 @@ { "args": [ "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--git-revision=${got_revision}" + ], + "isolate_profile_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_unit_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "PQ3A.190801.002", + "device_os_flavor": "google", + "device_os_type": "userdebug", + "device_type": "walleye", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_public_unit_test_apk", + "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", "--recover-devices" ], "isolate_profile_data": true, @@ -49804,6 +49984,63 @@ { "args": [ "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--git-revision=${got_revision}" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_unit_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "PQ3A.190801.002", + "device_os_flavor": "google", + "device_os_type": "userdebug", + "device_type": "walleye", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_public_unit_test_apk", + "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", "--recover-devices" ], "merge": { @@ -50794,76 +51031,6 @@ "--bucket", "chromium-result-details", "--test-name", - "base_util_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "machine_type": "n1-standard-4|e2-standard-4", - "os": "Ubuntu-16.04|Ubuntu-18.04", - "pool": "chromium.tests.avd" - } - ], - "named_caches": [ - { - "name": "avd_generic_android28", - "path": ".android" - }, - { - "name": "system_images_android_28_google_apis_x86", - "path": ".emulator_sdk" - } - ], - "optional_dimensions": { - "60": [ - { - "caches": "avd_generic_android28" - } - ] - }, - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android28.textpb" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", "blink_common_unittests" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -51929,6 +52096,82 @@ "args": [ "--gs-results-bucket=chromium-result-details", "--recover-devices", + "--avd-config=../../tools/android/avd/proto/generic_android28.textpb", + "--git-revision=${got_revision}" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_unit_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "machine_type": "n1-standard-4|e2-standard-4", + "os": "Ubuntu-16.04|Ubuntu-18.04", + "pool": "chromium.tests.avd" + } + ], + "named_caches": [ + { + "name": "avd_generic_android28", + "path": ".android" + }, + { + "name": "system_images_android_28_google_apis_x86", + "path": ".emulator_sdk" + } + ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_public_unit_test_apk", + "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices", "--avd-config=../../tools/android/avd/proto/generic_android28.textpb" ], "merge": { @@ -55915,12 +56158,12 @@ "--test-runner-outdir", ".", "--client-outdir", - "../../weblayer_instrumentation_test_M93/out/Release", + "../../weblayer_instrumentation_test_M94/out/Release", "--implementation-outdir", ".", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--client-version=93", + "--client-version=94", "--gs-results-bucket=chromium-result-details", "--recover-devices", "--avd-config=../../tools/android/avd/proto/generic_android23.textpb" @@ -55930,11 +56173,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_skew_tests_with_chrome_with_client_from_93" + "weblayer_skew_tests_with_chrome_with_client_from_94" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_skew_tests_with_chrome_with_client_from_93", + "name": "weblayer_skew_tests_with_chrome_with_client_from_94", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -55944,8 +56187,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/weblayer-x86", - "location": "weblayer_instrumentation_test_M93", - "revision": "version:93.0.4577.37" + "location": "weblayer_instrumentation_test_M94", + "revision": "version:94.0.4606.3" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -56181,10 +56424,10 @@ "--client-outdir", ".", "--implementation-outdir", - "../../weblayer_instrumentation_test_M93/out/Release", + "../../weblayer_instrumentation_test_M94/out/Release", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--impl-version=93", + "--impl-version=94", "--gs-results-bucket=chromium-result-details", "--recover-devices", "--avd-config=../../tools/android/avd/proto/generic_android23.textpb" @@ -56194,11 +56437,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_skew_tests_with_chrome_with_impl_from_93" + "weblayer_skew_tests_with_chrome_with_impl_from_94" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_skew_tests_with_chrome_with_impl_from_93", + "name": "weblayer_skew_tests_with_chrome_with_impl_from_94", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -56208,8 +56451,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/weblayer-x86", - "location": "weblayer_instrumentation_test_M93", - "revision": "version:93.0.4577.37" + "location": "weblayer_instrumentation_test_M94", + "revision": "version:94.0.4606.3" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -56515,12 +56758,12 @@ "--test-runner-outdir", ".", "--client-outdir", - "../../weblayer_instrumentation_test_M93/out/Release", + "../../weblayer_instrumentation_test_M94/out/Release", "--implementation-outdir", ".", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--client-version=93", + "--client-version=94", "--gs-results-bucket=chromium-result-details", "--recover-devices", "--avd-config=../../tools/android/avd/proto/generic_android27.textpb" @@ -56530,11 +56773,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_skew_tests_with_client_from_93" + "weblayer_skew_tests_with_client_from_94" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_skew_tests_with_client_from_93", + "name": "weblayer_skew_tests_with_client_from_94", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -56544,8 +56787,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/weblayer-x86", - "location": "weblayer_instrumentation_test_M93", - "revision": "version:93.0.4577.37" + "location": "weblayer_instrumentation_test_M94", + "revision": "version:94.0.4606.3" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -56778,10 +57021,10 @@ "--client-outdir", ".", "--implementation-outdir", - "../../weblayer_instrumentation_test_M93/out/Release", + "../../weblayer_instrumentation_test_M94/out/Release", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--impl-version=93", + "--impl-version=94", "--gs-results-bucket=chromium-result-details", "--recover-devices", "--avd-config=../../tools/android/avd/proto/generic_android27.textpb" @@ -56791,11 +57034,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_skew_tests_with_impl_from_93" + "weblayer_skew_tests_with_impl_from_94" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_skew_tests_with_impl_from_93", + "name": "weblayer_skew_tests_with_impl_from_94", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -56805,8 +57048,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/weblayer-x86", - "location": "weblayer_instrumentation_test_M93", - "revision": "version:93.0.4577.37" + "location": "weblayer_instrumentation_test_M94", + "revision": "version:94.0.4606.3" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -57112,12 +57355,12 @@ "--test-runner-outdir", ".", "--client-outdir", - "../../weblayer_instrumentation_test_M93/out/Release", + "../../weblayer_instrumentation_test_M94/out/Release", "--implementation-outdir", ".", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--client-version=93", + "--client-version=94", "--gs-results-bucket=chromium-result-details", "--recover-devices", "--avd-config=../../tools/android/avd/proto/generic_android28.textpb" @@ -57127,11 +57370,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_skew_tests_with_client_from_93" + "weblayer_skew_tests_with_client_from_94" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_skew_tests_with_client_from_93", + "name": "weblayer_skew_tests_with_client_from_94", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -57141,8 +57384,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/weblayer-x86", - "location": "weblayer_instrumentation_test_M93", - "revision": "version:93.0.4577.37" + "location": "weblayer_instrumentation_test_M94", + "revision": "version:94.0.4606.3" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -57375,10 +57618,10 @@ "--client-outdir", ".", "--implementation-outdir", - "../../weblayer_instrumentation_test_M93/out/Release", + "../../weblayer_instrumentation_test_M94/out/Release", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--impl-version=93", + "--impl-version=94", "--gs-results-bucket=chromium-result-details", "--recover-devices", "--avd-config=../../tools/android/avd/proto/generic_android28.textpb" @@ -57388,11 +57631,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_skew_tests_with_impl_from_93" + "weblayer_skew_tests_with_impl_from_94" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_skew_tests_with_impl_from_93", + "name": "weblayer_skew_tests_with_impl_from_94", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -57402,8 +57645,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/weblayer-x86", - "location": "weblayer_instrumentation_test_M93", - "revision": "version:93.0.4577.37" + "location": "weblayer_instrumentation_test_M94", + "revision": "version:94.0.4606.3" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json index 8c2e698..328f4d3 100644 --- a/testing/buildbot/chromium.chromiumos.json +++ b/testing/buildbot/chromium.chromiumos.json
@@ -1847,23 +1847,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "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": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -3526,24 +3509,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "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": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -5204,23 +5169,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "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": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -5880,21 +5828,21 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4588.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4601.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_Lacros version skew testing ash 94.0.4588.0", + "name": "lacros_chrome_browsertests_Lacros version skew testing ash 94.0.4601.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_v94.0.4588.0", - "revision": "version:94.0.4588.0" + "location": "lacros_version_skew_tests_v94.0.4601.0", + "revision": "version:94.0.4601.0" } ], "dimension_sets": [ @@ -5909,21 +5857,21 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4604.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4605.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_Lacros version skew testing ash 94.0.4604.0", + "name": "lacros_chrome_browsertests_Lacros version skew testing ash 94.0.4605.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_v94.0.4604.0", - "revision": "version:94.0.4604.0" + "location": "lacros_version_skew_tests_v94.0.4605.0", + "revision": "version:94.0.4605.0" } ], "dimension_sets": [ @@ -5938,21 +5886,21 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4588.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4601.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 94.0.4588.0", + "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 94.0.4601.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_v94.0.4588.0", - "revision": "version:94.0.4588.0" + "location": "lacros_version_skew_tests_v94.0.4601.0", + "revision": "version:94.0.4601.0" } ], "dimension_sets": [ @@ -5967,21 +5915,21 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4604.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4605.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 94.0.4604.0", + "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 94.0.4605.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_v94.0.4604.0", - "revision": "version:94.0.4604.0" + "location": "lacros_version_skew_tests_v94.0.4605.0", + "revision": "version:94.0.4605.0" } ], "dimension_sets": [
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json index 1fd1cc20..8521156 100644 --- a/testing/buildbot/chromium.clang.json +++ b/testing/buildbot/chromium.clang.json
@@ -128,23 +128,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-16.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -1718,24 +1701,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Windows-10-18363" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -3563,24 +3528,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Windows-10-18363" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -5467,56 +5414,6 @@ "--bucket", "chromium-result-details", "--test-name", - "base_util_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "LMY48M", - "device_os_type": "userdebug", - "device_type": "hammerhead", - "os": "Android" - } - ], - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", "blink_common_unittests" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -6120,6 +6017,62 @@ { "args": [ "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--git-revision=${got_revision}" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_unit_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "LMY48M", + "device_os_type": "userdebug", + "device_type": "hammerhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_public_unit_test_apk", + "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", "--recover-devices" ], "merge": { @@ -8920,27 +8873,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--runner-logs-dir=${ISOLATED_OUTDIR}/runner_logs" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-16.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -10692,28 +10624,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--runner-logs-dir=${ISOLATED_OUTDIR}/runner_logs" - ], - "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-16.04|Ubuntu-20.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -12156,23 +12066,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-16.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -13802,26 +13695,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--test-launcher-print-test-stdio=always" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-16.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -15667,23 +15540,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-16.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -17262,24 +17118,6 @@ ], "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-16.04", - "pool": "chrome.tests" - } - ], - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -18882,18 +18720,6 @@ "can_use_on_swarming_builders": true, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -19497,23 +19323,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-16.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -21069,23 +20878,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-16.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -22663,24 +22455,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-10.15" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -24542,27 +24316,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--test-launcher-print-test-stdio=always" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-10.15" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -26236,26 +25989,6 @@ ], "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "gpu": "none", - "os": "Mac-10.15", - "pool": "chrome.tests" - } - ], - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -28227,18 +27960,6 @@ "can_use_on_swarming_builders": true, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -29514,18 +29235,6 @@ "can_use_on_swarming_builders": true, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -30769,18 +30478,6 @@ "can_use_on_swarming_builders": true, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -32098,24 +31795,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Windows-10-18363" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -33987,24 +33666,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Windows-10-18363" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -35876,24 +35537,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Windows-10-18363" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -37687,18 +37330,6 @@ "can_use_on_swarming_builders": true, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -38272,18 +37903,6 @@ "can_use_on_swarming_builders": true, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -39544,18 +39163,6 @@ "can_use_on_swarming_builders": true, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -40858,24 +40465,6 @@ ], "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Windows-10", - "pool": "chrome.tests" - } - ], - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -42747,24 +42336,6 @@ ], "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Windows-10", - "pool": "chrome.tests" - } - ], - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -46405,23 +45976,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Windows-10-18363" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" },
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index a8d15fcc..c29d426 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -253,6 +253,39 @@ }, { "args": [ + "--site-per-process", + "--git-revision=${got_revision}" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "site_per_process_chrome_public_unit_test_apk", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "device_os": "MMB29Q", + "device_type": "bullhead", + "os": "Android" + } + ], + "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_public_unit_test_apk", + "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" + }, + { + "args": [ "--site-per-process" ], "merge": { @@ -720,17 +753,6 @@ "swarming": { "can_use_on_swarming_builders": false }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": false - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -1948,25 +1970,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Windows-10-19042" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -4465,57 +4468,6 @@ "--bucket", "chromium-result-details", "--test-name", - "base_util_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "PQ3A.190801.002", - "device_os_flavor": "google", - "device_os_type": "userdebug", - "device_type": "walleye", - "os": "Android" - } - ], - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", "blink_common_unittests" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -5185,6 +5137,63 @@ { "args": [ "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--git-revision=${got_revision}" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_unit_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "PQ3A.190801.002", + "device_os_flavor": "google", + "device_os_type": "userdebug", + "device_type": "walleye", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_public_unit_test_apk", + "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", "--recover-devices" ], "merge": { @@ -7895,57 +7904,6 @@ "--bucket", "chromium-result-details", "--test-name", - "base_util_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "PQ3A.190801.002", - "device_os_flavor": "google", - "device_os_type": "userdebug", - "device_type": "walleye", - "os": "Android" - } - ], - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", "blink_common_unittests" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -8615,6 +8573,63 @@ { "args": [ "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--git-revision=${got_revision}" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_unit_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "PQ3A.190801.002", + "device_os_flavor": "google", + "device_os_type": "userdebug", + "device_type": "walleye", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_public_unit_test_apk", + "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", "--recover-devices" ], "merge": { @@ -11326,57 +11341,6 @@ "--bucket", "chromium-result-details", "--test-name", - "base_util_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "MMB29Q", - "device_os_type": "userdebug", - "device_type": "bullhead", - "os": "Android" - } - ], - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "isolate_profile_data": true, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", "blink_common_unittests" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -12147,6 +12111,63 @@ { "args": [ "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--git-revision=${got_revision}" + ], + "isolate_profile_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_unit_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "MMB29Q", + "device_os_type": "userdebug", + "device_type": "bullhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_public_unit_test_apk", + "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", "--recover-devices" ], "isolate_profile_data": true, @@ -15421,58 +15442,6 @@ "--bucket", "chromium-result-details", "--test-name", - "base_util_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "PQ3A.190801.002", - "device_os_flavor": "google", - "device_os_type": "userdebug", - "device_type": "walleye", - "os": "Android" - } - ], - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "isolate_profile_data": true, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", "blink_common_unittests" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -15988,6 +15957,64 @@ { "args": [ "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--git-revision=${got_revision}" + ], + "isolate_profile_data": true, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_unit_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "PQ3A.190801.002", + "device_os_flavor": "google", + "device_os_type": "userdebug", + "device_type": "walleye", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_public_unit_test_apk", + "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", "--recover-devices" ], "isolate_profile_data": true, @@ -22174,25 +22201,6 @@ "can_use_on_swarming_builders": true, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--ram-size-mb=16384", - "--code-coverage", - "--code-coverage-dir=${ISOLATED_OUTDIR}", - "--runner-logs-dir=${ISOLATED_OUTDIR}/runner_logs" - ], - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -23435,28 +23443,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--runner-logs-dir=${ISOLATED_OUTDIR}/runner_logs" - ], - "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-16.04|Ubuntu-20.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -24867,29 +24853,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--device=aemu", - "--runner-logs-dir=${ISOLATED_OUTDIR}/runner_logs" - ], - "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": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -26928,28 +26891,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--device=fvdl", - "--runner-logs-dir=${ISOLATED_OUTDIR}/runner_logs" - ], - "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": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -70111,24 +70052,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -71728,23 +71651,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "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": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -72530,26 +72436,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--enable-features=BlinkHeapConcurrentMarking" - ], - "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": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -73412,23 +73298,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "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": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -74289,23 +74158,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "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": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -75199,24 +75051,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "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": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -76954,23 +76788,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "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": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -78904,24 +78721,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "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": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -81037,24 +80836,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "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": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -83107,19 +82888,6 @@ "can_use_on_swarming_builders": true, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -83631,7 +83399,7 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4588.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4601.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "isolate_profile_data": true, @@ -83639,14 +83407,14 @@ "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_Lacros version skew testing ash 94.0.4588.0", + "name": "lacros_chrome_browsertests_Lacros version skew testing ash 94.0.4601.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_v94.0.4588.0", - "revision": "version:94.0.4588.0" + "location": "lacros_version_skew_tests_v94.0.4601.0", + "revision": "version:94.0.4601.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -83656,7 +83424,7 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4604.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4605.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "isolate_profile_data": true, @@ -83664,14 +83432,14 @@ "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_Lacros version skew testing ash 94.0.4604.0", + "name": "lacros_chrome_browsertests_Lacros version skew testing ash 94.0.4605.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_v94.0.4604.0", - "revision": "version:94.0.4604.0" + "location": "lacros_version_skew_tests_v94.0.4605.0", + "revision": "version:94.0.4605.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -83681,7 +83449,7 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4588.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4601.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "isolate_profile_data": true, @@ -83689,14 +83457,14 @@ "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 94.0.4588.0", + "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 94.0.4601.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_v94.0.4588.0", - "revision": "version:94.0.4588.0" + "location": "lacros_version_skew_tests_v94.0.4601.0", + "revision": "version:94.0.4601.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -83706,7 +83474,7 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4604.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4605.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "isolate_profile_data": true, @@ -83714,14 +83482,14 @@ "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 94.0.4604.0", + "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 94.0.4605.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_v94.0.4604.0", - "revision": "version:94.0.4604.0" + "location": "lacros_version_skew_tests_v94.0.4605.0", + "revision": "version:94.0.4605.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -84334,24 +84102,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04", - "ssd": "0" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -85039,21 +84789,21 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4588.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4601.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_Lacros version skew testing ash 94.0.4588.0", + "name": "lacros_chrome_browsertests_Lacros version skew testing ash 94.0.4601.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_v94.0.4588.0", - "revision": "version:94.0.4588.0" + "location": "lacros_version_skew_tests_v94.0.4601.0", + "revision": "version:94.0.4601.0" } ], "dimension_sets": [ @@ -85069,21 +84819,21 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4604.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4605.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_Lacros version skew testing ash 94.0.4604.0", + "name": "lacros_chrome_browsertests_Lacros version skew testing ash 94.0.4605.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_v94.0.4604.0", - "revision": "version:94.0.4604.0" + "location": "lacros_version_skew_tests_v94.0.4605.0", + "revision": "version:94.0.4605.0" } ], "dimension_sets": [ @@ -85099,21 +84849,21 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4588.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4601.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 94.0.4588.0", + "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 94.0.4601.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_v94.0.4588.0", - "revision": "version:94.0.4588.0" + "location": "lacros_version_skew_tests_v94.0.4601.0", + "revision": "version:94.0.4601.0" } ], "dimension_sets": [ @@ -85129,21 +84879,21 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4604.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4605.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 94.0.4604.0", + "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 94.0.4605.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_v94.0.4604.0", - "revision": "version:94.0.4604.0" + "location": "lacros_version_skew_tests_v94.0.4605.0", + "revision": "version:94.0.4605.0" } ], "dimension_sets": [ @@ -85941,24 +85691,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04", - "ssd": "0" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -86638,21 +86370,21 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4588.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4601.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_Lacros version skew testing ash 94.0.4588.0", + "name": "lacros_chrome_browsertests_Lacros version skew testing ash 94.0.4601.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_v94.0.4588.0", - "revision": "version:94.0.4588.0" + "location": "lacros_version_skew_tests_v94.0.4601.0", + "revision": "version:94.0.4601.0" } ], "dimension_sets": [ @@ -86668,21 +86400,21 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4604.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4605.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_Lacros version skew testing ash 94.0.4604.0", + "name": "lacros_chrome_browsertests_Lacros version skew testing ash 94.0.4605.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_v94.0.4604.0", - "revision": "version:94.0.4604.0" + "location": "lacros_version_skew_tests_v94.0.4605.0", + "revision": "version:94.0.4605.0" } ], "dimension_sets": [ @@ -86698,21 +86430,21 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4588.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4601.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 94.0.4588.0", + "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 94.0.4601.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_v94.0.4588.0", - "revision": "version:94.0.4588.0" + "location": "lacros_version_skew_tests_v94.0.4601.0", + "revision": "version:94.0.4601.0" } ], "dimension_sets": [ @@ -86728,21 +86460,21 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4604.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4605.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 94.0.4604.0", + "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 94.0.4605.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_v94.0.4604.0", - "revision": "version:94.0.4604.0" + "location": "lacros_version_skew_tests_v94.0.4605.0", + "revision": "version:94.0.4605.0" } ], "dimension_sets": [ @@ -87431,21 +87163,21 @@ "gtest_tests": [ { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4588.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4601.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_Lacros version skew testing ash 94.0.4588.0", + "name": "lacros_chrome_browsertests_Lacros version skew testing ash 94.0.4601.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_v94.0.4588.0", - "revision": "version:94.0.4588.0" + "location": "lacros_version_skew_tests_v94.0.4601.0", + "revision": "version:94.0.4601.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -87455,21 +87187,21 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4604.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4605.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_Lacros version skew testing ash 94.0.4604.0", + "name": "lacros_chrome_browsertests_Lacros version skew testing ash 94.0.4605.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_v94.0.4604.0", - "revision": "version:94.0.4604.0" + "location": "lacros_version_skew_tests_v94.0.4605.0", + "revision": "version:94.0.4605.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -87479,21 +87211,21 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4588.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4601.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 94.0.4588.0", + "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 94.0.4601.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_v94.0.4588.0", - "revision": "version:94.0.4588.0" + "location": "lacros_version_skew_tests_v94.0.4601.0", + "revision": "version:94.0.4601.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -87503,21 +87235,21 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4604.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4605.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 94.0.4604.0", + "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 94.0.4605.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_v94.0.4604.0", - "revision": "version:94.0.4604.0" + "location": "lacros_version_skew_tests_v94.0.4605.0", + "revision": "version:94.0.4605.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -87757,25 +87489,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-10.13.6" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -89308,26 +89021,6 @@ "expiration": 21600, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "gpu": "8086:0a2e", - "os": "Mac-11.3" - } - ], - "expiration": 21600, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -91239,24 +90932,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-10.15" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -92210,24 +91885,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-10.15" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -93421,24 +93078,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Windows-10-18363" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -95411,19 +95050,6 @@ "can_use_on_swarming_builders": true, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" },
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json index a2d56a2..d4984a35 100644 --- a/testing/buildbot/chromium.gpu.fyi.json +++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -6597,6 +6597,60 @@ "--passthrough", "-v", "--extra-browser-args=--log-level=0 --js-flags=--expose-gc --use-cmd-decoder=validating --force_high_performance_gpu", + "--webgl-conformance-version=2.0.1", + "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json", + "--remote=127.0.0.1", + "--remote-ssh-port=9222" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "webgl2_conformance_validating_tests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "cpu": "x86", + "kvm": "1", + "os": "Ubuntu-18.04", + "pool": "chromium.tests" + } + ], + "idempotent": false, + "named_caches": [ + { + "name": "cros_vm", + "path": "magic_cros_vm_cache" + } + ], + "optional_dimensions": { + "60": [ + { + "caches": "cros_vm" + } + ] + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 30 + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "webgl_conformance", + "--show-stdout", + "--browser=cros-chrome", + "--passthrough", + "-v", + "--extra-browser-args=--log-level=0 --js-flags=--expose-gc --use-cmd-decoder=validating --force_high_performance_gpu", "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json", "--remote=127.0.0.1", "--remote-ssh-port=9222" @@ -7117,6 +7171,49 @@ "--passthrough", "-v", "--extra-browser-args=--log-level=0 --js-flags=--expose-gc --use-cmd-decoder=validating --force_high_performance_gpu", + "--webgl-conformance-version=2.0.1", + "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json", + "--remote=variable_chromeos_device_hostname" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "webgl2_conformance_validating_tests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "device_type": "kevin", + "os": "ChromeOS", + "pool": "chromium.tests" + } + ], + "expiration": 21600, + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 20 + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "trigger_script": { + "script": "//testing/trigger_scripts/chromeos_device_trigger.py" + } + }, + { + "args": [ + "webgl_conformance", + "--show-stdout", + "--browser=cros-chrome", + "--passthrough", + "-v", + "--extra-browser-args=--log-level=0 --js-flags=--expose-gc --use-cmd-decoder=validating --force_high_performance_gpu", "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json", "--remote=variable_chromeos_device_hostname" ], @@ -7659,6 +7756,48 @@ "--passthrough", "-v", "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --force_high_performance_gpu --enable-features=UseOzonePlatform --ozone-platform=wayland", + "--webgl-conformance-version=2.0.1", + "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json", + "--xvfb", + "--no-xvfb", + "--use-weston", + "--weston-use-gl" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "webgl2_conformance_validating_tests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:5912-20.0.8", + "os": "Ubuntu-18.04.5", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 20 + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + }, + { + "args": [ + "webgl_conformance", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --force_high_performance_gpu --enable-features=UseOzonePlatform --ozone-platform=wayland", "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json", "--xvfb", "--no-xvfb",
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json index 7a01081..1a8c22c 100644 --- a/testing/buildbot/chromium.linux.json +++ b/testing/buildbot/chromium.linux.json
@@ -76,23 +76,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "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": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -963,23 +946,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "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": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -1977,28 +1943,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--runner-logs-dir=${ISOLATED_OUTDIR}/runner_logs" - ], - "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-16.04|Ubuntu-20.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -3420,27 +3364,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--runner-logs-dir=${ISOLATED_OUTDIR}/runner_logs" - ], - "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": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -6079,30 +6002,6 @@ "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "base_util_unittests_wayland", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--no-xvfb", - "--use-weston", - "--ozone-platform=wayland", - "--enable-features=UseOzonePlatform" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, "name": "blink_common_unittests_wayland", "swarming": { "can_use_on_swarming_builders": true, @@ -8239,28 +8138,6 @@ "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "base_util_unittests_x11", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--ozone-platform=x11", - "--enable-features=UseOzonePlatform" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, "name": "blink_common_unittests_x11", "swarming": { "can_use_on_swarming_builders": true, @@ -10279,24 +10156,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "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": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -12302,23 +12161,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "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": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -14287,23 +14129,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "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": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -16282,23 +16107,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-14.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -18265,23 +18073,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-16.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" },
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json index ae9559cd..a2f58f8 100644 --- a/testing/buildbot/chromium.mac.json +++ b/testing/buildbot/chromium.mac.json
@@ -142,24 +142,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-10.11" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -1797,25 +1779,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "gpu": "8086:0a2e", - "os": "Mac-10.12.6" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -3640,24 +3603,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-10.13.6" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -5354,24 +5299,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-10.14.6" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -7135,25 +7062,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-10.15" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -8952,24 +8860,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-10.15" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -10640,24 +10530,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-11|Mac-10.16" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -22602,24 +22474,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "arm64", - "os": "Mac-11" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" },
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json index 8ef8373..6c7fd1d 100644 --- a/testing/buildbot/chromium.memory.json +++ b/testing/buildbot/chromium.memory.json
@@ -142,26 +142,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--test-launcher-print-test-stdio=always" - ], - "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": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -2095,23 +2075,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "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": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -3782,26 +3745,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--test-launcher-print-test-stdio=always" - ], - "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": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -5710,27 +5653,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--test-launcher-print-test-stdio=always" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Ubuntu-16.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -7663,27 +7585,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--test-launcher-print-test-stdio=always" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Ubuntu-16.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -9579,26 +9480,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--test-launcher-print-test-stdio=always" - ], - "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": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -11421,27 +11302,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--test-launcher-print-test-stdio=always" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-10.15" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -13370,56 +13230,6 @@ "--bucket", "chromium-result-details", "--test-name", - "base_util_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "MMB29Q", - "device_os_type": "userdebug", - "device_type": "bullhead", - "os": "Android" - } - ], - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", "blink_common_unittests" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -13967,6 +13777,62 @@ { "args": [ "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--git-revision=${got_revision}" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_unit_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "MMB29Q", + "device_os_type": "userdebug", + "device_type": "bullhead", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_public_unit_test_apk", + "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", "--recover-devices" ], "merge": { @@ -16249,23 +16115,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "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": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -17829,23 +17678,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Windows-10-15063" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" },
diff --git a/testing/buildbot/chromium.win.json b/testing/buildbot/chromium.win.json index 8f6df08..aaea81d4 100644 --- a/testing/buildbot/chromium.win.json +++ b/testing/buildbot/chromium.win.json
@@ -120,18 +120,6 @@ "can_use_on_swarming_builders": true, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -1685,25 +1673,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Windows-10-18363" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -4026,24 +3995,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Windows-10-18363" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -6153,18 +6104,6 @@ "can_use_on_swarming_builders": true, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" }, @@ -7648,18 +7587,6 @@ "can_use_on_swarming_builders": true, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "base_util_unittests", - "test_id_prefix": "ninja://base/util:base_util_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "blink_common_unittests", "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" },
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl index 1a552768..7ce039b 100644 --- a/testing/buildbot/gn_isolate_map.pyl +++ b/testing/buildbot/gn_isolate_map.pyl
@@ -240,10 +240,6 @@ "label": "//base:base_unittests", "type": "console_test_launcher", }, - "base_util_unittests": { - "label": "//base/util:base_util_unittests", - "type": "console_test_launcher", - }, "blink_common_unittests": { "label": "//third_party/blink/common:blink_common_unittests", "type": "console_test_launcher", @@ -309,9 +305,6 @@ "type": "console_test_launcher", }, "browser_tests": { - "args": [ - "--enable-high-dpi-support-for-testing", - ], "label": "//chrome/test:browser_tests", "type": "windowed_test_launcher", }, @@ -493,6 +486,7 @@ "label": "//chrome/android:chrome_public_smoke_test", "type": "console_test_launcher", }, + # TODO(crbug.com/1238057): Rename to chrome_public_integration_test_apk "chrome_public_test_apk": { "label": "//chrome/android:chrome_public_test_apk", "type": "console_test_launcher", @@ -501,6 +495,10 @@ "label": "//chrome/android:chrome_public_test_vr_apk", "type": "console_test_launcher", }, + "chrome_public_unit_test_apk": { + "label": "//chrome/android:chrome_public_unit_test_apk", + "type": "console_test_launcher", + }, "chrome_public_wpt": { "label": "//chrome/android:chrome_public_wpt", "type": "generated_script", @@ -974,7 +972,6 @@ }, "interactive_ui_tests": { "args": [ - "--enable-high-dpi-support-for-testing", "--snapshot-output-dir=${ISOLATED_OUTDIR}", ], "label": "//chrome/test:interactive_ui_tests",
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index 1b2ebba..91ce8b82 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -3132,6 +3132,15 @@ 'Optional Mac Retina Release (NVIDIA)', ], 'modifications': { + # This VM configuration is known to be significantly slower than other + # CrOS configurations, so increase the shards. + # TODO(crbug.com/1223550): Remove this if the configuration can be sped + # up. + 'ChromeOS FYI Release (amd64-generic)': { + 'swarming': { + 'shards': 30, + }, + }, 'Mac FYI GPU ASAN Release': { 'args': [ '--is-asan',
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 2a89d2c..c21652b 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -112,7 +112,13 @@ 'skia_gold_test', ], 'test': 'chrome_public_test_apk', - } + }, + 'chrome_public_unit_test_apk': { + 'mixins': [ + 'chrome-gold-service-account', + 'skia_gold_test', + ], + }, }, 'android_incremental_tests': { @@ -183,6 +189,12 @@ 'skia_gold_test', ], }, + 'chrome_public_unit_test_apk': { + 'mixins': [ + 'chrome-gold-service-account', + 'skia_gold_test', + ], + }, 'webview_instrumentation_test_apk': { 'swarming': { 'expiration': 10800, @@ -325,6 +337,16 @@ ], 'test': 'chrome_public_test_apk', }, + 'bf_cache_chrome_public_unit_test_apk': { + 'args': [ + '--enable-features=BackForwardCache,BackForwardCacheSameSiteForBots,BackForwardCacheNoTimeEviction,ProactivelySwapBrowsingInstance', + ], + 'mixins': [ + 'chrome-gold-service-account', + 'skia_gold_test', + ], + 'test': 'chrome_public_unit_test_apk', + }, 'bf_cache_content_shell_test_apk': { 'args': [ '--enable-features=BackForwardCache,BackForwardCacheSameSiteForBots,BackForwardCacheNoTimeEviction,ProactivelySwapBrowsingInstance', @@ -437,6 +459,12 @@ 'skia_gold_test', ], }, + 'chrome_public_unit_test_apk': { + 'mixins': [ + 'chrome-gold-service-account', + 'skia_gold_test', + ], + }, }, 'chrome_public_wpt': { @@ -799,7 +827,6 @@ 'use_isolated_scripts_api': True, }, 'base_unittests': {}, - 'base_util_unittests': {}, 'blink_common_unittests': {}, 'blink_heap_unittests': {}, 'blink_platform_unittests': {}, @@ -1487,9 +1514,6 @@ 'base_unittests': { 'mixins': ['fuchsia_runner_logs'], }, - 'base_util_unittests': { - 'mixins': ['fuchsia_runner_logs'], - }, 'blink_common_unittests': { 'mixins': ['fuchsia_runner_logs'], }, @@ -4664,7 +4688,6 @@ 'use_isolated_scripts_api': True, }, 'base_unittests': {}, - 'base_util_unittests': {}, 'blink_common_unittests': {}, 'blink_heap_unittests': {}, 'blink_platform_unittests': {}, @@ -4843,6 +4866,16 @@ ], 'test': 'chrome_public_test_apk', }, + 'site_per_process_chrome_public_unit_test_apk': { + 'args': [ + '--site-per-process', + ], + 'mixins': [ + 'chrome-gold-service-account', + 'skia_gold_test', + ], + 'test': 'chrome_public_unit_test_apk', + }, 'site_per_process_components_browsertests': { 'args': [ '--site-per-process', @@ -5722,7 +5755,7 @@ 'system_webview_shell_instrumentation_tests', # Not an experimental test 'weblayer_android_gtests', 'weblayer_gtests', - 'webview_cts_tests_gtest', + 'webview_64_cts_tests_gtest', 'webview_ui_instrumentation_tests', ], @@ -6449,7 +6482,7 @@ # TODO(crbug.com/1080424): Try enabling these again once some of the # existing CrOS WebGL issues are resolved. # 'gpu_webgl2_conformance_gl_passthrough_telemetry_tests', - # 'gpu_webgl2_conformance_validating_telemetry_tests', + 'gpu_webgl2_conformance_validating_telemetry_tests', # 'gpu_webgl_conformance_gl_passthrough_telemetry_tests', ],
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl index 1c50a0e..193f5f4e 100644 --- a/testing/buildbot/variants.pyl +++ b/testing/buildbot/variants.pyl
@@ -46,32 +46,32 @@ }, 'LACROS_VERSION_SKEW_CANARY': { 'args': [ - '--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4604.0/test_ash_chrome', + '--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4605.0/test_ash_chrome', '--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter', ], - 'identifier': 'Lacros version skew testing ash 94.0.4604.0', + 'identifier': 'Lacros version skew testing ash 94.0.4605.0', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip', - 'location': 'lacros_version_skew_tests_v94.0.4604.0', - 'revision': 'version:94.0.4604.0', + 'location': 'lacros_version_skew_tests_v94.0.4605.0', + 'revision': 'version:94.0.4605.0', }, ], }, }, 'LACROS_VERSION_SKEW_DEV': { 'args': [ - '--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4588.0/test_ash_chrome', + '--ash-chrome-path-override=../../lacros_version_skew_tests_v94.0.4601.0/test_ash_chrome', '--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter', ], - 'identifier': 'Lacros version skew testing ash 94.0.4588.0', + 'identifier': 'Lacros version skew testing ash 94.0.4601.0', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip', - 'location': 'lacros_version_skew_tests_v94.0.4588.0', - 'revision': 'version:94.0.4588.0', + 'location': 'lacros_version_skew_tests_v94.0.4601.0', + 'revision': 'version:94.0.4601.0', }, ], }, @@ -338,18 +338,18 @@ '--client-outdir', '.', '--implementation-outdir', - '../../weblayer_instrumentation_test_M93/out/Release', + '../../weblayer_instrumentation_test_M94/out/Release', '--test-expectations', '../../weblayer/browser/android/javatests/skew/expectations.txt', - '--impl-version=93', + '--impl-version=94', ], - 'identifier': 'with_impl_from_93', + 'identifier': 'with_impl_from_94', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/weblayer-x86', - 'location': 'weblayer_instrumentation_test_M93', - 'revision': 'version:93.0.4577.37', + 'location': 'weblayer_instrumentation_test_M94', + 'revision': 'version:94.0.4606.3', } ], }, @@ -410,18 +410,18 @@ '--client-outdir', '.', '--implementation-outdir', - '../../weblayer_instrumentation_test_M93/out/Release', + '../../weblayer_instrumentation_test_M94/out/Release', '--test-expectations', '../../weblayer/browser/android/javatests/skew/expectations.txt', - '--impl-version=93', + '--impl-version=94', ], - 'identifier': 'with_impl_from_93', + 'identifier': 'with_impl_from_94', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/weblayer-x86', - 'location': 'weblayer_instrumentation_test_M93', - 'revision': 'version:93.0.4577.37', + 'location': 'weblayer_instrumentation_test_M94', + 'revision': 'version:94.0.4606.3', } ], }, @@ -480,20 +480,20 @@ '--test-runner-outdir', '.', '--client-outdir', - '../../weblayer_instrumentation_test_M93/out/Release', + '../../weblayer_instrumentation_test_M94/out/Release', '--implementation-outdir', '.', '--test-expectations', '../../weblayer/browser/android/javatests/skew/expectations.txt', - '--client-version=93', + '--client-version=94', ], - 'identifier': 'with_client_from_93', + 'identifier': 'with_client_from_94', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/weblayer-x86', - 'location': 'weblayer_instrumentation_test_M93', - 'revision': 'version:93.0.4577.37', + 'location': 'weblayer_instrumentation_test_M94', + 'revision': 'version:94.0.4606.3', } ], },
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index 65dabe4e..8ca8f00d 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -333,7 +333,7 @@ 'swarming': { 'dimension_sets': [ { - 'device_os': 'LMY48I', + 'device_os': 'LMY48M', 'device_os_flavor': 'google', 'device_os_type': 'userdebug', 'device_type': 'hammerhead',
diff --git a/testing/unexpected_passes_common/data_types.py b/testing/unexpected_passes_common/data_types.py index 38bfcb7..b3f6527e 100644 --- a/testing/unexpected_passes_common/data_types.py +++ b/testing/unexpected_passes_common/data_types.py
@@ -26,11 +26,10 @@ expectation file. """ - def __init__(self, test, tags, expected_results, bug=None, variant=None): + def __init__(self, test, tags, expected_results, bug=None): self.test = test self.tags = frozenset(tags) self.bug = bug or '' - self.variant = variant if isinstance(expected_results, str): self.expected_results = frozenset([expected_results]) else: @@ -48,14 +47,13 @@ return (isinstance(other, Expectation) and self.test == other.test and self.tags == other.tags and self.expected_results == other.expected_results - and self.bug == other.bug and self.variant == other.variant) + and self.bug == other.bug) def __ne__(self, other): return not self.__eq__(other) def __hash__(self): - return hash( - (self.test, self.tags, self.expected_results, self.bug, self.variant)) + return hash((self.test, self.tags, self.expected_results, self.bug)) def AppliesToResult(self, result): """Checks whether this expectation should have applied to |result|. @@ -71,13 +69,7 @@ True if |self| applies to |result|, otherwise False. """ assert isinstance(result, Result) - return (self._comp(result.test) and self.tags <= result.tags - and self._AppliesToResultVariant(result)) - - def _AppliesToResultVariant(self, result): - # Can be overridden, e.g. if the base/None variant's expectations also apply - # to specific variants. - return self.variant == result.variant + return (self._comp(result.test) and self.tags <= result.tags) class Result(object): @@ -87,7 +79,7 @@ from ResultDB for the purposes of the unexpected pass finder. """ - def __init__(self, test, tags, actual_result, step, build_id, variant=None): + def __init__(self, test, tags, actual_result, step, build_id): """ Args: test: A string containing the name of the test. Cannot have wildcards. @@ -96,9 +88,6 @@ step: A string containing the name of the step on the builder. build_id: A string containing the Buildbucket ID for the build this result came from. - variant: An optional string denoting the particular variant that the - result came from, e.g. if the test was run with a particular set of - flags. """ # Results should not have any globs. assert '*' not in test @@ -107,21 +96,19 @@ self.actual_result = actual_result self.step = step self.build_id = build_id - self.variant = variant def __eq__(self, other): return (isinstance(other, Result) and self.test == other.test and self.tags == other.tags and self.actual_result == other.actual_result - and self.step == other.step and self.build_id == other.build_id - and self.variant == other.variant) + and self.step == other.step and self.build_id == other.build_id) def __ne__(self, other): return not self.__eq__(other) def __hash__(self): - return hash((self.test, self.tags, self.actual_result, self.step, - self.build_id, self.variant)) + return hash( + (self.test, self.tags, self.actual_result, self.step, self.build_id)) class BuildStats(object): @@ -263,7 +250,7 @@ This results in a dict in the following format: { - test_name1 (str): { + expectation_file1 (str): { expectation1 (data_types.Expectation): { builder_name1 (str): { step_name1 (str): stats1 (data_types.BuildStats), @@ -275,7 +262,7 @@ expectation2 (data_types.Expectation): { ... }, ... }, - test_name2 (str): { ... }, + expectation_file2 (str): { ... }, ... } """ @@ -292,12 +279,12 @@ """Iterates over all BuilderStepMaps contained in the map. Returns: - A generator yielding tuples in the form (test_name (str), expectation - (Expectation), builder_map (BuilderStepMap)) + A generator yielding tuples in the form (expectation_file (str), + expectation (Expectation), builder_map (BuilderStepMap)) """ return self.IterToValueType(BuilderStepMap) - def AddResultList(self, builder, results): + def AddResultList(self, builder, results, expectation_files=None): """Adds |results| to |self|. Args: @@ -306,6 +293,9 @@ and try builders. results: A list of data_types.Result objects corresponding to the ResultDB data queried for |builder|. + expectation_files: An iterable of expectation file names that these + results could possibly apply to. If None, then expectations from all + known expectation files will be used. Returns: A list of data_types.Result objects who did not have a matching @@ -331,35 +321,38 @@ pass_results -= modified_failing_retry_results for r in pass_results | failure_results: - found_matching = self._AddResult(r, builder) + found_matching = self._AddResult(r, builder, expectation_files) if not found_matching: unmatched_results.append(r) return unmatched_results - def _AddResult(self, result, builder): + def _AddResult(self, result, builder, expectation_files): """Adds a single |result| to |self|. Args: result: A data_types.Result object to add. builder: A string containing the name of the builder |result| came from. + expectation_files: An iterable of expectation file names that these + results could possibly apply to. If None, then expectations from all + known expectation files will be used. Returns: True if an expectation in |self| applied to |result|, otherwise False. """ found_matching_expectation = False - # We need to use fnmatch since wildcards are supported, so there's no point - # in checking the test name key right now. The AppliesToResult check already - # does an fnmatch check. - for _, expectation, builder_map in self.IterBuilderStepMaps(): - if expectation.AppliesToResult(result): - found_matching_expectation = True - step_map = builder_map.setdefault(builder, StepBuildStatsMap()) - stats = step_map.setdefault(result.step, BuildStats()) - if result.actual_result == 'Pass': - stats.AddPassedBuild() - else: - stats.AddFailedBuild(result.build_id) + for ef, expectation_map in self.items(): + if expectation_files is not None and ef not in expectation_files: + continue + for expectation, builder_map in expectation_map.items(): + if expectation.AppliesToResult(result): + found_matching_expectation = True + step_map = builder_map.setdefault(builder, StepBuildStatsMap()) + stats = step_map.setdefault(result.step, BuildStats()) + if result.actual_result == 'Pass': + stats.AddPassedBuild() + else: + stats.AddFailedBuild(result.build_id) return found_matching_expectation def SplitByStaleness(self): @@ -383,7 +376,7 @@ # However, we need to reset state in different loops, and the alternative of # keeping all the state outside the loop and resetting under certain # conditions ends up being less readable than just using nested loops. - for test_name, expectation_map in self.items(): + for expectation_file, expectation_map in self.items(): for expectation, builder_map in expectation_map.items(): # A temporary map to hold data so we can later determine whether an # expectation is stale, semi-stale, or active. @@ -411,13 +404,13 @@ # Handle the case of a stale expectation. if not (tmp_map[NEVER_PASS] or tmp_map[PARTIAL_PASS]): builder_map = stale_dict.setdefault( - test_name, + expectation_file, ExpectationBuilderMap()).setdefault(expectation, BuilderStepMap()) _CopyPassesIntoBuilderMap(builder_map, [FULL_PASS]) # Handle the case of an active expectation. elif not tmp_map[FULL_PASS]: builder_map = active_dict.setdefault( - test_name, + expectation_file, ExpectationBuilderMap()).setdefault(expectation, BuilderStepMap()) _CopyPassesIntoBuilderMap(builder_map, [NEVER_PASS, PARTIAL_PASS]) # Handle the case of a semi-stale expectation. @@ -425,7 +418,7 @@ # TODO(crbug.com/998329): Sort by pass percentage so it's easier to # find problematic builders without highlighting. builder_map = semi_stale_dict.setdefault( - test_name, + expectation_file, ExpectationBuilderMap()).setdefault(expectation, BuilderStepMap()) _CopyPassesIntoBuilderMap(builder_map, [FULL_PASS, PARTIAL_PASS, NEVER_PASS])
diff --git a/testing/unexpected_passes_common/data_types_unittest.py b/testing/unexpected_passes_common/data_types_unittest.py index fbc3ea8f..caa9c0f7 100755 --- a/testing/unexpected_passes_common/data_types_unittest.py +++ b/testing/unexpected_passes_common/data_types_unittest.py
@@ -35,10 +35,6 @@ self.assertNotEqual(e, other) other = data_types.Expectation('test', ['tag1', 'tag2'], 'Pass', 'bug') self.assertNotEqual(e, other) - other = data_types.Expectation('test', ['tag1', 'tag2'], - 'Pass', - variant='foo') - self.assertNotEqual(e, other) other = data_types.Result('test', ['tag1', 'tag2'], 'Pass', 'pixel_tests', 'build_id') self.assertNotEqual(e, other) @@ -71,13 +67,6 @@ self.assertTrue(e.AppliesToResult(r)) e = data_types.Expectation('test', ['tag1', 'tag2'], ['RetryOnFailure']) self.assertTrue(e.AppliesToResult(r)) - # Explicit variants match. - r = data_types.Result('test', ['tag1', 'tag2'], 'Pass', 'pixel_tests', - 'build_id', 'foo_variant') - e = data_types.Expectation('test', ['tag1', 'tag2'], - 'Pass', - variant='foo_variant') - self.assertTrue(e.AppliesToResult(r)) def testAppliesToResultDoesNotApply(self): r = data_types.Result('test', ['tag1', 'tag2'], 'Pass', 'pixel_tests', @@ -91,18 +80,6 @@ # Tags subset mismatch. e = data_types.Expectation('test', ['tag3'], 'Pass') self.assertFalse(e.AppliesToResult(r)) - # Variants mismatch. - e = data_types.Expectation('test', ['tag1', 'tag2'], - 'Pass', - variant='foo_variant') - self.assertFalse(e.AppliesToResult(r)) - e = data_types.Expectation('test', ['tag1', 'tag2'], 'Pass') - r = data_types.Result('test', ['tag1', 'tag2'], - 'Pass', - 'pixel_tests', - 'build_id', - variant='foo_variant') - self.assertFalse(e.AppliesToResult(r)) class ResultUnittest(unittest.TestCase): @@ -513,7 +490,7 @@ def GetEmptyMapForGenericRetryExpectation(self): foo_expectation = self.GetGenericRetryExpectation() return data_types.TestExpectationMap({ - 'foo/test': + 'expectation_file': data_types.ExpectationBuilderMap({ foo_expectation: data_types.BuilderStepMap(), @@ -523,7 +500,7 @@ def GetEmptyMapForGenericFailureExpectation(self): foo_expectation = self.GetGenericFailureExpectation() return data_types.TestExpectationMap({ - 'foo/test': + 'expectation_file': data_types.ExpectationBuilderMap({ foo_expectation: data_types.BuilderStepMap(), @@ -542,7 +519,7 @@ def GetMapForExpectationAndStats(self, expectation, stats): return data_types.TestExpectationMap({ - expectation.test: + 'expectation_file': data_types.ExpectationBuilderMap({ expectation: data_types.BuilderStepMap({ @@ -645,17 +622,17 @@ 'pixel_tests', 'build_id') e = data_types.Expectation('some/test/*', ['win10'], 'Failure') expectation_map = data_types.TestExpectationMap({ - 'some/test/*': + 'expectation_file': data_types.ExpectationBuilderMap({ e: data_types.BuilderStepMap(), }), }) - found_matching = expectation_map._AddResult(r, 'builder') + found_matching = expectation_map._AddResult(r, 'builder', None) self.assertTrue(found_matching) stats = data_types.BuildStats() stats.AddPassedBuild() expected_expectation_map = { - 'some/test/*': { + 'expectation_file': { e: { 'builder': { 'pixel_tests': stats, @@ -671,17 +648,17 @@ 'pixel_tests', 'build_id') e = data_types.Expectation('some/test/*', ['win10'], 'Failure') expectation_map = data_types.TestExpectationMap({ - 'some/test/*': + 'expectation_file': data_types.ExpectationBuilderMap({ e: data_types.BuilderStepMap(), }), }) - found_matching = expectation_map._AddResult(r, 'builder') + found_matching = expectation_map._AddResult(r, 'builder', None) self.assertTrue(found_matching) stats = data_types.BuildStats() stats.AddFailedBuild('build_id') expected_expectation_map = { - 'some/test/*': { + 'expectation_file': { e: { 'builder': { 'pixel_tests': stats, @@ -699,7 +676,7 @@ stats = data_types.BuildStats() stats.AddFailedBuild('build_id') expectation_map = data_types.TestExpectationMap({ - 'some/test/*': + 'expectation_file': data_types.ExpectationBuilderMap({ e: data_types.BuilderStepMap({ @@ -710,13 +687,13 @@ }), }), }) - found_matching = expectation_map._AddResult(r, 'builder') + found_matching = expectation_map._AddResult(r, 'builder', None) self.assertTrue(found_matching) stats = data_types.BuildStats() stats.AddFailedBuild('build_id') stats.AddPassedBuild() expected_expectation_map = { - 'some/test/*': { + 'expectation_file': { e: { 'builder': { 'pixel_tests': stats, @@ -734,7 +711,7 @@ stats = data_types.BuildStats() stats.AddPassedBuild() expectation_map = data_types.TestExpectationMap({ - 'some/test/*': + 'expectation_file': data_types.ExpectationBuilderMap({ e: data_types.BuilderStepMap({ @@ -745,13 +722,13 @@ }), }), }) - found_matching = expectation_map._AddResult(r, 'builder') + found_matching = expectation_map._AddResult(r, 'builder', None) self.assertTrue(found_matching) stats = data_types.BuildStats() stats.AddFailedBuild('build_id') stats.AddPassedBuild() expected_expectation_map = { - 'some/test/*': { + 'expectation_file': { e: { 'builder': { 'pixel_tests': stats, @@ -768,18 +745,18 @@ e = data_types.Expectation('some/test/*', ['win10'], 'Failure') e2 = data_types.Expectation('some/test/case', ['win10'], 'Failure') expectation_map = data_types.TestExpectationMap({ - 'some/test/*': + 'expectation_file': data_types.ExpectationBuilderMap({ e: data_types.BuilderStepMap(), e2: data_types.BuilderStepMap(), }), }) - found_matching = expectation_map._AddResult(r, 'builder') + found_matching = expectation_map._AddResult(r, 'builder', None) self.assertTrue(found_matching) stats = data_types.BuildStats() stats.AddPassedBuild() expected_expectation_map = { - 'some/test/*': { + 'expectation_file': { e: { 'builder': { 'pixel_tests': stats, @@ -800,14 +777,44 @@ 'pixel_tests', 'build_id') e = data_types.Expectation('some/test/*', ['win10', 'foo'], 'Failure') expectation_map = data_types.TestExpectationMap({ - 'some/test/*': + 'expectation_file': data_types.ExpectationBuilderMap({ e: data_types.BuilderStepMap(), }) }) - found_matching = expectation_map._AddResult(r, 'builder') + found_matching = expectation_map._AddResult(r, 'builder', None) self.assertFalse(found_matching) - expected_expectation_map = {'some/test/*': {e: {}}} + expected_expectation_map = {'expectation_file': {e: {}}} + self.assertEqual(expectation_map, expected_expectation_map) + + def testResultMatchSpecificExpectationFiles(self): + """Tests that a match can be found when specifying expectation files.""" + r = data_types.Result('some/test/case', ['win'], 'Pass', 'pixel_tests', + 'build_id') + e = data_types.Expectation('some/test/case', ['win'], 'Failure') + expectation_map = data_types.TestExpectationMap({ + 'foo_expectations': + data_types.ExpectationBuilderMap({e: data_types.BuilderStepMap()}), + 'bar_expectations': + data_types.ExpectationBuilderMap({e: data_types.BuilderStepMap()}), + }) + found_matching = expectation_map._AddResult(r, 'builder', + ['bar_expectations']) + self.assertTrue(found_matching) + stats = data_types.BuildStats() + stats.AddPassedBuild() + expected_expectation_map = { + 'foo_expectations': { + e: {}, + }, + 'bar_expectations': { + e: { + 'builder': { + 'pixel_tests': stats, + } + } + } + } self.assertEqual(expectation_map, expected_expectation_map) @@ -1096,7 +1103,7 @@ def testNoUnused(self): """Tests that filtering is a no-op if there are no unused expectations.""" expectation_map = data_types.TestExpectationMap({ - 'foo/test': + 'expectation_file': data_types.ExpectationBuilderMap({ data_types.Expectation('foo/test', ['win'], ['Failure']): data_types.BuilderStepMap({ @@ -1113,7 +1120,7 @@ def testUnusedButNotEmpty(self): """Tests filtering if there is an unused expectation but no empty tests.""" expectation_map = data_types.TestExpectationMap({ - 'foo/test': + 'expectation_file': data_types.ExpectationBuilderMap({ data_types.Expectation('foo/test', ['win'], ['Failure']): data_types.BuilderStepMap({ @@ -1125,7 +1132,7 @@ }) }) expected_expectation_map = data_types.TestExpectationMap({ - 'foo/test': + 'expectation_file': data_types.ExpectationBuilderMap({ data_types.Expectation('foo/test', ['win'], ['Failure']): data_types.BuilderStepMap({ @@ -1143,7 +1150,7 @@ def testUnusedAndEmpty(self): """Tests filtering if there is an expectation that causes an empty test.""" expectation_map = data_types.TestExpectationMap({ - 'foo/test': + 'expectation_file': data_types.ExpectationBuilderMap({ data_types.Expectation('foo/test', ['win'], ['Failure']): data_types.BuilderStepMap(),
diff --git a/testing/unexpected_passes_common/expectations.py b/testing/unexpected_passes_common/expectations.py index fbc357f..773889e 100644 --- a/testing/unexpected_passes_common/expectations.py +++ b/testing/unexpected_passes_common/expectations.py
@@ -6,6 +6,7 @@ from __future__ import print_function import logging +import os import sys from typ import expectations_parser @@ -35,26 +36,31 @@ assert expectation_file or tests assert not (expectation_file and tests) + # TODO(crbug.com/1222827): Handle multiple expectation files. + expectation_file_name = None + if expectation_file: + expectation_file_name = os.path.basename(expectation_file) with open(expectation_file) as f: content = f.read() else: + expectation_file_name = '' content = '# results: [ RetryOnFailure ]\n' for t in tests: content += '%s [ RetryOnFailure ]\n' % t list_parser = expectations_parser.TaggedTestListParser(content) expectation_map = data_types.TestExpectationMap() + expectations_for_file = expectation_map.setdefault( + expectation_file_name, data_types.ExpectationBuilderMap()) logging.debug('Parsed %d expectations', len(list_parser.expectations)) for e in list_parser.expectations: if 'Skip' in e.raw_results: continue expectation = data_types.Expectation(e.test, e.tags, e.raw_results, e.reason) - expectations_for_test = expectation_map.setdefault( - e.test, data_types.ExpectationBuilderMap()) - assert expectation not in expectations_for_test - expectations_for_test[expectation] = data_types.BuilderStepMap() + assert expectation not in expectations_for_file + expectations_for_file[expectation] = data_types.BuilderStepMap() return expectation_map
diff --git a/testing/unexpected_passes_common/expectations_unittest.py b/testing/unexpected_passes_common/expectations_unittest.py index 0146b8a..dc5f17f2 100755 --- a/testing/unexpected_passes_common/expectations_unittest.py +++ b/testing/unexpected_passes_common/expectations_unittest.py
@@ -61,17 +61,16 @@ with tempfile.NamedTemporaryFile(delete=False, mode='w') as f: filename = f.name f.write(FAKE_EXPECTATION_FILE_CONTENTS) + basename = os.path.basename(filename) expectation_map = self.instance.CreateTestExpectationMap(filename, None) # Skip expectations should be omitted, but everything else should be # present. # yapf: disable expected_expectation_map = { - 'foo/test': { + basename: { data_types.Expectation( 'foo/test', ['win'], ['Failure'], 'crbug.com/1234'): {}, data_types.Expectation('foo/test', ['linux'], ['Failure']): {}, - }, - 'bar/*': { data_types.Expectation( 'bar/*', ['linux'], ['RetryOnFailure'], 'crbug.com/2345'): {}, }, @@ -85,10 +84,8 @@ expectation_map = self.instance.CreateTestExpectationMap( None, ['foo/test', 'bar/*']) expected_expectation_map = { - 'foo/test': { + '': { data_types.Expectation('foo/test', [], ['RetryOnFailure']): {}, - }, - 'bar/*': { data_types.Expectation('bar/*', [], ['RetryOnFailure']): {}, }, } @@ -285,7 +282,7 @@ self._input_mock.return_value = 'r' # yapf: disable test_expectation_map = data_types.TestExpectationMap({ - 'foo/test': + 'expectation_file': data_types.ExpectationBuilderMap({ data_types.Expectation( 'foo/test', ['win'], 'Failure', 'crbug.com/1234'): @@ -313,7 +310,7 @@ self._input_mock.return_value = 'm' # yapf: disable test_expectation_map = data_types.TestExpectationMap({ - 'foo/test': + 'expectation_file': data_types.ExpectationBuilderMap({ data_types.Expectation( 'foo/test', ['win'], 'Failure', 'crbug.com/1234'): @@ -332,7 +329,7 @@ self._input_mock.return_value = 'i' # yapf: disable test_expectation_map = data_types.TestExpectationMap({ - 'foo/test': + 'expectation_file': data_types.ExpectationBuilderMap({ data_types.Expectation( 'foo/test', ['win'], 'Failure', 'crbug.com/1234'): @@ -364,7 +361,7 @@ any_input_mock.side_effect = CorrectionSideEffect # yapf: disable test_expectation_map = data_types.TestExpectationMap({ - 'foo/test': + 'expectation_file': data_types.ExpectationBuilderMap({ data_types.Expectation( 'foo/test', ['win'], 'Failure', 'crbug.com/1234'):
diff --git a/testing/unexpected_passes_common/queries.py b/testing/unexpected_passes_common/queries.py index 79dcf43..46a9fd4 100644 --- a/testing/unexpected_passes_common/queries.py +++ b/testing/unexpected_passes_common/queries.py
@@ -130,11 +130,12 @@ The output of data_types.TestExpectationMap.AddResultList(). """ builder, builder_type, expectation_map = inputs - results = self.QueryBuilder(builder, builder_type) + results, expectation_files = self.QueryBuilder(builder, builder_type) prefixed_builder_name = '%s:%s' % (builder_type, builder) unmatched_results = expectation_map.AddResultList(prefixed_builder_name, - results) + results, + expectation_files) return unmatched_results, prefixed_builder_name, expectation_map @@ -147,14 +148,16 @@ "ci" or "try". Returns: - The results returned by the query converted into a list of - data_types.Resultobjects. + A tuple (results, expectation_files). |results| is the results returned by + the query converted into a list of data_types.Result objects. + |expectation_files| is a set of strings denoting which expectation files + are relevant to |results|, or None if all should be used. """ query_generator = self._GetQueryGeneratorForBuilder(builder, builder_type) if not query_generator: # No affected tests on this builder, so early return. - return [] + return [], None # Query for the test data from the builder, splitting the query if we run # into the BigQuery hard memory limit. Even if we keep failing, this will @@ -186,7 +189,10 @@ logging.warning( 'Did not get results for "%s", but this may be because its ' 'results do not apply to any expectations for this suite.', builder) - return results + return results, None + + expectation_files = self._GetRelevantExpectationFilesForQueryResult( + query_results[0]) for r in query_results: if self._ShouldSkipOverResult(r): @@ -200,7 +206,20 @@ data_types.Result(test_name, tags, actual_result, step, build_id)) logging.debug('Got %d results for %s builder %s', len(results), builder_type, builder) - return results + return results, expectation_files + + def _GetRelevantExpectationFilesForQueryResult(self, query_result): + """Gets the relevant expectation file names for a given query result. + + Args: + query_result: A dict containing single row/result from a BigQuery query. + + Returns: + An iterable of strings containing expectation file names that are + relevant to |query_result|, or None if all expectation files should be + considered relevant. + """ + raise NotImplementedError() def _ShouldSkipOverResult(self, result): """Whether |result| should be ignored and skipped over.
diff --git a/testing/unexpected_passes_common/queries_unittest.py b/testing/unexpected_passes_common/queries_unittest.py index 3067737..9dd7223 100755 --- a/testing/unexpected_passes_common/queries_unittest.py +++ b/testing/unexpected_passes_common/queries_unittest.py
@@ -69,6 +69,13 @@ unittest_utils.RegisterGenericBuildersImplementation() self._querier = unittest_utils.CreateGenericQuerier() + self._relevant_file_patcher = mock.patch.object( + self._querier, + '_GetRelevantExpectationFilesForQueryResult', + return_value=None) + self._relevant_file_mock = self._relevant_file_patcher.start() + self.addCleanup(self._relevant_file_patcher.stop) + def testQueryFailureRaised(self): """Tests that a query failure is properly surfaced.""" self._popen_mock.return_value = unittest_utils.FakeProcess(returncode=1) @@ -83,11 +90,13 @@ def testNoResults(self): """Tests functionality if the query returns no results.""" self._popen_mock.return_value = unittest_utils.FakeProcess(stdout='[]') - results = self._querier.QueryBuilder('builder', 'ci') + results, expectation_files = self._querier.QueryBuilder('builder', 'ci') self.assertEqual(results, []) + self.assertIsNone(expectation_files, None) def testValidResults(self): """Tests functionality when valid results are returned.""" + self._relevant_file_mock.return_value = ['foo_expectations'] query_results = [ { 'id': @@ -110,12 +119,13 @@ ] self._popen_mock.return_value = unittest_utils.FakeProcess( stdout=json.dumps(query_results)) - results = self._querier.QueryBuilder('builder', 'ci') + results, expectation_files = self._querier.QueryBuilder('builder', 'ci') self.assertEqual(len(results), 1) self.assertEqual( results[0], data_types.Result('test_name', ['win', 'intel'], 'Failure', 'step_name', '1234')) + self.assertEqual(expectation_files, ['foo_expectations']) def testFilterInsertion(self): """Tests that test filters are properly inserted into the query.""" @@ -137,9 +147,10 @@ self._querier, '_GetQueryGeneratorForBuilder', return_value=None), mock.patch.object( self._querier, '_RunBigQueryCommandsForJsonOutput') as query_mock: - results = self._querier.QueryBuilder('builder', 'ci') + results, expectation_files = self._querier.QueryBuilder('builder', 'ci') query_mock.assert_not_called() self.assertEqual(results, []) + self.assertEqual(expectation_files, None) def testRetryOnMemoryLimit(self): """Tests that queries are split and retried if the memory limit is hit.""" @@ -197,11 +208,12 @@ def SideEffect(builder, *args): del args if builder == 'matched_builder': - return [ + return ([ data_types.Result('foo', ['win'], 'Pass', 'step_name', 'build_id') - ] + ], None) else: - return [data_types.Result('bar', [], 'Pass', 'step_name', 'build_id')] + return ([data_types.Result('bar', [], 'Pass', 'step_name', + 'build_id')], None) self._query_mock.side_effect = SideEffect
diff --git a/testing/unexpected_passes_common/result_output.py b/testing/unexpected_passes_common/result_output.py index 07a7cfd..8d8d9c23 100644 --- a/testing/unexpected_passes_common/result_output.py +++ b/testing/unexpected_passes_common/result_output.py
@@ -337,20 +337,22 @@ A string dictionary representation of |test_expectation_map| in the following format: { - test_name: { - expectation_summary: { - builder_name: { - 'Fully passed in the following': [ - step1, - ], - 'Partially passed in the following': { - step2: [ - failure_link, + expectation_file: { + test_name: { + expectation_summary: { + builder_name: { + 'Fully passed in the following': [ + step1, ], - }, - 'Never passed in the following': [ - step3, - ], + 'Partially passed in the following': { + step2: [ + failure_link, + ], + }, + 'Never passed in the following': [ + step3, + ], + } } } } @@ -363,15 +365,18 @@ # However, we need to reset state in different loops, and the alternative of # keeping all the state outside the loop and resetting under certain # conditions ends up being less readable than just using nested loops. - for test_name, expectation_map in test_expectation_map.items(): - output_dict[test_name] = {} + for expectation_file, expectation_map in test_expectation_map.items(): + output_dict[expectation_file] = {} for expectation, builder_map in expectation_map.items(): + test_name = expectation.test expectation_str = _FormatExpectation(expectation) - output_dict[test_name][expectation_str] = {} + output_dict[expectation_file].setdefault(test_name, {}) + output_dict[expectation_file][test_name][expectation_str] = {} for builder_name, step_map in builder_map.items(): - output_dict[test_name][expectation_str][builder_name] = {} + output_dict[expectation_file][test_name][expectation_str][ + builder_name] = {} fully_passed = [] partially_passed = {} never_passed = [] @@ -385,8 +390,8 @@ assert step_name not in partially_passed partially_passed[step_name] = stats - output_builder_map =\ - output_dict[test_name][expectation_str][builder_name] + output_builder_map = output_dict[expectation_file][test_name][ + expectation_str][builder_name] if fully_passed: output_builder_map[FULL_PASS] = fully_passed if partially_passed:
diff --git a/testing/unexpected_passes_common/result_output_unittest.py b/testing/unexpected_passes_common/result_output_unittest.py index 2aa06c42..37755508 100755 --- a/testing/unexpected_passes_common/result_output_unittest.py +++ b/testing/unexpected_passes_common/result_output_unittest.py
@@ -100,9 +100,11 @@ def testSemiStaleMap(self): """Tests that everything functions when regular data is provided.""" expectation_map = data_types.TestExpectationMap({ - 'foo': + 'expectation_file': data_types.ExpectationBuilderMap({ - data_types.Expectation('foo', ['win', 'intel'], ['RetryOnFailure']): + data_types.Expectation('foo/test', ['win', 'intel'], [ + 'RetryOnFailure' + ]): data_types.BuilderStepMap({ 'builder': data_types.StepBuildStatsMap({ @@ -114,7 +116,7 @@ uu.CreateStatsWithPassFails(1, 1), }), }), - data_types.Expectation('foo', ['linux', 'intel'], [ + data_types.Expectation('foo/test', ['linux', 'intel'], [ 'RetryOnFailure' ]): data_types.BuilderStepMap({ @@ -124,7 +126,9 @@ uu.CreateStatsWithPassFails(2, 0), }), }), - data_types.Expectation('foo', ['mac', 'intel'], ['RetryOnFailure']): + data_types.Expectation('foo/test', ['mac', 'intel'], [ + 'RetryOnFailure' + ]): data_types.BuilderStepMap({ 'builder': data_types.StepBuildStatsMap({ @@ -138,34 +142,36 @@ # switched to Python 3. if sys.version_info[0] == 2: expected_output = { - 'foo': { - '"RetryOnFailure" expectation on "win intel"': { - 'builder': { - 'Fully passed in the following': [ - 'all_pass (2/2)', - ], - 'Never passed in the following': [ - 'all_fail (0/2)', - ], - 'Partially passed in the following': { - 'some_pass (1/2)': [ - data_types.BuildLinkFromBuildId('build_id0'), + 'expectation_file': { + 'foo/test': { + '"RetryOnFailure" expectation on "win intel"': { + 'builder': { + 'Fully passed in the following': [ + 'all_pass (2/2)', + ], + 'Never passed in the following': [ + 'all_fail (0/2)', + ], + 'Partially passed in the following': { + 'some_pass (1/2)': [ + data_types.BuildLinkFromBuildId('build_id0'), + ], + }, + }, + }, + '"RetryOnFailure" expectation on "intel linux"': { + 'builder': { + 'Fully passed in the following': [ + 'all_pass (2/2)', ], }, }, - }, - '"RetryOnFailure" expectation on "intel linux"': { - 'builder': { - 'Fully passed in the following': [ - 'all_pass (2/2)', - ], - }, - }, - '"RetryOnFailure" expectation on "mac intel"': { - 'builder': { - 'Never passed in the following': [ - 'all_fail (0/2)', - ], + '"RetryOnFailure" expectation on "mac intel"': { + 'builder': { + 'Never passed in the following': [ + 'all_fail (0/2)', + ], + }, }, }, }, @@ -178,34 +184,36 @@ win_tags = ' '.join(set(['win', 'intel'])) mac_tags = ' '.join(set(['mac', 'intel'])) expected_output = { - 'foo': { - '"RetryOnFailure" expectation on "%s"' % linux_tags: { - 'builder': { - 'Fully passed in the following': [ - 'all_pass (2/2)', - ], - }, - }, - '"RetryOnFailure" expectation on "%s"' % win_tags: { - 'builder': { - 'Fully passed in the following': [ - 'all_pass (2/2)', - ], - 'Partially passed in the following': { - 'some_pass (1/2)': [ - data_types.BuildLinkFromBuildId('build_id0'), + 'expectation_file': { + 'foo/test': { + '"RetryOnFailure" expectation on "%s"' % linux_tags: { + 'builder': { + 'Fully passed in the following': [ + 'all_pass (2/2)', ], }, - 'Never passed in the following': [ - 'all_fail (0/2)', - ], }, - }, - '"RetryOnFailure" expectation on "%s"' % mac_tags: { - 'builder': { - 'Never passed in the following': [ - 'all_fail (0/2)', - ], + '"RetryOnFailure" expectation on "%s"' % win_tags: { + 'builder': { + 'Fully passed in the following': [ + 'all_pass (2/2)', + ], + 'Partially passed in the following': { + 'some_pass (1/2)': [ + data_types.BuildLinkFromBuildId('build_id0'), + ], + }, + 'Never passed in the following': [ + 'all_fail (0/2)', + ], + }, + }, + '"RetryOnFailure" expectation on "%s"' % mac_tags: { + 'builder': { + 'Never passed in the following': [ + 'all_fail (0/2)', + ], + }, }, }, },
diff --git a/testing/unexpected_passes_common/unittest_utils.py b/testing/unexpected_passes_common/unittest_utils.py index b1a6f837..221f64b 100644 --- a/testing/unexpected_passes_common/unittest_utils.py +++ b/testing/unexpected_passes_common/unittest_utils.py
@@ -47,6 +47,9 @@ return SimpleFixedQueryGenerator(builder_type, 'AND True') return SimpleSplitQueryGenerator(builder_type, ['test_id'], 200) + def _GetRelevantExpectationFilesForQueryResult(self, _): + return None + def _StripPrefixFromTestId(self, test_id): return test_id.split('.')[-1]
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 376f947..4937db3 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -5510,7 +5510,6 @@ "enable_features": [ "OmniboxClobberTriggersContextualWebZeroSuggest", "OmniboxEntitySuggestionsReduceLatency", - "OmniboxHistoryQuickProviderAblateInMemoryURLIndexCacheFile", "OmniboxKeywordSearchButton", "OmniboxMaxURLMatches", "OmniboxMaxZeroSuggestMatches", @@ -5539,7 +5538,6 @@ "OmniboxAdaptiveSuggestionsCount", "OmniboxCompactSuggestions", "OmniboxDynamicMaxAutocomplete", - "OmniboxHistoryQuickProviderAblateInMemoryURLIndexCacheFile", "OmniboxMaxURLMatches", "OmniboxMaxZeroSuggestMatches", "OmniboxOnFocusSuggestionsContextualWebAllowSRP", @@ -7823,22 +7821,6 @@ ] } ], - "SiteIsolation": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "COOPOAuth_20210617", - "enable_features": [ - "SiteIsolationForCrossOriginOpenerPolicy", - "SiteIsolationForOAuthSites" - ] - } - ] - } - ], "SmartSuggestionForLargeDownloads": [ { "platforms": [
diff --git a/third_party/.gitignore b/third_party/.gitignore index b63c413c..b94b86d 100644 --- a/third_party/.gitignore +++ b/third_party/.gitignore
@@ -100,7 +100,6 @@ /glfw/src /gn/ /gnu_binutils/ -/google_android_play_core/core-*.aar /google_appengine_cloudstorage /google_benchmark/src /google_toolbox_for_mac/src
diff --git a/third_party/android_build_tools/aapt2/README.chromium b/third_party/android_build_tools/aapt2/README.chromium index fae3c4f..232213a 100644 --- a/third_party/android_build_tools/aapt2/README.chromium +++ b/third_party/android_build_tools/aapt2/README.chromium
@@ -1,6 +1,6 @@ Name: Android SDK tool aapt2 Short name: aapt2 -Version: 7.0.0-beta03-7147631 +Version: 7.1.0-alpha07-7569047 URL: https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/${Version}/aapt2-${Version}-linux.jar Security Critical: no License: Apache Version 2.0
diff --git a/third_party/android_build_tools/bundletool/3pp/3pp.pb b/third_party/android_build_tools/bundletool/3pp/3pp.pb new file mode 100644 index 0000000..d3009dd9 --- /dev/null +++ b/third_party/android_build_tools/bundletool/3pp/3pp.pb
@@ -0,0 +1,14 @@ +# 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. +create { + source { + script { name: "fetch.py" } + patch_version: "cr0" + } +} + +upload { + pkg_prefix: "chromium/third_party/android_build_tools" + universal: true +}
diff --git a/third_party/android_build_tools/bundletool/3pp/fetch.py b/third_party/android_build_tools/bundletool/3pp/fetch.py new file mode 100755 index 0000000..4c5735b --- /dev/null +++ b/third_party/android_build_tools/bundletool/3pp/fetch.py
@@ -0,0 +1,57 @@ +#!/usr/bin/env python +# 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. + +from __future__ import print_function + +import argparse +import json +import os +import urllib + +_RELEASES_URL = 'https://api.github.com/repos/google/bundletool/releases/latest' +_RELEASE_URL = 'https://api.github.com/repos/google/bundletool/releases/tags/{}' + + +def fetch_json(url): + return json.loads(urllib.urlopen(url).read()) + + +def do_latest(): + json_dict = fetch_json(_RELEASES_URL) + print(json_dict['tag_name']) + + +def get_download_url(): + json_dict = fetch_json(_RELEASE_URL.format(os.environ['_3PP_VERSION'])) + # There is currently just one asset, but do a quick filter to guard against + # possible future assets. + urls = [x['browser_download_url'] for x in json_dict['assets']] + urls = [x for x in urls if 'bundletool-all' in x and x.endswith('.jar')] + if len(urls) != 1: + raise Exception('len(urls) != 1: ' + '\n'.join(urls)) + + partial_manifest = { + 'url': urls, + 'ext': '', # Used only if recipe needs to extract. + 'name': [urls[0].split('/')[-1]], # Used as the file name. + } + print(json.dumps(partial_manifest)) + + +def main(): + ap = argparse.ArgumentParser() + sub = ap.add_subparsers() + + latest = sub.add_parser("latest") + latest.set_defaults(func=do_latest) + + download = sub.add_parser("get_url") + download.set_defaults(func=get_download_url) + + ap.parse_args().func() + + +if __name__ == '__main__': + main()
diff --git a/third_party/android_build_tools/bundletool/README.chromium b/third_party/android_build_tools/bundletool/README.chromium index cc0241db..adf7d3c 100644 --- a/third_party/android_build_tools/bundletool/README.chromium +++ b/third_party/android_build_tools/bundletool/README.chromium
@@ -8,13 +8,12 @@ Description: Bundletool is a tool to manipulate Android App Bundles. -It is distributed here as a CIPD package. See cipd.yaml for details. Local Modifications: None Update Instructions: -1. Download the latest .jar from the GitHub Release page. - E.g.: https://github.com/google/bundletool/releases -2. Look at previous commit to //third_party/android_build_tools/bundletools to - see what other files need updating. +* New versions are automatically copied from github release to CIPD via 3pp: + https://luci-scheduler.appspot.com/jobs/chromium/3pp-linux-amd64-packager +* Find the CIPD hash of the latest versoin and update the entry within //DEPS. +* Look at previous roll commit to see what other files need updating.
diff --git a/third_party/android_build_tools/bundletool/cipd.yaml b/third_party/android_build_tools/bundletool/cipd.yaml deleted file mode 100644 index 0b69dda2..0000000 --- a/third_party/android_build_tools/bundletool/cipd.yaml +++ /dev/null
@@ -1,13 +0,0 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# To create CIPD package run the following command. -# cipd create --pkg-def cipd.yaml -package: chromium/third_party/android_tools_bundletool -description: Android SDK tool to manage App Bundles -# TODO(https://crbug.com/950727): Remove this and go back to symlinks once -# swarming isolation works properly with symlinks. -install_mode: copy -data: - - file: bundletool-all-1.4.0.jar
diff --git a/third_party/android_deps/build.gradle b/third_party/android_deps/build.gradle index 4738ad0c..33889fcf 100644 --- a/third_party/android_deps/build.gradle +++ b/third_party/android_deps/build.gradle
@@ -44,7 +44,6 @@ // Replacement for com.android.support:design compile 'com.google.android.material:material:1.4.0-rc01' - // Replacement for //third_party/google_android_play_core compile 'com.google.android.play:core:1.10.0' // Architecture components
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl index 88a90d1..bc461b8 100644 --- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl +++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -5922,6 +5922,13 @@ Public Unknown + experimental type ConnectTiming extends object + properties + # Timing's requestTime is a baseline in seconds, while the other numbers are ticks in + # milliseconds relatively to this requestTime. Matches ResourceTiming's requestTime for + # the same request (but not for redirected requests). + number requestTime + experimental type ClientSecurityState extends object properties boolean initiatorIsSecureContext @@ -5941,6 +5948,8 @@ array of BlockedCookieWithReason associatedCookies # Raw request headers as they will be sent over the wire. Headers headers + # Connection timing information for the request. + experimental ConnectTiming connectTiming # The client security state set for the request. optional ClientSecurityState clientSecurityState
diff --git a/third_party/blink/public/mojom/frame/frame.mojom b/third_party/blink/public/mojom/frame/frame.mojom index 552e9dc..6c67cc9 100644 --- a/third_party/blink/public/mojom/frame/frame.mojom +++ b/third_party/blink/public/mojom/frame/frame.mojom
@@ -128,6 +128,9 @@ // Whether the download is from context menu. bool is_context_menu_save = false; + + // True when the download was preceded by a recent gesture from the user. + bool has_user_gesture = false; }; // Actions browser can ask renderer to perform on a Plugin.
diff --git a/third_party/blink/public/mojom/webid/federated_auth_request.mojom b/third_party/blink/public/mojom/webid/federated_auth_request.mojom index 2753124..afede7d 100644 --- a/third_party/blink/public/mojom/webid/federated_auth_request.mojom +++ b/third_party/blink/public/mojom/webid/federated_auth_request.mojom
@@ -48,7 +48,8 @@ RequestIdToken(url.mojom.Url provider, string client_id, string nonce, - RequestMode mode) => + RequestMode mode, + bool prefer_auto_sign_in) => (RequestIdTokenStatus status, string? id_token); // Contact the list of Relying Party logout endpoints to attempt to initiate
diff --git a/third_party/blink/renderer/core/app_history/app_history.cc b/third_party/blink/renderer/core/app_history/app_history.cc index f50aaab..d6419f9 100644 --- a/third_party/blink/renderer/core/app_history/app_history.cc +++ b/third_party/blink/renderer/core/app_history/app_history.cc
@@ -48,7 +48,6 @@ ScriptValue info; Member<ScriptPromiseResolver> returned_promise; String key; - bool did_react_to_promise = false; void Trace(Visitor* visitor) const { visitor->Trace(info); @@ -63,8 +62,6 @@ ScriptPromise promise, AppHistoryApiNavigation* navigation, AbortSignal* signal) { - if (navigation) - navigation->did_react_to_promise = true; promise.Then( CreateFunction(script_state, navigation, signal, ResolveType::kFulfill), CreateFunction(script_state, navigation, signal, ResolveType::kReject)); @@ -398,11 +395,6 @@ return ScriptPromise(); } - // The spec assumes it's ok to leave a promise permanently unresolved, but - // ScriptPromiseResolver requires either resolution or explicit detach. - // Do the detach on a microtask so that we can still return the promise. - if (!navigation->did_react_to_promise) - NavigateReaction::CleanupWithoutResolving(script_state, navigation); if (to_be_set_serialized_state_) { current()->GetItem()->SetAppHistoryState( std::move(to_be_set_serialized_state_)); @@ -647,9 +639,13 @@ } post_navigate_event_ongoing_navigation_signal_ = navigate_event->signal(); + if (navigate_event->defaultPrevented()) { + FinalizeWithAbortedNavigationError(script_state, navigation); + return DispatchResult::kAbort; + } + if (!promise_list.IsEmpty() || - (!navigate_event->defaultPrevented() && - event_type != NavigateEventType::kCrossDocument)) { + event_type != NavigateEventType::kCrossDocument) { ScriptPromise promise; if (promise_list.IsEmpty()) promise = ScriptPromise::CastUndefined(script_state); @@ -660,11 +656,11 @@ promise_list.IsEmpty() ? nullptr : navigate_event->signal()); } else { to_be_set_serialized_state_.reset(); - } - - if (navigate_event->defaultPrevented()) { - FinalizeWithAbortedNavigationError(script_state, navigation); - return DispatchResult::kAbort; + // The spec assumes it's ok to leave a promise permanently unresolved, but + // ScriptPromiseResolver requires either resolution or explicit detach. + // Do the detach on a microtask so that we can still return the promise. + if (navigation) + NavigateReaction::CleanupWithoutResolving(script_state, navigation); } return promise_list.IsEmpty() ? DispatchResult::kContinue
diff --git a/third_party/blink/renderer/core/css/layout_tree_rebuild_root.cc b/third_party/blink/renderer/core/css/layout_tree_rebuild_root.cc index b16aea1..08e08a87e 100644 --- a/third_party/blink/renderer/core/css/layout_tree_rebuild_root.cc +++ b/third_party/blink/renderer/core/css/layout_tree_rebuild_root.cc
@@ -19,8 +19,9 @@ // the need for a LayoutText. Single roots are typically dirty, but we need an // extra check for IsSingleRoot() because we mark nodes which have siblings // removed with MarkAncestorsWithChildNeedsReattachLayoutTree() in - // StyleEngine::MarkForWhitespaceReattachment(). In that case we need to start - // from the ancestor to traverse all whitespace siblings. + // Element::RecalcStyle() if the LayoutObject is marked with + // WhitespaceChildrenMayChange(). In that case we need to start from the + // ancestor to traverse all whitespace siblings. if (IsSingleRoot() || root_node->NeedsReattachLayoutTree() || !root_node->GetLayoutObject()) { Element* root_element = root_node->GetReattachParent();
diff --git a/third_party/blink/renderer/core/css/properties/computed_style_utils.cc b/third_party/blink/renderer/core/css/properties/computed_style_utils.cc index 789e7d5..caec642 100644 --- a/third_party/blink/renderer/core/css/properties/computed_style_utils.cc +++ b/third_party/blink/renderer/core/css/properties/computed_style_utils.cc
@@ -773,15 +773,19 @@ } CSSValueList* ComputedStyleUtils::ValueForFontFamily( - const ComputedStyle& style) { - const FontFamily& first_family = style.GetFontDescription().Family(); + const FontFamily& font_family) { CSSValueList* list = CSSValueList::CreateCommaSeparated(); - for (const FontFamily* family = &first_family; family; - family = family->Next()) + for (const FontFamily* family = &font_family; family; family = family->Next()) list->Append(*ValueForFamily(family->Family())); return list; } +CSSValueList* ComputedStyleUtils::ValueForFontFamily( + const ComputedStyle& style) { + return ComputedStyleUtils::ValueForFontFamily( + style.GetFontDescription().Family()); +} + CSSPrimitiveValue* ComputedStyleUtils::ValueForFontSize( const ComputedStyle& style) { return ZoomAdjustedPixelValue(style.GetFontDescription().ComputedSize(),
diff --git a/third_party/blink/renderer/core/css/properties/computed_style_utils.h b/third_party/blink/renderer/core/css/properties/computed_style_utils.h index ff391ca..4899c0b 100644 --- a/third_party/blink/renderer/core/css/properties/computed_style_utils.h +++ b/third_party/blink/renderer/core/css/properties/computed_style_utils.h
@@ -24,6 +24,7 @@ class CSSStyleValue; class CSSValue; class ComputedStyle; +class FontFamily; class StyleColor; class StylePropertyShorthand; @@ -106,6 +107,7 @@ const StyleContentAlignmentData&); static CSSValue* ValueForLineHeight(const ComputedStyle&); static CSSValue* ComputedValueForLineHeight(const ComputedStyle&); + static CSSValueList* ValueForFontFamily(const FontFamily&); static CSSValueList* ValueForFontFamily(const ComputedStyle&); static CSSPrimitiveValue* ValueForFontSize(const ComputedStyle&); static CSSPrimitiveValue* ValueForFontStretch(const ComputedStyle&);
diff --git a/third_party/blink/renderer/core/css/style_engine.cc b/third_party/blink/renderer/core/css/style_engine.cc index b9d75db..1ca9d53 100644 --- a/third_party/blink/renderer/core/css/style_engine.cc +++ b/third_party/blink/renderer/core/css/style_engine.cc
@@ -1765,26 +1765,6 @@ timelines_need_update_ = true; } -void StyleEngine::MarkForWhitespaceReattachment() { - DCHECK(GetDocument().InStyleRecalc()); - for (auto element : whitespace_reattach_set_) { - if (element->NeedsReattachLayoutTree() || !element->GetLayoutObject()) - continue; - // This element might be located inside a display locked subtree, so we - // might mark it for ReattachLayoutTree later on instead. - if (Element* locked_ancestor = - DisplayLockUtilities::NearestLockedInclusiveAncestor(*element)) { - locked_ancestor->GetDisplayLockContext()->AddToWhitespaceReattachSet( - *element); - continue; - } - DCHECK(!element->NeedsStyleRecalc()); - DCHECK(!element->ChildNeedsStyleRecalc()); - if (Node* first_child = LayoutTreeBuilderTraversal::FirstChild(*element)) - first_child->MarkAncestorsWithChildNeedsReattachLayoutTree(); - } -} - void StyleEngine::NodeWillBeRemoved(Node& node) { if (auto* element = DynamicTo<Element>(node)) { pending_invalidations_.RescheduleSiblingInvalidationsAsDescendants( @@ -1809,8 +1789,17 @@ DCHECK(layout_object->GetNode()); if (auto* layout_object_element = DynamicTo<Element>(layout_object->GetNode())) { - whitespace_reattach_set_.insert(layout_object_element); - GetDocument().ScheduleLayoutTreeUpdateIfNeeded(); + // Use the LayoutObject pointed to by the element. There may be multiple + // LayoutObjects associated with an element for continuations. The + // LayoutObject pointed to by the element is the one that is checked for the + // flag during style recalc. + if (layout_object->IsInline()) + layout_object = layout_object->ContinuationRoot(); + DCHECK_EQ(layout_object, layout_object_element->GetLayoutObject()); + if (layout_object->WhitespaceChildrenMayChange()) + return; + layout_object->SetWhitespaceChildrenMayChange(true); + layout_object_element->MarkAncestorsWithChildNeedsStyleRecalc(); } } @@ -2051,6 +2040,8 @@ change = change.SuppressRecalc(); NthIndexCache nth_index_cache(GetDocument()); + // The StyleRecalcRoot invariants requires the root to be dirty/child-dirty + container.SetChildNeedsStyleRecalc(); style_recalc_root_.Update(nullptr, &container); // No need to initialize container for the StyleRecalcContext with @@ -2059,10 +2050,6 @@ // with itself for its children. RecalcStyle(change, StyleRecalcContext()); - // Nodes are marked for whitespace reattachment for DOM removal only. This set - // should have been cleared before layout. - DCHECK(!NeedsWhitespaceReattachment()); - if (container.ChildNeedsReattachLayoutTree()) { DCHECK(layout_tree_rebuild_root_.GetRootNode()); if (layout_tree_rebuild_root_.GetRootNode()->IsDocumentNode()) { @@ -2188,7 +2175,6 @@ if (viewport_defining != GetDocument().ViewportDefiningElement()) ViewportDefiningElementDidChange(); } - MarkForWhitespaceReattachment(); if (NeedsLayoutTreeRebuild()) { TRACE_EVENT0("blink,blink_style", "Document::rebuildLayoutTree"); SCOPED_BLINK_UMA_HISTOGRAM_TIMER_HIGHRES("Style.RebuildLayoutTreeTime"); @@ -2197,7 +2183,6 @@ } else { style_recalc_root_.Clear(); } - ClearWhitespaceReattachSet(); UpdateColorSchemeBackground(); GetStyleResolver().PropagateStyleToViewport(); } @@ -2476,8 +2461,7 @@ } bool StyleEngine::NeedsFullStyleUpdate() const { - return NeedsActiveStyleUpdate() || NeedsWhitespaceReattachment() || - IsViewportStyleDirty(); + return NeedsActiveStyleUpdate() || IsViewportStyleDirty(); } void StyleEngine::PropagateWritingModeAndDirectionToHTMLRoot() { @@ -2567,7 +2551,6 @@ visitor->Trace(style_invalidation_root_); visitor->Trace(style_recalc_root_); visitor->Trace(layout_tree_rebuild_root_); - visitor->Trace(whitespace_reattach_set_); visitor->Trace(font_selector_); visitor->Trace(text_to_sheet_cache_); visitor->Trace(sheet_to_text_cache_);
diff --git a/third_party/blink/renderer/core/css/style_engine.h b/third_party/blink/renderer/core/css/style_engine.h index 3799f40d..c2e98685 100644 --- a/third_party/blink/renderer/core/css/style_engine.h +++ b/third_party/blink/renderer/core/css/style_engine.h
@@ -389,17 +389,6 @@ // elements *referenced* by @scroll-timeline rules change. void ScrollTimelinesChanged(); - bool NeedsWhitespaceReattachment() const { - return !whitespace_reattach_set_.IsEmpty(); - } - bool NeedsWhitespaceReattachment(Element* element) const { - return whitespace_reattach_set_.Contains(element); - } - void ClearNeedsWhitespaceReattachmentFor(Element* element) { - whitespace_reattach_set_.erase(element); - } - void ClearWhitespaceReattachSet() { whitespace_reattach_set_.clear(); } - void MarkForWhitespaceReattachment(); void MarkAllElementsForStyleRecalc(const StyleChangeReasonForTracing& reason); void MarkViewportStyleDirty(); bool IsViewportStyleDirty() const { return viewport_style_dirty_; } @@ -665,12 +654,6 @@ StyleRecalcRoot style_recalc_root_; LayoutTreeRebuildRoot layout_tree_rebuild_root_; - // This is a set of rendered elements which had one or more of its rendered - // children removed since the last lifecycle update. For such elements we need - // to re-attach whitespace children. Also see reattach_all_whitespace_nodes_ - // in the WhitespaceAttacher class. - HeapHashSet<Member<Element>> whitespace_reattach_set_; - Member<CSSFontSelector> font_selector_; HeapHashMap<AtomicString, WeakMember<StyleSheetContents>>
diff --git a/third_party/blink/renderer/core/css/style_engine_test.cc b/third_party/blink/renderer/core/css/style_engine_test.cc index cc73e3f..497874c7 100644 --- a/third_party/blink/renderer/core/css/style_engine_test.cc +++ b/third_party/blink/renderer/core/css/style_engine_test.cc
@@ -2206,58 +2206,6 @@ EXPECT_EQ(2u, stats->rules_fast_rejected); } -TEST_F(StyleEngineTest, MarkForWhitespaceReattachment) { - GetDocument().body()->setInnerHTML(R"HTML( - <div id=d1><span></span></div> - <div id=d2><span></span><span></span></div> - <div id=d3><span></span><span></span></div> - )HTML"); - - Element* d1 = GetDocument().getElementById("d1"); - Element* d2 = GetDocument().getElementById("d2"); - Element* d3 = GetDocument().getElementById("d3"); - - UpdateAllLifecyclePhases(); - - d1->firstChild()->remove(); - EXPECT_TRUE(GetStyleEngine().NeedsWhitespaceReattachment(d1)); - EXPECT_FALSE(GetDocument().ChildNeedsStyleInvalidation()); - EXPECT_FALSE(GetDocument().ChildNeedsStyleRecalc()); - EXPECT_FALSE(GetStyleEngine().NeedsLayoutTreeRebuild()); - - GetDocument().Lifecycle().AdvanceTo(DocumentLifecycle::kInStyleRecalc); - GetStyleEngine().MarkForWhitespaceReattachment(); - GetDocument().Lifecycle().AdvanceTo(DocumentLifecycle::kStyleClean); - EXPECT_FALSE(GetStyleEngine().NeedsLayoutTreeRebuild()); - - UpdateAllLifecyclePhases(); - - d2->firstChild()->remove(); - d2->firstChild()->remove(); - EXPECT_TRUE(GetStyleEngine().NeedsWhitespaceReattachment(d2)); - EXPECT_FALSE(GetDocument().ChildNeedsStyleInvalidation()); - EXPECT_FALSE(GetDocument().ChildNeedsStyleRecalc()); - EXPECT_FALSE(GetStyleEngine().NeedsLayoutTreeRebuild()); - - GetDocument().Lifecycle().AdvanceTo(DocumentLifecycle::kInStyleRecalc); - GetStyleEngine().MarkForWhitespaceReattachment(); - GetDocument().Lifecycle().AdvanceTo(DocumentLifecycle::kStyleClean); - EXPECT_FALSE(GetStyleEngine().NeedsLayoutTreeRebuild()); - - UpdateAllLifecyclePhases(); - - d3->firstChild()->remove(); - EXPECT_TRUE(GetStyleEngine().NeedsWhitespaceReattachment(d3)); - EXPECT_FALSE(GetDocument().ChildNeedsStyleInvalidation()); - EXPECT_FALSE(GetDocument().ChildNeedsStyleRecalc()); - EXPECT_FALSE(GetStyleEngine().NeedsLayoutTreeRebuild()); - - GetDocument().Lifecycle().AdvanceTo(DocumentLifecycle::kInStyleRecalc); - GetStyleEngine().MarkForWhitespaceReattachment(); - GetDocument().Lifecycle().AdvanceTo(DocumentLifecycle::kStyleClean); - EXPECT_TRUE(GetStyleEngine().NeedsLayoutTreeRebuild()); -} - TEST_F(StyleEngineTest, FirstLetterRemoved) { GetDocument().body()->setInnerHTML(R"HTML( <style>.fl::first-letter { color: pink }</style> @@ -2277,7 +2225,7 @@ GetDocument().getElementById("f1")->firstChild()->remove(); - EXPECT_FALSE(d1->firstChild()->ChildNeedsStyleRecalc()); + EXPECT_TRUE(d1->firstChild()->ChildNeedsStyleRecalc()); EXPECT_FALSE(d1->firstChild()->ChildNeedsReattachLayoutTree()); EXPECT_FALSE(d1->firstChild()->NeedsReattachLayoutTree()); EXPECT_TRUE(d1->ChildNeedsStyleRecalc()); @@ -2293,7 +2241,7 @@ GetDocument().getElementById("f2")->firstChild()->remove(); - EXPECT_FALSE(d2->firstChild()->ChildNeedsStyleRecalc()); + EXPECT_TRUE(d2->firstChild()->ChildNeedsStyleRecalc()); EXPECT_FALSE(d2->firstChild()->ChildNeedsReattachLayoutTree()); EXPECT_FALSE(d2->firstChild()->NeedsReattachLayoutTree()); EXPECT_TRUE(d2->ChildNeedsStyleRecalc()); @@ -2310,7 +2258,7 @@ Element* f3 = GetDocument().getElementById("f3"); f3->firstChild()->remove(); - EXPECT_FALSE(d3->firstChild()->ChildNeedsStyleRecalc()); + EXPECT_TRUE(d3->firstChild()->ChildNeedsStyleRecalc()); EXPECT_FALSE(d3->firstChild()->ChildNeedsReattachLayoutTree()); EXPECT_FALSE(d3->firstChild()->NeedsReattachLayoutTree()); EXPECT_TRUE(d3->ChildNeedsStyleRecalc()); @@ -2735,8 +2683,10 @@ TEST_F(StyleEngineTest, MoveSlottedOutsideFlatTree) { GetDocument().body()->setInnerHTML(R"HTML( - <div id="host1"><span></span></div> - <div id="host2"></div> + <div id="parent"> + <div id="host1"><span></span></div> + <div id="host2"></div> + </div> )HTML"); auto* host1 = GetDocument().getElementById("host1"); @@ -2751,10 +2701,11 @@ UpdateAllLifecyclePhases(); host2->appendChild(span); - EXPECT_FALSE(GetStyleRecalcRoot()); + EXPECT_EQ(GetStyleRecalcRoot(), host1); + EXPECT_FALSE(span->IsDirtyForStyleRecalc()); span->remove(); - EXPECT_FALSE(GetStyleRecalcRoot()); + EXPECT_EQ(GetStyleRecalcRoot(), host1); } TEST_F(StyleEngineTest, StyleRecalcRootInShadowTree) { @@ -3989,8 +3940,8 @@ GetDocument().body()->appendChild(slotted); host->remove(); auto* recalc_root = GetStyleRecalcRoot(); - ASSERT_TRUE(recalc_root); - EXPECT_TRUE(recalc_root->NeedsStyleRecalc()); + EXPECT_EQ(recalc_root, &GetDocument()); + EXPECT_TRUE(GetDocument().documentElement()->ChildNeedsStyleRecalc()); } TEST_F(StyleEngineTest, AtCounterStyleUseCounter) {
diff --git a/third_party/blink/renderer/core/css/style_recalc.cc b/third_party/blink/renderer/core/css/style_recalc.cc index d5ebf9c..41e3ffd7 100644 --- a/third_party/blink/renderer/core/css/style_recalc.cc +++ b/third_party/blink/renderer/core/css/style_recalc.cc
@@ -20,8 +20,13 @@ } bool StyleRecalcChange::TraverseChild(const Node& node) const { - return ShouldRecalcStyleFor(node) || node.ChildNeedsStyleRecalc() || - node.GetForceReattachLayoutTree() || RecalcContainerQueryDependent(); + if (ShouldRecalcStyleFor(node) || node.ChildNeedsStyleRecalc() || + node.GetForceReattachLayoutTree() || RecalcContainerQueryDependent()) { + return true; + } + if (LayoutObject* layout_object = node.GetLayoutObject()) + return layout_object->WhitespaceChildrenMayChange(); + return false; } bool StyleRecalcChange::ShouldRecalcStyleFor(const Node& node) const {
diff --git a/third_party/blink/renderer/core/css/style_recalc_root.cc b/third_party/blink/renderer/core/css/style_recalc_root.cc index 9ff9130..a335081 100644 --- a/third_party/blink/renderer/core/css/style_recalc_root.cc +++ b/third_party/blink/renderer/core/css/style_recalc_root.cc
@@ -8,6 +8,7 @@ #include "third_party/blink/renderer/core/dom/shadow_root.h" #include "third_party/blink/renderer/core/dom/slot_assignment.h" #include "third_party/blink/renderer/core/html/html_slot_element.h" +#include "third_party/blink/renderer/core/layout/layout_object.h" namespace blink {
diff --git a/third_party/blink/renderer/core/css/style_traversal_root.cc b/third_party/blink/renderer/core/css/style_traversal_root.cc index eb7a5d8..d61c50c 100644 --- a/third_party/blink/renderer/core/css/style_traversal_root.cc +++ b/third_party/blink/renderer/core/css/style_traversal_root.cc
@@ -31,6 +31,7 @@ (!root_node_ && root_type_ == RootType::kSingleRoot)); } root_node_ = dirty_node; + AssertRootNodeInvariants(); return; }
diff --git a/third_party/blink/renderer/core/css/style_traversal_root_test.cc b/third_party/blink/renderer/core/css/style_traversal_root_test.cc index 538b03e..db74803 100644 --- a/third_party/blink/renderer/core/css/style_traversal_root_test.cc +++ b/third_party/blink/renderer/core/css/style_traversal_root_test.cc
@@ -105,7 +105,7 @@ TEST_F(StyleTraversalRootTest, Update_CommonRoot) { StyleTraversalRootTestImpl root; - root.MarkDirty(DivElement(kC)); + root.MarkDirty(DivElement(kB)); // Initially make B a single root. root.Update(nullptr, DivElement(kB)); @@ -113,7 +113,7 @@ EXPECT_TRUE(root.IsSingleRoot()); // Adding C makes A a common root. - root.MarkDirty(DivElement(kB)); + root.MarkDirty(DivElement(kC)); root.Update(DivElement(kA), DivElement(kC)); EXPECT_EQ(DivElement(kA), root.GetRootNode()); EXPECT_FALSE(root.IsSingleRoot());
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context.cc b/third_party/blink/renderer/core/display_lock/display_lock_context.cc index a6207c2..dc5a8e1 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_context.cc +++ b/third_party/blink/renderer/core/display_lock/display_lock_context.cc
@@ -369,7 +369,6 @@ if (element_->ChildNeedsReattachLayoutTree()) element_->MarkAncestorsWithChildNeedsReattachLayoutTree(); blocked_style_traversal_type_ = kStyleUpdateNotRequired; - MarkElementsForWhitespaceReattachment(); } bool DisplayLockContext::ShouldLayoutChildren() const { @@ -582,22 +581,6 @@ MarkNeedsCullRectUpdate(); } -void DisplayLockContext::AddToWhitespaceReattachSet(Element& element) { - whitespace_reattach_set_.insert(&element); -} - -void DisplayLockContext::MarkElementsForWhitespaceReattachment() { - for (auto element : whitespace_reattach_set_) { - if (!element || element->NeedsReattachLayoutTree() || - !element->GetLayoutObject()) - continue; - - if (Node* first_child = LayoutTreeBuilderTraversal::FirstChild(*element)) - first_child->MarkAncestorsWithChildNeedsReattachLayoutTree(); - } - whitespace_reattach_set_.clear(); -} - StyleRecalcChange DisplayLockContext::AdjustStyleRecalcChangeForChildren( StyleRecalcChange change) { // This code is similar to MarkForStyleRecalcIfNeeded, except that it acts on @@ -1158,7 +1141,6 @@ void DisplayLockContext::Trace(Visitor* visitor) const { visitor->Trace(element_); visitor->Trace(document_); - visitor->Trace(whitespace_reattach_set_); } void DisplayLockContext::SetShouldUnlockAutoForPrint(bool flag) {
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context.h b/third_party/blink/renderer/core/display_lock/display_lock_context.h index 85cda95..18df750 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_context.h +++ b/third_party/blink/renderer/core/display_lock/display_lock_context.h
@@ -132,8 +132,6 @@ // right document's view. void DidMoveToNewDocument(Document& old_document); - void AddToWhitespaceReattachSet(Element& element); - // LifecycleNotificationObserver overrides. void WillStartLifecycleUpdate(const LocalFrameView&) override; @@ -260,10 +258,6 @@ // Clear the activated flag. void ResetActivation(); - // Marks ancestors of elements in |whitespace_reattach_set_| with - // ChildNeedsReattachLayoutTree and clears the set. - void MarkElementsForWhitespaceReattachment(); - // The following functions propagate dirty bits from the locked element up to // the ancestors in order to be reached, and update dirty bits for the element // as well if needed. They return true if the element or its subtree were @@ -348,15 +342,6 @@ WeakMember<Document> document_; EContentVisibility state_ = EContentVisibility::kVisible; - // See StyleEngine's |whitespace_reattach_set_|. - // Set of elements that had at least one rendered children removed - // since its last lifecycle update. For such elements that are located - // in a locked subtree, we save it here instead of the global set in - // StyleEngine because we don't want to accidentally mark elements - // in a locked subtree for layout tree reattachment before we did - // style recalc on them. - HeapHashSet<Member<Element>> whitespace_reattach_set_; - // If non-zero, then the update has been forced. int update_forced_ = 0;
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc b/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc index b85e1d23..d2a517e 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc +++ b/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc
@@ -14,6 +14,7 @@ #include "mojo/public/cpp/bindings/receiver.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" #include "third_party/blink/renderer/core/css/style_change_reason.h" +#include "third_party/blink/renderer/core/css/style_engine.h" #include "third_party/blink/renderer/core/display_lock/display_lock_document_state.h" #include "third_party/blink/renderer/core/display_lock/display_lock_utilities.h" #include "third_party/blink/renderer/core/dom/dom_token_list.h" @@ -732,16 +733,16 @@ // Manually start commit, so that we can verify which dirty bits get // propagated. - UnlockImmediate(element->GetDisplayLockContext()); + CommitElement(*element, false); + EXPECT_TRUE(element->NeedsStyleRecalc()); EXPECT_TRUE(element->ChildNeedsStyleRecalc()); + EXPECT_TRUE(GetDocument().body()->ChildNeedsStyleRecalc()); EXPECT_FALSE(element->NeedsReattachLayoutTree()); EXPECT_FALSE(element->ChildNeedsReattachLayoutTree()); // Simulating style recalc happening, will mark for reattachment. GetDocument().Lifecycle().AdvanceTo(DocumentLifecycle::kInStyleRecalc); - element->ClearChildNeedsStyleRecalc(); - element->firstChild()->ClearNeedsStyleRecalc(); - element->GetDisplayLockContext()->DidStyleChildren(); + GetDocument().GetStyleEngine().RecalcStyle(); GetDocument().Lifecycle().AdvanceTo(DocumentLifecycle::kStyleClean); EXPECT_FALSE(element->ChildNeedsStyleRecalc());
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index aab5458d..cb3804c1 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc
@@ -1949,6 +1949,8 @@ DCHECK(!node.NeedsStyleInvalidation()); DCHECK(!node.ChildNeedsStyleInvalidation()); DCHECK(!node.GetForceReattachLayoutTree()); + DCHECK(!node.GetLayoutObject() || + !node.GetLayoutObject()->WhitespaceChildrenMayChange()); } static void AssertLayoutTreeUpdatedForPseudoElements(const Element& element) {
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index d3e45ea..b0df932 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -2829,8 +2829,6 @@ GetDocument().ActiveChainNodeDetached(*this); GetDocument().UserActionElements().DidDetach(*this); } - - GetDocument().GetStyleEngine().ClearNeedsWhitespaceReattachmentFor(this); } scoped_refptr<ComputedStyle> Element::StyleForLayoutObject( @@ -2937,6 +2935,16 @@ return; } + if (!child_change.ReattachLayoutTree()) { + LayoutObject* layout_object = GetLayoutObject(); + if (layout_object && layout_object->WhitespaceChildrenMayChange()) { + if (Node* first_child = LayoutTreeBuilderTraversal::FirstChild(*this)) + first_child->MarkAncestorsWithChildNeedsReattachLayoutTree(); + else + layout_object->SetWhitespaceChildrenMayChange(false); + } + } + StyleRecalcContext child_recalc_context = style_recalc_context; if (const ComputedStyle* style = GetComputedStyle()) { @@ -3228,10 +3236,13 @@ // layout tree siblings. WhitespaceAttacher local_attacher; WhitespaceAttacher* child_attacher; - if (GetLayoutObject() || !HasDisplayContentsStyle()) { + LayoutObject* layout_object = GetLayoutObject(); + if (layout_object || !HasDisplayContentsStyle()) { whitespace_attacher.DidVisitElement(this); - if (GetDocument().GetStyleEngine().NeedsWhitespaceReattachment(this)) + if (layout_object && layout_object->WhitespaceChildrenMayChange()) { + layout_object->SetWhitespaceChildrenMayChange(false); local_attacher.SetReattachAllWhitespaceNodes(); + } child_attacher = &local_attacher; } else { child_attacher = &whitespace_attacher;
diff --git a/third_party/blink/renderer/core/dom/node.cc b/third_party/blink/renderer/core/dom/node.cc index d2681307..fa53db17 100644 --- a/third_party/blink/renderer/core/dom/node.cc +++ b/third_party/blink/renderer/core/dom/node.cc
@@ -1044,6 +1044,8 @@ HasRareData() ? DataAsNodeRareData()->GetNodeRenderingData() : DataAsNodeRenderingData(); + DCHECK(!layout_object || layout_object->GetNode() == this); + // Already pointing to a non empty NodeRenderingData so just set the pointer // to the new LayoutObject. if (!node_layout_data->IsSharedEmptyData()) { @@ -1248,6 +1250,7 @@ ancestor->SetChildNeedsStyleRecalc(); if (ancestor->IsDirtyForStyleRecalc()) break; + // If we reach a locked ancestor, we should abort since the ancestor marking // will be done when the lock is committed. if (RuntimeEnabledFeatures::CSSContentVisibilityEnabled()) { @@ -1660,6 +1663,12 @@ } } +bool Node::WhitespaceChildrenMayChange() const { + if (const auto* layout_object = GetLayoutObject()) + return layout_object->WhitespaceChildrenMayChange(); + return false; +} + // FIXME: Shouldn't these functions be in the editing code? Code that asks // questions about HTML in the core DOM class is obviously misplaced. bool Node::CanStartSelection() const {
diff --git a/third_party/blink/renderer/core/dom/node.h b/third_party/blink/renderer/core/dom/node.h index ab0a31b..d032460 100644 --- a/third_party/blink/renderer/core/dom/node.h +++ b/third_party/blink/renderer/core/dom/node.h
@@ -535,8 +535,10 @@ return GetFlag(kForceReattachLayoutTree); } + bool WhitespaceChildrenMayChange() const; bool IsDirtyForStyleRecalc() const { - return NeedsStyleRecalc() || GetForceReattachLayoutTree(); + return NeedsStyleRecalc() || GetForceReattachLayoutTree() || + WhitespaceChildrenMayChange(); } // True if the style invalidation process should traverse this node's children
diff --git a/third_party/blink/renderer/core/dom/node_test.cc b/third_party/blink/renderer/core/dom/node_test.cc index 7dd1960..22ff473 100644 --- a/third_party/blink/renderer/core/dom/node_test.cc +++ b/third_party/blink/renderer/core/dom/node_test.cc
@@ -433,10 +433,10 @@ // root and the child-dirty bits on the ancestors. span->remove(); - EXPECT_FALSE(slot->ChildNeedsStyleRecalc()); - EXPECT_FALSE(host->ChildNeedsStyleRecalc()); - EXPECT_FALSE(GetDocument().body()->ChildNeedsStyleRecalc()); - EXPECT_FALSE(GetDocument().GetStyleEngine().NeedsStyleRecalc()); + EXPECT_TRUE(slot->ChildNeedsStyleRecalc()); + EXPECT_TRUE(host->ChildNeedsStyleRecalc()); + EXPECT_TRUE(GetDocument().body()->ChildNeedsStyleRecalc()); + EXPECT_TRUE(GetDocument().GetStyleEngine().NeedsStyleRecalc()); } TEST_F(NodeTest, UpdateChildDirtyAfterSlotRemoval) {
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc index 16c679b..a9c4d4e 100644 --- a/third_party/blink/renderer/core/frame/local_frame.cc +++ b/third_party/blink/renderer/core/frame/local_frame.cc
@@ -2950,6 +2950,7 @@ params->suggested_name = *request.GetSuggestedFilename(); params->cross_origin_redirects = cross_origin_redirect_behavior; params->blob_url_token = std::move(blob_url_token); + params->has_user_gesture = request.HasUserGesture(); GetLocalFrameHostRemote().DownloadURL(std::move(params)); }
diff --git a/third_party/blink/renderer/core/html/html_anchor_element.cc b/third_party/blink/renderer/core/html/html_anchor_element.cc index 0f981ebd..07e67ae 100644 --- a/third_party/blink/renderer/core/html/html_anchor_element.cc +++ b/third_party/blink/renderer/core/html/html_anchor_element.cc
@@ -446,9 +446,11 @@ request.SetReferrerPolicy(policy); } - // Ignore the download attribute if we either can't read the content, or - // the event is an alt-click or similar. LocalFrame* frame = window->GetFrame(); + request.SetHasUserGesture(LocalFrame::HasTransientUserActivation(frame)); + + // Respect the download attribute only if we can read the content, and the + // event is not an alt-click or similar. if (FastHasAttribute(html_names::kDownloadAttr) && NavigationPolicyFromEvent(&event) != kNavigationPolicyDownload && window->GetSecurityOrigin()->CanReadContent(completed_url)) { @@ -471,7 +473,6 @@ } request.SetRequestContext(mojom::blink::RequestContextType::HYPERLINK); - request.SetHasUserGesture(LocalFrame::HasTransientUserActivation(frame)); const AtomicString& target = GetEffectiveTarget(); FrameLoadRequest frame_request(window, request); frame_request.SetNavigationPolicy(NavigationPolicyFromEvent(&event));
diff --git a/third_party/blink/renderer/core/layout/layout_object.h b/third_party/blink/renderer/core/layout/layout_object.h index e4cbefe..25db76c8 100644 --- a/third_party/blink/renderer/core/layout/layout_object.h +++ b/third_party/blink/renderer/core/layout/layout_object.h
@@ -1380,6 +1380,10 @@ NOT_DESTROYED(); return GetNode() ? GetNode()->GetLayoutObject() : this; } + LayoutObject* ContinuationRoot() { + NOT_DESTROYED(); + return GetNode() ? GetNode()->GetLayoutObject() : this; + } bool IsElementContinuation() const { NOT_DESTROYED(); return GetNode() && GetNode()->GetLayoutObject() != this; @@ -2141,6 +2145,14 @@ NOT_DESTROYED(); bitfields_.SetIsHTMLLegendElement(true); } + void SetWhitespaceChildrenMayChange(bool b) { + NOT_DESTROYED(); + bitfields_.SetWhitespaceChildrenMayChange(b); + } + bool WhitespaceChildrenMayChange() const { + NOT_DESTROYED(); + return bitfields_.WhitespaceChildrenMayChange(); + } virtual void Paint(const PaintInfo&) const; @@ -3901,6 +3913,7 @@ false), might_traverse_physical_fragments_(false), is_anonymous_ng_multicol_inline_wrapper_(false), + whitespace_children_may_change_(false), positioned_state_(kIsStaticallyPositioned), selection_state_(static_cast<unsigned>(SelectionState::kNone)), subtree_paint_property_update_reasons_( @@ -4241,6 +4254,12 @@ ADD_BOOLEAN_BITFIELD(is_anonymous_ng_multicol_inline_wrapper_, IsAnonymousNGMulticolInlineWrapper); + // True if children that may affect whitespace have been removed. If true + // during style recalc, mark ancestors for layout tree rebuild to cause a + // re-evaluation of whitespace children. + ADD_BOOLEAN_BITFIELD(whitespace_children_may_change_, + WhitespaceChildrenMayChange); + private: // This is the cached 'position' value of this object // (see ComputedStyle::position).
diff --git a/third_party/blink/renderer/core/page/print_context.cc b/third_party/blink/renderer/core/page/print_context.cc index c8c66eeef..fdc48c7 100644 --- a/third_party/blink/renderer/core/page/print_context.cc +++ b/third_party/blink/renderer/core/page/print_context.cc
@@ -23,6 +23,7 @@ #include <utility> #include "third_party/blink/public/web/web_print_page_description.h" +#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h" #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h" #include "third_party/blink/renderer/core/frame/page_scale_constraints_set.h" @@ -271,8 +272,11 @@ return String::Number(style->LineHeight().Value()); if (!strcmp(property_name, "font-size")) return String::Number(style->GetFontDescription().ComputedPixelSize()); - if (!strcmp(property_name, "font-family")) - return style->GetFontDescription().Family().Family().GetString(); + if (!strcmp(property_name, "font-family")) { + return ComputedStyleUtils::ValueForFontFamily( + style->GetFontDescription().Family()) + ->CssText(); + } if (!strcmp(property_name, "size")) return String::Number(style->PageSize().Width()) + ' ' + String::Number(style->PageSize().Height());
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 46d8fd9..c0078d4 100644 --- a/third_party/blink/renderer/core/paint/compositing/compositing_test.cc +++ b/third_party/blink/renderer/core/paint/compositing/compositing_test.cc
@@ -2544,4 +2544,28 @@ EXPECT_TRUE(CcLayerByDOMElementId("animation")->DrawsContent()); } +TEST_P(CompositingSimTest, CompositorAnimationOfNonInvertibleTransform) { + InitializeWithHTML(R"HTML( + <!DOCTYPE html> + <style> + @keyframes anim { + 0% { transform: scale(0); } + 99% { transform: scale(0); } + 100% { transform: scale(1); } + } + #animation { + animation-name: anim; + animation-duration: 999s; + width: 100px; + height: 100px; + background: lightblue; + } + </style> + <div id="animation"></div> + )HTML"); + Compositor().BeginFrame(); + EXPECT_TRUE(CcLayerByDOMElementId("animation")); + EXPECT_TRUE(CcLayerByDOMElementId("animation")->DrawsContent()); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/paint/cull_rect_updater.cc b/third_party/blink/renderer/core/paint/cull_rect_updater.cc index 8b1778b7..e024453 100644 --- a/third_party/blink/renderer/core/paint/cull_rect_updater.cc +++ b/third_party/blink/renderer/core/paint/cull_rect_updater.cc
@@ -151,9 +151,9 @@ // <div id="stacked-child" style="position: relative"></div> // </div> // </div> - // If |child|'s contents cull rect changes, we need to update |stack-child|'s - // cull rect because it's clipped by |child|. The is done in the following - // order: + // If |child|'s contents cull rect changes, we need to update + // |stacked-child|'s cull rect because it's clipped by |child|. The is done in + // the following order: // UpdateForDescendants(|layer|) // UpdateRecursively(|child|) (in the following loop) // |stacked-child|->SetNeedsCullRectUpdate()
diff --git a/third_party/blink/renderer/core/paint/outline_painter.cc b/third_party/blink/renderer/core/paint/outline_painter.cc index 5b9ae40..bb1a6d1 100644 --- a/third_party/blink/renderer/core/paint/outline_painter.cc +++ b/third_party/blink/renderer/core/paint/outline_painter.cc
@@ -156,16 +156,15 @@ case SkPath::kMove_Verb: DCHECK(lines.IsEmpty()); break; - case SkPath::kLine_Verb: - if (points[0] != points[1]) { - Line new_line{points[0], points[1]}; - if (lines.IsEmpty() || !MergeLineIfPossible(lines.back(), new_line)) { - lines.push_back(new_line); - DCHECK(lines.size() == 1 || - lines.back().start == lines[lines.size() - 2].end); - } + case SkPath::kLine_Verb: { + Line new_line{points[0], points[1]}; + if (lines.IsEmpty() || !MergeLineIfPossible(lines.back(), new_line)) { + lines.push_back(new_line); + DCHECK(lines.size() == 1 || + lines.back().start == lines[lines.size() - 2].end); } break; + } case SkPath::kClose_Verb: { if (lines.size() >= 4u) { if (MergeLineIfPossible(lines.back(), lines.front())) { @@ -327,8 +326,8 @@ const SkPoint& p2, const SkPoint& p3) { if (p1.x() == p2.x()) { - DCHECK_NE(p1.y(), p2.y()); - DCHECK_NE(p2.x(), p3.x()); + if (p1.y() == p2.y() || p2.x() == p3.x()) + return FloatSize(); DCHECK_EQ(p2.y(), p3.y()); if (p1.y() < p2.y()) { return p2.x() < p3.x() ? concave_radii.BottomLeft() @@ -337,8 +336,8 @@ return p2.x() < p3.x() ? convex_radii.TopLeft() : concave_radii.TopRight(); } DCHECK_EQ(p1.y(), p2.y()); - DCHECK_EQ(p2.x(), p3.x()); - DCHECK_NE(p2.y(), p3.y()); + if (p2.x() != p3.x() || p2.y() == p3.y()) + return FloatSize(); if (p1.x() < p2.x()) { return p2.y() < p3.y() ? convex_radii.TopRight() : concave_radii.BottomRight();
diff --git a/third_party/blink/renderer/core/paint/paint_layer_painter.cc b/third_party/blink/renderer/core/paint/paint_layer_painter.cc index 193ca61..b263886 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_painter.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_painter.cc
@@ -98,8 +98,20 @@ return kFullyPainted; } - // If the transform can't be inverted, then don't paint anything. - if (paint_layer_.PaintsWithTransform(painting_info.GetGlobalPaintFlags()) && + // If the transform can't be inverted, don't paint anything. We still need + // to paint with CompositeAfterPaint if there are animations to ensure the + // animation can be setup to run on the compositor. + bool paint_non_invertible_transforms = false; + if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { + const auto* properties = + paint_layer_.GetLayoutObject().FirstFragment().PaintProperties(); + if (properties && properties->Transform() && + properties->Transform()->HasActiveTransformAnimation()) { + paint_non_invertible_transforms = true; + } + } + if (!paint_non_invertible_transforms && + paint_layer_.PaintsWithTransform(painting_info.GetGlobalPaintFlags()) && !paint_layer_.RenderableTransform(painting_info.GetGlobalPaintFlags()) .IsInvertible()) { return kFullyPainted; @@ -228,6 +240,14 @@ return true; } + // Ensure content under animating transforms is not culled out, even if + // the initial matrix is non-invertible. + if (transform->HasActiveTransformAnimation() && + !transform->IsIdentityOr2DTranslation() && + !transform->Matrix().IsInvertible()) { + return true; + } + // As an optimization, skip cull rect updating for non-composited // transforms which have already been painted. This is because the cull // rect update, which needs to do complex mapping of the cull rect, can
diff --git a/third_party/blink/renderer/core/script/script_runner.h b/third_party/blink/renderer/core/script/script_runner.h index 509fa7d..1f14883b 100644 --- a/third_party/blink/renderer/core/script/script_runner.h +++ b/third_party/blink/renderer/core/script/script_runner.h
@@ -87,10 +87,11 @@ Member<Document> document_; + // https://html.spec.whatwg.org/#list-of-scripts-that-will-execute-in-order-as-soon-as-possible HeapDeque<Member<PendingScript>> pending_in_order_scripts_; + // https://html.spec.whatwg.org/#set-of-scripts-that-will-execute-as-soon-as-possible HeapHashSet<Member<PendingScript>> pending_async_scripts_; - // http://www.whatwg.org/specs/web-apps/current-work/#set-of-scripts-that-will-execute-as-soon-as-possible HeapDeque<Member<PendingScript>> async_scripts_to_execute_soon_; HeapDeque<Member<PendingScript>> in_order_scripts_to_execute_soon_;
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc index fa3db49f..0f1365f 100644 --- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc +++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc
@@ -45,6 +45,7 @@ #include "third_party/blink/renderer/core/css/css_font_selector.h" #include "third_party/blink/renderer/core/css/css_property_names.h" #include "third_party/blink/renderer/core/css/css_property_value_set.h" +#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h" #include "third_party/blink/renderer/core/css/resolver/style_resolver.h" #include "third_party/blink/renderer/core/css/style_engine.h" #include "third_party/blink/renderer/core/dom/events/event.h" @@ -462,25 +463,11 @@ serialized_font.Append("small-caps "); serialized_font.AppendNumber(font_description.ComputedSize()); - serialized_font.Append("px"); + serialized_font.Append("px "); - const FontFamily& first_font_family = font_description.Family(); - for (const FontFamily* font_family = &first_font_family; font_family; - font_family = font_family->Next()) { - if (font_family != &first_font_family) - serialized_font.Append(','); - - // FIXME: We should append family directly to serializedFont rather than - // building a temporary string. - String family = font_family->Family(); - if (family.StartsWith("-webkit-")) - family = family.Substring(8); - if (family.Contains(' ')) - family = "\"" + family + "\""; - - serialized_font.Append(' '); - serialized_font.Append(family); - } + serialized_font.Append( + ComputedStyleUtils::ValueForFontFamily(font_description.Family()) + ->CssText()); return serialized_font.ToString(); }
diff --git a/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.cc index 2af7de9..3bf0dad 100644 --- a/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.cc +++ b/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.cc
@@ -10,6 +10,7 @@ #include "third_party/blink/renderer/bindings/modules/v8/v8_union_gpucanvascontext_imagebitmaprenderingcontext_offscreencanvasrenderingcontext2d_webgl2renderingcontext_webglrenderingcontext.h" #include "third_party/blink/renderer/core/css/offscreen_font_selector.h" #include "third_party/blink/renderer/core/css/parser/css_parser.h" +#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h" #include "third_party/blink/renderer/core/css/resolver/font_style_resolver.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" @@ -380,25 +381,11 @@ serialized_font.Append("small-caps "); serialized_font.AppendNumber(font_description.ComputedPixelSize()); - serialized_font.Append("px"); + serialized_font.Append("px "); - const FontFamily& first_font_family = font_description.Family(); - for (const FontFamily* font_family = &first_font_family; font_family; - font_family = font_family->Next()) { - if (font_family != &first_font_family) - serialized_font.Append(','); - - // FIXME: We should append family directly to serializedFont rather than - // building a temporary string. - String family = font_family->Family(); - if (family.StartsWith("-webkit-")) - family = family.Substring(8); - if (family.Contains(' ')) - family = "\"" + family + "\""; - - serialized_font.Append(' '); - serialized_font.Append(family); - } + serialized_font.Append( + ComputedStyleUtils::ValueForFontFamily(font_description.Family()) + ->CssText()); return serialized_font.ToString(); }
diff --git a/third_party/blink/renderer/modules/payments/payment_request.cc b/third_party/blink/renderer/modules/payments/payment_request.cc index 6ac4370..424a897 100644 --- a/third_party/blink/renderer/modules/payments/payment_request.cc +++ b/third_party/blink/renderer/modules/payments/payment_request.cc
@@ -842,8 +842,7 @@ MakeGarbageCollected<ConsoleMessage>( mojom::blink::ConsoleMessageSource::kJavaScript, mojom::blink::ConsoleMessageLevel::kWarning, message)); - exception_state.ThrowDOMException(DOMExceptionCode::kNotAllowedError, - message); + exception_state.ThrowSecurityError(message); return ScriptPromise(); } LocalFrame::ConsumeTransientUserActivation(local_frame);
diff --git a/third_party/blink/renderer/modules/payments/payment_request_test.cc b/third_party/blink/renderer/modules/payments/payment_request_test.cc index 7caa7ab..e3bd3db 100644 --- a/third_party/blink/renderer/modules/payments/payment_request_test.cc +++ b/third_party/blink/renderer/modules/payments/payment_request_test.cc
@@ -319,7 +319,7 @@ WebFeature::kPaymentRequestShowWithoutGestureOrToken)); request->show(scope.GetScriptState(), scope.GetExceptionState()); EXPECT_EQ(scope.GetExceptionState().Code(), - ToExceptionCode(DOMExceptionCode::kNotAllowedError)); + ToExceptionCode(DOMExceptionCode::kSecurityError)); EXPECT_TRUE(scope.GetDocument().IsUseCounted( WebFeature::kPaymentRequestShowWithoutGestureOrToken)); }
diff --git a/third_party/blink/renderer/modules/webcodecs/BUILD.gn b/third_party/blink/renderer/modules/webcodecs/BUILD.gn index 304465f..d5fcecee 100644 --- a/third_party/blink/renderer/modules/webcodecs/BUILD.gn +++ b/third_party/blink/renderer/modules/webcodecs/BUILD.gn
@@ -55,6 +55,8 @@ "image_track_list.h", "parsed_copy_to_options.cc", "parsed_copy_to_options.h", + "reclaimable_codec.cc", + "reclaimable_codec.h", "video_color_space.cc", "video_color_space.h", "video_decoder.cc",
diff --git a/third_party/blink/renderer/modules/webcodecs/audio_encoder.cc b/third_party/blink/renderer/modules/webcodecs/audio_encoder.cc index 236d2738..1accc82 100644 --- a/third_party/blink/renderer/modules/webcodecs/audio_encoder.cc +++ b/third_party/blink/renderer/modules/webcodecs/audio_encoder.cc
@@ -313,6 +313,8 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + MarkCodecActive(); + auto buffer = media::DecoderBuffer::FromArray( std::move(encoded_buffer.encoded_data), encoded_buffer.encoded_data_size); buffer->set_timestamp(encoded_buffer.timestamp - base::TimeTicks());
diff --git a/third_party/blink/renderer/modules/webcodecs/codec_trace_names.h b/third_party/blink/renderer/modules/webcodecs/codec_trace_names.h index 7827b050..37c5b9b3 100644 --- a/third_party/blink/renderer/modules/webcodecs/codec_trace_names.h +++ b/third_party/blink/renderer/modules/webcodecs/codec_trace_names.h
@@ -19,6 +19,7 @@ flush = codec_name + "::Flush"; handle_error = codec_name + "::HandleError"; output = codec_name + "::Ouput"; + reset = codec_name + "::OnCodecReclaimed"; reset = codec_name + "::Reset"; reconfigure = codec_name + "::Reconfigure"; requests_counter = codec_name + " requests"; @@ -37,6 +38,7 @@ std::string flush; std::string handle_error; std::string output; + std::string reclaimed; std::string reset; std::string reconfigure; std::string requests_counter;
diff --git a/third_party/blink/renderer/modules/webcodecs/decoder_template.cc b/third_party/blink/renderer/modules/webcodecs/decoder_template.cc index 436c1f2..fbb40f4a6 100644 --- a/third_party/blink/renderer/modules/webcodecs/decoder_template.cc +++ b/third_party/blink/renderer/modules/webcodecs/decoder_template.cc
@@ -148,6 +148,8 @@ break; } + MarkCodecActive(); + state_ = V8CodecState(V8CodecState::Enum::kConfigured); require_key_frame_ = true; @@ -190,6 +192,8 @@ } } + MarkCodecActive(); + requests_.push_back(request); ++num_pending_decodes_; ProcessRequests(); @@ -204,6 +208,8 @@ if (ThrowIfCodecStateUnconfigured(state_, "flush", exception_state)) return ScriptPromise(); + MarkCodecActive(); + require_key_frame_ = true; Request* request = MakeGarbageCollected<Request>(); @@ -223,6 +229,8 @@ if (ThrowIfCodecStateClosed(state_, "reset", exception_state)) return; + MarkCodecActive(); + ResetAlgorithm(); } @@ -701,6 +709,8 @@ output_cb_->InvokeAndReportException(nullptr, blink_output); TRACE_EVENT_END0(kCategory, GetTraceNames()->output.c_str()); + + MarkCodecActive(); } template <typename Traits> @@ -727,6 +737,13 @@ visitor->Trace(pending_decodes_); ScriptWrappable::Trace(visitor); ExecutionContextLifecycleObserver::Trace(visitor); + ReclaimableCodec::Trace(visitor); +} + +template <typename Traits> +void DecoderTemplate<Traits>::OnCodecReclaimed(DOMException* exception) { + TRACE_EVENT0(kCategory, GetTraceNames()->reclaimed.c_str()); + Shutdown(exception); } template <typename Traits>
diff --git a/third_party/blink/renderer/modules/webcodecs/decoder_template.h b/third_party/blink/renderer/modules/webcodecs/decoder_template.h index 8df408d..bc186b6 100644 --- a/third_party/blink/renderer/modules/webcodecs/decoder_template.h +++ b/third_party/blink/renderer/modules/webcodecs/decoder_template.h
@@ -22,6 +22,7 @@ #include "third_party/blink/renderer/modules/webcodecs/codec_logger.h" #include "third_party/blink/renderer/modules/webcodecs/codec_trace_names.h" #include "third_party/blink/renderer/modules/webcodecs/hardware_preference.h" +#include "third_party/blink/renderer/modules/webcodecs/reclaimable_codec.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/heap/heap.h" @@ -39,6 +40,7 @@ class MODULES_EXPORT DecoderTemplate : public ScriptWrappable, public ActiveScriptWrappable<DecoderTemplate<Traits>>, + public ReclaimableCodec, public ExecutionContextLifecycleObserver { public: typedef typename Traits::ConfigType ConfigType; @@ -177,6 +179,9 @@ // Helper function making it easier to check |state_|. bool IsClosed(); + // ReclaimableCodec implementation. + void OnCodecReclaimed(DOMException*) override; + void TraceQueueSizes() const; Member<ScriptState> script_state_;
diff --git a/third_party/blink/renderer/modules/webcodecs/encoder_base.cc b/third_party/blink/renderer/modules/webcodecs/encoder_base.cc index 4113fde..e160f594 100644 --- a/third_party/blink/renderer/modules/webcodecs/encoder_base.cc +++ b/third_party/blink/renderer/modules/webcodecs/encoder_base.cc
@@ -105,6 +105,8 @@ return; } + MarkCodecActive(); + Request* request = MakeGarbageCollected<Request>(); request->reset_count = reset_count_; if (media_encoder_ && active_config_ && @@ -145,6 +147,8 @@ return; } + MarkCodecActive(); + Request* request = MakeGarbageCollected<Request>(); request->reset_count = reset_count_; request->type = Request::Type::kEncode; @@ -178,6 +182,8 @@ if (ThrowIfCodecStateUnconfigured(state_, "flush", exception_state)) return ScriptPromise(); + MarkCodecActive(); + Request* request = MakeGarbageCollected<Request>(); request->resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state_); @@ -195,6 +201,8 @@ TRACE_EVENT0(kCategory, GetTraceNames()->reset.c_str()); + MarkCodecActive(); + state_ = V8CodecState(V8CodecState::Enum::kUnconfigured); ResetInternal(); media_encoder_.reset(); @@ -325,6 +333,12 @@ } template <typename Traits> +void EncoderBase<Traits>::OnCodecReclaimed(DOMException* exception) { + TRACE_EVENT0(kCategory, GetTraceNames()->reclaimed.c_str()); + HandleError(exception); +} + +template <typename Traits> void EncoderBase<Traits>::ContextDestroyed() { state_ = V8CodecState(V8CodecState::Enum::kClosed); logger_->Neuter(); @@ -352,6 +366,7 @@ visitor->Trace(requests_); ScriptWrappable::Trace(visitor); ExecutionContextLifecycleObserver::Trace(visitor); + ReclaimableCodec::Trace(visitor); } template <typename Traits>
diff --git a/third_party/blink/renderer/modules/webcodecs/encoder_base.h b/third_party/blink/renderer/modules/webcodecs/encoder_base.h index 53bbaf6..6970b9a 100644 --- a/third_party/blink/renderer/modules/webcodecs/encoder_base.h +++ b/third_party/blink/renderer/modules/webcodecs/encoder_base.h
@@ -16,6 +16,7 @@ #include "third_party/blink/renderer/modules/modules_export.h" #include "third_party/blink/renderer/modules/webcodecs/codec_logger.h" #include "third_party/blink/renderer/modules/webcodecs/codec_trace_names.h" +#include "third_party/blink/renderer/modules/webcodecs/reclaimable_codec.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" #include "third_party/blink/renderer/platform/context_lifecycle_observer.h" #include "third_party/blink/renderer/platform/heap/visitor.h" @@ -29,6 +30,7 @@ class MODULES_EXPORT EncoderBase : public ScriptWrappable, public ActiveScriptWrappable<EncoderBase<Traits>>, + public ReclaimableCodec, public ExecutionContextLifecycleObserver { public: using InitType = typename Traits::Init; @@ -124,6 +126,9 @@ ExceptionState&) = 0; virtual bool VerifyCodecSupport(InternalConfigType*, ExceptionState&) = 0; + // ReclaimableCodec implementation. + void OnCodecReclaimed(DOMException*) override; + void TraceQueueSizes() const; std::unique_ptr<CodecLogger> logger_;
diff --git a/third_party/blink/renderer/modules/webcodecs/reclaimable_codec.cc b/third_party/blink/renderer/modules/webcodecs/reclaimable_codec.cc new file mode 100644 index 0000000..3d39890 --- /dev/null +++ b/third_party/blink/renderer/modules/webcodecs/reclaimable_codec.cc
@@ -0,0 +1,55 @@ +// 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 "third_party/blink/renderer/modules/webcodecs/reclaimable_codec.h" + +#include "base/location.h" +#include "third_party/blink/renderer/core/dom/dom_exception.h" +#include "third_party/blink/renderer/platform/scheduler/public/thread.h" + +namespace blink { + +namespace { +constexpr base::TimeDelta kInactivityReclamationThreshold = + base::TimeDelta::FromMinutes(1); + +constexpr base::TimeDelta kTimerPeriod = base::TimeDelta::FromSeconds(30); +} // namespace + +ReclaimableCodec::ReclaimableCodec() + : last_activity_(base::TimeTicks::Now()), + activity_timer_(Thread::Current()->GetTaskRunner(), + this, + &ReclaimableCodec::ActivityTimerFired) { + activity_timer_.StartRepeating(kTimerPeriod, FROM_HERE); +} + +void ReclaimableCodec::MarkCodecActive() { + last_activity_ = base::TimeTicks::Now(); + last_tick_was_inactive_ = false; +} + +void ReclaimableCodec::ActivityTimerFired(TimerBase*) { + auto time_inactive = base::TimeTicks::Now() - last_activity_; + + bool is_inactive = time_inactive < kInactivityReclamationThreshold; + + // Do not immediately reclaim. Make sure the codec is inactive for 2 ticks. + // Otherwise, tabs that were suspended could see their codecs reclaimed + // immediately after being resumed. + if (is_inactive && last_tick_was_inactive_) { + activity_timer_.Stop(); + OnCodecReclaimed(MakeGarbageCollected<DOMException>( + DOMExceptionCode::kQuotaExceededError, + "Codec reclaimed due to inactivity.")); + } + + last_tick_was_inactive_ = is_inactive; +} + +void ReclaimableCodec::Trace(Visitor* visitor) const { + visitor->Trace(activity_timer_); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/modules/webcodecs/reclaimable_codec.h b/third_party/blink/renderer/modules/webcodecs/reclaimable_codec.h new file mode 100644 index 0000000..06fe299 --- /dev/null +++ b/third_party/blink/renderer/modules/webcodecs/reclaimable_codec.h
@@ -0,0 +1,43 @@ +// 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 THIRD_PARTY_BLINK_RENDERER_MODULES_WEBCODECS_RECLAIMABLE_CODEC_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBCODECS_RECLAIMABLE_CODEC_H_ + +#include "third_party/blink/renderer/modules/modules_export.h" +#include "third_party/blink/renderer/platform/heap/garbage_collected.h" +#include "third_party/blink/renderer/platform/timer.h" + +namespace blink { + +class DOMException; + +class MODULES_EXPORT ReclaimableCodec : public GarbageCollectedMixin { + public: + ReclaimableCodec(); + + // GarbageCollectedMixin override. + void Trace(Visitor*) const override; + + protected: + void MarkCodecActive(); + + virtual void OnCodecReclaimed(DOMException*) = 0; + + private: + void ActivityTimerFired(TimerBase*); + void StartTimer(); + + // This is used to make sure that there are two consecutive ticks of the + // timer, before we reclaim for inactivity. This prevents immediately + // reclaiming otherwise active codecs, right after a page suspended/resumed. + bool last_tick_was_inactive_ = false; + + base::TimeTicks last_activity_; + HeapTaskRunnerTimer<ReclaimableCodec> activity_timer_; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_WEBCODECS_AUDIO_DATA_H_
diff --git a/third_party/blink/renderer/modules/webcodecs/video_color_space.idl b/third_party/blink/renderer/modules/webcodecs/video_color_space.idl index c257ac1..b8cf016 100644 --- a/third_party/blink/renderer/modules/webcodecs/video_color_space.idl +++ b/third_party/blink/renderer/modules/webcodecs/video_color_space.idl
@@ -8,7 +8,7 @@ Exposed=(Window,DedicatedWorker), RuntimeEnabled=WebCodecs ] interface VideoColorSpace { - constructor(VideoColorSpaceInit init); + constructor(optional VideoColorSpaceInit init = {}); readonly attribute VideoColorPrimaries? primaries; readonly attribute VideoTransferCharacteristics? transfer;
diff --git a/third_party/blink/renderer/modules/webcodecs/video_encoder.cc b/third_party/blink/renderer/modules/webcodecs/video_encoder.cc index 7f1d26f3..30894b0 100644 --- a/third_party/blink/renderer/modules/webcodecs/video_encoder.cc +++ b/third_party/blink/renderer/modules/webcodecs/video_encoder.cc
@@ -804,6 +804,8 @@ return; } + MarkCodecActive(); + auto buffer = media::DecoderBuffer::FromArray(std::move(output.data), output.size); buffer->set_timestamp(output.timestamp);
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc index ae8ab88..fea3793 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc
@@ -84,6 +84,12 @@ if (!swapchain_) return nullptr; + // We need to have an active copy of the current texture when we call get + // image. + static constexpr gfx::Size kEmpty; + if (swapchain_->Size() == kEmpty && !swapchain_->getCurrentTexture()) + return nullptr; + CanvasResourceParams resource_params; resource_params.SetSkColorType(viz::ResourceFormatToClosestSkColorType( /*gpu_compositing=*/true, swapchain_->Format()));
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_swap_chain.cc b/third_party/blink/renderer/modules/webgpu/gpu_swap_chain.cc index 4bcc04d..06d4266 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_swap_chain.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_swap_chain.cc
@@ -141,9 +141,6 @@ if (!texture_) return false; - if (!(usage_ & WGPUTextureUsage_CopySrc)) - return false; - base::WeakPtr<WebGraphicsContext3DProviderWrapper> shared_context_wrapper = SharedGpuContext::ContextProviderWrapper(); if (!shared_context_wrapper || !shared_context_wrapper->ContextProvider()) @@ -195,8 +192,8 @@ .height = static_cast<uint32_t>(swap_buffers_->Size().height()), .depthOrArrayLayers = 1, }; - GetProcs().commandEncoderCopyTextureToTexture(command_encoder, &source, - &destination, ©_size); + GetProcs().commandEncoderCopyTextureToTextureInternal( + command_encoder, &source, &destination, ©_size); WGPUCommandBuffer command_buffer = GetProcs().commandEncoderFinish(command_encoder, nullptr);
diff --git a/third_party/blink/renderer/modules/webid/web_id.cc b/third_party/blink/renderer/modules/webid/web_id.cc index be1f270..5343b24 100644 --- a/third_party/blink/renderer/modules/webid/web_id.cc +++ b/third_party/blink/renderer/modules/webid/web_id.cc
@@ -154,8 +154,12 @@ String client_id = options->hasClientId() ? options->clientId() : ""; String nonce = options->hasNonce() ? options->nonce() : ""; + DCHECK(options->hasPreferAutoSignIn()); + bool prefer_auto_sign_in = options->preferAutoSignIn(); + auth_request_->RequestIdToken( provider, client_id, nonce, ToRequestMode(options->mode()), + prefer_auto_sign_in, WTF::Bind(&OnRequestIdToken, WrapPersistent(resolver))); return promise;
diff --git a/third_party/blink/renderer/modules/webid/web_id_request_options.idl b/third_party/blink/renderer/modules/webid/web_id_request_options.idl index 591aecf..eb747c7 100644 --- a/third_party/blink/renderer/modules/webid/web_id_request_options.idl +++ b/third_party/blink/renderer/modules/webid/web_id_request_options.idl
@@ -15,4 +15,5 @@ USVString client_id; USVString nonce; Mode mode = "permission"; + boolean preferAutoSignIn = false; };
diff --git a/third_party/blink/renderer/platform/fonts/android/font_unique_name_lookup_android.cc b/third_party/blink/renderer/platform/fonts/android/font_unique_name_lookup_android.cc index 5e96ce4..ae61e2d1 100644 --- a/third_party/blink/renderer/platform/fonts/android/font_unique_name_lookup_android.cc +++ b/third_party/blink/renderer/platform/fonts/android/font_unique_name_lookup_android.cc
@@ -6,6 +6,7 @@ #include "base/files/file.h" #include "base/logging.h" +#include "base/metrics/histogram_macros.h" #include "base/timer/elapsed_timer.h" #include "third_party/blink/public/common/font_unique_name_lookup/icu_fold_case_util.h" #include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h" @@ -134,6 +135,7 @@ bool FontUniqueNameLookupAndroid::RequestedNameInQueryableFonts( const String& font_unique_name) { if (!queryable_fonts_) { + SCOPED_UMA_HISTOGRAM_TIMER("Android.FontLookup.Blink.GetTableLatency"); Vector<String> retrieved_fonts; android_font_lookup_service_->GetUniqueNameLookupTable(&retrieved_fonts); queryable_fonts_ = std::move(retrieved_fonts);
diff --git a/third_party/blink/renderer/platform/graphics/paint/cull_rect.cc b/third_party/blink/renderer/platform/graphics/paint/cull_rect.cc index f8e1c8b9..549d69f 100644 --- a/third_party/blink/renderer/platform/graphics/paint/cull_rect.cc +++ b/third_party/blink/renderer/platform/graphics/paint/cull_rect.cc
@@ -261,9 +261,18 @@ DCHECK(last_transform->ScrollNode()); expansion_bounds.emplace(IntPoint(), last_transform->ScrollNode()->ContentsSize()); - // Map expansion_bounds into the same space as rect_. - GeometryMapper::SourceToDestinationRect( - *last_transform, destination.Transform(), *expansion_bounds); + if (last_transform != &destination.Transform() || + last_clip != &destination.Clip()) { + // Map expansion_bounds in the same way as we did for rect_ in the last + // ApplyPaintPropertiesWithoutExpansion(). + FloatClipRect clip_rect = GeometryMapper::LocalToAncestorClipRect( + destination, + PropertyTreeState(*last_transform, *last_clip, effect_root)); + if (!clip_rect.IsInfinite()) + expansion_bounds->Intersect(EnclosingIntRect(clip_rect.Rect())); + GeometryMapper::SourceToDestinationRect( + *last_transform, destination.Transform(), *expansion_bounds); + } expanded = true; }
diff --git a/third_party/blink/renderer/platform/graphics/paint/cull_rect_test.cc b/third_party/blink/renderer/platform/graphics/paint/cull_rect_test.cc index 964f3b78..3b081423 100644 --- a/third_party/blink/renderer/platform/graphics/paint/cull_rect_test.cc +++ b/third_party/blink/renderer/platform/graphics/paint/cull_rect_test.cc
@@ -756,13 +756,15 @@ cull_rect.ApplyPaintProperties( root, root, PropertyTreeState(*scroll_translation, *c2a, e0()), CullRect(IntRect(0, 310, 100, 100))); - EXPECT_EQ(IntRect(0, 310, 100, 100), cull_rect.Rect()); + // The new cull rect touches the left edge of the clipped expanded scrolling + // contents bounds, so the old cull rect is not used. + EXPECT_EQ(IntRect(0, 300, 100, 100), cull_rect.Rect()); // Composited case. The cull rect should be expanded. cull_rect = CullRect::Infinite(); cull_rect.ApplyPaintProperties(root, root, PropertyTreeState(*t2, *c2a, e0()), CullRect(IntRect(-3900, -3700, 8100, 8100))); - // The new cull rect touches the left edge of the expanded scrolling contents - // bounds, so the old cull rect is not used. + // The new cull rect touches the left edge of the clipped expanded scrolling + // contents bounds, so the old cull rect is not used. EXPECT_EQ(IntRect(-4000, -3700, 8100, 8100), cull_rect.Rect()); // c2b is out of the expansion area of the composited scroll.
diff --git a/third_party/blink/renderer/platform/image-decoders/image_decoder.cc b/third_party/blink/renderer/platform/image-decoders/image_decoder.cc index 1adfa9a..c4d4c1e 100644 --- a/third_party/blink/renderer/platform/image-decoders/image_decoder.cc +++ b/third_party/blink/renderer/platform/image-decoders/image_decoder.cc
@@ -333,8 +333,9 @@ return webp_features.has_animation ? CompressionFormat::kWebPAnimationFormat : static_cast<CompressionFormat>(webp_features.format); + } else if (status != VP8_STATUS_NOT_ENOUGH_DATA) { + return kUndefinedFormat; } - DCHECK_EQ(status, VP8_STATUS_NOT_ENOUGH_DATA); } else { NOTREACHED(); }
diff --git a/third_party/blink/renderer/platform/mediastream/media_stream_source.cc b/third_party/blink/renderer/platform/mediastream/media_stream_source.cc index bfe656c..b37a4b92 100644 --- a/third_party/blink/renderer/platform/mediastream/media_stream_source.cc +++ b/third_party/blink/renderer/platform/mediastream/media_stream_source.cc
@@ -172,27 +172,14 @@ // Observers may dispatch events which create and add new Observers; // take a snapshot so as to safely iterate. - HeapVector<Member<Observer>> observers; - CopyToVector(observers_, observers); - for (auto observer : observers) - observer->SourceChangedState(); - - // setReadyState() will be invoked via the MediaStreamComponent::dispose() - // prefinalizer, allocating |observers|. Which means that |observers| will - // live until the next GC (but be unreferenced by other heap objects), - // _but_ it will potentially contain references to Observers that were - // GCed after the MediaStreamComponent prefinalizer had completed. - // - // So, if the next GC is a conservative one _and_ it happens to find - // a reference to |observers| when scanning the stack, we're in trouble - // as it contains references to now-dead objects. - // - // Work around this by explicitly clearing the vector backing store. - // - // TODO(sof): consider adding run-time checks that disallows this kind - // of dead object revivification by default. - for (wtf_size_t i = 0; i < observers.size(); ++i) - observers[i] = nullptr; + Vector<base::OnceClosure> observer_callbacks; + for (auto it = observers_.begin(); it != observers_.end(); ++it) { + observer_callbacks.push_back( + base::BindOnce(&Observer::SourceChangedState, *it)); + } + for (auto& observer_callback : observer_callbacks) { + std::move(observer_callback).Run(); + } } }
diff --git a/third_party/blink/tools/blinkpy/tool/commands/queries.py b/third_party/blink/tools/blinkpy/tool/commands/queries.py index 671bde9f..6ebcee57 100644 --- a/third_party/blink/tools/blinkpy/tool/commands/queries.py +++ b/third_party/blink/tools/blinkpy/tool/commands/queries.py
@@ -125,7 +125,7 @@ port_names = [default_port.name()] if options.paths: - files = default_port.default_expectations_files() + files = default_port.expectations_files() web_tests_dir = default_port.web_tests_dir() for file in files: if file.startswith(web_tests_dir):
diff --git a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_unittest.py b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_unittest.py index dce73a624..81527eb 100644 --- a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_unittest.py +++ b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_unittest.py
@@ -129,7 +129,7 @@ def _zero_out_test_expectations(self): for port_name in self.tool.port_factory.all_port_names(): port = self.tool.port_factory.get(port_name) - for path in port.default_expectations_files(): + for path in port.expectations_files(): self._write(path, '') self.tool.filesystem.written_files = {}
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 84cf1ce..f240fbb8 100644 --- a/third_party/blink/tools/blinkpy/web_tests/port/base.py +++ b/third_party/blink/tools/blinkpy/web_tests/port/base.py
@@ -253,7 +253,6 @@ self._test_configuration = None self._results_directory = None self._virtual_test_suites = None - self._used_expectation_files = None def __str__(self): return 'Port{name=%s, version=%s, architecture=%s, test_configuration=%s}' % ( @@ -1678,29 +1677,24 @@ # updated to know about the ordered dict. expectations = collections.OrderedDict() - default_expectations_files = set(self.default_expectations_files()) - ignore_default = self.get_option('ignore_default_expectations', False) - for path in self.used_expectations_files(): - is_default = path in default_expectations_files - if ignore_default and is_default: - continue - path_exists = self._filesystem.exists(path) - if is_default: - if path_exists: + if not self.get_option('ignore_default_expectations', False): + for path in self.expectations_files(): + if self._filesystem.exists(path): expectations[path] = self._filesystem.read_text_file(path) + + for path in self.get_option('additional_expectations', []): + expanded_path = self._filesystem.expanduser(path) + if self._filesystem.exists(expanded_path): + _log.debug("reading additional_expectations from path '%s'", + path) + expectations[path] = self._filesystem.read_text_file( + expanded_path) else: - if path_exists: - _log.debug( - "reading additional_expectations from path '%s'", path) - expectations[path] = self._filesystem.read_text_file(path) - else: - # TODO(rmhasan): Fix additional expectation paths for - # not_site_per_process_blink_web_tests, then change this - # back to raising exceptions for incorrect expectation - # paths. - _log.warning( - "additional_expectations path '%s' does not exist", - path) + # TODO(rmhasan): Fix additional expectation paths for + # not_site_per_process_blink_web_tests, then change this back + # to raising exceptions for incorrect expectation paths. + _log.warning( + "additional_expectations path '%s' does not exist", path) return expectations def all_expectations_dict(self): @@ -1752,7 +1746,7 @@ _log.warning("Unexpected ignore mode: '%s'.", ignore_mode) return {} - def default_expectations_files(self): + def expectations_files(self): """Returns a list of paths to expectations files that apply by default. There are other "test expectations" files that may be applied if @@ -1765,21 +1759,10 @@ self._filesystem.join(self.web_tests_dir(), 'NeverFixTests'), self._filesystem.join(self.web_tests_dir(), 'StaleTestExpectations'), - self._filesystem.join(self.web_tests_dir(), 'SlowTests') + self._filesystem.join(self.web_tests_dir(), 'SlowTests'), + self._flag_specific_expectations_path() ]) - def used_expectations_files(self): - """Returns a list of paths to expectation files that are used.""" - if self._used_expectation_files is None: - self._used_expectation_files = self.default_expectations_files() - flag_specific = self._flag_specific_expectations_path() - if flag_specific: - self._used_expectation_files.append(flag_specific) - for path in self.get_option('additional_expectations', []): - expanded_path = self._filesystem.expanduser(path) - self._used_expectation_files.append(expanded_path) - return self._used_expectation_files - def extra_expectations_files(self): """Returns a list of paths to test expectations not loaded by default.
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 b41b076..12e6301 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
@@ -459,10 +459,8 @@ def test_nonexistant_expectations(self): port = self.make_port(port_name='foo') - port.default_expectations_files = lambda: [ - MOCK_WEB_TESTS + 'platform/exists/TestExpectations', MOCK_WEB_TESTS - + 'platform/nonexistant/TestExpectations' - ] + port.expectations_files = lambda: [MOCK_WEB_TESTS + 'platform/exists/TestExpectations', + MOCK_WEB_TESTS + 'platform/nonexistant/TestExpectations'] port.host.filesystem.write_text_file( MOCK_WEB_TESTS + 'platform/exists/TestExpectations', '') self.assertEqual('\n'.join(port.expectations_dict().keys()),
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/port_testcase.py b/third_party/blink/tools/blinkpy/web_tests/port/port_testcase.py index 0a49422..8fa80017 100644 --- a/third_party/blink/tools/blinkpy/web_tests/port/port_testcase.py +++ b/third_party/blink/tools/blinkpy/web_tests/port/port_testcase.py
@@ -309,9 +309,9 @@ b'STDERR: [1:2:3:4:FATAL:example.cc(567)] Check failed.\n') self.assertEqual(crash_site, 'example.cc(567)') - def test_default_expectations_files(self): + def test_expectations_files(self): port = self.make_port() - self.assertEqual(list(port.default_expectations_files()), [ + self.assertEqual(list(port.expectations_files()), [ port.path_to_generic_test_expectations_file(), port.path_to_webdriver_expectations_file(), port.host.filesystem.join(port.web_tests_dir(), 'NeverFixTests'), @@ -320,9 +320,9 @@ port.host.filesystem.join(port.web_tests_dir(), 'SlowTests'), ]) - def test_default_expectations_ordering(self): + def test_expectations_ordering(self): port = self.make_port() - for path in port.default_expectations_files(): + for path in port.expectations_files(): port.host.filesystem.write_text_file(path, '') ordered_dict = port.expectations_dict() self.assertEqual(port.path_to_generic_test_expectations_file(), @@ -331,7 +331,7 @@ options = optparse.Values( dict(additional_expectations=['/tmp/foo', '/tmp/bar'])) port = self.make_port(options=options) - for path in port.default_expectations_files(): + for path in port.expectations_files(): port.host.filesystem.write_text_file(path, '') port.host.filesystem.write_text_file('/tmp/foo', 'foo') port.host.filesystem.write_text_file('/tmp/bar', 'bar') @@ -340,24 +340,6 @@ list(ordered_dict)[-2:], options.additional_expectations) self.assertEqual(list(ordered_dict.values())[-2:], ['foo', 'bar']) - def test_used_expectations_files(self): - options = optparse.Values({ - 'additional_expectations': ['/tmp/foo'], - 'additional_driver_flag': ['flag-specific'] - }) - port = self.make_port(options=options) - self.assertEqual(list(port.used_expectations_files()), [ - port.path_to_generic_test_expectations_file(), - port.path_to_webdriver_expectations_file(), - port.host.filesystem.join(port.web_tests_dir(), 'NeverFixTests'), - port.host.filesystem.join(port.web_tests_dir(), - 'StaleTestExpectations'), - port.host.filesystem.join(port.web_tests_dir(), 'SlowTests'), - port.host.filesystem.join(port.web_tests_dir(), 'FlagExpectations', - 'flag-specific'), - '/tmp/foo', - ]) - def test_path_to_apache_config_file(self): # Specific behavior may vary by port, so unit test sub-classes may override this. port = self.make_port()
diff --git a/third_party/blink/web_tests/NeverFixTests b/third_party/blink/web_tests/NeverFixTests index 11ce8b0..a2e1d61 100644 --- a/third_party/blink/web_tests/NeverFixTests +++ b/third_party/blink/web_tests/NeverFixTests
@@ -1753,9 +1753,6 @@ # virtual test should be run. http/tests/devtools/wasm-isolated-code-cache/wasm-cache-test.js [ Skip ] virtual/wasm-site-isolated-code-cache/http/tests/devtools/wasm-isolated-code-cache/wasm-cache-test.js [ Pass ] -virtual/site-isolated-code-cache/http/tests/devtools/isolated-code-cache/cross-origin-test.js [ Pass ] -virtual/not-split-http-cache-not-site-per-process/http/tests/devtools/isolated-code-cache/cross-origin-test.js [ Pass ] -virtual/split-http-cache-not-site-per-process/http/tests/devtools/isolated-code-cache/cross-origin-test.js [ Pass ] # This test run under virtual suites only. crbug.com/981970 external/wpt/fetch/http-cache/split-cache.html [ Skip ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 2c25223..f15f444 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -5598,6 +5598,17 @@ crbug.com/1207342 http/tests/devtools/webaudio/audio-context-selector-test.js [ Failure Pass ] crbug.com/1207342 http/tests/devtools/isolated-code-cache/cross-origin-test.js [ Failure Pass ] crbug.com/1207342 http/tests/devtools/console/console-filter-test.js [ Failure Pass ] +crbug.com/1207342 http/tests/devtools/tabbed-pane-max-tab-width-calculation.js [ Failure Pass ] +crbug.com/1207342 http/tests/devtools/tabbed-pane-tabs-to-show.js [ Failure Pass ] +crbug.com/1207342 http/tests/devtools/components/split-widget.js [ Failure Pass ] +crbug.com/1207342 http/tests/devtools/components/widget-events.js [ Failure Pass ] +crbug.com/1207342 http/tests/devtools/components/widget-focus.js [ Failure Pass ] +crbug.com/1207342 http/tests/devtools/network/network-requestblocking-icon.js [ Failure Pass ] +crbug.com/1207342 http/tests/devtools/unit/list-control-equal-height.js [ Failure Pass ] +crbug.com/1207342 http/tests/devtools/unit/list-control-non-viewport.js [ Failure Pass ] +crbug.com/1207342 http/tests/devtools/unit/list-control-various-height.js [ Failure Pass ] +crbug.com/1207342 http/tests/devtools/unit/soft-context-menu.js [ Failure Pass ] +crbug.com/1207342 http/tests/devtools/unit/tabbed-pane.js [ Failure Pass ] # First party DevTools issues only work in the first-party-sets virtual suite crbug.com/1179186 http/tests/inspector-protocol/network/blocked-cookie-same-party-issue.js [ Skip ]
diff --git a/third_party/blink/web_tests/WebGPUExpectations b/third_party/blink/web_tests/WebGPUExpectations index 6c139b28..d338154 100644 --- a/third_party/blink/web_tests/WebGPUExpectations +++ b/third_party/blink/web_tests/WebGPUExpectations
@@ -236,9 +236,6 @@ crbug.com/dawn/812 wpt_internal/webgpu/cts.html?q=webgpu:api,validation,resource_usages,texture,in_pass_encoder:subresources_and_binding_types_combination_for_aspect:format="depth24plus-stencil8";aspect1="depth-only";type1="render-target";* [ Failure ] crbug.com/dawn/812 wpt_internal/webgpu/cts.html?q=webgpu:api,validation,resource_usages,texture,in_pass_encoder:subresources_and_binding_types_combination_for_aspect:format="depth24plus-stencil8";aspect1="stencil-only";type1="render-target";* [ Failure ] -# Failing new updated tests, about to remove shortly after -crbug.com/dawn/811 wpt_internal/webgpu/cts.html?q=webgpu:api,validation,createRenderPipeline:pipeline_output_targets,blend:* [ Failure ] - ### ### Mac (Metal) specific ###
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json index 66b04947..8ae0bd1 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -76789,6 +76789,32 @@ {} ] ], + "float-in-self-collapsing-block-000.html": [ + "e42d941e78ab45e9107ac49ee8c8c2b4c6d43c9d", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "float-in-self-collapsing-block-001.html": [ + "835a5be09a80c19b079b1aa71fddee8e450f9a20", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "float-inside-small-block.html": [ "2afd6dacc9c1f910be33a97677c0f5841fe5b035", [ @@ -112498,7 +112524,7 @@ ] ], "custom-highlight-painting-invalidation-001.html": [ - "909779d98a87e5a8030d941cc26956512ce72c2a", + "aef391ec0f3c749554bc2cf284b18ff78f8bc525", [ null, [ @@ -112511,7 +112537,7 @@ ] ], "custom-highlight-painting-invalidation-002.html": [ - "197b9a40a481d9abe1e50103739ba7b028328c3c", + "99271ff7a0ea2d15e0a4a6d7448cfbcc44d42486", [ null, [ @@ -112524,7 +112550,7 @@ ] ], "custom-highlight-painting-invalidation-003.html": [ - "a02d0503b5446d8c46bf7f784b65d94244ddcf2a", + "d1f87223887a4d38235212948d319c18e9e005e3", [ null, [ @@ -112537,7 +112563,7 @@ ] ], "custom-highlight-painting-invalidation-004.html": [ - "2b227432a9842131908ef65936f7994685ab3f4f", + "62f05a84abcb9a81ea7ec1fdcbcaad5e1ddf8a17", [ null, [ @@ -112550,7 +112576,7 @@ ] ], "custom-highlight-painting-invalidation-005.html": [ - "b22b7d7e746f1f3083cdce335ec758b51d3ad2ad", + "cabc4c3b9c00282ef632f40c7f4d7092abff9bd1", [ null, [ @@ -112563,7 +112589,7 @@ ] ], "custom-highlight-painting-invalidation-006.html": [ - "d773a015c4e625299540cd993838f0d2dc9deb28", + "81c2298e1322a103997982bda008c1679e91a033", [ null, [ @@ -112641,7 +112667,7 @@ ] ], "custom-highlight-painting-staticrange-004.html": [ - "fa3d7ce373878fcfac3981c7f82b81bd0f09bc4d", + "14e9766a981afe6ce2efa368eb2fbb5ec62a697e", [ null, [ @@ -112654,7 +112680,7 @@ ] ], "custom-highlight-painting-staticrange-005.html": [ - "ab486ae644adb2e2dda7f70364bf9a6f95bb8aa1", + "b955b0fcee4342a24a6b59d6d91e0f2fbdd4126f", [ null, [ @@ -112667,7 +112693,7 @@ ] ], "custom-highlight-painting-staticrange-006.html": [ - "52ab8c7fb05dbd4f66840733b8a0b481c4b62a6c", + "8436102240d04b161bf55d711a64ad92c1309959", [ null, [ @@ -112680,7 +112706,7 @@ ] ], "custom-highlight-painting-staticrange-007.html": [ - "d56082a119ce21f0d87d69c52cdf0833e5d31a21", + "03a7ee6d54534a7545f26be083659c0c26c4e4fc", [ null, [ @@ -172312,12 +172338,12 @@ }, "css-variables": { "css-vars-custom-property-case-sensitive-001.html": [ - "6644175e5533a19ef4125dd8aecd833f1be12c39", + "df2b352702311f0a2ae55160cb9fbc2bde576dd0", [ null, [ [ - "/css/css-variables/reference/css-vars-custom-property-case-sensitive-ref.html", + "/css/reference/ref-filled-green-100px-square.xht", "==" ] ], @@ -172325,12 +172351,12 @@ ] ], "css-vars-custom-property-inheritance.html": [ - "fc6cfa0ed40cdd6e9f973e5da150afff9d992e33", + "bbda51d2fe512b8acf234274e131e4febc0d31b8", [ null, [ [ - "/css/css-variables/reference/css-vars-custom-property-inheritance-ref.html", + "/css/reference/ref-filled-green-100px-square.xht", "==" ] ], @@ -172637,7 +172663,7 @@ ] ], "variable-declaration-24.html": [ - "ead972c2aadf762f92ab727bde1d76f140643f56", + "14fe47a1e5ea424e107161dfe7d0f743068b2380", [ null, [ @@ -172650,7 +172676,7 @@ ] ], "variable-declaration-25.html": [ - "64d19973d74ddb9394ea9bee861f84abd75c08ac", + "ad79f4ced1933c11890c4a0c6d3778aa140a021f", [ null, [ @@ -193007,6 +193033,19 @@ ], {} ] + ], + "xml-class-selector.xml": [ + "5666c0065d6262e0ca3c586d145a67e7f9c2a3cf", + [ + null, + [ + [ + "/css/selectors/xml-class-selector-ref.xml", + "==" + ] + ], + {} + ] ] }, "vendor-imports": { @@ -200532,6 +200571,21 @@ } }, "interactive-elements": { + "the-dialog-element": { + "backdrop-dynamic-display-none.html": [ + "573ed2d6c62c416a532de11d5d2e1775f4086dce", + [ + null, + [ + [ + "/html/semantics/interactive-elements/the-dialog-element/backdrop-dynamic-display-none-reference.html", + "==" + ] + ], + {} + ] + ] + }, "the-popup-element": { "popup-hidden-display.tentative.html": [ "b313f06f664d35ca86e98a2361c04e329964e02a", @@ -238790,6 +238844,10 @@ "iframe-code.html": [ "a4a1829be229acb4c0cf75cbb0e2885060741d3f", [] + ], + "run-after-layout-and-paint.js": [ + "75d3e279a4cd6916f769a68f2c7f246e8ad354dc", + [] ] } } @@ -253032,14 +253090,6 @@ [] ], "reference": { - "css-vars-custom-property-case-sensitive-ref.html": [ - "30bad67f85a38737a408350e46d7236a3e4462e3", - [] - ], - "css-vars-custom-property-inheritance-ref.html": [ - "fcacb7bb23d1ab8c1288b2de072416a7c7ee8623", - [] - ], "variable-reference-without-whitespace-ref.html": [ "3d9aaed6b129725cb5190afd9f19aefae834f37f", [] @@ -257408,6 +257458,10 @@ "user-valid-expected.txt": [ "60549107fbeec9ba2ae7c07bcf3afe5d5bc94b34", [] + ], + "xml-class-selector-ref.xml": [ + "6b44280737ab254649036ff50808b764bc87cc67", + [] ] }, "support": { @@ -263425,17 +263479,25 @@ "a69aab487239021088f944b0a8cee2dad4b3d111", [] ], + "non-secure-context.window-expected.txt": [ + "101160983b38cf7dac36d92ae865da8c2e1b9a0c", + [] + ], "resources": { "fetcher.html": [ "6fc321f345142c2379cee6e5845bc73b90cad509", [] ], "ports.sub.js": [ - "52919db847de01fc3bb3e17c0f561d71977a8062", + "fb3f0ad5c402eefea666251fe177e74e94d36450", + [] + ], + "socket-opener.html": [ + "48d27216bedf9aa1daf4d2a4e96f860e9315a0c3", [] ], "support.js": [ - "54177d5bfbf1fd57cb795d7d6c3cc141b2d083f0", + "16494bf197a1101a9b9445eae9b14ddd5c2bfb83", [] ] } @@ -268501,21 +268563,9 @@ ] }, "pixel-manipulation": { - "2d.imageData.create2.nonfinite-expected.txt": [ - "3047af28cce2b4d27a6721802562289496db1219", - [] - ], - "2d.imageData.get.nonfinite-expected.txt": [ - "0755a317939083bff9e9d566086e6d0a05f85bd2", - [] - ], "2d.imageData.get.tiny-expected.txt": [ "bc72eb78a8fbdd7219a460807b09547605eddea9", [] - ], - "2d.imageData.put.nonfinite-expected.txt": [ - "d52021cc00ba4e8e77ce5919e611ed42d3f94528", - [] ] }, "text": { @@ -276643,6 +276693,10 @@ ] }, "the-dialog-element": { + "backdrop-dynamic-display-none-reference.html": [ + "c49a11d41634dcd035f926cb97fe1db9e16dfb78", + [] + ], "centering-iframe.sub.html": [ "6ffd72296d8302c71866624b08b1b3213f1b5e4e", [] @@ -282000,7 +282054,7 @@ ] }, "lint.ignore": [ - "49a71f640d8033b95b5ab674d5a7dc35893258b8", + "d486fb9ed3c10788d7c3a0b6a66ffa046e242b22", [] ], "loading": { @@ -285087,7 +285141,7 @@ ] }, "show-consume-activation.https-expected.txt": [ - "6ce291242ae95fffa1a86775c2a1479651b2349b", + "bd3d471c79db74a3c3d1683882f5170114d1946a", [] ], "show-consume-activation.https.html.ini": [ @@ -285171,6 +285225,10 @@ "permissions-query-feature-policy-attribute.https.sub-expected.txt": [ "b3a521320e8acb70c2f2199d608d4bd3379934e0", [] + ], + "permissionsstatus-name-expected.txt": [ + "94dd7854162c1b0a606755a610a74c9a088cce89", + [] ] }, "permissions-policy": { @@ -288431,7 +288489,7 @@ [] ], "testharness.js": [ - "f85b19fd9bd90c3476dedcbe5825b82fb40de82c", + "d35e297aab0714ca00fd27607369a653977cb9ae", [] ], "testharness.js.headers": [ @@ -295253,6 +295311,10 @@ [] ], "resources": { + "check-accept-header-and-return-bundle.py": [ + "c2c8ebb601de7f53e2b9c3208d45093da1bf8cb5", + [] + ], "check-sec-fetch-dest-header-and-return-bundle.py": [ "da36e49320369ddc94405d298746db562be50045", [] @@ -296242,7 +296304,7 @@ ] }, "conftest.py": [ - "42b82c9ecf29a1aed48bfa959c20aba6edd1319e", + "fe9f5cd268240662d0d7a6753e58a7fbedecad4e", [] ], "delete_all_cookies": { @@ -296649,7 +296711,7 @@ [] ], "asserts.py": [ - "e60d53b6c6f0c5baf8694b82332df517a782e671", + "bc59d7b39664fe57e31f1e1aaf0f370aed651633", [] ], "authentication.py": [ @@ -296661,7 +296723,15 @@ [] ], "fixtures.py": [ - "f7eb8bf825b8ec8c3308e5bc340b3ec7f68ce807", + "e42b0ad9a26fd295d67913a9ffed56483e913b14", + [] + ], + "fixtures_bidi.py": [ + "cdfa3a08558517c021f42a8600bdf7b0f67f977f", + [] + ], + "fixtures_http.py": [ + "2d961d7f60c858972201c51378a738612deee11a", [] ], "helpers.py": [ @@ -297099,7 +297169,7 @@ [] ], "RTCRtpTransceiver.https-expected.txt": [ - "d7dae0f9210361eae456b249de4d8b0719154fbb", + "cba73637158287119471b23117bf859f98019ea4", [] ], "RTCStats-helper.js": [ @@ -297397,7 +297467,7 @@ [] ], "supported-stats-expected.txt": [ - "75425233f4b59a99e9ee9c8da54f0c9c104519d5", + "0ba4f70d25511e8ea124a3fdc734e94d1b77e171", [] ] }, @@ -315661,7 +315731,7 @@ ] ], "navigate-respondWith-history-state.html": [ - "e0031d510486365052f50c32f8a836cbdd2b7528", + "c7e64b568d45af3c37cbf432177d1c8432a0be83", [ null, {} @@ -315682,7 +315752,7 @@ ] ], "navigate-respondWith.html": [ - "70a560d9b496b6c94eb111d7773bc8339400dc71", + "c65da903a6cd5bc1d5df3bd1e4e2063d43b2155b", [ null, {} @@ -316202,8 +316272,15 @@ {} ] ], + "respondWith-multiple-times-reject.html": [ + "0e1bd1963f202b2865b562f9c0e8ce9a80db9bdf", + [ + null, + {} + ] + ], "respondWith-multiple-times.html": [ - "f1694432d59c31c0ebe08b5d75753f6bd62d04ff", + "5ca6db0476a27ed0267f6c1590c75ab681707bc9", [ null, {} @@ -347708,7 +347785,7 @@ ] ], "rowspan-height-redistribution.html": [ - "3357cbdc4b81832e7b830ae54ecb7132ede4414c", + "364ae321c901b073d5eba9655b8481089a3b2f01", [ null, {} @@ -355027,7 +355104,7 @@ ] ], "variable-pseudo-element.html": [ - "1c5413bd542ab640a0dc5f2ff2344076dd4495c2", + "ee61cbf3948a89427e0cefcf4e6c0c4736e7c255", [ null, {} @@ -355090,28 +355167,21 @@ ] ], "variable-substitution-filters.html": [ - "5dc10e1d82fd6519402bf403db6805ef9bade044", - [ - null, - {} - ] - ], - "variable-substitution-plus-box-shadow.html": [ - "06dfd3628108333392c40e1afbca5e8406a9da02", + "5e48073158207046deffc78397b31b2198f40926", [ null, {} ] ], "variable-substitution-replaced-size.html": [ - "581ea6b8f20e35ebe48f75e1b7e3e2c68f2046e3", + "29bae38e3e99b4524e87f7dbd06567497bee3190", [ null, {} ] ], "variable-substitution-shadow-properties.html": [ - "bd7b5ef334d6aa85ac8bfc66590ed4e0afc12e87", + "f825b200f344f9f6d491ea7bdb30566412264cc7", [ null, {} @@ -388516,7 +388586,7 @@ }, "private-network-access": { "non-secure-context.window.js": [ - "8e55559ac081e66b1abad0afc1bc9eab96ce8161", + "6b2b6be7e09708b3d3b6d30d08f476d7bf548dbd", [ "fetch/private-network-access/non-secure-context.window.html", { @@ -388534,7 +388604,7 @@ ] ], "secure-context.https.window.js": [ - "889c3e0dc9d8da8879b3d0aed9d3bd8d3e6b3313", + "1218700786f7bf61e47389cdb22365d2cb2f642a", [ "fetch/private-network-access/secure-context.https.window.html", { @@ -414054,37 +414124,6 @@ {} ] ], - "cross-origin-isolated.tentative.window.js": [ - "8ab0e7106db42756c7ca3bda6c15fb618a5cde7a", - [ - "html/cross-origin-embedder-policy/anonymous-iframe/cross-origin-isolated.tentative.window.html", - { - "script_metadata": [ - [ - "script", - "/common/get-host-info.sub.js" - ], - [ - "script", - "/common/utils.js" - ], - [ - "script", - "../credentialless/resources/common.js" - ], - [ - "script", - "../credentialless/resources/dispatcher.js" - ], - [ - "timeout", - "long" - ] - ], - "timeout": "long" - } - ] - ], "local-storage.tentative.https.html": [ "a49eac706bea9840e9ff58a5790669f12109d230", [ @@ -425718,8 +425757,17 @@ {} ] ], + "popup-light-dismiss-resize.tentative.html": [ + "cec65f77dcaddfd170581992ddec02c53619898e", + [ + null, + { + "testdriver": true + } + ] + ], "popup-light-dismiss.tentative.html": [ - "649b594c2efb45e5c875008169fbad86d4cb8fe9", + "e0012587fd217a935409b6c70af4db5c94a73332", [ null, { @@ -443270,6 +443318,85 @@ } ] ], + "read_write_async_bufferlength.tentative.https.any.js": [ + "7424d24e5231fc5bafc3413cf68232773acfc883", + [ + "native-io/read_write_async_bufferlength.tentative.https.any.html", + { + "script_metadata": [ + [ + "title", + "NativeIO API: Read/Write correctly handle small buffer lengths." + ], + [ + "global", + "window,worker" + ], + [ + "script", + "resources/support.js" + ] + ] + } + ], + [ + "native-io/read_write_async_bufferlength.tentative.https.any.serviceworker.html", + { + "script_metadata": [ + [ + "title", + "NativeIO API: Read/Write correctly handle small buffer lengths." + ], + [ + "global", + "window,worker" + ], + [ + "script", + "resources/support.js" + ] + ] + } + ], + [ + "native-io/read_write_async_bufferlength.tentative.https.any.sharedworker.html", + { + "script_metadata": [ + [ + "title", + "NativeIO API: Read/Write correctly handle small buffer lengths." + ], + [ + "global", + "window,worker" + ], + [ + "script", + "resources/support.js" + ] + ] + } + ], + [ + "native-io/read_write_async_bufferlength.tentative.https.any.worker.html", + { + "script_metadata": [ + [ + "title", + "NativeIO API: Read/Write correctly handle small buffer lengths." + ], + [ + "global", + "window,worker" + ], + [ + "script", + "resources/support.js" + ] + ] + } + ] + ], "read_write_correct_arraybufferview_async_basic.tentative.https.any.js": [ "46bcc8d5bd85dbb60edc4e824f6bc729f85582f4", [ @@ -443393,6 +443520,28 @@ } ] ], + "read_write_sync_bufferlength.tentative.https.any.js": [ + "3f45f2702c3152c5ffea4c0caba6abc482f2188e", + [ + "native-io/read_write_sync_bufferlength.tentative.https.any.worker.html", + { + "script_metadata": [ + [ + "title", + "Synchronous NativeIO API: Read/Write correctly handle small buffer lengths." + ], + [ + "global", + "dedicatedworker" + ], + [ + "script", + "resources/support.js" + ] + ] + } + ] + ], "rename_async_basic.tentative.https.any.js": [ "47c9ffc6b919417dfbc47499b8029d13788cd8bf", [ @@ -446148,7 +446297,7 @@ ] ], "show-consume-activation.https.html": [ - "0b92c4c15cf158457a9cfae6fab02171a49ca5f2", + "044fca5d40801fcad93fc5137a12fdfc8db4147c", [ null, { @@ -446748,6 +446897,13 @@ {} ] ], + "permissionsstatus-name.html": [ + "db1d1bb83eba9f55e68b1cc5a0f8224be98a36cf", + [ + null, + {} + ] + ], "screen-wake-lock-permission.html": [ "0fa69ff96a03b36d3fbd3de15a70f9b199074ebc", [ @@ -487507,6 +487663,13 @@ {} ] ], + "subresource-loading-accept-header.https.tentative.sub.html": [ + "e8aa5f902da22b04279c38a76ac13309406b6483", + [ + null, + {} + ] + ], "subresource-loading-cors-error.https.tentative.html": [ "43b1f36386f9196030e1a94d21ff7443a394aa90", [ @@ -529955,6 +530118,15 @@ {} ] ] + }, + "session_subscribe": { + "subscribe.py": [ + "42bcde48d687b66fd9052105c5a0e3faf8cdffb4", + [ + null, + {} + ] + ] } }, "close_window": { @@ -530297,7 +530469,7 @@ }, "find_element_from_shadow_root": { "user_prompts.py": [ - "3813a7df5d324231e18b89ebf46d72729f220942", + "e1326cf599a4affe3c269f205bdbd4e791b8f346", [ null, { @@ -530330,7 +530502,7 @@ }, "find_elements_from_shadow_root": { "user_prompts.py": [ - "c4b903c836ef8ed89cd234ebe170a66f3b24631a", + "9950999226debc864f66e2096e8d2108c620f022", [ null, {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-animations/non-invertible-transform-animation.html b/third_party/blink/web_tests/external/wpt/css/css-animations/non-invertible-transform-animation.html new file mode 100644 index 0000000..782bb09 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-animations/non-invertible-transform-animation.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>CSS animations test: Animations should run even if the initial transform is non-invertible</title> +<link rel="author" title="Philip Rogers" href="mailto:pdr@chromium.org"> +<link rel="help" href="https://crbug.com/1238327"> +<link rel="match" href="../reference/ref-filled-green-100px-square-only.html"> +<style> + @keyframes animationKeyframes { + 0% { transform: scale(0); } + /* 0.027% * 60s = 16.2ms */ + 0.027% { transform: scale(0); } + 0.0271% { transform: scale(1); } + 100% { transform: scale(1); } + } + #anim { + width: 100px; + height: 100px; + background: green; + animation: animationKeyframes 60s; + } +</style> +<p>Test passes if there is a filled green square.</p> +<div id="anim"></div> +<script> + requestAnimationFrame(function() { + // Wait for 100ms which should be enough time for the animation to have + // progressed to the "scale(1)" state. + setTimeout(function() { + document.documentElement.classList.remove('reftest-wait'); + }, 100); + }); +</script> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-variables/css-vars-custom-property-case-sensitive-001.html b/third_party/blink/web_tests/external/wpt/css/css-variables/css-vars-custom-property-case-sensitive-001.html index 6644175e..df2b352 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-variables/css-vars-custom-property-case-sensitive-001.html +++ b/third_party/blink/web_tests/external/wpt/css/css-variables/css-vars-custom-property-case-sensitive-001.html
@@ -6,32 +6,26 @@ <link rel="author" title="Noah Collins" href="mailto:noahcollins@gmail.com"> <link rel="help" href="http://www.w3.org/TR/css-variables-1/#using-variables"> <meta name="assert" content="Custom property names are case-sensitive"> - <link rel="match" href="reference/css-vars-custom-property-case-sensitive-ref.html"> + <link rel="match" href="/css/reference/ref-filled-green-100px-square.xht"> <style type="text/css"> :root { - --veryblue: #22e; - --AlsoBlue: #22e; + --lowercasegreen: green; + --MixedCaseGreen: green; - --veryred: #f00; - --AlsoRed: #f00; + --lowercasered: red; + --MixedCaseRed: red; } - - /* These match the case of the declarations */ - .blue-good-1 { color: var(--veryblue); } - .blue-good-2 { color: var(--AlsoBlue); } - - /* These DO NOT match the case of the declarations */ - .red-bad-1 { color: var(--VeryRed); } - .red-bad-2 { color: var(--alsored); } + div { + width: 100px; + height: 25px; + } </style> </head> <body> - <h2 class="blue-good-1">Valid CSS Variable Names</h2> - <p class="blue-good-1">This paragraph is styled using a valid CSS Variable name. It should be blue.</p> - <p class="blue-good-2">This paragraph is styled using a valid CSS Variable name. It should be blue.</p> - <br> - <h2 class="red-bad-1">Invalid CSS Variable Names</h2> - <p class="red-bad-1">This paragraph is styled using an invalid CSS Variable name. Fail if red.</p> - <p class="red-bad-2">This paragraph is styled using an invalid CSS Variable name. Fail if red.</p> + <p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + <div style="background-color: var(--lowercasegreen, red);"></div> + <div style="background-color: var(--MixedCaseGreen, red);"></div> + <div style="background-color: var(--LowerCaseRed, green);"></div> + <div style="background-color: var(--mixedcasered, green);"></div> </body> </html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-variables/css-vars-custom-property-inheritance.html b/third_party/blink/web_tests/external/wpt/css/css-variables/css-vars-custom-property-inheritance.html index fc6cfa0..bbda51d 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-variables/css-vars-custom-property-inheritance.html +++ b/third_party/blink/web_tests/external/wpt/css/css-variables/css-vars-custom-property-inheritance.html
@@ -6,25 +6,25 @@ <link rel="author" title="Noah Collins" href="mailto:noahcollins@gmail.com"> <link rel="help" href="http://www.w3.org/TR/css-variables-1/#using-variables"> <meta name="assert" content="custom properties are resolved with the normal inheritance and cascade rules"> - <link rel="match" href="reference/css-vars-custom-property-inheritance-ref.html"> + <link rel="match" href="/css/reference/ref-filled-green-100px-square.xht"> <style type="text/css"> /* test cascade importance */ - :root { --color: #1c1 !important; } - :root { --color: red; } + :root { --color-1: green !important; } + :root { --color-1: red; } + div.color1 { background-color: var(--color-1); } /* test cascade order */ - * { color: red; } + :root { --color-2: green; } + div.color2 { background-color: red; } + div.color2 { background-color: var(--color-2); } - /* test cascade order */ - * { color: var(--color); } - + div { width: 100px; height: 50px; } </style> </head> <body> - <p>Green</p> - <p>Green</p> - <p>Green</p> - <p>The test passes if everything is green. Any red means the test failed.</p> + <p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + <div class=color1></div> + <div class=color2></div> </body> </html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-variables/reference/css-vars-custom-property-case-sensitive-ref.html b/third_party/blink/web_tests/external/wpt/css/css-variables/reference/css-vars-custom-property-case-sensitive-ref.html deleted file mode 100644 index 30bad67f..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-variables/reference/css-vars-custom-property-case-sensitive-ref.html +++ /dev/null
@@ -1,21 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>CSS Variables Test: custom property names are case-sensitive</title> - <meta charset="UTF-8"> - <link rel="author" title="Noah Collins" href="mailto:noahcollins@gmail.com"> - <style type="text/css"> - .blue-good-1 { color: #22e; } - .blue-good-2 { color: #22e; } - </style> -</head> -<body> - <h2 class="blue-good-1">Valid CSS Variable Names</h2> - <p class="blue-good-1">This paragraph is styled using a valid CSS Variable name. It should be blue.</p> - <p class="blue-good-2">This paragraph is styled using a valid CSS Variable name. It should be blue.</p> - <br> - <h2>Invalid CSS Variable Names</h2> - <p>This paragraph is styled using an invalid CSS Variable name. Fail if red.</p> - <p>This paragraph is styled using an invalid CSS Variable name. Fail if red.</p> -</body> -</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-variables/reference/css-vars-custom-property-inheritance-ref.html b/third_party/blink/web_tests/external/wpt/css/css-variables/reference/css-vars-custom-property-inheritance-ref.html deleted file mode 100644 index fcacb7b..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-variables/reference/css-vars-custom-property-inheritance-ref.html +++ /dev/null
@@ -1,17 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <title>CSS Variables Test: custom properties use normal inheritance and cascade rules</title> - <link rel="author" title="Noah Collins" href="mailto:noahcollins@gmail.com"> - <style type="text/css"> - * { color: #1c1; } - </style> -</head> -<body> - <p>Green</p> - <p>Green</p> - <p>Green</p> - <p>The test passes if everything is green. Any red means the test failed.</p> -</body> -</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-variables/variable-declaration-24.html b/third_party/blink/web_tests/external/wpt/css/css-variables/variable-declaration-24.html index ead972c2a..14fe47a 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-variables/variable-declaration-24.html +++ b/third_party/blink/web_tests/external/wpt/css/css-variables/variable-declaration-24.html
@@ -16,10 +16,10 @@ } p { color: orange; - --a: green; + --a: red; --b: crimson; - --a: var(--b) <!--; - color: var(--a); + --a: var(--b) <!--; /* valid at parse */ + color: var(--a); /* but IACVT at substitution */ } </style> <p>This text must be green.</p>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-variables/variable-declaration-25.html b/third_party/blink/web_tests/external/wpt/css/css-variables/variable-declaration-25.html index 64d1997..ad79f4c 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-variables/variable-declaration-25.html +++ b/third_party/blink/web_tests/external/wpt/css/css-variables/variable-declaration-25.html
@@ -16,10 +16,10 @@ } p { color: orange; - --a: green; + --a: red; --b: crimson; - --a: --> var(--b); - color: var(--a); + --a: --> var(--b); /* valid at parse */ + color: var(--a); /* but IACVT at substitution */ } </style> <p>This text must be green.</p>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-variables/variable-pseudo-element.html b/third_party/blink/web_tests/external/wpt/css/css-variables/variable-pseudo-element.html index 1c5413bd..ee61cbf 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-variables/variable-pseudo-element.html +++ b/third_party/blink/web_tests/external/wpt/css/css-variables/variable-pseudo-element.html
@@ -1,106 +1,68 @@ <!DOCTYPE html> <html> <head> - <title>Parse, store, and serialize CSS variable references</title> + <title>Variables work in ::before/::after pseudos</title> <meta rel="author" title="Kevin Babbitt"> <meta rel="author" title="Greg Whitworth"> <link rel="author" title="Microsoft Corporation" href="http://microsoft.com" /> - <!-- This is not directly specified in the spec but should work --> + <link rel="author" title="Tab Atkins-Bittner" href="https://xanthir.com/contact/"> <link rel="help" href="http://www.w3.org/TR/css-variables-1/#defining-variables"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> - <!-- - https://drafts.csswg.org/css-syntax/#error-handling - If the stylesheet ends while any rule, declaration, function, string, etc. are still open, everything is automatically closed. - --> - <style id="variable-reference-left-open"> - div - { - color: var(--my-color); - --my-color: blue; - --my-color2: red; + <style> + :root { + --color: green; + --color2: red; } - - #div1::after - { - content: '[after]'; - color: var(--my-color); - --my-color: orange; - } - - #div2::after - { - content: '[after]'; - color: var(--my-color2); - } - - #div3::after - { - content: '[after]'; - --my-color: orange; - } - - #div4::after - { - content: '[after]'; - color: var(--my-color); - --my-color: pink; - } - - #div1::before - { + div::before { content: '[before]'; - color: var(--my-color); - --my-color: orange; + } + div::after { + content: '[after]'; } - #div2::before - { - content: '[before]'; - color: var(--my-color2); + #div1 { + color: red; + } + #div1::before, #div1::after { + color: var(--color2); + --color2: green; } - #div3::before - { - content: '[before]'; - --my-color: orange; + #div2 { + color: var(--color2); + } + #div2::before, #div2::after { + color: var(--color); } - #div4::before - { - content: '[before]'; - color: var(--my-color); - --my-color: purple; + #div3 { + color: var(--color); + } + #div3::before, #div3::after { + --color: red; } </style> -</head> -<body> + <div id="div1">div1</div> <div id="div2">div2</div> <div id="div3">div3</div> - <div id="div4">div4</div> + <span id="control" style="color: green;"></span> -<script type="text/javascript"> +<script> "use strict"; - var testcases = [ - { ID: "div1", expectedAfterColor: "rgb(255, 165, 0)", expectedBeforeColor: "rgb(255, 165, 0)" }, - { ID: "div2", expectedAfterColor: "rgb(255, 0, 0)", expectedBeforeColor: "rgb(255, 0, 0)" }, - { ID: "div3", expectedAfterColor: "rgb(0, 0, 255)", expectedBeforeColor: "rgb(0, 0, 255)" }, - { ID: "div4", expectedAfterColor: "rgb(255, 192, 203)", expectedBeforeColor: "rgb(128, 0, 128)" }, - ]; - - testcases.forEach(function (testcase) { + [...document.querySelectorAll("div")].forEach(function (div) { test( function () { - var div = document.getElementById(testcase.ID); - var actualAfterColor = window.getComputedStyle(div, ':after').getPropertyValue('color'); + const expectedColor = getComputedStyle(document.querySelector("#control")).color; var actualBeforeColor = window.getComputedStyle(div, ':before').getPropertyValue('color'); - assert_equals(actualBeforeColor, testcase.expectedBeforeColor, "The color of the before pseudo element should match the expected color"); - assert_equals(actualAfterColor, testcase.expectedAfterColor, "The color of the after pseudo element should match the expected color"); - }, testcase.ID); + var actualAfterColor = window.getComputedStyle(div, ':after').getPropertyValue('color'); + assert_equals(actualBeforeColor, expectedColor); + assert_equals(actualAfterColor, expectedColor); + }, div.getAttribute("id")); }); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-variables/variable-substitution-filters.html b/third_party/blink/web_tests/external/wpt/css/css-variables/variable-substitution-filters.html index 5dc10e1..5e48073 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-variables/variable-substitution-filters.html +++ b/third_party/blink/web_tests/external/wpt/css/css-variables/variable-substitution-filters.html
@@ -6,7 +6,6 @@ <meta rel="author" title="Kevin Babbitt"> <meta rel="author" title="Greg Whitworth"> <link rel="author" title="Microsoft Corporation" href="http://microsoft.com" /> - <!-- This is testing filters functions with var() function --> <link rel="help" href="http://www.w3.org/TR/css-variables-1/#defining-variables"> <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-variables/variable-substitution-plus-box-shadow.html b/third_party/blink/web_tests/external/wpt/css/css-variables/variable-substitution-plus-box-shadow.html deleted file mode 100644 index 06dfd36..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-variables/variable-substitution-plus-box-shadow.html +++ /dev/null
@@ -1,52 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>box-shadow + variable substitution on same element</title> - - <meta rel="author" title="Kevin Babbitt"> - <meta rel="author" title="Greg Whitworth"> - <link rel="author" title="Microsoft Corporation" href="http://microsoft.com" /> - <!-- This is testing filters functions with var() function --> - <link rel="help" href="http://www.w3.org/TR/css-variables-1/#defining-variables"> - - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> -</head> -<body> - <div id="target" style="box-shadow: 1px 1px 1px green; color: var(--alpha); --alpha: green;">This div should have green text and a green shadow.</div> - - <script type="text/javascript"> - "use strict"; - let target = document.getElementById('target'); - let computedStyle = window.getComputedStyle(target); - - let templates = [ - { - testName:"box-shadow", - value: computedStyle.boxShadow, - potentialValues: ["1px 1px 1px green", "rgb(0, 128, 0) 1px 1px 1px 0px"], - description: "Expected value should be 1px 1px 1px green or rgb(0, 128, 0) 1px 1px 1px 0px" - }, - { - testName:"--alpha", - value: computedStyle.getPropertyValue("--alpha").trim(), - potentialValues: ["green"], - description: "Expected value is green" - }, - { - testName:"color", - value: computedStyle.color, - potentialValues: ["rgb(0, 128, 0)", "rgba(0, 128, 0, 1)"], - description: "Expected value to be rgb(0, 128, 0) or rgba(0, 128, 0, 1)" - } - ]; - - templates.forEach(function (template) { - test( function () { - assert_in_array(template.value, template.potentialValues, template.description); - }, template.testName); - }); - </script> -</body> -</html> -
diff --git a/third_party/blink/web_tests/external/wpt/css/css-variables/variable-substitution-replaced-size.html b/third_party/blink/web_tests/external/wpt/css/css-variables/variable-substitution-replaced-size.html index 581ea6b8..29bae38 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-variables/variable-substitution-replaced-size.html +++ b/third_party/blink/web_tests/external/wpt/css/css-variables/variable-substitution-replaced-size.html
@@ -6,7 +6,6 @@ <meta rel="author" title="Kevin Babbitt"> <meta rel="author" title="Greg Whitworth"> <link rel="author" title="Microsoft Corporation" href="http://microsoft.com" /> - <!-- This is testing filters functions with var() function --> <link rel="help" href="http://www.w3.org/TR/css-variables-1/#defining-variables"> <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-variables/variable-substitution-shadow-properties.html b/third_party/blink/web_tests/external/wpt/css/css-variables/variable-substitution-shadow-properties.html index bd7b5ef..f825b20 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-variables/variable-substitution-shadow-properties.html +++ b/third_party/blink/web_tests/external/wpt/css/css-variables/variable-substitution-shadow-properties.html
@@ -6,7 +6,6 @@ <meta rel="author" title="Kevin Babbitt"> <meta rel="author" title="Greg Whitworth"> <link rel="author" title="Microsoft Corporation" href="http://microsoft.com" /> - <!-- This is testing filters functions with var() function --> <link rel="help" href="http://www.w3.org/TR/css-variables-1/#defining-variables"> <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/text-styles/2d.text.font.parse.family.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/text-styles/2d.text.font.parse.family.html new file mode 100644 index 0000000..f5c24bd --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/text-styles/2d.text.font.parse.family.html
@@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.text.font.parse.family</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/html/canvas/resources/canvas-tests.js"></script> +<link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> +<body class="show_output"> + +<h1>2d.text.font.parse.family</h1> +<p class="desc"></p> + + +<p class="output">Actual output:</p> +<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas> + +<ul id="d"></ul> +<script> +var t = async_test(""); +_addTest(function(canvas, ctx) { + +ctx.font = '20px cursive,fantasy,monospace,sans-serif,serif,UnquotedFont,"QuotedFont\\\\\\","'; +_assertSame(ctx.font, '20px cursive, fantasy, monospace, sans-serif, serif, UnquotedFont, "QuotedFont\\\\\\","', "ctx.font", "'20px cursive, fantasy, monospace, sans-serif, serif, UnquotedFont, \"QuotedFont\\\\\\\\\\\\\",\"'"); + + +}); +</script> +
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/text/2d.text.font.parse.family.html b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/text/2d.text.font.parse.family.html new file mode 100644 index 0000000..68cd6ea --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/text/2d.text.font.parse.family.html
@@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>OffscreenCanvas test: 2d.text.font.parse.family</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/html/canvas/resources/canvas-tests.js"></script> + +<h1>2d.text.font.parse.family</h1> +<p class="desc"></p> + + +<script> +var t = async_test(""); +var t_pass = t.done.bind(t); +var t_fail = t.step_func(function(reason) { + throw reason; +}); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.font = '20px cursive,fantasy,monospace,sans-serif,serif,UnquotedFont,"QuotedFont\\\\\\","'; +_assertSame(ctx.font, '20px cursive, fantasy, monospace, sans-serif, serif, UnquotedFont, "QuotedFont\\\\\\","', "ctx.font", "'20px cursive, fantasy, monospace, sans-serif, serif, UnquotedFont, \"QuotedFont\\\\\\\\\\\\\",\"'"); +t.done(); + +}); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/text/2d.text.font.parse.family.worker.js b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/text/2d.text.font.parse.family.worker.js new file mode 100644 index 0000000..6bc05b68 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/text/2d.text.font.parse.family.worker.js
@@ -0,0 +1,24 @@ +// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. +// OffscreenCanvas test in a worker:2d.text.font.parse.family +// Description: +// Note: + +importScripts("/resources/testharness.js"); +importScripts("/html/canvas/resources/canvas-tests.js"); + +var t = async_test(""); +var t_pass = t.done.bind(t); +var t_fail = t.step_func(function(reason) { + throw reason; +}); +t.step(function() { + +var offscreenCanvas = new OffscreenCanvas(100, 50); +var ctx = offscreenCanvas.getContext('2d'); + +ctx.font = '20px cursive,fantasy,monospace,sans-serif,serif,UnquotedFont,"QuotedFont\\\\\\","'; +_assertSame(ctx.font, '20px cursive, fantasy, monospace, sans-serif, serif, UnquotedFont, "QuotedFont\\\\\\","', "ctx.font", "'20px cursive, fantasy, monospace, sans-serif, serif, UnquotedFont, \"QuotedFont\\\\\\\\\\\\\",\"'"); +t.done(); + +}); +done();
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml/element/text-styles.yaml b/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml/element/text-styles.yaml index 8042519..c4d2caf 100644 --- a/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml/element/text-styles.yaml +++ b/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml/element/text-styles.yaml
@@ -26,6 +26,15 @@ ctx.font = 'small-caps italic 400 12px/2 Unknown Font, sans-serif'; @assert ctx.font === 'italic small-caps 12px "Unknown Font", sans-serif'; @moz-todo +- name: 2d.text.font.parse.family + testing: + - 2d.text.font.parse + - 2d.text.font.get + - 2d.text.font.lineheight + code: | + ctx.font = '20px cursive,fantasy,monospace,sans-serif,serif,UnquotedFont,"QuotedFont\\\\\\","'; + @assert ctx.font === '20px cursive, fantasy, monospace, sans-serif, serif, UnquotedFont, "QuotedFont\\\\\\","'; + # TODO: # 2d.text.font.parse.size.absolute # xx-small x-small small medium large x-large xx-large
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml/offscreen/text.yaml b/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml/offscreen/text.yaml index 8e493e0..2fe6c2a8 100644 --- a/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml/offscreen/text.yaml +++ b/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml/offscreen/text.yaml
@@ -29,6 +29,16 @@ @assert ctx.font === 'italic small-caps 12px "Unknown Font", sans-serif'; @moz-todo t.done(); +- name: 2d.text.font.parse.family + testing: + - 2d.text.font.parse + - 2d.text.font.get + - 2d.text.font.lineheight + code: | + ctx.font = '20px cursive,fantasy,monospace,sans-serif,serif,UnquotedFont,"QuotedFont\\\\\\","'; + @assert ctx.font === '20px cursive, fantasy, monospace, sans-serif, serif, UnquotedFont, "QuotedFont\\\\\\","'; + t.done(); + # TODO: # 2d.text.font.parse.size.absolute # xx-small x-small small medium large x-large xx-large
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/backdrop-dynamic-display-none-reference.html b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/backdrop-dynamic-display-none-reference.html new file mode 100644 index 0000000..c49a11d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/backdrop-dynamic-display-none-reference.html
@@ -0,0 +1,7 @@ +<!DOCTYPE html> +<html> +<title>Reference: Test that adding display: none; dynamically on ::backdrop makes it disappear</title> +<meta charset="utf-8"> +<link rel="author" title="Tim Nguyen" href="https://github.com/nt1m"> +<p>Test passes if there is no red.</p> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/backdrop-dynamic-display-none.html b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/backdrop-dynamic-display-none.html new file mode 100644 index 0000000..573ed2d6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/backdrop-dynamic-display-none.html
@@ -0,0 +1,23 @@ +<!DOCTYPE html> +<html> +<title>Test that adding display: none; dynamically on ::backdrop makes it disappear</title> +<meta charset="utf-8"> +<link rel="author" title="Tim Nguyen" href="https://github.com/nt1m"> +<link rel="match" href="backdrop-dynamic-display-none-reference.html"> +<p>Test passes if there is no red.</p> +<dialog></dialog> +<style> +dialog { visibility: hidden; } +::backdrop { background-color: red; } +.hidden-backdrop::backdrop { + display: none; +} +</style> +<script> +dialog = document.querySelector("dialog"); +dialog.showModal(); +requestAnimationFrame(() => { + dialog.classList.add("hidden-backdrop"); +}); +</script> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/lint.ignore b/third_party/blink/web_tests/external/wpt/lint.ignore index d486fb9..b94917b 100644 --- a/third_party/blink/web_tests/external/wpt/lint.ignore +++ b/third_party/blink/web_tests/external/wpt/lint.ignore
@@ -142,6 +142,7 @@ SET TIMEOUT: common/reftest-wait.js SET TIMEOUT: conformance-checkers/* SET TIMEOUT: content-security-policy/* +SET TIMEOUT: css/css-animations/non-invertible-transform-animation.html SET TIMEOUT: css/css-display/display-contents-shadow-dom-1.html SET TIMEOUT: css/selectors/selector-placeholder-shown-type-change-001.html SET TIMEOUT: css/selectors/selector-placeholder-shown-type-change-002.html
diff --git a/third_party/blink/web_tests/external/wpt/payment-request/show-consume-activation.https-expected.txt b/third_party/blink/web_tests/external/wpt/payment-request/show-consume-activation.https-expected.txt index 6ce29124..bd3d471c 100644 --- a/third_party/blink/web_tests/external/wpt/payment-request/show-consume-activation.https-expected.txt +++ b/third_party/blink/web_tests/external/wpt/payment-request/show-consume-activation.https-expected.txt
@@ -1,4 +1,4 @@ This is a testharness.js-based test. -FAIL Calling share consumes user activation promise_rejects_dom: function "function() { throw e }" threw object "UnknownError: Renderer process could not establish or lost IPC connection to the PaymentRequest service in the browser process." that is not a DOMException NotAllowedError: property "name" is equal to "UnknownError", expected "NotAllowedError" +FAIL Calling share consumes user activation promise_rejects_dom: function "function() { throw e }" threw object "UnknownError: Renderer process could not establish or lost IPC connection to the PaymentRequest service in the browser process." that is not a DOMException SecurityError: property "code" is equal to 0, expected 18 Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/payment-request/show-consume-activation.https.html b/third_party/blink/web_tests/external/wpt/payment-request/show-consume-activation.https.html index 0b92c4c..044fca5 100644 --- a/third_party/blink/web_tests/external/wpt/payment-request/show-consume-activation.https.html +++ b/third_party/blink/web_tests/external/wpt/payment-request/show-consume-activation.https.html
@@ -38,7 +38,7 @@ const pr = new PaymentRequest(defaultMethods, defaultDetails); // Not activated by user gesture, so not allowed! - await promise_rejects_dom(t, "NotAllowedError", pr.show()); + await promise_rejects_dom(t, "SecurityError", pr.show()); await test_driver.bless("Calls show() method"); @@ -47,7 +47,7 @@ // The activation has been consumed, so calling show() again would require // a new gesture. - await promise_rejects_dom(t, "NotAllowedError", pr.show()); + await promise_rejects_dom(t, "InvalidStateError", pr.show()); // Abort the payment request pr.abort()
diff --git a/third_party/blink/web_tests/external/wpt/permissions/permissionsstatus-name-expected.txt b/third_party/blink/web_tests/external/wpt/permissions/permissionsstatus-name-expected.txt new file mode 100644 index 0000000..94dd7854 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions/permissionsstatus-name-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +FAIL Test PermissionStatus's name attribute. assert_equals: Name was geolocation expected (string) "geolocation" but got (undefined) undefined +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/permissions/permissionsstatus-name.html b/third_party/blink/web_tests/external/wpt/permissions/permissionsstatus-name.html new file mode 100644 index 0000000..db1d1bb8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions/permissionsstatus-name.html
@@ -0,0 +1,15 @@ +<!doctype html> +<meta charset=utf-8> +<title>Test PermissionStatus's name attribute.</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<div id="log"></div> + +<script> +promise_test(async () => { + const result = await navigator.permissions.query({ + name: "geolocation", + }); + assert_equals(result.name, "geolocation", "Name was geolocation"); +}); +</script> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/resources/testharness.js b/third_party/blink/web_tests/external/wpt/resources/testharness.js index f85b19f..d35e297 100644 --- a/third_party/blink/web_tests/external/wpt/resources/testharness.js +++ b/third_party/blink/web_tests/external/wpt/resources/testharness.js
@@ -2629,7 +2629,7 @@ RemoteContext.prototype.remote_done = function(data) { if (tests.status.status === null && data.status.status !== data.status.OK) { - tests.set_status(data.status.status, data.status.message, data.status.sack); + tests.set_status(data.status.status, data.status.message, data.status.stack); } for (let assert of data.asserts) {
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/session_subscribe/subscribe.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/session_subscribe/subscribe.py new file mode 100644 index 0000000..42bcde48 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/session_subscribe/subscribe.py
@@ -0,0 +1,70 @@ +import asyncio + +import pytest + +from webdriver.bidi.error import InvalidArgumentException + + +@pytest.mark.asyncio +async def test_params_empty(bidi_session, send_blocking_command): + with pytest.raises(InvalidArgumentException): + response = await send_blocking_command("session.subscribe", {}) + + +@pytest.mark.asyncio +@pytest.mark.parametrize("value", [None, True, "foo", 42, {}]) +async def test_params_events_invalid_type(bidi_session, send_blocking_command, value): + with pytest.raises(InvalidArgumentException): + response = await send_blocking_command("session.subscribe", {"events": value}) + + +@pytest.mark.asyncio +async def test_params_events_empty(bidi_session): + response = await bidi_session.session.subscribe(events=[]) + assert response == {} + + +@pytest.mark.asyncio +@pytest.mark.parametrize("value", [None, True, 42, [], {}]) +async def test_params_events_value_invalid_type(send_blocking_command, value): + with pytest.raises(InvalidArgumentException): + response = await send_blocking_command("session.subscribe", {"events": [value]}) + + +@pytest.mark.asyncio +@pytest.mark.parametrize("value", ["", "foo", "foo.bar"]) +async def test_params_events_value_invalid_event_name(send_blocking_command, value): + with pytest.raises(InvalidArgumentException): + response = await send_blocking_command("session.subscribe", {"events": [value]}) + + +@pytest.mark.asyncio +@pytest.mark.parametrize("value", [None, True, "foo", 42, {}]) +async def test_params_contexts_invalid_type(bidi_session, send_blocking_command, value): + with pytest.raises(InvalidArgumentException): + response = await send_blocking_command( + "session.subscribe", + { + "events": [], + "contexts": value, + } + ) + + +@pytest.mark.asyncio +async def test_params_contexts_empty(bidi_session): + response = await bidi_session.session.subscribe(events=[], contexts=[]) + assert response == {} + + +@pytest.mark.asyncio +@pytest.mark.parametrize("value", [None, True, 42, [], {}]) +async def test_params_contexts_value_invalid_type(send_blocking_command, value): + with pytest.raises(InvalidArgumentException): + response = await send_blocking_command( + "session.subscribe", + { + "events": [], + "contexts": [value], + } + )
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/conftest.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/conftest.py index 42b82c9..fe9f5cd 100644 --- a/third_party/blink/web_tests/external/wpt/webdriver/tests/conftest.py +++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/conftest.py
@@ -1 +1,5 @@ -pytest_plugins = "tests.support.fixtures" +pytest_plugins = ( + "tests.support.fixtures", + "tests.support.fixtures_bidi", + "tests.support.fixtures_http", +)
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/find_element_from_shadow_root/user_prompts.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/find_element_from_shadow_root/user_prompts.py index 3813a7df..e1326cf 100644 --- a/third_party/blink/web_tests/external/wpt/webdriver/tests/find_element_from_shadow_root/user_prompts.py +++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/find_element_from_shadow_root/user_prompts.py
@@ -14,7 +14,7 @@ return session.transport.send( "POST", "session/{session_id}/shadow/{shadow_id}/element".format( session_id=session.session_id, - element_id=shadow_id), + shadow_id=shadow_id), {"using": using, "value": value})
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/find_elements_from_shadow_root/user_prompts.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/find_elements_from_shadow_root/user_prompts.py index c4b903c..9950999 100644 --- a/third_party/blink/web_tests/external/wpt/webdriver/tests/find_elements_from_shadow_root/user_prompts.py +++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/find_elements_from_shadow_root/user_prompts.py
@@ -14,7 +14,7 @@ return session.transport.send( "POST", "session/{session_id}/shadow/{shadow_id}/elements".format( session_id=session.session_id, - element_id=shadow_id), + shadow_id=shadow_id), {"using": using, "value": value})
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/support/asserts.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/support/asserts.py index e60d53b..bc59d7b 100644 --- a/third_party/blink/web_tests/external/wpt/webdriver/tests/support/asserts.py +++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/support/asserts.py
@@ -7,6 +7,7 @@ # WebDriver specification ID: dfn-error-response-data errors = { + "detached shadow root": 404, "element click intercepted": 400, "element not selectable": 400, "element not interactable": 400, @@ -23,6 +24,7 @@ "no such cookie": 404, "no such element": 404, "no such frame": 404, + "no such shadow root": 404, "no such window": 404, "script timeout": 500, "session not created": 500,
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/support/fixtures.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/support/fixtures.py index f7eb8bf8..e42b0ad 100644 --- a/third_party/blink/web_tests/external/wpt/webdriver/tests/support/fixtures.py +++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/support/fixtures.py
@@ -12,7 +12,6 @@ from tests.support.helpers import cleanup_session, deep_update from tests.support.inline import build_inline from tests.support.http_request import HTTPRequest -from tests.support.sync import Poll _current_session = None @@ -21,8 +20,10 @@ def pytest_configure(config): # register the capabilities marker - config.addinivalue_line("markers", - "capabilities: mark test to use capabilities") + config.addinivalue_line( + "markers", + "capabilities: mark test to use capabilities" + ) @pytest.fixture @@ -38,9 +39,9 @@ metafunc.parametrize("capabilities", marker.args, ids=None) -# Ensure that the event loop is restarted once per session rather than the default of once per test -# if we don't do this, tests will try to reuse a closed event loop and fail with an error that the "future -# belongs to a different loop" +# Ensure that the event loop is restarted once per session rather than the default +# of once per test. If we don't do this, tests will try to reuse a closed event +# loop and fail with an error that the "future belongs to a different loop". @pytest.fixture(scope="session") def event_loop(): """Change event_loop fixture to session level.""" @@ -50,55 +51,6 @@ @pytest.fixture -def add_event_listeners(session): - """Register listeners for tracked events on element.""" - def add_event_listeners(element, tracked_events): - element.session.execute_script(""" - let element = arguments[0]; - let trackedEvents = arguments[1]; - - if (!("events" in window)) { - window.events = []; - } - - for (var i = 0; i < trackedEvents.length; i++) { - element.addEventListener(trackedEvents[i], function (event) { - window.events.push(event.type); - }); - } - """, args=(element, tracked_events)) - return add_event_listeners - - -@pytest.fixture -def create_cookie(session, url): - """Create a cookie""" - def create_cookie(name, value, **kwargs): - if kwargs.get("path", None) is not None: - session.url = url(kwargs["path"]) - - session.set_cookie(name, value, **kwargs) - return session.cookies(name) - - return create_cookie - - -@pytest.fixture -def create_frame(session): - """Create an `iframe` element in the current browsing context and insert it - into the document. Return a reference to the newly-created element.""" - def create_frame(): - append = """ - var frame = document.createElement('iframe'); - document.body.appendChild(frame); - return frame; - """ - return session.execute_script(append) - - return create_frame - - -@pytest.fixture def http(configuration): return HTTPRequest(configuration["host"], configuration["port"]) @@ -122,14 +74,14 @@ } -async def reset_current_session_if_necessary(caps, request_bidi): +async def reset_current_session_if_necessary(caps): global _current_session - # If there is a session with different capabilities active or the current session - # is of different type than the one we would like to create, end it now. + # If there is a session with different requested capabilities active than + # the one we would like to create, end it now. if _current_session is not None: - is_bidi = isinstance(_current_session, webdriver.BidiSession) - if is_bidi != request_bidi or not _current_session.match(caps): + if not _current_session.match(caps): + is_bidi = isinstance(_current_session, webdriver.BidiSession) if is_bidi: await _current_session.end() else: @@ -144,7 +96,8 @@ By default the session will stay open after each test, but we always try to start a new one and assume that if that fails there is already a valid session. This makes it possible to recover from some errors that might leave the session in a bad state, but - does not demand that we start a new session per test.""" + does not demand that we start a new session per test. + """ global _current_session # Update configuration capabilities with custom ones from the @@ -153,7 +106,7 @@ deep_update(caps, capabilities) caps = {"alwaysMatch": caps} - await reset_current_session_if_necessary(caps, False) + await reset_current_session_if_necessary(caps) if _current_session is None: _current_session = webdriver.Session( @@ -179,21 +132,25 @@ @pytest.fixture(scope="function") async def bidi_session(capabilities, configuration, request): - """Create and start a bidi session for a test that does not itself test - bidi session creation. + """Create and start a bidi session. + + Can be used for a test that does not itself test bidi session creation. + By default the session will stay open after each test, but we always try to start a new one and assume that if that fails there is already a valid session. This makes it possible to recover from some errors that might leave the session in a bad state, but - does not demand that we start a new session per test.""" + does not demand that we start a new session per test. + """ global _current_session # Update configuration capabilities with custom ones from the # capabilities fixture, which can be set by tests caps = copy.deepcopy(configuration["capabilities"]) + caps.update({"webSocketUrl": True}) deep_update(caps, capabilities) caps = {"alwaysMatch": caps} - await reset_current_session_if_necessary(caps, True) + await reset_current_session_if_necessary(caps) if _current_session is None: _current_session = webdriver.Session( @@ -236,93 +193,8 @@ @pytest.fixture -def create_dialog(session): - """Create a dialog (one of "alert", "prompt", or "confirm") and provide a - function to validate that the dialog has been "handled" (either accepted or - dismissed) by returning some value.""" - - def create_dialog(dialog_type, text=None): - assert dialog_type in ("alert", "confirm", "prompt"), ( - "Invalid dialog type: '%s'" % dialog_type) - - if text is None: - text = "" - - assert isinstance(text, str), "`text` parameter must be a string" - - # Script completes itself when the user prompt has been opened. - # For prompt() dialogs, add a value for the 'default' argument, - # as some user agents (IE, for example) do not produce consistent - # values for the default. - session.execute_async_script(""" - let dialog_type = arguments[0]; - let text = arguments[1]; - - setTimeout(function() { - if (dialog_type == 'prompt') { - window.dialog_return_value = window[dialog_type](text, ''); - } else { - window.dialog_return_value = window[dialog_type](text); - } - }, 0); - """, args=(dialog_type, text)) - - wait = Poll( - session, - timeout=15, - ignored_exceptions=webdriver.NoSuchAlertException, - message="No user prompt with text '{}' detected".format(text)) - wait.until(lambda s: s.alert.text == text) - - return create_dialog - - -@pytest.fixture -def closed_frame(session, url): - original_handle = session.window_handle - new_handle = session.new_window() - - session.window_handle = new_handle - - session.url = url("/webdriver/tests/support/html/frames.html") - - subframe = session.find.css("#sub-frame", all=False) - session.switch_frame(subframe) - - deleteframe = session.find.css("#delete-frame", all=False) - session.switch_frame(deleteframe) - - button = session.find.css("#remove-parent", all=False) - button.click() - - yield - - session.window.close() - assert new_handle not in session.handles, "Unable to close window {}".format(new_handle) - - session.window_handle = original_handle - - -@pytest.fixture -def closed_window(session, inline): - original_handle = session.window_handle - new_handle = session.new_window() - - session.window_handle = new_handle - session.url = inline("<input id='a' value='b'>") - element = session.find.css("input", all=False) - - session.window.close() - assert new_handle not in session.handles, "Unable to close window {}".format(new_handle) - - yield (original_handle, element) - - session.window_handle = original_handle - - -@pytest.fixture def inline(url): - """Takes a source extract and produces well-formed documents. + """Take a source extract and produces well-formed documents. Based on the desired document type, the extract is embedded with predefined boilerplate in order to produce well-formed documents. @@ -350,7 +222,7 @@ @pytest.fixture def iframe(inline): - """Inlines document extract as the source document of an <iframe>.""" + """Inline document extract as the source document of an <iframe>.""" def iframe(src, **kwargs): return "<iframe src='{}'></iframe>".format(inline(src, **kwargs))
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/support/fixtures_bidi.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/support/fixtures_bidi.py new file mode 100644 index 0000000..cdfa3a0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/support/fixtures_bidi.py
@@ -0,0 +1,14 @@ +import asyncio +from typing import Any, Mapping + +import pytest +import webdriver + + +@pytest.fixture +def send_blocking_command(bidi_session): + """Send a blocking command that awaits until the BiDi response has been received.""" + async def send_blocking_command(command: str, params: Mapping[str, Any]) -> Mapping[str, Any]: + future_response = await bidi_session.send_command(command, params) + return await future_response + return send_blocking_command
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/support/fixtures_http.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/support/fixtures_http.py new file mode 100644 index 0000000..2d961d7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/support/fixtures_http.py
@@ -0,0 +1,152 @@ +import pytest +from webdriver.error import NoSuchAlertException + +from tests.support.sync import Poll + + +@pytest.fixture +def add_event_listeners(session): + """Register listeners for tracked events on element.""" + def add_event_listeners(element, tracked_events): + element.session.execute_script(""" + let element = arguments[0]; + let trackedEvents = arguments[1]; + + if (!("events" in window)) { + window.events = []; + } + + for (var i = 0; i < trackedEvents.length; i++) { + element.addEventListener(trackedEvents[i], function (event) { + window.events.push(event.type); + }); + } + """, args=(element, tracked_events)) + return add_event_listeners + + +@pytest.fixture +def closed_frame(session, url): + """Create a frame and remove it after switching to it. + + The removed frame will be kept selected, which allows to test for invalid + browsing context references. + """ + original_handle = session.window_handle + new_handle = session.new_window() + + session.window_handle = new_handle + + session.url = url("/webdriver/tests/support/html/frames.html") + + subframe = session.find.css("#sub-frame", all=False) + session.switch_frame(subframe) + + deleteframe = session.find.css("#delete-frame", all=False) + session.switch_frame(deleteframe) + + button = session.find.css("#remove-parent", all=False) + button.click() + + yield + + session.window.close() + assert new_handle not in session.handles, "Unable to close window {}".format(new_handle) + + session.window_handle = original_handle + + +@pytest.fixture +def closed_window(session, inline): + """Create a window and close it immediately. + + The window handle will be kept selected, which allows to test for invalid + top-level browsing context references. + """ + original_handle = session.window_handle + new_handle = session.new_window() + + session.window_handle = new_handle + session.url = inline("<input id='a' value='b'>") + element = session.find.css("input", all=False) + + session.window.close() + assert new_handle not in session.handles, "Unable to close window {}".format(new_handle) + + yield (original_handle, element) + + session.window_handle = original_handle + + +@pytest.fixture +def create_cookie(session, url): + """Create a cookie.""" + def create_cookie(name, value, **kwargs): + if kwargs.get("path", None) is not None: + session.url = url(kwargs["path"]) + + session.set_cookie(name, value, **kwargs) + return session.cookies(name) + + return create_cookie + + +@pytest.fixture +def create_dialog(session): + """Create a dialog (one of "alert", "prompt", or "confirm"). + + Also it provides a function to validate that the dialog has been "handled" + (either accepted or dismissed) by returning some value. + """ + def create_dialog(dialog_type, text=None): + assert dialog_type in ("alert", "confirm", "prompt"), ( + "Invalid dialog type: '%s'" % dialog_type) + + if text is None: + text = "" + + assert isinstance(text, str), "`text` parameter must be a string" + + # Script completes itself when the user prompt has been opened. + # For prompt() dialogs, add a value for the 'default' argument, + # as some user agents (IE, for example) do not produce consistent + # values for the default. + session.execute_async_script(""" + let dialog_type = arguments[0]; + let text = arguments[1]; + + setTimeout(function() { + if (dialog_type == 'prompt') { + window.dialog_return_value = window[dialog_type](text, ''); + } else { + window.dialog_return_value = window[dialog_type](text); + } + }, 0); + """, args=(dialog_type, text)) + + wait = Poll( + session, + timeout=15, + ignored_exceptions=NoSuchAlertException, + message="No user prompt with text '{}' detected".format(text)) + wait.until(lambda s: s.alert.text == text) + + return create_dialog + + +@pytest.fixture +def create_frame(session): + """Create an `iframe` element. + + The element will be inserted into the document of the current browsing + context. Return a reference to the newly-created element. + """ + def create_frame(): + append = """ + var frame = document.createElement('iframe'); + document.body.appendChild(frame); + return frame; + """ + return session.execute_script(append) + + return create_frame
diff --git a/third_party/blink/web_tests/fast/css/inline-outline-with-border-radius-big-neg-offset-expected.png b/third_party/blink/web_tests/fast/css/inline-outline-with-border-radius-big-neg-offset-expected.png new file mode 100644 index 0000000..22507793 --- /dev/null +++ b/third_party/blink/web_tests/fast/css/inline-outline-with-border-radius-big-neg-offset-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/fast/css/inline-outline-with-border-radius-big-neg-offset.html b/third_party/blink/web_tests/fast/css/inline-outline-with-border-radius-big-neg-offset.html new file mode 100644 index 0000000..e627e5c --- /dev/null +++ b/third_party/blink/web_tests/fast/css/inline-outline-with-border-radius-big-neg-offset.html
@@ -0,0 +1,25 @@ +<!DOCTYPE html> +<style> +div { + display: inline-block; + text-align: center; + width: 150px; + margin: 30px 0; +} +span { + outline: 30px solid green; + outline-offset: -30px; + border-radius: 10px; + font-size: 40px; + font-family: ahem; + color: yellow; +} +</style> +<div><span>A<br>ABC<br>AB</span></div> +<div><span style="outline-style: double">A<br>ABC<br>AB</span></div> +<div><span style="outline-style: dashed">A<br>ABC<br>AB</span></div> +<div><span style="outline-style: dotted">A<br>ABC<br>AB</span></div> +<div><span style="outline-style: groove">A<br>ABC<br>AB</span></div> +<div><span style="outline-style: ridge">A<br>ABC<br>AB</span></div> +<div><span style="outline-style: inset">A<br>ABC<br>AB</span></div> +<div><span style="outline-style: outset">A<br>ABC<br>AB</span></div>
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/fast/css/inline-outline-with-border-radius-big-neg-offset-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/fast/css/inline-outline-with-border-radius-big-neg-offset-expected.png new file mode 100644 index 0000000..fe6b4a9 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/highdpi/fast/css/inline-outline-with-border-radius-big-neg-offset-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/request-will-be-sent-extra-info-connect-timing-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/network/request-will-be-sent-extra-info-connect-timing-expected.txt new file mode 100644 index 0000000..ffbc4255 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/request-will-be-sent-extra-info-connect-timing-expected.txt
@@ -0,0 +1,5 @@ +Tests that connectTiming is reported on requestWillBeSentExtraInfo. +Network Enabled +"connectTiming" in event.params: true +connectTiming.requestTime == requestTiming.requestTime: true +
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/request-will-be-sent-extra-info-connect-timing.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/request-will-be-sent-extra-info-connect-timing.js new file mode 100644 index 0000000..4814b55 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/request-will-be-sent-extra-info-connect-timing.js
@@ -0,0 +1,25 @@ +(async function(testRunner) { + const {page, session, dp} = await testRunner.startBlank( + `Tests that connectTiming is reported on requestWillBeSentExtraInfo.`); + + await dp.Network.enable(); + testRunner.log('Network Enabled'); + + let requestWillBeSentExtraInfoCallback; + const requestWillBeSentExtraInfoPromise = new Promise(resolve => requestWillBeSentExtraInfoCallback = resolve); + let connectTiming; + + dp.Network.onRequestWillBeSentExtraInfo(event => { + testRunner.log(`"connectTiming" in event.params: ${"connectTiming" in event.params}`); + connectTiming = event.params.connectTiming; + requestWillBeSentExtraInfoCallback(); + }); + + await session.evaluate(`fetch('index.html');`); + + await requestWillBeSentExtraInfoPromise; + const responseReceived = (await dp.Network.onceResponseReceived()).params; + const requestTiming = responseReceived.response.timing; + testRunner.log(`connectTiming.requestTime == requestTiming.requestTime: ${connectTiming.requestTime == requestTiming.requestTime}`); + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/platform/mac-mac-arm11.0/external/wpt/payment-request/show-consume-activation.https-expected.txt b/third_party/blink/web_tests/platform/mac-mac-arm11.0/external/wpt/payment-request/show-consume-activation.https-expected.txt new file mode 100644 index 0000000..6ce29124 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac-arm11.0/external/wpt/payment-request/show-consume-activation.https-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +FAIL Calling share consumes user activation promise_rejects_dom: function "function() { throw e }" threw object "UnknownError: Renderer process could not establish or lost IPC connection to the PaymentRequest service in the browser process." that is not a DOMException NotAllowedError: property "name" is equal to "UnknownError", expected "NotAllowedError" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/printing/page-font-family.html b/third_party/blink/web_tests/printing/page-font-family.html new file mode 100644 index 0000000..38ecf37 --- /dev/null +++ b/third_party/blink/web_tests/printing/page-font-family.html
@@ -0,0 +1,20 @@ +<!doctype html> +<title>Serialization of internals.pageProperty('font-family', ...).</title> +<link rel="help" href="https://tc39.github.io/ecma262/#sec-boolean-literals"> +<link rel="help" href="https://drafts.csswg.org/cssom/#serialize-a-comma-separated-list"> +<link rel="help" href="https://drafts.csswg.org/cssom/#serialize-a-string"> +<link rel="help" href="https://drafts.csswg.org/cssom/#serialize-an-identifier"> +<script src="../resources/testharness.js"></script> +<script src="../resources/testharnessreport.js"></script> +<style> + @page { font-family: cursive,fantasy,monospace,sans-serif,serif,UnquotedFont,"QuotedFont\","; } +</style> +</head> +<script> + 'use strict'; + test(() => { + assert_own_property(window, "internals", "window.internals is available"); + assert_equals(internals.pageProperty('font-family', 0), + `cursive, fantasy, monospace, sans-serif, serif, UnquotedFont, "QuotedFont\\","`); + }, `<generic-family> keywords, unquoted <family-name> and quoted <family-name> with special characters.`); +</script>
diff --git a/third_party/crashpad/README.chromium b/third_party/crashpad/README.chromium index f8827cf5..750ff97 100644 --- a/third_party/crashpad/README.chromium +++ b/third_party/crashpad/README.chromium
@@ -2,7 +2,7 @@ Short Name: crashpad URL: https://crashpad.chromium.org/ Version: unknown -Revision: b8a16857735ba8e6464696362625bf54938417d7 +Revision: 3676b715cf3acc4edeb61e113a1e7983573c75ca License: Apache 2.0 License File: crashpad/LICENSE Security Critical: yes
diff --git a/third_party/crashpad/crashpad/DEPS b/third_party/crashpad/crashpad/DEPS index 93c4912..2e20025 100644 --- a/third_party/crashpad/crashpad/DEPS +++ b/third_party/crashpad/crashpad/DEPS
@@ -34,15 +34,12 @@ 'crashpad/third_party/googletest/googletest': Var('chromium_git') + '/external/github.com/google/googletest@' + '11da093e0477185dbd78abaaa9f99db15be498d0', - 'crashpad/third_party/gyp/gyp': - Var('chromium_git') + '/external/gyp@' + - '8bee09f4a57807136593ddc906b0b213c21f9014', 'crashpad/third_party/lss/lss': Var('chromium_git') + '/linux-syscall-support.git@' + '7bde79cc274d06451bf65ae82c012a5d3e476b5a', 'crashpad/third_party/mini_chromium/mini_chromium': Var('chromium_git') + '/chromium/mini_chromium@' + - '9cdc2a7c8415bd880757d2f564edf363f0218fe1', + '8f7a60f2c637f2a3c5d25f320739b3de7c2e325d', 'crashpad/third_party/libfuzzer/src': Var('chromium_git') + '/chromium/llvm-project/compiler-rt/lib/fuzzer.git@' + 'fda403cf93ecb8792cb1d061564d89a6553ca020',
diff --git a/third_party/crashpad/crashpad/build/crashpad.gypi b/third_party/crashpad/crashpad/build/crashpad.gypi deleted file mode 100644 index 2accb5a..0000000 --- a/third_party/crashpad/crashpad/build/crashpad.gypi +++ /dev/null
@@ -1,45 +0,0 @@ -# Copyright 2015 The Crashpad Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -{ - 'variables': { - # When building as a part of Chromium, this variable sets up the build to - # treat Crashpad as Chromium code. This enables warnings at an appropriate - # level and applies Chromium’s build/filename_rules.gypi. In a standalone - # build, this variable has no effect. - 'chromium_code': 1, - }, - 'target_defaults': { - 'msvs_disabled_warnings': [ - 4201, # nonstandard extension used : nameless struct/union. - 4324, # structure was padded due to __declspec(align()). - ], - 'conditions': [ - ['OS=="linux" or OS=="android"', { - 'conditions': [ - ['clang==0', { - 'cflags': [ - '-Wno-multichar', - ], - }], - ], - }], - ['OS=="android"', { - 'ldflags': [ - '-static-libstdc++', - ], - }], - ], - }, -}
diff --git a/third_party/crashpad/crashpad/build/crashpad_buildconfig.gni b/third_party/crashpad/crashpad/build/crashpad_buildconfig.gni index 51b99c3..a9a8a102 100644 --- a/third_party/crashpad/crashpad/build/crashpad_buildconfig.gni +++ b/third_party/crashpad/crashpad/build/crashpad_buildconfig.gni
@@ -34,6 +34,29 @@ crashpad_is_external = crashpad_dependencies == "external" crashpad_is_standalone = crashpad_dependencies == "standalone" +# This is the parent directory that contains the mini_chromium source dir. +# This variable is not used when crashpad_is_in_chromium. +if (crashpad_is_external || crashpad_is_in_dart) { + # External and Dart SDK builds assume crashpad and mini_chromium are peers. + mini_chromium_source_parent = "../mini_chromium" +} else if (crashpad_is_in_fuchsia) { + mini_chromium_source_parent = "//third_party/crashpad/third_party/mini_chromium" +} else { + mini_chromium_source_parent = "../third_party/mini_chromium" +} + +# This is the source directory of mini_chromium (what is checked out). +_mini_chromium_source_root = "$mini_chromium_source_parent/mini_chromium" + +# This references the mini_chromium location for importing GN files. +if (crashpad_is_external || crashpad_is_in_dart) { + mini_chromium_import_root = "../../$_mini_chromium_source_root" +} else if (crashpad_is_in_fuchsia) { + mini_chromium_import_root = "//third_party/mini_chromium" +} else { + mini_chromium_import_root = _mini_chromium_source_root +} + if (crashpad_is_in_chromium) { crashpad_is_mac = is_mac crashpad_is_ios = is_ios @@ -46,16 +69,8 @@ crashpad_is_clang = is_clang } else { - # External and Dart SDK builds assume crashpad and mini_chromium are peers. - if (crashpad_is_external || crashpad_is_in_dart) { - import("../../../mini_chromium/mini_chromium/build/compiler.gni") - import("../../../mini_chromium/mini_chromium/build/platform.gni") - } else { - # Both standalone and in Fuchsia tree use mini_chromium, and it's mapped - # into the same location in both cases. - import("../third_party/mini_chromium/mini_chromium/build/compiler.gni") - import("../third_party/mini_chromium/mini_chromium/build/platform.gni") - } + import("$mini_chromium_import_root/build/compiler.gni") + crashpad_is_mac = mini_chromium_is_mac crashpad_is_ios = mini_chromium_is_ios crashpad_is_win = mini_chromium_is_win
diff --git a/third_party/crashpad/crashpad/build/crashpad_dependencies.gypi b/third_party/crashpad/crashpad/build/crashpad_dependencies.gypi deleted file mode 100644 index 5bae11a..0000000 --- a/third_party/crashpad/crashpad/build/crashpad_dependencies.gypi +++ /dev/null
@@ -1,41 +0,0 @@ -# Copyright 2015 The Crashpad Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -{ - # Crashpad’s GYP build can obtain dependencies in two different ways, directed - # by the crashpad_standalone GYP variable. It may have these values: - # standalone - # A “standalone” Crashpad build, where the dependencies are in the - # Crashpad tree. third_party/mini_chromium and third_party/googletest - # provide the base and Google Test libraries. - # external - # A build with external dependencies. mini_chromium provides the base - # library, but it’s located outside of the Crashpad tree, as is Google - # Test. - # - # In order for Crashpad’s .gyp files to reference the correct versions - # depending on how dependencies are being provided, include this .gypi file - # and reference the crashpad_dependencies variable. - # - # Note that Crashpad’s in-Chromium build uses GN instead of GYP, and - # Chromium’s GN build configures Crashpad to use Chromium’s own base library - # and its copy of the Google Test library. - - 'variables': { - # When with external dependencies, build/gyp_crashpad.py sets - # crashpad_dependencies to "external", and this % assignment will not - # override it. - 'crashpad_dependencies%': 'standalone', - }, -}
diff --git a/third_party/crashpad/crashpad/build/gyp_crashpad.py b/third_party/crashpad/crashpad/build/gyp_crashpad.py deleted file mode 100755 index 41ab4b9..0000000 --- a/third_party/crashpad/crashpad/build/gyp_crashpad.py +++ /dev/null
@@ -1,102 +0,0 @@ -#!/usr/bin/env python - -# Copyright 2014 The Crashpad Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os -import sys - - -def ChooseDependencyPath(local_path, external_path): - """Chooses between a dependency located at local path and an external path. - - The local path, used in standalone builds, is preferred. If it is not - present but the external path is, the external path will be used. If neither - path is present, the local path will be used, so that error messages - uniformly refer to the local path. - - Args: - local_path: The preferred local path to use for a standalone build. - external_path: The external path to fall back to. - - Returns: - A 2-tuple. The first element is None or 'external', depending on whether - local_path or external_path was chosen. The second element is the chosen - path. - """ - if os.path.exists(local_path) or not os.path.exists(external_path): - return (None, local_path) - return ('external', external_path) - - -script_dir = os.path.dirname(__file__) -crashpad_dir = (os.path.dirname(script_dir) - if script_dir not in ('', os.curdir) else os.pardir) - -sys.path.insert( - 0, - ChooseDependencyPath( - os.path.join(crashpad_dir, 'third_party', 'gyp', 'gyp', 'pylib'), - os.path.join(crashpad_dir, os.pardir, os.pardir, 'gyp', 'pylib'))[1]) - -import gyp - - -def main(args): - if 'GYP_GENERATORS' not in os.environ: - os.environ['GYP_GENERATORS'] = 'ninja' - - crashpad_dir_or_dot = crashpad_dir if crashpad_dir is not '' else os.curdir - - (dependencies, mini_chromium_common_gypi) = (ChooseDependencyPath( - os.path.join(crashpad_dir, 'third_party', 'mini_chromium', - 'mini_chromium', 'build', 'common.gypi'), - os.path.join(crashpad_dir, os.pardir, os.pardir, 'mini_chromium', - 'mini_chromium', 'build', 'common.gypi'))) - if dependencies is not None: - args.extend(['-D', 'crashpad_dependencies=%s' % dependencies]) - args.extend(['--include', mini_chromium_common_gypi]) - args.extend(['--depth', crashpad_dir_or_dot]) - args.append(os.path.join(crashpad_dir, 'crashpad.gyp')) - - result = gyp.main(args) - if result != 0: - return result - - if sys.platform == 'win32': - # Check to make sure that no target_arch was specified. target_arch may - # be set during a cross build, such as a cross build for Android. - has_target_arch = False - for arg_index in range(0, len(args)): - arg = args[arg_index] - if (arg.startswith('-Dtarget_arch=') or - (arg == '-D' and arg_index + 1 < len(args) and - args[arg_index + 1].startswith('target_arch='))): - has_target_arch = True - break - - if not has_target_arch: - # Also generate the x86 build. - result = gyp.main(args + - ['-D', 'target_arch=ia32', '-G', 'config=Debug']) - if result != 0: - return result - result = gyp.main( - args + ['-D', 'target_arch=ia32', '-G', 'config=Release']) - - return result - - -if __name__ == '__main__': - sys.exit(main(sys.argv[1:]))
diff --git a/third_party/crashpad/crashpad/build/gyp_crashpad_android.py b/third_party/crashpad/crashpad/build/gyp_crashpad_android.py deleted file mode 100755 index baeadf90..0000000 --- a/third_party/crashpad/crashpad/build/gyp_crashpad_android.py +++ /dev/null
@@ -1,80 +0,0 @@ -#!/usr/bin/env python - -# Copyright 2017 The Crashpad Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import argparse -import glob -import gyp_crashpad -import os -import re -import subprocess -import sys - - -def main(args): - parser = argparse.ArgumentParser( - description='Set up an Android cross build', - epilog='Additional arguments will be passed to gyp_crashpad.py.') - parser.add_argument('--arch', required=True, help='Target architecture') - parser.add_argument('--api-level', required=True, help='Target API level') - parser.add_argument('--ndk', required=True, help='Standalone NDK toolchain') - (parsed, extra_command_line_args) = parser.parse_known_args(args) - - SYS_PLATFORM_TO_NDK_HOST_ARCH = { - 'cygwin': 'windows-x86_64', - 'darwin': 'darwin-x86_64', - 'linux': 'linux-x86_64', - 'linux2': 'linux-x86_64', - 'darwin': 'darwin-x86_64', - 'win32': 'windows-x86_64', - } - - ndk_host_arch = SYS_PLATFORM_TO_NDK_HOST_ARCH[sys.platform] - - ndk_bin_dir = os.path.join(parsed.ndk, 'toolchains', 'llvm', 'prebuilt', - ndk_host_arch, 'bin') - if not os.path.exists(ndk_bin_dir): - parser.error("missing toolchain") - - ARCH_TO_ARCH_TRIPLET = { - 'arm': 'armv7a-linux-androideabi', - 'arm64': 'aarch64-linux-android', - 'ia32': 'i686-linux-android', - 'x64': 'x86_64-linux-android', - } - - clang_prefix = ARCH_TO_ARCH_TRIPLET[parsed.arch] + parsed.api_level - os.environ['CC_target'] = os.path.join(ndk_bin_dir, clang_prefix + '-clang') - os.environ['CXX_target'] = os.path.join(ndk_bin_dir, - clang_prefix + '-clang++') - - extra_args = ['-D', 'android_api_level=' + parsed.api_level] - - # ARM only includes 'v7a' in the tool prefix for clang - tool_prefix = ('arm-linux-androideabi' if parsed.arch == 'arm' else - ARCH_TO_ARCH_TRIPLET[parsed.arch]) - - for tool in ('ar', 'nm', 'readelf'): - os.environ['%s_target' % tool.upper()] = (os.path.join( - ndk_bin_dir, '%s-%s' % (tool_prefix, tool))) - - return gyp_crashpad.main([ - '-D', 'OS=android', '-D', - 'target_arch=%s' % parsed.arch, '-D', 'clang=1', '-f', 'ninja-android' - ] + extra_args + extra_command_line_args) - - -if __name__ == '__main__': - sys.exit(main(sys.argv[1:]))
diff --git a/third_party/crashpad/crashpad/client/BUILD.gn b/third_party/crashpad/crashpad/client/BUILD.gn index a53ac46..5c18c6b 100644 --- a/third_party/crashpad/crashpad/client/BUILD.gn +++ b/third_party/crashpad/crashpad/client/BUILD.gn
@@ -33,6 +33,10 @@ if (crashpad_is_ios) { sources += [ "crashpad_client_ios.cc", + "ios_handler/exception_processor.h", + "ios_handler/exception_processor.mm", + "ios_handler/in_process_intermediate_dump_handler.cc", + "ios_handler/in_process_intermediate_dump_handler.h", "simulate_crash_ios.h", ] } @@ -66,13 +70,13 @@ public_deps = [ ":common", - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", "../util", ] deps = [ ":common", - "../third_party/mini_chromium:chromeos_buildflags", + "$mini_chromium_source_parent:chromeos_buildflags", ] if (crashpad_is_win) { @@ -132,7 +136,7 @@ public_configs = [ "..:crashpad_config" ] public_deps = [ - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", "../util", ] deps = [ "../util" ] @@ -160,13 +164,10 @@ } if (crashpad_is_ios) { - sources += [ "crashpad_client_ios_test.mm" ] - sources -= [ - "annotation_list_test.cc", - "annotation_test.cc", - "crash_report_database_test.cc", - "prune_crash_reports_test.cc", - "settings_test.cc", + sources += [ + "crashpad_client_ios_test.mm", + "ios_handler/exception_processor_test.mm", + "ios_handler/in_process_intermediate_dump_handler_test.cc", ] } @@ -176,12 +177,12 @@ deps = [ ":client", + "$mini_chromium_source_parent:base", "../compat", "../snapshot", "../test", "../third_party/googletest:googlemock", "../third_party/googletest:googletest", - "../third_party/mini_chromium:base", "../util", ]
diff --git a/third_party/crashpad/crashpad/client/annotation.h b/third_party/crashpad/crashpad/client/annotation.h index ddfe8f64..edb963c2 100644 --- a/third_party/crashpad/crashpad/client/annotation.h +++ b/third_party/crashpad/crashpad/client/annotation.h
@@ -29,7 +29,11 @@ #include "build/build_config.h" namespace crashpad { - +#if defined(OS_IOS) +namespace internal { +class InProcessIntermediateDumpHandler; +} // namespace internal +#endif class AnnotationList; //! \brief Base class for an annotation, which records a name-value pair of @@ -167,6 +171,9 @@ protected: friend class AnnotationList; +#if defined(OS_IOS) + friend class internal::InProcessIntermediateDumpHandler; +#endif std::atomic<Annotation*>& link_node() { return link_node_; }
diff --git a/third_party/crashpad/crashpad/client/annotation_list.h b/third_party/crashpad/crashpad/client/annotation_list.h index 9485c46c..0b80768 100644 --- a/third_party/crashpad/crashpad/client/annotation_list.h +++ b/third_party/crashpad/crashpad/client/annotation_list.h
@@ -16,9 +16,15 @@ #define CRASHPAD_CLIENT_ANNOTATION_LIST_H_ #include "base/macros.h" +#include "build/build_config.h" #include "client/annotation.h" namespace crashpad { +#if defined(OS_IOS) +namespace internal { +class InProcessIntermediateDumpHandler; +} // namespace internal +#endif //! \brief A list that contains all the currently set annotations. //! @@ -77,6 +83,17 @@ //! \brief Returns an iterator past the last element of the annotation list. Iterator end(); + protected: +#if defined(OS_IOS) + friend class internal::InProcessIntermediateDumpHandler; +#endif + + //! \brief Returns a pointer to the tail node. + const Annotation* tail_pointer() const { return tail_pointer_; } + + //! \brief Returns a pointer to the head element. + const Annotation* head() const { return &head_; } + private: // To make it easier for the handler to locate the dummy tail node, store the // pointer. Placed first for packing.
diff --git a/third_party/crashpad/crashpad/client/client.gyp b/third_party/crashpad/crashpad/client/client.gyp deleted file mode 100644 index dcb2d0e..0000000 --- a/third_party/crashpad/crashpad/client/client.gyp +++ /dev/null
@@ -1,91 +0,0 @@ -# Copyright 2014 The Crashpad Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -{ - 'includes': [ - '../build/crashpad.gypi', - ], - 'targets': [ - { - 'target_name': 'crashpad_client', - 'type': 'static_library', - 'dependencies': [ - '../compat/compat.gyp:crashpad_compat', - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../third_party/lss/lss.gyp:lss', - '../util/util.gyp:crashpad_util', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - 'annotation.cc', - 'annotation.h', - 'annotation_list.cc', - 'annotation_list.h', - 'crash_report_database.cc', - 'crash_report_database.h', - 'crash_report_database_mac.mm', - 'crash_report_database_win.cc', - 'crashpad_client.h', - 'crashpad_client_linux.cc', - 'crashpad_client_mac.cc', - 'crashpad_client_win.cc', - 'crashpad_info.cc', - 'crashpad_info.h', - 'prune_crash_reports.cc', - 'prune_crash_reports.h', - 'settings.cc', - 'settings.h', - 'simple_string_dictionary.h', - 'simple_address_range_bag.h', - 'simulate_crash.h', - 'simulate_crash_linux.h', - 'simulate_crash_mac.cc', - 'simulate_crash_mac.h', - 'simulate_crash_win.h', - ], - 'conditions': [ - ['OS=="win"', { - 'link_settings': { - 'libraries': [ - '-lrpcrt4.lib', - ], - }, - }], - ['OS=="linux" or OS=="android"', { - 'sources': [ - 'client_argv_handling.cc', - 'client_argv_handling.h', - 'crashpad_info_note.S', - 'crash_report_database_generic.cc', - ], - }], - ], - 'target_conditions': [ - ['OS=="android"', { - 'sources/': [ - ['include', '^crashpad_client_linux\\.cc$'], - ['include', '^simulate_crash_linux\\.h$'], - ], - }], - ], - 'direct_dependent_settings': { - 'include_dirs': [ - '..', - ], - }, - }, - ], -}
diff --git a/third_party/crashpad/crashpad/client/client_test.gyp b/third_party/crashpad/crashpad/client/client_test.gyp deleted file mode 100644 index fefb8fc..0000000 --- a/third_party/crashpad/crashpad/client/client_test.gyp +++ /dev/null
@@ -1,66 +0,0 @@ -# Copyright 2014 The Crashpad Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -{ - 'includes': [ - '../build/crashpad.gypi', - ], - 'targets': [ - { - 'target_name': 'crashpad_client_test', - 'type': 'executable', - 'dependencies': [ - 'client.gyp:crashpad_client', - '../compat/compat.gyp:crashpad_compat', - '../handler/handler.gyp:crashpad_handler', - '../snapshot/snapshot.gyp:crashpad_snapshot', - '../test/test.gyp:crashpad_googlemock_main', - '../test/test.gyp:crashpad_test', - '../third_party/googletest/googlemock.gyp:googlemock', - '../third_party/googletest/googletest.gyp:googletest', - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../util/util.gyp:crashpad_util', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - 'annotation_test.cc', - 'annotation_list_test.cc', - 'crash_report_database_test.cc', - 'crashpad_client_win_test.cc', - 'crashpad_client_linux_test.cc', - 'prune_crash_reports_test.cc', - 'settings_test.cc', - 'simple_address_range_bag_test.cc', - 'simple_string_dictionary_test.cc', - 'simulate_crash_mac_test.cc', - ], - 'conditions': [ - ['OS=="win"', { - 'dependencies': [ - '../handler/handler.gyp:crashpad_handler_console', - ], - }], - ], - 'target_conditions': [ - ['OS=="android"', { - 'sources/': [ - ['include', '^crashpad_client_linux_test\\.cc$'], - ], - }], - ], - }, - ], -}
diff --git a/third_party/crashpad/crashpad/client/crashpad_client_ios.cc b/third_party/crashpad/crashpad/client/crashpad_client_ios.cc index a8ef224..f53a6d5c 100644 --- a/third_party/crashpad/crashpad/client/crashpad_client_ios.cc +++ b/third_party/crashpad/crashpad/client/crashpad_client_ios.cc
@@ -22,7 +22,7 @@ #include "base/logging.h" #include "base/mac/mach_logging.h" #include "base/mac/scoped_mach_port.h" -#include "util/ios/exception_processor.h" +#include "client/ios_handler/exception_processor.h" #include "util/ios/ios_system_data_collector.h" #include "util/mach/exc_server_variants.h" #include "util/mach/exception_ports.h" @@ -38,7 +38,9 @@ namespace { // A base class for signal handler and Mach exception server. -class CrashHandler : public Thread, public UniversalMachExcServer::Interface { +class CrashHandler : public Thread, + public UniversalMachExcServer::Interface, + public ObjcExceptionDelegate { public: static CrashHandler* Get() { static CrashHandler* instance = new CrashHandler(); @@ -188,6 +190,26 @@ Signals::RestoreHandlerAndReraiseSignalOnReturn(siginfo, &old_action_); } + void HandleUncaughtNSException(const uint64_t* frames, + const size_t num_frames) override { + // TODO(justincohen): Call into in_process_handler. + + // After uncaught exceptions are reported, the system immediately triggers a + // call to std::terminate()/abort(). Remove the abort handler so a second + // dump isn't generated. + CHECK(Signals::InstallDefaultHandler(SIGABRT)); + } + + void HandleUncaughtNSExceptionWithContext( + NativeCPUContext* context) override { + // TODO(justincohen): Call into in_process_handler. + + // After uncaught exceptions are reported, the system immediately triggers a + // call to std::terminate()/abort(). Remove the abort handler so a second + // dump isn't generated. + CHECK(Signals::InstallDefaultHandler(SIGABRT)); + } + base::mac::ScopedMachReceiveRight exception_port_; ExceptionPorts::ExceptionHandlerVector original_handlers_; struct sigaction old_action_ = {}; @@ -208,10 +230,10 @@ const base::FilePath& database, const std::string& url, const std::map<std::string, std::string>& annotations) { - InstallObjcExceptionPreprocessor(); CrashHandler* crash_handler = CrashHandler::Get(); DCHECK(crash_handler); + InstallObjcExceptionPreprocessor(crash_handler); crash_handler->Initialize(); }
diff --git a/third_party/crashpad/crashpad/client/crashpad_client_linux_test.cc b/third_party/crashpad/crashpad/client/crashpad_client_linux_test.cc index 1922651..0153355 100644 --- a/third_party/crashpad/crashpad/client/crashpad_client_linux_test.cc +++ b/third_party/crashpad/crashpad/client/crashpad_client_linux_test.cc
@@ -201,12 +201,10 @@ case CrashType::kBuiltinTrap: __builtin_trap(); - break; case CrashType::kInfiniteRecursion: int val = 42; exit(RecurseInfinitely(&val)); - break; } }
diff --git a/third_party/crashpad/crashpad/client/crashpad_info.h b/third_party/crashpad/crashpad/client/crashpad_info.h index ed7b9c1..62efc10 100644 --- a/third_party/crashpad/crashpad/client/crashpad_info.h +++ b/third_party/crashpad/crashpad/client/crashpad_info.h
@@ -32,6 +32,10 @@ namespace internal { +#if defined(OS_IOS) +class InProcessIntermediateDumpHandler; +#endif + //! \brief A linked list of blocks representing custom streams in the minidump, //! with addresses (and size) stored as uint64_t to simplify reading from //! the handler process. @@ -223,6 +227,15 @@ kSignature = 'CPad', }; + protected: +#if defined(OS_IOS) + friend class internal::InProcessIntermediateDumpHandler; +#endif + + uint32_t signature() const { return signature_; } + uint32_t version() const { return version_; } + uint32_t size() const { return size_; } + private: // The compiler won’t necessarily see anyone using these fields, but it // shouldn’t warn about that. These fields aren’t intended for use by the
diff --git a/third_party/crashpad/crashpad/util/ios/exception_processor.h b/third_party/crashpad/crashpad/client/ios_handler/exception_processor.h similarity index 60% rename from third_party/crashpad/crashpad/util/ios/exception_processor.h rename to third_party/crashpad/crashpad/client/ios_handler/exception_processor.h index 76a8c8b3..7318e21 100644 --- a/third_party/crashpad/crashpad/util/ios/exception_processor.h +++ b/third_party/crashpad/crashpad/client/ios_handler/exception_processor.h
@@ -15,8 +15,35 @@ #ifndef CRASHPAD_UTIL_IOS_EXCEPTION_PROCESSOR_H_ #define CRASHPAD_UTIL_IOS_EXCEPTION_PROCESSOR_H_ +#include <vector> + +#include "util/misc/capture_context.h" + namespace crashpad { +//! \brief An interface for notifying the CrashpadClient of NSExceptions. +class ObjcExceptionDelegate { + public: + //! \brief The exception processor detected an exception as it was thrown and + //! captured the cpu context. + //! + //! \param context The cpu context of the thread throwing an exception. + virtual void HandleUncaughtNSExceptionWithContext( + NativeCPUContext* context) = 0; + + //! \brief The exception processor did not detect the exception as it was + //! thrown, and instead caught the exception via the + //! NSUncaughtExceptionHandler. + //! + //! \param frames An array of call stack frame addresses. + //! \param num_frames The number of frames in |frames|. + virtual void HandleUncaughtNSException(const uint64_t* frames, + const size_t num_frames) = 0; + + protected: + ~ObjcExceptionDelegate() {} +}; + //! \brief Installs the Objective-C exception preprocessor. //! //! When code raises an Objective-C exception, unwind the stack looking for @@ -30,7 +57,7 @@ //! //! This should be installed at the same time the CrashpadClient installs the //! signal handler. It should only be installed once. -void InstallObjcExceptionPreprocessor(); +void InstallObjcExceptionPreprocessor(ObjcExceptionDelegate* delegate); } // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/ios/exception_processor.mm b/third_party/crashpad/crashpad/client/ios_handler/exception_processor.mm similarity index 67% rename from third_party/crashpad/crashpad/util/ios/exception_processor.mm rename to third_party/crashpad/crashpad/client/ios_handler/exception_processor.mm index 2b2857e..d8c94e5 100644 --- a/third_party/crashpad/crashpad/util/ios/exception_processor.mm +++ b/third_party/crashpad/crashpad/client/ios_handler/exception_processor.mm
@@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "util/ios/exception_processor.h" +#include "client/ios_handler/exception_processor.h" #include <Availability.h> #import <Foundation/Foundation.h> @@ -35,10 +35,15 @@ #include <typeinfo> #include "base/bit_cast.h" +#include "base/format_macros.h" #include "base/logging.h" #include "base/memory/free_deleter.h" +#include "base/numerics/safe_conversions.h" +#include "base/strings/stringprintf.h" #include "base/strings/sys_string_conversions.h" #include "build/build_config.h" +#include "client/annotation.h" +#include "client/simulate_crash_ios.h" namespace { @@ -80,20 +85,101 @@ _Unwind_Exception unwindHeader; }; -objc_exception_preprocessor g_next_preprocessor; -bool g_exception_preprocessor_installed; +int LoggingUnwStep(unw_cursor_t* cursor) { + int rv = unw_step(cursor); + if (rv < 0) { + LOG(ERROR) << "unw_step: " << rv; + } + return rv; +} -void TerminatingFromUncaughtNSException(id exception, const char* sinkhole) { - // TODO(justincohen): This is incomplete, as the signal handler will not have - // access to the exception name and reason. Pass that along somehow here. - NSString* exception_message_ns = [NSString - stringWithFormat:@"%@: %@", [exception name], [exception reason]]; - std::string exception_message = base::SysNSStringToUTF8(exception_message_ns); - LOG(INFO) << "Terminating from Objective-C exception: " << exception_message - << " with sinkhole: " << sinkhole; - // TODO(justincohen): This is temporary, as crashpad can capture this - // exception directly instead. - std::terminate(); +std::string FormatStackTrace(const std::vector<uint64_t>& addresses, + size_t max_length) { + std::string stack_string; + for (uint64_t address : addresses) { + std::string address_string = base::StringPrintf("0x%" PRIx64, address); + if (stack_string.size() + address_string.size() > max_length) + break; + stack_string += address_string + " "; + } + + if (!stack_string.empty() && stack_string.back() == ' ') { + stack_string.resize(stack_string.size() - 1); + } + + return stack_string; +} + +std::string GetTraceString() { + std::vector<uint64_t> addresses; + unw_context_t context; + unw_getcontext(&context); + unw_cursor_t cursor; + unw_init_local(&cursor, &context); + while (LoggingUnwStep(&cursor) > 0) { + unw_word_t ip = 0; + unw_get_reg(&cursor, UNW_REG_IP, &ip); + addresses.push_back(ip); + } + return FormatStackTrace(addresses, 1024); +} + +crashpad::ObjcExceptionDelegate* g_exception_delegate; +objc_exception_preprocessor g_next_preprocessor; +NSUncaughtExceptionHandler* g_next_uncaught_exception_handler; + +static void SetNSExceptionAnnotations(id exception, + std::string& name, + std::string& reason) { + name = base::SysNSStringToUTF8([exception name]); + reason = base::SysNSStringToUTF8([exception reason]); + static crashpad::StringAnnotation<256> nameKey("exceptionName"); + nameKey.Set(name); + static crashpad::StringAnnotation<512> reasonKey("exceptionReason"); + reasonKey.Set(reason); +} + +static void ObjcUncaughtExceptionHandler(NSException* exception) { + std::string name, reason; + SetNSExceptionAnnotations(exception, name, reason); + NSArray<NSNumber*>* addressArray = [exception callStackReturnAddresses]; + if ([addressArray count] > 0) { + static crashpad::StringAnnotation<256> nameKey("UncaughtNSException"); + nameKey.Set("true"); + std::vector<uint64_t> addresses; + NSArray<NSNumber*>* addressArray = [exception callStackReturnAddresses]; + for (NSNumber* address in addressArray) + addresses.push_back([address unsignedLongLongValue]); + g_exception_delegate->HandleUncaughtNSException(&addresses[0], + addresses.size()); + } else { + LOG(WARNING) << "Uncaught Objective-C exception name: " << name + << " reason: " << reason << " with no " + << " -callStackReturnAddresses."; + crashpad::NativeCPUContext cpu_context; + crashpad::CaptureContext(&cpu_context); + g_exception_delegate->HandleUncaughtNSExceptionWithContext(&cpu_context); + } +} + +// This function is used to make it clear to the crash processor that an +// uncaught NSException was recorded here. +static __attribute__((noinline)) id HANDLE_UNCAUGHT_NSEXCEPTION( + id exception, + const char* sinkhole) { + std::string name, reason; + SetNSExceptionAnnotations(exception, name, reason); + LOG(WARNING) << "Handling Objective-C exception name: " << name + << " reason: " << reason << " with sinkhole: " << sinkhole; + crashpad::NativeCPUContext cpu_context; + crashpad::CaptureContext(&cpu_context); + g_exception_delegate->HandleUncaughtNSExceptionWithContext(&cpu_context); + + // Remove the uncaught exception handler so we don't record this twice. + NSSetUncaughtExceptionHandler(g_next_uncaught_exception_handler); + g_next_uncaught_exception_handler = nullptr; + + return g_next_preprocessor ? g_next_preprocessor(exception) : exception; } // Returns true if |path| equals |sinkhole| on device. Simulator paths prepend @@ -113,15 +199,25 @@ #endif } -int LoggingUnwStep(unw_cursor_t* cursor) { - int rv = unw_step(cursor); - if (rv < 0) { - LOG(ERROR) << "unw_step: " << rv; - } - return rv; -} - id ObjcExceptionPreprocessor(id exception) { + static bool seen_first_exception; + + static crashpad::StringAnnotation<256> firstexception("firstexception"); + static crashpad::StringAnnotation<256> lastexception("lastexception"); + static crashpad::StringAnnotation<1024> firstexception_bt( + "firstexception_bt"); + static crashpad::StringAnnotation<1024> lastexception_bt("lastexception_bt"); + auto* key = seen_first_exception ? &lastexception : &firstexception; + auto* bt_key = seen_first_exception ? &lastexception_bt : &firstexception_bt; + NSString* value = [NSString + stringWithFormat:@"%@ reason %@", [exception name], [exception reason]]; + key->Set(base::SysNSStringToUTF8(value)); + + // This exception preprocessor runs prior to the one in libobjc, which sets + // the -[NSException callStackReturnAddresses]. + bt_key->Set(GetTraceString()); + seen_first_exception = true; + // Unwind the stack looking for any exception handlers. If an exception // handler is encountered, test to see if it is a function known to catch- // and-rethrow as a "top-level" exception handler. Various routines in @@ -229,10 +325,13 @@ "CFRunLoopRunSpecific", "_CFXNotificationPost", "__NSFireDelayedPerform", + // If this exception is going to end up at EHFrame, record the uncaught + // exception instead. + "_ZN4base3mac15CallWithEHFrameEU13block_pointerFvvE", }; for (const char* sinkhole : kExceptionSymbolNameSinkholes) { if (strcmp(sinkhole, proc_name) == 0) { - TerminatingFromUncaughtNSException(exception, sinkhole); + return HANDLE_UNCAUGHT_NSEXCEPTION(exception, sinkhole); } } @@ -257,7 +356,7 @@ 0) { for (const char* sinkhole : kExceptionLibraryPathSinkholes) { if (ModulePathMatchesSinkhole(dl_info.dli_fname, sinkhole)) { - TerminatingFromUncaughtNSException(exception, sinkhole); + return HANDLE_UNCAUGHT_NSEXCEPTION(exception, sinkhole); } } } @@ -305,7 +404,7 @@ reinterpret_cast<unw_word_t>(gesture_environment_min_imp) && caller_frame_info.start_ip <= reinterpret_cast<unw_word_t>(gesture_environment_max_imp)) { - TerminatingFromUncaughtNSException(exception, + return HANDLE_UNCAUGHT_NSEXCEPTION(exception, "_UIGestureEnvironmentUpdate"); } } @@ -319,37 +418,43 @@ // If no handler is found, __cxa_throw would call failed_throw and terminate. // See: // https://github.com/llvm/llvm-project/blob/c5d2746fbea7/libcxxabi/src/cxa_exception.cpp - // __cxa_throw. Instead, terminate via TerminatingFromUncaughtNSException so - // the exception name and reason are properly recorded. + // __cxa_throw. Instead, call HANDLE_UNCAUGHT_NSEXCEPTION so the exception + // name and reason are properly recorded. if (!handler_found) { - TerminatingFromUncaughtNSException(exception, "__cxa_throw"); + return HANDLE_UNCAUGHT_NSEXCEPTION(exception, "__cxa_throw"); } // Forward to the next preprocessor. - if (g_next_preprocessor) - return g_next_preprocessor(exception); - - return exception; + return g_next_preprocessor ? g_next_preprocessor(exception) : exception; } } // namespace namespace crashpad { -void InstallObjcExceptionPreprocessor() { - DCHECK(!g_exception_preprocessor_installed); +void InstallObjcExceptionPreprocessor(ObjcExceptionDelegate* delegate) { + DCHECK(!g_next_preprocessor); + // Preprocessor. g_next_preprocessor = objc_setExceptionPreprocessor(&ObjcExceptionPreprocessor); - g_exception_preprocessor_installed = true; + + // Uncaught processor. + g_exception_delegate = delegate; + g_next_uncaught_exception_handler = NSGetUncaughtExceptionHandler(); + NSSetUncaughtExceptionHandler(&ObjcUncaughtExceptionHandler); } void UninstallObjcExceptionPreprocessor() { - DCHECK(g_exception_preprocessor_installed); + DCHECK(g_next_preprocessor); objc_setExceptionPreprocessor(g_next_preprocessor); + g_exception_delegate = nullptr; + + NSSetUncaughtExceptionHandler(g_next_uncaught_exception_handler); + g_next_uncaught_exception_handler = nullptr; + g_next_preprocessor = nullptr; - g_exception_preprocessor_installed = false; } } // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/ios/exception_processor_test.mm b/third_party/crashpad/crashpad/client/ios_handler/exception_processor_test.mm similarity index 100% rename from third_party/crashpad/crashpad/util/ios/exception_processor_test.mm rename to third_party/crashpad/crashpad/client/ios_handler/exception_processor_test.mm
diff --git a/third_party/crashpad/crashpad/client/ios_handler/in_process_intermediate_dump_handler.cc b/third_party/crashpad/crashpad/client/ios_handler/in_process_intermediate_dump_handler.cc new file mode 100644 index 0000000..43552a7a --- /dev/null +++ b/third_party/crashpad/crashpad/client/ios_handler/in_process_intermediate_dump_handler.cc
@@ -0,0 +1,1258 @@ +// Copyright 2021 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "client/ios_handler/in_process_intermediate_dump_handler.h" + +#include <mach-o/dyld_images.h> +#include <mach-o/nlist.h> +#include <stdint.h> +#include <string.h> +#include <sys/sysctl.h> +#include <time.h> + +#include "base/cxx17_backports.h" +#include "build/build_config.h" +#include "snapshot/snapshot_constants.h" +#include "util/ios/ios_intermediate_dump_writer.h" +#include "util/ios/raw_logging.h" +#include "util/ios/scoped_vm_read.h" + +namespace crashpad { +namespace internal { + +namespace { + +#if defined(ARCH_CPU_X86_64) +const thread_state_flavor_t kThreadStateFlavor = x86_THREAD_STATE64; +const thread_state_flavor_t kFloatStateFlavor = x86_FLOAT_STATE64; +const thread_state_flavor_t kDebugStateFlavor = x86_DEBUG_STATE64; +using thread_state_type = x86_thread_state64_t; +#elif defined(ARCH_CPU_ARM64) +const thread_state_flavor_t kThreadStateFlavor = ARM_THREAD_STATE64; +const thread_state_flavor_t kFloatStateFlavor = ARM_NEON_STATE64; +const thread_state_flavor_t kDebugStateFlavor = ARM_DEBUG_STATE64; +using thread_state_type = arm_thread_state64_t; +#endif + +// From snapshot/mac/process_types/crashreporterclient.proctype +struct crashreporter_annotations_t { + uint64_t version; + uint64_t message; + uint64_t signature_string; + uint64_t backtrace; + uint64_t message2; + uint64_t thread; + uint64_t dialog_mode; + uint64_t abort_cause; +}; + +//! \brief Manage memory and ports after calling `task_threads`. +class ScopedTaskThreads { + public: + explicit ScopedTaskThreads(thread_act_array_t threads, + mach_msg_type_number_t thread_count) + : threads_(threads), thread_count_(thread_count) {} + + ~ScopedTaskThreads() { + for (uint32_t thread_index = 0; thread_index < thread_count_; + ++thread_index) { + mach_port_deallocate(mach_task_self(), threads_[thread_index]); + } + vm_deallocate(mach_task_self(), + reinterpret_cast<vm_address_t>(threads_), + sizeof(thread_t) * thread_count_); + } + + private: + thread_act_array_t threads_; + mach_msg_type_number_t thread_count_; + + DISALLOW_COPY_AND_ASSIGN(ScopedTaskThreads); +}; + +//! \brief Log \a key as a string. +void WriteError(IntermediateDumpKey key) { + CRASHPAD_RAW_LOG("Unable to write key"); + switch (key) { +// clang-format off +#define CASE_KEY(Name, Value) \ + case IntermediateDumpKey::Name: \ + CRASHPAD_RAW_LOG(#Name); \ + break; + INTERMEDIATE_DUMP_KEYS(CASE_KEY) +#undef CASE_KEY + // clang-format on + } +} + +//! \brief Call AddProperty with raw error log. +//! +//! \param[in] writer The dump writer +//! \param[in] key The key to write. +//! \param[in] value Memory to be written. +//! \param[in] count Length of \a value. +template <typename T> +void WriteProperty(IOSIntermediateDumpWriter* writer, + IntermediateDumpKey key, + const T* value, + size_t count = 1) { + if (!writer->AddProperty(key, value, count)) + WriteError(key); +} + +//! \brief Call AddPropertyBytes with raw error log. +//! +//! \param[in] writer The dump writer +//! \param[in] key The key to write. +//! \param[in] value Memory to be written. +//! \param[in] count Length of \a data. +void WritePropertyBytes(IOSIntermediateDumpWriter* writer, + IntermediateDumpKey key, + const void* value, + size_t value_length) { + if (!writer->AddPropertyBytes(key, value, value_length)) + WriteError(key); +} + +kern_return_t MachVMRegionRecurseDeepest(task_t task, + vm_address_t* address, + vm_size_t* size, + natural_t* depth, + vm_prot_t* protection, + unsigned int* user_tag) { + vm_region_submap_short_info_64 submap_info; + mach_msg_type_number_t count = VM_REGION_SUBMAP_SHORT_INFO_COUNT_64; + while (true) { + // Note: vm_region_recurse() would be fine here, but it does not provide + // VM_REGION_SUBMAP_SHORT_INFO_COUNT. + kern_return_t kr = vm_region_recurse_64( + task, + address, + size, + depth, + reinterpret_cast<vm_region_recurse_info_t>(&submap_info), + &count); + if (kr != KERN_SUCCESS) { + CRASHPAD_RAW_LOG_ERROR(kr, "vm_region_recurse_64"); + return kr; + } + + if (!submap_info.is_submap) { + *protection = submap_info.protection; + *user_tag = submap_info.user_tag; + return KERN_SUCCESS; + } + + ++*depth; + } +} + +//! \brief Adjusts the region for the red zone, if the ABI requires one. +//! +//! This method performs red zone calculation for CalculateStackRegion(). Its +//! parameters are local variables used within that method, and may be +//! modified as needed. +//! +//! Where a red zone is required, the region of memory captured for a thread’s +//! stack will be extended to include the red zone below the stack pointer, +//! provided that such memory is mapped, readable, and has the correct user +//! tag value. If these conditions cannot be met fully, as much of the red +//! zone will be captured as is possible while meeting these conditions. +//! +//! \param[in,out] start_address The base address of the region to begin +//! capturing stack memory from. On entry, \a start_address is the stack +//! pointer. On return, \a start_address may be decreased to encompass a +//! red zone. +//! \param[in,out] region_base The base address of the region that contains +//! stack memory. This is distinct from \a start_address in that \a +//! region_base will be page-aligned. On entry, \a region_base is the +//! base address of a region that contains \a start_address. On return, +//! if \a start_address is decremented and is outside of the region +//! originally described by \a region_base, \a region_base will also be +//! decremented appropriately. +//! \param[in,out] region_size The size of the region that contains stack +//! memory. This region begins at \a region_base. On return, if \a +//! region_base is decremented, \a region_size will be incremented +//! appropriately. +//! \param[in] user_tag The Mach VM system’s user tag for the region described +//! by the initial values of \a region_base and \a region_size. The red +//! zone will only be allowed to extend out of the region described by +//! these initial values if the user tag is appropriate for stack memory +//! and the expanded region has the same user tag value. +void LocateRedZone(vm_address_t* const start_address, + vm_address_t* const region_base, + vm_address_t* const region_size, + const unsigned int user_tag) { + // x86_64 has a red zone. See AMD64 ABI 0.99.8, + // https://gitlab.com/x86-psABIs/x86-64-ABI/-/wikis/uploads/01de35b2c8adc7545de52604cc45d942/x86-64-psABI-2021-05-20.pdf#page=23. + // section 3.2.2, “The Stack Frame”. + // So does ARM64, + // https://developer.apple.com/documentation/xcode/writing-arm64-code-for-apple-platforms#Respect-the-Stacks-Red-Zone + // section "Respect the Stack’s Red Zone". + constexpr vm_size_t kRedZoneSize = 128; + vm_address_t red_zone_base = + *start_address >= kRedZoneSize ? *start_address - kRedZoneSize : 0; + bool red_zone_ok = false; + if (red_zone_base >= *region_base) { + // The red zone is within the region already discovered. + red_zone_ok = true; + } else if (red_zone_base < *region_base && user_tag == VM_MEMORY_STACK) { + // Probe to see if there’s a region immediately below the one already + // discovered. + vm_address_t red_zone_region_base = red_zone_base; + vm_size_t red_zone_region_size; + natural_t red_zone_depth = 0; + vm_prot_t red_zone_protection; + unsigned int red_zone_user_tag; + kern_return_t kr = MachVMRegionRecurseDeepest(mach_task_self(), + &red_zone_region_base, + &red_zone_region_size, + &red_zone_depth, + &red_zone_protection, + &red_zone_user_tag); + if (kr != KERN_SUCCESS) { + *start_address = *region_base; + } else if (red_zone_region_base + red_zone_region_size == *region_base && + (red_zone_protection & VM_PROT_READ) != 0 && + red_zone_user_tag == user_tag) { + // The region containing the red zone is immediately below the region + // already found, it’s readable (not the guard region), and it has the + // same user tag as the region already found, so merge them. + red_zone_ok = true; + *region_base -= red_zone_region_size; + *region_size += red_zone_region_size; + } + } + + if (red_zone_ok) { + // Begin capturing from the base of the red zone (but not the entire + // region that encompasses the red zone). + *start_address = red_zone_base; + } else { + // The red zone would go lower into another region in memory, but no + // region was found. Memory can only be captured to an address as low as + // the base address of the region already found. + *start_address = *region_base; + } +} + +//! \brief Calculates the base address and size of the region used as a +//! thread’s stack. +//! +//! The region returned by this method may be formed by merging multiple +//! adjacent regions in a process’ memory map if appropriate. The base address +//! of the returned region may be lower than the \a stack_pointer passed in +//! when the ABI mandates a red zone below the stack pointer. +//! +//! \param[in] stack_pointer The stack pointer, referring to the top (lowest +//! address) of a thread’s stack. +//! \param[out] stack_region_size The size of the memory region used as the +//! thread’s stack. +//! +//! \return The base address (lowest address) of the memory region used as the +//! thread’s stack. +vm_address_t CalculateStackRegion(vm_address_t stack_pointer, + vm_size_t* stack_region_size) { + // For pthreads, it may be possible to compute the stack region based on the + // internal _pthread::stackaddr and _pthread::stacksize. The _pthread struct + // for a thread can be located at TSD slot 0, or the known offsets of + // stackaddr and stacksize from the TSD area could be used. + vm_address_t region_base = stack_pointer; + vm_size_t region_size; + natural_t depth = 0; + vm_prot_t protection; + unsigned int user_tag; + kern_return_t kr = MachVMRegionRecurseDeepest(mach_task_self(), + ®ion_base, + ®ion_size, + &depth, + &protection, + &user_tag); + if (kr != KERN_SUCCESS) { + CRASHPAD_RAW_LOG_ERROR(kr, "MachVMRegionRecurseDeepest"); + *stack_region_size = 0; + return 0; + } + + if (region_base > stack_pointer) { + // There’s nothing mapped at the stack pointer’s address. Something may have + // trashed the stack pointer. Note that this shouldn’t happen for a normal + // stack guard region violation because the guard region is mapped but has + // VM_PROT_NONE protection. + *stack_region_size = 0; + return 0; + } + + vm_address_t start_address = stack_pointer; + + if ((protection & VM_PROT_READ) == 0) { + // If the region isn’t readable, the stack pointer probably points to the + // guard region. Don’t include it as part of the stack, and don’t include + // anything at any lower memory address. The code below may still possibly + // find the real stack region at a memory address higher than this region. + start_address = region_base + region_size; + } else { + // If the ABI requires a red zone, adjust the region to include it if + // possible. + LocateRedZone(&start_address, ®ion_base, ®ion_size, user_tag); + + // Regardless of whether the ABI requires a red zone, capture up to + // kExtraCaptureSize additional bytes of stack, but only if present in the + // region that was already found. + constexpr vm_size_t kExtraCaptureSize = 128; + start_address = std::max(start_address >= kExtraCaptureSize + ? start_address - kExtraCaptureSize + : start_address, + region_base); + + // Align start_address to a 16-byte boundary, which can help readers by + // ensuring that data is aligned properly. This could page-align instead, + // but that might be wasteful. + constexpr vm_size_t kDesiredAlignment = 16; + start_address &= ~(kDesiredAlignment - 1); + DCHECK_GE(start_address, region_base); + } + + region_size -= (start_address - region_base); + region_base = start_address; + + vm_size_t total_region_size = region_size; + + // The stack region may have gotten split up into multiple abutting regions. + // Try to coalesce them. This frequently happens for the main thread’s stack + // when setrlimit(RLIMIT_STACK, …) is called. It may also happen if a region + // is split up due to an mprotect() or vm_protect() call. + // + // Stack regions created by the kernel and the pthreads library will be marked + // with the VM_MEMORY_STACK user tag. Scanning for multiple adjacent regions + // with the same tag should find an entire stack region. Checking that the + // protection on individual regions is not VM_PROT_NONE should guarantee that + // this algorithm doesn’t collect map entries belonging to another thread’s + // stack: well-behaved stacks (such as those created by the kernel and the + // pthreads library) have VM_PROT_NONE guard regions at their low-address + // ends. + // + // Other stack regions may not be so well-behaved and thus if user_tag is not + // VM_MEMORY_STACK, the single region that was found is used as-is without + // trying to merge it with other adjacent regions. + if (user_tag == VM_MEMORY_STACK) { + vm_address_t try_address = region_base; + vm_address_t original_try_address; + + while (try_address += region_size, + original_try_address = try_address, + (kr = MachVMRegionRecurseDeepest(mach_task_self(), + &try_address, + ®ion_size, + &depth, + &protection, + &user_tag) == KERN_SUCCESS) && + try_address == original_try_address && + (protection & VM_PROT_READ) != 0 && + user_tag == VM_MEMORY_STACK) { + total_region_size += region_size; + } + + if (kr != KERN_SUCCESS && kr != KERN_INVALID_ADDRESS) { + // Tolerate KERN_INVALID_ADDRESS because it will be returned when there + // are no more regions in the map at or above the specified |try_address|. + CRASHPAD_RAW_LOG_ERROR(kr, "MachVMRegionRecurseDeepest"); + } + } + + *stack_region_size = total_region_size; + return region_base; +} + +//! \brief Write data around \a address to intermediate dump. Must be called +//! from within a ScopedArray. +void MaybeCaptureMemoryAround(IOSIntermediateDumpWriter* writer, + uint64_t address) { + constexpr uint64_t non_address_offset = 0x10000; + if (address < non_address_offset) + return; + + constexpr uint64_t max_address = std::numeric_limits<uint64_t>::max(); + + if (address > max_address - non_address_offset) + return; + + constexpr uint64_t kRegisterByteOffset = 128; + const uint64_t target = address - kRegisterByteOffset; + constexpr uint64_t size = 512; + static_assert(kRegisterByteOffset <= size / 2, "negative offset too large"); + + IOSIntermediateDumpWriter::ScopedArrayMap memory_region(writer); + WriteProperty( + writer, IntermediateDumpKey::kThreadContextMemoryRegionAddress, &address); + // Don't use WritePropertyBytes, this one will fail regularly if |target| + // cannot be read. + writer->AddPropertyBytes(IntermediateDumpKey::kThreadContextMemoryRegionData, + reinterpret_cast<const void*>(target), + size); +} + +void CaptureMemoryPointedToByThreadState(IOSIntermediateDumpWriter* writer, + thread_state_type thread_state) { + IOSIntermediateDumpWriter::ScopedArray memory_regions( + writer, IntermediateDumpKey::kThreadContextMemoryRegions); + +#if defined(ARCH_CPU_X86_64) + MaybeCaptureMemoryAround(writer, thread_state.__rax); + MaybeCaptureMemoryAround(writer, thread_state.__rbx); + MaybeCaptureMemoryAround(writer, thread_state.__rcx); + MaybeCaptureMemoryAround(writer, thread_state.__rdx); + MaybeCaptureMemoryAround(writer, thread_state.__rdi); + MaybeCaptureMemoryAround(writer, thread_state.__rsi); + MaybeCaptureMemoryAround(writer, thread_state.__rbp); + MaybeCaptureMemoryAround(writer, thread_state.__r8); + MaybeCaptureMemoryAround(writer, thread_state.__r9); + MaybeCaptureMemoryAround(writer, thread_state.__r10); + MaybeCaptureMemoryAround(writer, thread_state.__r11); + MaybeCaptureMemoryAround(writer, thread_state.__r12); + MaybeCaptureMemoryAround(writer, thread_state.__r13); + MaybeCaptureMemoryAround(writer, thread_state.__r14); + MaybeCaptureMemoryAround(writer, thread_state.__r15); + MaybeCaptureMemoryAround(writer, thread_state.__rip); +#elif defined(ARCH_CPU_ARM_FAMILY) + MaybeCaptureMemoryAround(writer, thread_state.__pc); + for (size_t i = 0; i < base::size(thread_state.__x); ++i) { + MaybeCaptureMemoryAround(writer, thread_state.__x[i]); + } +#endif +} + +void WriteCrashpadSimpleAnnotationsDictionary(IOSIntermediateDumpWriter* writer, + CrashpadInfo* crashpad_info) { + if (!crashpad_info->simple_annotations()) + return; + + ScopedVMRead<SimpleStringDictionary> simple_annotations; + if (!simple_annotations.Read(crashpad_info->simple_annotations())) { + CRASHPAD_RAW_LOG("Unable to read simple annotations."); + return; + } + + const size_t count = simple_annotations->GetCount(); + if (!count) + return; + + IOSIntermediateDumpWriter::ScopedArray annotations_array( + writer, IntermediateDumpKey::kAnnotationsSimpleMap); + + SimpleStringDictionary::Entry* entries = + reinterpret_cast<SimpleStringDictionary::Entry*>( + simple_annotations.get()); + for (size_t index = 0; index < count; index++) { + IOSIntermediateDumpWriter::ScopedArrayMap annotation_map(writer); + const auto& entry = entries[index]; + size_t key_length = strnlen(entry.key, sizeof(entry.key)); + WritePropertyBytes(writer, + IntermediateDumpKey::kAnnotationName, + reinterpret_cast<const void*>(entry.key), + key_length); + size_t value_length = strnlen(entry.value, sizeof(entry.value)); + WritePropertyBytes(writer, + IntermediateDumpKey::kAnnotationValue, + reinterpret_cast<const void*>(entry.value), + value_length); + } +} + +void WriteAppleCrashReporterAnnotations( + IOSIntermediateDumpWriter* writer, + crashreporter_annotations_t* crash_info) { + // This number was totally made up out of nowhere, but it seems prudent to + // enforce some limit. + constexpr size_t kMaxMessageSize = 1024; + IOSIntermediateDumpWriter::ScopedMap annotation_map( + writer, IntermediateDumpKey::kAnnotationsCrashInfo); + if (crash_info->message) { + const size_t message_len = strnlen( + reinterpret_cast<const char*>(crash_info->message), kMaxMessageSize); + WritePropertyBytes(writer, + IntermediateDumpKey::kAnnotationsCrashInfoMessage1, + reinterpret_cast<const void*>(crash_info->message), + message_len); + } + if (crash_info->message2) { + const size_t message_len = strnlen( + reinterpret_cast<const char*>(crash_info->message2), kMaxMessageSize); + WritePropertyBytes(writer, + IntermediateDumpKey::kAnnotationsCrashInfoMessage2, + reinterpret_cast<const void*>(crash_info->message2), + message_len); + } +} + +void WriteDyldErrorStringAnnotation( + IOSIntermediateDumpWriter* writer, + const uint64_t address, + const symtab_command* symtab_command_ptr, + const dysymtab_command* dysymtab_command_ptr, + const segment_command_64* text_seg_ptr, + const segment_command_64* linkedit_seg_ptr, + vm_size_t slide) { + if (text_seg_ptr == nullptr || linkedit_seg_ptr == nullptr || + symtab_command_ptr == nullptr) { + return; + } + + ScopedVMRead<symtab_command> symtab_command; + ScopedVMRead<dysymtab_command> dysymtab_command; + ScopedVMRead<segment_command_64> text_seg; + ScopedVMRead<segment_command_64> linkedit_seg; + if (!symtab_command.Read(symtab_command_ptr) || + !text_seg.Read(text_seg_ptr) || !linkedit_seg.Read(linkedit_seg_ptr) || + (dysymtab_command_ptr && !dysymtab_command.Read(dysymtab_command_ptr))) { + CRASHPAD_RAW_LOG("Unable to load dyld symbol table."); + } + + uint64_t file_slide = + (linkedit_seg->vmaddr - text_seg->vmaddr) - linkedit_seg->fileoff; + uint64_t strings = address + (symtab_command->stroff + file_slide); + nlist_64* symbol_ptr = reinterpret_cast<nlist_64*>( + address + (symtab_command->symoff + file_slide)); + + // If a dysymtab is present, use it to filter the symtab for just the + // portion used for extdefsym. If no dysymtab is present, the entire symtab + // will need to be consulted. + uint32_t symbol_count = symtab_command->nsyms; + if (dysymtab_command_ptr) { + symbol_ptr += dysymtab_command->iextdefsym; + symbol_count = dysymtab_command->nextdefsym; + } + + for (uint32_t i = 0; i < symbol_count; i++, symbol_ptr++) { + ScopedVMRead<nlist_64> symbol; + if (!symbol.Read(symbol_ptr)) { + CRASHPAD_RAW_LOG("Unable to load dyld symbol table symbol."); + return; + } + + if (!symbol->n_value) + continue; + + ScopedVMRead<const char> symbol_name; + if (!symbol_name.Read(strings + symbol->n_un.n_strx)) { + CRASHPAD_RAW_LOG("Unable to load dyld symbol name."); + } + + if (strcmp(symbol_name.get(), "_error_string") == 0) { + ScopedVMRead<const char> symbol_value; + if (!symbol_value.Read(symbol->n_value + slide)) { + CRASHPAD_RAW_LOG("Unable to load dyld symbol value."); + } + // 1024 here is distinct from kMaxMessageSize above, because it refers to + // a precisely-sized buffer inside dyld. + const size_t value_len = strnlen(symbol_value.get(), 1024); + if (value_len) { + WriteProperty(writer, + IntermediateDumpKey::kAnnotationsDyldErrorString, + symbol_value.get(), + value_len); + } + return; + } + + continue; + } +} + +} // namespace + +// static +void InProcessIntermediateDumpHandler::WriteHeader( + IOSIntermediateDumpWriter* writer) { + static constexpr uint8_t version = 1; + WriteProperty(writer, IntermediateDumpKey::kVersion, &version); +} + +// static +void InProcessIntermediateDumpHandler::WriteProcessInfo( + IOSIntermediateDumpWriter* writer) { + IOSIntermediateDumpWriter::ScopedMap process_map( + writer, IntermediateDumpKey::kProcessInfo); + + timeval snapshot_time; + if (gettimeofday(&snapshot_time, nullptr) == 0) { + WriteProperty(writer, IntermediateDumpKey::kSnapshotTime, &snapshot_time); + } else { + CRASHPAD_RAW_LOG("gettimeofday"); + } + + // Used by pid, parent pid and snapshot time. + kinfo_proc kern_proc_info; + int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()}; + size_t len = sizeof(kern_proc_info); + if (sysctl(mib, base::size(mib), &kern_proc_info, &len, nullptr, 0) == 0) { + WriteProperty( + writer, IntermediateDumpKey::kPID, &kern_proc_info.kp_proc.p_pid); + WriteProperty(writer, + IntermediateDumpKey::kParentPID, + &kern_proc_info.kp_eproc.e_ppid); + WriteProperty(writer, + IntermediateDumpKey::kStartTime, + &kern_proc_info.kp_proc.p_starttime); + } else { + CRASHPAD_RAW_LOG("sysctl kern_proc_info"); + } + + // Used by user time and system time. + mach_task_basic_info task_basic_info; + mach_msg_type_number_t task_basic_info_count = MACH_TASK_BASIC_INFO_COUNT; + kern_return_t kr = task_info(mach_task_self(), + MACH_TASK_BASIC_INFO, + reinterpret_cast<task_info_t>(&task_basic_info), + &task_basic_info_count); + if (kr == KERN_SUCCESS) { + IOSIntermediateDumpWriter::ScopedMap task_info( + writer, IntermediateDumpKey::kTaskBasicInfo); + + WriteProperty( + writer, IntermediateDumpKey::kUserTime, &task_basic_info.user_time); + WriteProperty( + writer, IntermediateDumpKey::kSystemTime, &task_basic_info.system_time); + } else { + CRASHPAD_RAW_LOG("task_info task_basic_info"); + } + + task_thread_times_info_data_t task_thread_times; + mach_msg_type_number_t task_thread_times_count = TASK_THREAD_TIMES_INFO_COUNT; + kr = task_info(mach_task_self(), + TASK_THREAD_TIMES_INFO, + reinterpret_cast<task_info_t>(&task_thread_times), + &task_thread_times_count); + if (kr == KERN_SUCCESS) { + IOSIntermediateDumpWriter::ScopedMap task_thread_times_map( + writer, IntermediateDumpKey::kTaskThreadTimes); + + WriteProperty( + writer, IntermediateDumpKey::kUserTime, &task_thread_times.user_time); + WriteProperty(writer, + IntermediateDumpKey::kSystemTime, + &task_thread_times.system_time); + } else { + CRASHPAD_RAW_LOG("task_info task_basic_info"); + } +} + +// static +void InProcessIntermediateDumpHandler::WriteSystemInfo( + IOSIntermediateDumpWriter* writer, + const IOSSystemDataCollector& system_data) { + IOSIntermediateDumpWriter::ScopedMap system_map( + writer, IntermediateDumpKey::kSystemInfo); + + const std::string& machine_description = system_data.MachineDescription(); + WriteProperty(writer, + IntermediateDumpKey::kMachineDescription, + machine_description.c_str(), + machine_description.length()); + int os_version_major; + int os_version_minor; + int os_version_bugfix; + system_data.OSVersion( + &os_version_major, &os_version_minor, &os_version_bugfix); + WriteProperty( + writer, IntermediateDumpKey::kOSVersionMajor, &os_version_major); + WriteProperty( + writer, IntermediateDumpKey::kOSVersionMinor, &os_version_minor); + WriteProperty( + writer, IntermediateDumpKey::kOSVersionBugfix, &os_version_bugfix); + const std::string& os_version_build = system_data.Build(); + WriteProperty(writer, + IntermediateDumpKey::kOSVersionBuild, + os_version_build.c_str(), + os_version_build.length()); + + int cpu_count = system_data.ProcessorCount(); + WriteProperty(writer, IntermediateDumpKey::kCpuCount, &cpu_count); + const std::string& cpu_vendor = system_data.CPUVendor(); + WriteProperty(writer, + IntermediateDumpKey::kCpuVendor, + cpu_vendor.c_str(), + cpu_vendor.length()); + + bool has_daylight_saving_time = system_data.HasDaylightSavingTime(); + WriteProperty(writer, + IntermediateDumpKey::kHasDaylightSavingTime, + &has_daylight_saving_time); + bool is_daylight_saving_time = system_data.IsDaylightSavingTime(); + WriteProperty(writer, + IntermediateDumpKey::kIsDaylightSavingTime, + &is_daylight_saving_time); + int standard_offset_seconds = system_data.StandardOffsetSeconds(); + WriteProperty(writer, + IntermediateDumpKey::kStandardOffsetSeconds, + &standard_offset_seconds); + int daylight_offset_seconds = system_data.DaylightOffsetSeconds(); + WriteProperty(writer, + IntermediateDumpKey::kDaylightOffsetSeconds, + &daylight_offset_seconds); + const std::string& standard_name = system_data.StandardName(); + WriteProperty(writer, + IntermediateDumpKey::kStandardName, + standard_name.c_str(), + standard_name.length()); + const std::string& daylight_name = system_data.DaylightName(); + WriteProperty(writer, + IntermediateDumpKey::kDaylightName, + daylight_name.c_str(), + daylight_name.length()); + + vm_size_t page_size; + host_page_size(mach_host_self(), &page_size); + WriteProperty(writer, IntermediateDumpKey::kPageSize, &page_size); + + mach_msg_type_number_t host_size = + sizeof(vm_statistics_data_t) / sizeof(integer_t); + vm_statistics_data_t vm_stat; + kern_return_t kr = host_statistics(mach_host_self(), + HOST_VM_INFO, + reinterpret_cast<host_info_t>(&vm_stat), + &host_size); + if (kr == KERN_SUCCESS) { + IOSIntermediateDumpWriter::ScopedMap vm_stat_map( + writer, IntermediateDumpKey::kVMStat); + + WriteProperty(writer, IntermediateDumpKey::kActive, &vm_stat.active_count); + WriteProperty( + writer, IntermediateDumpKey::kInactive, &vm_stat.inactive_count); + WriteProperty(writer, IntermediateDumpKey::kWired, &vm_stat.wire_count); + WriteProperty(writer, IntermediateDumpKey::kFree, &vm_stat.free_count); + } else { + CRASHPAD_RAW_LOG("host_statistics"); + } +} + +// static +void InProcessIntermediateDumpHandler::WriteThreadInfo( + IOSIntermediateDumpWriter* writer, + const uint64_t* frames, + const size_t num_frames) { + IOSIntermediateDumpWriter::ScopedArray thread_array( + writer, IntermediateDumpKey::kThreads); + + // Exception thread ID. + uint64_t exception_thread_id = 0; + thread_identifier_info identifier_info; + mach_msg_type_number_t count = THREAD_IDENTIFIER_INFO_COUNT; + kern_return_t kr = + thread_info(mach_thread_self(), + THREAD_IDENTIFIER_INFO, + reinterpret_cast<thread_info_t>(&identifier_info), + &count); + if (kr == KERN_SUCCESS) { + exception_thread_id = identifier_info.thread_id; + } else { + CRASHPAD_RAW_LOG_ERROR(kr, "thread_info::THREAD_IDENTIFIER_INFO"); + } + + mach_msg_type_number_t thread_count = 0; + thread_act_array_t threads; + kr = task_threads(mach_task_self(), &threads, &thread_count); + if (kr != KERN_SUCCESS) { + CRASHPAD_RAW_LOG_ERROR(kr, "task_threads"); + } + ScopedTaskThreads threads_vm_owner(threads, thread_count); + + for (uint32_t thread_index = 0; thread_index < thread_count; ++thread_index) { + IOSIntermediateDumpWriter::ScopedArrayMap thread_map(writer); + thread_t thread = threads[thread_index]; + + thread_basic_info basic_info; + mach_msg_type_number_t count = THREAD_BASIC_INFO_COUNT; + kr = thread_info(thread, + THREAD_BASIC_INFO, + reinterpret_cast<thread_info_t>(&basic_info), + &count); + if (kr == KERN_SUCCESS) { + WriteProperty(writer, + IntermediateDumpKey::kSuspendCount, + &basic_info.suspend_count); + } else { + CRASHPAD_RAW_LOG_ERROR(kr, "thread_info::THREAD_BASIC_INFO"); + } + + thread_precedence_policy precedence; + count = THREAD_PRECEDENCE_POLICY_COUNT; + boolean_t get_default = FALSE; + kr = thread_policy_get(thread, + THREAD_PRECEDENCE_POLICY, + reinterpret_cast<thread_policy_t>(&precedence), + &count, + &get_default); + if (kr == KERN_SUCCESS) { + WriteProperty( + writer, IntermediateDumpKey::kPriority, &precedence.importance); + } else { + CRASHPAD_RAW_LOG_ERROR(kr, "thread_policy_get"); + } + + // Thread ID. + uint64_t thread_id; + thread_identifier_info identifier_info; + count = THREAD_IDENTIFIER_INFO_COUNT; + kr = thread_info(thread, + THREAD_IDENTIFIER_INFO, + reinterpret_cast<thread_info_t>(&identifier_info), + &count); + if (kr == KERN_SUCCESS) { + thread_id = identifier_info.thread_id; + WriteProperty( + writer, IntermediateDumpKey::kThreadID, &identifier_info.thread_id); + WriteProperty(writer, + IntermediateDumpKey::kThreadDataAddress, + &identifier_info.thread_handle); + } else { + CRASHPAD_RAW_LOG_ERROR(kr, "thread_info::THREAD_IDENTIFIER_INFO"); + } + + // thread_snapshot_ios_intermediate_dump::GenerateStackMemoryFromFrames is + // only implemented for arm64, so no x86_64 block here. +#if defined(ARCH_CPU_ARM64) + // For uncaught NSExceptions, use the frames passed from the system rather + // than the current thread state. + if (num_frames > 0 && exception_thread_id == thread_id) { + WriteProperty(writer, + IntermediateDumpKey::kThreadUncaughtNSExceptionFrames, + frames, + num_frames); + continue; + } +#endif + +#if defined(ARCH_CPU_X86_64) + x86_thread_state64_t thread_state; + x86_float_state64_t float_state; + x86_debug_state64_t debug_state; + mach_msg_type_number_t thread_state_count = x86_THREAD_STATE64_COUNT; + mach_msg_type_number_t float_state_count = x86_FLOAT_STATE64_COUNT; + mach_msg_type_number_t debug_state_count = x86_DEBUG_STATE64_COUNT; +#elif defined(ARCH_CPU_ARM64) + arm_thread_state64_t thread_state; + arm_neon_state64_t float_state; + arm_debug_state64_t debug_state; + mach_msg_type_number_t thread_state_count = ARM_THREAD_STATE64_COUNT; + mach_msg_type_number_t float_state_count = ARM_NEON_STATE64_COUNT; + mach_msg_type_number_t debug_state_count = ARM_DEBUG_STATE64_COUNT; +#endif + + kern_return_t kr = + thread_get_state(thread, + kThreadStateFlavor, + reinterpret_cast<thread_state_t>(&thread_state), + &thread_state_count); + if (kr != KERN_SUCCESS) { + CRASHPAD_RAW_LOG_ERROR(kr, "thread_get_state::kThreadStateFlavor"); + } + WriteProperty(writer, IntermediateDumpKey::kThreadState, &thread_state); + + kr = thread_get_state(thread, + kFloatStateFlavor, + reinterpret_cast<thread_state_t>(&float_state), + &float_state_count); + if (kr != KERN_SUCCESS) { + CRASHPAD_RAW_LOG_ERROR(kr, "thread_get_state::kFloatStateFlavor"); + } + WriteProperty(writer, IntermediateDumpKey::kFloatState, &float_state); + + kr = thread_get_state(thread, + kDebugStateFlavor, + reinterpret_cast<thread_state_t>(&debug_state), + &debug_state_count); + if (kr != KERN_SUCCESS) { + CRASHPAD_RAW_LOG_ERROR(kr, "thread_get_state::kDebugStateFlavor"); + } + WriteProperty(writer, IntermediateDumpKey::kDebugState, &debug_state); + +#if defined(ARCH_CPU_X86_64) + vm_address_t stack_pointer = thread_state.__rsp; +#elif defined(ARCH_CPU_ARM64) + vm_address_t stack_pointer = thread_state.__sp; +#endif + + vm_size_t stack_region_size; + const vm_address_t stack_region_address = + CalculateStackRegion(stack_pointer, &stack_region_size); + WriteProperty(writer, + IntermediateDumpKey::kStackRegionAddress, + &stack_region_address); + WritePropertyBytes(writer, + IntermediateDumpKey::kStackRegionData, + reinterpret_cast<const void*>(stack_region_address), + stack_region_size); + + // Grab extra memory from context. + CaptureMemoryPointedToByThreadState(writer, thread_state); + } +} + +// static +void InProcessIntermediateDumpHandler::WriteModuleInfo( + IOSIntermediateDumpWriter* writer) { +#ifndef ARCH_CPU_64_BITS +#error Only 64-bit Mach-O is supported +#endif + + IOSIntermediateDumpWriter::ScopedArray module_array( + writer, IntermediateDumpKey::kModules); + + task_dyld_info_data_t dyld_info; + mach_msg_type_number_t count = TASK_DYLD_INFO_COUNT; + kern_return_t kr = task_info(mach_task_self(), + TASK_DYLD_INFO, + reinterpret_cast<task_info_t>(&dyld_info), + &count); + if (kr != KERN_SUCCESS) { + CRASHPAD_RAW_LOG_ERROR(kr, "task_info"); + } + + ScopedVMRead<dyld_all_image_infos> image_infos; + if (!image_infos.Read(dyld_info.all_image_info_addr)) { + CRASHPAD_RAW_LOG("Unable to dyld_info.all_image_info_addr"); + return; + } + + uint32_t image_count = image_infos->infoArrayCount; + const dyld_image_info* image_array = image_infos->infoArray; + for (uint32_t image_index = 0; image_index < image_count; ++image_index) { + IOSIntermediateDumpWriter::ScopedArrayMap modules(writer); + ScopedVMRead<dyld_image_info> image; + if (!image.Read(&image_array[image_index])) { + CRASHPAD_RAW_LOG("Unable to dyld_image_info"); + return; + } + + WriteProperty(writer, + IntermediateDumpKey::kName, + image->imageFilePath, + strlen(image->imageFilePath)); + uint64_t address = FromPointerCast<uint64_t>(image->imageLoadAddress); + WriteProperty(writer, IntermediateDumpKey::kAddress, &address); + WriteProperty( + writer, IntermediateDumpKey::kTimestamp, &image->imageFileModDate); + WriteModuleInfoAtAddress(writer, address, false /*is_dyld=false*/); + } + + { + IOSIntermediateDumpWriter::ScopedArrayMap modules(writer); + WriteProperty(writer, IntermediateDumpKey::kName, image_infos->dyldPath); + uint64_t address = + FromPointerCast<uint64_t>(image_infos->dyldImageLoadAddress); + WriteProperty(writer, IntermediateDumpKey::kAddress, &address); + WriteModuleInfoAtAddress(writer, address, true /*is_dyld=true*/); + } +} + +// static +void InProcessIntermediateDumpHandler::WriteExceptionFromSignal( + IOSIntermediateDumpWriter* writer, + const IOSSystemDataCollector& system_data, + siginfo_t* siginfo, + ucontext_t* context) { + IOSIntermediateDumpWriter::ScopedMap signal_exception_map( + writer, IntermediateDumpKey::kSignalException); + + WriteProperty(writer, IntermediateDumpKey::kSignalNumber, &siginfo->si_signo); + WriteProperty(writer, IntermediateDumpKey::kSignalCode, &siginfo->si_code); + WriteProperty(writer, IntermediateDumpKey::kSignalAddress, &siginfo->si_addr); +#if defined(ARCH_CPU_X86_64) + WriteProperty( + writer, IntermediateDumpKey::kThreadState, &context->uc_mcontext->__ss); + WriteProperty( + writer, IntermediateDumpKey::kFloatState, &context->uc_mcontext->__fs); +#elif defined(ARCH_CPU_ARM64) + WriteProperty( + writer, IntermediateDumpKey::kThreadState, &context->uc_mcontext->__ss); + WriteProperty( + writer, IntermediateDumpKey::kFloatState, &context->uc_mcontext->__ns); +#else +#error Port to your CPU architecture +#endif + + // Thread ID. + thread_identifier_info identifier_info; + mach_msg_type_number_t count = THREAD_IDENTIFIER_INFO_COUNT; + kern_return_t kr = + thread_info(mach_thread_self(), + THREAD_IDENTIFIER_INFO, + reinterpret_cast<thread_info_t>(&identifier_info), + &count); + if (kr == KERN_SUCCESS) { + WriteProperty( + writer, IntermediateDumpKey::kThreadID, &identifier_info.thread_id); + } else { + CRASHPAD_RAW_LOG_ERROR(kr, "thread_info::self"); + } +} + +// static +void InProcessIntermediateDumpHandler::WriteExceptionFromMachException( + IOSIntermediateDumpWriter* writer, + exception_behavior_t behavior, + thread_t exception_thread, + exception_type_t exception, + const mach_exception_data_type_t* code, + mach_msg_type_number_t code_count, + thread_state_flavor_t flavor, + ConstThreadState state, + mach_msg_type_number_t state_count) { + IOSIntermediateDumpWriter::ScopedMap mach_exception_map( + writer, IntermediateDumpKey::kMachException); + + WriteProperty(writer, IntermediateDumpKey::kException, &exception); + WriteProperty(writer, IntermediateDumpKey::kCodes, code, code_count); + WriteProperty(writer, IntermediateDumpKey::kFlavor, &flavor); + WritePropertyBytes(writer, + IntermediateDumpKey::kState, + state, + state_count * sizeof(uint32_t)); + + thread_identifier_info identifier_info; + mach_msg_type_number_t count = THREAD_IDENTIFIER_INFO_COUNT; + kern_return_t kr = + thread_info(exception_thread, + THREAD_IDENTIFIER_INFO, + reinterpret_cast<thread_info_t>(&identifier_info), + &count); + if (kr == KERN_SUCCESS) { + WriteProperty( + writer, IntermediateDumpKey::kThreadID, &identifier_info.thread_id); + } else { + CRASHPAD_RAW_LOG_ERROR(kr, "thread_info"); + } +} + +// static +void InProcessIntermediateDumpHandler::WriteExceptionFromNSException( + IOSIntermediateDumpWriter* writer) { + IOSIntermediateDumpWriter::ScopedMap nsexception_map( + writer, IntermediateDumpKey::kNSException); + + thread_identifier_info identifier_info; + mach_msg_type_number_t count = THREAD_IDENTIFIER_INFO_COUNT; + kern_return_t kr = + thread_info(mach_thread_self(), + THREAD_IDENTIFIER_INFO, + reinterpret_cast<thread_info_t>(&identifier_info), + &count); + if (kr == KERN_SUCCESS) { + WriteProperty( + writer, IntermediateDumpKey::kThreadID, &identifier_info.thread_id); + } else { + CRASHPAD_RAW_LOG_ERROR(kr, "thread_info::self"); + } +} + +void InProcessIntermediateDumpHandler::WriteModuleInfoAtAddress( + IOSIntermediateDumpWriter* writer, + uint64_t address, + bool is_dyld) { + ScopedVMRead<mach_header_64> header; + if (!header.Read(address) || header->magic != MH_MAGIC_64) { + CRASHPAD_RAW_LOG("Invalid module header"); + return; + } + + const load_command* command_ptr = reinterpret_cast<const load_command*>( + reinterpret_cast<const mach_header_64*>(address) + 1); + + ScopedVMRead<load_command> command; + if (!command.Read(command_ptr)) { + CRASHPAD_RAW_LOG("Invalid module command"); + return; + } + + // Make sure that the basic load command structure doesn’t overflow the + // space allotted for load commands, as well as iterating through ncmds. + vm_size_t slide = 0; + const symtab_command* symtab_command = nullptr; + const dysymtab_command* dysymtab_command = nullptr; + const segment_command_64* linkedit_seg = nullptr; + const segment_command_64* text_seg = nullptr; + for (uint32_t cmd_index = 0, cumulative_cmd_size = 0; + cmd_index <= header->ncmds && cumulative_cmd_size < header->sizeofcmds; + ++cmd_index, cumulative_cmd_size += command->cmdsize) { + if (command->cmd == LC_SEGMENT_64) { + ScopedVMRead<segment_command_64> segment; + if (!segment.Read(command_ptr)) { + CRASHPAD_RAW_LOG("Invalid LC_SEGMENT_64 segment"); + return; + } + const segment_command_64* segment_ptr = + reinterpret_cast<const segment_command_64*>(command_ptr); + if (strcmp(segment->segname, SEG_TEXT) == 0) { + text_seg = segment_ptr; + WriteProperty(writer, IntermediateDumpKey::kSize, &segment->vmsize); + slide = address - segment->vmaddr; + } else if (strcmp(segment->segname, SEG_DATA) == 0) { + WriteDataSegmentAnnotations(writer, segment_ptr, slide); + } else if (strcmp(segment->segname, SEG_LINKEDIT) == 0) { + linkedit_seg = segment_ptr; + } + } else if (command->cmd == LC_SYMTAB) { + symtab_command = + reinterpret_cast<const struct symtab_command*>(command_ptr); + } else if (command->cmd == LC_DYSYMTAB) { + dysymtab_command = + reinterpret_cast<const struct dysymtab_command*>(command_ptr); + } else if (command->cmd == LC_ID_DYLIB) { + ScopedVMRead<dylib_command> dylib; + if (!dylib.Read(command_ptr)) { + CRASHPAD_RAW_LOG("Invalid LC_ID_DYLIB segment"); + return; + } + WriteProperty(writer, + IntermediateDumpKey::kDylibCurrentVersion, + &dylib->dylib.current_version); + } else if (command->cmd == LC_SOURCE_VERSION) { + ScopedVMRead<source_version_command> source_version; + if (!source_version.Read(command_ptr)) { + CRASHPAD_RAW_LOG("Invalid LC_SOURCE_VERSION segment"); + return; + } + WriteProperty(writer, + IntermediateDumpKey::kSourceVersion, + &source_version->version); + } else if (command->cmd == LC_UUID) { + ScopedVMRead<uuid_command> uuid; + if (!uuid.Read(command_ptr)) { + CRASHPAD_RAW_LOG("Invalid LC_UUID segment"); + return; + } + WriteProperty(writer, IntermediateDumpKey::kUUID, &uuid->uuid); + } + + command_ptr = reinterpret_cast<const load_command*>( + reinterpret_cast<const uint8_t*>(command_ptr) + command->cmdsize); + if (!command.Read(command_ptr)) { + CRASHPAD_RAW_LOG("Invalid module command"); + return; + } + } + + WriteProperty(writer, IntermediateDumpKey::kFileType, &header->filetype); + + if (is_dyld && header->filetype == MH_DYLINKER) { + WriteDyldErrorStringAnnotation(writer, + address, + symtab_command, + dysymtab_command, + text_seg, + linkedit_seg, + slide); + } +} + +void InProcessIntermediateDumpHandler::WriteDataSegmentAnnotations( + IOSIntermediateDumpWriter* writer, + const segment_command_64* segment_ptr, + vm_size_t slide) { + ScopedVMRead<segment_command_64> segment; + if (!segment.Read(segment_ptr)) { + CRASHPAD_RAW_LOG("Unable to read SEG_DATA."); + return; + } + const section_64* section_ptr = reinterpret_cast<const section_64*>( + reinterpret_cast<uint64_t>(segment_ptr) + sizeof(segment_command_64)); + for (uint32_t sect_index = 0; sect_index <= segment->nsects; ++sect_index) { + ScopedVMRead<section_64> section; + if (!section.Read(section_ptr)) { + CRASHPAD_RAW_LOG("Unable to read SEG_DATA section."); + return; + } + if (strcmp(section->sectname, "crashpad_info") == 0) { + ScopedVMRead<CrashpadInfo> crashpad_info; + if (crashpad_info.Read(section->addr + slide) && + crashpad_info->size() == sizeof(CrashpadInfo) && + crashpad_info->signature() == CrashpadInfo::kSignature && + crashpad_info->version() == 1) { + WriteCrashpadAnnotationsList(writer, crashpad_info.get()); + WriteCrashpadSimpleAnnotationsDictionary(writer, crashpad_info.get()); + } + } else if (strcmp(section->sectname, "__crash_info") == 0) { + ScopedVMRead<crashreporter_annotations_t> crash_info; + if (!crash_info.Read(section->addr + slide) || + (crash_info->version != 4 && crash_info->version != 5)) { + continue; + } + WriteAppleCrashReporterAnnotations(writer, crash_info.get()); + } + section_ptr = reinterpret_cast<const section_64*>( + reinterpret_cast<uint64_t>(section_ptr) + sizeof(section_64)); + } +} + +void InProcessIntermediateDumpHandler::WriteCrashpadAnnotationsList( + IOSIntermediateDumpWriter* writer, + CrashpadInfo* crashpad_info) { + if (!crashpad_info->annotations_list()) { + return; + } + ScopedVMRead<AnnotationList> annotation_list; + if (!annotation_list.Read(crashpad_info->annotations_list())) { + CRASHPAD_RAW_LOG("Unable to read annotations list object"); + return; + } + + IOSIntermediateDumpWriter::ScopedArray annotations_array( + writer, IntermediateDumpKey::kAnnotationObjects); + ScopedVMRead<Annotation> current; + if (!current.Read(annotation_list->head())) { + CRASHPAD_RAW_LOG("Unable to read annotation"); + return; + } + + for (size_t index = 0; + current->link_node() != annotation_list.get()->tail_pointer() && + index < kMaxNumberOfAnnotations; + ++index) { + ScopedVMRead<Annotation> node; + if (!node.Read(current->link_node())) { + CRASHPAD_RAW_LOG("Unable to read annotation"); + return; + } + current.Read(current->link_node()); + + if (node->size() == 0) + continue; + + if (node->size() > Annotation::kValueMaxSize) { + CRASHPAD_RAW_LOG("Incorrect annotation length"); + continue; + } + + IOSIntermediateDumpWriter::ScopedArrayMap annotation_map(writer); + const size_t name_len = strnlen(reinterpret_cast<const char*>(node->name()), + Annotation::kNameMaxLength); + WritePropertyBytes(writer, + IntermediateDumpKey::kAnnotationName, + reinterpret_cast<const void*>(node->name()), + name_len); + WritePropertyBytes(writer, + IntermediateDumpKey::kAnnotationValue, + reinterpret_cast<const void*>(node->value()), + node->size()); + Annotation::Type type = node->type(); + WritePropertyBytes(writer, + IntermediateDumpKey::kAnnotationType, + reinterpret_cast<const void*>(&type), + sizeof(type)); + } +} + +} // namespace internal +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/client/ios_handler/in_process_intermediate_dump_handler.h b/third_party/crashpad/crashpad/client/ios_handler/in_process_intermediate_dump_handler.h new file mode 100644 index 0000000..9a33ff4 --- /dev/null +++ b/third_party/crashpad/crashpad/client/ios_handler/in_process_intermediate_dump_handler.h
@@ -0,0 +1,146 @@ +// Copyright 2021 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CRASHPAD_CLIENT_IOS_HANDLER_IN_PROCESS_INTERMEDIATE_DUMP_HANDLER_H_ +#define CRASHPAD_CLIENT_IOS_HANDLER_IN_PROCESS_INTERMEDIATE_DUMP_HANDLER_H_ + +#include <mach-o/loader.h> +#include <mach/mach.h> +#include <signal.h> +#include <sys/types.h> + +#include "client/crashpad_info.h" +#include "util/ios/ios_intermediate_dump_writer.h" +#include "util/ios/ios_system_data_collector.h" +#include "util/mach/mach_extensions.h" + +namespace crashpad { +namespace internal { + +//! \brief Dump all in-process data to iOS intermediate dump. +//! Note: All methods are `RUNS-DURING-CRASH`. +class InProcessIntermediateDumpHandler final { + public: + //! \brief Set kVersion to 1. + //! + //! \param[in] writer The dump writer + static void WriteHeader(IOSIntermediateDumpWriter* writer); + + //! \brief Write ProcessSnapshot data to the intermediate dump. + //! + //! \param[in] writer The dump writer + static void WriteProcessInfo(IOSIntermediateDumpWriter* writer); + + //! \brief Write SystemSnapshot data to the intermediate dump. + //! + //! \param[in] writer The dump writer + static void WriteSystemInfo(IOSIntermediateDumpWriter* writer, + const IOSSystemDataCollector& system_data); + + //! \brief Write ThreadSnapshot data to the intermediate dump. + //! + //! For uncaught NSExceptions, \a frames and \a num_frames will be added to + //! the intermediate dump for the exception thread. Otherwise, or for the + //! remaining threads, use `thread_get_state`. + //! + //! \param[in] writer The dump writer + //! \param[in] frames An array of callstack return addresses. + //! \param[in] num_frames The number of callstack return address in \a frames. + static void WriteThreadInfo(IOSIntermediateDumpWriter* writer, + const uint64_t* frames, + const size_t num_frames); + + //! \brief Write ModuleSnapshot data to the intermediate dump. + //! + //! This includes both modules and annotations. + //! + //! \param[in] writer The dump writer + static void WriteModuleInfo(IOSIntermediateDumpWriter* writer); + + //! \brief Write an ExceptionSnapshot from a signal to the intermediate dump. + //! + //! Only one of the WriteExceptionFromSignal, WriteExceptionFromMachException + //! and WriteExceptionFromNSException should be called per intermediate dump. + //! + //! \param[in] writer The dump writer + //! \param[in] system_data An object containing various system data points. + //! \param[in] siginfo A pointer to a `siginfo_t` object received by a signal + //! handler. + //! \param[in] context A pointer to a `ucontext_t` object received by a + //! signal. + static void WriteExceptionFromSignal( + IOSIntermediateDumpWriter* writer, + const IOSSystemDataCollector& system_data, + siginfo_t* siginfo, + ucontext_t* context); + + //! \brief Write an ExceptionSnapshot from a mach exception to the + //! intermediate dump. + //! + //! Only one of the WriteExceptionFromSignal, WriteExceptionFromMachException + //! and WriteExceptionFromNSException should be called per intermediate dump. + //! + //! \param[in] writer The dump writer + //! \param[in] system_data An object containing various system data points. + //! \param[in] behavior + //! \param[in] thread + //! \param[in] exception + //! \param[in] code + //! \param[in] code_count + //! \param[in] flavor + //! \param[in] old_state + //! \param[in] old_state_count + static void WriteExceptionFromMachException( + IOSIntermediateDumpWriter* writer, + exception_behavior_t behavior, + thread_t thread, + exception_type_t exception, + const mach_exception_data_type_t* code, + mach_msg_type_number_t code_count, + thread_state_flavor_t flavor, + ConstThreadState old_state, + mach_msg_type_number_t old_state_count); + + //! \brief Write an ExceptionSnapshot from an NSException to the + //! intermediate dump. + //! + //! Only one of the WriteExceptionFromSignal, WriteExceptionFromMachException + //! and WriteExceptionFromNSException should be called per intermediate dump. + //! + //! \param[in] writer The dump writer + static void WriteExceptionFromNSException(IOSIntermediateDumpWriter* writer); + + private: + //! \brief Parse and extract module and annotation information from header. + static void WriteModuleInfoAtAddress(IOSIntermediateDumpWriter* writer, + uint64_t address, + bool is_dyld); + + //! \brief Extract and write Apple crashreporter_annotations_t data and + //! Crashpad annotations. + static void WriteDataSegmentAnnotations(IOSIntermediateDumpWriter* writer, + const segment_command_64* segment_ptr, + vm_size_t slide); + + //! \brief Write Crashpad annotations list. + static void WriteCrashpadAnnotationsList(IOSIntermediateDumpWriter* writer, + CrashpadInfo* crashpad_info); + + DISALLOW_IMPLICIT_CONSTRUCTORS(InProcessIntermediateDumpHandler); +}; + +} // namespace internal +} // namespace crashpad + +#endif // CRASHPAD_CLIENT_IOS_HANDLER_IN_PROCESS_INTERMEDIATE_DUMP_HANDLER_H_
diff --git a/third_party/crashpad/crashpad/client/ios_handler/in_process_intermediate_dump_handler_test.cc b/third_party/crashpad/crashpad/client/ios_handler/in_process_intermediate_dump_handler_test.cc new file mode 100644 index 0000000..9616ce7 --- /dev/null +++ b/third_party/crashpad/crashpad/client/ios_handler/in_process_intermediate_dump_handler_test.cc
@@ -0,0 +1,242 @@ +// Copyright 2021 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "client/ios_handler/in_process_intermediate_dump_handler.h" + +#include <sys/utsname.h> + +#include "base/cxx17_backports.h" +#include "base/files/file_path.h" +#include "build/build_config.h" +#include "client/annotation.h" +#include "client/annotation_list.h" +#include "client/crashpad_info.h" +#include "client/simple_string_dictionary.h" +#include "gtest/gtest.h" +#include "snapshot/ios/process_snapshot_ios_intermediate_dump.h" +#include "test/scoped_temp_dir.h" +#include "test/test_paths.h" +#include "util/file/filesystem.h" +#include "util/misc/capture_context.h" + +namespace crashpad { +namespace test { +namespace { + +using internal::InProcessIntermediateDumpHandler; + +class InProcessIntermediateDumpHandlerTest : public testing::Test { + protected: + // testing::Test: + + void SetUp() override { + path_ = temp_dir_.path().Append("dump_file"); + writer_ = std::make_unique<internal::IOSIntermediateDumpWriter>(); + EXPECT_TRUE(writer_->Open(path_)); + ASSERT_TRUE(IsRegularFile(path_)); + } + + void TearDown() override { + writer_.reset(); + EXPECT_FALSE(IsRegularFile(path_)); + } + + void WriteReport() { + internal::IOSIntermediateDumpWriter::ScopedRootMap rootMap(writer_.get()); + InProcessIntermediateDumpHandler::WriteHeader(writer_.get()); + InProcessIntermediateDumpHandler::WriteProcessInfo(writer_.get()); + InProcessIntermediateDumpHandler::WriteSystemInfo(writer_.get(), + system_data_); + InProcessIntermediateDumpHandler::WriteThreadInfo(writer_.get(), 0, 0); + InProcessIntermediateDumpHandler::WriteModuleInfo(writer_.get()); + } + + void WriteMachException() { + crashpad::NativeCPUContext cpu_context; + crashpad::CaptureContext(&cpu_context); + const mach_exception_data_type_t code[2] = {}; + static constexpr int kSimulatedException = -1; + InProcessIntermediateDumpHandler::WriteExceptionFromMachException( + writer_.get(), + MACH_EXCEPTION_CODES, + mach_thread_self(), + kSimulatedException, + code, + base::size(code), + MACHINE_THREAD_STATE, + reinterpret_cast<ConstThreadState>(&cpu_context), + MACHINE_THREAD_STATE_COUNT); + } + + const auto& path() const { return path_; } + auto writer() const { return writer_.get(); } + + private: + std::unique_ptr<internal::IOSIntermediateDumpWriter> writer_; + internal::IOSSystemDataCollector system_data_; + ScopedTempDir temp_dir_; + base::FilePath path_; +}; + +TEST_F(InProcessIntermediateDumpHandlerTest, TestSystem) { + WriteReport(); + internal::ProcessSnapshotIOSIntermediateDump process_snapshot; + ASSERT_TRUE(process_snapshot.Initialize(path(), {})); + + // Snpahot + const SystemSnapshot* system = process_snapshot.System(); + ASSERT_NE(system, nullptr); +#if defined(ARCH_CPU_X86_64) + EXPECT_EQ(system->GetCPUArchitecture(), kCPUArchitectureX86_64); + EXPECT_STREQ(system->CPUVendor().c_str(), "GenuineIntel"); +#elif defined(ARCH_CPU_ARM64) + EXPECT_EQ(system->GetCPUArchitecture(), kCPUArchitectureARM64); + utsname uts; + ASSERT_EQ(uname(&uts), 0); + EXPECT_STREQ(system->MachineDescription().c_str(), uts.machine); +#else +#error Port to your CPU architecture +#endif + EXPECT_EQ(system->GetOperatingSystem(), SystemSnapshot::kOperatingSystemIOS); +} + +TEST_F(InProcessIntermediateDumpHandlerTest, TestAnnotations) { + // This is “leaked” to crashpad_info. + crashpad::SimpleStringDictionary* simple_annotations = + new crashpad::SimpleStringDictionary(); + simple_annotations->SetKeyValue("#TEST# pad", "break"); + simple_annotations->SetKeyValue("#TEST# key", "value"); + simple_annotations->SetKeyValue("#TEST# pad", "crash"); + simple_annotations->SetKeyValue("#TEST# x", "y"); + simple_annotations->SetKeyValue("#TEST# longer", "shorter"); + simple_annotations->SetKeyValue("#TEST# empty_value", ""); + + crashpad::CrashpadInfo* crashpad_info = + crashpad::CrashpadInfo::GetCrashpadInfo(); + + crashpad_info->set_simple_annotations(simple_annotations); + + crashpad::AnnotationList::Register(); // This is “leaked” to crashpad_info. + + static crashpad::StringAnnotation<32> test_annotation_one{"#TEST# one"}; + static crashpad::StringAnnotation<32> test_annotation_two{"#TEST# two"}; + static crashpad::StringAnnotation<32> test_annotation_three{ + "#TEST# same-name"}; + static crashpad::StringAnnotation<32> test_annotation_four{ + "#TEST# same-name"}; + + test_annotation_one.Set("moocow"); + test_annotation_two.Set("this will be cleared"); + test_annotation_three.Set("same-name 3"); + test_annotation_four.Set("same-name 4"); + test_annotation_two.Clear(); + + WriteReport(); + internal::ProcessSnapshotIOSIntermediateDump process_snapshot; + ASSERT_TRUE(process_snapshot.Initialize(path(), {{"after_dump", "post"}})); + + auto process_map = process_snapshot.AnnotationsSimpleMap(); + EXPECT_EQ(process_map.size(), 1u); + EXPECT_EQ(process_map["after_dump"], "post"); + + std::map<std::string, std::string> all_annotations_simple_map; + std::vector<AnnotationSnapshot> all_annotations; + for (const auto* module : process_snapshot.Modules()) { + std::map<std::string, std::string> module_annotations_simple_map = + module->AnnotationsSimpleMap(); + all_annotations_simple_map.insert(module_annotations_simple_map.begin(), + module_annotations_simple_map.end()); + + std::vector<AnnotationSnapshot> annotations = module->AnnotationObjects(); + all_annotations.insert( + all_annotations.end(), annotations.begin(), annotations.end()); + } + + EXPECT_EQ(all_annotations_simple_map.size(), 5u); + EXPECT_EQ(all_annotations_simple_map["#TEST# pad"], "crash"); + EXPECT_EQ(all_annotations_simple_map["#TEST# key"], "value"); + EXPECT_EQ(all_annotations_simple_map["#TEST# x"], "y"); + EXPECT_EQ(all_annotations_simple_map["#TEST# longer"], "shorter"); + EXPECT_EQ(all_annotations_simple_map["#TEST# empty_value"], ""); + + bool saw_same_name_3 = false, saw_same_name_4 = false; + for (const auto& annotation : all_annotations) { + EXPECT_EQ(annotation.type, + static_cast<uint16_t>(Annotation::Type::kString)); + std::string value(reinterpret_cast<const char*>(annotation.value.data()), + annotation.value.size()); + if (annotation.name == "#TEST# one") { + EXPECT_EQ(value, "moocow"); + } else if (annotation.name == "#TEST# same-name") { + if (value == "same-name 3") { + EXPECT_FALSE(saw_same_name_3); + saw_same_name_3 = true; + } else if (value == "same-name 4") { + EXPECT_FALSE(saw_same_name_4); + saw_same_name_4 = true; + } else { + ADD_FAILURE() << "unexpected annotation value " << value; + } + } else { + ADD_FAILURE() << "unexpected annotation " << annotation.name; + } + } +} + +TEST_F(InProcessIntermediateDumpHandlerTest, TestThreads) { + WriteReport(); + internal::ProcessSnapshotIOSIntermediateDump process_snapshot; + ASSERT_TRUE(process_snapshot.Initialize(path(), {})); + + const auto& threads = process_snapshot.Threads(); + ASSERT_GT(threads.size(), 0u); + + thread_identifier_info identifier_info; + mach_msg_type_number_t count = THREAD_IDENTIFIER_INFO_COUNT; + ASSERT_EQ(thread_info(mach_thread_self(), + THREAD_IDENTIFIER_INFO, + reinterpret_cast<thread_info_t>(&identifier_info), + &count), + 0); + EXPECT_EQ(threads[0]->ThreadID(), identifier_info.thread_id); +} + +TEST_F(InProcessIntermediateDumpHandlerTest, TestProcess) { + WriteReport(); + internal::ProcessSnapshotIOSIntermediateDump process_snapshot; + ASSERT_TRUE(process_snapshot.Initialize(path(), {})); + EXPECT_EQ(process_snapshot.ProcessID(), getpid()); +} + +TEST_F(InProcessIntermediateDumpHandlerTest, TestMachException) { + WriteReport(); + internal::ProcessSnapshotIOSIntermediateDump process_snapshot; + ASSERT_TRUE(process_snapshot.Initialize(path(), {})); +} + +TEST_F(InProcessIntermediateDumpHandlerTest, TestSignalException) { + WriteReport(); + internal::ProcessSnapshotIOSIntermediateDump process_snapshot; + ASSERT_TRUE(process_snapshot.Initialize(path(), {})); +} + +TEST_F(InProcessIntermediateDumpHandlerTest, TestNSException) { + WriteReport(); + internal::ProcessSnapshotIOSIntermediateDump process_snapshot; + ASSERT_TRUE(process_snapshot.Initialize(path(), {})); +} + +} // namespace +} // namespace test +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/client/prune_crash_reports_test.cc b/third_party/crashpad/crashpad/client/prune_crash_reports_test.cc index 32f8388..333c37e 100644 --- a/third_party/crashpad/crashpad/client/prune_crash_reports_test.cc +++ b/third_party/crashpad/crashpad/client/prune_crash_reports_test.cc
@@ -36,22 +36,39 @@ class MockDatabase : public CrashReportDatabase { public: // CrashReportDatabase: - MOCK_METHOD0(GetSettings, Settings*()); - MOCK_METHOD1(PrepareNewCrashReport, - OperationStatus(std::unique_ptr<NewReport>*)); - MOCK_METHOD2(LookUpCrashReport, OperationStatus(const UUID&, Report*)); - MOCK_METHOD1(GetPendingReports, OperationStatus(std::vector<Report>*)); - MOCK_METHOD1(GetCompletedReports, OperationStatus(std::vector<Report>*)); - MOCK_METHOD3(GetReportForUploading, - OperationStatus(const UUID&, - std::unique_ptr<const UploadReport>*, - bool report_metrics)); - MOCK_METHOD3(RecordUploadAttempt, - OperationStatus(UploadReport*, bool, const std::string&)); - MOCK_METHOD2(SkipReportUpload, - OperationStatus(const UUID&, Metrics::CrashSkippedReason)); - MOCK_METHOD1(DeleteReport, OperationStatus(const UUID&)); - MOCK_METHOD1(RequestUpload, OperationStatus(const UUID&)); + MOCK_METHOD(Settings*, GetSettings, (), (override)); + MOCK_METHOD(OperationStatus, + PrepareNewCrashReport, + (std::unique_ptr<NewReport>*), + (override)); + MOCK_METHOD(OperationStatus, + LookUpCrashReport, + (const UUID&, Report*), + (override)); + MOCK_METHOD(OperationStatus, + GetPendingReports, + (std::vector<Report>*), + (override)); + MOCK_METHOD(OperationStatus, + GetCompletedReports, + (std::vector<Report>*), + (override)); + MOCK_METHOD(OperationStatus, + GetReportForUploading, + (const UUID&, + std::unique_ptr<const UploadReport>*, + bool report_metrics), + (override)); + MOCK_METHOD(OperationStatus, + RecordUploadAttempt, + (UploadReport*, bool, const std::string&), + (override)); + MOCK_METHOD(OperationStatus, + SkipReportUpload, + (const UUID&, Metrics::CrashSkippedReason), + (override)); + MOCK_METHOD(OperationStatus, DeleteReport, (const UUID&), (override)); + MOCK_METHOD(OperationStatus, RequestUpload, (const UUID&), (override)); // Google Mock doesn't support mocking methods with non-copyable types such as // unique_ptr. @@ -158,6 +175,7 @@ bool lhs_executed; bool rhs_executed; } kTests[] = { + // clang-format off {"false && false", BinaryPruneCondition::AND, false, false, false, true, false}, @@ -182,6 +200,7 @@ {"true || true", BinaryPruneCondition::OR, true, true, true, true, false}, + // clang-format on }; for (const auto& test : kTests) { SCOPED_TRACE(test.name); @@ -215,18 +234,18 @@ } std::mt19937 urng(std::random_device{}()); std::shuffle(reports.begin(), reports.end(), urng); - std::vector<CrashReportDatabase::Report> pending_reports( - reports.begin(), reports.begin() + 5); + std::vector<CrashReportDatabase::Report> pending_reports(reports.begin(), + reports.begin() + 5); std::vector<CrashReportDatabase::Report> completed_reports( reports.begin() + 5, reports.end()); MockDatabase db; - EXPECT_CALL(db, GetPendingReports(_)).WillOnce(DoAll( - SetArgPointee<0>(pending_reports), - Return(CrashReportDatabase::kNoError))); - EXPECT_CALL(db, GetCompletedReports(_)).WillOnce(DoAll( - SetArgPointee<0>(completed_reports), - Return(CrashReportDatabase::kNoError))); + EXPECT_CALL(db, GetPendingReports(_)) + .WillOnce(DoAll(SetArgPointee<0>(pending_reports), + Return(CrashReportDatabase::kNoError))); + EXPECT_CALL(db, GetCompletedReports(_)) + .WillOnce(DoAll(SetArgPointee<0>(completed_reports), + Return(CrashReportDatabase::kNoError))); for (size_t i = 0; i < reports.size(); ++i) { EXPECT_CALL(db, DeleteReport(TestUUID(i))) .WillOnce(Return(CrashReportDatabase::kNoError));
diff --git a/third_party/crashpad/crashpad/compat/BUILD.gn b/third_party/crashpad/crashpad/compat/BUILD.gn index 91c437d..8d76325 100644 --- a/third_party/crashpad/crashpad/compat/BUILD.gn +++ b/third_party/crashpad/crashpad/compat/BUILD.gn
@@ -145,7 +145,7 @@ ] if (!crashpad_is_win) { - public_deps = [ "../third_party/mini_chromium:base" ] + public_deps = [ "$mini_chromium_source_parent:base" ] } deps = [ "../util:no_cfi_icall" ]
diff --git a/third_party/crashpad/crashpad/compat/compat.gyp b/third_party/crashpad/crashpad/compat/compat.gyp deleted file mode 100644 index 693f2c6..0000000 --- a/third_party/crashpad/crashpad/compat/compat.gyp +++ /dev/null
@@ -1,146 +0,0 @@ -# Copyright 2014 The Crashpad Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -{ - 'includes': [ - '../build/crashpad.gypi', - ], - 'targets': [ - { - 'target_name': 'crashpad_compat', - 'dependencies': [ - '../util/no_cfi_icall.gyp:no_cfi_icall', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - 'android/dlfcn_internal.cc', - 'android/dlfcn_internal.h', - 'android/elf.h', - 'android/linux/elf.h', - 'android/linux/prctl.h', - 'android/linux/ptrace.h', - 'android/sched.h', - 'android/sys/epoll.cc', - 'android/sys/epoll.h', - 'android/sys/mman.h', - 'android/sys/mman_mmap.cc', - 'android/sys/syscall.h', - 'android/sys/user.h', - 'linux/signal.h', - 'linux/sys/ptrace.h', - 'linux/sys/user.h', - 'mac/Availability.h', - 'mac/AvailabilityVersions.h', - 'mac/kern/exc_resource.h', - 'mac/mach/i386/thread_state.h', - 'mac/mach/mach.h', - 'mac/mach-o/loader.h', - 'mac/sys/resource.h', - 'non_mac/mach/mach.h', - 'non_win/dbghelp.h', - 'non_win/minwinbase.h', - 'non_win/timezoneapi.h', - 'non_win/verrsrc.h', - 'non_win/windows.h', - 'non_win/winnt.h', - 'win/getopt.h', - 'win/strings.cc', - 'win/strings.h', - 'win/sys/time.h', - 'win/sys/types.h', - 'win/time.cc', - 'win/time.h', - 'win/winbase.h', - 'win/winnt.h', - 'win/winternl.h', - ], - 'conditions': [ - ['OS=="mac"', { - 'type': 'none', - 'include_dirs': [ - 'mac', - ], - 'direct_dependent_settings': { - 'include_dirs': [ - 'mac', - ], - }, - }, { - 'include_dirs': [ - 'non_mac', - ], - 'direct_dependent_settings': { - 'include_dirs': [ - 'non_mac', - ], - }, - }], - ['OS=="win"', { - 'type': 'static_library', - 'include_dirs': [ - 'win', - ], - 'direct_dependent_settings': { - 'include_dirs': [ - 'win', - ], - }, - 'dependencies': [ - '../third_party/getopt/getopt.gyp:getopt', - ], - }, { - 'include_dirs': [ - 'non_win', - ], - 'direct_dependent_settings': { - 'include_dirs': [ - 'non_win', - ], - }, - }], - ['OS=="android"', { - 'type': 'static_library', - 'include_dirs': [ - 'android', - 'linux', - ], - 'direct_dependent_settings': { - 'include_dirs': [ - 'android', - 'linux', - ], - }, - 'link_settings': { - 'libraries': [ - '-ldl', - ], - }, - }], - ['OS=="linux"', { - 'type': 'none', - 'include_dirs': [ - 'linux', - ], - 'direct_dependent_settings': { - 'include_dirs': [ - 'linux', - ], - }, - }], - ], - }, - ], -}
diff --git a/third_party/crashpad/crashpad/crashpad.gyp b/third_party/crashpad/crashpad/crashpad.gyp deleted file mode 100644 index f30a9df..0000000 --- a/third_party/crashpad/crashpad/crashpad.gyp +++ /dev/null
@@ -1,47 +0,0 @@ -# Copyright 2014 The Crashpad Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -{ - 'targets': [ - { - 'target_name': 'All', - 'type': 'none', - 'dependencies': [ - 'client/client.gyp:*', - 'client/client_test.gyp:*', - 'compat/compat.gyp:*', - 'handler/handler.gyp:*', - 'handler/handler_test.gyp:*', - 'minidump/minidump.gyp:*', - 'minidump/minidump_test.gyp:*', - 'snapshot/snapshot.gyp:*', - 'snapshot/snapshot_test.gyp:*', - 'test/test.gyp:*', - 'test/test_test.gyp:*', - 'tools/tools.gyp:*', - 'util/util.gyp:*', - 'util/util_test.gyp:*', - ], - 'sources': [ - 'doc/support/crashpad.doxy.h', - 'package.h', - ], - 'conditions': [ - ['OS!="mac" and OS!="win"', { - 'suppress_wildcard': 1, - }], - ], - }, - ], -}
diff --git a/third_party/crashpad/crashpad/doc/developing.md b/third_party/crashpad/crashpad/doc/developing.md index 835fb5a..60c4155 100644 --- a/third_party/crashpad/crashpad/doc/developing.md +++ b/third_party/crashpad/crashpad/doc/developing.md
@@ -150,29 +150,16 @@ suitable location. These instructions assume that it’s been expanded to `~/android-ndk-r21b`. -Note that Chrome uses Android API level 21 for 64-bit platforms and 16 for +Note that Chrome uses Android API level 21 for both 64-bit platforms and 32-bit platforms. See Chrome’s [`build/config/android/config.gni`](https://chromium.googlesource.com/chromium/src/+/master/build/config/android/config.gni) which sets `android32_ndk_api_level` and `android64_ndk_api_level`. -To configure a Crashpad build for Android, use `gyp_crashpad_android.py`. This -script is a wrapper for `gyp_crashpad.py` that sets several environment -variables directing the build to the toolchain, and several GYP options to -identify an Android build. This must be done after any `gclient sync`, or -instead of any `gclient runhooks` operation. - +Set these gn args ``` -$ cd ~/crashpad/crashpad -python build/gyp_crashpad_android.py \ - --ndk ~/android-ndk-r21b --arch arm64 --api-level 21 \ - --generator-output out/android_arm64_api21 \ -``` - -To build, direct `ninja` to the specific `out` directory chosen by the -`--generator-output` argument to `gyp_crashpad_android.py`. - -``` -$ ninja -C out/android_arm64_api21/out/Debug all +target_os = "android" +android_ndk_root = ~/android-ndk-r21b +android_api_level = 21 ``` ## Testing
diff --git a/third_party/crashpad/crashpad/handler/handler.gyp b/third_party/crashpad/crashpad/handler/handler.gyp deleted file mode 100644 index f8313a53..0000000 --- a/third_party/crashpad/crashpad/handler/handler.gyp +++ /dev/null
@@ -1,134 +0,0 @@ -# Copyright 2014 The Crashpad Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -{ - 'includes': [ - '../build/crashpad.gypi', - ], - 'targets': [ - { - # This target exists so that the crashpad_handler can be embedded into - # another binary. - 'target_name': 'crashpad_handler_lib', - 'type': 'static_library', - 'dependencies': [ - '../client/client.gyp:crashpad_client', - '../compat/compat.gyp:crashpad_compat', - '../minidump/minidump.gyp:crashpad_minidump', - '../snapshot/snapshot.gyp:crashpad_snapshot', - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../third_party/zlib/zlib.gyp:zlib', - '../tools/tools.gyp:crashpad_tool_support', - '../util/util.gyp:crashpad_util', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - 'crash_report_upload_thread.cc', - 'crash_report_upload_thread.h', - 'handler_main.cc', - 'handler_main.h', - 'linux/capture_snapshot.cc', - 'linux/capture_snapshot.h', - 'linux/crash_report_exception_handler.cc', - 'linux/crash_report_exception_handler.h', - 'linux/exception_handler_server.cc', - 'linux/exception_handler_server.h', - 'mac/crash_report_exception_handler.cc', - 'mac/crash_report_exception_handler.h', - 'mac/exception_handler_server.cc', - 'mac/exception_handler_server.h', - 'mac/file_limit_annotation.cc', - 'mac/file_limit_annotation.h', - 'minidump_to_upload_parameters.cc', - 'minidump_to_upload_parameters.h', - 'prune_crash_reports_thread.cc', - 'prune_crash_reports_thread.h', - 'user_stream_data_source.cc', - 'user_stream_data_source.h', - 'win/crash_report_exception_handler.cc', - 'win/crash_report_exception_handler.h', - ], - 'target_conditions': [ - ['OS=="android"', { - 'sources/': [ - ['include', '^linux/'], - ], - }], - ], - }, - { - 'target_name': 'crashpad_handler', - 'type': 'executable', - 'dependencies': [ - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../tools/tools.gyp:crashpad_tool_support', - 'crashpad_handler_lib', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - 'main.cc', - ], - - 'conditions': [ - ['OS=="win"', { - 'msvs_settings': { - 'VCLinkerTool': { - 'SubSystem': '2', # /SUBSYSTEM:WINDOWS - }, - }, - }], - ], - }, - ], - 'conditions': [ - ['OS=="win"', { - 'targets': [ - { - # Duplicates crashpad_handler.exe to crashpad_handler.com and makes it - # a console app. - 'target_name': 'crashpad_handler_console', - 'type': 'none', - 'dependencies': [ - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../tools/tools.gyp:crashpad_tool_support', - 'crashpad_handler', - ], - 'actions': [ - { - 'action_name': 'copy handler exe to com', - 'inputs': [ - '<(PRODUCT_DIR)/crashpad_handler.exe', - ], - 'outputs': [ - '<(PRODUCT_DIR)/crashpad_handler.com', - ], - 'action': [ - 'copy <(PRODUCT_DIR)\crashpad_handler.exe ' - '<(PRODUCT_DIR)\crashpad_handler.com >nul && ' - 'editbin -nologo -subsystem:console ' - '<(PRODUCT_DIR)\crashpad_handler.com >nul', - ], - 'msvs_cygwin_shell': '0', - 'quote_cmd': '0', - }, - ], - }, - ], - }], - ], -}
diff --git a/third_party/crashpad/crashpad/handler/handler_test.gyp b/third_party/crashpad/crashpad/handler/handler_test.gyp deleted file mode 100644 index 386ac29..0000000 --- a/third_party/crashpad/crashpad/handler/handler_test.gyp +++ /dev/null
@@ -1,196 +0,0 @@ -# Copyright 2017 The Crashpad Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -{ - 'includes': [ - '../build/crashpad.gypi', - ], - 'targets': [ - { - 'target_name': 'crashpad_handler_test', - 'type': 'executable', - 'dependencies': [ - 'crashpad_handler_test_extended_handler', - 'handler.gyp:crashpad_handler_lib', - '../client/client.gyp:crashpad_client', - '../compat/compat.gyp:crashpad_compat', - '../snapshot/snapshot.gyp:crashpad_snapshot', - '../snapshot/snapshot_test.gyp:crashpad_snapshot_test_lib', - '../test/test.gyp:crashpad_googletest_main', - '../test/test.gyp:crashpad_test', - '../third_party/googletest/googletest.gyp:googletest', - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../util/util.gyp:crashpad_util', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - 'crashpad_handler_test.cc', - 'linux/exception_handler_server_test.cc', - 'minidump_to_upload_parameters_test.cc', - ], - 'conditions': [ - ['OS!="win"', { - 'dependencies!': [ - 'crashpad_handler_test_extended_handler', - ], - 'sources!': [ - 'crashpad_handler_test.cc', - ], - }], - ], - 'target_conditions': [ - ['OS=="android"', { - 'sources/': [ - ['include', '^linux/'], - ], - }], - ], - }, - { - 'target_name': 'crashpad_handler_test_extended_handler', - 'type': 'executable', - 'dependencies': [ - '../compat/compat.gyp:crashpad_compat', - '../minidump/minidump_test.gyp:crashpad_minidump_test_lib', - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../tools/tools.gyp:crashpad_tool_support', - 'handler.gyp:crashpad_handler_lib', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - 'crashpad_handler_test_extended_handler.cc', - ], - }, - ], - 'conditions': [ - ['OS=="win"', { - 'targets': [ - { - 'target_name': 'crash_other_program', - 'type': 'executable', - 'dependencies': [ - '../client/client.gyp:crashpad_client', - '../test/test.gyp:crashpad_test', - '../third_party/googletest/googletest.gyp:googletest', - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../util/util.gyp:crashpad_util', - ], - 'sources': [ - 'win/crash_other_program.cc', - ], - }, - { - 'target_name': 'crashy_program', - 'type': 'executable', - 'dependencies': [ - '../client/client.gyp:crashpad_client', - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../util/util.gyp:crashpad_util', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - 'win/crashy_test_program.cc', - ], - }, - { - 'target_name': 'crashy_signal', - 'type': 'executable', - 'dependencies': [ - '../client/client.gyp:crashpad_client', - '../third_party/mini_chromium/mini_chromium.gyp:base', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - 'win/crashy_signal.cc', - ], - }, - { - 'target_name': 'fake_handler_that_crashes_at_startup', - 'type': 'executable', - 'sources': [ - 'win/fake_handler_that_crashes_at_startup.cc', - ], - }, - { - 'target_name': 'hanging_program', - 'type': 'executable', - 'dependencies': [ - '../client/client.gyp:crashpad_client', - '../third_party/mini_chromium/mini_chromium.gyp:base', - ], - 'sources': [ - 'win/hanging_program.cc', - ], - }, - { - 'target_name': 'loader_lock_dll', - 'type': 'loadable_module', - 'sources': [ - 'win/loader_lock_dll.cc', - ], - 'msvs_settings': { - 'NoImportLibrary': 'true', - }, - }, - { - 'target_name': 'self_destroying_program', - 'type': 'executable', - 'dependencies': [ - '../client/client.gyp:crashpad_client', - '../compat/compat.gyp:crashpad_compat', - '../snapshot/snapshot.gyp:crashpad_snapshot', - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../util/util.gyp:crashpad_util', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - 'win/self_destroying_test_program.cc', - ], - }, - ], - 'conditions': [ - # Cannot create an x64 DLL with embedded debug info. - ['target_arch=="ia32"', { - 'targets': [ - { - 'target_name': 'crashy_z7_loader', - 'type': 'executable', - 'dependencies': [ - '../client/client.gyp:crashpad_client', - '../test/test.gyp:crashpad_test', - '../third_party/mini_chromium/mini_chromium.gyp:base', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - 'win/crashy_test_z7_loader.cc', - ], - }, - ], - }], - ], - }], - ], -}
diff --git a/third_party/crashpad/crashpad/minidump/BUILD.gn b/third_party/crashpad/crashpad/minidump/BUILD.gn index 459fd6b..515ec0f 100644 --- a/third_party/crashpad/crashpad/minidump/BUILD.gn +++ b/third_party/crashpad/crashpad/minidump/BUILD.gn
@@ -75,7 +75,7 @@ deps = [ "../snapshot", - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", "../util", ] @@ -101,7 +101,7 @@ deps = [ "../snapshot:context", - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", "../util", ] } @@ -136,7 +136,7 @@ "../snapshot:test_support", "../test", "../third_party/googletest:googletest", - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", "../util", ] @@ -179,7 +179,7 @@ "../snapshot:test_support", "../test", "../third_party/googletest:googletest", - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", "../util", ]
diff --git a/third_party/crashpad/crashpad/minidump/minidump.gyp b/third_party/crashpad/crashpad/minidump/minidump.gyp deleted file mode 100644 index 63e0ba6..0000000 --- a/third_party/crashpad/crashpad/minidump/minidump.gyp +++ /dev/null
@@ -1,90 +0,0 @@ -# Copyright 2014 The Crashpad Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -{ - 'includes': [ - '../build/crashpad.gypi', - ], - 'targets': [ - { - 'target_name': 'crashpad_minidump', - 'type': 'static_library', - 'dependencies': [ - '../compat/compat.gyp:crashpad_compat', - '../snapshot/snapshot.gyp:crashpad_snapshot', - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../util/util.gyp:crashpad_util', - ], - 'export_dependent_settings': [ - '../compat/compat.gyp:crashpad_compat', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - 'minidump_annotation_writer.cc', - 'minidump_annotation_writer.h', - 'minidump_byte_array_writer.cc', - 'minidump_byte_array_writer.h', - 'minidump_context.h', - 'minidump_context_writer.cc', - 'minidump_context_writer.h', - 'minidump_crashpad_info_writer.cc', - 'minidump_crashpad_info_writer.h', - 'minidump_exception_writer.cc', - 'minidump_exception_writer.h', - 'minidump_extensions.cc', - 'minidump_extensions.h', - 'minidump_file_writer.cc', - 'minidump_file_writer.h', - 'minidump_handle_writer.cc', - 'minidump_handle_writer.h', - 'minidump_memory_info_writer.cc', - 'minidump_memory_info_writer.h', - 'minidump_memory_writer.cc', - 'minidump_memory_writer.h', - 'minidump_misc_info_writer.cc', - 'minidump_misc_info_writer.h', - 'minidump_module_crashpad_info_writer.cc', - 'minidump_module_crashpad_info_writer.h', - 'minidump_module_writer.cc', - 'minidump_module_writer.h', - 'minidump_rva_list_writer.cc', - 'minidump_rva_list_writer.h', - 'minidump_simple_string_dictionary_writer.cc', - 'minidump_simple_string_dictionary_writer.h', - 'minidump_stream_writer.cc', - 'minidump_stream_writer.h', - 'minidump_string_writer.cc', - 'minidump_string_writer.h', - 'minidump_system_info_writer.cc', - 'minidump_system_info_writer.h', - 'minidump_thread_id_map.cc', - 'minidump_thread_id_map.h', - 'minidump_thread_writer.cc', - 'minidump_thread_writer.h', - 'minidump_unloaded_module_writer.cc', - 'minidump_unloaded_module_writer.h', - 'minidump_user_extension_stream_data_source.cc', - 'minidump_user_extension_stream_data_source.h', - 'minidump_user_stream_writer.cc', - 'minidump_user_stream_writer.h', - 'minidump_writable.cc', - 'minidump_writable.h', - 'minidump_writer_util.cc', - 'minidump_writer_util.h', - ], - }, - ], -}
diff --git a/third_party/crashpad/crashpad/minidump/minidump_test.gyp b/third_party/crashpad/crashpad/minidump/minidump_test.gyp deleted file mode 100644 index 7c17063..0000000 --- a/third_party/crashpad/crashpad/minidump/minidump_test.gyp +++ /dev/null
@@ -1,91 +0,0 @@ -# Copyright 2014 The Crashpad Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -{ - 'includes': [ - '../build/crashpad.gypi', - ], - 'targets': [ - { - 'target_name': 'crashpad_minidump_test_lib', - 'type': 'static_library', - 'dependencies': [ - 'minidump.gyp:crashpad_minidump', - '../third_party/googletest/googletest.gyp:googletest', - '../third_party/mini_chromium/mini_chromium.gyp:base', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - 'test/minidump_byte_array_writer_test_util.cc', - 'test/minidump_byte_array_writer_test_util.h', - 'test/minidump_context_test_util.cc', - 'test/minidump_context_test_util.h', - 'test/minidump_file_writer_test_util.cc', - 'test/minidump_file_writer_test_util.h', - 'test/minidump_memory_writer_test_util.cc', - 'test/minidump_memory_writer_test_util.h', - 'test/minidump_rva_list_test_util.cc', - 'test/minidump_rva_list_test_util.h', - 'test/minidump_string_writer_test_util.cc', - 'test/minidump_string_writer_test_util.h', - 'test/minidump_user_extension_stream_util.cc', - 'test/minidump_user_extension_stream_util.h', - 'test/minidump_writable_test_util.cc', - 'test/minidump_writable_test_util.h', - ], - }, - { - 'target_name': 'crashpad_minidump_test', - 'type': 'executable', - 'dependencies': [ - 'crashpad_minidump_test_lib', - 'minidump.gyp:crashpad_minidump', - '../snapshot/snapshot_test.gyp:crashpad_snapshot_test_lib', - '../test/test.gyp:crashpad_googletest_main', - '../test/test.gyp:crashpad_test', - '../third_party/googletest/googletest.gyp:googletest', - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../util/util.gyp:crashpad_util', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - 'minidump_annotation_writer_test.cc', - 'minidump_byte_array_writer_test.cc', - 'minidump_context_writer_test.cc', - 'minidump_crashpad_info_writer_test.cc', - 'minidump_exception_writer_test.cc', - 'minidump_file_writer_test.cc', - 'minidump_handle_writer_test.cc', - 'minidump_memory_info_writer_test.cc', - 'minidump_memory_writer_test.cc', - 'minidump_misc_info_writer_test.cc', - 'minidump_module_crashpad_info_writer_test.cc', - 'minidump_module_writer_test.cc', - 'minidump_rva_list_writer_test.cc', - 'minidump_simple_string_dictionary_writer_test.cc', - 'minidump_string_writer_test.cc', - 'minidump_system_info_writer_test.cc', - 'minidump_thread_id_map_test.cc', - 'minidump_thread_writer_test.cc', - 'minidump_unloaded_module_writer_test.cc', - 'minidump_user_stream_writer_test.cc', - 'minidump_writable_test.cc', - ], - }, - ], -}
diff --git a/third_party/crashpad/crashpad/snapshot/BUILD.gn b/third_party/crashpad/crashpad/snapshot/BUILD.gn index 2d613b6..8b26e14 100644 --- a/third_party/crashpad/crashpad/snapshot/BUILD.gn +++ b/third_party/crashpad/crashpad/snapshot/BUILD.gn
@@ -247,7 +247,7 @@ "../client:common", "../compat", "../minidump:format", - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", "../util", ] @@ -269,7 +269,7 @@ public_configs = [ "..:crashpad_config" ] deps = [ - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", "../util", ] @@ -284,7 +284,7 @@ deps = [ ":snapshot", - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", "../util:util", ] seed_corpus = "elf/elf_image_reader_fuzzer_corpus" @@ -319,7 +319,7 @@ deps = [ "../compat", - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", "../util", ] @@ -435,7 +435,7 @@ "../test", "../third_party/googletest:googlemock", "../third_party/googletest:googletest", - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", "../util", ] @@ -490,7 +490,7 @@ sources = [ "crashpad_info_client_options_test_module.cc" ] deps = [ "../client", - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", ] } @@ -505,7 +505,7 @@ } defines = [ "CRASHPAD_INFO_SIZE_TEST_MODULE_LARGE" ] - deps += [ "../third_party/mini_chromium:base" ] + deps += [ "$mini_chromium_source_parent:base" ] } crashpad_loadable_module("crashpad_snapshot_test_module_small") { @@ -519,7 +519,7 @@ } defines = [ "CRASHPAD_INFO_SIZE_TEST_MODULE_SMALL" ] - deps += [ "../third_party/mini_chromium:base" ] + deps += [ "$mini_chromium_source_parent:base" ] } if ((crashpad_is_linux || crashpad_is_android || crashpad_is_fuchsia) && @@ -554,7 +554,7 @@ deps = [ "../client", "../compat", - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", ] } @@ -564,7 +564,7 @@ deps = [ "../client", "../compat", - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", "../util", ] } @@ -575,7 +575,7 @@ deps = [ "../client", "../compat", - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", "../util", ] } @@ -586,7 +586,7 @@ deps = [ "../client", "../compat", - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", ] } @@ -596,7 +596,7 @@ deps = [ "../client", "../compat", - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", "../util", ] if (crashpad_is_in_chromium) { @@ -614,7 +614,7 @@ sources = [ "win/crashpad_snapshot_test_image_reader_module.cc" ] deps = [ "../client", - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", ] if (crashpad_is_in_chromium) { if (symbol_level == 0) {
diff --git a/third_party/crashpad/crashpad/snapshot/crashpad_types/crashpad_info_reader_test.cc b/third_party/crashpad/crashpad/snapshot/crashpad_types/crashpad_info_reader_test.cc index ebc6a4d..556ead1 100644 --- a/third_party/crashpad/crashpad/snapshot/crashpad_types/crashpad_info_reader_test.cc +++ b/third_party/crashpad/crashpad/snapshot/crashpad_types/crashpad_info_reader_test.cc
@@ -30,6 +30,10 @@ #include "util/misc/from_pointer_cast.h" #include "util/process/process_memory_native.h" +#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS) +#include "test/linux/fake_ptrace_connection.h" +#endif + namespace crashpad { namespace test { namespace { @@ -102,8 +106,14 @@ VMAddress extra_memory_address, VMAddress simple_annotations_address, VMAddress annotations_list_address) { +#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS) + FakePtraceConnection connection; + ASSERT_TRUE(connection.Initialize(process)); + ProcessMemoryLinux memory(&connection); +#else ProcessMemoryNative memory; ASSERT_TRUE(memory.Initialize(process)); +#endif ProcessMemoryRange range; ASSERT_TRUE(range.Initialize(&memory, is_64_bit));
diff --git a/third_party/crashpad/crashpad/snapshot/crashpad_types/image_annotation_reader_test.cc b/third_party/crashpad/crashpad/snapshot/crashpad_types/image_annotation_reader_test.cc index 72a637b..9d9970e 100644 --- a/third_party/crashpad/crashpad/snapshot/crashpad_types/image_annotation_reader_test.cc +++ b/third_party/crashpad/crashpad/snapshot/crashpad_types/image_annotation_reader_test.cc
@@ -32,6 +32,10 @@ #include "util/misc/from_pointer_cast.h" #include "util/process/process_memory_native.h" +#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS) +#include "test/linux/fake_ptrace_connection.h" +#endif + namespace crashpad { namespace test { namespace { @@ -90,8 +94,14 @@ bool is_64_bit, VMAddress simple_map_address, VMAddress annotation_list_address) { +#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS) + FakePtraceConnection connection; + ASSERT_TRUE(connection.Initialize(process)); + ProcessMemoryLinux memory(&connection); +#else ProcessMemoryNative memory; ASSERT_TRUE(memory.Initialize(process)); +#endif ProcessMemoryRange range; ASSERT_TRUE(range.Initialize(&memory, is_64_bit));
diff --git a/third_party/crashpad/crashpad/snapshot/elf/elf_image_reader_test.cc b/third_party/crashpad/crashpad/snapshot/elf/elf_image_reader_test.cc index 63da92a..2ea55ad 100644 --- a/third_party/crashpad/crashpad/snapshot/elf/elf_image_reader_test.cc +++ b/third_party/crashpad/crashpad/snapshot/elf/elf_image_reader_test.cc
@@ -127,21 +127,22 @@ constexpr bool am_64_bit = false; #endif // ARCH_CPU_64_BITS - ProcessMemoryNative memory; - ASSERT_TRUE(memory.Initialize(process)); - ProcessMemoryRange range; - ASSERT_TRUE(range.Initialize(&memory, am_64_bit)); - VMAddress elf_address; #if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_ANDROID) FakePtraceConnection connection; ASSERT_TRUE(connection.Initialize(process)); + ProcessMemoryLinux memory(&connection); LocateExecutable(&connection, &memory, &elf_address); #elif defined(OS_FUCHSIA) + ProcessMemoryFuchsia memory; + ASSERT_TRUE(memory.Initialize(process)); LocateExecutable(process, &memory, &elf_address); #endif ASSERT_NO_FATAL_FAILURE(); + ProcessMemoryRange range; + ASSERT_TRUE(range.Initialize(&memory, am_64_bit)); + ElfImageReader reader; ASSERT_TRUE(reader.Initialize(range, elf_address)); @@ -191,8 +192,15 @@ constexpr bool am_64_bit = false; #endif // ARCH_CPU_64_BITS +#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS) + FakePtraceConnection connection; + ASSERT_TRUE(connection.Initialize(process)); + ProcessMemoryLinux memory(&connection); +#else ProcessMemoryNative memory; ASSERT_TRUE(memory.Initialize(process)); +#endif + ProcessMemoryRange range; ASSERT_TRUE(range.Initialize(&memory, am_64_bit));
diff --git a/third_party/crashpad/crashpad/snapshot/ios/exception_snapshot_ios_intermediate_dump.cc b/third_party/crashpad/crashpad/snapshot/ios/exception_snapshot_ios_intermediate_dump.cc index 0d24029..cd604510 100644 --- a/third_party/crashpad/crashpad/snapshot/ios/exception_snapshot_ios_intermediate_dump.cc +++ b/third_party/crashpad/crashpad/snapshot/ios/exception_snapshot_ios_intermediate_dump.cc
@@ -156,20 +156,18 @@ exception_ = exception; } - mach_msg_type_number_t code_count; - GetDataValueFromMap(exception_data, Key::kCodeCount, &code_count); - const IOSIntermediateDumpData* code_dump = - GetDataFromMap(exception_data, Key::kCode); + GetDataFromMap(exception_data, Key::kCodes); if (code_dump) { const std::vector<uint8_t>& bytes = code_dump->bytes(); const mach_exception_data_type_t* code = reinterpret_cast<const mach_exception_data_type_t*>(bytes.data()); - if (!code || - bytes.size() != sizeof(mach_exception_data_type_t) * code_count) { + if (bytes.size() == 0 || !code) { LOG(ERROR) << "Invalid mach exception code."; } else { // TODO: rationalize with the macOS implementation. + mach_msg_type_number_t code_count = + bytes.size() / sizeof(mach_exception_data_type_t); for (mach_msg_type_number_t code_index = 0; code_index < code_count; ++code_index) { codes_.push_back(code[code_index]); @@ -288,22 +286,24 @@ float_state_type float_state; debug_state_type debug_state; - mach_msg_type_number_t state_count = 0; thread_state_flavor_t flavor = THREAD_STATE_NONE; - if (GetDataValueFromMap(exception_data, Key::kStateCount, &state_count) && - GetDataValueFromMap(exception_data, Key::kFlavor, &flavor) && + if (GetDataValueFromMap(exception_data, Key::kFlavor, &flavor) && GetDataValueFromMap(other_thread, Key::kThreadState, &thread_state) && GetDataValueFromMap(other_thread, Key::kFloatState, &float_state) && GetDataValueFromMap(other_thread, Key::kDebugState, &debug_state)) { - size_t expected_length = ThreadStateLengthForFlavor(flavor); const IOSIntermediateDumpData* state_dump = GetDataFromMap(exception_data, Key::kState); if (state_dump) { const std::vector<uint8_t>& bytes = state_dump->bytes(); size_t actual_length = bytes.size(); + size_t expected_length = ThreadStateLengthForFlavor(flavor); + // TODO(justincohen): Consider zero-ing out bytes if actual_length is + // shorter than expected_length, and tolerating actual_length longer than + // expected_length. if (expected_length == actual_length) { const ConstThreadState state = reinterpret_cast<const ConstThreadState>(bytes.data()); + mach_msg_type_number_t state_count = bytes.size() / sizeof(uint32_t); #if defined(ARCH_CPU_X86_64) InitializeCPUContextX86_64(&context_x86_64_, flavor,
diff --git a/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump_test.cc b/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump_test.cc index 9710439..0bc9247 100644 --- a/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump_test.cc +++ b/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump_test.cc
@@ -281,7 +281,6 @@ #if defined(ARCH_CPU_X86_64) thread_state_flavor_t flavor = x86_THREAD_STATE; - mach_msg_type_number_t state_count = x86_THREAD_STATE_COUNT; x86_thread_state_t state = {}; state.tsh.flavor = x86_THREAD_STATE64; state.tsh.count = x86_THREAD_STATE64_COUNT; @@ -289,7 +288,6 @@ size_t state_length = sizeof(x86_thread_state_t); #elif defined(ARCH_CPU_ARM64) thread_state_flavor_t flavor = ARM_UNIFIED_THREAD_STATE; - mach_msg_type_number_t state_count = ARM_UNIFIED_THREAD_STATE_COUNT; arm_unified_thread_state_t state = {}; state.ash.flavor = ARM_THREAD_STATE64; state.ash.count = ARM_THREAD_STATE64_COUNT; @@ -297,12 +295,10 @@ size_t state_length = sizeof(arm_unified_thread_state_t); #endif EXPECT_TRUE(writer->AddProperty(Key::kException, &exception)); - EXPECT_TRUE(writer->AddProperty(Key::kCode, code, code_count)); - EXPECT_TRUE(writer->AddProperty(Key::kCodeCount, &code_count)); + EXPECT_TRUE(writer->AddProperty(Key::kCodes, code, code_count)); EXPECT_TRUE(writer->AddProperty(Key::kFlavor, &flavor)); EXPECT_TRUE(writer->AddPropertyBytes( Key::kState, reinterpret_cast<const void*>(&state), state_length)); - EXPECT_TRUE(writer->AddProperty(Key::kStateCount, &state_count)); uint64_t thread_id = 1; EXPECT_TRUE(writer->AddProperty(Key::kThreadID, &thread_id)); }
diff --git a/third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc b/third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc index d32bd19..41956aa 100644 --- a/third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc +++ b/third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc
@@ -83,8 +83,7 @@ ASSERT_EQ(exe_mappings->Count(), 1u); LinuxVMAddress elf_address = exe_mappings->Next()->range.Base(); - ProcessMemoryLinux memory; - ASSERT_TRUE(memory.Initialize(connection->GetProcessID())); + ProcessMemoryLinux memory(connection); ProcessMemoryRange range; ASSERT_TRUE(range.Initialize(&memory, connection->Is64Bit()));
diff --git a/third_party/crashpad/crashpad/snapshot/mac/mach_o_image_annotations_reader_test.cc b/third_party/crashpad/crashpad/snapshot/mac/mach_o_image_annotations_reader_test.cc index aea885a..cddc399 100644 --- a/third_party/crashpad/crashpad/snapshot/mac/mach_o_image_annotations_reader_test.cc +++ b/third_party/crashpad/crashpad/snapshot/mac/mach_o_image_annotations_reader_test.cc
@@ -398,7 +398,6 @@ case kCrashAbort: { abort(); - break; } case kCrashModuleInitialization: { @@ -411,7 +410,6 @@ // the FAIL() will fail the test. ASSERT_NE(dl_handle, nullptr) << dlerror(); FAIL(); - break; } case kCrashDyld: {
diff --git a/third_party/crashpad/crashpad/snapshot/mac/process_reader_mac.cc b/third_party/crashpad/crashpad/snapshot/mac/process_reader_mac.cc index 821fe3c..9b2a235 100644 --- a/third_party/crashpad/crashpad/snapshot/mac/process_reader_mac.cc +++ b/third_party/crashpad/crashpad/snapshot/mac/process_reader_mac.cc
@@ -701,7 +701,7 @@ #if defined(ARCH_CPU_X86_FAMILY) if (Is64Bit()) { // x86_64 has a red zone. See AMD64 ABI 0.99.8, - // https://raw.githubusercontent.com/wiki/hjl-tools/x86-psABI/x86-64-psABI-r252.pdf#page=19, + // https://gitlab.com/x86-psABIs/x86-64-ABI/-/wikis/uploads/01de35b2c8adc7545de52604cc45d942/x86-64-psABI-2021-05-20.pdf#page=23. // section 3.2.2, “The Stack Frame”. constexpr mach_vm_size_t kRedZoneSize = 128; mach_vm_address_t red_zone_base =
diff --git a/third_party/crashpad/crashpad/snapshot/mac/process_types/crashreporterclient.proctype b/third_party/crashpad/crashpad/snapshot/mac/process_types/crashreporterclient.proctype index 398bd63..226eaa2 100644 --- a/third_party/crashpad/crashpad/snapshot/mac/process_types/crashreporterclient.proctype +++ b/third_party/crashpad/crashpad/snapshot/mac/process_types/crashreporterclient.proctype
@@ -23,7 +23,8 @@ // // This file is included by snapshot/mac/process_types.h and // snapshot/mac/process_types.cc to produce process type struct definitions and -// accessors. +// accessors. This file is also used by the iOS in process handler to read both +// messages in client/ios_handler/in_process_intermediate_dump_handler.cc. // Client Mach-O images will contain a __DATA,__crash_info section formatted // according to this structure.
diff --git a/third_party/crashpad/crashpad/snapshot/sanitized/sanitization_information_test.cc b/third_party/crashpad/crashpad/snapshot/sanitized/sanitization_information_test.cc index f3864424..425ec752 100644 --- a/third_party/crashpad/crashpad/snapshot/sanitized/sanitization_information_test.cc +++ b/third_party/crashpad/crashpad/snapshot/sanitized/sanitization_information_test.cc
@@ -20,6 +20,10 @@ #include "util/misc/from_pointer_cast.h" #include "util/process/process_memory_linux.h" +#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS) +#include "test/linux/fake_ptrace_connection.h" +#endif + namespace crashpad { namespace test { namespace { @@ -27,11 +31,12 @@ class AllowedAnnotationsTest : public testing::Test { public: void SetUp() override { - ASSERT_TRUE(memory_.Initialize(getpid())); + ASSERT_TRUE(connection_.Initialize(getpid())); + #if defined(ARCH_CPU_64_BITS) - ASSERT_TRUE(range_.Initialize(&memory_, true)); + ASSERT_TRUE(range_.Initialize(connection_.Memory(), true)); #else - ASSERT_TRUE(range_.Initialize(&memory_, false)); + ASSERT_TRUE(range_.Initialize(connection_.Memory(), false)); #endif } @@ -41,7 +46,7 @@ range_, FromPointerCast<VMAddress>(address), &allowed_annotations_); } - ProcessMemoryLinux memory_; + FakePtraceConnection connection_; ProcessMemoryRange range_; std::vector<std::string> allowed_annotations_; };
diff --git a/third_party/crashpad/crashpad/snapshot/snapshot.gyp b/third_party/crashpad/crashpad/snapshot/snapshot.gyp deleted file mode 100644 index 788ea3d..0000000 --- a/third_party/crashpad/crashpad/snapshot/snapshot.gyp +++ /dev/null
@@ -1,216 +0,0 @@ -# Copyright 2014 The Crashpad Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -{ - 'includes': [ - '../build/crashpad.gypi', - ], - 'targets': [ - { - 'target_name': 'crashpad_snapshot', - 'type': 'static_library', - 'dependencies': [ - '../client/client.gyp:crashpad_client', - '../compat/compat.gyp:crashpad_compat', - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../util/util.gyp:crashpad_util', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - 'annotation_snapshot.cc', - 'annotation_snapshot.h', - 'capture_memory.cc', - 'capture_memory.h', - 'cpu_architecture.h', - 'cpu_context.cc', - 'cpu_context.h', - 'crashpad_info_client_options.cc', - 'crashpad_info_client_options.h', - 'crashpad_types/crashpad_info_reader.cc', - 'crashpad_types/crashpad_info_reader.h', - 'crashpad_types/image_annotation_reader.cc', - 'crashpad_types/image_annotation_reader.h', - 'elf/elf_dynamic_array_reader.cc', - 'elf/elf_dynamic_array_reader.h', - 'elf/elf_image_reader.cc', - 'elf/elf_image_reader.h', - 'elf/elf_symbol_table_reader.cc', - 'elf/elf_symbol_table_reader.h', - 'elf/module_snapshot_elf.cc', - 'elf/module_snapshot_elf.h', - 'exception_snapshot.h', - 'handle_snapshot.cc', - 'handle_snapshot.h', - 'linux/cpu_context_linux.cc', - 'linux/cpu_context_linux.h', - 'linux/debug_rendezvous.cc', - 'linux/debug_rendezvous.h', - 'linux/exception_snapshot_linux.cc', - 'linux/exception_snapshot_linux.h', - 'linux/process_reader_linux.cc', - 'linux/process_reader_linux.h', - 'linux/process_snapshot_linux.cc', - 'linux/process_snapshot_linux.h', - 'linux/signal_context.h', - 'linux/system_snapshot_linux.cc', - 'linux/system_snapshot_linux.h', - 'linux/thread_snapshot_linux.cc', - 'linux/thread_snapshot_linux.h', - 'mac/cpu_context_mac.cc', - 'mac/cpu_context_mac.h', - 'mac/exception_snapshot_mac.cc', - 'mac/exception_snapshot_mac.h', - 'mac/mach_o_image_annotations_reader.cc', - 'mac/mach_o_image_annotations_reader.h', - 'mac/mach_o_image_reader.cc', - 'mac/mach_o_image_reader.h', - 'mac/mach_o_image_segment_reader.cc', - 'mac/mach_o_image_segment_reader.h', - 'mac/mach_o_image_symbol_table_reader.cc', - 'mac/mach_o_image_symbol_table_reader.h', - 'mac/module_snapshot_mac.cc', - 'mac/module_snapshot_mac.h', - 'mac/process_reader_mac.cc', - 'mac/process_reader_mac.h', - 'mac/process_snapshot_mac.cc', - 'mac/process_snapshot_mac.h', - 'mac/process_types.cc', - 'mac/process_types.h', - 'mac/process_types/all.proctype', - 'mac/process_types/annotation.proctype', - 'mac/process_types/crashpad_info.proctype', - 'mac/process_types/crashreporterclient.proctype', - 'mac/process_types/custom.cc', - 'mac/process_types/dyld_images.proctype', - 'mac/process_types/flavors.h', - 'mac/process_types/internal.h', - 'mac/process_types/loader.proctype', - 'mac/process_types/nlist.proctype', - 'mac/process_types/traits.h', - 'mac/system_snapshot_mac.cc', - 'mac/system_snapshot_mac.h', - 'mac/thread_snapshot_mac.cc', - 'mac/thread_snapshot_mac.h', - 'memory_snapshot.cc', - 'memory_snapshot.h', - 'memory_snapshot_generic.h', - 'minidump/minidump_annotation_reader.cc', - 'minidump/minidump_annotation_reader.h', - 'minidump/minidump_context_converter.cc', - 'minidump/minidump_context_converter.h', - 'minidump/minidump_simple_string_dictionary_reader.cc', - 'minidump/minidump_simple_string_dictionary_reader.h', - 'minidump/minidump_stream.h', - 'minidump/minidump_string_list_reader.cc', - 'minidump/minidump_string_list_reader.h', - 'minidump/minidump_string_reader.cc', - 'minidump/minidump_string_reader.h', - 'minidump/exception_snapshot_minidump.cc', - 'minidump/exception_snapshot_minidump.h', - 'minidump/memory_snapshot_minidump.cc', - 'minidump/memory_snapshot_minidump.h', - 'minidump/module_snapshot_minidump.cc', - 'minidump/module_snapshot_minidump.h', - 'minidump/process_snapshot_minidump.cc', - 'minidump/process_snapshot_minidump.h', - 'minidump/system_snapshot_minidump.cc', - 'minidump/system_snapshot_minidump.h', - 'minidump/thread_snapshot_minidump.cc', - 'minidump/thread_snapshot_minidump.h', - 'module_snapshot.h', - 'posix/timezone.cc', - 'posix/timezone.h', - 'process_snapshot.h', - 'sanitized/memory_snapshot_sanitized.cc', - 'sanitized/memory_snapshot_sanitized.h', - 'sanitized/module_snapshot_sanitized.cc', - 'sanitized/module_snapshot_sanitized.h', - 'sanitized/process_snapshot_sanitized.cc', - 'sanitized/process_snapshot_sanitized.h', - 'sanitized/sanitization_information.cc', - 'sanitized/sanitization_information.h', - 'sanitized/thread_snapshot_sanitized.cc', - 'sanitized/thread_snapshot_sanitized.h', - 'snapshot_constants.h', - 'system_snapshot.h', - 'thread_snapshot.h', - 'unloaded_module_snapshot.cc', - 'unloaded_module_snapshot.h', - 'win/cpu_context_win.cc', - 'win/cpu_context_win.h', - 'win/exception_snapshot_win.cc', - 'win/exception_snapshot_win.h', - 'win/capture_memory_delegate_win.cc', - 'win/capture_memory_delegate_win.h', - 'win/memory_map_region_snapshot_win.cc', - 'win/memory_map_region_snapshot_win.h', - 'win/module_snapshot_win.cc', - 'win/module_snapshot_win.h', - 'win/pe_image_annotations_reader.cc', - 'win/pe_image_annotations_reader.h', - 'win/pe_image_reader.cc', - 'win/pe_image_reader.h', - 'win/pe_image_resource_reader.cc', - 'win/pe_image_resource_reader.h', - 'win/process_reader_win.cc', - 'win/process_reader_win.h', - 'win/process_snapshot_win.cc', - 'win/process_snapshot_win.h', - 'win/process_subrange_reader.cc', - 'win/process_subrange_reader.h', - 'win/system_snapshot_win.cc', - 'win/system_snapshot_win.h', - 'win/thread_snapshot_win.cc', - 'win/thread_snapshot_win.h', - 'x86/cpuid_reader.cc', - 'x86/cpuid_reader.h', - ], - 'conditions': [ - ['OS=="win"', { - 'link_settings': { - 'libraries': [ - '-lpowrprof.lib', - ], - }, - }], - ['OS=="linux" or OS=="android"', { - 'sources!': [ - 'capture_memory.cc', - 'capture_memory.h', - ], - }, { # else: OS!="linux" and OS!="android" - 'sources/': [ - ['exclude', '^elf/'], - ['exclude', '^crashpad_types/'], - ['exclude', '^sanitized/'], - ], - }], - ['target_arch!="ia32" and target_arch!="x64"', { - 'sources/': [ - ['exclude', '^x86/'], - ], - }], - ], - 'target_conditions': [ - ['OS=="android"', { - 'sources/': [ - ['include', '^linux/'], - ], - }], - ], - }, - ], -}
diff --git a/third_party/crashpad/crashpad/snapshot/snapshot_test.gyp b/third_party/crashpad/crashpad/snapshot/snapshot_test.gyp deleted file mode 100644 index 361a33a7..0000000 --- a/third_party/crashpad/crashpad/snapshot/snapshot_test.gyp +++ /dev/null
@@ -1,350 +0,0 @@ -# Copyright 2014 The Crashpad Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -{ - 'includes': [ - '../build/crashpad.gypi', - ], - 'targets': [ - { - 'target_name': 'crashpad_snapshot_test_lib', - 'type': 'static_library', - 'dependencies': [ - 'snapshot.gyp:crashpad_snapshot', - '../compat/compat.gyp:crashpad_compat', - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../util/util.gyp:crashpad_util', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - 'test/test_cpu_context.cc', - 'test/test_cpu_context.h', - 'test/test_exception_snapshot.cc', - 'test/test_exception_snapshot.h', - 'test/test_memory_map_region_snapshot.cc', - 'test/test_memory_map_region_snapshot.h', - 'test/test_memory_snapshot.cc', - 'test/test_memory_snapshot.h', - 'test/test_module_snapshot.cc', - 'test/test_module_snapshot.h', - 'test/test_process_snapshot.cc', - 'test/test_process_snapshot.h', - 'test/test_system_snapshot.cc', - 'test/test_system_snapshot.h', - 'test/test_thread_snapshot.cc', - 'test/test_thread_snapshot.h', - ], - }, - { - 'target_name': 'crashpad_snapshot_test', - 'type': 'executable', - 'dependencies': [ - 'crashpad_snapshot_test_lib', - 'crashpad_snapshot_test_module', - 'crashpad_snapshot_test_module_large', - 'crashpad_snapshot_test_module_small', - 'snapshot.gyp:crashpad_snapshot', - '../client/client.gyp:crashpad_client', - '../compat/compat.gyp:crashpad_compat', - '../test/test.gyp:crashpad_googlemock_main', - '../test/test.gyp:crashpad_test', - '../third_party/googletest/googlemock.gyp:googlemock', - '../third_party/googletest/googletest.gyp:googletest', - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../util/util.gyp:crashpad_util', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - 'cpu_context_test.cc', - 'memory_snapshot_test.cc', - 'crashpad_info_client_options_test.cc', - 'crashpad_types/crashpad_info_reader_test.cc', - 'crashpad_types/image_annotation_reader_test.cc', - 'elf/elf_image_reader_test.cc', - 'elf/elf_image_reader_test_note.S', - 'linux/debug_rendezvous_test.cc', - 'linux/exception_snapshot_linux_test.cc', - 'linux/process_reader_linux_test.cc', - 'linux/system_snapshot_linux_test.cc', - 'linux/test_modules.cc', - 'linux/test_modules.h', - 'mac/cpu_context_mac_test.cc', - 'mac/mach_o_image_annotations_reader_test.cc', - 'mac/mach_o_image_reader_test.cc', - 'mac/mach_o_image_segment_reader_test.cc', - 'mac/process_reader_mac_test.cc', - 'mac/process_types_test.cc', - 'mac/system_snapshot_mac_test.cc', - 'minidump/process_snapshot_minidump_test.cc', - 'posix/timezone_test.cc', - 'sanitized/process_snapshot_sanitized_test.cc', - 'sanitized/sanitization_information_test.cc', - 'win/cpu_context_win_test.cc', - 'win/exception_snapshot_win_test.cc', - 'win/extra_memory_ranges_test.cc', - 'win/module_snapshot_win_test.cc', - 'win/pe_image_reader_test.cc', - 'win/process_reader_win_test.cc', - 'win/process_snapshot_win_test.cc', - 'win/system_snapshot_win_test.cc', - ], - 'conditions': [ - # .gnu.hash is incompatible with the MIPS ABI - ['target_arch!="mips"', { - 'dependencies': ['crashpad_snapshot_test_both_dt_hash_styles'] - }], - ['OS=="mac"', { - 'dependencies': [ - 'crashpad_snapshot_test_module_crashy_initializer', - 'crashpad_snapshot_test_no_op', - ], - 'link_settings': { - 'libraries': [ - '$(SDKROOT)/System/Library/Frameworks/OpenCL.framework', - ], - }, - }], - ['OS=="win"', { - 'dependencies': [ - 'crashpad_snapshot_test_annotations', - 'crashpad_snapshot_test_crashing_child', - 'crashpad_snapshot_test_dump_without_crashing', - 'crashpad_snapshot_test_extra_memory_ranges', - 'crashpad_snapshot_test_image_reader', - 'crashpad_snapshot_test_image_reader_module', - ], - }], - ['OS=="linux" or OS=="android"', { - 'sources!': [ - 'crashpad_info_client_options_test.cc', - ], - 'copies': [{ - 'destination': '<(PRODUCT_DIR)', - 'files': [ - 'elf/test_exported_symbols.sym', - ], - }], - 'ldflags': [ - '-Wl,--dynamic-list=test_exported_symbols.sym', - ], - 'link_settings': { - 'libraries': [ - '-ldl', - ], - }, - }, { # else: OS!="linux" and OS!="android" - 'sources/': [ - ['exclude', '^elf/'], - ['exclude', '^crashpad_types/'], - ['exclude', '^sanitized/'], - ], - }], - ], - 'target_conditions': [ - ['OS=="android"', { - 'sources/': [ - ['include', '^linux/'], - ], - }], - ], - }, - { - 'target_name': 'crashpad_snapshot_test_module', - 'type': 'loadable_module', - 'dependencies': [ - '../client/client.gyp:crashpad_client', - '../third_party/mini_chromium/mini_chromium.gyp:base', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - 'crashpad_info_client_options_test_module.cc', - ], - }, - { - 'target_name': 'crashpad_snapshot_test_module_large', - 'type': 'loadable_module', - 'dependencies': [ - '../third_party/mini_chromium/mini_chromium.gyp:base', - ], - 'defines': [ - 'CRASHPAD_INFO_SIZE_TEST_MODULE_LARGE=1', - ], - 'sources': [ - 'crashpad_info_size_test_module.cc', - ], - 'include_dirs': [ - '..', - ], - 'conditions': [ - ['OS=="linux" or OS=="android"', { - 'sources': [ - 'crashpad_info_size_test_note.S', - ], - 'dependencies': [ - '../util/util.gyp:crashpad_util', - ], - }], - ], - }, - { - 'target_name': 'crashpad_snapshot_test_module_small', - 'type': 'loadable_module', - 'dependencies': [ - '../third_party/mini_chromium/mini_chromium.gyp:base', - ], - 'defines': [ - 'CRASHPAD_INFO_SIZE_TEST_MODULE_SMALL=1', - ], - 'sources': [ - 'crashpad_info_size_test_module.cc', - ], - 'include_dirs': [ - '..', - ], - 'conditions': [ - ['OS=="linux" or OS=="android"', { - 'sources': [ - 'crashpad_info_size_test_note.S', - ], - 'dependencies': [ - '../util/util.gyp:crashpad_util', - ], - }], - ], - }, - { - 'target_name': 'crashpad_snapshot_test_both_dt_hash_styles', - 'type': 'executable', - 'conditions': [ - # .gnu.hash is incompatible with the MIPS ABI - ['target_arch!="mips"', { - 'sources': [ - 'hash_types_test.cc', - ], - 'ldflags': [ - # This makes `ld` emit both .hash and .gnu.hash sections. - '-Wl,--hash-style=both', - ]}, - ] - ], - }, - ], - 'conditions': [ - ['OS=="mac"', { - 'targets': [ - { - 'target_name': 'crashpad_snapshot_test_module_crashy_initializer', - 'type': 'loadable_module', - 'sources': [ - 'mac/mach_o_image_annotations_reader_test_module_crashy_initializer.cc', - ], - }, - { - 'target_name': 'crashpad_snapshot_test_no_op', - 'type': 'executable', - 'sources': [ - 'mac/mach_o_image_annotations_reader_test_no_op.cc', - ], - }, - ], - }], - ['OS=="win"', { - 'targets': [ - { - 'target_name': 'crashpad_snapshot_test_crashing_child', - 'type': 'executable', - 'dependencies': [ - '../client/client.gyp:crashpad_client', - '../compat/compat.gyp:crashpad_compat', - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../util/util.gyp:crashpad_util', - ], - 'sources': [ - 'win/crashpad_snapshot_test_crashing_child.cc', - ], - }, - { - 'target_name': 'crashpad_snapshot_test_dump_without_crashing', - 'type': 'executable', - 'dependencies': [ - '../client/client.gyp:crashpad_client', - '../compat/compat.gyp:crashpad_compat', - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../util/util.gyp:crashpad_util', - ], - 'sources': [ - 'win/crashpad_snapshot_test_dump_without_crashing.cc', - ], - }, - { - 'target_name': 'crashpad_snapshot_test_extra_memory_ranges', - 'type': 'executable', - 'dependencies': [ - '../client/client.gyp:crashpad_client', - '../compat/compat.gyp:crashpad_compat', - '../third_party/mini_chromium/mini_chromium.gyp:base', - ], - 'sources': [ - 'win/crashpad_snapshot_test_extra_memory_ranges.cc', - ], - }, - { - 'target_name': 'crashpad_snapshot_test_image_reader', - 'type': 'executable', - 'dependencies': [ - '../client/client.gyp:crashpad_client', - '../compat/compat.gyp:crashpad_compat', - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../util/util.gyp:crashpad_util', - ], - 'sources': [ - 'win/crashpad_snapshot_test_image_reader.cc', - ], - }, - { - 'target_name': 'crashpad_snapshot_test_image_reader_module', - 'type': 'loadable_module', - 'dependencies': [ - '../client/client.gyp:crashpad_client', - '../third_party/mini_chromium/mini_chromium.gyp:base', - ], - 'sources': [ - 'win/crashpad_snapshot_test_image_reader_module.cc', - ], - 'msvs_settings': { - 'NoImportLibrary': 'true', - }, - }, - { - 'target_name': 'crashpad_snapshot_test_annotations', - 'type': 'executable', - 'dependencies': [ - '../client/client.gyp:crashpad_client', - '../compat/compat.gyp:crashpad_compat', - '../third_party/mini_chromium/mini_chromium.gyp:base', - ], - 'sources': [ - 'win/crashpad_snapshot_test_annotations.cc', - ], - }, - ], - }], - ], -}
diff --git a/third_party/crashpad/crashpad/test/BUILD.gn b/third_party/crashpad/crashpad/test/BUILD.gn index 8746f2c..c2ad5b92 100644 --- a/third_party/crashpad/crashpad/test/BUILD.gn +++ b/third_party/crashpad/crashpad/test/BUILD.gn
@@ -124,7 +124,7 @@ deps = [ "../compat", "../third_party/googletest:googletest", - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", "../util", ] @@ -204,7 +204,7 @@ "../compat", "../third_party/googletest:googlemock", "../third_party/googletest:googletest", - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", "../util", ] @@ -225,7 +225,7 @@ crashpad_executable("crashpad_test_test_multiprocess_exec_test_child") { sources = [ "multiprocess_exec_test_child.cc" ] - deps = [ "../third_party/mini_chromium:base" ] + deps = [ "$mini_chromium_source_parent:base" ] } } @@ -238,8 +238,8 @@ ":test", "../third_party/googletest:googlemock", "../third_party/googletest:googletest", - "../third_party/mini_chromium:base", - "../third_party/mini_chromium:base_test_support", + "$mini_chromium_source_parent:base", + "$mini_chromium_source_parent:base_test_support", ] if (crashpad_is_android) { deps += [ "../util" ] @@ -257,8 +257,8 @@ deps = [ ":test", "../third_party/googletest:googletest", - "../third_party/mini_chromium:base", - "../third_party/mini_chromium:base_test_support", + "$mini_chromium_source_parent:base", + "$mini_chromium_source_parent:base_test_support", ] if (crashpad_is_android) { deps += [ "../util" ]
diff --git a/third_party/crashpad/crashpad/test/fuchsia_crashpad_tests.cmx b/third_party/crashpad/crashpad/test/fuchsia_crashpad_tests.cmx index e2339e6..9831d14 100644 --- a/third_party/crashpad/crashpad/test/fuchsia_crashpad_tests.cmx +++ b/third_party/crashpad/crashpad/test/fuchsia_crashpad_tests.cmx
@@ -3,6 +3,7 @@ "fuchsia.test": { "injected-services": { "fuchsia.net.NameLookup": "fuchsia-pkg://fuchsia.com/dns-resolver#meta/dns-resolver.cmx", + "fuchsia.net.name.Lookup": "fuchsia-pkg://fuchsia.com/dns-resolver#meta/dns-resolver.cmx", "fuchsia.posix.socket.Provider": "fuchsia-pkg://fuchsia.com/netstack#meta/netstack.cmx" } } @@ -20,6 +21,7 @@ ], "services": [ "fuchsia.net.NameLookup", + "fuchsia.net.name.Lookup", "fuchsia.posix.socket.Provider", "fuchsia.process.Launcher" ]
diff --git a/third_party/crashpad/crashpad/test/ios/BUILD.gn b/third_party/crashpad/crashpad/test/ios/BUILD.gn index 59dd35d..4ba4ec4 100644 --- a/third_party/crashpad/crashpad/test/ios/BUILD.gn +++ b/third_party/crashpad/crashpad/test/ios/BUILD.gn
@@ -41,7 +41,7 @@ "../../build:ios_enable_arc", "../../build:ios_xctest", "../../test/ios:google_test_runner_shared_headers", - "../../third_party/mini_chromium:base", + "../$mini_chromium_source_parent:base", ] frameworks = [ "UIKit.framework" ] } @@ -57,7 +57,7 @@ ":google_test_runner_shared_headers", "../../build:ios_enable_arc", "../../third_party/googletest:googletest", - "../../third_party/mini_chromium:base", + "../$mini_chromium_source_parent:base", ] frameworks = [ "UIKit.framework" ] }
diff --git a/third_party/crashpad/crashpad/test/linux/fake_ptrace_connection.cc b/third_party/crashpad/crashpad/test/linux/fake_ptrace_connection.cc index d5560454..774a340 100644 --- a/third_party/crashpad/crashpad/test/linux/fake_ptrace_connection.cc +++ b/third_party/crashpad/crashpad/test/linux/fake_ptrace_connection.cc
@@ -83,12 +83,7 @@ ProcessMemory* FakePtraceConnection::Memory() { INITIALIZATION_STATE_DCHECK_VALID(initialized_); if (!memory_) { - auto mem = std::make_unique<ProcessMemoryLinux>(); - if (mem->Initialize(pid_)) { - memory_ = std::move(mem); - } else { - ADD_FAILURE(); - } + memory_ = std::make_unique<ProcessMemoryLinux>(this); } return memory_.get(); } @@ -99,5 +94,12 @@ return false; } +ssize_t FakePtraceConnection::ReadUpTo(VMAddress address, + size_t size, + void* buffer) { + NOTREACHED(); + return false; +} + } // namespace test } // namespace crashpad
diff --git a/third_party/crashpad/crashpad/test/linux/fake_ptrace_connection.h b/third_party/crashpad/crashpad/test/linux/fake_ptrace_connection.h index 01a6f92..79cdbd96 100644 --- a/third_party/crashpad/crashpad/test/linux/fake_ptrace_connection.h +++ b/third_party/crashpad/crashpad/test/linux/fake_ptrace_connection.h
@@ -65,6 +65,9 @@ //! \todo Not yet implemented. bool Threads(std::vector<pid_t>* threads) override; + //! \\todo Not yet implemented. + ssize_t ReadUpTo(VMAddress address, size_t size, void* buffer) override; + private: std::set<pid_t> attachments_; std::unique_ptr<ProcessMemoryLinux> memory_;
diff --git a/third_party/crashpad/crashpad/test/test.gyp b/third_party/crashpad/crashpad/test/test.gyp deleted file mode 100644 index aea1675..0000000 --- a/third_party/crashpad/crashpad/test/test.gyp +++ /dev/null
@@ -1,154 +0,0 @@ -# Copyright 2015 The Crashpad Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -{ - 'includes': [ - '../build/crashpad.gypi', - ], - 'targets': [ - { - 'target_name': 'crashpad_test', - 'type': 'static_library', - 'dependencies': [ - '../compat/compat.gyp:crashpad_compat', - '../third_party/googletest/googletest.gyp:googletest', - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../util/util.gyp:crashpad_util', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - 'errors.cc', - 'errors.h', - 'file.cc', - 'file.h', - 'filesystem.cc', - 'filesystem.h', - 'gtest_death.h', - 'hex_string.cc', - 'hex_string.h', - 'linux/fake_ptrace_connection.cc', - 'linux/fake_ptrace_connection.h', - 'linux/get_tls.cc', - 'linux/get_tls.h', - 'mac/dyld.cc', - 'mac/dyld.h', - 'mac/exception_swallower.cc', - 'mac/exception_swallower.h', - 'mac/mach_errors.cc', - 'mac/mach_errors.h', - 'mac/mach_multiprocess.cc', - 'mac/mach_multiprocess.h', - 'main_arguments.cc', - 'main_arguments.h', - 'multiprocess.h', - 'multiprocess_exec.cc', - 'multiprocess_exec.h', - 'multiprocess_exec_posix.cc', - 'multiprocess_exec_win.cc', - 'multiprocess_posix.cc', - 'process_type.cc', - 'process_type.h', - 'scoped_guarded_page.h', - 'scoped_guarded_page_posix.cc', - 'scoped_module_handle.cc', - 'scoped_module_handle.h', - 'scoped_temp_dir.cc', - 'scoped_temp_dir.h', - 'scoped_temp_dir_posix.cc', - 'scoped_temp_dir_win.cc', - 'test_paths.cc', - 'test_paths.h', - 'win/child_launcher.cc', - 'win/child_launcher.h', - 'win/win_child_process.cc', - 'win/win_child_process.h', - 'win/win_multiprocess.cc', - 'win/win_multiprocess.h', - 'win/win_multiprocess_with_temp_dir.cc', - 'win/win_multiprocess_with_temp_dir.h', - ], - 'direct_dependent_settings': { - 'include_dirs': [ - '..', - ], - }, - 'conditions': [ - ['OS=="mac"', { - 'dependencies': [ - '../handler/handler.gyp:crashpad_handler_lib', - '../snapshot/snapshot.gyp:crashpad_snapshot', - ], - 'link_settings': { - 'libraries': [ - '$(SDKROOT)/usr/lib/libbsm.dylib', - ], - }, - }], - ['OS=="win"', { - 'link_settings': { - 'libraries': [ - '-lshell32.lib', - ], - }, - }], - ], - 'target_conditions': [ - ['OS=="android"', { - 'sources/': [ - ['include', '^linux/'], - ], - }], - ], - }, - { - 'target_name': 'crashpad_googlemock_main', - 'type': 'static_library', - 'dependencies': [ - 'crashpad_test', - '../third_party/googletest/googlemock.gyp:googlemock', - '../third_party/googletest/googletest.gyp:googletest', - '../third_party/mini_chromium/mini_chromium.gyp:base', - ], - 'include_dirs': [ - '..', - ], - 'defines': [ - 'CRASHPAD_TEST_LAUNCHER_GOOGLEMOCK=1', - ], - 'sources': [ - 'gtest_main.cc', - ], - }, - { - 'target_name': 'crashpad_googletest_main', - 'type': 'static_library', - 'dependencies': [ - 'crashpad_test', - '../third_party/googletest/googletest.gyp:googletest', - '../third_party/mini_chromium/mini_chromium.gyp:base', - ], - 'include_dirs': [ - '..', - ], - 'defines': [ - 'CRASHPAD_TEST_LAUNCHER_GOOGLETEST=1', - ], - 'sources': [ - 'gtest_main.cc', - ], - }, - ], -}
diff --git a/third_party/crashpad/crashpad/test/test_test.gyp b/third_party/crashpad/crashpad/test/test_test.gyp deleted file mode 100644 index 59189158..0000000 --- a/third_party/crashpad/crashpad/test/test_test.gyp +++ /dev/null
@@ -1,60 +0,0 @@ -# Copyright 2015 The Crashpad Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -{ - 'includes': [ - '../build/crashpad.gypi', - ], - 'targets': [ - { - 'target_name': 'crashpad_test_test', - 'type': 'executable', - 'dependencies': [ - 'crashpad_test_test_multiprocess_exec_test_child', - 'test.gyp:crashpad_googlemock_main', - 'test.gyp:crashpad_test', - '../compat/compat.gyp:crashpad_compat', - '../third_party/googletest/googlemock.gyp:googlemock', - '../third_party/googletest/googletest.gyp:googletest', - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../util/util.gyp:crashpad_util', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - 'hex_string_test.cc', - 'mac/mach_multiprocess_test.cc', - 'main_arguments_test.cc', - 'multiprocess_exec_test.cc', - 'multiprocess_posix_test.cc', - 'scoped_guarded_page_test.cc', - 'scoped_temp_dir_test.cc', - 'test_paths_test.cc', - 'win/win_child_process_test.cc', - 'win/win_multiprocess_test.cc', - ], - }, - { - 'target_name': 'crashpad_test_test_multiprocess_exec_test_child', - 'type': 'executable', - 'dependencies': [ - '../third_party/mini_chromium/mini_chromium.gyp:base', - ], - 'sources': [ - 'multiprocess_exec_test_child.cc', - ], - }, - ], -}
diff --git a/third_party/crashpad/crashpad/third_party/getopt/getopt.gyp b/third_party/crashpad/crashpad/third_party/getopt/getopt.gyp deleted file mode 100644 index 5644584..0000000 --- a/third_party/crashpad/crashpad/third_party/getopt/getopt.gyp +++ /dev/null
@@ -1,35 +0,0 @@ -# Copyright 2015 The Crashpad Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -{ - 'includes': [ - '../../build/crashpad.gypi', - ], - 'conditions': [ - ['OS=="win"', { - 'targets': [ - { - 'target_name': 'getopt', - 'type': 'static_library', - 'sources': [ - 'getopt.cc', - 'getopt.h', - ], - }, - ], - }, { - 'targets': [] - }] - ], -}
diff --git a/third_party/crashpad/crashpad/third_party/googletest/BUILD.gn b/third_party/crashpad/crashpad/third_party/googletest/BUILD.gn index ee3485d9..de1c84d 100644 --- a/third_party/crashpad/crashpad/third_party/googletest/BUILD.gn +++ b/third_party/crashpad/crashpad/third_party/googletest/BUILD.gn
@@ -248,17 +248,6 @@ config("googlemock_public_config") { include_dirs = [ "$googletest_dir/googlemock/include" ] - - if (crashpad_is_clang) { - cflags_cc = [ - # The MOCK_METHODn() macros do not specify “override”, which triggers - # this warning in users: “error: 'Method' overrides a member function - # but is not marked 'override' - # [-Werror,-Winconsistent-missing-override]”. Suppress these warnings - # until https://github.com/google/googletest/issues/533 is fixed. - "-Wno-inconsistent-missing-override", - ] - } } static_library("googlemock") { @@ -331,6 +320,10 @@ if (crashpad_is_clang) { cflags_cc = [ + # googletest/googlemock/test/gmock-function-mocker_test.cc does not + # always use the override modifier with MOCK_METHOD. + "-Wno-inconsistent-missing-override", + # For googletest/googlemock/test/gmock-matchers_test.cc’s # testing::googlemock_matchers_test::Unprintable::c_. "-Wno-unused-private-field", @@ -341,7 +334,6 @@ # TODO: Correct SDK in vc\tools\msvc\14.14.26428\include\functional cflags = [ "/wd4789" ] # VAR of size N bytes will be overrun } - } test("gmock_link_test") {
diff --git a/third_party/crashpad/crashpad/third_party/googletest/googlemock.gyp b/third_party/crashpad/crashpad/third_party/googletest/googlemock.gyp deleted file mode 100644 index 371f5a3..0000000 --- a/third_party/crashpad/crashpad/third_party/googletest/googlemock.gyp +++ /dev/null
@@ -1,224 +0,0 @@ -# Copyright 2014 The Crashpad Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -{ - 'includes': [ - '../../build/crashpad_dependencies.gypi', - ], - 'conditions': [ - ['1==1', { # Defer processing until crashpad_dependencies is set - 'variables': { - 'conditions': [ - ['crashpad_dependencies=="standalone"', { - 'googlemock_dir': 'googletest/googlemock', - }], - ['crashpad_dependencies=="external"', { - 'googlemock_dir': '../../../../gmock', - }], - ], - }, - }], - ], - 'target_defaults': { - # Google Mock relies heavily on objects with static storage duration. - 'xcode_settings': { - 'WARNING_CFLAGS!': [ - '-Wexit-time-destructors', - ], - }, - 'cflags!': [ - '-Wexit-time-destructors', - ], - }, - - 'targets': [ - { - 'target_name': 'googlemock', - 'type': 'static_library', - 'dependencies': [ - 'googletest.gyp:googletest', - ], - 'include_dirs': [ - '<(googlemock_dir)', - '<(googlemock_dir)/include', - ], - 'sources': [ - '<(googlemock_dir)/include/gmock/gmock-actions.h', - '<(googlemock_dir)/include/gmock/gmock-cardinalities.h', - '<(googlemock_dir)/include/gmock/gmock-function-mocker.h', - '<(googlemock_dir)/include/gmock/gmock-generated-actions.h', - '<(googlemock_dir)/include/gmock/gmock-matchers.h', - '<(googlemock_dir)/include/gmock/gmock-more-actions.h', - '<(googlemock_dir)/include/gmock/gmock-more-matchers.h', - '<(googlemock_dir)/include/gmock/gmock-nice-strict.h', - '<(googlemock_dir)/include/gmock/gmock-spec-builders.h', - '<(googlemock_dir)/include/gmock/gmock.h', - '<(googlemock_dir)/include/gmock/internal/custom/gmock-generated-actions.h', - '<(googlemock_dir)/include/gmock/internal/custom/gmock-matchers.h', - '<(googlemock_dir)/include/gmock/internal/custom/gmock-port.h', - '<(googlemock_dir)/include/gmock/internal/custom/gmock-pp.h', - '<(googlemock_dir)/include/gmock/internal/gmock-generated-internal-utils.h', - '<(googlemock_dir)/include/gmock/internal/gmock-internal-utils.h', - '<(googlemock_dir)/include/gmock/internal/gmock-port.h', - '<(googlemock_dir)/src/gmock-all.cc', - '<(googlemock_dir)/src/gmock-cardinalities.cc', - '<(googlemock_dir)/src/gmock-internal-utils.cc', - '<(googlemock_dir)/src/gmock-matchers.cc', - '<(googlemock_dir)/src/gmock-spec-builders.cc', - '<(googlemock_dir)/src/gmock.cc', - ], - 'sources!': [ - '<(googlemock_dir)/src/gmock-all.cc', - ], - - 'direct_dependent_settings': { - 'include_dirs': [ - '<(googlemock_dir)/include', - ], - 'conditions': [ - ['clang!=0', { - # The MOCK_METHODn() macros do not specify “override”, which - # triggers this warning in users: “error: 'Method' overrides a - # member function but is not marked 'override' - # [-Werror,-Winconsistent-missing-override]”. Suppress these - # warnings until https://github.com/google/googletest/issues/533 is - # fixed. - 'conditions': [ - ['OS=="mac"', { - 'xcode_settings': { - 'WARNING_CFLAGS': [ - '-Wno-inconsistent-missing-override', - ], - }, - }], - ['OS=="linux" or OS=="android"', { - 'cflags': [ - '-Wno-inconsistent-missing-override', - ], - }], - ], - }], - ], - }, - 'export_dependent_settings': [ - 'googletest.gyp:googletest', - ], - }, - { - 'target_name': 'googlemock_main', - 'type': 'static_library', - 'dependencies': [ - 'googlemock', - 'googletest.gyp:googletest', - ], - 'sources': [ - '<(googlemock_dir)/src/gmock_main.cc', - ], - }, - { - 'target_name': 'googlemock_test_executable', - 'type': 'none', - 'dependencies': [ - 'googlemock', - 'googletest.gyp:googletest', - ], - 'direct_dependent_settings': { - 'type': 'executable', - 'include_dirs': [ - '<(googlemock_dir)', - ], - }, - 'export_dependent_settings': [ - 'googlemock', - 'googletest.gyp:googletest', - ], - }, - { - 'target_name': 'gmock_all_test', - 'dependencies': [ - 'googlemock_test_executable', - 'googlemock_main', - ], - 'include_dirs': [ - 'googletest/googletest', - ], - 'sources': [ - '<(googlemock_dir)/test/gmock-actions_test.cc', - '<(googlemock_dir)/test/gmock-cardinalities_test.cc', - '<(googlemock_dir)/test/gmock-function-mocker_test.cc', - '<(googlemock_dir)/test/gmock-generated-actions_test.cc', - '<(googlemock_dir)/test/gmock-generated-matchers_test.cc', - '<(googlemock_dir)/test/gmock-internal-utils_test.cc', - '<(googlemock_dir)/test/gmock-matchers_test.cc', - '<(googlemock_dir)/test/gmock-more-actions_test.cc', - '<(googlemock_dir)/test/gmock-nice-strict_test.cc', - '<(googlemock_dir)/test/gmock-port_test.cc', - '<(googlemock_dir)/test/gmock-pp-string_test.cc', - '<(googlemock_dir)/test/gmock-pp_test.cc', - '<(googlemock_dir)/test/gmock-spec-builders_test.cc', - '<(googlemock_dir)/test/gmock_test.cc', - ], - 'conditions': [ - ['clang!=0', { - # For googletest/googlemock/test/gmock-matchers_test.cc’s - # Unstreamable::value_. - 'conditions': [ - ['OS=="mac"', { - 'xcode_settings': { - 'WARNING_CFLAGS': [ - '-Wno-unused-private-field', - ], - }, - }], - ['OS=="linux" or OS=="android"', { - 'cflags': [ - '-Wno-unused-private-field', - ], - }], - ], - }], - ], - }, - { - 'target_name': 'gmock_link_test', - 'dependencies': [ - 'googlemock_test_executable', - 'googlemock_main', - ], - 'sources': [ - '<(googlemock_dir)/test/gmock_link_test.cc', - '<(googlemock_dir)/test/gmock_link_test.h', - '<(googlemock_dir)/test/gmock_link2_test.cc', - ], - }, - { - 'target_name': 'gmock_stress_test', - 'dependencies': [ - 'googlemock_test_executable', - ], - 'sources': [ - '<(googlemock_dir)/test/gmock_stress_test.cc', - ], - }, - { - 'target_name': 'googlemock_all_tests', - 'type': 'none', - 'dependencies': [ - 'gmock_all_test', - 'gmock_link_test', - 'gmock_stress_test', - ], - }, - ], -}
diff --git a/third_party/crashpad/crashpad/third_party/googletest/googletest.gyp b/third_party/crashpad/crashpad/third_party/googletest/googletest.gyp deleted file mode 100644 index ad79eb7..0000000 --- a/third_party/crashpad/crashpad/third_party/googletest/googletest.gyp +++ /dev/null
@@ -1,323 +0,0 @@ -# Copyright 2014 The Crashpad Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -{ - 'includes': [ - '../../build/crashpad_dependencies.gypi', - ], - 'conditions': [ - ['1==1', { # Defer processing until crashpad_dependencies is set - 'variables': { - 'conditions': [ - ['crashpad_dependencies=="standalone"', { - 'googletest_dir': 'googletest/googletest', - }], - ['crashpad_dependencies=="external"', { - 'googletest_dir': '../../../../gtest', - }], - ], - }, - }], - ], - 'target_defaults': { - # googletest relies heavily on objects with static storage duration. - 'xcode_settings': { - 'WARNING_CFLAGS!': [ - '-Wexit-time-destructors', - ], - }, - 'cflags!': [ - '-Wexit-time-destructors', - ], - - 'conditions': [ - ['OS=="android" and android_api_level!="" and android_api_level<24', { - 'defines!': [ - # Although many system interfaces are available to 32-bit code with - # 64-bit off_t at API 21, the routines in <stdio.h> are not until API - # 24. googletest doesn’t make use of these functions directly, but can - # reach them indirectly via the C++ standard library. Disable 64-bit - # off_t prior to API 24 so that these uses can work. Since nothing - # dependent on the size of off_t should escape googletest’s own API, this - # should be safe even in a program that otherwise uses a 64-bit off_t. - '_FILE_OFFSET_BITS=64', - ], - }], - ], - }, - - 'targets': [ - { - 'target_name': 'googletest', - 'type': 'static_library', - 'include_dirs': [ - '<(googletest_dir)', - '<(googletest_dir)/include', - ], - 'sources': [ - '<(googletest_dir)/include/gtest/gtest-death-test.h', - '<(googletest_dir)/include/gtest/gtest-matchers.h', - '<(googletest_dir)/include/gtest/gtest-message.h', - '<(googletest_dir)/include/gtest/gtest-param-test.h', - '<(googletest_dir)/include/gtest/gtest-printers.h', - '<(googletest_dir)/include/gtest/gtest-spi.h', - '<(googletest_dir)/include/gtest/gtest-test-part.h', - '<(googletest_dir)/include/gtest/gtest-typed-test.h', - '<(googletest_dir)/include/gtest/gtest.h', - '<(googletest_dir)/include/gtest/gtest_pred_impl.h', - '<(googletest_dir)/include/gtest/gtest_prod.h', - '<(googletest_dir)/include/gtest/internal/custom/gtest-port.h', - '<(googletest_dir)/include/gtest/internal/custom/gtest-printers.h', - '<(googletest_dir)/include/gtest/internal/custom/gtest.h', - '<(googletest_dir)/include/gtest/internal/gtest-death-test-internal.h', - '<(googletest_dir)/include/gtest/internal/gtest-filepath.h', - '<(googletest_dir)/include/gtest/internal/gtest-internal.h', - '<(googletest_dir)/include/gtest/internal/gtest-param-util-generated.h', - '<(googletest_dir)/include/gtest/internal/gtest-param-util.h', - '<(googletest_dir)/include/gtest/internal/gtest-port-arch.h', - '<(googletest_dir)/include/gtest/internal/gtest-port.h', - '<(googletest_dir)/include/gtest/internal/gtest-string.h', - '<(googletest_dir)/include/gtest/internal/gtest-type-util.h', - '<(googletest_dir)/src/gtest-all.cc', - '<(googletest_dir)/src/gtest-death-test.cc', - '<(googletest_dir)/src/gtest-filepath.cc', - '<(googletest_dir)/src/gtest-internal-inl.h', - '<(googletest_dir)/src/gtest-matchers.cc', - '<(googletest_dir)/src/gtest-port.cc', - '<(googletest_dir)/src/gtest-printers.cc', - '<(googletest_dir)/src/gtest-test-part.cc', - '<(googletest_dir)/src/gtest-typed-test.cc', - '<(googletest_dir)/src/gtest.cc', - ], - 'sources!': [ - '<(googletest_dir)/src/gtest-all.cc', - ], - 'direct_dependent_settings': { - 'include_dirs': [ - '<(googletest_dir)/include', - ], - }, - 'conditions': [ - ['crashpad_dependencies=="external"', { - 'include_dirs': [ - '<(googletest_dir)/../..', - ], - 'defines': [ - 'GUNIT_NO_GOOGLE3=1', - ], - 'direct_dependent_settings': { - 'include_dirs': [ - '<(googletest_dir)/../..', - ], - 'defines': [ - 'GUNIT_NO_GOOGLE3=1', - ], - }, - }], - ], - }, - { - 'target_name': 'googletest_main', - 'type': 'static_library', - 'dependencies': [ - 'googletest', - ], - 'sources': [ - '<(googletest_dir)/src/gtest_main.cc', - ], - }, - { - 'target_name': 'googletest_test_executable', - 'type': 'none', - 'dependencies': [ - 'googletest', - ], - 'direct_dependent_settings': { - 'type': 'executable', - 'include_dirs': [ - '<(googletest_dir)', - ], - }, - 'export_dependent_settings': [ - 'googletest', - ], - }, - { - 'target_name': 'gtest_all_test', - 'dependencies': [ - 'googletest_test_executable', - 'googletest_main', - ], - 'sources': [ - '<(googletest_dir)/test/googletest-death-test-test.cc', - '<(googletest_dir)/test/googletest-filepath-test.cc', - '<(googletest_dir)/test/googletest-message-test.cc', - '<(googletest_dir)/test/googletest-options-test.cc', - '<(googletest_dir)/test/googletest-port-test.cc', - '<(googletest_dir)/test/googletest-printers-testcc', - '<(googletest_dir)/test/googletest-test-part-test.cc', - '<(googletest_dir)/test/gtest-typed-test2_test.cc', - '<(googletest_dir)/test/gtest-typed-test_test.cc', - '<(googletest_dir)/test/gtest-typed-test_test.h', - '<(googletest_dir)/test/gtest_main_unittest.cc', - '<(googletest_dir)/test/gtest_pred_impl_unittest.cc', - '<(googletest_dir)/test/gtest_prod_test.cc', - '<(googletest_dir)/test/gtest_skip_test.cc', - '<(googletest_dir)/test/gtest_unittest.cc', - '<(googletest_dir)/test/production.cc', - '<(googletest_dir)/test/production.h', - ], - }, - { - 'target_name': 'gtest_environment_test', - 'dependencies': [ - 'googletest_test_executable', - ], - 'sources': [ - '<(googletest_dir)/test/gtest_environment_test.cc', - ], - }, - { - 'target_name': 'gtest_listener_test', - 'dependencies': [ - 'googletest_test_executable', - ], - 'sources': [ - '<(googletest_dir)/test/googletest-listener-test.cc', - ], - }, - { - 'target_name': 'gtest_macro_stack_footprint_test', - 'dependencies': [ - 'googletest_test_executable', - ], - 'sources': [ - '<(googletest_dir)/test/gtest_test_macro_stack_footprint_test.cc', - ], - }, - { - 'target_name': 'gtest_no_test', - 'dependencies': [ - 'googletest_test_executable', - ], - 'sources': [ - '<(googletest_dir)/test/gtest_no_test_unittest.cc', - ], - }, - { - 'target_name': 'gtest_param_test', - 'dependencies': [ - 'googletest_test_executable', - ], - 'sources': [ - '<(googletest_dir)/test/googletest-param-test-test.cc', - '<(googletest_dir)/test/googletest-param-test-test.h', - '<(googletest_dir)/test/googletest-param-test2-test.cc', - ], - 'conditions': [ - ['clang!=0', { - # For googletest/googlemock/test/gmock-matchers_test.cc’s - # Unstreamable::value_. - 'conditions': [ - ['OS=="mac"', { - 'xcode_settings': { - 'WARNING_CFLAGS': [ - '-Wno-unused-private-field', - ], - }, - }], - ['OS=="linux" or OS=="android"', { - 'cflags': [ - '-Wno-unused-private-field', - ], - }], - ], - }], - ], - }, - { - 'target_name': 'gtest_premature_exit_test', - 'dependencies': [ - 'googletest_test_executable', - ], - 'sources': [ - '<(googletest_dir)/test/gtest_premature_exit_test.cc', - ], - }, - { - 'target_name': 'gtest_repeat_test', - 'dependencies': [ - 'googletest_test_executable', - ], - 'sources': [ - '<(googletest_dir)/test/gtest_repeat_test.cc', - ], - }, - { - 'target_name': 'gtest_skip_in_environment_setup_test', - 'dependencies': [ - 'googletest_test_executable', - ], - 'sources': [ - '<(googletest_dir)/test/gtest_skip_in_environment_setup_test.cc', - ], - }, - { - 'target_name': 'gtest_sole_header_test', - 'dependencies': [ - 'googletest_test_executable', - 'googletest_main', - ], - 'sources': [ - '<(googletest_dir)/test/gtest_sole_header_test.cc', - ], - }, - { - 'target_name': 'gtest_stress_test', - 'dependencies': [ - 'googletest_test_executable', - ], - 'sources': [ - '<(googletest_dir)/test/gtest_stress_test.cc', - ], - }, - { - 'target_name': 'gtest_unittest_api_test', - 'dependencies': [ - 'googletest_test_executable', - ], - 'sources': [ - '<(googletest_dir)/test/gtest-unittest-api_test.cc', - ], - }, - { - 'target_name': 'googletest_all_tests', - 'type': 'none', - 'dependencies': [ - 'gtest_all_test', - 'gtest_environment_test', - 'gtest_listener_test', - 'gtest_macro_stack_footprint_test', - 'gtest_no_test', - 'gtest_param_test', - 'gtest_premature_exit_test', - 'gtest_repeat_test', - 'gtest_skip_in_environment_setup_test', - 'gtest_sole_header_test', - 'gtest_stress_test', - 'gtest_unittest_api_test', - ], - }, - ], -}
diff --git a/third_party/crashpad/crashpad/third_party/lss/lss.gyp b/third_party/crashpad/crashpad/third_party/lss/lss.gyp deleted file mode 100644 index 63b9b3a..0000000 --- a/third_party/crashpad/crashpad/third_party/lss/lss.gyp +++ /dev/null
@@ -1,27 +0,0 @@ -# Copyright 2019 The Crashpad Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -{ - 'targets': [ - { - 'target_name': 'lss', - 'type': 'none', - 'sources': [ 'lss.h' ], - 'direct_dependent_settings': { - # gyp is only used in circumstances when the embedded lss is used. - 'defines': [ 'CRASHPAD_LSS_SOURCE_EMBEDDED' ] - }, - } - ] -}
diff --git a/third_party/crashpad/crashpad/third_party/mini_chromium/BUILD.gn b/third_party/crashpad/crashpad/third_party/mini_chromium/BUILD.gn index c1eb588..ccd70c3d 100644 --- a/third_party/crashpad/crashpad/third_party/mini_chromium/BUILD.gn +++ b/third_party/crashpad/crashpad/third_party/mini_chromium/BUILD.gn
@@ -17,8 +17,10 @@ group("base") { if (crashpad_is_in_chromium) { public_deps = [ "//base" ] - } else if (crashpad_is_standalone || crashpad_is_in_fuchsia) { + } else if (crashpad_is_standalone) { public_deps = [ "mini_chromium/base" ] + } else if (crashpad_is_in_fuchsia) { + public_deps = [ "//third_party/mini_chromium/base" ] } else if (crashpad_is_external) { public_deps = [ "../../../../mini_chromium/mini_chromium/base" ] } else if (crashpad_is_in_dart) { @@ -37,8 +39,10 @@ group("build") { if (crashpad_is_in_chromium) { # Chromium has no build target. - } else if (crashpad_is_standalone || crashpad_is_in_fuchsia) { + } else if (crashpad_is_standalone) { public_deps = [ "mini_chromium/build" ] + } else if (crashpad_is_in_fuchsia) { + public_deps = [ "//third_party/mini_chromium/build" ] } else if (crashpad_is_external) { public_deps = [ "../../../../mini_chromium/mini_chromium/build" ] } else if (crashpad_is_in_dart) { @@ -49,8 +53,10 @@ group("chromeos_buildflags") { if (crashpad_is_in_chromium) { public_deps = [ "//build:chromeos_buildflags" ] - } else if (crashpad_is_standalone || crashpad_is_in_fuchsia) { + } else if (crashpad_is_standalone) { public_deps = [ "mini_chromium/build:chromeos_buildflags" ] + } else if (crashpad_is_in_fuchsia) { + public_deps = [ "//third_party/mini_chromium/build:chromeos_buildflags" ] } else if (crashpad_is_external) { public_deps = [ "../../../../mini_chromium/mini_chromium/build:chromeos_buildflags" ] } else if (crashpad_is_in_dart) {
diff --git a/third_party/crashpad/crashpad/third_party/mini_chromium/mini_chromium.gyp b/third_party/crashpad/crashpad/third_party/mini_chromium/mini_chromium.gyp deleted file mode 100644 index e14a1fa..0000000 --- a/third_party/crashpad/crashpad/third_party/mini_chromium/mini_chromium.gyp +++ /dev/null
@@ -1,47 +0,0 @@ -# Copyright 2015 The Crashpad Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -{ - 'includes': [ - '../../build/crashpad_dependencies.gypi', - ], - 'targets': [ - { - # To support Crashpad’s standalone build and its build depending on - # external libraries, Crashpad code depending on base should do so through - # this shim, which will either get base from mini_chromium or an external - # library depending on the build type. - 'target_name': 'base', - 'type': 'none', - 'conditions': [ - ['crashpad_dependencies=="standalone"', { - 'dependencies': [ - 'mini_chromium/base/base.gyp:base', - ], - 'export_dependent_settings': [ - 'mini_chromium/base/base.gyp:base', - ], - }], - ['crashpad_dependencies=="external"', { - 'dependencies': [ - '../../../../mini_chromium/mini_chromium/base/base.gyp:base', - ], - 'export_dependent_settings': [ - '../../../../mini_chromium/mini_chromium/base/base.gyp:base', - ], - }], - ], - }, - ], -}
diff --git a/third_party/crashpad/crashpad/third_party/zlib/zlib.gyp b/third_party/crashpad/crashpad/third_party/zlib/zlib.gyp deleted file mode 100644 index df26cc2..0000000 --- a/third_party/crashpad/crashpad/third_party/zlib/zlib.gyp +++ /dev/null
@@ -1,168 +0,0 @@ -# Copyright 2017 The Crashpad Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -{ - 'includes': [ - '../../build/crashpad_dependencies.gypi', - ], - 'conditions': [ - ['1==1', { # Defer processing until crashpad_dependencies is set - 'variables': { - 'conditions': [ - ['crashpad_dependencies=="external"', { - 'zlib_source%': 'external', - }, 'OS!="win"', { - # Use the system zlib by default where available, as it is on most - # platforms. Windows does not have a system zlib, so use “embedded” - # which directs the build to use the source code in the zlib - # subdirectory. - 'zlib_source%': 'system', - }, { - 'zlib_source%': 'embedded', - }], - ], - }, - }], - ], - 'targets': [ - { - 'target_name': 'zlib', - 'conditions': [ - ['zlib_source=="system"', { - 'type': 'none', - 'direct_dependent_settings': { - 'defines': [ - 'CRASHPAD_ZLIB_SOURCE_SYSTEM', - ], - }, - 'link_settings': { - 'conditions': [ - ['OS=="mac"', { - 'libraries': [ - '$(SDKROOT)/usr/lib/libz.dylib', - ], - }, { - 'libraries': [ - '-lz', - ], - }], - ], - }, - }], - ['zlib_source=="embedded"', { - 'type': 'static_library', - 'include_dirs': [ - 'zlib', - ], - 'defines': [ - 'CRASHPAD_ZLIB_SOURCE_EMBEDDED', - 'HAVE_STDARG_H', - ], - 'direct_dependent_settings': { - 'include_dirs': [ - 'zlib', - ], - 'defines': [ - 'CRASHPAD_ZLIB_SOURCE_EMBEDDED', - ], - }, - 'sources': [ - 'zlib/adler32.c', - 'zlib/compress.c', - 'zlib/crc32.c', - 'zlib/crc32.h', - 'zlib/crc_folding.c', - 'zlib/deflate.c', - 'zlib/deflate.h', - 'zlib/fill_window_sse.c', - 'zlib/gzclose.c', - 'zlib/gzguts.h', - 'zlib/gzlib.c', - 'zlib/gzread.c', - 'zlib/gzwrite.c', - 'zlib/infback.c', - 'zlib/inffast.c', - 'zlib/inffast.h', - 'zlib/inffixed.h', - 'zlib/inflate.c', - 'zlib/inflate.h', - 'zlib/inftrees.c', - 'zlib/inftrees.h', - 'zlib/names.h', - 'zlib/simd_stub.c', - 'zlib/trees.c', - 'zlib/trees.h', - 'zlib/uncompr.c', - 'zlib/x86.c', - 'zlib/x86.h', - 'zlib/zconf.h', - 'zlib/zlib.h', - 'zlib/zutil.c', - 'zlib/zutil.h', - 'zlib_crashpad.h', - ], - 'conditions': [ - ['target_arch=="ia32" or target_arch=="x64"', { - 'sources!': [ - 'zlib/simd_stub.c', - ], - 'cflags': [ - '-msse4.2', - '-mpclmul', - ], - 'xcode_settings': { - 'OTHER_CFLAGS': [ - '-msse4.2', - '-mpclmul', - ], - }, - }, { - 'sources!': [ - 'zlib/crc_folding.c', - 'zlib/fill_window_sse.c', - 'zlib/x86.c', - 'zlib/x86.h', - ], - }], - ['OS!="win"', { - 'defines': [ - 'HAVE_HIDDEN', - 'HAVE_UNISTD_H', - ], - }, { - 'msvs_disabled_warnings': [ - 4131, # uses old-style declarator - 4244, # conversion from 't1' to 't2', possible loss of data - 4245, # conversion from 't1' to 't2', signed/unsigned mismatch - 4267, # conversion from 'size_t' to 't', possible loss of data - 4324, # structure was padded due to alignment specifier - ], - }], - ], - }], - ['zlib_source=="external"', { - 'type': 'none', - 'direct_dependent_settings': { - 'defines': [ - 'CRASHPAD_ZLIB_SOURCE_EXTERNAL', - ], - }, - 'dependencies': [ - '../../../../zlib/zlib.gyp:zlib', - ], - }], - ], - }, - ], -}
diff --git a/third_party/crashpad/crashpad/tools/BUILD.gn b/third_party/crashpad/crashpad/tools/BUILD.gn index 7da109bc..91e20a0 100644 --- a/third_party/crashpad/crashpad/tools/BUILD.gn +++ b/third_party/crashpad/crashpad/tools/BUILD.gn
@@ -22,7 +22,7 @@ public_configs = [ "..:crashpad_config" ] - deps = [ "../third_party/mini_chromium:base" ] + deps = [ "$mini_chromium_source_parent:base" ] } if (!crashpad_is_ios) { @@ -34,7 +34,7 @@ "../build:default_exe_manifest_win", "../client", "../compat", - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", "../util", ] } @@ -46,7 +46,7 @@ ":tool_support", "../build:default_exe_manifest_win", "../compat", - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", "../util", ] } @@ -57,7 +57,7 @@ deps = [ ":tool_support", "../build:default_exe_manifest_win", - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", "../util", ] } @@ -72,7 +72,7 @@ "../compat", "../minidump", "../snapshot", - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", "../util", ] @@ -104,7 +104,7 @@ ":tool_support", "../client", "../compat", - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", "../util", ] } @@ -117,7 +117,7 @@ deps = [ ":tool_support", "../compat", - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", "../util", ] } @@ -138,7 +138,7 @@ deps = [ ":tool_support", "../compat", - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", "../util", ] } @@ -154,7 +154,7 @@ deps = [ ":tool_support", "../compat", - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", "../util", ] }
diff --git a/third_party/crashpad/crashpad/tools/tools.gyp b/third_party/crashpad/crashpad/tools/tools.gyp deleted file mode 100644 index d2ab29aa..0000000 --- a/third_party/crashpad/crashpad/tools/tools.gyp +++ /dev/null
@@ -1,209 +0,0 @@ -# Copyright 2014 The Crashpad Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -{ - 'includes': [ - '../build/crashpad.gypi', - ], - 'targets': [ - { - 'target_name': 'crashpad_tool_support', - 'type': 'static_library', - 'dependencies': [ - '../third_party/mini_chromium/mini_chromium.gyp:base', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - 'tool_support.cc', - 'tool_support.h', - ], - }, - { - 'target_name': 'crashpad_database_util', - 'type': 'executable', - 'dependencies': [ - 'crashpad_tool_support', - '../client/client.gyp:crashpad_client', - '../compat/compat.gyp:crashpad_compat', - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../util/util.gyp:crashpad_util', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - 'crashpad_database_util.cc', - ], - }, - { - 'target_name': 'crashpad_http_upload', - 'type': 'executable', - 'dependencies': [ - 'crashpad_tool_support', - '../compat/compat.gyp:crashpad_compat', - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../util/util.gyp:crashpad_util', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - 'crashpad_http_upload.cc', - ], - }, - { - 'target_name': 'generate_dump', - 'type': 'executable', - 'dependencies': [ - 'crashpad_tool_support', - '../compat/compat.gyp:crashpad_compat', - '../minidump/minidump.gyp:crashpad_minidump', - '../snapshot/snapshot.gyp:crashpad_snapshot', - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../util/util.gyp:crashpad_util', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - 'generate_dump.cc', - ], - 'conditions': [ - ['OS=="mac"', { - 'xcode_settings': { - 'OTHER_LDFLAGS': [ - '-sectcreate', - '__TEXT', - '__info_plist', - '<(sectaskaccess_info_plist)' - ], - }, - }], - ], - }, - ], - 'conditions': [ - ['OS=="mac"', { - 'variables': { - # Programs that use task_for_pid() can indicate to taskgated(8) in their - # Info.plist that they are allowed to call that function. In order for - # this to work, the programs in question must be signed by an authority - # trusted by the system. Signing is beyond the scope of the build, but - # the key to make this work is placed in Info.plist to enable the - # desired behavior once the tools that require this access are signed. - # - # The tools built here are flat-file executables, and are not bundled. - # To have an Info.plist, they must have a special __TEXT,__info_plist - # section. This section is created at link time. - # - # The Info.plist for this purpose is mac/sectaskaccess_info.plist and is - # referenced by OTHER_LDFLAGS. ninja runs the link step from the output - # directory such as out/Release, and requires a relative path from that - # directory. Xcode runs the link step from the directory of the - # .xcodeproj, which is the directory of the .gyp file. - 'conditions': [ - ['GENERATOR=="ninja"', { - 'sectaskaccess_info_plist': '<!(pwd)/mac/sectaskaccess_info.plist', - }, { # else: GENERATOR!="ninja" - 'sectaskaccess_info_plist': 'mac/sectaskaccess_info.plist', - }], - ], - }, - - 'targets': [ - { - 'target_name': 'catch_exception_tool', - 'type': 'executable', - 'dependencies': [ - 'crashpad_tool_support', - '../compat/compat.gyp:crashpad_compat', - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../util/util.gyp:crashpad_util', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - 'mac/catch_exception_tool.cc', - ], - }, - { - 'target_name': 'exception_port_tool', - 'type': 'executable', - 'dependencies': [ - 'crashpad_tool_support', - '../compat/compat.gyp:crashpad_compat', - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../util/util.gyp:crashpad_util', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - 'mac/exception_port_tool.cc', - ], - 'xcode_settings': { - 'OTHER_LDFLAGS': [ - '-sectcreate', - '__TEXT', - '__info_plist', - '<(sectaskaccess_info_plist)' - ], - }, - }, - { - 'target_name': 'on_demand_service_tool', - 'type': 'executable', - 'dependencies': [ - 'crashpad_tool_support', - '../compat/compat.gyp:crashpad_compat', - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../util/util.gyp:crashpad_util', - ], - 'include_dirs': [ - '..', - ], - 'link_settings': { - 'libraries': [ - '$(SDKROOT)/System/Library/Frameworks/CoreFoundation.framework', - '$(SDKROOT)/System/Library/Frameworks/Foundation.framework', - ], - }, - 'sources': [ - 'mac/on_demand_service_tool.mm', - ], - }, - { - 'target_name': 'run_with_crashpad', - 'type': 'executable', - 'dependencies': [ - 'crashpad_tool_support', - '../client/client.gyp:crashpad_client', - '../compat/compat.gyp:crashpad_compat', - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../util/util.gyp:crashpad_util', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - 'run_with_crashpad.cc', - ], - }, - ], - }], - ], -}
diff --git a/third_party/crashpad/crashpad/util/BUILD.gn b/third_party/crashpad/crashpad/util/BUILD.gn index 306c5704..ceb31c8 100644 --- a/third_party/crashpad/crashpad/util/BUILD.gn +++ b/third_party/crashpad/crashpad/util/BUILD.gn
@@ -22,10 +22,8 @@ if (crashpad_is_mac || crashpad_is_ios) { if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) { import("//build/config/sysroot.gni") - } else if (crashpad_is_external) { - import("../../../mini_chromium/mini_chromium/build/sysroot.gni") } else { - import("//third_party/mini_chromium/mini_chromium/build/sysroot.gni") + import("$mini_chromium_import_root/build/sysroot.gni") } action_foreach("mig") { @@ -388,8 +386,6 @@ if (crashpad_is_ios) { sources += [ - "ios/exception_processor.h", - "ios/exception_processor.mm", "ios/ios_intermediate_dump_data.cc", "ios/ios_intermediate_dump_data.h", "ios/ios_intermediate_dump_format.h", @@ -618,8 +614,8 @@ ] deps += [ - "../third_party/mini_chromium:base", - "../third_party/mini_chromium:chromeos_buildflags", + "$mini_chromium_source_parent:base", + "$mini_chromium_source_parent:chromeos_buildflags", ] if (crashpad_is_mac || crashpad_is_ios) { @@ -672,11 +668,12 @@ deps = [ ":util", "../third_party/cpp-httplib", - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", "../third_party/zlib", "../tools:tool_support", ] + # TODO(b/189353575): make these relocatable using $mini_chromium_ variables if (crashpad_is_standalone) { remove_configs = [ "//third_party/mini_chromium/mini_chromium/build/config:Wexit_time_destructors" ] } else if (crashpad_is_external) { @@ -707,7 +704,7 @@ source_set("no_cfi_icall") { sources = [ "misc/no_cfi_icall.h" ] public_configs = [ "..:crashpad_config" ] - public_deps = [ "../third_party/mini_chromium:build" ] + public_deps = [ "$mini_chromium_source_parent:build" ] } source_set("util_test") { @@ -816,7 +813,6 @@ if (crashpad_is_ios) { sources += [ - "ios/exception_processor_test.mm", "ios/ios_intermediate_dump_reader_test.cc", "ios/ios_intermediate_dump_writer_test.cc", "ios/scoped_vm_read_test.cc", @@ -884,7 +880,7 @@ "../test", "../third_party/googletest:googlemock", "../third_party/googletest:googletest", - "../third_party/mini_chromium:base", + "$mini_chromium_source_parent:base", "../third_party/zlib", ]
diff --git a/third_party/crashpad/crashpad/util/file/file_io_test.cc b/third_party/crashpad/crashpad/util/file/file_io_test.cc index cea18555..fc61857 100644 --- a/third_party/crashpad/crashpad/util/file/file_io_test.cc +++ b/third_party/crashpad/crashpad/util/file/file_io_test.cc
@@ -51,7 +51,7 @@ return ReadExactly(reinterpret_cast<void*>(data), size, can_log); } - MOCK_METHOD3(ReadInt, FileOperationResult(uintptr_t, size_t, bool)); + MOCK_METHOD(FileOperationResult, ReadInt, (uintptr_t, size_t, bool)); // ReadExactlyInternal: FileOperationResult Read(void* data, size_t size, bool can_log) { @@ -248,7 +248,7 @@ return WriteAll(reinterpret_cast<const void*>(data), size); } - MOCK_METHOD2(WriteInt, FileOperationResult(uintptr_t, size_t)); + MOCK_METHOD(FileOperationResult, WriteInt, (uintptr_t, size_t)); // WriteAllInternal: FileOperationResult Write(const void* data, size_t size) {
diff --git a/third_party/crashpad/crashpad/util/file/file_reader_test.cc b/third_party/crashpad/crashpad/util/file/file_reader_test.cc index ed6ee86..ea2dd35 100644 --- a/third_party/crashpad/crashpad/util/file/file_reader_test.cc +++ b/third_party/crashpad/crashpad/util/file/file_reader_test.cc
@@ -42,7 +42,7 @@ return ReadExactly(reinterpret_cast<void*>(data), size); } - MOCK_METHOD2(ReadInt, FileOperationResult(uintptr_t, size_t)); + MOCK_METHOD(FileOperationResult, ReadInt, (uintptr_t, size_t)); // FileReaderInterface: FileOperationResult Read(void* data, size_t size) override { @@ -50,7 +50,7 @@ } // FileSeekerInterface: - MOCK_METHOD2(Seek, FileOffset(FileOffset, int)); + MOCK_METHOD(FileOffset, Seek, (FileOffset, int), (override)); private: DISALLOW_COPY_AND_ASSIGN(MockFileReader);
diff --git a/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_format.h b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_format.h index 1d7cad6..46d3f46 100644 --- a/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_format.h +++ b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_format.h
@@ -26,12 +26,10 @@ TD(kInvalid, 0) \ TD(kVersion, 1) \ TD(kMachException, 1000) \ - TD(kCode, 1001) \ - TD(kCodeCount, 1002) \ - TD(kException, 1003) \ - TD(kFlavor, 1004) \ - TD(kState, 1005) \ - TD(kStateCount, 1006) \ + TD(kCodes, 1001) \ + TD(kException, 1002) \ + TD(kFlavor, 1003) \ + TD(kState, 1004) \ TD(kSignalException, 2000) \ TD(kSignalNumber, 2001) \ TD(kSignalCode, 2002) \
diff --git a/third_party/crashpad/crashpad/util/ios/ios_system_data_collector.h b/third_party/crashpad/crashpad/util/ios/ios_system_data_collector.h index 556d7242..cac0c86 100644 --- a/third_party/crashpad/crashpad/util/ios/ios_system_data_collector.h +++ b/third_party/crashpad/crashpad/util/ios/ios_system_data_collector.h
@@ -29,16 +29,16 @@ ~IOSSystemDataCollector(); void OSVersion(int* major, int* minor, int* bugfix) const; - std::string MachineDescription() const { return machine_description_; } + const std::string& MachineDescription() const { return machine_description_; } int ProcessorCount() const { return processor_count_; } - std::string Build() const { return build_; } - std::string CPUVendor() const { return cpu_vendor_; } + const std::string& Build() const { return build_; } + const std::string& CPUVendor() const { return cpu_vendor_; } bool HasDaylightSavingTime() const { return has_next_daylight_saving_time_; } bool IsDaylightSavingTime() const { return is_daylight_saving_time_; } int StandardOffsetSeconds() const { return standard_offset_seconds_; } int DaylightOffsetSeconds() const { return daylight_offset_seconds_; } - std::string StandardName() const { return standard_name_; } - std::string DaylightName() const { return daylight_name_; } + const std::string& StandardName() const { return standard_name_; } + const std::string& DaylightName() const { return daylight_name_; } // Currently unused by minidump. int Orientation() const { return orientation_; }
diff --git a/third_party/crashpad/crashpad/util/ios/scoped_vm_read.cc b/third_party/crashpad/crashpad/util/ios/scoped_vm_read.cc index 3bbc596..06cf434 100644 --- a/third_party/crashpad/crashpad/util/ios/scoped_vm_read.cc +++ b/third_party/crashpad/crashpad/util/ios/scoped_vm_read.cc
@@ -53,7 +53,7 @@ data_ = vm_read_data_ + (data_address - page_region_address); return true; } else { - CRASHPAD_RAW_LOG_ERROR(kr, "vm_read"); + // It's expected that this will sometimes fail. Don't log here. return false; } }
diff --git a/third_party/crashpad/crashpad/util/ios/scoped_vm_read.h b/third_party/crashpad/crashpad/util/ios/scoped_vm_read.h index 86d8039..3f396d4 100644 --- a/third_party/crashpad/crashpad/util/ios/scoped_vm_read.h +++ b/third_party/crashpad/crashpad/util/ios/scoped_vm_read.h
@@ -70,13 +70,22 @@ //! \param[in] data Memory to be read by vm_read. //! \param[in] count Length of \a data. //! - //! \return `true` if all the data was read. Logs an error and returns false - //! on failure + //! \return `true` if all \a data was read. Returns false on failure. bool Read(const void* data, size_t count = 1) { size_t data_length = count * sizeof(T); return internal_.Read(data, data_length); } + //! \brief Releases any previously read data and vm_reads address. + //! + //! \param[in] address Address of memory to be read by vm_read. + //! \param[in] count Length of \a data. + //! + //! \return `true` if all of \a address was read. Returns false on failure. + bool Read(vm_address_t address, size_t count = 1) { + return Read(reinterpret_cast<T*>(address), count); + } + //! \brief Returns the pointer to memory safe to read during the in-process //! crash handler. T* operator->() const { return get(); }
diff --git a/third_party/crashpad/crashpad/util/linux/auxiliary_vector_test.cc b/third_party/crashpad/crashpad/util/linux/auxiliary_vector_test.cc index 00af5ab..2f6c942267 100644 --- a/third_party/crashpad/crashpad/util/linux/auxiliary_vector_test.cc +++ b/third_party/crashpad/crashpad/util/linux/auxiliary_vector_test.cc
@@ -95,8 +95,7 @@ ASSERT_TRUE(aux.GetValue(AT_EGID, &egid)); EXPECT_EQ(egid, getegid()); - ProcessMemoryLinux memory; - ASSERT_TRUE(memory.Initialize(pid)); + ProcessMemoryLinux memory(&connection); LinuxVMAddress platform_addr; ASSERT_TRUE(aux.GetValue(AT_PLATFORM, &platform_addr));
diff --git a/third_party/crashpad/crashpad/util/linux/direct_ptrace_connection.cc b/third_party/crashpad/crashpad/util/linux/direct_ptrace_connection.cc index 8b55205..5da0147 100644 --- a/third_party/crashpad/crashpad/util/linux/direct_ptrace_connection.cc +++ b/third_party/crashpad/crashpad/util/linux/direct_ptrace_connection.cc
@@ -39,10 +39,6 @@ } pid_ = pid; - if (!memory_.Initialize(pid)) { - return false; - } - INITIALIZATION_STATE_SET_VALID(initialized_); return true; } @@ -79,7 +75,10 @@ ProcessMemory* DirectPtraceConnection::Memory() { INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return &memory_; + if (!memory_) { + memory_ = std::make_unique<ProcessMemoryLinux>(this); + } + return memory_.get(); } bool DirectPtraceConnection::Threads(std::vector<pid_t>* threads) { @@ -87,4 +86,10 @@ return ReadThreadIDs(pid_, threads); } +ssize_t DirectPtraceConnection::ReadUpTo(VMAddress address, + size_t size, + void* buffer) { + return ptracer_.ReadUpTo(pid_, address, size, static_cast<char*>(buffer)); +} + } // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/linux/direct_ptrace_connection.h b/third_party/crashpad/crashpad/util/linux/direct_ptrace_connection.h index 10f8370..99ad233 100644 --- a/third_party/crashpad/crashpad/util/linux/direct_ptrace_connection.h +++ b/third_party/crashpad/crashpad/util/linux/direct_ptrace_connection.h
@@ -57,10 +57,11 @@ std::string* contents) override; ProcessMemory* Memory() override; bool Threads(std::vector<pid_t>* threads) override; + ssize_t ReadUpTo(VMAddress, size_t size, void* buffer) override; private: std::vector<std::unique_ptr<ScopedPtraceAttach>> attachments_; - ProcessMemoryLinux memory_; + std::unique_ptr<ProcessMemory> memory_; pid_t pid_; Ptracer ptracer_; InitializationStateDcheck initialized_;
diff --git a/third_party/crashpad/crashpad/util/linux/ptrace_broker_test.cc b/third_party/crashpad/crashpad/util/linux/ptrace_broker_test.cc index 341f2c80..2012df3 100644 --- a/third_party/crashpad/crashpad/util/linux/ptrace_broker_test.cc +++ b/third_party/crashpad/crashpad/util/linux/ptrace_broker_test.cc
@@ -151,8 +151,7 @@ broker_thread.Start(); PtraceClient client; - ASSERT_TRUE(client.Initialize( - client_sock.get(), ChildPID(), /* try_direct_memory= */ false)); + ASSERT_TRUE(client.Initialize(client_sock.get(), ChildPID())); EXPECT_EQ(client.GetProcessID(), ChildPID()); @@ -177,32 +176,26 @@ ASSERT_TRUE(client.GetThreadInfo(child2_tid, &info2)); EXPECT_EQ(info2.thread_specific_data_address, child2_tls); - ProcessMemory* memory = client.Memory(); - ASSERT_TRUE(memory); - - auto buffer = std::make_unique<char[]>(mapping_.len()); - ASSERT_TRUE(memory->Read( - mapping_.addr_as<VMAddress>(), mapping_.len(), buffer.get())); auto expected_buffer = mapping_.addr_as<char*>(); - for (size_t index = 0; index < mapping_.len(); ++index) { - EXPECT_EQ(buffer[index], expected_buffer[index]); - } - char first; - ASSERT_TRUE( - memory->Read(mapping_.addr_as<VMAddress>(), sizeof(first), &first)); + ASSERT_EQ( + client.ReadUpTo(mapping_.addr_as<VMAddress>(), sizeof(first), &first), + 1); EXPECT_EQ(first, expected_buffer[0]); char last; - ASSERT_TRUE(memory->Read(mapping_.addr_as<VMAddress>() + mapping_.len() - 1, - sizeof(last), - &last)); + ASSERT_EQ( + client.ReadUpTo(mapping_.addr_as<VMAddress>() + mapping_.len() - 1, + sizeof(last), + &last), + 1); EXPECT_EQ(last, expected_buffer[mapping_.len() - 1]); char unmapped; - EXPECT_FALSE(memory->Read(mapping_.addr_as<VMAddress>() + mapping_.len(), + EXPECT_EQ(client.ReadUpTo(mapping_.addr_as<VMAddress>() + mapping_.len(), sizeof(unmapped), - &unmapped)); + &unmapped), + -1); std::string file_root = file_dir.value() + '/'; broker.SetFileRoot(file_root.c_str());
diff --git a/third_party/crashpad/crashpad/util/linux/ptrace_client.cc b/third_party/crashpad/crashpad/util/linux/ptrace_client.cc index 0e9c821..cb1a1a5 100644 --- a/third_party/crashpad/crashpad/util/linux/ptrace_client.cc +++ b/third_party/crashpad/crashpad/util/linux/ptrace_client.cc
@@ -143,7 +143,7 @@ } } -bool PtraceClient::Initialize(int sock, pid_t pid, bool try_direct_memory) { +bool PtraceClient::Initialize(int sock, pid_t pid) { INITIALIZATION_STATE_SET_INITIALIZING(initialized_); sock_ = sock; pid_ = pid; @@ -166,16 +166,6 @@ } is_64_bit_ = is_64_bit == ExceptionHandlerProtocol::kBoolTrue; - if (try_direct_memory) { - auto direct_mem = std::make_unique<ProcessMemoryLinux>(); - if (direct_mem->Initialize(pid)) { - memory_.reset(direct_mem.release()); - } - } - if (!memory_) { - memory_ = std::make_unique<BrokeredMemory>(this); - } - INITIALIZATION_STATE_SET_VALID(initialized_); return true; } @@ -260,6 +250,9 @@ ProcessMemory* PtraceClient::Memory() { INITIALIZATION_STATE_DCHECK_VALID(initialized_); + if (!memory_) { + memory_ = std::make_unique<ProcessMemoryLinux>(this); + } return memory_.get(); } @@ -308,20 +301,7 @@ return true; } -PtraceClient::BrokeredMemory::BrokeredMemory(PtraceClient* client) - : ProcessMemory(), client_(client) {} - -PtraceClient::BrokeredMemory::~BrokeredMemory() = default; - -ssize_t PtraceClient::BrokeredMemory::ReadUpTo(VMAddress address, - size_t size, - void* buffer) const { - return client_->ReadUpTo(address, size, buffer); -} - -ssize_t PtraceClient::ReadUpTo(VMAddress address, - size_t size, - void* buffer) const { +ssize_t PtraceClient::ReadUpTo(VMAddress address, size_t size, void* buffer) { INITIALIZATION_STATE_DCHECK_VALID(initialized_); char* buffer_c = reinterpret_cast<char*>(buffer);
diff --git a/third_party/crashpad/crashpad/util/linux/ptrace_client.h b/third_party/crashpad/crashpad/util/linux/ptrace_client.h index b4f27ae..896a8b4 100644 --- a/third_party/crashpad/crashpad/util/linux/ptrace_client.h +++ b/third_party/crashpad/crashpad/util/linux/ptrace_client.h
@@ -46,11 +46,8 @@ //! ownership of the socket. //! \param[in] pid The process ID of the process to form a PtraceConnection //! with. - //! \param[in] try_direct_memory If `true` the client will attempt to support - //! memory reading operations by directly acessing the target process' - //! /proc/[pid]/mem file. //! \return `true` on success. `false` on failure with a message logged. - bool Initialize(int sock, pid_t pid, bool try_direct_memory = true); + bool Initialize(int sock, pid_t pid); // PtraceConnection: @@ -62,24 +59,9 @@ std::string* contents) override; ProcessMemory* Memory() override; bool Threads(std::vector<pid_t>* threads) override; + ssize_t ReadUpTo(VMAddress address, size_t size, void* buffer) override; private: - class BrokeredMemory : public ProcessMemory { - public: - explicit BrokeredMemory(PtraceClient* client); - ~BrokeredMemory(); - - ssize_t ReadUpTo(VMAddress address, - size_t size, - void* buffer) const override; - - private: - PtraceClient* client_; - - DISALLOW_COPY_AND_ASSIGN(BrokeredMemory); - }; - - ssize_t ReadUpTo(VMAddress address, size_t size, void* buffer) const; bool SendFilePath(const char* path, size_t length); std::unique_ptr<ProcessMemory> memory_;
diff --git a/third_party/crashpad/crashpad/util/linux/ptrace_connection.h b/third_party/crashpad/crashpad/util/linux/ptrace_connection.h index 2111747..9b31d52a 100644 --- a/third_party/crashpad/crashpad/util/linux/ptrace_connection.h +++ b/third_party/crashpad/crashpad/util/linux/ptrace_connection.h
@@ -73,6 +73,20 @@ //! this method returns `false`, \a threads may contain a partial list of //! thread IDs. virtual bool Threads(std::vector<pid_t>* threads) = 0; + + //! \brief Copies memory from the connected process into a caller-provided + //! buffer in the current process, up to a maximum number of bytes. + //! + //! \param[in] address The address, in the connected process' address space, + //! of the memory region to copy. + //! \param[in] size The maximum size, in bytes, of the memory region to copy. + //! \a buffer must be at least this size. + //! \param[out] buffer The buffer into which the contents of the other + //! process' memory will be copied. + //! + //! \return the number of bytes copied, 0 if there is no more data to read, or + //! -1 on failure with a message logged. + virtual ssize_t ReadUpTo(VMAddress address, size_t size, void* buffer) = 0; }; } // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/mach/child_port_handshake_test.cc b/third_party/crashpad/crashpad/util/mach/child_port_handshake_test.cc index fa7ab09..44139b1 100644 --- a/third_party/crashpad/crashpad/util/mach/child_port_handshake_test.cc +++ b/third_party/crashpad/crashpad/util/mach/child_port_handshake_test.cc
@@ -130,7 +130,6 @@ case TestType::kServerDies: // This was special-cased as an early return above. FAIL(); - break; } }
diff --git a/third_party/crashpad/crashpad/util/mach/child_port_server_test.cc b/third_party/crashpad/crashpad/util/mach/child_port_server_test.cc index 984d64a..451caa81 100644 --- a/third_party/crashpad/crashpad/util/mach/child_port_server_test.cc +++ b/third_party/crashpad/crashpad/util/mach/child_port_server_test.cc
@@ -89,13 +89,14 @@ class MockChildPortServerInterface : public ChildPortServer::Interface { public: - MOCK_METHOD6(HandleChildPortCheckIn, - kern_return_t(child_port_server_t server, - const child_port_token_t token, - mach_port_t port, - mach_msg_type_name_t right_type, - const mach_msg_trailer_t* trailer, - bool* destroy_request)); + MOCK_METHOD(kern_return_t, + HandleChildPortCheckIn, + (child_port_server_t server, + const child_port_token_t token, + mach_port_t port, + mach_msg_type_name_t right_type, + const mach_msg_trailer_t* trailer, + bool* destroy_request)); }; TEST(ChildPortServer, MockChildPortCheckIn) {
diff --git a/third_party/crashpad/crashpad/util/mach/exc_server_variants_test.cc b/third_party/crashpad/crashpad/util/mach/exc_server_variants_test.cc index 287551b..836048b8 100644 --- a/third_party/crashpad/crashpad/util/mach/exc_server_variants_test.cc +++ b/third_party/crashpad/crashpad/util/mach/exc_server_variants_test.cc
@@ -371,8 +371,8 @@ // are identical. using MachExceptionRaiseStateReply = ExceptionRaiseStateReply; -struct __attribute__((packed, - aligned(4))) MachExceptionRaiseStateIdentityRequest { +struct __attribute__((packed, aligned(4))) +MachExceptionRaiseStateIdentityRequest { MachExceptionRaiseStateIdentityRequest() { memset(this, 0xa5, sizeof(*this)); Head.msgh_bits = @@ -509,17 +509,18 @@ trailer); } - MOCK_METHOD10(MockCatchMachException, - kern_return_t(exception_behavior_t behavior, - exception_handler_t exception_port, - thread_t thread, - task_t task, - exception_type_t exception, - const ConstExceptionCodes* exception_codes, - thread_state_flavor_t* flavor, - const ConstThreadStateAndCount* old_thread_state, - ThreadStateAndCount* new_thread_state, - const mach_msg_trailer_t* trailer)); + MOCK_METHOD(kern_return_t, + MockCatchMachException, + (exception_behavior_t behavior, + exception_handler_t exception_port, + thread_t thread, + task_t task, + exception_type_t exception, + const ConstExceptionCodes* exception_codes, + thread_state_flavor_t* flavor, + const ConstThreadStateAndCount* old_thread_state, + ThreadStateAndCount* new_thread_state, + const mach_msg_trailer_t* trailer)); }; // Matcher for ConstExceptionCodes, testing that it carries 2 codes matching
diff --git a/third_party/crashpad/crashpad/util/mach/notify_server_test.cc b/third_party/crashpad/crashpad/util/mach/notify_server_test.cc index 5e05c6d0..40a3826 100644 --- a/third_party/crashpad/crashpad/util/mach/notify_server_test.cc +++ b/third_party/crashpad/crashpad/util/mach/notify_server_test.cc
@@ -165,30 +165,39 @@ public: // NotifyServer::Interface: - MOCK_METHOD3(DoMachNotifyPortDeleted, - kern_return_t(notify_port_t notify, - mach_port_name_t name, - const mach_msg_trailer_t* trailer)); + MOCK_METHOD(kern_return_t, + DoMachNotifyPortDeleted, + (notify_port_t notify, + mach_port_name_t name, + const mach_msg_trailer_t* trailer), + (override)); - MOCK_METHOD4(DoMachNotifyPortDestroyed, - kern_return_t(notify_port_t notify, - mach_port_t rights, - const mach_msg_trailer_t* trailer, - bool* destroy_request)); + MOCK_METHOD(kern_return_t, + DoMachNotifyPortDestroyed, + (notify_port_t notify, + mach_port_t rights, + const mach_msg_trailer_t* trailer, + bool* destroy_request), + (override)); - MOCK_METHOD3(DoMachNotifyNoSenders, - kern_return_t(notify_port_t notify, - mach_port_mscount_t mscount, - const mach_msg_trailer_t* trailer)); + MOCK_METHOD(kern_return_t, + DoMachNotifyNoSenders, + (notify_port_t notify, + mach_port_mscount_t mscount, + const mach_msg_trailer_t* trailer), + (override)); - MOCK_METHOD2(DoMachNotifySendOnce, - kern_return_t(notify_port_t notify, - const mach_msg_trailer_t* trailer)); + MOCK_METHOD(kern_return_t, + DoMachNotifySendOnce, + (notify_port_t notify, const mach_msg_trailer_t* trailer), + (override)); - MOCK_METHOD3(DoMachNotifyDeadName, - kern_return_t(notify_port_t notify, - mach_port_name_t name, - const mach_msg_trailer_t* trailer)); + MOCK_METHOD(kern_return_t, + DoMachNotifyDeadName, + (notify_port_t notify, + mach_port_name_t name, + const mach_msg_trailer_t* trailer), + (override)); protected: NotifyServerTestBase() : testing::Test(), NotifyServer::Interface() {} @@ -269,9 +278,7 @@ } // testing::Test: - void TearDown() override { - server_port_.reset(); - } + void TearDown() override { server_port_.reset(); } private: base::mac::ScopedMachReceiveRight server_port_; @@ -520,7 +527,7 @@ ResultOf(DeadNameRightRefCount, 2)), ResultOf(AuditPIDFromMachMessageTrailer, 0))) .WillOnce( - DoAll(WithArg<1>(Invoke(MachPortDeallocate)), Return(MIG_NO_REPLY))) + DoAll(WithArg<1>(Invoke(MachPortDeallocate)), Return(MIG_NO_REPLY))) .RetiresOnSaturation(); receive_right.reset();
diff --git a/third_party/crashpad/crashpad/util/misc/metrics.cc b/third_party/crashpad/crashpad/util/misc/metrics.cc index d45fad6..47c9f26 100644 --- a/third_party/crashpad/crashpad/util/misc/metrics.cc +++ b/third_party/crashpad/crashpad/util/misc/metrics.cc
@@ -37,18 +37,23 @@ //! \brief Metrics values used to track the start and completion of a crash //! handling. These are used as metrics values directly, so -//! enumeration values so new values should always be added at the end. +//! enumeration values so new values should always be added at the end, +//! before kMaxValue. enum class ExceptionProcessingState { //! \brief Logged when exception processing is started. kStarted = 0, //! \brief Logged when exception processing completes. kFinished = 1, + + //! \brief An invalid value. + kMaxValue, }; void ExceptionProcessing(ExceptionProcessingState state) { - UMA_HISTOGRAM_COUNTS("Crashpad.ExceptionEncountered", - static_cast<int32_t>(state)); + UMA_HISTOGRAM_ENUMERATION("Crashpad.ExceptionEncountered", + state, + ExceptionProcessingState::kMaxValue); } } // namespace @@ -70,7 +75,7 @@ // static void Metrics::CrashUploadAttempted(bool successful) { - UMA_HISTOGRAM_COUNTS("Crashpad.CrashUpload.AttemptSuccessful", successful); + UMA_HISTOGRAM_BOOLEAN("Crashpad.CrashUpload.AttemptSuccessful", successful); } // static @@ -114,17 +119,15 @@ // static void Metrics::MissingIntermediateDumpKey( const internal::IntermediateDumpKey& key) { - UMA_HISTOGRAM_ENUMERATION("Crashpad.IntermediateDump.Reader.MissingKey", - key, - internal::IntermediateDumpKey::kMaxValue); + base::UmaHistogramSparse("Crashpad.IntermediateDump.Reader.MissingKey", + static_cast<uint16_t>(key)); } // static void Metrics::InvalidIntermediateDumpKeySize( const internal::IntermediateDumpKey& key) { - UMA_HISTOGRAM_ENUMERATION("Crashpad.IntermediateDump.Reader.InvalidKeySize", - key, - internal::IntermediateDumpKey::kMaxValue); + base::UmaHistogramSparse("Crashpad.IntermediateDump.Reader.InvalidKeySize", + static_cast<uint16_t>(key)); } #endif
diff --git a/third_party/crashpad/crashpad/util/no_cfi_icall.gyp b/third_party/crashpad/crashpad/util/no_cfi_icall.gyp deleted file mode 100644 index cfb53a7c..0000000 --- a/third_party/crashpad/crashpad/util/no_cfi_icall.gyp +++ /dev/null
@@ -1,38 +0,0 @@ -# Copyright 2020 The Crashpad Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -{ - 'includes': [ - '../build/crashpad.gypi', - ], - 'targets': [ - { - 'target_name': 'no_cfi_icall', - 'type': 'static_library', - 'dependencies': [ - '../third_party/mini_chromium/mini_chromium.gyp:base', - ], - 'include_dirs': [ - '..', - '<(INTERMEDIATE_DIR)', - ], - 'sources': [ - 'misc/no_cfi_icall.h', - ], - 'export_dependent_settings': [ - '../third_party/mini_chromium/mini_chromium.gyp:base', - ], - }, - ], -}
diff --git a/third_party/crashpad/crashpad/util/posix/signals_test.cc b/third_party/crashpad/crashpad/util/posix/signals_test.cc index 25295ff..3538cf2 100644 --- a/third_party/crashpad/crashpad/util/posix/signals_test.cc +++ b/third_party/crashpad/crashpad/util/posix/signals_test.cc
@@ -68,7 +68,6 @@ switch (sig) { case SIGABRT: { abort(); - break; } case SIGALRM: { @@ -114,7 +113,6 @@ *mapped_file.addr_as<char*>() = 0; _exit(kUnexpectedExitStatus); - break; } #if !defined(ARCH_CPU_ARM64) @@ -143,7 +141,6 @@ case SIGILL: { // __builtin_trap() causes SIGTRAP on arm64 on Android. __builtin_trap(); - break; } #endif // defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL) @@ -208,7 +205,6 @@ default: { LOG(ERROR) << "unexpected signal " << sig; _exit(kUnexpectedExitStatus); - break; } } }
diff --git a/third_party/crashpad/crashpad/util/process/process_memory_linux.cc b/third_party/crashpad/crashpad/util/process/process_memory_linux.cc index 1fc3c05..56ac0ec 100644 --- a/third_party/crashpad/crashpad/util/process/process_memory_linux.cc +++ b/third_party/crashpad/crashpad/util/process/process_memory_linux.cc
@@ -27,38 +27,37 @@ namespace crashpad { -ProcessMemoryLinux::ProcessMemoryLinux() - : ProcessMemory(), mem_fd_(), pid_(-1), initialized_() {} +ProcessMemoryLinux::ProcessMemoryLinux(PtraceConnection* connection) + : ProcessMemory(), mem_fd_() { + char path[32]; + snprintf(path, sizeof(path), "/proc/%d/mem", connection->GetProcessID()); + mem_fd_.reset(HANDLE_EINTR(open(path, O_RDONLY | O_NOCTTY | O_CLOEXEC))); + if (mem_fd_.is_valid()) { + read_up_to_ = [this](VMAddress address, size_t size, void* buffer) { + ssize_t bytes_read = + HANDLE_EINTR(pread64(mem_fd_.get(), buffer, size, address)); + if (bytes_read < 0) { + PLOG(ERROR) << "pread64"; + } + return bytes_read; + }; + return; + } + + read_up_to_ = std::bind(&PtraceConnection::ReadUpTo, + connection, + std::placeholders::_1, + std::placeholders::_2, + std::placeholders::_3); +} ProcessMemoryLinux::~ProcessMemoryLinux() {} -bool ProcessMemoryLinux::Initialize(pid_t pid) { - INITIALIZATION_STATE_SET_INITIALIZING(initialized_); - pid_ = pid; - char path[32]; - snprintf(path, sizeof(path), "/proc/%d/mem", pid_); - mem_fd_.reset(HANDLE_EINTR(open(path, O_RDONLY | O_NOCTTY | O_CLOEXEC))); - if (!mem_fd_.is_valid()) { - PLOG(ERROR) << "open"; - return false; - } - INITIALIZATION_STATE_SET_VALID(initialized_); - return true; -} - ssize_t ProcessMemoryLinux::ReadUpTo(VMAddress address, size_t size, void* buffer) const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - DCHECK(mem_fd_.is_valid()); DCHECK_LE(size, size_t{std::numeric_limits<ssize_t>::max()}); - - ssize_t bytes_read = - HANDLE_EINTR(pread64(mem_fd_.get(), buffer, size, address)); - if (bytes_read < 0) { - PLOG(ERROR) << "pread64"; - } - return bytes_read; + return read_up_to_(address, size, buffer); } } // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/process/process_memory_linux.h b/third_party/crashpad/crashpad/util/process/process_memory_linux.h index 4fe008b..1150f14 100644 --- a/third_party/crashpad/crashpad/util/process/process_memory_linux.h +++ b/third_party/crashpad/crashpad/util/process/process_memory_linux.h
@@ -17,12 +17,13 @@ #include <sys/types.h> +#include <functional> #include <string> #include "base/files/scoped_file.h" #include "base/macros.h" +#include "util/linux/ptrace_connection.h" #include "util/misc/address_types.h" -#include "util/misc/initialization_state_dcheck.h" #include "util/process/process_memory.h" namespace crashpad { @@ -30,26 +31,14 @@ //! \brief Accesses the memory of another Linux process. class ProcessMemoryLinux final : public ProcessMemory { public: - ProcessMemoryLinux(); + explicit ProcessMemoryLinux(PtraceConnection* connection); ~ProcessMemoryLinux(); - //! \brief Initializes this object to read the memory of a process whose ID - //! is \a pid. - //! - //! This method must be called successfully prior to calling any other method - //! in this class. - //! - //! \param[in] pid The process ID of a target process. - //! - //! \return `true` on success, `false` on failure with a message logged. - bool Initialize(pid_t pid); - private: ssize_t ReadUpTo(VMAddress address, size_t size, void* buffer) const override; + std::function<ssize_t(VMAddress, size_t, void*)> read_up_to_; base::ScopedFD mem_fd_; - pid_t pid_; - InitializationStateDcheck initialized_; DISALLOW_COPY_AND_ASSIGN(ProcessMemoryLinux); };
diff --git a/third_party/crashpad/crashpad/util/process/process_memory_range_test.cc b/third_party/crashpad/crashpad/util/process/process_memory_range_test.cc index a5c7afb0..2e34665 100644 --- a/third_party/crashpad/crashpad/util/process/process_memory_range_test.cc +++ b/third_party/crashpad/crashpad/util/process/process_memory_range_test.cc
@@ -23,6 +23,10 @@ #include "util/misc/from_pointer_cast.h" #include "util/process/process_memory_native.h" +#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS) +#include "test/linux/fake_ptrace_connection.h" +#endif + namespace crashpad { namespace test { namespace { @@ -39,8 +43,14 @@ constexpr bool is_64_bit = false; #endif // ARCH_CPU_64_BITS +#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS) + FakePtraceConnection connection; + ASSERT_TRUE(connection.Initialize(GetSelfProcess())); + ProcessMemoryLinux memory(&connection); +#else ProcessMemoryNative memory; ASSERT_TRUE(memory.Initialize(GetSelfProcess())); +#endif // OS_ANDROID || OS_LINUX || OS_CHROMEOS ProcessMemoryRange range; ASSERT_TRUE(range.Initialize(&memory, is_64_bit));
diff --git a/third_party/crashpad/crashpad/util/process/process_memory_sanitized_test.cc b/third_party/crashpad/crashpad/util/process/process_memory_sanitized_test.cc index 1a7f9c9..b88eab13 100644 --- a/third_party/crashpad/crashpad/util/process/process_memory_sanitized_test.cc +++ b/third_party/crashpad/crashpad/util/process/process_memory_sanitized_test.cc
@@ -19,13 +19,23 @@ #include "util/misc/from_pointer_cast.h" #include "util/process/process_memory_native.h" +#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS) +#include "test/linux/fake_ptrace_connection.h" +#endif + namespace crashpad { namespace test { namespace { TEST(ProcessMemorySanitized, DenyDisallowedMemory) { +#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS) + FakePtraceConnection connection; + ASSERT_TRUE(connection.Initialize(GetSelfProcess())); + ProcessMemoryLinux memory(&connection); +#else ProcessMemoryNative memory; ASSERT_TRUE(memory.Initialize(GetSelfProcess())); +#endif // OS_ANDROID || OS_LINUX || OS_CHROMEOS char c = 42; char out; @@ -41,8 +51,14 @@ } TEST(ProcessMemorySanitized, AllowedMemory) { +#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS) + FakePtraceConnection connection; + ASSERT_TRUE(connection.Initialize(GetSelfProcess())); + ProcessMemoryLinux memory(&connection); +#else ProcessMemoryNative memory; ASSERT_TRUE(memory.Initialize(GetSelfProcess())); +#endif // OS_ANDROID || OS_LINUX || OS_CHROMEOS char str[4] = "ABC"; char out[4];
diff --git a/third_party/crashpad/crashpad/util/process/process_memory_test.cc b/third_party/crashpad/crashpad/util/process/process_memory_test.cc index 7faa400..6857b04 100644 --- a/third_party/crashpad/crashpad/util/process/process_memory_test.cc +++ b/third_party/crashpad/crashpad/util/process/process_memory_test.cc
@@ -34,6 +34,11 @@ #include "test/mac/mach_multiprocess.h" #endif // defined(OS_APPLE) +#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS) +#include "test/linux/fake_ptrace_connection.h" +#include "util/linux/direct_ptrace_connection.h" +#endif // OS_ANDROID || OS_LINUX || OS_CHROMEOS + namespace crashpad { namespace test { namespace { @@ -148,8 +153,14 @@ } void DoTest(ProcessType process, size_t region_size, VMAddress address) { +#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS) + FakePtraceConnection connection; + ASSERT_TRUE(connection.Initialize(process)); + ProcessMemoryLinux memory(&connection); +#else ProcessMemoryNative memory; ASSERT_TRUE(memory.Initialize(process)); +#endif // OS_ANDROID || OS_LINUX || OS_CHROMEOS std::unique_ptr<char[]> result(new char[region_size]); @@ -328,8 +339,14 @@ VMAddress local_empty_address, VMAddress local_short_address, VMAddress long_string_address) { +#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS) + FakePtraceConnection connection; + ASSERT_TRUE(connection.Initialize(process)); + ProcessMemoryLinux memory(&connection); +#else ProcessMemoryNative memory; ASSERT_TRUE(memory.Initialize(process)); +#endif // OS_ANDROID || OS_LINUX || OS_CHROMEOS Compare(memory, const_empty_address, kConstCharEmpty); Compare(memory, const_short_address, kConstCharShort); @@ -399,8 +416,14 @@ } void DoTest(ProcessType process, VMAddress address) { +#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS) + DirectPtraceConnection connection; + ASSERT_TRUE(connection.Initialize(process)); + ProcessMemoryLinux memory(&connection); +#else ProcessMemoryNative memory; ASSERT_TRUE(memory.Initialize(process)); +#endif // OS_ANDROID || OS_LINUX || OS_CHROMEOS VMAddress page_addr1 = address; VMAddress page_addr2 = page_addr1 + base::GetPageSize(); @@ -525,8 +548,14 @@ void DoTest(ProcessType process, const std::vector<StringDataInChildProcess>& strings) { +#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS) + DirectPtraceConnection connection; + ASSERT_TRUE(connection.Initialize(process)); + ProcessMemoryLinux memory(&connection); +#else ProcessMemoryNative memory; ASSERT_TRUE(memory.Initialize(process)); +#endif // OS_ANDROID || OS_LINUX || OS_CHROMEOS std::string result; result.reserve(kChildProcessStringLength + 1);
diff --git a/third_party/crashpad/crashpad/util/util.gyp b/third_party/crashpad/crashpad/util/util.gyp deleted file mode 100644 index 6cd8bd9..0000000 --- a/third_party/crashpad/crashpad/util/util.gyp +++ /dev/null
@@ -1,460 +0,0 @@ -# Copyright 2014 The Crashpad Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -{ - 'includes': [ - '../build/crashpad.gypi', - ], - 'targets': [ - { - 'target_name': 'crashpad_util', - 'type': 'static_library', - 'dependencies': [ - '../compat/compat.gyp:crashpad_compat', - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../third_party/zlib/zlib.gyp:zlib', - '../third_party/lss/lss.gyp:lss', - ], - 'defines': [ 'ZLIB_CONST' ], - 'include_dirs': [ - '..', - '<(INTERMEDIATE_DIR)', - ], - 'sources': [ - 'file/delimited_file_reader.cc', - 'file/delimited_file_reader.h', - 'file/directory_reader.h', - 'file/directory_reader_posix.cc', - 'file/directory_reader_win.cc', - 'file/file_helper.cc', - 'file/file_helper.h', - 'file/file_io.cc', - 'file/file_io.h', - 'file/file_io_posix.cc', - 'file/file_io_win.cc', - 'file/file_reader.cc', - 'file/file_reader.h', - 'file/file_seeker.cc', - 'file/file_seeker.h', - 'file/filesystem.h', - 'file/filesystem_posix.cc', - 'file/filesystem_win.cc', - 'file/file_writer.cc', - 'file/file_writer.h', - 'file/output_stream_file_writer.cc', - 'file/output_stream_file_writer.h', - 'file/scoped_remove_file.cc', - 'file/scoped_remove_file.h', - 'file/string_file.cc', - 'file/string_file.h', - 'linux/address_types.h', - 'linux/auxiliary_vector.cc', - 'linux/auxiliary_vector.h', - 'linux/checked_address_range.h', - 'linux/direct_ptrace_connection.cc', - 'linux/direct_ptrace_connection.h', - 'linux/exception_handler_client.cc', - 'linux/exception_handler_client.h', - 'linux/exception_handler_protocol.cc', - 'linux/exception_handler_protocol.h', - 'linux/exception_information.h', - 'linux/initial_signal_dispositions.cc', - 'linux/initial_signal_dispositions.h', - 'linux/memory_map.cc', - 'linux/memory_map.h', - 'linux/proc_stat_reader.cc', - 'linux/proc_stat_reader.h', - 'linux/proc_task_reader.cc', - 'linux/proc_task_reader.h', - 'linux/ptrace_broker.cc', - 'linux/ptrace_broker.h', - 'linux/ptrace_client.cc', - 'linux/ptrace_client.h' - 'linux/ptrace_connection.h', - 'linux/ptracer.cc', - 'linux/ptracer.h', - 'linux/scoped_pr_set_dumpable.cc', - 'linux/scoped_pr_set_dumpable.h', - 'linux/scoped_pr_set_ptracer.cc', - 'linux/scoped_pr_set_ptracer.h', - 'linux/scoped_ptrace_attach.cc', - 'linux/scoped_ptrace_attach.h', - 'linux/socket.cc', - 'linux/socket.h', - 'linux/thread_info.cc', - 'linux/thread_info.h', - 'linux/traits.h', - 'mac/checked_mach_address_range.h', - 'mac/launchd.h', - 'mac/launchd.mm', - 'mac/mac_util.cc', - 'mac/mac_util.h', - 'mac/service_management.cc', - 'mac/service_management.h', - 'mac/sysctl.cc', - 'mac/sysctl.h', - 'mac/xattr.cc', - 'mac/xattr.h', - 'mach/child_port.defs', - 'mach/child_port_handshake.cc', - 'mach/child_port_handshake.h', - 'mach/child_port_server.cc', - 'mach/child_port_server.h', - 'mach/child_port_types.h', - 'mach/composite_mach_message_server.cc', - 'mach/composite_mach_message_server.h', - 'mach/exc_client_variants.cc', - 'mach/exc_client_variants.h', - 'mach/exc_server_variants.cc', - 'mach/exc_server_variants.h', - 'mach/exception_behaviors.cc', - 'mach/exception_behaviors.h', - 'mach/exception_ports.cc', - 'mach/exception_ports.h', - 'mach/exception_types.cc', - 'mach/exception_types.h', - 'mach/mach_extensions.cc', - 'mach/mach_extensions.h', - 'mach/mach_message.cc', - 'mach/mach_message.h', - 'mach/mach_message_server.cc', - 'mach/mach_message_server.h', - 'mach/notify_server.cc', - 'mach/notify_server.h', - 'mach/scoped_task_suspend.cc', - 'mach/scoped_task_suspend.h', - 'mach/symbolic_constants_mach.cc', - 'mach/symbolic_constants_mach.h', - 'mach/task_for_pid.cc', - 'mach/task_for_pid.h', - 'misc/address_sanitizer.h', - 'misc/address_types.h', - 'misc/arraysize.h', - 'misc/as_underlying_type.h', - 'misc/capture_context.h', - 'misc/capture_context_linux.S', - 'misc/capture_context_mac.S', - 'misc/capture_context_win.asm', - 'misc/clock.h', - 'misc/clock_mac.cc', - 'misc/clock_posix.cc', - 'misc/clock_win.cc', - 'misc/elf_note_types.h', - 'misc/from_pointer_cast.h', - 'misc/implicit_cast.h', - 'misc/initialization_state.h', - 'misc/initialization_state_dcheck.cc', - 'misc/initialization_state_dcheck.h', - 'misc/lexing.cc', - 'misc/lexing.h', - 'misc/metrics.cc', - 'misc/metrics.h', - 'misc/paths.h', - 'misc/paths_mac.cc', - 'misc/paths_linux.cc', - 'misc/paths_win.cc', - 'misc/pdb_structures.cc', - 'misc/pdb_structures.h', - 'misc/random_string.cc', - 'misc/random_string.h', - 'misc/range_set.cc', - 'misc/range_set.h', - 'misc/reinterpret_bytes.cc', - 'misc/reinterpret_bytes.h', - 'misc/scoped_forbid_return.cc', - 'misc/scoped_forbid_return.h', - 'misc/symbolic_constants_common.h', - 'misc/time.cc', - 'misc/time.h', - 'misc/time_linux.cc', - 'misc/time_win.cc', - 'misc/tri_state.h', - 'misc/uuid.cc', - 'misc/uuid.h', - 'misc/zlib.cc', - 'misc/zlib.h', - 'net/http_body.cc', - 'net/http_body.h', - 'net/http_body_gzip.cc', - 'net/http_body_gzip.h', - 'net/http_headers.h', - 'net/http_multipart_builder.cc', - 'net/http_multipart_builder.h', - 'net/http_transport.cc', - 'net/http_transport.h', - 'net/http_transport_mac.mm', - 'net/http_transport_win.cc', - 'net/url.cc', - 'net/url.h', - 'numeric/checked_address_range.cc', - 'numeric/checked_address_range.h', - 'numeric/checked_range.h', - 'numeric/checked_vm_address_range.h', - 'numeric/in_range_cast.h', - 'numeric/int128.h', - 'numeric/safe_assignment.h', - 'posix/close_multiple.cc', - 'posix/close_multiple.h', - 'posix/close_stdio.cc', - 'posix/close_stdio.h', - 'posix/drop_privileges.cc', - 'posix/drop_privileges.h', - 'posix/double_fork_and_exec.cc', - 'posix/double_fork_and_exec.h', - 'posix/process_info.h', - 'posix/process_info_linux.cc', - 'posix/process_info_mac.cc', - 'posix/scoped_dir.cc', - 'posix/scoped_dir.h', - 'posix/scoped_mmap.cc', - 'posix/scoped_mmap.h', - 'posix/signals.cc', - 'posix/signals.h', - 'posix/symbolic_constants_posix.cc', - 'posix/symbolic_constants_posix.h', - 'process/process_id.h', - 'process/process_memory.cc', - 'process/process_memory.h', - 'process/process_memory_linux.cc', - 'process/process_memory_linux.h', - 'process/process_memory_mac.cc', - 'process/process_memory_mac.h', - 'process/process_memory_native.h', - 'process/process_memory_range.cc', - 'process/process_memory_range.h', - 'stdlib/aligned_allocator.cc', - 'stdlib/aligned_allocator.h', - 'stdlib/map_insert.h', - 'stdlib/objc.h', - 'stdlib/string_number_conversion.cc', - 'stdlib/string_number_conversion.h', - 'stdlib/strlcpy.cc', - 'stdlib/strlcpy.h', - 'stdlib/strnlen.cc', - 'stdlib/strnlen.h', - 'stdlib/thread_safe_vector.h', - 'stream/base94_output_stream.cc', - 'stream/base94_output_stream.h', - 'stream/file_encoder.cc', - 'stream/file_encoder.h', - 'stream/file_output_stream.cc', - 'stream/file_output_stream.h', - 'stream/log_output_stream.cc', - 'stream/log_output_stream.h', - 'stream/output_stream_interface.h', - 'stream/zlib_output_stream.cc', - 'stream/zlib_output_stream.h', - 'string/split_string.cc', - 'string/split_string.h', - 'synchronization/semaphore_mac.cc', - 'synchronization/semaphore_posix.cc', - 'synchronization/semaphore_win.cc', - 'synchronization/semaphore.h', - 'thread/stoppable.h', - 'thread/thread.cc', - 'thread/thread.h', - 'thread/thread_log_messages.cc', - 'thread/thread_log_messages.h', - 'thread/thread_posix.cc', - 'thread/thread_win.cc', - 'thread/worker_thread.cc', - 'thread/worker_thread.h', - 'win/address_types.h', - 'win/checked_win_address_range.h', - 'win/command_line.cc', - 'win/command_line.h', - 'win/context_wrappers.h', - 'win/critical_section_with_debug_info.cc', - 'win/critical_section_with_debug_info.h', - 'win/exception_handler_server.cc', - 'win/exception_handler_server.h', - 'win/get_function.cc', - 'win/get_function.h', - 'win/get_module_information.cc', - 'win/get_module_information.h', - 'win/handle.cc', - 'win/handle.h', - 'win/initial_client_data.cc', - 'win/initial_client_data.h', - 'win/module_version.cc', - 'win/module_version.h', - 'win/nt_internals.cc', - 'win/nt_internals.h', - 'win/ntstatus_logging.cc', - 'win/ntstatus_logging.h', - 'win/process_info.cc', - 'win/process_info.h', - 'win/process_structs.h', - 'win/registration_protocol_win.cc', - 'win/registration_protocol_win.h', - 'win/safe_terminate_process.asm', - 'win/safe_terminate_process.h', - 'win/scoped_handle.cc', - 'win/scoped_handle.h', - 'win/scoped_local_alloc.cc', - 'win/scoped_local_alloc.h', - 'win/scoped_process_suspend.cc', - 'win/scoped_process_suspend.h', - 'win/scoped_set_event.cc', - 'win/scoped_set_event.h', - 'win/session_end_watcher.cc', - 'win/session_end_watcher.h', - 'win/termination_codes.h', - 'win/xp_compat.h', - ], - 'conditions': [ - ['OS=="mac"', { - 'conditions': [ - ['GENERATOR=="ninja"', { - # ninja’s rules can’t deal with sources that have paths relative - # to environment variables like SDKROOT. Copy the .defs files out - # of SDKROOT and into a place they can be referenced without any - # environment variables. - 'copies': [ - { - 'destination': '<(INTERMEDIATE_DIR)/util/mach', - 'files': [ - '$(SDKROOT)/usr/include/mach/exc.defs', - '$(SDKROOT)/usr/include/mach/mach_exc.defs', - '$(SDKROOT)/usr/include/mach/notify.defs', - ], - }, - ], - 'sources': [ - '<(INTERMEDIATE_DIR)/util/mach/exc.defs', - '<(INTERMEDIATE_DIR)/util/mach/mach_exc.defs', - '<(INTERMEDIATE_DIR)/util/mach/notify.defs', - ], - }, { # else: GENERATOR!="ninja" - # The Xcode generator does copies after rules, so the above trick - # won’t work, but its rules tolerate sources with SDKROOT-relative - # paths. - 'sources': [ - '$(SDKROOT)/usr/include/mach/exc.defs', - '$(SDKROOT)/usr/include/mach/mach_exc.defs', - '$(SDKROOT)/usr/include/mach/notify.defs', - ], - }], - ], - 'rules': [ - { - 'rule_name': 'mig', - 'extension': 'defs', - 'inputs': [ - 'mach/mig.py', - ], - 'outputs': [ - '<(INTERMEDIATE_DIR)/util/mach/<(RULE_INPUT_ROOT)User.c', - '<(INTERMEDIATE_DIR)/util/mach/<(RULE_INPUT_ROOT)Server.c', - '<(INTERMEDIATE_DIR)/util/mach/<(RULE_INPUT_ROOT).h', - '<(INTERMEDIATE_DIR)/util/mach/<(RULE_INPUT_ROOT)Server.h', - ], - 'action': [ - 'python', - '<@(_inputs)', - '<(RULE_INPUT_PATH)', - '<@(_outputs)', - '--include=../compat/mac' - ], - 'process_outputs_as_sources': 1, - }, - ], - 'link_settings': { - 'libraries': [ - '$(SDKROOT)/System/Library/Frameworks/CoreFoundation.framework', - '$(SDKROOT)/System/Library/Frameworks/Foundation.framework', - '$(SDKROOT)/System/Library/Frameworks/IOKit.framework', - '$(SDKROOT)/usr/lib/libbsm.dylib', - ], - }, - }, { # else: OS!=mac - 'sources!': [ 'misc/capture_context_mac.S' ], - }], - ['OS=="win"', { - 'link_settings': { - 'libraries': [ - '-luser32.lib', - '-lversion.lib', - '-lwinhttp.lib', - ], - }, - 'msvs_disabled_warnings': [ - 4201, # nonstandard extension used : nameless struct/union. - 4577, # 'noexcept' used with no exception handling mode specified - ], - 'direct_dependent_settings': { - 'msvs_disabled_warnings': [ - 4577, # 'noexcept' used with no exception handling mode specified - ], - }, - 'conditions': [ - ['target_arch=="ia32"', { - 'msvs_settings': { - 'MASM': { - 'UseSafeExceptionHandlers': 'true', - }, - }, - }], - ], - }, { # else: OS!="win" - 'sources!': [ - 'misc/capture_context_win.asm', - 'win/safe_terminate_process.asm', - ], - }], - ['OS=="android"', { - 'link_settings': { - 'libraries': [ - '-llog', - ], - }, - }], - ['OS=="linux" or OS=="android"', { - 'sources': [ - 'net/http_transport_socket.cc', - 'process/process_memory_sanitized.cc', - 'process/process_memory_sanitized.h', - ], - }, { # else: OS!="linux" - 'sources!': [ - 'misc/capture_context_linux.S', - ], - }], - ['OS!="linux" and OS!="android"', { - 'sources/': [ - ['exclude', '^process/'], - ], - }], - ], - 'target_conditions': [ - ['OS=="android"', { - 'sources/': [ - ['include', '^linux/'], - ['include', '^misc/capture_context_linux\\.S$'], - ['include', '^misc/paths_linux\\.cc$'], - ['include', '^misc/time_linux\\.cc$'], - ['include', '^posix/process_info_linux\\.cc$'], - ['include', '^process/process_memory_linux\\.cc$'], - ['include', '^process/process_memory_linux\\.h$'], - ], - }, { # else: OS!="android" - 'sources!': [ - 'stream/log_output_stream.cc', - 'stream/log_output_stream.h', - ] - }], - ], - }, - ], -}
diff --git a/third_party/crashpad/crashpad/util/util_test.gyp b/third_party/crashpad/crashpad/util/util_test.gyp deleted file mode 100644 index 339bb4a..0000000 --- a/third_party/crashpad/crashpad/util/util_test.gyp +++ /dev/null
@@ -1,238 +0,0 @@ -# Copyright 2014 The Crashpad Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -{ - 'includes': [ - '../build/crashpad.gypi', - ], - 'targets': [ - { - 'target_name': 'crashpad_util_test', - 'type': 'executable', - 'dependencies': [ - 'no_cfi_icall.gyp:no_cfi_icall', - 'util.gyp:crashpad_util', - '../client/client.gyp:crashpad_client', - '../compat/compat.gyp:crashpad_compat', - '../test/test.gyp:crashpad_googlemock_main', - '../test/test.gyp:crashpad_test', - '../third_party/googletest/googlemock.gyp:googlemock', - '../third_party/googletest/googletest.gyp:googletest', - '../third_party/lss/lss.gyp:lss', - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../third_party/zlib/zlib.gyp:zlib', - ], - 'include_dirs': [ - '..', - ], - 'sources': [ - 'file/delimited_file_reader_test.cc', - 'file/directory_reader_test.cc', - 'file/file_io_test.cc', - 'file/file_reader_test.cc', - 'file/filesystem_test.cc', - 'file/string_file_test.cc', - 'linux/auxiliary_vector_test.cc', - 'linux/memory_map_test.cc', - 'linux/proc_stat_reader_test.cc', - 'linux/proc_task_reader_test.cc', - 'linux/ptrace_broker_test.cc', - 'linux/ptracer_test.cc', - 'linux/scoped_ptrace_attach_test.cc', - 'linux/socket_test.cc', - 'mac/launchd_test.mm', - 'mac/mac_util_test.mm', - 'mac/service_management_test.mm', - 'mac/sysctl_test.cc', - 'mac/xattr_test.cc', - 'mach/child_port_handshake_test.cc', - 'mach/child_port_server_test.cc', - 'mach/composite_mach_message_server_test.cc', - 'mach/exc_client_variants_test.cc', - 'mach/exc_server_variants_test.cc', - 'mach/exception_behaviors_test.cc', - 'mach/exception_ports_test.cc', - 'mach/exception_types_test.cc', - 'mach/mach_extensions_test.cc', - 'mach/mach_message_server_test.cc', - 'mach/mach_message_test.cc', - 'mach/notify_server_test.cc', - 'mach/scoped_task_suspend_test.cc', - 'mach/symbolic_constants_mach_test.cc', - 'misc/arraysize_test.cc', - 'misc/capture_context_test.cc', - 'misc/capture_context_test_util.h', - 'misc/capture_context_test_util_linux.cc', - 'misc/capture_context_test_util_mac.cc', - 'misc/capture_context_test_util_win.cc', - 'misc/clock_test.cc', - 'misc/from_pointer_cast_test.cc', - 'misc/initialization_state_dcheck_test.cc', - 'misc/initialization_state_test.cc', - 'misc/no_cfi_icall_test.cc', - 'misc/paths_test.cc', - 'misc/scoped_forbid_return_test.cc', - 'misc/random_string_test.cc', - 'misc/range_set_test.cc', - 'misc/reinterpret_bytes_test.cc', - 'misc/time_test.cc', - 'misc/uuid_test.cc', - 'net/http_body_gzip_test.cc', - 'net/http_body_test.cc', - 'net/http_body_test_util.cc', - 'net/http_body_test_util.h', - 'net/http_multipart_builder_test.cc', - 'net/http_transport_test.cc', - 'net/url_test.cc', - 'numeric/checked_address_range_test.cc', - 'numeric/checked_range_test.cc', - 'numeric/in_range_cast_test.cc', - 'numeric/int128_test.cc', - 'posix/process_info_test.cc', - 'posix/scoped_mmap_test.cc', - 'posix/signals_test.cc', - 'posix/symbolic_constants_posix_test.cc', - 'process/process_memory_mac_test.cc', - 'process/process_memory_range_test.cc', - 'process/process_memory_test.cc', - 'stdlib/aligned_allocator_test.cc', - 'stdlib/map_insert_test.cc', - 'stdlib/string_number_conversion_test.cc', - 'stdlib/strlcpy_test.cc', - 'stdlib/strnlen_test.cc', - 'stdlib/thread_safe_vector_test.cc', - 'string/split_string_test.cc', - 'synchronization/semaphore_test.cc', - 'thread/thread_log_messages_test.cc', - 'thread/thread_test.cc', - 'thread/worker_thread_test.cc', - 'win/command_line_test.cc', - 'win/critical_section_with_debug_info_test.cc', - 'win/exception_handler_server_test.cc', - 'win/get_function_test.cc', - 'win/handle_test.cc', - 'win/initial_client_data_test.cc', - 'win/process_info_test.cc', - 'win/registration_protocol_win_test.cc', - 'win/safe_terminate_process_test.cc', - 'win/scoped_process_suspend_test.cc', - 'win/session_end_watcher_test.cc', - ], - 'conditions': [ - ['OS=="mac"', { - 'link_settings': { - 'libraries': [ - '$(SDKROOT)/System/Library/Frameworks/Foundation.framework', - ], - }, - }], - ['OS=="win"', { - 'dependencies': [ - 'crashpad_util_test_process_info_test_child', - 'crashpad_util_test_safe_terminate_process_test_child', - ], - 'link_settings': { - 'libraries': [ - '-ladvapi32.lib', - '-limagehlp.lib', - '-lrpcrt4.lib', - '-luser32.lib', - ], - }, - }], - ['OS=="android"', { - # Things not yet ported to Android - 'sources/' : [ - ['exclude', '^net/http_transport_test\\.cc$'], - ] - }], - ['OS=="linux" or OS=="android"', { - 'sources': [ - 'process/process_memory_sanitized_test.cc', - ], - }], - ['OS!="linux" and OS!="android"', { - 'sources/': [ - ['exclude', '^process/'], - ], - }], - ], - 'target_conditions': [ - ['OS=="android"', { - 'sources/': [ - ['include', '^linux/'], - ['include', '^misc/capture_context_test_util_linux\\.cc$'], - ], - }], - ], - }, - ], - 'conditions': [ - ['OS!="android"', { - 'targets': [ - { - 'target_name': 'http_transport_test_server', - 'type': 'executable', - 'dependencies': [ - '../third_party/mini_chromium/mini_chromium.gyp:base', - '../third_party/zlib/zlib.gyp:zlib', - '../tools/tools.gyp:crashpad_tool_support', - '../util/util.gyp:crashpad_util', - ], - 'sources': [ - 'net/http_transport_test_server.cc', - ], - 'include_dirs': [ - '..', - ], - 'xcode_settings': { - 'WARNING_CFLAGS!': [ - '-Wexit-time-destructors', - ], - }, - 'cflags!': [ - '-Wexit-time-destructors', - ], - 'conditions': [ - ['OS=="win"', { - 'link_settings': { - 'libraries': [ - '-lws2_32.lib', - ], - }, - }], - ], - }, - ], - }], - ['OS=="win"', { - 'targets': [ - { - 'target_name': 'crashpad_util_test_process_info_test_child', - 'type': 'executable', - 'sources': [ - 'win/process_info_test_child.cc', - ], - }, - { - 'target_name': 'crashpad_util_test_safe_terminate_process_test_child', - 'type': 'executable', - 'sources': [ - 'win/safe_terminate_process_test_child.cc', - ], - }, - ] - }], - ], -}
diff --git a/third_party/d3/OWNERS b/third_party/d3/OWNERS index 98e270d..88602c213 100644 --- a/third_party/d3/OWNERS +++ b/third_party/d3/OWNERS
@@ -1,3 +1,3 @@ siggi@chromium.org chrisha@chromium.org -joonbug@chromium.org +zentaro@chromium.org
diff --git a/third_party/google_android_play_core/BUILD.gn b/third_party/google_android_play_core/BUILD.gn deleted file mode 100644 index d0530159..0000000 --- a/third_party/google_android_play_core/BUILD.gn +++ /dev/null
@@ -1,10 +0,0 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("//build/config/android/rules.gni") - -android_aar_prebuilt("com_google_android_play_core_java") { - aar_path = "core-1.6.4.aar" - info_path = "com_google_android_play_core.info" -}
diff --git a/third_party/google_android_play_core/DIR_METADATA b/third_party/google_android_play_core/DIR_METADATA deleted file mode 100644 index e9e1b20c..0000000 --- a/third_party/google_android_play_core/DIR_METADATA +++ /dev/null
@@ -1,4 +0,0 @@ -monorail: { - component: "Mobile>FeatureModules" -} -team_email: "chromium-reviews@chromium.org"
diff --git a/third_party/google_android_play_core/LICENSE b/third_party/google_android_play_core/LICENSE deleted file mode 100644 index bee4082..0000000 --- a/third_party/google_android_play_core/LICENSE +++ /dev/null
@@ -1,147 +0,0 @@ -Terms and conditions - -This is the Android Software Development Kit License Agreement - -1. Introduction - -1.1 The Android Software Development Kit (referred to in the License Agreement as the "SDK" and specifically including the Android system files, packaged APIs, and Google APIs add-ons) is licensed to you subject to the terms of the License Agreement. The License Agreement forms a legally binding contract between you and Google in relation to your use of the SDK. - -1.2 "Android" means the Android software stack for devices, as made available under the Android Open Source Project, which is located at the following URL: http://source.android.com/, as updated from time to time. - -1.3 A "compatible implementation" means any Android device that (i) complies with the Android Compatibility Definition document, which can be found at the Android compatibility website (http://source.android.com/compatibility) and which may be updated from time to time; and (ii) successfully passes the Android Compatibility Test Suite (CTS). - -1.4 "Google" means Google LLC, a Delaware corporation with principal place of business at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States. - - -2. Accepting this License Agreement - -2.1 In order to use the SDK, you must first agree to the License Agreement. You may not use the SDK if you do not accept the License Agreement. - -2.2 By clicking to accept, you hereby agree to the terms of the License Agreement. - -2.3 You may not use the SDK and may not accept the License Agreement if you are a person barred from receiving the SDK under the laws of the United States or other countries, including the country in which you are resident or from which you use the SDK. - -2.4 If you are agreeing to be bound by the License Agreement on behalf of your employer or other entity, you represent and warrant that you have full legal authority to bind your employer or such entity to the License Agreement. If you do not have the requisite authority, you may not accept the License Agreement or use the SDK on behalf of your employer or other entity. - - -3. SDK License from Google - -3.1 Subject to the terms of the License Agreement, Google grants you a limited, worldwide, royalty-free, non-assignable, non-exclusive, and non-sublicensable license to use the SDK solely to develop applications for compatible implementations of Android. - -3.2 You may not use this SDK to develop applications for other platforms (including non-compatible implementations of Android) or to develop another SDK. You are of course free to develop applications for other platforms, including non-compatible implementations of Android, provided that this SDK is not used for that purpose. - -3.3 You agree that Google or third parties own all legal right, title and interest in and to the SDK, including any Intellectual Property Rights that subsist in the SDK. "Intellectual Property Rights" means any and all rights under patent law, copyright law, trade secret law, trademark law, and any and all other proprietary rights. Google reserves all rights not expressly granted to you. - -3.4 You may not use the SDK for any purpose not expressly permitted by the License Agreement. Except to the extent required by applicable third party licenses, you may not copy (except for backup purposes), modify, adapt, redistribute, decompile, reverse engineer, disassemble, or create derivative works of the SDK or any part of the SDK. - -3.5 Use, reproduction and distribution of components of the SDK licensed under an open source software license are governed solely by the terms of that open source software license and not the License Agreement. - -3.6 You agree that the form and nature of the SDK that Google provides may change without prior notice to you and that future versions of the SDK may be incompatible with applications developed on previous versions of the SDK. You agree that Google may stop (permanently or temporarily) providing the SDK (or any features within the SDK) to you or to users generally at Google's sole discretion, without prior notice to you. - -3.7 Nothing in the License Agreement gives you a right to use any of Google's trade names, trademarks, service marks, logos, domain names, or other distinctive brand features. - -3.8 You agree that you will not remove, obscure, or alter any proprietary rights notices (including copyright and trademark notices) that may be affixed to or contained within the SDK. - - -4. Use of the SDK by You - -4.1 Google agrees that it obtains no right, title or interest from you (or your licensors) under the License Agreement in or to any software applications that you develop using the SDK, including any intellectual property rights that subsist in those applications. - -4.2 You agree to use the SDK and write applications only for purposes that are permitted by (a) the License Agreement and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding the export of data or software to and from the United States or other relevant countries). - -4.3 You agree that if you use the SDK to develop applications for general public users, you will protect the privacy and legal rights of those users. If the users provide you with user names, passwords, or other login information or personal information, you must make the users aware that the information will be available to your application, and you must provide legally adequate privacy notice and protection for those users. If your application stores personal or sensitive information provided by users, it must do so securely. If the user provides your application with Google Account information, your application may only use that information to access the user's Google Account when, and for the limited purposes for which, the user has given you permission to do so. - -4.4 You agree that you will not engage in any activity with the SDK, including the development or distribution of an application, that interferes with, disrupts, damages, or accesses in an unauthorized manner the servers, networks, or other properties or services of any third party including, but not limited to, Google or any mobile communications carrier. - -4.5 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any data, content, or resources that you create, transmit or display through Android and/or applications for Android, and for the consequences of your actions (including any loss or damage which Google may suffer) by doing so. - -4.6 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any breach of your obligations under the License Agreement, any applicable third party contract or Terms of Service, or any applicable law or regulation, and for the consequences (including any loss or damage which Google or any third party may suffer) of any such breach. - - -5. Your Developer Credentials - -5.1 You agree that you are responsible for maintaining the confidentiality of any developer credentials that may be issued to you by Google or which you may choose yourself and that you will be solely responsible for all applications that are developed under your developer credentials. - - -6. Privacy and Information - -6.1 In order to continually innovate and improve the SDK, Google may collect certain usage statistics from the software including but not limited to a unique identifier, associated IP address, version number of the software, and information on which tools and/or services in the SDK are being used and how they are being used. Before any of this information is collected, the SDK will notify you and seek your consent. If you withhold consent, the information will not be collected. - -6.2 The data collected is examined in the aggregate to improve the SDK and is maintained in accordance with Google's Privacy Policy. - - -7. Third Party Applications - -7.1 If you use the SDK to run applications developed by a third party or that access data, content or resources provided by a third party, you agree that Google is not responsible for those applications, data, content, or resources. You understand that all data, content or resources which you may access through such third party applications are the sole responsibility of the person from which they originated and that Google is not liable for any loss or damage that you may experience as a result of the use or access of any of those third party applications, data, content, or resources. - -7.2 You should be aware the data, content, and resources presented to you through such a third party application may be protected by intellectual property rights which are owned by the providers (or by other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute or create derivative works based on these data, content, or resources (either in whole or in part) unless you have been specifically given permission to do so by the relevant owners. - -7.3 You acknowledge that your use of such third party applications, data, content, or resources may be subject to separate terms between you and the relevant third party. In that case, the License Agreement does not affect your legal relationship with these third parties. - - -8. Using Android APIs - -8.1 Google Data APIs - -8.1.1 If you use any API to retrieve data from Google, you acknowledge that the data may be protected by intellectual property rights which are owned by Google or those parties that provide the data (or by other persons or companies on their behalf). Your use of any such API may be subject to additional Terms of Service. You may not modify, rent, lease, loan, sell, distribute or create derivative works based on this data (either in whole or in part) unless allowed by the relevant Terms of Service. - -8.1.2 If you use any API to retrieve a user's data from Google, you acknowledge and agree that you shall retrieve data only with the user's explicit consent and only when, and for the limited purposes for which, the user has given you permission to do so. - - -9. Terminating this License Agreement - -9.1 The License Agreement will continue to apply until terminated by either you or Google as set out below. - -9.2 If you want to terminate the License Agreement, you may do so by ceasing your use of the SDK and any relevant developer credentials. - -9.3 Google may at any time, terminate the License Agreement with you if: -(A) you have breached any provision of the License Agreement; or -(B) Google is required to do so by law; or -(C) the partner with whom Google offered certain parts of SDK (such as APIs) to you has terminated its relationship with Google or ceased to offer certain parts of the SDK to you; or -(D) Google decides to no longer provide the SDK or certain parts of the SDK to users in the country in which you are resident or from which you use the service, or the provision of the SDK or certain SDK services to you by Google is, in Google's sole discretion, no longer commercially viable. - -9.4 When the License Agreement comes to an end, all of the legal rights, obligations and liabilities that you and Google have benefited from, been subject to (or which have accrued over time whilst the License Agreement has been in force) or which are expressed to continue indefinitely, shall be unaffected by this cessation, and the provisions of paragraph 14.7 shall continue to apply to such rights, obligations and liabilities indefinitely. - - -10. DISCLAIMER OF WARRANTIES - -10.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SDK IS AT YOUR SOLE RISK AND THAT THE SDK IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY KIND FROM GOOGLE. - -10.2 YOUR USE OF THE SDK AND ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE SDK IS AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. - -10.3 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. - - -11. LIMITATION OF LIABILITY - -11.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES THAT MAY BE INCURRED BY YOU, INCLUDING ANY LOSS OF DATA, WHETHER OR NOT GOOGLE OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING. - - -12. Indemnification - -12.1 To the maximum extent permitted by law, you agree to defend, indemnify and hold harmless Google, its affiliates and their respective directors, officers, employees and agents from and against any and all claims, actions, suits or proceedings, as well as any and all losses, liabilities, damages, costs and expenses (including reasonable attorneys fees) arising out of or accruing from (a) your use of the SDK, (b) any application you develop on the SDK that infringes any copyright, trademark, trade secret, trade dress, patent or other intellectual property right of any person or defames any person or violates their rights of publicity or privacy, and (c) any non-compliance by you with the License Agreement. - - -13. Changes to the License Agreement - -13.1 Google may make changes to the License Agreement as it distributes new versions of the SDK. When these changes are made, Google will make a new version of the License Agreement available on the website where the SDK is made available. - - -14. General Legal Terms - -14.1 The License Agreement constitutes the whole legal agreement between you and Google and governs your use of the SDK (excluding any services which Google may provide to you under a separate written agreement), and completely replaces any prior agreements between you and Google in relation to the SDK. - -14.2 You agree that if Google does not exercise or enforce any legal right or remedy which is contained in the License Agreement (or which Google has the benefit of under any applicable law), this will not be taken to be a formal waiver of Google's rights and that those rights or remedies will still be available to Google. - -14.3 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of the License Agreement is invalid, then that provision will be removed from the License Agreement without affecting the rest of the License Agreement. The remaining provisions of the License Agreement will continue to be valid and enforceable. - -14.4 You acknowledge and agree that each member of the group of companies of which Google is the parent shall be third party beneficiaries to the License Agreement and that such other companies shall be entitled to directly enforce, and rely upon, any provision of the License Agreement that confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall be third party beneficiaries to the License Agreement. - -14.5 EXPORT RESTRICTIONS. THE SDK IS SUBJECT TO UNITED STATES EXPORT LAWS AND REGULATIONS. YOU MUST COMPLY WITH ALL DOMESTIC AND INTERNATIONAL EXPORT LAWS AND REGULATIONS THAT APPLY TO THE SDK. THESE LAWS INCLUDE RESTRICTIONS ON DESTINATIONS, END USERS AND END USE. - -14.6 The rights granted in the License Agreement may not be assigned or transferred by either you or Google without the prior written approval of the other party. Neither you nor Google shall be permitted to delegate their responsibilities or obligations under the License Agreement without the prior written approval of the other party. - -14.7 The License Agreement, and your relationship with Google under the License Agreement, shall be governed by the laws of the State of California without regard to its conflict of laws provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located within the county of Santa Clara, California to resolve any legal matter arising from the License Agreement. Notwithstanding this, you agree that Google shall still be allowed to apply for injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction. - - -December 9, 2016
diff --git a/third_party/google_android_play_core/OWNERS b/third_party/google_android_play_core/OWNERS deleted file mode 100644 index c21bfeb..0000000 --- a/third_party/google_android_play_core/OWNERS +++ /dev/null
@@ -1,3 +0,0 @@ -agrieve@chromium.org -tiborg@chromium.org -wnwen@chromium.org
diff --git a/third_party/google_android_play_core/README.chromium b/third_party/google_android_play_core/README.chromium deleted file mode 100644 index 9bb6f80..0000000 --- a/third_party/google_android_play_core/README.chromium +++ /dev/null
@@ -1,17 +0,0 @@ -Name: Play Core Library -Short Name: Play Core -URL: https://developer.android.com/guide/app-bundle/playcore -Version: 1.6.4 -License: Android Software Development Kit License -License File: LICENSE -Security Critical: yes - -Description: -- Built from @272011728. - -Local Modifications: -- Patched with @303759131 and a local fix (cl/303790354). -- Ran: - g4 patch -c 303759131 - g4 patch -c 303790354 -- Built using commands from: https://crbug.com/996212#c6
diff --git a/third_party/google_android_play_core/cipd.yaml b/third_party/google_android_play_core/cipd.yaml deleted file mode 100644 index 4fe4c5a..0000000 --- a/third_party/google_android_play_core/cipd.yaml +++ /dev/null
@@ -1,10 +0,0 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# To create CIPD package run the following command. -# cipd create --pkg-def cipd.yaml -package: chromium/third_party/android_deps/libs/com_google_android_play_core_verification -description: "" -data: -- file: core-1.6.4.aar
diff --git a/third_party/google_android_play_core/com_google_android_play_core.info b/third_party/google_android_play_core/com_google_android_play_core.info deleted file mode 100644 index 2b5ee42..0000000 --- a/third_party/google_android_play_core/com_google_android_play_core.info +++ /dev/null
@@ -1,16 +0,0 @@ -# Generated by //build/android/gyp/aar.py -# To regenerate, use "update_android_aar_prebuilts = true" and run "gn gen". - -aidl = [] -assets = [] -has_classes_jar = true -has_native_libraries = false -has_proguard_flags = false -has_r_text_file = false -is_manifest_empty = false -manifest_package = "com.google.android.play.core.client" -resources = [ - "res/values/styles.xml" -] -subjar_tuples = [] -subjars = []
diff --git a/third_party/subresource-filter-ruleset/README.chromium b/third_party/subresource-filter-ruleset/README.chromium index 9844e5f..2edd975 100644 --- a/third_party/subresource-filter-ruleset/README.chromium +++ b/third_party/subresource-filter-ruleset/README.chromium
@@ -1,6 +1,6 @@ Name: EasyList URL: https://easylist.to/easylist/easylist.txt -Version: 202106071325 +Version: 202107210007 License: Creative Commons Attribution-ShareAlike 3.0 Unported License Android Compatible: yes License File: LICENSE
diff --git a/third_party/subresource-filter-ruleset/data/UnindexedRules.sha1 b/third_party/subresource-filter-ruleset/data/UnindexedRules.sha1 index 4f83b14..c0da7a7 100644 --- a/third_party/subresource-filter-ruleset/data/UnindexedRules.sha1 +++ b/third_party/subresource-filter-ruleset/data/UnindexedRules.sha1
@@ -1 +1 @@ -d8fcb95cf0b94e3de99f92042175b682b99b7748 \ No newline at end of file +79173d1638d4dc5c70beebac3611923a7a0395ba \ No newline at end of file
diff --git a/third_party/subresource-filter-ruleset/manifest.json b/third_party/subresource-filter-ruleset/manifest.json index c4aad41..777e657 100644 --- a/third_party/subresource-filter-ruleset/manifest.json +++ b/third_party/subresource-filter-ruleset/manifest.json
@@ -2,5 +2,5 @@ "manifest_version": 2, "name": "Subresource Filtering Rules", "ruleset_format": 1, - "version": "9.28.0" + "version": "9.29.4" }
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index 2a346aa0..89eda06 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -1537,6 +1537,7 @@ 'android_release_trybot_x64_fastbuild_webview_google': [ 'android', 'release_trybot', 'strip_debug_info', 'x64', 'android_fastbuild', 'webview_google', + 'no_secondary_abi', ], 'android_release_trybot_x86_fastbuild_resource_allowlisting_webview_google': [
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.android.json b/tools/mb/mb_config_expectations/tryserver.chromium.android.json index b725650..4c2143e 100644 --- a/tools/mb/mb_config_expectations/tryserver.chromium.android.json +++ b/tools/mb/mb_config_expectations/tryserver.chromium.android.json
@@ -44,6 +44,7 @@ "is_component_build": false, "is_debug": false, "proprietary_codecs": true, + "skip_secondary_abi_for_cq": true, "strip_debug_info": true, "symbol_level": 1, "system_webview_package_name": "com.google.android.webview",
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index 9aedab5f..3e807c11 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -23754,8 +23754,7 @@ <action name="Signin_Impression_FromManageCardsBubble" not_user_triggered="true"> - <owner>manasverma@google.com</owner> - <owner>jsaul@chromium.org</owner> + <owner>jsaul@google.com</owner> <owner>battre@chromium.org</owner> <description> Recorded when showing sign in entry in the manage cards bubble. @@ -23804,8 +23803,7 @@ </action> <action name="Signin_Impression_FromSaveCardBubble" not_user_triggered="true"> - <owner>manasverma@google.com</owner> - <owner>jsaul@chromium.org</owner> + <owner>jsaul@google.com</owner> <owner>battre@chromium.org</owner> <description> Recorded when showing sign in entry in the save card bubble. @@ -23892,8 +23890,7 @@ <action name="Signin_ImpressionWithAccount_FromManageCardsBubble" not_user_triggered="true"> - <owner>manasverma@google.com</owner> - <owner>jsaul@chromium.org</owner> + <owner>jsaul@google.com</owner> <owner>battre@chromium.org</owner> <description> Recorded when the personalized sign-in promo is shown with an account in the @@ -23933,8 +23930,7 @@ <action name="Signin_ImpressionWithAccount_FromSaveCardBubble" not_user_triggered="true"> - <owner>manasverma@google.com</owner> - <owner>jsaul@chromium.org</owner> + <owner>jsaul@google.com</owner> <owner>battre@chromium.org</owner> <description> Recorded when the personalized sign-in promo is shown with an account in the @@ -24003,8 +23999,7 @@ <action name="Signin_ImpressionWithNoAccount_FromManageCardsBubble" not_user_triggered="true"> - <owner>manasverma@google.com</owner> - <owner>jsaul@chromium.org</owner> + <owner>jsaul@google.com</owner> <owner>battre@chromium.org</owner> <description> Recorded when the personalized sign-in promo is shown with no account in the @@ -24045,8 +24040,7 @@ <action name="Signin_ImpressionWithNoAccount_FromSaveCardBubble" not_user_triggered="true"> - <owner>manasverma@google.com</owner> - <owner>jsaul@chromium.org</owner> + <owner>jsaul@google.com</owner> <owner>battre@chromium.org</owner> <description> Recorded when the personalized sign-in promo is shown with no account in the @@ -24281,8 +24275,7 @@ </action> <action name="Signin_Signin_FromManageCardsBubble"> - <owner>manasverma@google.com</owner> - <owner>jsaul@chromium.org</owner> + <owner>jsaul@google.com</owner> <owner>battre@chromium.org</owner> <description> Recorded on sign in start from access point @@ -24339,8 +24332,7 @@ </action> <action name="Signin_Signin_FromSaveCardBubble"> - <owner>manasverma@google.com</owner> - <owner>jsaul@chromium.org</owner> + <owner>jsaul@google.com</owner> <owner>battre@chromium.org</owner> <description> Recorded on sign in start from access point @@ -24532,8 +24524,7 @@ <action name="Signin_SigninNewAccount_FromSaveCardBubble"> <obsolete>Deprecated 08/2018</obsolete> <owner>bsazonov@chromium.org</owner> - <owner>jsaul@chromium.org</owner> - <owner>manasverma@google.com</owner> + <owner>jsaul@google.com</owner> <owner>msarda@chromium.org</owner> <owner>sebsg@chromium.org</owner> <description> @@ -24609,8 +24600,7 @@ <action name="Signin_SigninNewAccountExistingAccount_FromManageCardsBubble"> <owner>bsazonov@chromium.org</owner> - <owner>jsaul@chromium.org</owner> - <owner>manasverma@google.com</owner> + <owner>jsaul@google.com</owner> <owner>msarda@chromium.org</owner> <owner>battre@chromium.org</owner> <description> @@ -24653,8 +24643,7 @@ <action name="Signin_SigninNewAccountExistingAccount_FromSaveCardBubble"> <owner>bsazonov@chromium.org</owner> - <owner>jsaul@chromium.org</owner> - <owner>manasverma@google.com</owner> + <owner>jsaul@google.com</owner> <owner>msarda@chromium.org</owner> <owner>battre@chromium.org</owner> <description> @@ -24730,8 +24719,7 @@ <action name="Signin_SigninNewAccountNoExistingAccount_FromManageCardsBubble"> <owner>bsazonov@chromium.org</owner> - <owner>jsaul@chromium.org</owner> - <owner>manasverma@google.com</owner> + <owner>jsaul@google.com</owner> <owner>msarda@chromium.org</owner> <owner>battre@chromium.org</owner> <description> @@ -24776,8 +24764,7 @@ <action name="Signin_SigninNewAccountNoExistingAccount_FromSaveCardBubble"> <owner>bsazonov@chromium.org</owner> - <owner>jsaul@chromium.org</owner> - <owner>manasverma@google.com</owner> + <owner>jsaul@google.com</owner> <owner>msarda@chromium.org</owner> <owner>battre@chromium.org</owner> <description> @@ -24858,8 +24845,7 @@ <action name="Signin_SigninNewAccountPreDice_FromManageCardsBubble"> <obsolete>Removed M80</obsolete> <owner>bsazonov@chromium.org</owner> - <owner>jsaul@chromium.org</owner> - <owner>manasverma@google.com</owner> + <owner>jsaul@google.com</owner> <owner>msarda@chromium.org</owner> <owner>sebsg@chromium.org</owner> <description> @@ -24906,8 +24892,7 @@ <action name="Signin_SigninNewAccountPreDice_FromSaveCardBubble"> <obsolete>Removed M80</obsolete> <owner>bsazonov@chromium.org</owner> - <owner>jsaul@chromium.org</owner> - <owner>manasverma@google.com</owner> + <owner>jsaul@google.com</owner> <owner>msarda@chromium.org</owner> <owner>sebsg@chromium.org</owner> <description> @@ -24983,8 +24968,7 @@ </action> <action name="Signin_SigninNotDefault_FromManageCardsBubble"> - <owner>manasverma@google.com</owner> - <owner>jsaul@chromium.org</owner> + <owner>jsaul@google.com</owner> <owner>battre@chromium.org</owner> <description> Recorded on sign in start from access point @@ -25026,8 +25010,7 @@ <action name="Signin_SigninNotDefault_FromSaveCardBubble"> <owner>bsazonov@chromium.org</owner> - <owner>jsaul@chromium.org</owner> - <owner>manasverma@google.com</owner> + <owner>jsaul@google.com</owner> <owner>msarda@chromium.org</owner> <owner>battre@chromium.org</owner> <description> @@ -25111,8 +25094,7 @@ </action> <action name="Signin_SigninWithDefault_FromManageCardsBubble"> - <owner>manasverma@google.com</owner> - <owner>jsaul@chromium.org</owner> + <owner>jsaul@google.com</owner> <owner>battre@chromium.org</owner> <description> Recorded on sign in start from access point @@ -25154,8 +25136,7 @@ <action name="Signin_SigninWithDefault_FromSaveCardBubble"> <owner>bsazonov@chromium.org</owner> - <owner>jsaul@chromium.org</owner> - <owner>manasverma@google.com</owner> + <owner>jsaul@google.com</owner> <owner>msarda@chromium.org</owner> <owner>battre@chromium.org</owner> <description>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 1a20868..514fed8 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -18207,6 +18207,13 @@ <int value="2" label="Clock Changed"/> </enum> +<enum name="DangerousDownloadDialogEvent"> + <int value="0" label="dialog shown"/> + <int value="1" label="Dialog confirmed"/> + <int value="2" label="Dialog canceled"/> + <int value="3" label="Dialog dismissed"/> +</enum> + <enum name="DangerousFile.Reason"> <int value="0" label="Safe Browsing is not available"/> <int value="1" label="Safe Browsing returns UNKOWN"/> @@ -28929,6 +28936,7 @@ <int value="1568" label="OS_TELEMETRY_GETOEMDATA"/> <int value="1569" label="SCRIPTING_UNREGISTERCONTENTSCRIPTS"/> <int value="1570" label="FILEMANAGERPRIVATE_GETZIPPROGRESS"/> + <int value="1571" label="CRYPTOTOKENPRIVATE_CANMAKEU2FAPIREQUEST"/> </enum> <enum name="ExtensionIconState"> @@ -47862,7 +47870,6 @@ <int value="-1245617305" label="NewProfilePicker:enabled"/> <int value="-1244772303" label="NtpRealboxMatchOmniboxTheme:enabled"/> <int value="-1243694853" label="DeferAllScript:disabled"/> - <int value="-1243206311" label="OmniboxPedalsDefaultIconColored:disabled"/> <int value="-1242867644" label="BorealisDiskManagement:enabled"/> <int value="-1241868814" label="WebAuthenticationPhoneSupport:disabled"/> <int value="-1241747717" label="enable-android-password-link"/> @@ -48316,7 +48323,6 @@ <int value="-881447505" label="ash-disable-shelf-model-synchronization"/> <int value="-881054479" label="WebAssemblyStreaming:disabled"/> <int value="-880201293" label="OmniboxAssistantVoiceSearch:disabled"/> - <int value="-880087793" label="OmniboxPedalsBatch2:enabled"/> <int value="-879055117" label="ClipboardContentSetting:enabled"/> <int value="-879031960" label="FetchKeepaliveTimeoutSetting:disabled"/> <int value="-879024703" label="pwa-update-dialog-for-name-and-icon:enabled"/> @@ -49771,7 +49777,6 @@ <int value="334802038" label="OfflinePreviews:disabled"/> <int value="335976733" label="NotificationStackingBarRedesign:enabled"/> <int value="336429189" label="DisallowUnsafeHttpDownloads:disabled"/> - <int value="337978465" label="OmniboxPedalsDefaultIconColored:enabled"/> <int value="338662897" label="AndroidNightModeTabReparenting:disabled"/> <int value="339419844" label="EmojiSuggestAddition:enabled"/> <int value="339671131" label="disable-per-user-timezone"/> @@ -50614,6 +50619,7 @@ <int value="1015012662" label="ChromeOSDirectVideoDecoder:enabled"/> <int value="1015895665" label="drop-sync-credential:enabled"/> <int value="1017364362" label="VrIconInDaydreamHome:enabled"/> + <int value="1017523412" label="ExtensionsMenuAccessControl:disabled"/> <int value="1018797564" label="EnableAppListSearchAutocomplete:disabled"/> <int value="1018998019" label="memlog"/> <int value="1019623058" label="ash-enable-shelf-model-synchronization"/> @@ -51016,7 +51022,6 @@ <int value="1319024729" label="ServiceWorkerServicification:disabled"/> <int value="1319068611" label="SecondaryUiMd:disabled"/> <int value="1319498514" label="NewMacNotificationAPI:disabled"/> - <int value="1319632929" label="OmniboxPedalsBatch2:disabled"/> <int value="1319638975" label="UseWallpaperStagingUrl:disabled"/> <int value="1319725131" label="enable-distance-field-text"/> <int value="1320201920" label="enable-touchpad-three-finger-click"/> @@ -51558,6 +51563,7 @@ <int value="1775475563" label="malware-interstitial-v3"/> <int value="1775652804" label="OmniboxBookmarkPaths:disabled"/> <int value="1775730290" label="OmniboxKeywordSearchButton:enabled"/> + <int value="1776136073" label="ExtensionsMenuAccessControl:enabled"/> <int value="1776163541" label="DesktopPWAsWebBundles:enabled"/> <int value="1776475705" label="show-composited-layer-borders"/> <int value="1777059507" label="trust-autofill-server-name-types"/> @@ -73044,6 +73050,13 @@ <int value="8" label="Succeeded"/> </enum> +<enum name="SBClientDownloadUserGestureFileTypeAttributes"> + <int value="0" label="Total type checked"/> + <int value="1" label="Has user gesture"/> + <int value="2" label="Has referrer visit"/> + <int value="3" label="Has both user gesture and referrer visit"/> +</enum> + <enum name="SBClientMalwareSentReports"> <int value="0" label="Sent"/> <int value="1" label="Hit limit"/>
diff --git a/tools/metrics/histograms/metadata/android/histograms.xml b/tools/metrics/histograms/metadata/android/histograms.xml index 98a5dd7..7b60cf4 100644 --- a/tools/metrics/histograms/metadata/android/histograms.xml +++ b/tools/metrics/histograms/metadata/android/histograms.xml
@@ -1276,6 +1276,21 @@ </summary> </histogram> +<histogram name="Android.FontLookup.Blink.GetTableLatency" units="ms" + expires_after="2022-08-12"> + <owner>drott@chromium.org</owner> + <owner>cduvall@chromium.org</owner> + <owner>layout-dev@chromium.org</owner> + <summary> + Records the latency of fetching the font name lookup table from the browser. + The table is cached by the renderer so will usually only be fetched once per + renderer startup. This is recorded when an attempt is made to fetch the + table, typically once per renderer on the first font lookup for that + process. If the original fetch fails, this will be recorded the next time a + font lookup is requested. + </summary> +</histogram> + <histogram name="Android.FontLookup.FetchFontName" enum="FetchFontName" expires_after="2021-12-15"> <owner>chouinard@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/autofill/histograms.xml b/tools/metrics/histograms/metadata/autofill/histograms.xml index e7dd4ff5..99023db 100644 --- a/tools/metrics/histograms/metadata/autofill/histograms.xml +++ b/tools/metrics/histograms/metadata/autofill/histograms.xml
@@ -378,7 +378,7 @@ name="Autofill.BetterAuth.CardUnmaskDuration.Fido.{CardType}.{Result}" units="ms" expires_after="2021-10-04"> <owner>jsaul@google.com</owner> - <owner>manasverma@google.com</owner> + <owner>siyua@chromium.org</owner> <owner>autofill-auth-team@google.com</owner> <summary> Tracks the time it takes to fetch the full PAN of a credit card once user @@ -392,7 +392,7 @@ name="Autofill.BetterAuth.CardUnmaskDuration.Fido{AutofillRealPanResultGroups}" units="ms" expires_after="2021-12-05"> <owner>jsaul@google.com</owner> - <owner>manasverma@google.com</owner> + <owner>siyua@chromium.org</owner> <owner>autofill-auth-team@google.com</owner> <summary> Tracks the time it takes to fetch the full PAN of a credit card once user @@ -407,7 +407,7 @@ <histogram name="Autofill.BetterAuth.CardUnmaskPreflightCalled" enum="BooleanHit" expires_after="2021-12-05"> <owner>jsaul@google.com</owner> - <owner>manasverma@google.com</owner> + <owner>siyua@chromium.org</owner> <owner>autofill-auth-team@google.com</owner> <summary> Tracks the number of times Chrome made a GetDetailsForGetRealPan call. A @@ -424,7 +424,7 @@ <histogram name="Autofill.BetterAuth.CardUnmaskPreflightDuration" units="ms" expires_after="2021-12-05"> <owner>jsaul@google.com</owner> - <owner>manasverma@google.com</owner> + <owner>siyua@chromium.org</owner> <owner>autofill-auth-team@google.com</owner> <summary> Tracking the latency of a GetDetailsForGetRealPan call to Payments servers. @@ -437,7 +437,7 @@ <histogram name="Autofill.BetterAuth.CardUnmaskTypeDecision" enum="AutofillCreditCardUnmaskDecisionMetric" expires_after="2021-12-05"> <owner>jsaul@google.com</owner> - <owner>manasverma@google.com</owner> + <owner>siyua@chromium.org</owner> <owner>autofill-auth-team@google.com</owner> <summary> If the user is definitely opted-in to the new auth flow, Payments sends a @@ -451,7 +451,7 @@ name="Autofill.BetterAuth.FlowEvents.{BetterAuthFlowType}.{CardType}" enum="AutofillCreditCardAuthenticationEvents" expires_after="2021-12-05"> <owner>jsaul@google.com</owner> - <owner>manasverma@google.com</owner> + <owner>siyua@chromium.org</owner> <owner>autofill-auth-team@google.com</owner> <summary> Tracks when a user completes each step in a card unmasking flow per @@ -466,7 +466,7 @@ name="Autofill.BetterAuth.FlowEvents{AutofillCreditCardAuthenticationFlows}" enum="AutofillCreditCardAuthenticationEvents" expires_after="2021-12-05"> <owner>jsaul@google.com</owner> - <owner>manasverma@google.com</owner> + <owner>siyua@chromium.org</owner> <owner>autofill-auth-team@google.com</owner> <summary> Tracks when a user completes each step in a card unmasking flow per @@ -487,7 +487,7 @@ name="Autofill.BetterAuth.OptInCalled{AutofillCreditCardWebauthnOptInOrigin}" enum="AutofillCreditCardWebauthnOptInParameters" expires_after="2021-12-05"> <owner>jsaul@google.com</owner> - <owner>manasverma@google.com</owner> + <owner>siyua@chromium.org</owner> <owner>autofill-auth-team@google.com</owner> <summary> Tracks when users opt-in either from the settings page or from a checkout @@ -510,7 +510,7 @@ name="Autofill.BetterAuth.OptInPromoShown{AutofillCreditCardWebauthnOptInOrigin}" enum="BooleanHit" expires_after="2021-10-04"> <owner>jsaul@google.com</owner> - <owner>manasverma@google.com</owner> + <owner>siyua@chromium.org</owner> <owner>autofill-auth-team@google.com</owner> <summary> Logs the number of times the opt-in promo to use FIDO authentication for @@ -539,7 +539,7 @@ name="Autofill.BetterAuth.OptInPromoUserDecision{AutofillCreditCardWebauthnOptInOrigin}" enum="AutofillWebauthnOptInPromoUserDecision" expires_after="2021-12-05"> <owner>jsaul@google.com</owner> - <owner>manasverma@google.com</owner> + <owner>siyua@chromium.org</owner> <owner>autofill-auth-team@google.com</owner> <summary> Tracks the user response to the opt-in promo for using FIDO authentication @@ -561,7 +561,7 @@ <histogram name="Autofill.BetterAuth.OptOutCalled.FromSettingsPage" enum="BooleanHit" expires_after="2021-12-05"> <owner>jsaul@google.com</owner> - <owner>manasverma@google.com</owner> + <owner>siyua@chromium.org</owner> <owner>autofill-auth-team@google.com</owner> <summary> Tracks the number of times UpdateAutofillUserPreference has been called with @@ -578,7 +578,7 @@ name="Autofill.BetterAuth.UserPerceivedLatencyOnCardSelection.OptedIn.Duration" units="ms" expires_after="2021-10-04"> <owner>jsaul@google.com</owner> - <owner>manasverma@google.com</owner> + <owner>siyua@chromium.org</owner> <owner>autofill-auth-team@google.com</owner> <summary> The GetDetailsForGetRealPan call is made when card suggestions are shown. @@ -594,7 +594,7 @@ enum="AutofillCreditCardUserPerceivedLatencyFollowUp" expires_after="2021-10-04"> <owner>jsaul@google.com</owner> - <owner>manasverma@google.com</owner> + <owner>siyua@chromium.org</owner> <owner>autofill-auth-team@google.com</owner> <summary> The GetDetailsForGetRealPan call is made when card suggestions are shown. If @@ -609,7 +609,7 @@ name="Autofill.BetterAuth.UserPerceivedLatencyOnCardSelection{AutofillFidoAuthenticationEnabledState}" enum="AutofillCreditCardPreflightCallEvent" expires_after="2021-12-05"> <owner>jsaul@google.com</owner> - <owner>manasverma@google.com</owner> + <owner>siyua@chromium.org</owner> <owner>autofill-auth-team@google.com</owner> <summary> The GetDetailsForGetRealPan call is made when card suggestions are shown. @@ -632,7 +632,7 @@ <histogram name="Autofill.BetterAuth.UserVerifiabilityCheckDuration" units="ms" expires_after="2021-10-04"> <owner>jsaul@google.com</owner> - <owner>manasverma@google.com</owner> + <owner>siyua@chromium.org</owner> <owner>autofill-auth-team@google.com</owner> <summary> Tracks how long it takes to check that the user is verifiable through @@ -645,7 +645,7 @@ name="Autofill.BetterAuth.WebauthnResult{AutofillFidoUserVerificationFlow}" enum="AutofillCreditCardWebauthnResultMetric" expires_after="2021-12-05"> <owner>jsaul@google.com</owner> - <owner>manasverma@google.com</owner> + <owner>siyua@chromium.org</owner> <owner>autofill-auth-team@google.com</owner> <summary> This metric tracks the result of the WebAuthn prompt when the user attempts @@ -1657,7 +1657,7 @@ <histogram name="Autofill.ManageCardsPrompt{AutofillManageCardsPrompt}" enum="AutofillManageCardsPrompt" expires_after="2022-06-01"> <owner>jsaul@google.com</owner> - <owner>manasverma@google.com</owner> + <owner>siyua@chromium.org</owner> <summary> The frequency of user interactions with the Manage Cards prompt. {AutofillManageCardsPrompt}
diff --git a/tools/metrics/histograms/metadata/chromeos/histograms.xml b/tools/metrics/histograms/metadata/chromeos/histograms.xml index 420b0187..211c115 100644 --- a/tools/metrics/histograms/metadata/chromeos/histograms.xml +++ b/tools/metrics/histograms/metadata/chromeos/histograms.xml
@@ -1009,7 +1009,7 @@ </histogram> <histogram name="ChromeOS.SAML.InSessionPasswordChangeEvent" - enum="SamlInSessionPasswordChangeEvent" expires_after="2021-09-12"> + enum="SamlInSessionPasswordChangeEvent" expires_after="2022-03-12"> <owner>mslus@chromium.org</owner> <owner>rsorokin@chromium.org</owner> <summary> @@ -1046,7 +1046,7 @@ </histogram> <histogram name="ChromeOS.SAML.Scraping.PasswordCountAll" units="passwords" - expires_after="2021-09-21"> + expires_after="2022-03-21"> <owner>mslus@chromium.org</owner> <owner>emaxx@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/download/histograms.xml b/tools/metrics/histograms/metadata/download/histograms.xml index c6b71e8a..0462fe41 100644 --- a/tools/metrics/histograms/metadata/download/histograms.xml +++ b/tools/metrics/histograms/metadata/download/histograms.xml
@@ -124,6 +124,17 @@ </summary> </histogram> +<histogram name="Download.DangerousDialog.Events" + enum="DangerousDownloadDialogEvent" expires_after="2021-12-26"> + <owner>qinmin@chromium.org</owner> + <owner>xingliu@chromium.org</owner> + <summary> + Records user interactions with the dangerous download dialog on Android. + Records when the dialog is shown, or when user clicks on a button or + dismisses the dialog. + </summary> +</histogram> + <histogram name="Download.DangerousFile.DownloadValidatedByType" enum="SBClientDownloadExtensions" expires_after="2021-12-26"> <owner>drubery@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/sb_client/histograms.xml b/tools/metrics/histograms/metadata/sb_client/histograms.xml index 71203611..4a5a78d 100644 --- a/tools/metrics/histograms/metadata/sb_client/histograms.xml +++ b/tools/metrics/histograms/metadata/sb_client/histograms.xml
@@ -255,6 +255,19 @@ </token> </histogram> +<histogram name="SBClientDownload.UserGestureFileType.Attributes" + enum="SBClientDownloadUserGestureFileTypeAttributes" + expires_after="2022-08-10"> + <owner>xinghuilu@chromium.org</owner> + <owner>chrome-safebrowsing-alerts@google.com</owner> + <summary> + Records the attributes of a download that is allowed on user gesture. Logged + each time a download happens and the danger level is ALLOW_ON_USER_GESTURE. + To get the percentage of a specific attribute, divide the number of record + of that attribute by the number of record of TOTAL_TYPE_CHECKED. + </summary> +</histogram> + <histogram name="SBClientDownload.Warning.DownloadHasUserGesture.{DangerType}.{Action}" enum="BooleanHasUserGesture" expires_after="2022-05-20">
diff --git a/tools/metrics/histograms/metadata/session/histograms.xml b/tools/metrics/histograms/metadata/session/histograms.xml index 627a27bd..6be5ec35 100644 --- a/tools/metrics/histograms/metadata/session/histograms.xml +++ b/tools/metrics/histograms/metadata/session/histograms.xml
@@ -58,7 +58,7 @@ "stability logs" or "persistent UMA" data related to the previous session but not uploaded during the previous session). - Recorded on Windows, Mac, and Linux. + Recorded on Android, Windows, Mac, and Linux. For information on what's considered "active", see the histogram description for Session.TotalDuration.
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index fa8598d..933a16e 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,20 +5,20 @@ "remote_path": "perfetto_binaries/trace_processor_shell/linux_arm/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell" }, "win": { - "hash": "1f6bb8e12362e8de7f884199381c6f64bd5a95e6", - "remote_path": "perfetto_binaries/trace_processor_shell/win/e0c4d9b9566c52974287aa1a6678e16f1949c6c4/trace_processor_shell.exe" + "hash": "ec2c997f056a3260344cf22753456e4c6ac6e685", + "remote_path": "perfetto_binaries/trace_processor_shell/win/303b88cfe5f0a6cf2f6f9f961c65b7b0b530155d/trace_processor_shell.exe" }, "mac": { - "hash": "3de7f6177315408c40181751078a5330c5055512", - "remote_path": "perfetto_binaries/trace_processor_shell/mac/e0c4d9b9566c52974287aa1a6678e16f1949c6c4/trace_processor_shell" + "hash": "6b9eb9c3407cb4121315b3ff6dd2ec8030326802", + "remote_path": "perfetto_binaries/trace_processor_shell/mac/303b88cfe5f0a6cf2f6f9f961c65b7b0b530155d/trace_processor_shell" }, "linux_arm64": { "hash": "5074025a2898ec41a872e70a5719e417acb0a380", "remote_path": "perfetto_binaries/trace_processor_shell/linux_arm64/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell" }, "linux": { - "hash": "3b94d2268e0dac70a4b667d9b84368493ff88c91", - "remote_path": "perfetto_binaries/trace_processor_shell/linux/76f7830d7f2b74640a2304db5c75588cb0da5ff4/trace_processor_shell" + "hash": "a317548cdf72941577fabf2ccef8946e1cb8b5b7", + "remote_path": "perfetto_binaries/trace_processor_shell/linux/303b88cfe5f0a6cf2f6f9f961c65b7b0b530155d/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/tools/tracing/README.md b/tools/tracing/README.md index 5148862..56edd8c 100644 --- a/tools/tracing/README.md +++ b/tools/tracing/README.md
@@ -1,19 +1,324 @@ -# Perfetto Trace Collection Profiling for Chrome Developers -This tool provides a way for chrome developers to collect perfetto traces -and symbolize them. +# Chrome Tracing Tools - Guide -# Startup Tracing -The script profile_chrome_startup runs a chrome trace on android, locates the -trace file, and automatically copies it to a local folder. +The tools/tracing directory contains scripts for both recording and symbolizing +traces in proto file format. This doc outlines different use cases for the tool. +Each use case shows what arguments are most important for the script to work. +Run `tools/tracing/profile_chrome_startup --help` or +`tools/tracing/symbolize_trace --help` for more details on more command-line +flags. -Example Linux Platform Usage: +[TOC] + +## What's supported? + +Platform | Trace Recording | Trace Symbolization +-------- | ------------------------------- | ------------------- +Android | ✔️ | ✔️ +Linux | ❌ (use https://ui.perfetto.dev) | ✔️ +MacOS | ❌ (use https://ui.perfetto.dev) | ✔️ +Windows | ❌ | ❌ + +## **Profiling Chrome** + +**For local builds:** In order for this tool to work, make sure that a build +directory for Chrome exists and that Chrome is built with the gn arg +‘symbol_level’ >= 1. + +### **Android:** + +#### Setting up to collect profiles: + +Supported architectures for heap profiling: + +* Local builds: arm32, arm64, x86-64 + + * Even if arm32 is not used, ensure `symbol_level=1` is included in gn + args so that function names are included in symbol files. + * If an emulator is used, use x86-64 architecture. x86 architecture is not + supported for this. + * Prefer to use arm64/x86-64 builds since arm32 support is less stable. + * For arm32, set these gn args: `enable_profiling=true`, + `arm_use_thumb=false`, `is_component_build=false` and `symbol_level=1`. + * Alternatively for arm32 you can use `is_official_build=true`, + `symbol_level=1`. + +* Official builds: arm32, arm64, x86-64. + + * Official builds need to be installed from the play store. + * For arm32, only canary and dev channels are supported. + +Note: x86 architecture is not supported for this. + +Supported architectures for CPU profiling: + +* CPU profiling not supported on emulators. +* Official builds: arm32 and arm64. + + * Official builds need to be downloaded from the play store. + * For arm32, only canary and dev channels are supported. + +* Local builds: arm32 and arm64 + + * Include gn arg: `symbol_level=1` so that function names are included in + symbol files. For arm32, include the following gn args: + `is_official_build=true`, `symbol_level=1`. + +Setup steps: + +1. Build Chrome using x86-64 (with gn arg: `target_os="x64"` for local builds) + or other supported architectures. +1. Skip this step if heap profiling is not needed. Setup Chrome command line + for enabling heap profiling before starting Chrome: + + * Run: + + ``` + build/android/adb_chrome_public_command_line \ + --memlog-sampling-rate=1000000 --memlog=browser \ + --use-heap-profiling-proto-writer + ``` + + * Alternatively you can enable heap profiling from + chrome://memory-internals. + * For CPU sampling profiling, no Chrome command line setup is needed. + +1. Make sure that the Chrome browser installed has permission to access device + storage. Chrome needs permission to write traces to disk (outside data dir). + + * On your device/emulator with Chrome: Setting > Apps > App Info, then + click the Chrome app you want to profile. Click on App Permissions and + allow access to device storage. + +1. Build dump_syms by running: ninja -C out/build_dir dump_syms. This is needed + for official builds too. You need to setup a local directory with the same + `target_os` as the profiled device and set `is_debug=false` in gn args. + +#### Collecting profiles: + +##### Using Perfetto UI (https://ui.perfetto.dev): + +Heap profiling: + +* Enable memory-infra (high-overhead) for memory in Chrome categories and + collect traces. this would capture a profile every 10 seconds. + +CPU profiling: + +* For CPU profiling, enable cpu_profiler (high overhead) in Chrome categories + and collect traces. + +Note: Download and symbolize this profile using symbolization steps below. + +##### For local builds: + +1. Find the browser you want to profile. The `--browser` flag will be used to + select the browser. + + * Examples for local builds: `--browser=build` (for clankium), + `--browser=chromium` (for chromium), `--browser=beta`, + `--browser=stable`. `--help` will give a list of all possible browser + options. + +1. Run profile_chrome_startup: + + ``` + tools/tracing/profile_chrome_startup --symbolize \ + --local_build_dir=LOCAL_BUILD_DIR --browser=BROWSER \ + [--enable_profiler={memory,cpu}] + ``` + + Example heap profiling: + + ``` + tools/tracing/profile_chrome_startup --symbolize \ + --local_build_dir=out/Release --browser=build --enable_profiler=memory + ``` + + * When collecting heap profiles, samples are collected every 10 seconds. + Extend the time for heap profiling by setting the `--time` flag greater + than 10 seconds to actually collect heap samples. For example, + specifying `--time=300` will ensure heap samples are taken every 10 + seconds for five minutes. + +##### For official builds: + +1. Find the browser you want to profile. The `--browser` flag will be used to + select the browser. + + * Examples for official builds: `--browser=beta`, `--browser=canary`, + `--browser=stable`. `--help` will give a list of all possible browser + options. + +1. Run profile_chrome_startup: + + ``` + tools/tracing/profile_chrome_startup --symbolize \ + --dump_syms=DUMP_SYMS --browser=BROWSER [--enable_profiler={memory,cpu}] + ``` + + Example heap profiling: + + ``` + tools/tracing/profile_chrome_startup --symbolize \ + --dump_syms=out/Release/dump_syms \ + local_build_dir=out/Release --browser=stable --enable_profiler=memory + ``` + + * When collecting heap profiles, samples are collected every 10 seconds. + Extend the time for heap profiling by setting the `--time` flag greater + than 10 seconds to actually collect heap samples. For example, + specifying `--time=300` will ensure heap samples are taken every 10 + seconds for five minutes. + +**Notes:** + +* To specify the kind of profile to collect, the `--enable_profiler` flag is + needed. You can specify either `cpu` or `memory` or a comma-separated list + containing both as arguments. + +* To enable/disable specific Chrome categories while recording a trace, use + the `--chrome_categories flag`. + +* To view a symbolized trace automiatically after symbolization, you can pass + the `--view` flag to automatically open the symbolized trace in + https://ui.perfetto.dev. + +* For steps to save time on multiple runs, refer to **Caching Symbols for + Multiple Traces** section for additional flags to add to the command line. + +* In case dump_syms is not found by the script, specify the `--dump_syms` + flag. + +* It is not needed, but if you want to specify the directory to hold breakpad + files, use the `--breakpad_output_dir` flag. + +* If symbolization is not needed, the `--skip_symbolize` flag specifies that a + trace should skip symbolization after collection. If specified omit the + `--dump_syms` and `--local_build_dir` flags since symbolization is not + needed. + +### **For Mac and Linux:** + +#### Collecting profiles: + +##### Using Perfetto UI (https://ui.perfetto.dev): + +Heap profiling: + +* Enable memory-infra (high-overhead) for memory in Chrome categories and + collect traces. this would capture a profile every 10 seconds. + +CPU profiling: + +* For CPU profiling, enable cpu_profiler (high overhead) in Chrome categories + and collect traces. + +Note: Download and symbolize this profile using symbolization steps below. + +### **For Windows:** + +You can collect a trace using https://ui.perfetto.dev, but symbolizing on +Windows is not currently supported with this script. + +## **Symbolizing traces (Only works for proto traces)** + +### **Android, Linux, Mac:** + +#### For local builds: + +##### Symbolization setup: + +1. Build dump_syms by running: ninja -C out/build_dir dump_syms. +1. Find the trace you want to symbolize. + +##### Symbolizing: + +1. Run symbolize_trace: + ``` -tools/tracing/profile_chrome_startup --platform=android +tools/tracing/symbolize_trace [trace_file] --local_build_dir=LOCAL_BUILD_DIR ``` -# Future Work -We are planning to add symbolization support and trace collection for other -platforms. +#### For official builds: + +1. Skip this step for Mac and Linux. Build dump_syms by running: ninja -C + out/build_dir dump_syms. +1. Run symbolize_trace: + +``` +tools/tracing/symbolize_trace [trace_file] +``` + +* Include `--dump_syms=DUMP_SYMS` for Android. Mac and Linux official builds + do not require dump_syms, but for Android traces, a path to dump_syms should + be found. + +**Notes** + +* To view a symbolized trace automiatically after symbolization, you can pass + the `--view` flag to automatically open the symbolized trace in + https://ui.perfetto.dev. + +* For steps to save time on multiple runs, refer to **Caching Symbols for + Multiple Traces** section for additional flags to add to the command line. + +### **Windows and Chrome OS:** Not yet supported. + +## Caching Symbols for Multiple Traces: + +* To cache symbols for symbolizing different traces from the same build of + Chrome include the --breakpad_output_dir flag (this will work for both + `profile_chrome_startup` and `symbolize_trace` scripts). If + `--breakpad_output_dir` is specified in the first run, the flag can be + replaced with `--local_breakpad_dir` to save time in subsequent runs, by + using the breakpad symbols that have been stored. Ex: + + For `tools/tracing/profile_chrome_startup`: + + * 1st run: `tools/tracing/profile_chrome_startup + --breakpad_output_dir=/tmp` + + * Future runs: `tools/tracing/profile_chrome_startup + --local_breakpad_dir=/tmp` + + For `tools/tracing/symbolize_trace`: + + * 1st run: `tools/tracing/symbolize_trace [trace_file1] + --breakpad_output_dir=/tmp` + + * Future runs: `tools/tracing/symbolize_trace [trace_file2] + --local_breakpad_dir=/tmp` + +## Troubleshooting: + +* If `tools/tracing/profile_chrome_startup` gives `Error : Activity Class` or + the desired Chrome browser does not open: + + * Check that the browser given for the `--browser` flag matches the build + of the browser you want to profile. + +* If heap profiling gives and empty trace: + + * Make sure 'memory' is included as an argument for the + `--enable_profiler` flag. + * Make sure that the `--time` flag is set to a value greater than 10. + * Make sure Chrome is able to read the command line (give storage + permission, as outlined in steps to profile Chrome) and that Chrome is + restarted after setting the command line for memlog. + +* If symbolization fails because dump_syms cannot be found: + + * Make sure that the dump_syms binary you built is given for the + `--dump_syms` or that the binary can be found in the directory given for + `--local_build_dir` + +* If an error shows that no symbolizer is found: + + * Try building the trace_to_text tool in perfetto, using instructions + found here: https://perfetto.dev/docs/contributing/build-instructions. + You can try the script again, specifying the `--symbolizer` flag, or you + can use the trace_to_text tool directly by running: + `path/to/trace_to_text [trace_file]` See the google internal design doc for more details pertaining to this tool: https://docs.google.com/document/d/1BJPbcl5SPjOvuRuP1JSFAUPK3ZWNIS7j1h94rPHRzVE
diff --git a/tools/tracing/metadata_extractor.py b/tools/tracing/metadata_extractor.py index eecc8f55..4a9696b 100644 --- a/tools/tracing/metadata_extractor.py +++ b/tools/tracing/metadata_extractor.py
@@ -97,7 +97,7 @@ def Initialize(self): """Extracts metadata from perfetto system trace. """ - # TODO(rhuckleberry): Implement Trace Processor method to run multiple + # TODO(crbug/1239694): Implement Trace Processor method to run multiple # SQL queries without processing trace for every query. if self._initialized:
diff --git a/tools/tracing/profile_chrome_startup b/tools/tracing/profile_chrome_startup index 6107d782..539af6ed 100755 --- a/tools/tracing/profile_chrome_startup +++ b/tools/tracing/profile_chrome_startup
@@ -27,7 +27,6 @@ def _CreateOptionParser(): - # TODO(rhuckleberry): Update description when adding script functionality. parser = optparse.OptionParser(description='Record Perfetto tracing profiles ' 'from Android browsers startup. See ' 'http://dev.chromium.org' @@ -59,7 +58,7 @@ # Run Tracing trace_file = None if options.platform.lower() == 'android': - # TODO(rhuckleberry): Fix manual tracing. Setting flag --time=0 stalls and fails + # TODO(crbug/1239748): Fix manual tracing. Setting flag --time=0 stalls and fails # to download the collected trace. trace_file = adb_profile_chrome_startup.ProfileChrome(options) else:
diff --git a/tools/tracing/rename_breakpad.py b/tools/tracing/rename_breakpad.py index 223c81ec..95fbe099 100644 --- a/tools/tracing/rename_breakpad.py +++ b/tools/tracing/rename_breakpad.py
@@ -60,10 +60,6 @@ shutil.move(file_path, dest_path) - # TODO(rhuckleberry): After moving breakpad files we can be left with empty - # dirs. Clean up these empty dirs if user specifies |breakpad_output_dir|. - # Doesn't matter if |breakpad_output_dir| is a temporary directory. - def ExtractModuleIdIfValidBreakpad(file_path): """Extracts breakpad file's module id if the file is valid.
diff --git a/ui/gtk/BUILD.gn b/ui/gtk/BUILD.gn index bef73bd7..9adb7d3 100644 --- a/ui/gtk/BUILD.gn +++ b/ui/gtk/BUILD.gn
@@ -74,6 +74,8 @@ "settings_provider.h", "settings_provider_gtk.cc", "settings_provider_gtk.h", + "window_frame_provider_gtk.cc", + "window_frame_provider_gtk.h", ] defines = [ "IS_GTK_IMPL" ] configs += [ "//build/config/linux/pangocairo" ]
diff --git a/ui/gtk/gtk_ui.cc b/ui/gtk/gtk_ui.cc index 6266d03..2af5200 100644 --- a/ui/gtk/gtk_ui.cc +++ b/ui/gtk/gtk_ui.cc
@@ -56,6 +56,7 @@ #include "ui/gtk/printing/printing_gtk_util.h" #include "ui/gtk/select_file_dialog_impl.h" #include "ui/gtk/settings_provider_gtk.h" +#include "ui/gtk/window_frame_provider_gtk.h" #include "ui/native_theme/native_theme.h" #include "ui/shell_dialogs/select_file_policy.h" #include "ui/views/controls/button/button.h" @@ -731,6 +732,16 @@ return nullptr; } +views::WindowFrameProvider* GtkUi::GetWindowFrameProvider(bool solid_frame) { + if (!GtkCheckVersion(3, 14)) + return nullptr; + auto& provider = + solid_frame ? solid_frame_provider_ : transparent_frame_provider_; + if (!provider) + provider = std::make_unique<gtk::WindowFrameProviderGtk>(solid_frame); + return provider.get(); +} + // Mapping from GDK dead keys to corresponding printable character. static struct { guint gdk_key;
diff --git a/ui/gtk/gtk_ui.h b/ui/gtk/gtk_ui.h index e4ecb6e..359ce7c 100644 --- a/ui/gtk/gtk_ui.h +++ b/ui/gtk/gtk_ui.h
@@ -16,6 +16,7 @@ #include "ui/gfx/color_utils.h" #include "ui/gtk/gtk_ui_platform.h" #include "ui/views/linux_ui/linux_ui.h" +#include "ui/views/linux_ui/window_frame_provider.h" #include "ui/views/window/frame_buttons.h" typedef struct _GParamSpec GParamSpec; @@ -102,6 +103,7 @@ bool PreferDarkTheme() const override; bool AnimationsEnabled() const override; std::unique_ptr<views::NavButtonProvider> CreateNavButtonProvider() override; + views::WindowFrameProvider* GetWindowFrameProvider(bool solid_frame) override; base::flat_map<std::string, std::string> GetKeyboardLayoutMap() override; std::string GetCursorThemeName() override; int GetCursorThemeSize() override; @@ -207,6 +209,12 @@ float device_scale_factor_ = 1.0f; + // Paints a native window frame. Typically only one of these will be + // non-null. The exception is when the user starts or stops their compositor + // while Chrome is running. + std::unique_ptr<views::WindowFrameProvider> solid_frame_provider_; + std::unique_ptr<views::WindowFrameProvider> transparent_frame_provider_; + DISALLOW_COPY_AND_ASSIGN(GtkUi); };
diff --git a/ui/gtk/gtk_util.cc b/ui/gtk/gtk_util.cc index 92b600e..0218e9a 100644 --- a/ui/gtk/gtk_util.cc +++ b/ui/gtk/gtk_util.cc
@@ -430,7 +430,8 @@ GtkCssContext GetStyleContextFromCss(const std::string& css_selector) { // Prepend a window node to the selector since all widgets must live // in a window, but we don't want to specify that every time. - auto context = AppendCssNodeToStyleContext({}, "GtkWindow#window.background"); + auto context = + AppendCssNodeToStyleContext({}, "GtkWindow#window.background.csd"); for (const auto& widget_type : base::SplitString(css_selector, base::kWhitespaceASCII,
diff --git a/ui/gtk/window_frame_provider_gtk.cc b/ui/gtk/window_frame_provider_gtk.cc new file mode 100644 index 0000000..63091ac --- /dev/null +++ b/ui/gtk/window_frame_provider_gtk.cc
@@ -0,0 +1,288 @@ +// 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 "ui/gtk/window_frame_provider_gtk.h" + +#include "ui/gfx/canvas.h" +#include "ui/gfx/geometry/insets.h" +#include "ui/gfx/geometry/rect.h" +#include "ui/gfx/scoped_canvas.h" +#include "ui/gtk/gtk_compat.h" +#include "ui/gtk/gtk_util.h" +#include "ui/native_theme/native_theme.h" + +namespace gtk { + +namespace { + +// The maximum reasonable size of the frame edges in DIPs. If a GTK theme draws +// window decorations larger than this, they will be clipped. +constexpr int kMaxFrameSizeDip = 64; + +// The maximum reasonable radius of the frame top corners in DIPs. If this +// limit is exceeded, the corners will be drawn correctly, but the compositor +// will get an incorrect hint as to which pixels are fully opaque. +constexpr int kMaxCornerRadiusDip = 32; + +std::string GetThemeName() { + gchar* theme = nullptr; + g_object_get(gtk_settings_get_default(), "gtk-theme-name", &theme, nullptr); + std::string theme_string; + if (theme) { + theme_string = theme; + g_free(theme); + } + return theme_string; +} + +GtkCssContext WindowContext(bool solid_frame, bool focused) { + std::string selector = "#window.background."; + selector += solid_frame ? "solid-csd" : "csd"; + if (!focused) + selector += ":inactive"; + return AppendCssNodeToStyleContext({}, selector); +} + +GtkCssContext DecorationContext(bool solid_frame, bool focused) { + auto context = WindowContext(solid_frame, focused); + context = AppendCssNodeToStyleContext(context, "#decoration"); + if (!focused) + gtk_style_context_set_state(context, GTK_STATE_FLAG_BACKDROP); + + // The web contents is rendered after the frame border, so remove bottom + // rounded corners otherwise their borders would get covered up. + ApplyCssToContext(context, R"(* { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + })"); + + return context; +} + +GtkCssContext HeaderContext(bool solid_frame, bool focused) { + auto context = WindowContext(solid_frame, focused); + context = + AppendCssNodeToStyleContext(context, "#headerbar.header-bar.titlebar"); + if (!focused) + gtk_style_context_set_state(context, GTK_STATE_FLAG_BACKDROP); + return context; +} + +SkBitmap PaintBitmap(const gfx::Size& bitmap_size, + const gfx::Rect& render_bounds, + GtkCssContext context, + float scale) { + SkBitmap bitmap; + bitmap.allocN32Pixels(bitmap_size.width(), bitmap_size.height()); + bitmap.eraseColor(SK_ColorTRANSPARENT); + + CairoSurface surface(bitmap); + cairo_t* cr = surface.cairo(); + + auto bounds = render_bounds; + + cairo_scale(cr, scale, scale); + gtk_render_background(context, cr, bounds.x(), bounds.y(), bounds.width(), + bounds.height()); + gtk_render_frame(context, cr, bounds.x(), bounds.y(), bounds.width(), + bounds.height()); + + bitmap.notifyPixelsChanged(); + bitmap.setImmutable(); + return bitmap; +} + +SkBitmap PaintHeaderbar(const gfx::Size& size, + GtkCssContext context, + float scale) { + gfx::Rect tabstrip_bounds_dip(0, 0, size.width() / scale, + size.height() / scale); + return PaintBitmap(size, tabstrip_bounds_dip, context, scale); +} + +int ComputeTopCornerRadius(float scale) { + // In GTK4, there's no way to directly obtain CSS values for a context, so we + // need to experimentally determine the corner radius by rendering a sample. + auto context = HeaderContext(false, false); + ApplyCssToContext(context, R"(headerbar { + background-image: none; + background-color: black; + box-shadow: none; + border: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + border-top-right-radius: 0; + })"); + auto bitmap = PaintHeaderbar({kMaxCornerRadiusDip, kMaxCornerRadiusDip}, + context, scale); + DCHECK_EQ(bitmap.width(), bitmap.height()); + for (int i = 0; i < bitmap.width(); ++i) { + if (SkColorGetA(bitmap.getColor(0, i)) == 255 && + SkColorGetA(bitmap.getColor(i, 0)) == 255) { + return i; + } + } + return bitmap.width(); +} + +} // namespace + +WindowFrameProviderGtk::WindowFrameProviderGtk(bool solid_frame) + : solid_frame_(solid_frame) {} + +WindowFrameProviderGtk::~WindowFrameProviderGtk() = default; + +int WindowFrameProviderGtk::GetTopCornerRadius() { + MaybeUpdateBitmaps(); + return top_corner_radius_; +} + +gfx::Insets WindowFrameProviderGtk::GetFrameThickness() { + MaybeUpdateBitmaps(); + return frame_thickness_dip_; +} + +void WindowFrameProviderGtk::PaintWindowFrame(gfx::Canvas* canvas, + const gfx::Rect& rect_dip, + int top_area_height_dip, + bool focused) { + MaybeUpdateBitmaps(); + + gfx::ScopedCanvas scoped_canvas(canvas); + float scale = canvas->UndoDeviceScaleFactor(); + + auto client_bounds_px = gfx::ScaleToRoundedRect(rect_dip, scale); + client_bounds_px.Inset(frame_thickness_px_); + + gfx::Rect src_rect(gfx::Size(BitmapSizePx(), BitmapSizePx())); + src_rect.Inset(gfx::Insets(frame_size_px_) - frame_thickness_px_); + + auto corner_w = std::min(frame_size_px_, client_bounds_px.width() / 2); + auto corner_h = std::min(frame_size_px_, client_bounds_px.height() / 2); + auto edge_w = client_bounds_px.width() - 2 * corner_w; + auto edge_h = client_bounds_px.height() - 2 * corner_h; + + auto corner_insets = frame_thickness_px_ + gfx::Insets(corner_h, corner_w); + + auto image = gfx::ImageSkia::CreateFrom1xBitmap(focused ? focused_bitmap_ + : unfocused_bitmap_); + + // Top left corner + canvas->DrawImageInt(image, src_rect.x(), src_rect.y(), corner_insets.left(), + corner_insets.top(), 0, 0, corner_insets.left(), + corner_insets.top(), false); + // Top right corner + canvas->DrawImageInt(image, BitmapSizePx() - frame_size_px_ - corner_w, + src_rect.y(), corner_insets.right(), corner_insets.top(), + client_bounds_px.right() - corner_w, 0, + corner_insets.right(), corner_insets.top(), false); + // Bottom left corner + canvas->DrawImageInt(image, src_rect.x(), + BitmapSizePx() - frame_size_px_ - corner_h, + corner_insets.left(), corner_insets.bottom(), 0, + client_bounds_px.bottom() - corner_h, + corner_insets.left(), corner_insets.bottom(), false); + // Bottom right corner + canvas->DrawImageInt(image, BitmapSizePx() - frame_size_px_ - corner_w, + BitmapSizePx() - frame_size_px_ - corner_h, + corner_insets.right(), corner_insets.bottom(), + client_bounds_px.right() - corner_w, + client_bounds_px.bottom() - corner_h, + corner_insets.right(), corner_insets.bottom(), false); + // Top edge + canvas->DrawImageInt(image, 2 * frame_size_px_, src_rect.y(), 1, + frame_thickness_px_.top(), corner_insets.left(), 0, + edge_w, frame_thickness_px_.top(), false); + // Left edge + canvas->DrawImageInt(image, src_rect.x(), 2 * frame_size_px_, + frame_thickness_px_.left(), 1, 0, corner_insets.top(), + frame_thickness_px_.left(), edge_h, false); + // Bottom edge + canvas->DrawImageInt( + image, 2 * frame_size_px_, BitmapSizePx() - frame_size_px_, 1, + frame_thickness_px_.bottom(), corner_insets.left(), + client_bounds_px.bottom(), edge_w, frame_thickness_px_.bottom(), false); + // Right edge + canvas->DrawImageInt(image, BitmapSizePx() - frame_size_px_, + 2 * frame_size_px_, frame_thickness_px_.right(), 1, + client_bounds_px.right(), corner_insets.top(), + frame_thickness_px_.right(), edge_h, false); + + int top_area_height_px = + top_area_height_dip * scale - frame_thickness_px_.top(); + + auto header = PaintHeaderbar({client_bounds_px.width(), top_area_height_px}, + HeaderContext(solid_frame_, focused), scale); + canvas->DrawImageInt(gfx::ImageSkia::CreateFrom1xBitmap(header), 0, 0, + header.width(), header.height(), client_bounds_px.x(), + client_bounds_px.y(), header.width(), header.height(), + false); +} + +void WindowFrameProviderGtk::MaybeUpdateBitmaps() { + auto scale = GetDeviceScaleFactor(); + std::string theme_name = GetThemeName(); + if (scale_ == scale && theme_name_ == theme_name) + return; + scale_ = scale; + theme_name_ = theme_name; + + frame_size_px_ = std::ceil(kMaxFrameSizeDip * scale); + if (!solid_frame_) + top_corner_radius_ = ComputeTopCornerRadius(scale); + + gfx::Rect frame_bounds_dip(kMaxFrameSizeDip, kMaxFrameSizeDip, + 2 * kMaxFrameSizeDip, 2 * kMaxFrameSizeDip); + auto focused_context = DecorationContext(solid_frame_, true); + frame_bounds_dip.Inset(-GtkStyleContextGetPadding(focused_context)); + frame_bounds_dip.Inset(-GtkStyleContextGetBorder(focused_context)); + gfx::Size bitmap_size(BitmapSizePx(), BitmapSizePx()); + focused_bitmap_ = + PaintBitmap(bitmap_size, frame_bounds_dip, focused_context, scale); + unfocused_bitmap_ = + PaintBitmap(bitmap_size, frame_bounds_dip, + DecorationContext(solid_frame_, false), scale); + + // In GTK4, there's no way to obtain the frame thickness from CSS values + // directly, so we must determine it experimentally based on the drawn + // bitmaps. + auto get_inset = [&](auto&& pixel_iterator) -> int { + for (int i = 0; i < frame_size_px_; ++i) { + if (SkColorGetA(pixel_iterator(i))) { + int inset_px = frame_size_px_ - i; + return std::ceil(inset_px / scale); + } + } + return 0; + }; + frame_thickness_dip_ = gfx::Insets( + // top + get_inset([&](int i) { + return focused_bitmap_.getColor(2 * frame_size_px_, i); + }), + // left + get_inset([&](int i) { + return focused_bitmap_.getColor(i, 2 * frame_size_px_); + }), + // bottom + get_inset([&](int i) { + return focused_bitmap_.getColor(2 * frame_size_px_, + BitmapSizePx() - i - 1); + }), + // right + get_inset([&](int i) { + return focused_bitmap_.getColor(BitmapSizePx() - i - 1, + 2 * frame_size_px_); + })); + frame_thickness_px_ = gfx::ScaleToRoundedInsets(frame_thickness_dip_, scale); +} + +int WindowFrameProviderGtk::BitmapSizePx() const { + // The window decoration will be rendered into a square with this side length. + // The left and right sides of the decoration add 2 * kMaxDecorationThickness, + // and the window itself has size 2 * kMaxDecorationThickness. + return 4 * frame_size_px_; +} + +} // namespace gtk
diff --git a/ui/gtk/window_frame_provider_gtk.h b/ui/gtk/window_frame_provider_gtk.h new file mode 100644 index 0000000..01553a8c --- /dev/null +++ b/ui/gtk/window_frame_provider_gtk.h
@@ -0,0 +1,56 @@ +// 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 UI_GTK_WINDOW_FRAME_PROVIDER_GTK_H_ +#define UI_GTK_WINDOW_FRAME_PROVIDER_GTK_H_ + +#include "ui/views/linux_ui/linux_ui.h" +#include "ui/views/linux_ui/window_frame_provider.h" + +namespace gtk { + +class WindowFrameProviderGtk : public views::WindowFrameProvider { + public: + explicit WindowFrameProviderGtk(bool solid_frame); + + WindowFrameProviderGtk(const WindowFrameProviderGtk&) = delete; + WindowFrameProviderGtk& operator=(const WindowFrameProviderGtk&) = delete; + + ~WindowFrameProviderGtk() override; + + // views::WindowFrameProvider: + int GetTopCornerRadius() override; + gfx::Insets GetFrameThickness() override; + void PaintWindowFrame(gfx::Canvas* canvas, + const gfx::Rect& rect, + int top_area_height, + bool focused) override; + + private: + // Paint the window frame and update any metrics (like the frame thickness) + // based on it. This is a no-op if the input parameters haven't changed. + void MaybeUpdateBitmaps(); + + int BitmapSizePx() const; + + // Input parameters used for drawing. + const bool solid_frame_; + float scale_ = 0; + std::string theme_name_; + + // These are texture maps that we will sample from to draw the frame. The + // corners are drawn directly and the edges are tiled. + SkBitmap focused_bitmap_; + SkBitmap unfocused_bitmap_; + + // Metrics calculated based on the bitmaps. + int top_corner_radius_ = 0; + int frame_size_px_ = 0; + gfx::Insets frame_thickness_dip_; + gfx::Insets frame_thickness_px_; +}; + +} // namespace gtk + +#endif // UI_GTK_WINDOW_FRAME_PROVIDER_GTK_H_
diff --git a/ui/ozone/platform/wayland/host/wayland_window.cc b/ui/ozone/platform/wayland/host/wayland_window.cc index 45a130dd..bf8c323 100644 --- a/ui/ozone/platform/wayland/host/wayland_window.cc +++ b/ui/ozone/platform/wayland/host/wayland_window.cc
@@ -358,8 +358,8 @@ } bool WaylandWindow::ShouldWindowContentsBeTransparent() const { - NOTIMPLEMENTED_LOG_ONCE(); - return false; + // Wayland compositors always support translucency. + return true; } void WaylandWindow::SetAspectRatio(const gfx::SizeF& aspect_ratio) {
diff --git a/ui/strings/translations/ui_strings_mr.xtb b/ui/strings/translations/ui_strings_mr.xtb index f5e095f..ae8540c 100644 --- a/ui/strings/translations/ui_strings_mr.xtb +++ b/ui/strings/translations/ui_strings_mr.xtb
@@ -13,7 +13,7 @@ <translation id="1266864766717917324"><ph name="CONTENT_TYPE" /> शेअर करू शकलो नाही</translation> <translation id="1269641567813814718">Win</translation> <translation id="1290982764014248209"><ph name="DRAGGED_APP" /> फोल्डर <ph name="FOLDER_NAME" /> वर हलवा.</translation> -<translation id="1291104554099683393">मजकूर लहान भागांमध्ये शेअर करून पाहा.</translation> +<translation id="1291104554099683393">मजकूर लहान भागांमध्ये शेअर करून पहा.</translation> <translation id="1293699935367580298">Esc</translation> <translation id="1306549533752902673">शिफारस केलेले अॅप्स</translation> <translation id="1368832886055348810">डावीकडून उजवीकडे</translation>
diff --git a/ui/views/BUILD.gn b/ui/views/BUILD.gn index 21abe49..ae95c094 100644 --- a/ui/views/BUILD.gn +++ b/ui/views/BUILD.gn
@@ -564,6 +564,7 @@ "linux_ui/nav_button_provider.h", "linux_ui/status_icon_linux.h", "linux_ui/window_button_order_observer.h", + "linux_ui/window_frame_provider.h", ] sources += [ "linux_ui/linux_ui.cc",
diff --git a/ui/views/bubble/bubble_dialog_delegate_view.h b/ui/views/bubble/bubble_dialog_delegate_view.h index d4906e0..a9d10d2 100644 --- a/ui/views/bubble/bubble_dialog_delegate_view.h +++ b/ui/views/bubble/bubble_dialog_delegate_view.h
@@ -49,7 +49,7 @@ std::unique_ptr<NonClientFrameView> CreateNonClientFrameView( Widget* widget) override; ClientView* CreateClientView(Widget* widget) override; - ax::mojom::Role GetAccessibleWindowRole() override; + ax::mojom::Role GetAccessibleWindowRole() final; // Create and initialize the bubble Widget with proper bounds. static Widget* CreateBubble(
diff --git a/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc b/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc index 68f7065..1a1e1b8 100644 --- a/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc +++ b/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc
@@ -110,13 +110,10 @@ class TestAlertBubbleDialogDelegateView : public TestBubbleDialogDelegateView { public: explicit TestAlertBubbleDialogDelegateView(View* anchor_view) - : TestBubbleDialogDelegateView(anchor_view) {} - ~TestAlertBubbleDialogDelegateView() override = default; - - // BubbleDialogDelegateView overrides: - ax::mojom::Role GetAccessibleWindowRole() override { - return ax::mojom::Role::kAlertDialog; + : TestBubbleDialogDelegateView(anchor_view) { + SetAccessibleRole(ax::mojom::Role::kAlertDialog); } + ~TestAlertBubbleDialogDelegateView() override = default; }; // A Widget that returns something other than null as its ThemeProvider. This
diff --git a/ui/views/controls/scroll_view.cc b/ui/views/controls/scroll_view.cc index d2f3f21..4cfd356 100644 --- a/ui/views/controls/scroll_view.cc +++ b/ui/views/controls/scroll_view.cc
@@ -20,6 +20,7 @@ #include "ui/base/metadata/metadata_impl_macros.h" #include "ui/base/ui_base_features.h" #include "ui/compositor/layer.h" +#include "ui/compositor/layer_type.h" #include "ui/compositor/overscroll/scroll_input_handler.h" #include "ui/events/event.h" #include "ui/gfx/canvas.h" @@ -260,8 +261,9 @@ void ScrollView::SetContentsImpl(std::unique_ptr<View> a_view) { // Protect against clients passing a contents view that has its own Layer. DCHECK(!a_view || !a_view->layer()); + if (a_view && ScrollsWithLayers()) { - a_view->SetPaintToLayer(); + a_view->SetPaintToLayer(layer_type_); a_view->layer()->SetDidScrollCallback(base::BindRepeating( &ScrollView::OnLayerScrolled, base::Unretained(this))); a_view->layer()->SetScrollable(contents_viewport_->bounds().size()); @@ -274,6 +276,21 @@ SetContentsImpl(nullptr); } +void ScrollView::SetContentsLayerType(ui::LayerType layer_type) { + // This function should only be called when scroll with layers is enabled and + // before `contents_` is set. + DCHECK(ScrollsWithLayers() && !contents_); + + // Currently only allow LAYER_TEXTURED and LAYER_NOT_DRAWN. If other types of + // layer are needed, consult with the owner. + DCHECK(layer_type == ui::LAYER_TEXTURED || layer_type == ui::LAYER_NOT_DRAWN); + + if (layer_type_ == layer_type) + return; + + layer_type_ = layer_type; +} + void ScrollView::SetHeaderImpl(std::unique_ptr<View> a_header) { SetHeaderOrContents(header_viewport_, std::move(a_header), &header_); }
diff --git a/ui/views/controls/scroll_view.h b/ui/views/controls/scroll_view.h index 6a97e8e..b0e04b2 100644 --- a/ui/views/controls/scroll_view.h +++ b/ui/views/controls/scroll_view.h
@@ -12,6 +12,7 @@ #include "base/gtest_prod_util.h" #include "base/macros.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#include "ui/compositor/layer_type.h" #include "ui/native_theme/native_theme.h" #include "ui/views/controls/focus_ring.h" #include "ui/views/controls/scrollbar/scroll_bar.h" @@ -117,6 +118,10 @@ const View* contents() const { return contents_; } View* contents() { return contents_; } + // `layer_type` specifies the kind of layer used if scroll with layers is + // enabled. This function should be called before SetContents(). + void SetContentsLayerType(ui::LayerType layer_type); + // Sets the header, deleting the previous header. template <typename T> T* SetHeader(std::unique_ptr<T> a_header) { @@ -372,6 +377,9 @@ // Whether the left/right/up/down arrow keys attempt to scroll the view. bool allow_keyboard_scrolling_ = true; + // The layer type used for content view when scroll by layers is enabled. + ui::LayerType layer_type_ = ui::LAYER_TEXTURED; + base::ObserverList<Observer>::Unchecked observers_; DISALLOW_COPY_AND_ASSIGN(ScrollView); @@ -379,6 +387,7 @@ BEGIN_VIEW_BUILDER(VIEWS_EXPORT, ScrollView, View) VIEW_BUILDER_VIEW_TYPE_PROPERTY(View, Contents) +VIEW_BUILDER_PROPERTY(ui::LayerType, ContentsLayerType) VIEW_BUILDER_VIEW_TYPE_PROPERTY(View, Header) VIEW_BUILDER_PROPERTY(bool, AllowKeyboardScrolling) VIEW_BUILDER_PROPERTY(absl::optional<ui::NativeTheme::ColorId>,
diff --git a/ui/views/linux_ui/linux_ui.h b/ui/views/linux_ui/linux_ui.h index f632ca4..bae89af3 100644 --- a/ui/views/linux_ui/linux_ui.h +++ b/ui/views/linux_ui/linux_ui.h
@@ -47,6 +47,7 @@ class LabelButtonBorder; class NavButtonProvider; class WindowButtonOrderObserver; +class WindowFrameProvider; // Adapter class with targets to render like different toolkits. Set by any // project that wants to do linux desktop native rendering. @@ -174,6 +175,13 @@ // toolkit does not support drawing client-side navigation buttons. virtual std::unique_ptr<NavButtonProvider> CreateNavButtonProvider() = 0; + // Returns a WindowFrameProvider, or nullptr if the underlying toolkit does + // not support drawing client-side window decorations. |solid_frame| indicates + // if transparency is unsupported and the frame should be rendered opaque. + // The returned object is not owned by the caller and will remain alive until + // the process ends. + virtual WindowFrameProvider* GetWindowFrameProvider(bool solid_frame) = 0; + // Returns a map of KeyboardEvent code to KeyboardEvent key values. virtual base::flat_map<std::string, std::string> GetKeyboardLayoutMap() = 0;
diff --git a/ui/views/linux_ui/window_frame_provider.h b/ui/views/linux_ui/window_frame_provider.h new file mode 100644 index 0000000..69d7a3ac --- /dev/null +++ b/ui/views/linux_ui/window_frame_provider.h
@@ -0,0 +1,38 @@ +// 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 UI_VIEWS_LINUX_UI_WINDOW_FRAME_PROVIDER_H_ +#define UI_VIEWS_LINUX_UI_WINDOW_FRAME_PROVIDER_H_ + +namespace gfx { +class Canvas; +class Insets; +class Rect; +} // namespace gfx + +namespace views { + +class WindowFrameProvider { + public: + virtual ~WindowFrameProvider() = default; + + // Returns the radius of the top-left and top-right corners in DIPs. Used + // only as a hint to the compositor so it knows to redraw the part of the + // window behind the corners. + virtual int GetTopCornerRadius() = 0; + + // Returns the shadow and border drawn around the window in DIPs. + virtual gfx::Insets GetFrameThickness() = 0; + + // Draws a native window border and shadow. |rect| is the bounds of the + // window. The decoration will be drawn outside of that region. + virtual void PaintWindowFrame(gfx::Canvas* canvas, + const gfx::Rect& rect, + int top_area_height, + bool focused) = 0; +}; + +} // namespace views + +#endif // UI_VIEWS_LINUX_UI_WINDOW_FRAME_PROVIDER_H_
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h index b931e2a..aa6bdda 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h
@@ -10,6 +10,7 @@ #include <string> #include <vector> +#include "base/gtest_prod_util.h" #include "base/memory/weak_ptr.h" #include "build/build_config.h" #include "ui/aura/window_tree_host_platform.h" @@ -151,6 +152,9 @@ gfx::Rect ToPixelRect(const gfx::Rect& rect_in_dip) const; private: + FRIEND_TEST_ALL_PREFIXES(DesktopWindowTreeHostPlatformTest, + UpdateWindowShapeFromWindowMask); + void ScheduleRelayout(); Widget* GetWidget();
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_unittest.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_unittest.cc index 40dff77..6cf14d2 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_unittest.cc +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_unittest.cc
@@ -191,7 +191,7 @@ ASSERT_TRUE(content_window); EXPECT_FALSE(host_platform->GetWindowMaskForWindowShapeInPixels().isEmpty()); // SetClipPath for the layer of the content window is updated from it. - EXPECT_TRUE(host_platform->ShouldWindowContentsBeTransparent()); + EXPECT_FALSE(host_platform->GetWindowMaskForClipping().isEmpty()); EXPECT_FALSE(widget->GetLayer()->FillsBoundsCompletely()); // When fullscreen mode, clip_path_ is set to empty since there is no @@ -199,7 +199,7 @@ host_platform->SetFullscreen(true); widget->SetBounds(gfx::Rect(800, 800)); EXPECT_TRUE(host_platform->GetWindowMaskForWindowShapeInPixels().isEmpty()); - EXPECT_FALSE(host_platform->ShouldWindowContentsBeTransparent()); + EXPECT_TRUE(host_platform->GetWindowMaskForClipping().isEmpty()); EXPECT_TRUE(widget->GetLayer()->FillsBoundsCompletely()); }
diff --git a/weblayer/browser/weblayer_variations_http_browsertest.cc b/weblayer/browser/weblayer_variations_http_browsertest.cc index 7f27785d..8f73df9f 100644 --- a/weblayer/browser/weblayer_variations_http_browsertest.cc +++ b/weblayer/browser/weblayer_variations_http_browsertest.cc
@@ -4,6 +4,8 @@ #include "weblayer/test/weblayer_browser_test.h" +#include "base/synchronization/lock.h" +#include "base/thread_annotations.h" #include "components/variations/variations_ids_provider.h" #include "content/public/test/network_connection_change_simulator.h" #include "net/dns/mock_host_resolver.h" @@ -73,7 +75,8 @@ // Returns whether a given |header| has been received for a |url|. If // |url| has not been observed, fails an EXPECT and returns false. - bool HasReceivedHeader(const GURL& url, const std::string& header) const { + bool HasReceivedHeader(const GURL& url, const std::string& header) { + base::AutoLock lock(received_headers_lock_); auto it = received_headers_.find(url); EXPECT_TRUE(it != received_headers_.end()); if (it == received_headers_.end()) @@ -97,8 +100,11 @@ replacements.SetHost(host.c_str(), url::Component(0, host.length())); GURL original_url = request.GetURL().ReplaceComponents(replacements); - // Memorize the request headers for this URL for later verification. - received_headers_[original_url] = request.headers; + { + base::AutoLock lock(received_headers_lock_); + // Memorize the request headers for this URL for later verification. + received_headers_[original_url] = request.headers; + } // Set up a test server that redirects according to the // following redirect chain: @@ -128,22 +134,17 @@ protected: net::EmbeddedTestServer https_server_; + base::Lock received_headers_lock_; + // Stores the observed HTTP Request headers. - std::map<GURL, net::test_server::HttpRequest::HeaderMap> received_headers_; + std::map<GURL, net::test_server::HttpRequest::HeaderMap> received_headers_ + GUARDED_BY(received_headers_lock_); }; -// Fails flakily in TSAN: https://crbug.com/1192437 -#if defined(THREAD_SANITIZER) -#define MAYBE_TestStrippingHeadersFromResourceRequest \ - DISABLED_TestStrippingHeadersFromResourceRequest -#else -#define MAYBE_TestStrippingHeadersFromResourceRequest \ - TestStrippingHeadersFromResourceRequest -#endif // Verify in an integration test that the variations header (X-Client-Data) is // attached to network requests to Google but stripped on redirects. IN_PROC_BROWSER_TEST_F(WebLayerVariationsHttpBrowserTest, - MAYBE_TestStrippingHeadersFromResourceRequest) { + TestStrippingHeadersFromResourceRequest) { OneShotNavigationObserver observer(shell()); shell()->tab()->GetNavigationController()->Navigate(GetGoogleRedirectUrl1()); observer.WaitForNavigation();
diff --git a/weblayer/grit_strings_allowlist.txt b/weblayer/grit_strings_allowlist.txt index 467039e..9dd5ea0 100644 --- a/weblayer/grit_strings_allowlist.txt +++ b/weblayer/grit_strings_allowlist.txt
@@ -3,6 +3,7 @@ IDS_BLOCKED_ADS_PROMPT_EXPLANATION IDS_ALWAYS_ALLOW_ADS IDS_BLOCKED_ADS_INFOBAR_MESSAGE +IDS_BLOCKED_ADS_MESSAGE_PRIMARY_TEXT IDS_ACCESSIBILITY_EVENTS_INFOBAR_TEXT IDS_ACCESSIBILITY_EVENTS_PERMISSION_FRAGMENT IDS_AR_AND_MEDIA_CAPTURE_VIDEO_INFOBAR_TEXT